Rizin
unix-like reverse engineering framework and cli tools
GZipStream.cs
Go to the documentation of this file.
1 //
2 // © Copyright Henrik Ravn 2004
3 //
4 // Use, modification and distribution are subject to the Boost Software License, Version 1.0.
5 // (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 //
7 
8 using System;
9 using System.IO;
10 using System.Runtime.InteropServices;
11 
12 namespace DotZLib
13 {
17  public class GZipStream : Stream, IDisposable
18  {
19  #region Dll Imports
20  [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl, CharSet=CharSet.Ansi)]
21  private static extern IntPtr gzopen(string name, string mode);
22 
23  [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)]
24  private static extern int gzclose(IntPtr gzFile);
25 
26  [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)]
27  private static extern int gzwrite(IntPtr gzFile, int data, int length);
28 
29  [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)]
30  private static extern int gzread(IntPtr gzFile, int data, int length);
31 
32  [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)]
33  private static extern int gzgetc(IntPtr gzFile);
34 
35  [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)]
36  private static extern int gzputc(IntPtr gzFile, int c);
37 
38  #endregion
39 
40  #region Private data
41  private IntPtr _gzFile;
42  private bool _isDisposed = false;
43  private bool _isWriting;
44  #endregion
45 
46  #region Constructors
54  {
55  _isWriting = true;
56  _gzFile = gzopen(fileName, String.Format("wb{0}", (int)level));
57  if (_gzFile == IntPtr.Zero)
58  throw new ZLibException(-1, "Could not open " + fileName);
59  }
60 
66  public GZipStream(string fileName)
67  {
68  _isWriting = false;
69  _gzFile = gzopen(fileName, "rb");
70  if (_gzFile == IntPtr.Zero)
71  throw new ZLibException(-1, "Could not open " + fileName);
72 
73  }
74  #endregion
75 
76  #region Access properties
80  public override bool CanRead
81  {
82  get
83  {
84  return !_isWriting;
85  }
86  }
87 
88 
92  public override bool CanSeek
93  {
94  get
95  {
96  return false;
97  }
98  }
99 
103  public override bool CanWrite
104  {
105  get
106  {
107  return _isWriting;
108  }
109  }
110  #endregion
111 
112  #region Destructor & IDispose stuff
113 
118  {
119  cleanUp(false);
120  }
121 
125  public void Dispose()
126  {
127  cleanUp(true);
128  }
129 
130  // Does the actual closing of the file handle.
131  private void cleanUp(bool isDisposing)
132  {
133  if (!_isDisposed)
134  {
135  gzclose(_gzFile);
136  _isDisposed = true;
137  }
138  }
139  #endregion
140 
141  #region Basic reading and writing
154  public override int Read(byte[] buffer, int offset, int count)
155  {
156  if (!CanRead) throw new NotSupportedException();
157  if (buffer == null) throw new ArgumentNullException();
158  if (offset < 0 || count < 0) throw new ArgumentOutOfRangeException();
159  if ((offset+count) > buffer.Length) throw new ArgumentException();
160  if (_isDisposed) throw new ObjectDisposedException("GZipStream");
161 
162  GCHandle h = GCHandle.Alloc(buffer, GCHandleType.Pinned);
163  int result;
164  try
165  {
166  result = gzread(_gzFile, h.AddrOfPinnedObject().ToInt32() + offset, count);
167  if (result < 0)
168  throw new IOException();
169  }
170  finally
171  {
172  h.Free();
173  }
174  return result;
175  }
176 
181  public override int ReadByte()
182  {
183  if (!CanRead) throw new NotSupportedException();
184  if (_isDisposed) throw new ObjectDisposedException("GZipStream");
185  return gzgetc(_gzFile);
186  }
187 
199  public override void Write(byte[] buffer, int offset, int count)
200  {
201  if (!CanWrite) throw new NotSupportedException();
202  if (buffer == null) throw new ArgumentNullException();
203  if (offset < 0 || count < 0) throw new ArgumentOutOfRangeException();
204  if ((offset+count) > buffer.Length) throw new ArgumentException();
205  if (_isDisposed) throw new ObjectDisposedException("GZipStream");
206 
207  GCHandle h = GCHandle.Alloc(buffer, GCHandleType.Pinned);
208  try
209  {
210  int result = gzwrite(_gzFile, h.AddrOfPinnedObject().ToInt32() + offset, count);
211  if (result < 0)
212  throw new IOException();
213  }
214  finally
215  {
216  h.Free();
217  }
218  }
219 
226  public override void WriteByte(byte value)
227  {
228  if (!CanWrite) throw new NotSupportedException();
229  if (_isDisposed) throw new ObjectDisposedException("GZipStream");
230 
231  int result = gzputc(_gzFile, (int)value);
232  if (result < 0)
233  throw new IOException();
234  }
235  #endregion
236 
237  #region Position & length stuff
243  public override void SetLength(long value)
244  {
245  throw new NotSupportedException();
246  }
247 
255  public override long Seek(long offset, SeekOrigin origin)
256  {
257  throw new NotSupportedException();
258  }
259 
265  public override void Flush()
266  {
267  // left empty on purpose
268  }
269 
275  public override long Position
276  {
277  get
278  {
279  throw new NotSupportedException();
280  }
281  set
282  {
283  throw new NotSupportedException();
284  }
285  }
286 
292  public override long Length
293  {
294  get
295  {
296  throw new NotSupportedException();
297  }
298  }
299  #endregion
300  }
301 }
Implements a compressed Stream, in GZip (.gz) format.
Definition: GZipStream.cs:18
override void SetLength(long value)
Not supported.
Definition: GZipStream.cs:243
~GZipStream()
Destroys this instance
Definition: GZipStream.cs:117
static int gzread(IntPtr gzFile, int data, int length)
GZipStream(string fileName, CompressLevel level)
Creates a new file as a writeable GZipStream
Definition: GZipStream.cs:53
override void Flush()
Flushes the GZipStream.
Definition: GZipStream.cs:265
void Dispose()
Closes the external file handle
Definition: GZipStream.cs:125
static IntPtr gzopen(string name, string mode)
override bool CanRead
Returns true of this stream can be read from, false otherwise
Definition: GZipStream.cs:81
override bool CanSeek
Returns false.
Definition: GZipStream.cs:93
static int gzputc(IntPtr gzFile, int c)
override long Position
Gets/sets the current position in the GZipStream. Not suppported.
Definition: GZipStream.cs:276
static int gzwrite(IntPtr gzFile, int data, int length)
void cleanUp(bool isDisposing)
Definition: GZipStream.cs:131
override void WriteByte(byte value)
Writes a single byte to the stream
Definition: GZipStream.cs:226
override int Read(byte[] buffer, int offset, int count)
Attempts to read a number of bytes from the stream.
Definition: GZipStream.cs:154
override void Write(byte[] buffer, int offset, int count)
Writes a number of bytes to the stream
Definition: GZipStream.cs:199
override bool CanWrite
Returns true if this tsream is writeable, false otherwise
Definition: GZipStream.cs:104
override long Seek(long offset, SeekOrigin origin)
Not suppported.
Definition: GZipStream.cs:255
static int gzclose(IntPtr gzFile)
GZipStream(string fileName)
Opens an existing file as a readable GZipStream
Definition: GZipStream.cs:66
static int gzgetc(IntPtr gzFile)
override int ReadByte()
Attempts to read a single byte from the stream.
Definition: GZipStream.cs:181
The exception that is thrown when an error occurs on the zlib dll
Definition: DotZLib.cs:87
static int value
Definition: cmd_api.c:93
static static sync static getppid static getegid const char static filename char static len const char char static bufsiz static mask static vfork const void static prot static getpgrp const char static swapflags static arg static fd static protocol static who struct sockaddr static addrlen static backlog struct timeval struct timezone static tz const struct iovec static count static mode const void const struct sockaddr static tolen const char static pathname void count
Definition: sflib.h:98
static static sync static getppid static getegid const char static filename char static len const char char static bufsiz static mask static vfork const void static prot static getpgrp const char static swapflags static arg static fd static protocol static who struct sockaddr static addrlen static backlog struct timeval struct timezone static tz const struct iovec static count static mode const void const struct sockaddr static tolen const char static pathname void static offset struct stat static buf void long static basep static whence static length const void static len static semflg const void static shmflg const struct timespec struct timespec static rem const char static group const void length
Definition: sflib.h:133
voidpf uLong int origin
Definition: ioapi.h:144
voidpf uLong offset
Definition: ioapi.h:144
const char int mode
Definition: ioapi.h:137
CompressLevel
Defines constants for the available compression levels in zlib
Definition: DotZLib.cs:62
#define c(i)
Definition: sha256.c:43
#define h(i)
Definition: sha256.c:48
Definition: length.h:9
Definition: query.c:23
Definition: buffer.h:15
Definition: z80asm.h:102
static int level
Definition: vmenus.c:2424