Beispiel #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
            }
        }
Beispiel #2
0
        protected override Stream GetStreamCore(FileMode mode, FileAccess access)
        {
            ZipPartStream zps;
            MemoryStream  stream;

            if (Package.PartStreams.TryGetValue(Uri, out stream))
            {
                zps = new ZipPartStream(Package, stream, access);
                if (mode == FileMode.Create)
                {
                    stream.SetLength(0);
                }
                return(new ZipPartStream(Package, stream, access));
            }

            stream = new MemoryStream();
            try
            {
                using (UnzipArchive archive = new UnzipArchive(Package.PackageStream))
                {
                    foreach (string file in archive.GetFiles())
                    {
                        if (file != Uri.ToString().Substring(1))
                        {
                            continue;
                        }

                        using (Stream archiveStream = archive.GetStream(file))
                        {
                            int    read   = 0;
                            byte[] buffer = new byte [Math.Min(archiveStream.Length, 2 * 1024)];
                            while ((read = archiveStream.Read(buffer, 0, buffer.Length)) != 0)
                            {
                                stream.Write(buffer, 0, read);
                            }
                        }
                    }
                }
            }
            catch
            {
                // The zipfile is invalid, so just create the file
                // as if it didn't exist
                stream.SetLength(0);
            }

            Package.PartStreams.Add(Uri, stream);
            if (mode == FileMode.Create)
            {
                stream.SetLength(0);
            }
            return(new ZipPartStream(Package, stream, access));
        }