Пример #1
0
        void LoadParts()
        {
            parts = new Dictionary <Uri, ZipPackagePart> (new  UriComparer());
            try
            {
                using (UnzipArchive archive = new UnzipArchive(PackageStream))
                {
                    // Load the content type map file
                    XmlDocument doc = new XmlDocument();
                    using (Stream s = archive.GetStream(ContentUri))
                        doc.Load(s);

                    XmlNamespaceManager manager = new XmlNamespaceManager(doc.NameTable);
                    manager.AddNamespace("content", ContentNamespace);

                    // The file names in the zip archive are not prepended with '/'
                    foreach (string file in archive.GetFiles())
                    {
                        if (file.Equals(ContentUri, StringComparison.Ordinal))
                        {
                            continue;
                        }

                        XmlNode           node;
                        CompressionOption compression = archive.GetCompressionLevel(file);

                        if (file == RelationshipUri.ToString().Substring(1))
                        {
                            CreatePartCore(RelationshipUri, RelationshipContentType, compression);
                            continue;
                        }

                        string xPath = string.Format("/content:Types/content:Override[@PartName='/{0}']", file);
                        node = doc.SelectSingleNode(xPath, manager);

                        if (node == null)
                        {
                            string ext = Path.GetExtension(file);
                            if (ext.StartsWith("."))
                            {
                                ext = ext.Substring(1);
                            }
                            xPath = string.Format("/content:Types/content:Default[@Extension='{0}']", ext);
                            node  = doc.SelectSingleNode(xPath, manager);
                        }

                        // What do i do if the node is null? This means some has tampered with the
                        // package file manually
                        if (node != null)
                        {
                            CreatePartCore(new Uri("/" + file, UriKind.Relative), node.Attributes["ContentType"].Value, compression);
                        }
                    }
                }
            }
            catch
            {
                // The archive is invalid - therefore no parts
            }
        }
Пример #2
0
        void LoadParts()
        {
            parts = new Dictionary <Uri, ZipPackagePart>(new UriComparer());
            try
            {
                PackageStream.Seek(0, SeekOrigin.Begin);
                if (Archive == null)
                {
                    Archive = ZipStorer.Open(PackageStream, FileAccess.Read, false);
                }
                List <ZipStorer.ZipFileEntry> dir = Archive.ReadCentralDir();

                // Load the content type map file
                XmlDocument doc     = new XmlDocument();
                var         content = dir.FirstOrDefault(x => x.FilenameInZip == ContentUri);
                using (var ms = new MemoryStream())
                {
                    Archive.ExtractFile(content, ms);
                    ms.Seek(0, SeekOrigin.Begin);
                    doc.Load(ms);
                }

                XmlNamespaceManager manager = new XmlNamespaceManager(doc.NameTable);
                manager.AddNamespace("content", ContentNamespace);

                // The file names in the zip archive are not prepended with '/'
                foreach (var file in dir)
                {
                    if (file.FilenameInZip.Equals(ContentUri, StringComparison.Ordinal))
                    {
                        continue;
                    }

                    XmlNode node;

                    if (file.FilenameInZip == RelationshipUri.ToString().Substring(1))
                    {
                        CreatePartCore(RelationshipUri, RelationshipContentType, CompressionOption.Normal);
                        continue;
                    }

                    string xPath = string.Format("/content:Types/content:Override[@PartName='/{0}']", file);
                    node = doc.SelectSingleNode(xPath, manager);

                    if (node == null)
                    {
                        string ext = Path.GetExtension(file.FilenameInZip);
                        if (ext.StartsWith("."))
                        {
                            ext = ext.Substring(1);
                        }
                        xPath = string.Format("/content:Types/content:Default[@Extension='{0}']", ext);
                        node  = doc.SelectSingleNode(xPath, manager);
                    }

                    // What do i do if the node is null? This means some has tampered with the
                    // package file manually
                    if (node != null)
                    {
                        CreatePartCore(new Uri("/" + file, UriKind.Relative), node.Attributes["ContentType"].Value,
                                       CompressionOption.Normal);
                    }
                }
            }
            catch
            {
                // The archive is invalid - therefore no parts
            }
        }