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