/// <summary> /// Initialize the object without uploading any information from the package. /// Complete initialization in read mode also involves calling ParseContentTypesFile /// to deserialize content type information. /// </summary> internal ContentTypeHelper(ZipArchive zipArchive, FileMode packageFileMode, FileAccess packageFileAccess, ZipStreamManager zipStreamManager) { _zipArchive = zipArchive; //initialized in the ZipPackage constructor _packageFileMode = packageFileMode; _packageFileAccess = packageFileAccess; _zipStreamManager = zipStreamManager; //initialized in the ZipPackage constructor // The extensions are stored in the default Dictionary in their original form , but they are compared // in a normalized manner using the ExtensionComparer. _defaultDictionary = new Dictionary <string, ContentType>(s_defaultDictionaryInitialSize, s_extensionEqualityComparer); // Identify the content type file or files before identifying parts and piece sequences. // This is necessary because the name of the content type stream is not a part name and // the information it contains is needed to recognize valid parts. if (_zipArchive.Mode == ZipArchiveMode.Read || _zipArchive.Mode == ZipArchiveMode.Update) { ParseContentTypesFile(_zipArchive.Entries); } //No contents to persist to the disk - _dirty = false; //by default //Lazy initialize these members as required //_overrideDictionary - Overrides should be rare //_contentTypeFileInfo - We will either find an atomin part, or //_contentTypeStreamPieces - an interleaved part //_contentTypeStreamExists - defaults to false - not yet found }
//------------------------------------------------------ // // Public Events // //------------------------------------------------------ // None //------------------------------------------------------ // // Internal Constructors // //------------------------------------------------------ #region Internal Constructors /// <summary> /// Constructs a ZipPackagePart for an atomic (i.e. non-interleaved) part. /// This is called from the ZipPackage class as a result of GetPartCore, /// GetPartsCore or CreatePartCore methods /// </summary> /// <param name="zipPackage"></param> /// <param name="zipArchive"></param> /// <param name="zipArchiveEntry"></param> /// <param name="zipStreamManager"></param> /// <param name="partUri"></param> /// <param name="compressionOption"></param> /// <param name="contentType"></param> internal ZipPackagePart(ZipPackage zipPackage, ZipArchive zipArchive, ZipArchiveEntry zipArchiveEntry, ZipStreamManager zipStreamManager, PackUriHelper.ValidatedPartUri partUri, string contentType, CompressionOption compressionOption) : base(zipPackage, partUri, contentType, compressionOption) { _zipPackage = zipPackage; _zipArchive = zipArchive; _zipStreamManager = zipStreamManager; _zipArchiveEntry = zipArchiveEntry; }
/// <summary> /// Constructs a ZipPackagePart for an atomic (i.e. non-interleaved) part. /// This is called from the ZipPackage class as a result of GetPartCore, /// GetPartsCore or CreatePartCore methods /// </summary> /// <param name="zipPackage"></param> /// <param name="zipArchive"></param> /// <param name="zipArchiveEntry"></param> /// <param name="zipStreamManager"></param> /// <param name="partUri"></param> /// <param name="compressionOption"></param> /// <param name="contentType"></param> internal ZipPackagePart(ZipPackage zipPackage, ZipArchive zipArchive, ZipArchiveEntry zipArchiveEntry, ZipStreamManager zipStreamManager, PackUriHelper.ValidatedPartUri partUri, string contentType, CompressionOption compressionOption) : base(zipPackage, partUri, contentType, compressionOption) { _zipPackage = zipPackage; _zipArchive = zipArchive; _zipStreamManager = zipStreamManager; _zipArchiveEntry = zipArchiveEntry; }
/// <summary> /// Internal constructor that is called by the Open(Stream) static methods. /// </summary> /// <param name="s"></param> /// <param name="packageFileMode"></param> /// <param name="packageFileAccess"></param> internal ZipPackage(Stream s, FileMode packageFileMode, FileAccess packageFileAccess) : base(packageFileAccess) { ZipArchive zipArchive = null; ContentTypeHelper contentTypeHelper = null; _packageFileMode = packageFileMode; _packageFileAccess = packageFileAccess; try { ZipArchiveMode zipArchiveMode = ZipArchiveMode.Update; if (packageFileAccess == FileAccess.Read) { zipArchiveMode = ZipArchiveMode.Read; } else if (packageFileAccess == FileAccess.Write) { zipArchiveMode = ZipArchiveMode.Create; } else if (packageFileAccess == FileAccess.ReadWrite) { zipArchiveMode = ZipArchiveMode.Update; } zipArchive = new ZipArchive(s, zipArchiveMode, true, Text.Encoding.UTF8); _zipStreamManager = new ZipStreamManager(zipArchive, packageFileMode, packageFileAccess); contentTypeHelper = new ContentTypeHelper(zipArchive, packageFileMode, packageFileAccess, _zipStreamManager); } catch (InvalidDataException) { throw new FileFormatException("File contains corrupted data."); } catch { if (zipArchive != null) { zipArchive.Dispose(); } throw; } _containerStream = s; _shouldCloseContainerStream = false; _zipArchive = zipArchive; _contentTypeHelper = contentTypeHelper; }
/// <summary> /// Internal constructor that is called by the OpenOnFile static method. /// </summary> /// <param name="path">File path to the container.</param> /// <param name="packageFileMode">Container is opened in the specified mode if possible</param> /// <param name="packageFileAccess">Container is opened with the specified access if possible</param> /// <param name="share">Container is opened with the specified share if possible</param> internal ZipPackage(string path, FileMode packageFileMode, FileAccess packageFileAccess, FileShare share) : base(packageFileAccess) { ZipArchive zipArchive = null; ContentTypeHelper contentTypeHelper = null; _packageFileMode = packageFileMode; _packageFileAccess = packageFileAccess; try { _containerStream = new FileStream(path, _packageFileMode, _packageFileAccess, share); _shouldCloseContainerStream = true; ZipArchiveMode zipArchiveMode = ZipArchiveMode.Update; if (packageFileAccess == FileAccess.Read) { zipArchiveMode = ZipArchiveMode.Read; } else if (packageFileAccess == FileAccess.Write) { zipArchiveMode = ZipArchiveMode.Create; } else if (packageFileAccess == FileAccess.ReadWrite) { zipArchiveMode = ZipArchiveMode.Update; } zipArchive = new ZipArchive(_containerStream, zipArchiveMode, true, Text.Encoding.UTF8); _zipStreamManager = new ZipStreamManager(zipArchive, _packageFileMode, _packageFileAccess); contentTypeHelper = new ContentTypeHelper(zipArchive, _packageFileMode, _packageFileAccess, _zipStreamManager); } catch { if (zipArchive != null) { zipArchive.Dispose(); } throw; } _zipArchive = zipArchive; _contentTypeHelper = contentTypeHelper; }
/// <summary> /// Internal constructor that is called by the Open(Stream) static methods. /// </summary> /// <param name="s"></param> /// <param name="packageFileMode"></param> /// <param name="packageFileAccess"></param> internal ZipPackage(Stream s, FileMode packageFileMode, FileAccess packageFileAccess) : base(packageFileAccess) { ZipArchive? zipArchive = null; ContentTypeHelper?contentTypeHelper; _packageFileMode = packageFileMode; _packageFileAccess = packageFileAccess; try { if (s.CanSeek) { switch (packageFileMode) { case FileMode.Open: if (s.Length == 0) { throw new FileFormatException(SR.ZipZeroSizeFileIsNotValidArchive); } break; case FileMode.CreateNew: if (s.Length != 0) { throw new IOException(SR.CreateNewOnNonEmptyStream); } break; case FileMode.Create: if (s.Length != 0) { s.SetLength(0); // Discard existing data } break; } } ZipArchiveMode zipArchiveMode = ZipArchiveMode.Update; if (packageFileAccess == FileAccess.Read) { zipArchiveMode = ZipArchiveMode.Read; } else if (packageFileAccess == FileAccess.Write) { zipArchiveMode = ZipArchiveMode.Create; } else if (packageFileAccess == FileAccess.ReadWrite) { zipArchiveMode = ZipArchiveMode.Update; } zipArchive = new ZipArchive(s, zipArchiveMode, true, Text.Encoding.UTF8); _zipStreamManager = new ZipStreamManager(zipArchive, packageFileMode, packageFileAccess); contentTypeHelper = new ContentTypeHelper(zipArchive, packageFileMode, packageFileAccess, _zipStreamManager); } catch (InvalidDataException) { throw new FileFormatException(SR.FileContainsCorruptedData); } catch { zipArchive?.Dispose(); throw; } _containerStream = s; _shouldCloseContainerStream = false; _zipArchive = zipArchive; _contentTypeHelper = contentTypeHelper; }