19e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project// 29e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project// � Copyright Henrik Ravn 2004 39e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project// 4381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes// Use, modification and distribution are subject to the Boost Software License, Version 1.0. 59e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 69e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project// 79e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 89e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectusing System; 99e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectusing System.IO; 109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectusing System.Runtime.InteropServices; 119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectnamespace DotZLib 139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ 149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// <summary> 159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// Implements a compressed <see cref="Stream"/>, in GZip (.gz) format. 169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// </summary> 179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project public class GZipStream : Stream, IDisposable 189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project #region Dll Imports 209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl, CharSet=CharSet.Ansi)] 219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project private static extern IntPtr gzopen(string name, string mode); 229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] 249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project private static extern int gzclose(IntPtr gzFile); 259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] 279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project private static extern int gzwrite(IntPtr gzFile, int data, int length); 289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] 309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project private static extern int gzread(IntPtr gzFile, int data, int length); 319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] 339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project private static extern int gzgetc(IntPtr gzFile); 349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] 369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project private static extern int gzputc(IntPtr gzFile, int c); 379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project #endregion 399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project #region Private data 419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project private IntPtr _gzFile; 429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project private bool _isDisposed = false; 439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project private bool _isWriting; 449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project #endregion 459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project #region Constructors 479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// <summary> 489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// Creates a new file as a writeable GZipStream 499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// </summary> 509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// <param name="fileName">The name of the compressed file to create</param> 519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// <param name="level">The compression level to use when adding data</param> 529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// <exception cref="ZLibException">If an error occurred in the internal zlib function</exception> 539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project public GZipStream(string fileName, CompressLevel level) 549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project _isWriting = true; 569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project _gzFile = gzopen(fileName, String.Format("wb{0}", (int)level)); 579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (_gzFile == IntPtr.Zero) 589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project throw new ZLibException(-1, "Could not open " + fileName); 599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// <summary> 629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// Opens an existing file as a readable GZipStream 639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// </summary> 649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// <param name="fileName">The name of the file to open</param> 659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// <exception cref="ZLibException">If an error occurred in the internal zlib function</exception> 669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project public GZipStream(string fileName) 679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project _isWriting = false; 699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project _gzFile = gzopen(fileName, "rb"); 709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (_gzFile == IntPtr.Zero) 719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project throw new ZLibException(-1, "Could not open " + fileName); 729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project #endregion 759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project #region Access properties 779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// <summary> 789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// Returns true of this stream can be read from, false otherwise 799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// </summary> 809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project public override bool CanRead 819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project get 839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return !_isWriting; 859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 87381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes 889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// <summary> 909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// Returns false. 919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// </summary> 929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project public override bool CanSeek 939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project get 959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return false; 979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 99381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes 1009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// <summary> 1019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// Returns true if this tsream is writeable, false otherwise 1029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// </summary> 1039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project public override bool CanWrite 1049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 1059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project get 1069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 1079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return _isWriting; 1089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 1099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 1109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project #endregion 111381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes 1129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project #region Destructor & IDispose stuff 1139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 1149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// <summary> 1159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// Destroys this instance 1169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// </summary> 1179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ~GZipStream() 1189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 1199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project cleanUp(false); 1209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 1219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 1229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// <summary> 1239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// Closes the external file handle 1249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// </summary> 1259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project public void Dispose() 1269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 1279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project cleanUp(true); 1289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 1299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 1309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project // Does the actual closing of the file handle. 1319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project private void cleanUp(bool isDisposing) 1329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 1339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (!_isDisposed) 1349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 1359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project gzclose(_gzFile); 1369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project _isDisposed = true; 1379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 1389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 1399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project #endregion 140381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes 1419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project #region Basic reading and writing 1429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// <summary> 1439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// Attempts to read a number of bytes from the stream. 1449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// </summary> 1459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// <param name="buffer">The destination data buffer</param> 1469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// <param name="offset">The index of the first destination byte in <c>buffer</c></param> 1479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// <param name="count">The number of bytes requested</param> 1489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// <returns>The number of bytes read</returns> 1499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// <exception cref="ArgumentNullException">If <c>buffer</c> is null</exception> 1509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// <exception cref="ArgumentOutOfRangeException">If <c>count</c> or <c>offset</c> are negative</exception> 1519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// <exception cref="ArgumentException">If <c>offset</c> + <c>count</c> is > buffer.Length</exception> 1529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// <exception cref="NotSupportedException">If this stream is not readable.</exception> 1539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// <exception cref="ObjectDisposedException">If this stream has been disposed.</exception> 1549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project public override int Read(byte[] buffer, int offset, int count) 1559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 1569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (!CanRead) throw new NotSupportedException(); 1579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (buffer == null) throw new ArgumentNullException(); 1589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (offset < 0 || count < 0) throw new ArgumentOutOfRangeException(); 1599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if ((offset+count) > buffer.Length) throw new ArgumentException(); 1609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (_isDisposed) throw new ObjectDisposedException("GZipStream"); 1619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 1629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project GCHandle h = GCHandle.Alloc(buffer, GCHandleType.Pinned); 1639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int result; 1649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project try 1659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 1669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project result = gzread(_gzFile, h.AddrOfPinnedObject().ToInt32() + offset, count); 1679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (result < 0) 1689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project throw new IOException(); 1699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 1709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project finally 1719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 1729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project h.Free(); 1739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 1749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return result; 1759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 1769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 1779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// <summary> 1789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// Attempts to read a single byte from the stream. 1799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// </summary> 1809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// <returns>The byte that was read, or -1 in case of error or End-Of-File</returns> 1819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project public override int ReadByte() 1829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 1839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (!CanRead) throw new NotSupportedException(); 1849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (_isDisposed) throw new ObjectDisposedException("GZipStream"); 1859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return gzgetc(_gzFile); 1869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 1879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 1889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// <summary> 1899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// Writes a number of bytes to the stream 1909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// </summary> 1919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// <param name="buffer"></param> 1929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// <param name="offset"></param> 1939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// <param name="count"></param> 1949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// <exception cref="ArgumentNullException">If <c>buffer</c> is null</exception> 1959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// <exception cref="ArgumentOutOfRangeException">If <c>count</c> or <c>offset</c> are negative</exception> 1969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// <exception cref="ArgumentException">If <c>offset</c> + <c>count</c> is > buffer.Length</exception> 1979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// <exception cref="NotSupportedException">If this stream is not writeable.</exception> 1989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// <exception cref="ObjectDisposedException">If this stream has been disposed.</exception> 1999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project public override void Write(byte[] buffer, int offset, int count) 2009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 2019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (!CanWrite) throw new NotSupportedException(); 2029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (buffer == null) throw new ArgumentNullException(); 2039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (offset < 0 || count < 0) throw new ArgumentOutOfRangeException(); 2049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if ((offset+count) > buffer.Length) throw new ArgumentException(); 2059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (_isDisposed) throw new ObjectDisposedException("GZipStream"); 2069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 2079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project GCHandle h = GCHandle.Alloc(buffer, GCHandleType.Pinned); 2089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project try 2099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 2109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int result = gzwrite(_gzFile, h.AddrOfPinnedObject().ToInt32() + offset, count); 2119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (result < 0) 2129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project throw new IOException(); 2139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 2149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project finally 2159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 2169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project h.Free(); 2179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 2189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 2199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 2209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// <summary> 2219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// Writes a single byte to the stream 2229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// </summary> 2239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// <param name="value">The byte to add to the stream.</param> 2249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// <exception cref="NotSupportedException">If this stream is not writeable.</exception> 2259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// <exception cref="ObjectDisposedException">If this stream has been disposed.</exception> 2269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project public override void WriteByte(byte value) 2279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 2289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (!CanWrite) throw new NotSupportedException(); 2299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (_isDisposed) throw new ObjectDisposedException("GZipStream"); 2309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 2319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int result = gzputc(_gzFile, (int)value); 2329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (result < 0) 2339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project throw new IOException(); 2349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 2359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project #endregion 2369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 2379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project #region Position & length stuff 2389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// <summary> 2399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// Not supported. 2409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// </summary> 2419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// <param name="value"></param> 2429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// <exception cref="NotSupportedException">Always thrown</exception> 2439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project public override void SetLength(long value) 2449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 2459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project throw new NotSupportedException(); 2469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 247381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes 2489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// <summary> 2499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// Not suppported. 2509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// </summary> 2519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// <param name="offset"></param> 2529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// <param name="origin"></param> 2539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// <returns></returns> 2549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// <exception cref="NotSupportedException">Always thrown</exception> 2559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project public override long Seek(long offset, SeekOrigin origin) 2569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 2579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project throw new NotSupportedException(); 2589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 259381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes 2609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// <summary> 2619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// Flushes the <c>GZipStream</c>. 2629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// </summary> 2639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// <remarks>In this implementation, this method does nothing. This is because excessive 2649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// flushing may degrade the achievable compression rates.</remarks> 2659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project public override void Flush() 2669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 2679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project // left empty on purpose 2689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 269381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes 2709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// <summary> 2719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// Gets/sets the current position in the <c>GZipStream</c>. Not suppported. 2729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// </summary> 2739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// <remarks>In this implementation this property is not supported</remarks> 2749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// <exception cref="NotSupportedException">Always thrown</exception> 2759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project public override long Position 2769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 2779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project get 2789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 2799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project throw new NotSupportedException(); 2809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 2819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project set 2829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 2839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project throw new NotSupportedException(); 2849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 2859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 286381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes 2879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// <summary> 2889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// Gets the size of the stream. Not suppported. 2899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// </summary> 2909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// <remarks>In this implementation this property is not supported</remarks> 2919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /// <exception cref="NotSupportedException">Always thrown</exception> 2929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project public override long Length 2939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 2949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project get 2959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project { 2969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project throw new NotSupportedException(); 2979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 2989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 2999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project #endregion 3009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 3019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project} 302