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 Projectusing System.Text;
129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectnamespace DotZLib
159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    #region Internal types
189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    /// <summary>
209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    /// Defines constants for the various flush types used with zlib
219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    /// </summary>
22381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    internal enum FlushTypes
239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    {
249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        None,  Partial,  Sync,  Full,  Finish,  Block
259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    #region ZStream structure
289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    // internal mapping of the zlib zstream structure for marshalling
299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    [StructLayoutAttribute(LayoutKind.Sequential, Pack=4, Size=0, CharSet=CharSet.Ansi)]
309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    internal struct ZStream
319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    {
329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        public IntPtr next_in;
339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        public uint avail_in;
349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        public uint total_in;
359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        public IntPtr next_out;
379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        public uint avail_out;
389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        public uint total_out;
399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        [MarshalAs(UnmanagedType.LPStr)]
41381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        string msg;
429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        uint state;
439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        uint zalloc;
459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        uint zfree;
469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        uint opaque;
479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        int data_type;
499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        public uint adler;
509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        uint reserved;
519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    #endregion
54381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    #endregion
569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    #region Public enums
589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    /// <summary>
599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    /// Defines constants for the available compression levels in zlib
609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    /// </summary>
619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    public enum CompressLevel : int
629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    {
639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// <summary>
649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// The default compression level with a reasonable compromise between compression and speed
659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// </summary>
66381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        Default = -1,
679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// <summary>
689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// No compression at all. The data are passed straight through.
699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// </summary>
709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        None = 0,
719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// <summary>
729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// The maximum compression rate available.
739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// </summary>
74381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        Best = 9,
759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// <summary>
769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// The fastest available compression level.
779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// </summary>
789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        Fastest = 1
799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    #endregion
819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    #region Exception classes
839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    /// <summary>
849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    /// The exception that is thrown when an error occurs on the zlib dll
859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    /// </summary>
869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    public class ZLibException : ApplicationException
879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    {
889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// <summary>
89381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        /// Initializes a new instance of the <see cref="ZLibException"/> class with a specified
909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// error message and error code
919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// </summary>
929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// <param name="errorCode">The zlib error code that caused the exception</param>
939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// <param name="msg">A message that (hopefully) describes the error</param>
949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        public ZLibException(int errorCode, string msg) : base(String.Format("ZLib error {0} {1}", errorCode, msg))
959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        {
969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        }
979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// <summary>
99381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        /// Initializes a new instance of the <see cref="ZLibException"/> class with a specified
1009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// error code
1019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// </summary>
1029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// <param name="errorCode">The zlib error code that caused the exception</param>
1039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        public ZLibException(int errorCode) : base(String.Format("ZLib error {0}", errorCode))
1049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        {
1059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        }
1069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
1079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    #endregion
1089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    #region Interfaces
1109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    /// <summary>
112381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    /// Declares methods and properties that enables a running checksum to be calculated
1139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    /// </summary>
1149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    public interface ChecksumGenerator
1159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    {
1169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// <summary>
1179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// Gets the current value of the checksum
1189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// </summary>
1199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        uint Value { get; }
1209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// <summary>
1229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// Clears the current checksum to 0
1239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// </summary>
1249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        void Reset();
1259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// <summary>
1279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// Updates the current checksum with an array of bytes
1289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// </summary>
1299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// <param name="data">The data to update the checksum with</param>
1309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        void Update(byte[] data);
1319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// <summary>
1339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// Updates the current checksum with part of an array of bytes
1349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// </summary>
1359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// <param name="data">The data to update the checksum with</param>
1369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// <param name="offset">Where in <c>data</c> to start updating</param>
1379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// <param name="count">The number of bytes from <c>data</c> to use</param>
1389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// <exception cref="ArgumentException">The sum of offset and count is larger than the length of <c>data</c></exception>
1399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// <exception cref="ArgumentNullException"><c>data</c> is a null reference</exception>
1409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// <exception cref="ArgumentOutOfRangeException">Offset or count is negative.</exception>
1419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        void Update(byte[] data, int offset, int count);
1429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// <summary>
1449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// Updates the current checksum with the data from a string
1459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// </summary>
1469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// <param name="data">The string to update the checksum with</param>
1479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// <remarks>The characters in the string are converted by the UTF-8 encoding</remarks>
1489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        void Update(string data);
1499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// <summary>
1519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// Updates the current checksum with the data from a string, using a specific encoding
1529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// </summary>
1539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// <param name="data">The string to update the checksum with</param>
1549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// <param name="encoding">The encoding to use</param>
1559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        void Update(string data, Encoding encoding);
1569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
1579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    /// <summary>
1609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    /// Represents the method that will be called from a codec when new data
1619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    /// are available.
1629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    /// </summary>
1639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    /// <paramref name="data">The byte array containing the processed data</paramref>
1649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    /// <paramref name="startIndex">The index of the first processed byte in <c>data</c></paramref>
1659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    /// <paramref name="count">The number of processed bytes available</paramref>
166381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    /// <remarks>On return from this method, the data may be overwritten, so grab it while you can.
1679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    /// You cannot assume that startIndex will be zero.
1689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    /// </remarks>
1699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    public delegate void DataAvailableHandler(byte[] data, int startIndex, int count);
1709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    /// <summary>
1729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    /// Declares methods and events for implementing compressors/decompressors
1739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    /// </summary>
1749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    public interface Codec
1759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    {
1769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// <summary>
1779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// Occurs when more processed data are available.
1789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// </summary>
1799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        event DataAvailableHandler DataAvailable;
1809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// <summary>
1829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// Adds more data to the codec to be processed.
1839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// </summary>
1849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// <param name="data">Byte array containing the data to be added to the codec</param>
1859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// <remarks>Adding data may, or may not, raise the <c>DataAvailable</c> event</remarks>
1869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        void Add(byte[] data);
1879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// <summary>
1899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// Adds more data to the codec to be processed.
1909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// </summary>
1919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// <param name="data">Byte array containing the data to be added to the codec</param>
1929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// <param name="offset">The index of the first byte to add from <c>data</c></param>
1939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// <param name="count">The number of bytes to add</param>
1949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// <remarks>Adding data may, or may not, raise the <c>DataAvailable</c> event</remarks>
1959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        void Add(byte[] data, int offset, int count);
1969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// <summary>
1989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// Finishes up any pending data that needs to be processed and handled.
1999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// </summary>
2009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        void Finish();
2019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// <summary>
2039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// Gets the checksum of the data that has been added so far
2049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// </summary>
2059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        uint Checksum { get; }
2069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
2099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    #endregion
2119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    #region Classes
2139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    /// <summary>
2149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    /// Encapsulates general information about the ZLib library
2159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    /// </summary>
2169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    public class Info
2179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    {
2189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        #region DLL imports
2199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)]
2209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        private static extern uint zlibCompileFlags();
2219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)]
2239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        private static extern string zlibVersion();
2249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        #endregion
2259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        #region Private stuff
2279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        private uint _flags;
2289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        // helper function that unpacks a bitsize mask
2309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        private static int bitSize(uint bits)
2319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        {
2329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            switch (bits)
2339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            {
2349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                case 0: return 16;
2359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                case 1: return 32;
2369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                case 2: return 64;
2379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            }
2389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            return -1;
2399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        }
2409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        #endregion
2419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// <summary>
2439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// Constructs an instance of the <c>Info</c> class.
2449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// </summary>
2459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        public Info()
2469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        {
2479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            _flags = zlibCompileFlags();
2489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        }
2499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// <summary>
2519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// True if the library is compiled with debug info
2529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// </summary>
2539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        public bool HasDebugInfo { get { return 0 != (_flags & 0x100); } }
2549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// <summary>
2569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// True if the library is compiled with assembly optimizations
2579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// </summary>
2589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        public bool UsesAssemblyCode { get { return 0 != (_flags & 0x200); } }
2599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// <summary>
2619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// Gets the size of the unsigned int that was compiled into Zlib
2629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// </summary>
2639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        public int SizeOfUInt { get { return bitSize(_flags & 3); } }
2649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// <summary>
2669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// Gets the size of the unsigned long that was compiled into Zlib
2679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// </summary>
2689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        public int SizeOfULong { get { return bitSize((_flags >> 2) & 3); } }
2699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// <summary>
2719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// Gets the size of the pointers that were compiled into Zlib
2729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// </summary>
2739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        public int SizeOfPointer { get { return bitSize((_flags >> 4) & 3); } }
2749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// <summary>
2769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// Gets the size of the z_off_t type that was compiled into Zlib
2779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// </summary>
2789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        public int SizeOfOffset { get { return bitSize((_flags >> 6) & 3); } }
2799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// <summary>
2819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// Gets the version of ZLib as a string, e.g. "1.2.1"
2829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /// </summary>
2839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        public static string Version { get { return zlibVersion(); } }
2849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
2859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    #endregion
2879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
289