Пример #1
0
            /// <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
            }
Пример #2
0
        //------------------------------------------------------
        //
        //  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;
        }
Пример #3
0
 /// <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;
 }
Пример #4
0
        /// <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;
        }
Пример #5
0
        /// <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;
        }
Пример #6
0
        /// <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;
        }