/// <summary> /// Imports implementation archives into the <see cref="IStore"/>. /// </summary> private void ImportArchives() { foreach (string path in Directory.GetFiles(_contentDir)) { Debug.Assert(path != null); var digest = new ManifestDigest(); digest.ParseID(Path.GetFileNameWithoutExtension(path)); if (digest.Best != null && !Store.Contains(digest)) { try { Store.AddArchives(new[] { new ArchiveFileInfo { Path = path, MimeType = Archive.GuessMimeType(path) } }, digest, Handler); } #region Error handling catch (ImplementationAlreadyInStoreException) {} #endregion } } }
/// <summary> /// Calculates the <see cref="ManifestDigest"/>. /// </summary> /// <param name="handler">A callback object used when the the user needs to be informed about IO tasks.</param> /// <exception cref="InvalidOperationException"><see cref="ImplementationDirectory"/> is <c>null</c> or empty.</exception> /// <exception cref="OperationCanceledException">The user canceled the task.</exception> /// <exception cref="IOException">There was a problem generating the manifest.</exception> /// <exception cref="UnauthorizedAccessException">Write access to temporary files was not permitted.</exception> public void CalculateDigest(ITaskHandler handler) { #region Sanity checks if (handler == null) { throw new ArgumentNullException(nameof(handler)); } if (string.IsNullOrEmpty(ImplementationDirectory)) { throw new InvalidOperationException("Implementation directory is not set."); } #endregion var newDigest = new ManifestDigest(); // Generate manifest for each available format... foreach (var generator in ManifestFormat.All.Select(format => new ManifestGenerator(ImplementationDirectory, format))) { // ... and add the resulting digest to the return value handler.RunTask(generator); newDigest.ParseID(generator.Manifest.CalculateDigest()); } ManifestDigest = newDigest; }
public void TestParseID() { Assert.AreEqual("test", new ManifestDigest("sha1=test").Sha1); Assert.AreEqual("test", new ManifestDigest("sha1new=test").Sha1New); Assert.AreEqual("test", new ManifestDigest("sha256=test").Sha256); Assert.AreEqual("test", new ManifestDigest("sha256new_test").Sha256New); // Once a digest value has been set, ID values shall not be able to overwrite it var digest = new ManifestDigest("sha1=test"); digest.ParseID("sha1=test2"); Assert.AreEqual("test", digest.Sha1); }
public void TestParseID() { new ManifestDigest("sha1=test").Sha1.Should().Be("test"); new ManifestDigest("sha1new=test").Sha1New.Should().Be("test"); new ManifestDigest("sha256=test").Sha256.Should().Be("test"); new ManifestDigest("sha256new_test").Sha256New.Should().Be("test"); // Once a digest value has been set, ID values shall not be able to overwrite it var digest = new ManifestDigest("sha1=test"); digest.ParseID("sha1=test2"); digest.Sha1.Should().Be("test"); }
public void ParseID() { new ManifestDigest("sha1=test").Sha1.Should().Be("test"); new ManifestDigest("sha1new=test").Sha1New.Should().Be("test"); new ManifestDigest("sha256=test").Sha256.Should().Be("test"); new ManifestDigest("sha256new_test").Sha256New.Should().Be("test"); // Once a digest value has been set, ID values shall not be able to overwrite it var digest = new ManifestDigest("sha1=test"); digest.ParseID("sha1=test2"); digest.Sha1.Should().Be("test"); }
/// <inheritdoc/> public IEnumerable <ManifestDigest> ListAll() { if (!Directory.Exists(Path)) { return(Enumerable.Empty <ManifestDigest>()); } var result = new List <ManifestDigest>(); foreach (string path in Directory.GetDirectories(Path)) { var digest = new ManifestDigest(); digest.ParseID(System.IO.Path.GetFileName(path)); if (digest.Best != null) { result.Add(new ManifestDigest(System.IO.Path.GetFileName(path))); } } return(result); }
/// <summary> /// Generates the <see cref="ManifestDigest"/> for a directory. /// </summary> /// <param name="path">The path of the directory to generate the digest for.</param> /// <param name="handler">A callback object used when the the user is to be informed about progress.</param> /// <param name="keepDownloads"><see langword="true"/> to store the directory as an implementation in the default <see cref="IStore"/>.</param> /// <returns>The newly generated digest.</returns> /// <exception cref="OperationCanceledException">The user canceled the operation.</exception> /// <exception cref="IOException">There is a problem access a temporary file.</exception> /// <exception cref="UnauthorizedAccessException">Read or write access to a temporary file is not permitted.</exception> public static ManifestDigest GenerateDigest([NotNull] string path, [NotNull] ITaskHandler handler, bool keepDownloads = false) { #region Sanity checks if (string.IsNullOrEmpty(path)) { throw new ArgumentNullException("path"); } if (handler == null) { throw new ArgumentNullException("handler"); } #endregion var digest = new ManifestDigest(); // Generate manifest for each available format... foreach (var format in ManifestFormat.Recommended) // ... and add the resulting digest to the return value { var generator = new ManifestGenerator(path, format); handler.RunTask(generator); digest.ParseID(generator.Result.CalculateDigest()); } if (digest.PartialEquals(ManifestDigest.Empty)) { Log.Warn(Resources.EmptyImplementation); } if (keepDownloads) { try { StoreFactory.CreateDefault().AddDirectory(path, digest, handler); } catch (ImplementationAlreadyInStoreException) {} } return(digest); }
/// <inheritdoc /> public void Purge(ITaskHandler handler) { #region Sanity checks if (handler == null) { throw new ArgumentNullException(nameof(handler)); } #endregion ThrowIfMissingAdminRights(); var paths = Directory.GetDirectories(Path).Where(path => { var digest = new ManifestDigest(); digest.ParseID(System.IO.Path.GetFileName(path)); return(digest.Best != null); }).ToList(); handler.RunTask(ForEachTask.Create( name: string.Format(Resources.DeletingDirectory, Path), target: paths, work: digest => RemoveInner(digest, handler, purge: true))); }
public static ManifestDigest GenerateDigest([NotNull] string path, [NotNull] ITaskHandler handler, [CanBeNull] IStore keepDownloads = null) { #region Sanity checks if (string.IsNullOrEmpty(path)) throw new ArgumentNullException(nameof(path)); if (handler == null) throw new ArgumentNullException(nameof(handler)); #endregion var digest = new ManifestDigest(); // Generate manifest for each available format... foreach (var format in ManifestFormat.All) // ... and add the resulting digest to the return value { var generator = new ManifestGenerator(path, format); handler.RunTask(generator); digest.ParseID(generator.Manifest.CalculateDigest()); } if (digest.PartialEquals(ManifestDigest.Empty)) Log.Warn(Resources.EmptyImplementation); if (keepDownloads != null) { try { keepDownloads.AddDirectory(path, digest, handler); } catch (ImplementationAlreadyInStoreException) {} } return digest; }
/// <summary> /// Calculates the <see cref="ManifestDigest"/>. /// </summary> /// <param name="handler">A callback object used when the the user needs to be informed about IO tasks.</param> /// <exception cref="InvalidOperationException"><see cref="ImplementationDirectory"/> is <see langword="null"/> or empty.</exception> /// <exception cref="OperationCanceledException">The user canceled the task.</exception> /// <exception cref="IOException">There was a problem generating the manifest or detectng the executables.</exception> /// <exception cref="UnauthorizedAccessException">Write access to temporary files was not permitted.</exception> public void CalculateDigest(ITaskHandler handler) { #region Sanity checks if (handler == null) throw new ArgumentNullException("handler"); if (string.IsNullOrEmpty(ImplementationDirectory)) throw new InvalidOperationException("Implementation directory is not set."); #endregion var newDigest = new ManifestDigest(); // Generate manifest for each available format... foreach (var generator in ManifestFormat.Recommended.Select(format => new ManifestGenerator(ImplementationDirectory, format))) { // ... and add the resulting digest to the return value handler.RunTask(generator); newDigest.ParseID(generator.Result.CalculateDigest()); } ManifestDigest = newDigest; }