19e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{*******************************************************}
29e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{                                                       }
39e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{       Borland Delphi Supplemental Components          }
49e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{       ZLIB Data Compression Interface Unit            }
59e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{                                                       }
69e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{       Copyright (c) 1997,99 Borland Corporation       }
79e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{                                                       }
89e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{*******************************************************}
99e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ Updated for zlib 1.2.x by Cosmin Truta <cosmint@cs.ubbcluj.ro> }
119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectunit ZLib;
139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectinterface
159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectuses SysUtils, Classes;
179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projecttype
199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  TAlloc = function (AppData: Pointer; Items, Size: Integer): Pointer; cdecl;
209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  TFree = procedure (AppData, Block: Pointer); cdecl;
219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  // Internal structure.  Ignore.
239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  TZStreamRec = packed record
249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    next_in: PChar;       // next input byte
259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    avail_in: Integer;    // number of bytes available at next_in
269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    total_in: Longint;    // total nb of input bytes read so far
279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    next_out: PChar;      // next output byte should be put here
299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    avail_out: Integer;   // remaining free space at next_out
309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    total_out: Longint;   // total nb of bytes output so far
319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    msg: PChar;           // last error message, NULL if no error
339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    internal: Pointer;    // not visible by applications
349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    zalloc: TAlloc;       // used to allocate the internal state
369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    zfree: TFree;         // used to free the internal state
379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    AppData: Pointer;     // private data object passed to zalloc and zfree
389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    data_type: Integer;   // best guess about the data type: ascii or binary
409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    adler: Longint;       // adler32 value of the uncompressed data
419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    reserved: Longint;    // reserved for future use
429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  end;
439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  // Abstract ancestor class
459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  TCustomZlibStream = class(TStream)
469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  private
479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    FStrm: TStream;
489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    FStrmPos: Integer;
499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    FOnProgress: TNotifyEvent;
509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    FZRec: TZStreamRec;
519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    FBuffer: array [Word] of Char;
529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  protected
539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    procedure Progress(Sender: TObject); dynamic;
549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    property OnProgress: TNotifyEvent read FOnProgress write FOnProgress;
559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    constructor Create(Strm: TStream);
569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  end;
579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ TCompressionStream compresses data on the fly as data is written to it, and
599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  stores the compressed data to another stream.
609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  TCompressionStream is write-only and strictly sequential. Reading from the
629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  stream will raise an exception. Using Seek to move the stream pointer
639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  will raise an exception.
649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  Output data is cached internally, written to the output stream only when
669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  the internal output buffer is full.  All pending output data is flushed
679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  when the stream is destroyed.
689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  The Position property returns the number of uncompressed bytes of
709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  data that have been written to the stream so far.
719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  CompressionRate returns the on-the-fly percentage by which the original
739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  data has been compressed:  (1 - (CompressedBytes / UncompressedBytes)) * 100
749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  If raw data size = 100 and compressed data size = 25, the CompressionRate
759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  is 75%
769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  The OnProgress event is called each time the output buffer is filled and
789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  written to the output stream.  This is useful for updating a progress
799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  indicator when you are writing a large chunk of data to the compression
809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  stream in a single call.}
819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  TCompressionLevel = (clNone, clFastest, clDefault, clMax);
849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  TCompressionStream = class(TCustomZlibStream)
869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  private
879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    function GetCompressionRate: Single;
889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  public
899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    constructor Create(CompressionLevel: TCompressionLevel; Dest: TStream);
909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    destructor Destroy; override;
919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    function Read(var Buffer; Count: Longint): Longint; override;
929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    function Write(const Buffer; Count: Longint): Longint; override;
939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    function Seek(Offset: Longint; Origin: Word): Longint; override;
949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    property CompressionRate: Single read GetCompressionRate;
959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    property OnProgress;
969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  end;
979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ TDecompressionStream decompresses data on the fly as data is read from it.
999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  Compressed data comes from a separate source stream.  TDecompressionStream
1019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  is read-only and unidirectional; you can seek forward in the stream, but not
1029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  backwards.  The special case of setting the stream position to zero is
1039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  allowed.  Seeking forward decompresses data until the requested position in
1049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  the uncompressed data has been reached.  Seeking backwards, seeking relative
1059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  to the end of the stream, requesting the size of the stream, and writing to
1069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  the stream will raise an exception.
1079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  The Position property returns the number of bytes of uncompressed data that
1099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  have been read from the stream so far.
1109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  The OnProgress event is called each time the internal input buffer of
1129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  compressed data is exhausted and the next block is read from the input stream.
1139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  This is useful for updating a progress indicator when you are reading a
1149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  large chunk of data from the decompression stream in a single call.}
1159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  TDecompressionStream = class(TCustomZlibStream)
1179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  public
1189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    constructor Create(Source: TStream);
1199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    destructor Destroy; override;
1209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    function Read(var Buffer; Count: Longint): Longint; override;
1219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    function Write(const Buffer; Count: Longint): Longint; override;
1229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    function Seek(Offset: Longint; Origin: Word): Longint; override;
1239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    property OnProgress;
1249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  end;
1259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ CompressBuf compresses data, buffer to buffer, in one call.
1299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   In: InBuf = ptr to compressed data
1309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project       InBytes = number of bytes in InBuf
1319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  Out: OutBuf = ptr to newly allocated buffer containing decompressed data
1329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project       OutBytes = number of bytes in OutBuf   }
1339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectprocedure CompressBuf(const InBuf: Pointer; InBytes: Integer;
1349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                      out OutBuf: Pointer; out OutBytes: Integer);
1359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ DecompressBuf decompresses data, buffer to buffer, in one call.
1389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   In: InBuf = ptr to compressed data
1399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project       InBytes = number of bytes in InBuf
1409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project       OutEstimate = zero, or est. size of the decompressed data
1419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  Out: OutBuf = ptr to newly allocated buffer containing decompressed data
1429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project       OutBytes = number of bytes in OutBuf   }
1439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectprocedure DecompressBuf(const InBuf: Pointer; InBytes: Integer;
1449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project OutEstimate: Integer; out OutBuf: Pointer; out OutBytes: Integer);
1459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ DecompressToUserBuf decompresses data, buffer to buffer, in one call.
1479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   In: InBuf = ptr to compressed data
1489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project       InBytes = number of bytes in InBuf
1499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  Out: OutBuf = ptr to user-allocated buffer to contain decompressed data
1509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project       BufSize = number of bytes in OutBuf   }
1519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectprocedure DecompressToUserBuf(const InBuf: Pointer; InBytes: Integer;
1529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  const OutBuf: Pointer; BufSize: Integer);
1539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectconst
15504351a92ecc8429c999acbfc5dfe5aa8bee1d19dElliott Hughes  zlib_version = '1.2.8';
1569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projecttype
1589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  EZlibError = class(Exception);
1599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  ECompressionError = class(EZlibError);
1609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  EDecompressionError = class(EZlibError);
1619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectimplementation
1639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectuses ZLibConst;
1659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectconst
1679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  Z_NO_FLUSH      = 0;
1689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  Z_PARTIAL_FLUSH = 1;
1699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  Z_SYNC_FLUSH    = 2;
1709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  Z_FULL_FLUSH    = 3;
1719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  Z_FINISH        = 4;
1729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  Z_OK            = 0;
1749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  Z_STREAM_END    = 1;
1759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  Z_NEED_DICT     = 2;
1769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  Z_ERRNO         = (-1);
1779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  Z_STREAM_ERROR  = (-2);
1789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  Z_DATA_ERROR    = (-3);
1799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  Z_MEM_ERROR     = (-4);
1809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  Z_BUF_ERROR     = (-5);
1819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  Z_VERSION_ERROR = (-6);
1829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  Z_NO_COMPRESSION       =   0;
1849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  Z_BEST_SPEED           =   1;
1859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  Z_BEST_COMPRESSION     =   9;
1869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  Z_DEFAULT_COMPRESSION  = (-1);
1879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  Z_FILTERED            = 1;
1899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  Z_HUFFMAN_ONLY        = 2;
1909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  Z_RLE                 = 3;
1919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  Z_DEFAULT_STRATEGY    = 0;
1929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  Z_BINARY   = 0;
1949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  Z_ASCII    = 1;
1959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  Z_UNKNOWN  = 2;
1969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  Z_DEFLATED = 8;
1989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{$L adler32.obj}
2019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{$L compress.obj}
2029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{$L crc32.obj}
2039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{$L deflate.obj}
2049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{$L infback.obj}
2059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{$L inffast.obj}
2069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{$L inflate.obj}
2079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{$L inftrees.obj}
2089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{$L trees.obj}
2099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{$L uncompr.obj}
2109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{$L zutil.obj}
2119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectprocedure adler32; external;
2139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectprocedure compressBound; external;
2149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectprocedure crc32; external;
2159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectprocedure deflateInit2_; external;
2169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectprocedure deflateParams; external;
2179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectfunction _malloc(Size: Integer): Pointer; cdecl;
2199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectbegin
2209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  Result := AllocMem(Size);
2219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectend;
2229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectprocedure _free(Block: Pointer); cdecl;
2249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectbegin
2259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  FreeMem(Block);
2269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectend;
2279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectprocedure _memset(P: Pointer; B: Byte; count: Integer); cdecl;
2299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectbegin
2309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  FillChar(P^, count, B);
2319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectend;
2329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectprocedure _memcpy(dest, source: Pointer; count: Integer); cdecl;
2349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectbegin
2359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  Move(source^, dest^, count);
2369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectend;
2379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project// deflate compresses data
2419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectfunction deflateInit_(var strm: TZStreamRec; level: Integer; version: PChar;
2429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  recsize: Integer): Integer; external;
2439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectfunction deflate(var strm: TZStreamRec; flush: Integer): Integer; external;
2449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectfunction deflateEnd(var strm: TZStreamRec): Integer; external;
2459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project// inflate decompresses data
2479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectfunction inflateInit_(var strm: TZStreamRec; version: PChar;
2489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  recsize: Integer): Integer; external;
2499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectfunction inflate(var strm: TZStreamRec; flush: Integer): Integer; external;
2509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectfunction inflateEnd(var strm: TZStreamRec): Integer; external;
2519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectfunction inflateReset(var strm: TZStreamRec): Integer; external;
2529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectfunction zlibAllocMem(AppData: Pointer; Items, Size: Integer): Pointer; cdecl;
2559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectbegin
2569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project//  GetMem(Result, Items*Size);
2579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  Result := AllocMem(Items * Size);
2589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectend;
2599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectprocedure zlibFreeMem(AppData, Block: Pointer); cdecl;
2619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectbegin
2629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  FreeMem(Block);
2639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectend;
2649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{function zlibCheck(code: Integer): Integer;
2669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectbegin
2679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  Result := code;
2689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  if code < 0 then
2699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    raise EZlibError.Create('error');    //!!
2709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectend;}
2719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectfunction CCheck(code: Integer): Integer;
2739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectbegin
2749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  Result := code;
2759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  if code < 0 then
2769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    raise ECompressionError.Create('error'); //!!
2779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectend;
2789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectfunction DCheck(code: Integer): Integer;
2809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectbegin
2819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  Result := code;
2829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  if code < 0 then
2839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    raise EDecompressionError.Create('error');  //!!
2849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectend;
2859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectprocedure CompressBuf(const InBuf: Pointer; InBytes: Integer;
2879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                      out OutBuf: Pointer; out OutBytes: Integer);
2889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectvar
2899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  strm: TZStreamRec;
2909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  P: Pointer;
2919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectbegin
2929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  FillChar(strm, sizeof(strm), 0);
2939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  strm.zalloc := zlibAllocMem;
2949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  strm.zfree := zlibFreeMem;
2959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  OutBytes := ((InBytes + (InBytes div 10) + 12) + 255) and not 255;
2969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  GetMem(OutBuf, OutBytes);
2979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  try
2989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    strm.next_in := InBuf;
2999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    strm.avail_in := InBytes;
3009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    strm.next_out := OutBuf;
3019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    strm.avail_out := OutBytes;
3029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    CCheck(deflateInit_(strm, Z_BEST_COMPRESSION, zlib_version, sizeof(strm)));
3039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    try
3049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project      while CCheck(deflate(strm, Z_FINISH)) <> Z_STREAM_END do
3059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project      begin
3069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        P := OutBuf;
3079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        Inc(OutBytes, 256);
3089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        ReallocMem(OutBuf, OutBytes);
3099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        strm.next_out := PChar(Integer(OutBuf) + (Integer(strm.next_out) - Integer(P)));
3109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        strm.avail_out := 256;
3119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project      end;
3129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    finally
3139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project      CCheck(deflateEnd(strm));
3149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    end;
3159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    ReallocMem(OutBuf, strm.total_out);
3169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    OutBytes := strm.total_out;
3179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  except
3189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    FreeMem(OutBuf);
3199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    raise
3209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  end;
3219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectend;
3229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectprocedure DecompressBuf(const InBuf: Pointer; InBytes: Integer;
3259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  OutEstimate: Integer; out OutBuf: Pointer; out OutBytes: Integer);
3269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectvar
3279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  strm: TZStreamRec;
3289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  P: Pointer;
3299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  BufInc: Integer;
3309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectbegin
3319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  FillChar(strm, sizeof(strm), 0);
3329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  strm.zalloc := zlibAllocMem;
3339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  strm.zfree := zlibFreeMem;
3349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  BufInc := (InBytes + 255) and not 255;
3359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  if OutEstimate = 0 then
3369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    OutBytes := BufInc
3379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  else
3389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    OutBytes := OutEstimate;
3399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  GetMem(OutBuf, OutBytes);
3409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  try
3419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    strm.next_in := InBuf;
3429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    strm.avail_in := InBytes;
3439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    strm.next_out := OutBuf;
3449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    strm.avail_out := OutBytes;
3459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    DCheck(inflateInit_(strm, zlib_version, sizeof(strm)));
3469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    try
3479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project      while DCheck(inflate(strm, Z_NO_FLUSH)) <> Z_STREAM_END do
3489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project      begin
3499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        P := OutBuf;
3509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        Inc(OutBytes, BufInc);
3519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        ReallocMem(OutBuf, OutBytes);
3529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        strm.next_out := PChar(Integer(OutBuf) + (Integer(strm.next_out) - Integer(P)));
3539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        strm.avail_out := BufInc;
3549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project      end;
3559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    finally
3569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project      DCheck(inflateEnd(strm));
3579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    end;
3589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    ReallocMem(OutBuf, strm.total_out);
3599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    OutBytes := strm.total_out;
3609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  except
3619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    FreeMem(OutBuf);
3629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    raise
3639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  end;
3649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectend;
3659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectprocedure DecompressToUserBuf(const InBuf: Pointer; InBytes: Integer;
3679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  const OutBuf: Pointer; BufSize: Integer);
3689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectvar
3699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  strm: TZStreamRec;
3709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectbegin
3719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  FillChar(strm, sizeof(strm), 0);
3729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  strm.zalloc := zlibAllocMem;
3739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  strm.zfree := zlibFreeMem;
3749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  strm.next_in := InBuf;
3759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  strm.avail_in := InBytes;
3769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  strm.next_out := OutBuf;
3779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  strm.avail_out := BufSize;
3789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  DCheck(inflateInit_(strm, zlib_version, sizeof(strm)));
3799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  try
3809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if DCheck(inflate(strm, Z_FINISH)) <> Z_STREAM_END then
3819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project      raise EZlibError.CreateRes(@sTargetBufferTooSmall);
3829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  finally
3839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    DCheck(inflateEnd(strm));
3849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  end;
3859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectend;
3869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project// TCustomZlibStream
3889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectconstructor TCustomZLibStream.Create(Strm: TStream);
3909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectbegin
3919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  inherited Create;
3929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  FStrm := Strm;
3939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  FStrmPos := Strm.Position;
3949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  FZRec.zalloc := zlibAllocMem;
3959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  FZRec.zfree := zlibFreeMem;
3969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectend;
3979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectprocedure TCustomZLibStream.Progress(Sender: TObject);
3999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectbegin
4009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  if Assigned(FOnProgress) then FOnProgress(Sender);
4019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectend;
4029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project// TCompressionStream
4059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectconstructor TCompressionStream.Create(CompressionLevel: TCompressionLevel;
4079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  Dest: TStream);
4089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectconst
4099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  Levels: array [TCompressionLevel] of ShortInt =
4109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    (Z_NO_COMPRESSION, Z_BEST_SPEED, Z_DEFAULT_COMPRESSION, Z_BEST_COMPRESSION);
4119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectbegin
4129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  inherited Create(Dest);
4139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  FZRec.next_out := FBuffer;
4149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  FZRec.avail_out := sizeof(FBuffer);
4159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  CCheck(deflateInit_(FZRec, Levels[CompressionLevel], zlib_version, sizeof(FZRec)));
4169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectend;
4179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectdestructor TCompressionStream.Destroy;
4199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectbegin
4209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  FZRec.next_in := nil;
4219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  FZRec.avail_in := 0;
4229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  try
4239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if FStrm.Position <> FStrmPos then FStrm.Position := FStrmPos;
4249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    while (CCheck(deflate(FZRec, Z_FINISH)) <> Z_STREAM_END)
4259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project      and (FZRec.avail_out = 0) do
4269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    begin
4279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project      FStrm.WriteBuffer(FBuffer, sizeof(FBuffer));
4289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project      FZRec.next_out := FBuffer;
4299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project      FZRec.avail_out := sizeof(FBuffer);
4309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    end;
4319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if FZRec.avail_out < sizeof(FBuffer) then
4329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project      FStrm.WriteBuffer(FBuffer, sizeof(FBuffer) - FZRec.avail_out);
4339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  finally
4349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    deflateEnd(FZRec);
4359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  end;
4369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  inherited Destroy;
4379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectend;
4389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectfunction TCompressionStream.Read(var Buffer; Count: Longint): Longint;
4409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectbegin
4419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  raise ECompressionError.CreateRes(@sInvalidStreamOp);
4429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectend;
4439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectfunction TCompressionStream.Write(const Buffer; Count: Longint): Longint;
4459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectbegin
4469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  FZRec.next_in := @Buffer;
4479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  FZRec.avail_in := Count;
4489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  if FStrm.Position <> FStrmPos then FStrm.Position := FStrmPos;
4499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  while (FZRec.avail_in > 0) do
4509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  begin
4519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    CCheck(deflate(FZRec, 0));
4529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if FZRec.avail_out = 0 then
4539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    begin
4549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project      FStrm.WriteBuffer(FBuffer, sizeof(FBuffer));
4559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project      FZRec.next_out := FBuffer;
4569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project      FZRec.avail_out := sizeof(FBuffer);
4579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project      FStrmPos := FStrm.Position;
4589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project      Progress(Self);
4599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    end;
4609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  end;
4619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  Result := Count;
4629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectend;
4639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectfunction TCompressionStream.Seek(Offset: Longint; Origin: Word): Longint;
4659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectbegin
4669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  if (Offset = 0) and (Origin = soFromCurrent) then
4679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    Result := FZRec.total_in
4689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  else
4699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    raise ECompressionError.CreateRes(@sInvalidStreamOp);
4709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectend;
4719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectfunction TCompressionStream.GetCompressionRate: Single;
4739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectbegin
4749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  if FZRec.total_in = 0 then
4759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    Result := 0
4769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  else
4779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    Result := (1.0 - (FZRec.total_out / FZRec.total_in)) * 100.0;
4789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectend;
4799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project// TDecompressionStream
4829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectconstructor TDecompressionStream.Create(Source: TStream);
4849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectbegin
4859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  inherited Create(Source);
4869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  FZRec.next_in := FBuffer;
4879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  FZRec.avail_in := 0;
4889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  DCheck(inflateInit_(FZRec, zlib_version, sizeof(FZRec)));
4899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectend;
4909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectdestructor TDecompressionStream.Destroy;
4929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectbegin
4939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  FStrm.Seek(-FZRec.avail_in, 1);
4949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  inflateEnd(FZRec);
4959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  inherited Destroy;
4969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectend;
4979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectfunction TDecompressionStream.Read(var Buffer; Count: Longint): Longint;
4999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectbegin
5009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  FZRec.next_out := @Buffer;
5019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  FZRec.avail_out := Count;
5029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  if FStrm.Position <> FStrmPos then FStrm.Position := FStrmPos;
5039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  while (FZRec.avail_out > 0) do
5049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  begin
5059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if FZRec.avail_in = 0 then
5069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    begin
5079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project      FZRec.avail_in := FStrm.Read(FBuffer, sizeof(FBuffer));
5089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project      if FZRec.avail_in = 0 then
5099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project      begin
5109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        Result := Count - FZRec.avail_out;
5119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        Exit;
5129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project      end;
5139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project      FZRec.next_in := FBuffer;
5149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project      FStrmPos := FStrm.Position;
5159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project      Progress(Self);
5169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    end;
5179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    CCheck(inflate(FZRec, 0));
5189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  end;
5199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  Result := Count;
5209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectend;
5219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectfunction TDecompressionStream.Write(const Buffer; Count: Longint): Longint;
5239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectbegin
5249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  raise EDecompressionError.CreateRes(@sInvalidStreamOp);
5259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectend;
5269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectfunction TDecompressionStream.Seek(Offset: Longint; Origin: Word): Longint;
5289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectvar
5299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  I: Integer;
5309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  Buf: array [0..4095] of Char;
5319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectbegin
5329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  if (Offset = 0) and (Origin = soFromBeginning) then
5339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  begin
5349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    DCheck(inflateReset(FZRec));
5359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    FZRec.next_in := FBuffer;
5369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    FZRec.avail_in := 0;
5379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    FStrm.Position := 0;
5389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    FStrmPos := 0;
5399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  end
5409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  else if ( (Offset >= 0) and (Origin = soFromCurrent)) or
5419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project          ( ((Offset - FZRec.total_out) > 0) and (Origin = soFromBeginning)) then
5429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  begin
5439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if Origin = soFromBeginning then Dec(Offset, FZRec.total_out);
5449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if Offset > 0 then
5459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    begin
5469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project      for I := 1 to Offset div sizeof(Buf) do
5479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        ReadBuffer(Buf, sizeof(Buf));
5489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project      ReadBuffer(Buf, Offset mod sizeof(Buf));
5499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    end;
5509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  end
5519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  else
5529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    raise EDecompressionError.CreateRes(@sInvalidStreamOp);
5539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  Result := FZRec.total_out;
5549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectend;
5559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectend.
558