Beispiel #1
0
        private PackageEntryEntity Initialize(PackageEntryEntity entity, CentralDirectoryHeader metadata)
        {
            entity.Comment            = metadata.Comment;
            entity.CommentSize        = metadata.CommentSize;
            entity.CompressedSize     = metadata.CompressedSize;
            entity.CompressionMethod  = metadata.CompressionMethod;
            entity.Crc32              = metadata.Crc32;
            entity.DiskNumberStart    = metadata.DiskNumberStart;
            entity.ExternalAttributes = metadata.ExternalAttributes;
            entity.ExtraField         = metadata.ExtraField;
            entity.ExtraFieldSize     = metadata.ExtraFieldSize;
            entity.Flags              = metadata.Flags;
            entity.InternalAttributes = metadata.InternalAttributes;
            entity.LastModifiedDate   = metadata.LastModifiedDate;
            entity.LastModifiedTime   = metadata.LastModifiedTime;
            entity.LocalHeaderOffset  = metadata.LocalHeaderOffset;
            entity.Name             = metadata.Name;
            entity.NameSize         = metadata.NameSize;
            entity.UncompressedSize = metadata.UncompressedSize;
            entity.VersionMadeBy    = metadata.VersionMadeBy;
            entity.VersionToExtract = metadata.VersionToExtract;

            return(entity);
        }
Beispiel #2
0
        private PackageArchiveEntity Initialize(PackageArchiveEntity entity, PackageArchiveMetadata metadata)
        {
            entity.Size       = metadata.Size;
            entity.EntryCount = metadata.ZipDirectory.Entries.Count;

            entity.CentralDirectorySize = metadata.ZipDirectory.CentralDirectorySize;
            entity.Comment     = metadata.ZipDirectory.Comment;
            entity.CommentSize = metadata.ZipDirectory.CommentSize;
            entity.DiskWithStartOfCentralDirectory = metadata.ZipDirectory.DiskWithStartOfCentralDirectory;
            entity.EntriesForWholeCentralDirectory = metadata.ZipDirectory.EntriesForWholeCentralDirectory;
            entity.EntriesInThisDisk = metadata.ZipDirectory.EntriesInThisDisk;
            entity.NumberOfThisDisk  = metadata.ZipDirectory.NumberOfThisDisk;
            entity.OffsetAfterEndOfCentralDirectory = metadata.ZipDirectory.OffsetAfterEndOfCentralDirectory;
            entity.OffsetOfCentralDirectory         = metadata.ZipDirectory.OffsetOfCentralDirectory;

            entity.Zip64CentralDirectorySize                 = metadata.ZipDirectory.Zip64?.CentralDirectorySize;
            entity.Zip64DiskWithStartOfCentralDirectory      = metadata.ZipDirectory.Zip64?.DiskWithStartOfCentralDirectory;
            entity.Zip64DiskWithStartOfEndOfCentralDirectory = metadata.ZipDirectory.Zip64?.DiskWithStartOfEndOfCentralDirectory;
            entity.Zip64EndOfCentralDirectoryOffset          = metadata.ZipDirectory.Zip64?.EndOfCentralDirectoryOffset;
            entity.Zip64EntriesForWholeCentralDirectory      = metadata.ZipDirectory.Zip64?.EntriesForWholeCentralDirectory;
            entity.Zip64EntriesInThisDisk = metadata.ZipDirectory.Zip64?.EntriesInThisDisk;
            entity.Zip64NumberOfThisDisk  = metadata.ZipDirectory.Zip64?.NumberOfThisDisk;
            entity.Zip64OffsetAfterEndOfCentralDirectoryLocator = metadata.ZipDirectory.Zip64?.OffsetAfterEndOfCentralDirectoryLocator;
            entity.Zip64OffsetOfCentralDirectory     = metadata.ZipDirectory.Zip64?.OffsetOfCentralDirectory;
            entity.Zip64SizeOfCentralDirectoryRecord = metadata.ZipDirectory.Zip64?.SizeOfCentralDirectoryRecord;
            entity.Zip64TotalNumberOfDisks           = metadata.ZipDirectory.Zip64?.TotalNumberOfDisks;
            entity.Zip64VersionMadeBy    = metadata.ZipDirectory.Zip64?.VersionMadeBy;
            entity.Zip64VersionToExtract = metadata.ZipDirectory.Zip64?.VersionToExtract;

            // Make sure the entries are sorted by index.
            if (entity.PackageEntries == null)
            {
                entity.PackageEntries = new List <PackageEntryEntity>();
            }

            entity.PackageEntries.Sort((a, b) => a.Index.CompareTo(b.Index));

            for (var index = 0; index < metadata.ZipDirectory.Entries.Count; index++)
            {
                var entryMetadata = metadata.ZipDirectory.Entries[index];
                PackageEntryEntity entryEntity;
                if (index < entity.PackageEntries.Count)
                {
                    entryEntity = entity.PackageEntries[index];

                    if (entryEntity.Index != (ulong)index)
                    {
                        throw new InvalidOperationException("One of the package archive entries seems to have an incorrect index.");
                    }
                }
                else if (index == entity.PackageEntries.Count)
                {
                    entryEntity = new PackageEntryEntity
                    {
                        PackageArchive = entity,
                        Index          = (ulong)index,
                    };

                    entity.PackageEntries.Add(entryEntity);
                }
                else
                {
                    throw new InvalidOperationException("The list of existing package entries should have grown.");
                }

                Initialize(entryEntity, entryMetadata);
            }

            entity
            .PackageEntries
            .RemoveAll(x => x.Index >= (ulong)metadata.ZipDirectory.Entries.Count);

            return(entity);
        }