Merge pull request #3142 from henricm/fix-for-win-mono_string_to_utf8
[mono.git] / mcs / class / WindowsBase / System.IO.Packaging / ZipPackage.cs
index 4b7fed99a11ff8ae48c177b2cd9ddb84e243c6bd..783350b09344a6943326be5ae5eafa28a5e589b3 100644 (file)
@@ -95,8 +95,10 @@ namespace System.IO.Packaging {
                {
                        // 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;
@@ -107,6 +109,9 @@ namespace System.IO.Packaging {
 
                                // 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);
                                        
@@ -205,6 +210,8 @@ namespace System.IO.Packaging {
                {
                        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, "", ""));
@@ -213,19 +220,35 @@ namespace System.IO.Packaging {
                        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))