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 &gt; 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 &gt; 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