1 // ZipPartStream.cs created with MonoDevelop
2 // User: alan at 13:13 23/10/2008
4 // To change standard headers go to Edit->Preferences->Coding->Standard Headers
11 namespace System.IO.Packaging
13 internal class ZipPartStream : Stream
15 public MemoryStream BaseStream { get; private set; }
16 public ZipPackage Package { get; private set; }
18 public override bool CanRead {
20 return BaseStream.CanRead;
24 public override bool CanSeek {
26 return BaseStream.CanSeek;
30 public override bool CanTimeout {
31 get { return BaseStream.CanTimeout; }
34 public override bool CanWrite {
35 get { return Writeable; }
38 public override long Length {
39 get { return BaseStream.Length; }
42 public override long Position {
46 public bool Writeable {
50 public override int WriteTimeout {
52 return BaseStream.WriteTimeout;
55 BaseStream.WriteTimeout = value;
59 public override int ReadTimeout {
61 return BaseStream.ReadTimeout;
64 BaseStream.ReadTimeout = value;
68 public ZipPartStream (ZipPackage package, MemoryStream stream, FileAccess access)
72 Writeable = access != FileAccess.Read;
75 public override void Flush ()
77 // If the user flushes any of the part streams,
78 // we need to flush the entire package
80 // FIXME: Ensure that this actually happens with a testcase
85 public override int Read (byte[] buffer, int offset, int count)
87 Seek (Position, SeekOrigin.Begin);
88 int read = BaseStream.Read (buffer, offset, count);
93 public override long Seek (long offset, SeekOrigin origin)
95 Position = BaseStream.Seek (offset, origin);
99 public override void SetLength (long value)
102 throw new InvalidOperationException ("Stream is not writeable");
104 BaseStream.SetLength (value);
107 public override void Write(byte[] buffer, int offset, int count)
110 throw new InvalidOperationException ("Stream is not writeable");
112 Seek (Position, SeekOrigin.Begin);
113 BaseStream.Write (buffer, offset, count);