{
// Ensure that all the data has been read out of the package
// stream already. Otherwise we'll lose data when we recreate the zip
- foreach (ZipPackagePart part in Parts.Values)
- part.GetStream ().Dispose ();
+ foreach (ZipPackagePart part in Parts.Values) {
+ if (part.Package != null)
+ part.GetStream ().Dispose ();
+ }
// Empty the package stream
PackageStream.Position = 0;
// Write all the part streams
foreach (ZipPackagePart part in Parts.Values) {
+ if (part.Package == null)
+ continue;
+
Stream partStream = part.GetStream ();
partStream.Seek (0, SeekOrigin.Begin);
{
XmlDocument doc = new XmlDocument ();
XmlNamespaceManager manager = new XmlNamespaceManager (doc.NameTable);
+ Dictionary<string, string> mimes = new Dictionary<string, string> ();
+
manager.AddNamespace ("content", ContentNamespace);
doc.AppendChild(doc.CreateNode (XmlNodeType.XmlDeclaration, "", ""));
doc.AppendChild (root);
foreach (ZipPackagePart part in Parts.Values)
{
- XmlNode node = doc.CreateNode (XmlNodeType.Element, "Override", ContentNamespace);
-
- XmlAttribute contentType = doc.CreateAttribute ("ContentType");
- contentType.Value = part.ContentType;
+ XmlNode node = null;
+ string existingMimeType;
+
+ var extension = Path.GetExtension (part.Uri.OriginalString);
+ if (extension.Length > 0)
+ extension = extension.Substring (1);
- XmlAttribute name = doc.CreateAttribute ("PartName");
- name.Value = part.Uri.ToString ();
+ if (!mimes.TryGetValue (extension, out existingMimeType)) {
+ node = doc.CreateNode (XmlNodeType.Element, "Default", ContentNamespace);
+
+ XmlAttribute ext = doc.CreateAttribute ("Extension");
+ ext.Value = extension;
+ node.Attributes.Append (ext);
+ mimes [extension] = part.ContentType;
+ } else if (part.ContentType != existingMimeType) {
+ node = doc.CreateNode (XmlNodeType.Element, "Override", ContentNamespace);
+
+ XmlAttribute name = doc.CreateAttribute ("PartName");
+ name.Value = part.Uri.ToString ();
+ node.Attributes.Append (name);
+ }
-
- node.Attributes.Append (contentType);
- node.Attributes.Append (name);
-
- root.AppendChild (node);
+ if (node != null) {
+ XmlAttribute contentType = doc.CreateAttribute ("ContentType");
+ contentType.Value = part.ContentType;
+ node.Attributes.Prepend (contentType);
+
+ root.AppendChild (node);
+ }
}
using (XmlTextWriter writer = new XmlTextWriter (s, System.Text.Encoding.UTF8))