<PackageReference Include="Relativity.Server.Transfer.SDK" Version="7.7.0" />

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); } } } }