コード例 #1
0
 /// <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
         }
     }
 }
コード例 #2
0
        /// <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;
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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");
        }
コード例 #5
0
    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");
    }
コード例 #6
0
    /// <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);
    }
コード例 #7
0
        /// <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);
        }
コード例 #8
0
    /// <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)));
    }
コード例 #9
0
        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;
        }
コード例 #10
0
 /// <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
         }
     }
 }
コード例 #11
0
        /// <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;
        }