Paradox Game Engine  v1.0.0 beta06
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros Pages
ZipStream.cs
Go to the documentation of this file.
1 // Copyright (c) 2014 Silicon Studio Corp. (http://siliconstudio.co.jp)
2 // This file is distributed under Apache 2.0 License. See LICENSE.md for details.
3 //
4 // --------------------------------------------------------------------------------------------------------------------
5 // <copyright file="ZipStream.cs" company="Matthew Leibowitz">
6 // Copyright (c) Matthew Leibowitz
7 // This code is licensed under the Apache 2.0 License
8 // http://www.apache.org/licenses/LICENSE-2.0.html
9 // </copyright>
10 // <summary>
11 // The zip stream.
12 // </summary>
13 // --------------------------------------------------------------------------------------------------------------------
14 
15 namespace System.IO.Compression.Zip
16 {
17  /// <summary>
18  /// The zip stream.
19  /// </summary>
20  public class ZipStream : Stream
21  {
22  #region Fields
23 
24  /// <summary>
25  /// The inner stream.
26  /// </summary>
27  private readonly Stream innerStream;
28 
29  /// <summary>
30  /// The zip file entry.
31  /// </summary>
32  private readonly ZipFileEntry zipFileEntry;
33 
34  #endregion
35 
36  #region Constructors and Destructors
37 
38  /// <summary>
39  /// Initializes a new instance of the <see cref="ZipStream"/> class.
40  /// </summary>
41  /// <param name="innerStream">
42  /// The inner stream.
43  /// </param>
44  /// <param name="zipFileEntry">
45  /// The zip file entry.
46  /// </param>
47  public ZipStream(Stream innerStream, ZipFileEntry zipFileEntry)
48  {
49  this.innerStream = innerStream;
50  this.zipFileEntry = zipFileEntry;
51  }
52 
53  #endregion
54 
55  #region Public Properties
56 
57  /// <summary>
58  /// Gets a value indicating whether CanRead.
59  /// </summary>
60  public override bool CanRead
61  {
62  get
63  {
64  return this.innerStream.CanRead;
65  }
66  }
67 
68  /// <summary>
69  /// Gets a value indicating whether CanSeek.
70  /// </summary>
71  public override bool CanSeek
72  {
73  get
74  {
75  return this.innerStream.CanSeek;
76  }
77  }
78 
79  /// <summary>
80  /// Gets a value indicating whether CanWrite.
81  /// </summary>
82  public override bool CanWrite
83  {
84  get
85  {
86  return false;
87  }
88  }
89 
90  /// <summary>
91  /// Gets Length.
92  /// </summary>
93  public override long Length
94  {
95  get
96  {
97  return this.zipFileEntry.FileSize;
98  }
99  }
100 
101  /// <summary>
102  /// Gets or sets Position.
103  /// </summary>
104  public override long Position
105  {
106  get
107  {
108  return this.innerStream.Position - this.zipFileEntry.FileOffset;
109  }
110 
111  set
112  {
113  this.innerStream.Position = this.zipFileEntry.FileOffset + value;
114  }
115  }
116 
117  #endregion
118 
119  #region Public Methods and Operators
120 
121  /// <summary>
122  /// The close.
123  /// </summary>
124  public override void Close()
125  {
126  base.Close();
127 
128  if (this.zipFileEntry.Method == Compression.Deflate)
129  {
130  this.innerStream.Dispose();
131  }
132  }
133 
134  /// <summary>
135  /// The flush.
136  /// </summary>
137  /// <exception cref="InvalidOperationException">
138  /// </exception>
139  public override void Flush()
140  {
141  throw new InvalidOperationException("You cannot modify this stream.");
142  }
143 
144  /// <summary>
145  /// The read.
146  /// </summary>
147  /// <param name="buffer">
148  /// The buffer.
149  /// </param>
150  /// <param name="offset">
151  /// The offset.
152  /// </param>
153  /// <param name="count">
154  /// The count.
155  /// </param>
156  /// <returns>
157  /// The read.
158  /// </returns>
159  public override int Read(byte[] buffer, int offset, int count)
160  {
161  return this.innerStream.Read(buffer, offset, count);
162  }
163 
164  /// <summary>
165  /// The seek.
166  /// </summary>
167  /// <param name="offset">
168  /// The offset.
169  /// </param>
170  /// <param name="origin">
171  /// The origin.
172  /// </param>
173  /// <returns>
174  /// The seek.
175  /// </returns>
176  /// <exception cref="ArgumentOutOfRangeException">
177  /// </exception>
178  /// <exception cref="EndOfStreamException">
179  /// </exception>
180  public override long Seek(long offset, SeekOrigin origin)
181  {
182  long localOffset = -1;
183  switch (origin)
184  {
185  case SeekOrigin.Begin:
186  localOffset = this.zipFileEntry.FileOffset + offset;
187  break;
188  case SeekOrigin.Current:
189  break;
190  case SeekOrigin.End:
191  localOffset = this.zipFileEntry.FileOffset + this.zipFileEntry.FileSize + offset;
192  break;
193  default:
194  throw new ArgumentOutOfRangeException("origin");
195  }
196 
197  if (localOffset > this.zipFileEntry.FileSize || localOffset < 0)
198  {
199  throw new EndOfStreamException();
200  }
201 
202  return this.innerStream.Seek(localOffset, origin) - this.zipFileEntry.FileOffset;
203  }
204 
205  /// <summary>
206  /// The set length.
207  /// </summary>
208  /// <param name="value">
209  /// The value.
210  /// </param>
211  /// <exception cref="InvalidOperationException">
212  /// </exception>
213  public override void SetLength(long value)
214  {
215  throw new InvalidOperationException("You cannot modify this stream.");
216  }
217 
218  /// <summary>
219  /// The write.
220  /// </summary>
221  /// <param name="buffer">
222  /// The buffer.
223  /// </param>
224  /// <param name="offset">
225  /// The offset.
226  /// </param>
227  /// <param name="count">
228  /// The count.
229  /// </param>
230  /// <exception cref="InvalidOperationException">
231  /// </exception>
232  public override void Write(byte[] buffer, int offset, int count)
233  {
234  throw new InvalidOperationException("You cannot modify this stream.");
235  }
236 
237  #endregion
238  }
239 }
Represents an entry in Zip file directory
Definition: ZipFileEntry.cs:20
override void Close()
The close.
Definition: ZipStream.cs:124
ZipStream(Stream innerStream, ZipFileEntry zipFileEntry)
Initializes a new instance of the ZipStream class.
Definition: ZipStream.cs:47
override void Flush()
The flush.
Definition: ZipStream.cs:139
override void SetLength(long value)
The set length.
Definition: ZipStream.cs:213
override long Seek(long offset, SeekOrigin origin)
The seek.
Definition: ZipStream.cs:180
_In_ size_t count
Definition: DirectXTexP.h:174
override void Write(byte[] buffer, int offset, int count)
The write.
Definition: ZipStream.cs:232
Compression
Compression method enumeration
Definition: Compression.cs:20
override int Read(byte[] buffer, int offset, int count)
The read.
Definition: ZipStream.cs:159