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 } }
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 } }