private static async Task <PackageArchiveMetadata> CreateArchiveAsync(string id, string version, params ZipEntry[] files)
        {
            using (var zipArchiveStream = new MemoryStream())
            {
                using (var zipArchive = new ZipArchive(zipArchiveStream, ZipArchiveMode.Create, leaveOpen: true))
                {
                    foreach (var file in files)
                    {
                        var entry = zipArchive.CreateEntry(file.Name, file.CompressionLevel);

                        if (file.ExternalAttributes.HasValue)
                        {
                            entry.ExternalAttributes = file.ExternalAttributes.Value;
                        }

                        if (file.LastWriteTime.HasValue)
                        {
                            entry.LastWriteTime = file.LastWriteTime.Value;
                        }

                        using (var sourceStream = new MemoryStream(Encoding.UTF8.GetBytes(file.Contents)))
                            using (var destinationStream = entry.Open())
                            {
                                sourceStream.CopyTo(destinationStream);
                            }
                    }
                }

                zipArchiveStream.Position = 0;

                using (var reader = new ZipDirectoryReader(zipArchiveStream))
                {
                    var zipDirectory = await reader.ReadAsync();

                    return(new PackageArchiveMetadata
                    {
                        Id = id,
                        Version = version,
                        Size = zipArchiveStream.Length,
                        ZipDirectory = zipDirectory,
                    });
                }
            }
        }
Beispiel #2
0
        private async Task <PackageArchiveMetadata> InitializeItemAsync(PackageEntity package, CancellationToken token)
        {
            // Read the .zip directory.
            ZipDirectory zipDirectory;
            long         size;

            using (var stream = await _mZipStore.GetMZipStreamOrNullAsync(
                       package.PackageRegistration.Id,
                       package.Version,
                       token))
            {
                if (stream == null)
                {
                    if (!package.CatalogPackage.Deleted)
                    {
                        throw new InvalidOperationException($"Could not find .mzip for {package.PackageRegistration.Id} {package.Version}.");
                    }

                    return(null);
                }

                using (var reader = new ZipDirectoryReader(stream))
                {
                    zipDirectory = await reader.ReadAsync();

                    size = stream.Length;
                }
            }

            // Gather the metadata.
            var metadata = new PackageArchiveMetadata
            {
                Id           = package.PackageRegistration.Id,
                Version      = package.Version,
                Size         = size,
                ZipDirectory = zipDirectory,
            };

            return(metadata);
        }