1b33c96954667ba382fa595baf7b31290bfdd517vboxsync{*******************************************************}
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync{ }
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync{ Borland Delphi Supplemental Components }
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync{ ZLIB Data Compression Interface Unit }
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync{ }
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync{ Copyright (c) 1997,99 Borland Corporation }
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync{ }
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync{*******************************************************}
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync{ Updated for zlib 1.2.x by Cosmin Truta <cosmint@cs.ubbcluj.ro> }
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncunit ZLib;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncinterface
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncuses SysUtils, Classes;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsynctype
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync TAlloc = function (AppData: Pointer; Items, Size: Integer): Pointer; cdecl;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync TFree = procedure (AppData, Block: Pointer); cdecl;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync // Internal structure. Ignore.
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync TZStreamRec = packed record
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync next_in: PChar; // next input byte
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync avail_in: Integer; // number of bytes available at next_in
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync total_in: Longint; // total nb of input bytes read so far
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync next_out: PChar; // next output byte should be put here
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync avail_out: Integer; // remaining free space at next_out
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync total_out: Longint; // total nb of bytes output so far
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync msg: PChar; // last error message, NULL if no error
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync internal: Pointer; // not visible by applications
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync zalloc: TAlloc; // used to allocate the internal state
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync zfree: TFree; // used to free the internal state
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync AppData: Pointer; // private data object passed to zalloc and zfree
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync data_type: Integer; // best guess about the data type: ascii or binary
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync adler: Longint; // adler32 value of the uncompressed data
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync reserved: Longint; // reserved for future use
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync // Abstract ancestor class
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync TCustomZlibStream = class(TStream)
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync private
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync FStrm: TStream;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync FStrmPos: Integer;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync FOnProgress: TNotifyEvent;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync FZRec: TZStreamRec;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync FBuffer: array [Word] of Char;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync protected
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync procedure Progress(Sender: TObject); dynamic;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync property OnProgress: TNotifyEvent read FOnProgress write FOnProgress;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync constructor Create(Strm: TStream);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync{ TCompressionStream compresses data on the fly as data is written to it, and
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync stores the compressed data to another stream.
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync TCompressionStream is write-only and strictly sequential. Reading from the
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync stream will raise an exception. Using Seek to move the stream pointer
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync will raise an exception.
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Output data is cached internally, written to the output stream only when
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync the internal output buffer is full. All pending output data is flushed
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync when the stream is destroyed.
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync The Position property returns the number of uncompressed bytes of
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync data that have been written to the stream so far.
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync CompressionRate returns the on-the-fly percentage by which the original
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync data has been compressed: (1 - (CompressedBytes / UncompressedBytes)) * 100
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync If raw data size = 100 and compressed data size = 25, the CompressionRate
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync is 75%
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync The OnProgress event is called each time the output buffer is filled and
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync written to the output stream. This is useful for updating a progress
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync indicator when you are writing a large chunk of data to the compression
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync stream in a single call.}
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync TCompressionLevel = (clNone, clFastest, clDefault, clMax);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync TCompressionStream = class(TCustomZlibStream)
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync private
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync function GetCompressionRate: Single;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync public
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync constructor Create(CompressionLevel: TCompressionLevel; Dest: TStream);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync destructor Destroy; override;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync function Read(var Buffer; Count: Longint): Longint; override;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync function Write(const Buffer; Count: Longint): Longint; override;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync function Seek(Offset: Longint; Origin: Word): Longint; override;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync property CompressionRate: Single read GetCompressionRate;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync property OnProgress;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync{ TDecompressionStream decompresses data on the fly as data is read from it.
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Compressed data comes from a separate source stream. TDecompressionStream
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync is read-only and unidirectional; you can seek forward in the stream, but not
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync backwards. The special case of setting the stream position to zero is
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync allowed. Seeking forward decompresses data until the requested position in
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync the uncompressed data has been reached. Seeking backwards, seeking relative
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync to the end of the stream, requesting the size of the stream, and writing to
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync the stream will raise an exception.
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync The Position property returns the number of bytes of uncompressed data that
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync have been read from the stream so far.
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync The OnProgress event is called each time the internal input buffer of
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync compressed data is exhausted and the next block is read from the input stream.
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync This is useful for updating a progress indicator when you are reading a
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync large chunk of data from the decompression stream in a single call.}
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync TDecompressionStream = class(TCustomZlibStream)
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync public
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync constructor Create(Source: TStream);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync destructor Destroy; override;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync function Read(var Buffer; Count: Longint): Longint; override;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync function Write(const Buffer; Count: Longint): Longint; override;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync function Seek(Offset: Longint; Origin: Word): Longint; override;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync property OnProgress;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync{ CompressBuf compresses data, buffer to buffer, in one call.
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync In: InBuf = ptr to compressed data
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync InBytes = number of bytes in InBuf
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Out: OutBuf = ptr to newly allocated buffer containing decompressed data
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync OutBytes = number of bytes in OutBuf }
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncprocedure CompressBuf(const InBuf: Pointer; InBytes: Integer;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync out OutBuf: Pointer; out OutBytes: Integer);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync{ DecompressBuf decompresses data, buffer to buffer, in one call.
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync In: InBuf = ptr to compressed data
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync InBytes = number of bytes in InBuf
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync OutEstimate = zero, or est. size of the decompressed data
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Out: OutBuf = ptr to newly allocated buffer containing decompressed data
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync OutBytes = number of bytes in OutBuf }
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncprocedure DecompressBuf(const InBuf: Pointer; InBytes: Integer;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync OutEstimate: Integer; out OutBuf: Pointer; out OutBytes: Integer);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync{ DecompressToUserBuf decompresses data, buffer to buffer, in one call.
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync In: InBuf = ptr to compressed data
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync InBytes = number of bytes in InBuf
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Out: OutBuf = ptr to user-allocated buffer to contain decompressed data
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync BufSize = number of bytes in OutBuf }
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncprocedure DecompressToUserBuf(const InBuf: Pointer; InBytes: Integer;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync const OutBuf: Pointer; BufSize: Integer);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncconst
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync zlib_version = '1.2.6';
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsynctype
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync EZlibError = class(Exception);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync ECompressionError = class(EZlibError);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync EDecompressionError = class(EZlibError);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncimplementation
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncuses ZLibConst;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncconst
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Z_NO_FLUSH = 0;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Z_PARTIAL_FLUSH = 1;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Z_SYNC_FLUSH = 2;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Z_FULL_FLUSH = 3;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Z_FINISH = 4;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Z_OK = 0;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Z_STREAM_END = 1;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Z_NEED_DICT = 2;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Z_ERRNO = (-1);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Z_STREAM_ERROR = (-2);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Z_DATA_ERROR = (-3);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Z_MEM_ERROR = (-4);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Z_BUF_ERROR = (-5);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Z_VERSION_ERROR = (-6);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Z_NO_COMPRESSION = 0;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Z_BEST_SPEED = 1;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Z_BEST_COMPRESSION = 9;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Z_DEFAULT_COMPRESSION = (-1);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Z_FILTERED = 1;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Z_HUFFMAN_ONLY = 2;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Z_RLE = 3;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Z_DEFAULT_STRATEGY = 0;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Z_BINARY = 0;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Z_ASCII = 1;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Z_UNKNOWN = 2;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Z_DEFLATED = 8;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync{$L adler32.obj}
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync{$L compress.obj}
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync{$L crc32.obj}
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync{$L deflate.obj}
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync{$L infback.obj}
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync{$L inffast.obj}
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync{$L inflate.obj}
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync{$L inftrees.obj}
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync{$L trees.obj}
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync{$L uncompr.obj}
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync{$L zutil.obj}
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncprocedure adler32; external;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncprocedure compressBound; external;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncprocedure crc32; external;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncprocedure deflateInit2_; external;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncprocedure deflateParams; external;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncfunction _malloc(Size: Integer): Pointer; cdecl;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncbegin
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Result := AllocMem(Size);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncend;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncprocedure _free(Block: Pointer); cdecl;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncbegin
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync FreeMem(Block);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncend;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncprocedure _memset(P: Pointer; B: Byte; count: Integer); cdecl;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncbegin
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync FillChar(P^, count, B);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncend;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncprocedure _memcpy(dest, source: Pointer; count: Integer); cdecl;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncbegin
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Move(source^, dest^, count);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncend;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync// deflate compresses data
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncfunction deflateInit_(var strm: TZStreamRec; level: Integer; version: PChar;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync recsize: Integer): Integer; external;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncfunction deflate(var strm: TZStreamRec; flush: Integer): Integer; external;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncfunction deflateEnd(var strm: TZStreamRec): Integer; external;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync// inflate decompresses data
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncfunction inflateInit_(var strm: TZStreamRec; version: PChar;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync recsize: Integer): Integer; external;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncfunction inflate(var strm: TZStreamRec; flush: Integer): Integer; external;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncfunction inflateEnd(var strm: TZStreamRec): Integer; external;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncfunction inflateReset(var strm: TZStreamRec): Integer; external;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncfunction zlibAllocMem(AppData: Pointer; Items, Size: Integer): Pointer; cdecl;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncbegin
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync// GetMem(Result, Items*Size);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Result := AllocMem(Items * Size);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncend;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncprocedure zlibFreeMem(AppData, Block: Pointer); cdecl;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncbegin
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync FreeMem(Block);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncend;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync{function zlibCheck(code: Integer): Integer;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncbegin
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Result := code;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync if code < 0 then
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync raise EZlibError.Create('error'); //!!
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncend;}
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncfunction CCheck(code: Integer): Integer;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncbegin
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Result := code;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync if code < 0 then
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync raise ECompressionError.Create('error'); //!!
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncend;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncfunction DCheck(code: Integer): Integer;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncbegin
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Result := code;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync if code < 0 then
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync raise EDecompressionError.Create('error'); //!!
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncend;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncprocedure CompressBuf(const InBuf: Pointer; InBytes: Integer;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync out OutBuf: Pointer; out OutBytes: Integer);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncvar
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync strm: TZStreamRec;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync P: Pointer;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncbegin
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync FillChar(strm, sizeof(strm), 0);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync strm.zalloc := zlibAllocMem;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync strm.zfree := zlibFreeMem;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync OutBytes := ((InBytes + (InBytes div 10) + 12) + 255) and not 255;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync GetMem(OutBuf, OutBytes);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync try
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync strm.next_in := InBuf;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync strm.avail_in := InBytes;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync strm.next_out := OutBuf;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync strm.avail_out := OutBytes;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync CCheck(deflateInit_(strm, Z_BEST_COMPRESSION, zlib_version, sizeof(strm)));
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync try
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync while CCheck(deflate(strm, Z_FINISH)) <> Z_STREAM_END do
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync begin
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync P := OutBuf;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Inc(OutBytes, 256);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync ReallocMem(OutBuf, OutBytes);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync strm.next_out := PChar(Integer(OutBuf) + (Integer(strm.next_out) - Integer(P)));
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync strm.avail_out := 256;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync finally
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync CCheck(deflateEnd(strm));
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync ReallocMem(OutBuf, strm.total_out);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync OutBytes := strm.total_out;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync except
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync FreeMem(OutBuf);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync raise
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncend;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncprocedure DecompressBuf(const InBuf: Pointer; InBytes: Integer;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync OutEstimate: Integer; out OutBuf: Pointer; out OutBytes: Integer);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncvar
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync strm: TZStreamRec;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync P: Pointer;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync BufInc: Integer;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncbegin
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync FillChar(strm, sizeof(strm), 0);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync strm.zalloc := zlibAllocMem;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync strm.zfree := zlibFreeMem;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync BufInc := (InBytes + 255) and not 255;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync if OutEstimate = 0 then
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync OutBytes := BufInc
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync else
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync OutBytes := OutEstimate;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync GetMem(OutBuf, OutBytes);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync try
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync strm.next_in := InBuf;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync strm.avail_in := InBytes;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync strm.next_out := OutBuf;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync strm.avail_out := OutBytes;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync DCheck(inflateInit_(strm, zlib_version, sizeof(strm)));
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync try
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync while DCheck(inflate(strm, Z_NO_FLUSH)) <> Z_STREAM_END do
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync begin
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync P := OutBuf;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Inc(OutBytes, BufInc);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync ReallocMem(OutBuf, OutBytes);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync strm.next_out := PChar(Integer(OutBuf) + (Integer(strm.next_out) - Integer(P)));
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync strm.avail_out := BufInc;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync finally
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync DCheck(inflateEnd(strm));
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync ReallocMem(OutBuf, strm.total_out);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync OutBytes := strm.total_out;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync except
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync FreeMem(OutBuf);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync raise
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncend;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncprocedure DecompressToUserBuf(const InBuf: Pointer; InBytes: Integer;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync const OutBuf: Pointer; BufSize: Integer);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncvar
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync strm: TZStreamRec;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncbegin
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync FillChar(strm, sizeof(strm), 0);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync strm.zalloc := zlibAllocMem;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync strm.zfree := zlibFreeMem;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync strm.next_in := InBuf;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync strm.avail_in := InBytes;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync strm.next_out := OutBuf;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync strm.avail_out := BufSize;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync DCheck(inflateInit_(strm, zlib_version, sizeof(strm)));
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync try
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync if DCheck(inflate(strm, Z_FINISH)) <> Z_STREAM_END then
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync raise EZlibError.CreateRes(@sTargetBufferTooSmall);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync finally
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync DCheck(inflateEnd(strm));
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncend;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync// TCustomZlibStream
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncconstructor TCustomZLibStream.Create(Strm: TStream);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncbegin
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync inherited Create;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync FStrm := Strm;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync FStrmPos := Strm.Position;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync FZRec.zalloc := zlibAllocMem;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync FZRec.zfree := zlibFreeMem;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncend;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncprocedure TCustomZLibStream.Progress(Sender: TObject);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncbegin
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync if Assigned(FOnProgress) then FOnProgress(Sender);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncend;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync// TCompressionStream
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncconstructor TCompressionStream.Create(CompressionLevel: TCompressionLevel;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Dest: TStream);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncconst
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Levels: array [TCompressionLevel] of ShortInt =
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync (Z_NO_COMPRESSION, Z_BEST_SPEED, Z_DEFAULT_COMPRESSION, Z_BEST_COMPRESSION);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncbegin
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync inherited Create(Dest);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync FZRec.next_out := FBuffer;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync FZRec.avail_out := sizeof(FBuffer);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync CCheck(deflateInit_(FZRec, Levels[CompressionLevel], zlib_version, sizeof(FZRec)));
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncend;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncdestructor TCompressionStream.Destroy;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncbegin
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync FZRec.next_in := nil;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync FZRec.avail_in := 0;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync try
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync if FStrm.Position <> FStrmPos then FStrm.Position := FStrmPos;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync while (CCheck(deflate(FZRec, Z_FINISH)) <> Z_STREAM_END)
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync and (FZRec.avail_out = 0) do
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync begin
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync FStrm.WriteBuffer(FBuffer, sizeof(FBuffer));
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync FZRec.next_out := FBuffer;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync FZRec.avail_out := sizeof(FBuffer);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync if FZRec.avail_out < sizeof(FBuffer) then
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync FStrm.WriteBuffer(FBuffer, sizeof(FBuffer) - FZRec.avail_out);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync finally
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync deflateEnd(FZRec);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync inherited Destroy;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncend;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncfunction TCompressionStream.Read(var Buffer; Count: Longint): Longint;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncbegin
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync raise ECompressionError.CreateRes(@sInvalidStreamOp);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncend;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncfunction TCompressionStream.Write(const Buffer; Count: Longint): Longint;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncbegin
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync FZRec.next_in := @Buffer;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync FZRec.avail_in := Count;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync if FStrm.Position <> FStrmPos then FStrm.Position := FStrmPos;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync while (FZRec.avail_in > 0) do
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync begin
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync CCheck(deflate(FZRec, 0));
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync if FZRec.avail_out = 0 then
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync begin
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync FStrm.WriteBuffer(FBuffer, sizeof(FBuffer));
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync FZRec.next_out := FBuffer;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync FZRec.avail_out := sizeof(FBuffer);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync FStrmPos := FStrm.Position;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Progress(Self);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Result := Count;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncend;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncfunction TCompressionStream.Seek(Offset: Longint; Origin: Word): Longint;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncbegin
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync if (Offset = 0) and (Origin = soFromCurrent) then
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Result := FZRec.total_in
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync else
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync raise ECompressionError.CreateRes(@sInvalidStreamOp);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncend;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncfunction TCompressionStream.GetCompressionRate: Single;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncbegin
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync if FZRec.total_in = 0 then
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Result := 0
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync else
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Result := (1.0 - (FZRec.total_out / FZRec.total_in)) * 100.0;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncend;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync// TDecompressionStream
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncconstructor TDecompressionStream.Create(Source: TStream);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncbegin
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync inherited Create(Source);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync FZRec.next_in := FBuffer;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync FZRec.avail_in := 0;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync DCheck(inflateInit_(FZRec, zlib_version, sizeof(FZRec)));
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncend;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncdestructor TDecompressionStream.Destroy;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncbegin
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync FStrm.Seek(-FZRec.avail_in, 1);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync inflateEnd(FZRec);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync inherited Destroy;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncend;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncfunction TDecompressionStream.Read(var Buffer; Count: Longint): Longint;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncbegin
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync FZRec.next_out := @Buffer;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync FZRec.avail_out := Count;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync if FStrm.Position <> FStrmPos then FStrm.Position := FStrmPos;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync while (FZRec.avail_out > 0) do
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync begin
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync if FZRec.avail_in = 0 then
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync begin
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync FZRec.avail_in := FStrm.Read(FBuffer, sizeof(FBuffer));
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync if FZRec.avail_in = 0 then
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync begin
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Result := Count - FZRec.avail_out;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Exit;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync FZRec.next_in := FBuffer;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync FStrmPos := FStrm.Position;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Progress(Self);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync CCheck(inflate(FZRec, 0));
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Result := Count;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncend;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncfunction TDecompressionStream.Write(const Buffer; Count: Longint): Longint;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncbegin
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync raise EDecompressionError.CreateRes(@sInvalidStreamOp);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncend;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncfunction TDecompressionStream.Seek(Offset: Longint; Origin: Word): Longint;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncvar
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync I: Integer;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Buf: array [0..4095] of Char;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncbegin
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync if (Offset = 0) and (Origin = soFromBeginning) then
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync begin
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync DCheck(inflateReset(FZRec));
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync FZRec.next_in := FBuffer;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync FZRec.avail_in := 0;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync FStrm.Position := 0;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync FStrmPos := 0;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync else if ( (Offset >= 0) and (Origin = soFromCurrent)) or
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync ( ((Offset - FZRec.total_out) > 0) and (Origin = soFromBeginning)) then
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync begin
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync if Origin = soFromBeginning then Dec(Offset, FZRec.total_out);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync if Offset > 0 then
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync begin
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync for I := 1 to Offset div sizeof(Buf) do
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync ReadBuffer(Buf, sizeof(Buf));
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync ReadBuffer(Buf, Offset mod sizeof(Buf));
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync end
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync else
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync raise EDecompressionError.CreateRes(@sInvalidStreamOp);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Result := FZRec.total_out;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncend;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncend.