[msvc] Update csproj files
[mono.git] / mcs / class / WindowsBase / System.IO.Packaging / Package.cs
old mode 100644 (file)
new mode 100755 (executable)
index 5a0204d..002d592
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
 // Copyright (c) 2007 Novell, Inc. (http://www.novell.com)
+// Copyright (c) 2011 Xamarin Inc. (http://www.xamarin.com)
 //
 // Authors:
 //     Chris Toshok (toshok@ximian.com)
 //     Alan McGovern (amcgovern@novell.com)
+//     Rolf Bjarne Kvinge (rolf@xamarin.com)
 //
 
 using System;
@@ -42,6 +44,9 @@ namespace System.IO.Packaging {
                PackageRelationshipCollection relationshipsCollection = new PackageRelationshipCollection ();
                Uri Uri = new Uri ("/", UriKind.Relative);
                
+               bool Disposed {
+                       get; set;
+               }
 
                public FileAccess FileOpenAccess {
                        get; private set;
@@ -89,15 +94,15 @@ namespace System.IO.Packaging {
                }
                
                
-               protected Package (FileAccess fileOpenAccess)
-                       : this (fileOpenAccess, false)
+               protected Package (FileAccess openFileAccess)
+                       : this (openFileAccess, false)
                {
                        
                }
 
-               protected Package (FileAccess fileOpenAccess, bool streaming)
+               protected Package (FileAccess openFileAccess, bool streaming)
                {
-                       FileOpenAccess = fileOpenAccess;
+                       FileOpenAccess = openFileAccess;
                        Streaming = streaming;
                }
 
@@ -111,8 +116,7 @@ namespace System.IO.Packaging {
                public void Close ()
                {
                        // FIXME: Ensure that Flush is actually called before dispose
-                       Flush ();
-                       Dispose (true);
+                       ((IDisposable) this).Dispose ();
                }
 
                public PackagePart CreatePart (Uri partUri, string contentType)
@@ -134,7 +138,7 @@ namespace System.IO.Packaging {
                        return part;
                }
                
-               protected abstract PackagePart CreatePartCore (Uri parentUri, string contentType, CompressionOption compressionOption);
+               protected abstract PackagePart CreatePartCore (Uri partUri, string contentType, CompressionOption compressionOption);
 
                public PackageRelationship CreateRelationship (Uri targetUri, TargetMode targetMode, string relationshipType)
                {
@@ -219,8 +223,11 @@ namespace System.IO.Packaging {
                
                void IDisposable.Dispose ()
                {
-                       Flush ();
-                       Dispose (true);
+                       if (!Disposed) {
+                               Flush ();
+                               Dispose (true);
+                               Disposed = true;
+                       }
                }
 
                protected virtual void Dispose (bool disposing)
@@ -337,7 +344,7 @@ namespace System.IO.Packaging {
                string NextId ()
                {
                        while (true) {
-                               string s = RelationshipId.ToString ();
+                               string s = "Re" + RelationshipId.ToString ();
                                if (!Relationships.ContainsKey (s))
                                        return s;
                                
@@ -368,7 +375,12 @@ namespace System.IO.Packaging {
 
                public static Package Open (Stream stream, FileMode packageMode, FileAccess packageAccess)
                {
-                       return OpenCore (stream, packageMode, packageAccess);
+                       return Open (stream, packageMode, packageAccess, false);
+               }
+               
+               static Package Open (Stream stream, FileMode packageMode, FileAccess packageAccess, bool ownsStream)
+               {
+                       return OpenCore (stream, packageMode, packageAccess, ownsStream);
                }
 
                public static Package Open (string path, FileMode packageMode, FileAccess packageAccess)
@@ -392,10 +404,15 @@ namespace System.IO.Packaging {
                                throw new FileFormatException ("Stream length cannot be zero with FileMode.Open");
 
                        Stream s = File.Open (path, packageMode, packageAccess, packageShare);
-                       return Open (s, packageMode, packageAccess);
+                       try {
+                               return Open (s, packageMode, packageAccess, true);
+                       } catch {
+                               s.Close  ();
+                               throw;
+                       }
                }
 
-               static Package OpenCore (Stream stream, FileMode packageMode, FileAccess packageAccess)
+               static Package OpenCore (Stream stream, FileMode packageMode, FileAccess packageAccess, bool ownsStream)
                {
                        if ((packageAccess & FileAccess.Read) == FileAccess.Read && !stream.CanRead)
                                throw new IOException ("Stream does not support reading");
@@ -430,7 +447,7 @@ namespace System.IO.Packaging {
                                }
                        }
                        
-                       return new ZipPackage (packageAccess, stream);
+                       return new ZipPackage (packageAccess, ownsStream, stream);
                }
                
                public virtual bool PartExists (Uri partUri)
@@ -445,6 +462,8 @@ namespace System.IO.Packaging {
 
                internal static void WriteRelationships (Dictionary <string, PackageRelationship> relationships, Stream stream)
                {
+                       stream.SetLength(0);
+
                        XmlDocument doc = new XmlDocument ();
                        XmlNamespaceManager manager = new XmlNamespaceManager (doc.NameTable);
                        manager.AddNamespace ("rel", RelationshipNamespace);