[WindowsBase] Don't treat special file [Content-Types].xml as a part, ends up as...
[mono.git] / mcs / class / WindowsBase / System.IO.Packaging / ZipPartStream.cs
1 // ZipPartStream.cs created with MonoDevelop
2 // User: alan at 13:13 23/10/2008
3 //
4 // To change standard headers go to Edit->Preferences->Coding->Standard Headers
5 //
6
7 using System;
8 using System.IO;
9 using zipsharp;
10
11 namespace System.IO.Packaging
12 {
13         internal class ZipPartStream : Stream
14         {
15                 public MemoryStream BaseStream { get; private set; }
16                 public ZipPackage Package { get; private set; }
17                 
18                 public override bool CanRead {
19                         get {
20                                 return BaseStream.CanRead;
21                         }
22                 }
23                 
24                 public override bool CanSeek {
25                         get {
26                                 return BaseStream.CanSeek;
27                         }
28                 }
29
30                 public override bool CanTimeout {
31                         get { return BaseStream.CanTimeout; }
32                 }
33
34                 public override bool CanWrite {
35                         get { return Writeable; }
36                 }
37
38                 public override long Length {
39                         get { return BaseStream.Length; }
40                 }
41                 
42                 public override long Position {
43                         get; set;
44                 }
45
46                 public bool Writeable {
47                         get; set;
48                 }
49
50                 public override int WriteTimeout {
51                         get {
52                                 return BaseStream.WriteTimeout;
53                         }
54                         set {
55                                 BaseStream.WriteTimeout = value;
56                         }
57                 }
58                 
59                 public override int ReadTimeout {
60                         get {
61                                 return BaseStream.ReadTimeout;
62                         }
63                         set {
64                                 BaseStream.ReadTimeout = value;
65                         }
66                 }
67
68                 public ZipPartStream (ZipPackage package, MemoryStream stream, FileAccess access)
69                 {
70                         BaseStream = stream;
71                         Package = package;
72                         Writeable = access != FileAccess.Read;
73                 }
74
75                 public override void Flush ()
76                 {
77                         // If the user flushes any of the part streams,
78                         // we need to flush the entire package
79                         
80                         // FIXME: Ensure that this actually happens with a testcase
81                         // ...if possible
82                         Package.Flush ();
83                 }
84                 
85                 public override int Read (byte[] buffer, int offset, int count)
86                 {
87                         Seek (Position, SeekOrigin.Begin);
88                         int read = BaseStream.Read (buffer, offset, count);
89                         Position += read;
90                         return read;
91                 }
92
93                 public override long Seek (long offset, SeekOrigin origin)
94                 {
95                         Position = BaseStream.Seek (offset, origin);
96                         return Position;
97                 }
98
99                 public override void SetLength (long value)
100                 {
101                         if (!CanWrite)
102                                 throw new InvalidOperationException ("Stream is not writeable");
103                         
104                         BaseStream.SetLength (value);
105                 }
106
107                 public override void Write(byte[] buffer, int offset, int count)
108                 {
109                         if (!CanWrite)
110                                 throw new InvalidOperationException ("Stream is not writeable");
111                         
112                         Seek (Position, SeekOrigin.Begin);
113                         BaseStream.Write (buffer, offset, count);
114                         Position += count;
115                 }
116         }
117 }