AsperaRuntimeExtractor
class AsperaRuntimeExtractor
using Relativity.Transfer.Aspera.Resources;
using System;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Reflection;
namespace Relativity.Transfer.Aspera
{
internal class AsperaRuntimeExtractor
{
private readonly AsperaRuntimePaths paths;
private readonly IFileRemover fileRemover;
public readonly AsperaFileResource[] AsperaStable;
public readonly AsperaFileResource[] AsperaExperimental;
public AsperaRuntimeExtractor(AsperaRuntimePaths paths, ITransferLog log, IFileRemover fileRemover = null)
{
if (paths == null)
throw new ArgumentNullException("paths");
this.paths = paths;
this.fileRemover = (fileRemover ?? new FileRemover(log, null, null));
AsperaStable = new AsperaFileResource[6] {
new AsperaFileResource {
DestinationDirectory = this.paths.BinDirectory,
ResourceCategory = "AsperaStable",
Name = "ascp4.exe",
TargetNameOverride = "ascp.exe",
Version = new Version("3.7.2.6854"),
ResourceType = AsperaResourceType.Ascp4,
IsAsperaExecutable = true
},
new AsperaFileResource {
DestinationDirectory = this.paths.BinDirectory,
ResourceCategory = "AsperaStable",
Name = "ascp.exe",
Version = new Version("3.7.2.6854"),
ResourceType = AsperaResourceType.Ascp,
IsAsperaExecutable = true
},
new AsperaFileResource {
DestinationDirectory = this.paths.BinDirectory,
ResourceCategory = "AsperaStable",
Name = "fasp3.dll",
Version = new Version("3.7.2.6854")
},
new AsperaFileResource {
DestinationDirectory = this.paths.BinDirectory,
ResourceCategory = "AsperaStable",
Name = "libeay32.dll",
Version = new Version("1.0.2.10")
},
new AsperaFileResource {
DestinationDirectory = this.paths.BinDirectory,
ResourceCategory = "AsperaStable",
Name = "ssleay32.dll",
Version = new Version("1.0.2.10")
},
new AsperaFileResource {
DestinationDirectory = this.paths.EtcDirectory,
ResourceCategory = "AsperaStable",
Name = "aspera-license"
}
};
AsperaExperimental = new AsperaFileResource[6] {
new AsperaFileResource {
DestinationDirectory = this.paths.BinDirectory,
ResourceCategory = "AsperaExperimental",
Name = "ascp4.exe",
TargetNameOverride = "ascp.exe",
Version = new Version("3.8.0.23906"),
ResourceType = AsperaResourceType.Ascp4,
IsAsperaExecutable = true
},
new AsperaFileResource {
DestinationDirectory = this.paths.BinDirectory,
ResourceCategory = "AsperaExperimental",
Name = "ascp.exe",
Version = new Version("3.8.0.23906"),
ResourceType = AsperaResourceType.Ascp,
IsAsperaExecutable = true
},
new AsperaFileResource {
DestinationDirectory = this.paths.BinDirectory,
ResourceCategory = "AsperaExperimental",
Name = "fasp3.dll",
Version = new Version("3.8.0.23906")
},
new AsperaFileResource {
DestinationDirectory = this.paths.BinDirectory,
ResourceCategory = "AsperaExperimental",
Name = "libeay32.dll",
Version = new Version("1.0.2.14")
},
new AsperaFileResource {
DestinationDirectory = this.paths.BinDirectory,
ResourceCategory = "AsperaExperimental",
Name = "ssleay32.dll",
Version = new Version("1.0.2.14")
},
new AsperaFileResource {
DestinationDirectory = this.paths.EtcDirectory,
ResourceCategory = "AsperaExperimental",
Name = "aspera-license"
}
};
}
public void Extract(AsperaClientConfiguration configuration)
{
AsperaFileResource[] obj = (configuration.AscpClientVersion == AscpVersion.Stable) ? AsperaStable : AsperaExperimental;
Assembly executingAssembly = Assembly.GetExecutingAssembly();
AsperaResourceType asperaResourceType = (!configuration.UseAscp4) ? AsperaResourceType.Ascp : AsperaResourceType.Ascp4;
AsperaFileResource[] array = obj;
foreach (AsperaFileResource asperaFileResource in array) {
if (asperaFileResource.ResourceType.HasFlag(asperaResourceType)) {
string asperaEngineFile = ExtractResource(executingAssembly, asperaFileResource);
if (asperaFileResource.IsAsperaExecutable)
paths.AsperaEngineFile = asperaEngineFile;
}
}
}
private string ExtractResource(Assembly assembly, AsperaFileResource resource)
{
string text = Path.Combine(resource.DestinationDirectory, resource.TargetName);
if (!File.Exists(text))
ExtractFromResource(assembly, resource.ResourceCategory, resource.Name, text);
else if (resource.Version != (Version)null) {
FileVersionInfo versionInfo = FileVersionInfo.GetVersionInfo(text);
if (versionInfo.OriginalFilename != resource.Name || versionInfo.FileMajorPart != resource.Version.Major || versionInfo.FileMinorPart != resource.Version.Minor || versionInfo.FileBuildPart != resource.Version.Build || versionInfo.FilePrivatePart != resource.Version.Revision) {
fileRemover.RemoveFile(text);
ExtractFromResource(assembly, resource.ResourceCategory, resource.Name, text);
}
}
return text;
}
private static void ExtractFromResource(Assembly assembly, string resourceCategory, string resourceName, string targetFile)
{
string text = "Relativity.Transfer.Aspera.Resources." + resourceCategory + "." + resourceName;
using (Stream stream = assembly.GetManifestResourceStream(text)) {
if (stream == null)
throw new TransferException(string.Format(CultureInfo.InvariantCulture, AsperaStrings.AsperaResourceMissingError, text, assembly.FullName));
using (FileStream destination = File.Open(targetFile, FileMode.Create))
stream.CopyTo(destination);
}
}
}
}