Visualization Library 2.0.0-b5

A lightweight C++ OpenGL middleware for 2D/3D graphics

VL     Star     Watch     Fork     Issue

[Download] [Tutorials] [All Classes] [Grouped Classes]
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
47  public GZipStream(string fileName, CompressLevel level)
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
77  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 
117  ~GZipStream()
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
142  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
238  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 }
GLenum GLuint GLenum GLsizei length
override long Position
Gets/sets the current position in the GZipStream.
Definition: GZipStream.cs:276
GZipStream(string fileName, CompressLevel level)
Creates a new file as a writeable GZipStream
Definition: GZipStream.cs:53
GLfloat GLfloat GLfloat GLfloat h
unsigned char byte
Definition: tif_acorn.c:69
voidpf uLong int origin
Definition: ioapi.h:142
override void SetLength(long value)
Not supported.
Definition: GZipStream.cs:243
override long Seek(long offset, SeekOrigin origin)
Not suppported.
Definition: GZipStream.cs:255
GZipStream(string fileName)
Opens an existing file as a readable GZipStream
Definition: GZipStream.cs:66
override int ReadByte()
Attempts to read a single byte from the stream.
Definition: GZipStream.cs:181
override void WriteByte(byte value)
Writes a single byte to the stream
Definition: GZipStream.cs:226
Implements a compressed Stream, in GZip (.gz) format.
Definition: GZipStream.cs:17
override bool CanSeek
Returns false.
Definition: GZipStream.cs:93
GLenum mode
GLint level
GLsizei GLsizei GLenum GLenum const GLvoid * data
override void Write(byte[] buffer, int offset, int count)
Writes a number of bytes to the stream
Definition: GZipStream.cs:199
GLuint buffer
const GLubyte * c
override long Length
Gets the size of the stream.
Definition: GZipStream.cs:293
GLintptr offset
GLsizei const GLfloat * value
GLuint const GLchar * name
void Dispose()
Closes the external file handle
Definition: GZipStream.cs:125
override int Read(byte[] buffer, int offset, int count)
Attempts to read a number of bytes from the stream.
Definition: GZipStream.cs:154
override bool CanWrite
Returns true if this tsream is writeable, false otherwise
Definition: GZipStream.cs:104
GLuint64EXT * result
GLuint GLuint GLsizei count
CompressLevel
Defines constants for the available compression levels in zlib
Definition: DotZLib.cs:61
override bool CanRead
Returns true of this stream can be read from, false otherwise
Definition: GZipStream.cs:81
override void Flush()
Flushes the GZipStream.
Definition: GZipStream.cs:265
The exception that is thrown when an error occurs on the zlib dll
Definition: DotZLib.cs:86