// 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;
PackageRelationshipCollection relationshipsCollection = new PackageRelationshipCollection ();
Uri Uri = new Uri ("/", UriKind.Relative);
+ bool Disposed {
+ get; set;
+ }
public FileAccess FileOpenAccess {
get; private set;
}
- 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;
}
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)
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)
{
void IDisposable.Dispose ()
{
- Flush ();
- Dispose (true);
+ if (!Disposed) {
+ Flush ();
+ Dispose (true);
+ Disposed = true;
+ }
}
protected virtual void Dispose (bool disposing)
string NextId ()
{
while (true) {
- string s = RelationshipId.ToString ();
+ string s = "Re" + RelationshipId.ToString ();
if (!Relationships.ContainsKey (s))
return s;
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)
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");
}
}
- return new ZipPackage (packageAccess, stream);
+ return new ZipPackage (packageAccess, ownsStream, stream);
}
public virtual bool PartExists (Uri partUri)
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);