restemplate/indy/Protocols/IdZLibHeaders.pas

1398 lines
50 KiB
Plaintext
Raw Normal View History

unit IdZLibHeaders;
{
zlibpas -- Pascal interface to the zlib data compression library
* Gabriel Corneanu (gabrielcorneanu(AT)yahoo.com)
Derived from original sources by Bob Dellaca and Cosmin Truta.
- TZStreamType
- deflateInitEx
- inflateInitEx
*}
{
JPM - note that I made dynamic loading for FreePascal (since that still may not
suppport external .obj files properly. It also makes it easier to support several
different platforms in one file.
}
interface
{$I IdCompilerDefines.inc}
{$WRITEABLECONST OFF}
{
TODO: Wait for Emb to decide how to approach ZLib for their 64-bit support
before we proceed at our end.
}
{$UNDEF STATICLOAD_ZLIB}
{$UNDEF STATIC_CDECL_PROCS}
{$IFDEF DCC}
{$IFDEF WIN32}
{
For Win32, we use some .obj files. These .objs were compiled from the ZLib
source-code folder with "make -f contrib\delphi\zlibd32.mak" using Borland's
"make" and "bcc32". The .objs are compiled with the
"-DZEXPORT=__fastcall -DZEXPORTVA=__cdecl" parameter. Do NOT change
the function calling conventions unless you know what you are doing and
the C++ objects are compiled appropriately.
The only things that still are cdecl are the callback functions.
}
{$IFNDEF BCB5_DUMMY_BUILD}
{$DEFINE STATICLOAD_ZLIB}
{$IFDEF VCL_XE2_OR_ABOVE}
{$DEFINE STATIC_CDECL_PROCS}
{$ENDIF}
{$ENDIF}
{$ALIGN OFF}
{$ENDIF}
{$IFDEF WIN64}
{$ALIGN ON}
{$MINENUMSIZE 4}
{$IFNDEF BCB5_DUMMY_BUILD}
{$DEFINE STATICLOAD_ZLIB}
{$ENDIF}
{$ENDIF}
{$ELSE}
{$packrecords C}
{$ENDIF}
uses
//reference off_t
{$IFDEF KYLIXCOMPAT}
libc,
{$ENDIF}
{$IFDEF USE_VCL_POSIX}
Posix.SysTypes,
{$ENDIF}
{$IFDEF USE_BASEUNIX}
baseunix,
{$ENDIF}
IdGlobal, IdCTypes
{$IFNDEF STATICLOAD_ZLIB}
, IdException
{$ENDIF};
{$IFDEF STATICLOAD_ZLIB}
(*$HPPEMIT '// For Win32, we use some .obj files. These .objs were compiled from the ZLib'*)
(*$HPPEMIT '// source-code folder with "make -f contrib\delphi\zlibd32.mak" using Borland's'*)
(*$HPPEMIT '// "make" and "bcc32". The .objs are compiled with the'*)
(*$HPPEMIT '// "-DZEXPORT=__fastcall -DZEXPORTVA=__cdecl" parameter. Do NOT change'*)
(*$HPPEMIT '// the function calling conventions unless you know what you are doing and'*)
(*$HPPEMIT '// the C++ objects are compiled appropriately.'*)
(*$HPPEMIT '//'*)
(*$HPPEMIT '// The only things that still are cdecl are the callback functions.'*)
(*$HPPEMIT ''*)
{$IFDEF STATIC_CDECL_PROCS}
(*$HPPEMIT '#define ZEXPORT __cdecl'*)
{$ELSE}
(*$HPPEMIT '#define ZEXPORT __fastcall'*)
{$ENDIF}
{$ELSE}
(*$HPPEMIT '#define ZEXPORT __cdecl'*)
{$ENDIF}
(*$HPPEMIT '#define ZEXPORTVA __cdecl'*)
(*$HPPEMIT '#if !defined(__MACTYPES__)'*)
(*$HPPEMIT ' // We are defining __MACTYPES__ in order to skip the declaration of "Byte" as it causes'*)
(*$HPPEMIT ' // ambiguity with System::Byte'*)
(*$HPPEMIT ' #define __MACTYPES__'*)
(*$HPPEMIT ' #define __REMOVE_MACTYPES__'*)
(*$HPPEMIT '#endif'*)
(*$HPPEMIT '#if defined(__USE_ZLIBH__)'*)
(*$HPPEMIT ' #include "ZLib\zlib.h"'*)
(*$HPPEMIT '#else'*)
(*$HPPEMIT 'typedef void * __cdecl (*alloc_func)(void * opaque, unsigned items, unsigned size);'*)
(*$HPPEMIT ''*)
(*$HPPEMIT 'typedef void __cdecl (*free_func)(void * opaque, void * address);'*)
(*$HPPEMIT ''*)
(*$HPPEMIT '#pragma pack(push,1)'*)
{$IFDEF VCL_XE_OR_ABOVE}
(*$HPPEMIT 'struct DECLSPEC_DRECORD z_stream'*)
{$ELSE}
(*$HPPEMIT 'struct z_stream'*)
{$ENDIF}
(*$HPPEMIT '{'*)
(*$HPPEMIT ' '*)
(*$HPPEMIT 'public:'*)
(*$HPPEMIT ' char *next_in;'*)
(*$HPPEMIT ' unsigned avail_in;'*)
(*$HPPEMIT ' unsigned total_in;'*)
(*$HPPEMIT ' char *next_out;'*)
(*$HPPEMIT ' unsigned avail_out;'*)
(*$HPPEMIT ' unsigned total_out;'*)
(*$HPPEMIT ' char *msg;'*)
(*$HPPEMIT ' void *state;'*)
(*$HPPEMIT ' alloc_func zalloc;'*)
(*$HPPEMIT ' free_func zfree;'*)
(*$HPPEMIT ' void *opaque;'*)
(*$HPPEMIT ' int data_type;'*)
(*$HPPEMIT ' unsigned adler;'*)
(*$HPPEMIT ' unsigned reserved;'*)
(*$HPPEMIT '};'*)
(*$HPPEMIT '#pragma pack(pop)'*)
(*$HPPEMIT ''*)
(*$HPPEMIT '#if !defined(__clang__) && !defined(__CPP__)'*)
(*$HPPEMIT '#if sizeof(z_stream) < 56'*)
(*$HPPEMIT '#pragma message "Pascal/C++ size mismatch: (C++) sizeof(z_stream) < (Pascal) [size: 56, align: 1] (WARNING)"'*)
(*$HPPEMIT '#pragma sizeof(z_stream)'*)
(*$HPPEMIT '#endif'*)
(*$HPPEMIT ''*)
(*$HPPEMIT '#if sizeof(z_stream) > 56'*)
(*$HPPEMIT '#pragma message "Pascal/C++ size mismatch: (C++) sizeof(z_stream) > (Pascal) [size: 56, align: 1] (WARNING)"'*)
(*$HPPEMIT '#pragma sizeof(z_stream)'*)
(*$HPPEMIT '#endif'*)
(*$HPPEMIT ''*)
(*$HPPEMIT '#if alignof(z_stream) < 1'*)
(*$HPPEMIT '#pragma message "Pascal/C++ alignment mismatch: (C++) alignof(z_stream) < (Pascal) [size: 56, align: 1] (WARNING)"'*)
(*$HPPEMIT '#endif'*)
(*$HPPEMIT ''*)
(*$HPPEMIT '#if alignof(z_stream) > 1'*)
(*$HPPEMIT '#pragma message "Pascal/C++ alignment mismatch: (C++) alignof(z_stream) > (Pascal) [size: 56, align: 1] (WARNING)"'*)
(*$HPPEMIT '#endif'*)
(*$HPPEMIT '#endif'*)
(*$HPPEMIT ''*)
(*$HPPEMIT ''*)
(*$HPPEMIT 'struct gz_header;'*)
(*$HPPEMIT 'typedef gz_header *gz_headerp;'*)
(*$HPPEMIT ''*)
(*$HPPEMIT '#pragma pack(push,1)'*)
{$IFDEF VCL_XE_OR_ABOVE}
(*$HPPEMIT 'struct DECLSPEC_DRECORD gz_header'*)
{$ELSE}
(*$HPPEMIT 'struct gz_header'*)
{$ENDIF}
(*$HPPEMIT '{'*)
(*$HPPEMIT ' '*)
(*$HPPEMIT 'public:'*)
(*$HPPEMIT ' int text;'*)
(*$HPPEMIT ' unsigned time;'*)
(*$HPPEMIT ' int xflags;'*)
(*$HPPEMIT ' int os;'*)
(*$HPPEMIT ' System::Byte *extra;'*)
(*$HPPEMIT ' unsigned extra_len;'*)
(*$HPPEMIT ' unsigned extra_max;'*)
(*$HPPEMIT ' char *name;'*)
(*$HPPEMIT ' unsigned name_max;'*)
(*$HPPEMIT ' char *comment;'*)
(*$HPPEMIT ' unsigned comm_max;'*)
(*$HPPEMIT ' int hcrc;'*)
(*$HPPEMIT ' int done;'*)
(*$HPPEMIT '};'*)
(*$HPPEMIT '#pragma pack(pop)'*)
(*$HPPEMIT ''*)
(*$HPPEMIT '#if !defined(__clang__) && !defined(__CPP__)'*)
(*$HPPEMIT '#if sizeof(gz_header) < 52'*)
(*$HPPEMIT '#pragma message "Pascal/C++ size mismatch: (C++) sizeof(gz_header) < (Pascal) [size: 52, align: 1] (WARNING)"'*)
(*$HPPEMIT '#pragma sizeof(gz_header)'*)
(*$HPPEMIT '#endif'*)
(*$HPPEMIT ''*)
(*$HPPEMIT '#if sizeof(gz_header) > 52'*)
(*$HPPEMIT '#pragma message "Pascal/C++ size mismatch: (C++) sizeof(gz_header) > (Pascal) [size: 52, align: 1] (WARNING)"'*)
(*$HPPEMIT '#pragma sizeof(gz_header)'*)
(*$HPPEMIT '#endif'*)
(*$HPPEMIT ''*)
(*$HPPEMIT '#if alignof(gz_header) < 1'*)
(*$HPPEMIT '#pragma message "Pascal/C++ alignment mismatch: (C++) alignof(gz_header) < (Pascal) [size: 52, align: 1] (WARNING)"'*)
(*$HPPEMIT '#endif'*)
(*$HPPEMIT ''*)
(*$HPPEMIT '#if alignof(gz_header) > 1'*)
(*$HPPEMIT '#pragma message "Pascal/C++ alignment mismatch: (C++) alignof(gz_header) > (Pascal) [size: 52, align: 1] (WARNING)"'*)
(*$HPPEMIT '#endif'*)
(*$HPPEMIT '#endif'*)
(*$HPPEMIT '#endif'*)
(*$HPPEMIT '#if defined(__REMOVE_MACTYPES__)'*)
(*$HPPEMIT ' // Cleanup workaround for "Byte" ambiguity'*)
(*$HPPEMIT ' #if defined(__MACTYPES__)'*)
(*$HPPEMIT ' #undef __MACTYPES__'*)
(*$HPPEMIT ' #endif'*)
(*$HPPEMIT ' #undef __REMOVE_MACTYPES__'*)
(*$HPPEMIT '#endif'*)
const
{$EXTERNALSYM ZLIB_VERSION}
ZLIB_VERSION = '1.2.5';
{$EXTERNALSYM ZLIB_VERNUM}
ZLIB_VERNUM = $1250;
{$EXTERNALSYM ZLIB_VER_MAJOR}
ZLIB_VER_MAJOR = 1;
{$EXTERNALSYM ZLIB_VER_MINOR}
ZLIB_VER_MINOR = 2;
{$EXTERNALSYM ZLIB_VER_REVISION}
ZLIB_VER_REVISION = 5;
{$EXTERNALSYM ZLIB_VER_SUBREVISION}
ZLIB_VER_SUBREVISION = 0;
type
{JPM - I made some types from our old header to the new C types defined originally
for compatability.}
{$EXTERNALSYM z_off_t}
{$IFDEF USE_VCL_POSIX}
z_off_t = off_t;
{$ENDIF}
{$IFDEF KYLIXCOMPAT}
z_off_t = off_t;
{$ENDIF}
{$IFDEF USE_BASEUNIX}
z_off_t = off_t;
{$ENDIF}
{$IFDEF WINDOWS}
z_off_t = TIdC_LONG;
{$ENDIF}
{$EXTERNALSYM alloc_func}
alloc_func = function(opaque: Pointer; items, size: TIdC_UINT): Pointer; cdecl;
{$EXTERNALSYM TAlloc}
TAlloc = alloc_func;
{$EXTERNALSYM free_func}
free_func = procedure(opaque, address: Pointer); cdecl;
{$EXTERNALSYM TFree}
TFree = free_func;
{$EXTERNALSYM in_func}
in_func = function(opaque: Pointer; var buf: PByte): TIdC_UNSIGNED; cdecl;
{$EXTERNALSYM TInFunc}
TInFunc = in_func;
{$EXTERNALSYM out_func}
out_func = function(opaque: Pointer; buf: PByte; size: TIdC_UNSIGNED): TIdC_INT; cdecl;
{$EXTERNALSYM TOutFunc}
TOutFunc = out_func;
{$EXTERNALSYM z_streamp}
z_streamp = ^z_stream;
{$EXTERNALSYM z_stream}
z_stream = record
next_in: PIdAnsiChar; (* next input byte *)
avail_in: TIdC_UINT; (* number of bytes available at next_in *)
total_in: TIdC_ULONG; (* total nb of input bytes read so far *)
next_out: PIdAnsiChar; (* next output byte should be put there *)
avail_out: TIdC_UINT; (* remaining free space at next_out *)
total_out: TIdC_ULONG; (* total nb of bytes output so far *)
msg: PIdAnsiChar; (* last error message, NULL if no error *)
state: Pointer; (* not visible by applications *)
zalloc: alloc_func; (* used to allocate the internal state *)
zfree: free_func; (* used to free the internal state *)
opaque: Pointer; (* private data object passed to zalloc and zfree *)
data_type: TIdC_INT; (* best guess about the data type: ascii or binary *)
adler: TIdC_ULONG; (* adler32 value of the uncompressed data *)
reserved: TIdC_ULONG; (* reserved for future use *)
end;
{$EXTERNALSYM TZStreamRec}
TZStreamRec = z_stream;
{$EXTERNALSYM PZStreamRec}
PZStreamRec = z_streamp;
(*
gzip header information passed to and from zlib routines. See RFC 1952
for more details on the meanings of these fields.
*)
{$EXTERNALSYM gz_headerp}
gz_headerp = ^gz_header;
{$EXTERNALSYM gz_header}
gz_header = record
text : TIdC_INT; //* true if compressed data believed to be text */
time : TIdC_ULONG; //* modification time */
xflags : TIdC_INT; //* extra flags (not used when writing a gzip file) */
os : TIdC_INT; //* operating system */
extra : PByte; //* pointer to extra field or Z_NULL if none */
extra_len : TIdC_UINT; //* extra field length (valid if extra != Z_NULL) */
extra_max : TIdC_UINT; //* space at extra (only when reading header) */
name : PIdAnsiChar; //* pointer to zero-terminated file name or Z_NULL */
name_max : TIdC_UINT; //* space at name (only when reading header) */
comment : PIdAnsiChar; //* pointer to zero-terminated comment or Z_NULL */
comm_max : TIdC_UINT; //* space at comment (only when reading header) */
hcrc : TIdC_INT; //* true if there was or will be a header crc */
done : TIdC_INT; //* true when done reading gzip header (not used when writing a gzip file) */
end;
{$EXTERNALSYM PgzHeaderRec}
PgzHeaderRec = gz_headerp;
{$EXTERNALSYM TgzHeaderRec}
TgzHeaderRec = gz_header;
type
TZStreamType = (
zsZLib, //standard zlib stream
zsGZip, //gzip stream
zsRaw); //raw stream (without any header)
(* constants *)
const
Z_NO_FLUSH = 0;
{$EXTERNALSYM Z_NO_FLUSH}
Z_PARTIAL_FLUSH = 1;
{$EXTERNALSYM Z_PARTIAL_FLUSH}
Z_SYNC_FLUSH = 2;
{$EXTERNALSYM Z_SYNC_FLUSH}
Z_FULL_FLUSH = 3;
{$EXTERNALSYM Z_FULL_FLUSH}
Z_FINISH = 4;
{$EXTERNALSYM Z_FINISH}
Z_BLOCK = 5;
{$EXTERNALSYM Z_BLOCK}
Z_TREES = 6;
{$EXTERNALSYM Z_TREES}
Z_OK = 0;
{$EXTERNALSYM Z_OK}
Z_STREAM_END = 1;
{$EXTERNALSYM Z_STREAM_END}
Z_NEED_DICT = 2;
{$EXTERNALSYM Z_NEED_DICT}
Z_ERRNO = -1;
{$EXTERNALSYM Z_ERRNO}
Z_STREAM_ERROR = -2;
{$EXTERNALSYM Z_STREAM_ERROR}
Z_DATA_ERROR = -3;
{$EXTERNALSYM Z_DATA_ERROR}
Z_MEM_ERROR = -4;
{$EXTERNALSYM Z_MEM_ERROR}
Z_BUF_ERROR = -5;
{$EXTERNALSYM Z_BUF_ERROR}
Z_VERSION_ERROR = -6;
{$EXTERNALSYM Z_VERSION_ERROR}
Z_NO_COMPRESSION = 0;
{$EXTERNALSYM Z_NO_COMPRESSION}
Z_BEST_SPEED = 1;
{$EXTERNALSYM Z_BEST_SPEED}
Z_BEST_COMPRESSION = 9;
{$EXTERNALSYM Z_BEST_COMPRESSION}
Z_DEFAULT_COMPRESSION = -1;
{$EXTERNALSYM Z_DEFAULT_COMPRESSION}
Z_FILTERED = 1;
{$EXTERNALSYM Z_FILTERED}
Z_HUFFMAN_ONLY = 2;
{$EXTERNALSYM Z_HUFFMAN_ONLY}
Z_RLE = 3;
{$EXTERNALSYM Z_RLE}
Z_DEFAULT_STRATEGY = 0;
{$EXTERNALSYM Z_DEFAULT_STRATEGY}
Z_BINARY = 0;
{$EXTERNALSYM Z_BINARY}
Z_TEXT = 1;
{$EXTERNALSYM Z_TEXT}
Z_ASCII = Z_TEXT; //* for compatibility with 1.2.2 and earlier */
{$EXTERNALSYM Z_ASCII}
Z_UNKNOWN = 2;
{$EXTERNALSYM Z_UNKNOWN}
Z_DEFLATED = 8;
{$EXTERNALSYM Z_DEFLATED}
Z_NULL = 0; //* for initializing zalloc, zfree, opaque */
{$EXTERNALSYM Z_NULL}
MAX_WBITS = 15; { 32K LZ77 window }
{$EXTERNALSYM MAX_WBITS}
MAX_MEM_LEVEL = 9;
{$EXTERNALSYM MAX_MEM_LEVEL}
DEF_MEM_LEVEL = 8; { if MAX_MEM_LEVEL > 8 }
{$EXTERNALSYM DEF_MEM_LEVEL}
{$EXTERNALSYM inflateInit}
function inflateInit(var strm: z_stream): TIdC_INT;
{$IFDEF USE_INLINE} inline; {$ENDIF}
{$EXTERNALSYM inflateBackInit}
function inflateBackInit(var strm: z_stream;
windowBits: TIdC_INT; window: PIdAnsiChar): TIdC_INT;
{$IFDEF USE_INLINE} inline; {$ENDIF}
{$EXTERNALSYM inflateInit2}
function inflateInit2(var strm: z_stream; windowBits: TIdC_INT): TIdC_INT;
{$IFDEF USE_INLINE} inline; {$ENDIF}
{$EXTERNALSYM deflateInit}
function deflateInit(var strm: z_stream; level: TIdC_INT): TIdC_INT;
{$IFDEF USE_INLINE} inline; {$ENDIF}
{$EXTERNALSYM deflateInit2}
function deflateInit2(var strm: z_stream; level, method, windowBits,
memLevel, strategy: TIdC_INT): TIdC_INT;
{$IFDEF USE_INLINE} inline; {$ENDIF}
{not sure if these should be externalsymed but might not be a bad idea}
{$EXTERNALSYM deflateInitEx}
function deflateInitEx(var strm: z_stream; level: TIdC_INT; streamtype: TZStreamType = zsZLib): TIdC_INT;
{$EXTERNALSYM inflateInitEx}
function inflateInitEx(var strm: z_stream; streamtype: TZStreamType = zsZLib): TIdC_INT;
{$EXTERNALSYM adler32}
{$EXTERNALSYM adler32_combine}
{$EXTERNALSYM compress}
{$EXTERNALSYM compress2}
{$EXTERNALSYM compressBound}
{$EXTERNALSYM crc32}
{$EXTERNALSYM crc32_combine}
{$EXTERNALSYM deflate}
{$EXTERNALSYM deflateBound}
{$EXTERNALSYM deflateCopy}
{$EXTERNALSYM deflateEnd}
{$EXTERNALSYM deflateInit_}
{$EXTERNALSYM deflateInit2_}
{$EXTERNALSYM deflateParams}
{$EXTERNALSYM deflatePrime}
{$EXTERNALSYM deflateTune}
{$EXTERNALSYM deflateReset}
{$EXTERNALSYM deflateSetDictionary}
{$EXTERNALSYM inflate}
{$EXTERNALSYM inflateBack}
{$EXTERNALSYM inflateBackEnd}
{$EXTERNALSYM inflateBackInit_}
{$EXTERNALSYM inflateCopy}
{$EXTERNALSYM inflateEnd; external}
{$EXTERNALSYM inflateInit_}
{$EXTERNALSYM inflateInit2_}
{$EXTERNALSYM inflateReset}
{$EXTERNALSYM inflateReset2}
{$EXTERNALSYM inflateSetDictionary}
{$EXTERNALSYM inflateSync}
{$EXTERNALSYM uncompress}
{$EXTERNALSYM zlibCompileFlags}
{$EXTERNALSYM zError}
{$EXTERNALSYM inflateSyncPoint}
{$EXTERNALSYM get_crc_table}
{$EXTERNALSYM inflateUndermine}
{$EXTERNALSYM zlibVersion}
{$EXTERNALSYM deflateSetHeader}
{$EXTERNALSYM inflatePrime}
{$EXTERNALSYM inflateMark}
{$EXTERNALSYM inflateGetHeader}
{$IFNDEF STATICLOAD_ZLIB}
type
EIdZLibStubError = class(EIdException)
protected
FError : UInt32;
FErrorMessage : String;
FTitle : String;
public
constructor Build(const ATitle : String; AError : UInt32);
property Error : UInt32 read FError;
property ErrorMessage : String read FErrorMessage;
property Title : String read FTitle;
end;
type
{$EXTERNALSYM LPN_adler32}
LPN_adler32 = function (adler: TIdC_ULONG;
const buf: PIdAnsiChar; len: TIdC_UINT): TIdC_ULONG; cdecl;
{$EXTERNALSYM LPN_adler32_combine}
LPN_adler32_combine = function (crc1, crc2 : TIdC_ULONG;
len2 : z_off_t) : TIdC_ULONG; cdecl;
{$EXTERNALSYM LPN_compress}
LPN_compress = function (dest: PIdAnsiChar; var destLen: TIdC_ULONG;
const source: PIdAnsiChar; sourceLen: TIdC_ULONG): TIdC_INT;cdecl;
{$EXTERNALSYM LPN_compress2}
LPN_compress2 = function(dest: PIdAnsiChar; var destLen: TIdC_ULONG;
const source: PIdAnsiChar; sourceLen: TIdC_ULONG;
level: TIdC_INT): TIdC_INT; cdecl;
{$EXTERNALSYM LPN_compressBound}
LPN_compressBound = function (sourceLen: TIdC_ULONG): TIdC_ULONG;cdecl;
{$EXTERNALSYM LPN_crc32}
LPN_crc32 = function (crc: TIdC_ULONG; const buf: PIdAnsiChar;
len: TIdC_UINT): TIdC_ULONG; cdecl;
{$EXTERNALSYM LPN_crc32_combine}
LPN_crc32_combine = function (crc1, crc2 : TIdC_ULONG;
len2 : z_off_t) : TIdC_ULONG; cdecl;
{$EXTERNALSYM LPN_deflate}
LPN_deflate = function (var strm: z_stream; flush: TIdC_INT): TIdC_INT; cdecl;
{$EXTERNALSYM LPN_deflateBound}
LPN_deflateBound = function (var strm: z_stream;
sourceLen: TIdC_ULONG): TIdC_ULONG; cdecl;
{$EXTERNALSYM LPN_deflateCopy}
LPN_deflateCopy = function (var dest, source: z_stream): TIdC_INT; cdecl;
{$EXTERNALSYM LPN_deflateEnd}
LPN_deflateEnd = function (var strm: z_stream): TIdC_INT; cdecl;
{$EXTERNALSYM LPN_deflateInit_}
LPN_deflateInit_ = function (var strm: z_stream; level: TIdC_INT;
const version: PIdAnsiChar; stream_size: TIdC_INT): TIdC_INT;cdecl;
{$EXTERNALSYM LPN_deflateInit2_}
LPN_deflateInit2_ = function (var strm: z_stream;
level, method, windowBits, memLevel, strategy: TIdC_INT;
const version: PIdAnsiChar; stream_size: TIdC_INT): TIdC_INT;cdecl;
{$EXTERNALSYM LPN_deflateParams}
LPN_deflateParams = function (var strm: z_stream; level, strategy: TIdC_INT): TIdC_INT; cdecl;
{$EXTERNALSYM LPN_deflatePrime}
LPN_deflatePrime = function (var strm: z_stream; bits, value: TIdC_INT): TIdC_INT; cdecl;
{$EXTERNALSYM LPN_deflateTune}
LPN_deflateTune = function (var strm : z_stream; good_length : TIdC_INT;
max_lazy, nice_length, max_chain : TIdC_INT) : TIdC_INT; cdecl;
{$EXTERNALSYM LPN_deflateReset}
LPN_deflateReset = function (var strm: z_stream): TIdC_INT; cdecl;
{$EXTERNALSYM LPN_deflateSetDictionary}
LPN_deflateSetDictionary = function (var strm: z_stream; const dictionary: PIdAnsiChar;
dictLength: TIdC_UINT): TIdC_INT; cdecl;
{$EXTERNALSYM LPN_inflate}
LPN_inflate = function (var strm: z_stream; flush: TIdC_INT): TIdC_INT; cdecl;
{$EXTERNALSYM LPN_inflateBack}
LPN_inflateBack = function (var strm: z_stream; in_fn: in_func; in_desc: Pointer;
out_fn: out_func; out_desc: Pointer): TIdC_INT; cdecl;
{$EXTERNALSYM LPN_inflateBackEnd}
LPN_inflateBackEnd = function (var strm: z_stream): TIdC_INT; cdecl;
{$EXTERNALSYM LPN_inflateBackInit_}
LPN_inflateBackInit_ = function (var strm: z_stream;
windowBits: TIdC_INT; window: PIdAnsiChar;
const version: PIdAnsiChar; stream_size: TIdC_INT): TIdC_INT; cdecl;
{$EXTERNALSYM LPN_inflateCopy}
LPN_inflateCopy = function (var dest, source: z_stream): TIdC_INT; cdecl;
{$EXTERNALSYM LPN_inflateEnd}
LPN_inflateEnd = function (var strm: z_stream): TIdC_INT; cdecl;
{$EXTERNALSYM LPN_inflateInit_}
LPN_inflateInit_ = function (var strm: z_stream; const version: PIdAnsiChar;
stream_size: TIdC_INT): TIdC_INT; cdecl;
{$EXTERNALSYM LPN_inflateInit2_}
LPN_inflateInit2_ = function (var strm: z_stream; windowBits: TIdC_INT;
const version: PIdAnsiChar; stream_size: TIdC_INT): TIdC_INT;cdecl;
{$EXTERNALSYM LPN_inflateReset}
LPN_inflateReset = function (var strm: z_stream): TIdC_INT; cdecl;
{$EXTERNALSYM LPN_inflateReset2}
LPN_inflateReset2 = function (var strm : z_stream; windowBits : TIdC_INT) : TIdC_INT; cdecl;
{$EXTERNALSYM LPN_inflatePrime}
LPN_inflatePrime = function (var strm : z_stream; bits, value : TIdC_INT ) : TIdC_INT; cdecl;
{$EXTERNALSYM LPN_inflateMark}
LPN_inflateMark = function (var strm : z_stream) : TIdC_LONG; cdecl;
{$EXTERNALSYM LPN_inflateSetDictionary}
LPN_inflateSetDictionary = function (var strm: z_stream; const dictionary: PIdAnsiChar;
dictLength: TIdC_UINT): TIdC_INT; cdecl;
{$EXTERNALSYM LPN_inflateSync}
LPN_inflateSync = function (var strm: z_stream): TIdC_INT; cdecl;
{$EXTERNALSYM LPN_uncompress}
LPN_uncompress = function (dest: PIdAnsiChar; var destLen: TIdC_ULONG;
const source: PIdAnsiChar; sourceLen: TIdC_ULONG): TIdC_INT;cdecl;
{$EXTERNALSYM LPN_zlibCompileFlags}
LPN_zlibCompileFlags = function : TIdC_ULONG; cdecl;
{$EXTERNALSYM LPN_zError}
LPN_zError = function (err : TIdC_INT) : PIdAnsiChar; cdecl;
{$EXTERNALSYM LPN_inflateSyncPoint}
LPN_inflateSyncPoint = function (var z : TZStreamRec) : TIdC_INT; cdecl;
{$EXTERNALSYM LPN_get_crc_table}
LPN_get_crc_table = function : PIdC_ULONG; cdecl;
{$EXTERNALSYM LPN_zlibVersion}
LPN_zlibVersion = function : PIdAnsiChar; cdecl;
{$EXTERNALSYM LPN_inflateUndermine}
LPN_inflateUndermine = function (var strm: z_stream; subvert : TIdC_INT ) : TIdC_INT; cdecl;
{$EXTERNALSYM LPN_deflateSetHeader}
LPN_deflateSetHeader = function (var strm: z_stream; var head: gz_header): TIdC_INT; cdecl;
{$EXTERNALSYM LPN_inflateGetHeader}
LPN_inflateGetHeader = function (var strm: z_stream; var head: gz_header): TIdC_INT; cdecl;
{Vars}
var
adler32 : LPN_adler32 = nil;
adler32_combine : LPN_adler32_combine = nil;
compress : LPN_compress = nil;
compress2 : LPN_compress2 = nil;
compressBound : LPN_compressBound = nil;
crc32 : LPN_crc32 = nil;
crc32_combine : LPN_crc32_combine = nil;
deflate : LPN_deflate = nil;
deflateBound : LPN_deflateBound = nil;
deflateCopy : LPN_deflateCopy = nil;
deflateEnd : LPN_deflateEnd = nil;
deflateInit_ : LPN_deflateInit_ = nil;
deflateInit2_ : LPN_deflateInit2_ = nil;
deflateParams : LPN_deflateParams = nil;
deflatePrime :LPN_deflatePrime = nil;
deflateTune : LPN_deflateTune = nil;
deflateReset : LPN_deflateReset = nil;
deflateSetDictionary : LPN_deflateSetDictionary = nil;
inflate : LPN_inflate = nil;
inflateBack : LPN_inflateBack = nil;
inflateBackEnd : LPN_inflateBackEnd = nil;
inflateEnd : LPN_inflateEnd = nil;
inflateBackInit_ : LPN_inflateBackInit_ = nil;
inflateCopy : LPN_inflateCopy = nil;
inflateInit_ : LPN_inflateInit_ = nil;
inflateInit2_ : LPN_inflateInit2_ = nil;
inflateReset : LPN_inflateReset = nil;
inflateReset2 : LPN_inflateReset2 = nil;
inflatePrime : LPN_inflatePrime = nil;
inflateMark : LPN_inflateMark = nil;
inflateSetDictionary : LPN_inflateSetDictionary = nil;
inflateSync : LPN_inflateSync = nil;
uncompress : LPN_uncompress = nil;
zlibCompileFlags : LPN_zlibCompileFlags = nil;
zError : LPN_zError = nil;
inflateSyncPoint : LPN_inflateSyncPoint = nil;
get_crc_table : LPN_get_crc_table = nil;
inflateUndermine : LPN_inflateUndermine = nil;
zlibVersion : LPN_zlibVersion = nil;
deflateSetHeader : LPN_deflateSetHeader = nil;
inflateGetHeader : LPN_inflateGetHeader = nil;
procedure IdZLibSetLibPath(const APath: String);
{$ELSE}
(* basic functions *)
function zlibVersion: PIdAnsiChar; {$IFDEF STATIC_CDECL_PROCS} cdecl; {$ENDIF}
function deflate(var strm: z_stream; flush: TIdC_INT): TIdC_INT; {$IFDEF STATIC_CDECL_PROCS} cdecl; {$ENDIF}
function deflateEnd(var strm: z_stream): TIdC_INT; {$IFDEF STATIC_CDECL_PROCS} cdecl; {$ENDIF}
function inflate(var strm: z_stream; flush: TIdC_INT): TIdC_INT; {$IFDEF STATIC_CDECL_PROCS} cdecl; {$ENDIF}
function inflateEnd(var strm: z_stream): TIdC_INT; {$IFDEF STATIC_CDECL_PROCS} cdecl; {$ENDIF}
(* advanced functions *)
function deflateSetDictionary(var strm: z_stream; const dictionary: PIdAnsiChar;
dictLength: TIdC_UINT): TIdC_INT; {$IFDEF STATIC_CDECL_PROCS} cdecl; {$ENDIF}
function deflateCopy(var dest, source: z_stream): TIdC_INT; {$IFDEF STATIC_CDECL_PROCS} cdecl; {$ENDIF}
function deflateReset(var strm: z_stream): TIdC_INT; {$IFDEF STATIC_CDECL_PROCS} cdecl; {$ENDIF}
function deflateParams(var strm: z_stream; level, strategy: TIdC_INT): TIdC_INT; {$IFDEF STATIC_CDECL_PROCS} cdecl; {$ENDIF}
{JPM Addition}
function deflateTune(var strm : z_stream; good_length : TIdC_INT;
max_lazy, nice_length, max_chain : TIdC_INT) : TIdC_INT; {$IFDEF STATIC_CDECL_PROCS} cdecl; {$ENDIF}
function deflateBound(var strm: z_stream;
sourceLen: TIdC_ULONG): TIdC_ULONG; {$IFDEF STATIC_CDECL_PROCS} cdecl; {$ENDIF}
function deflatePrime(var strm: z_stream; bits, value: TIdC_INT): TIdC_INT; {$IFDEF STATIC_CDECL_PROCS} cdecl; {$ENDIF}
function inflateSetDictionary(var strm: z_stream; const dictionary: PIdAnsiChar;
dictLength: TIdC_UINT): TIdC_INT; {$IFDEF STATIC_CDECL_PROCS} cdecl; {$ENDIF}
function inflateSync(var strm: z_stream): TIdC_INT; {$IFDEF STATIC_CDECL_PROCS} cdecl; {$ENDIF}
function inflateCopy(var dest, source: z_stream): TIdC_INT; {$IFDEF STATIC_CDECL_PROCS} cdecl; {$ENDIF}
function inflateReset(var strm: z_stream): TIdC_INT; {$IFDEF STATIC_CDECL_PROCS} cdecl; {$ENDIF}
function inflateReset2(var strm : z_stream; windowBits : TIdC_INT) : TIdC_INT; {$IFDEF STATIC_CDECL_PROCS} cdecl; {$ENDIF}
function inflatePrime(var strm : z_stream; bits, value : TIdC_INT ) : TIdC_INT; {$IFDEF STATIC_CDECL_PROCS} cdecl; {$ENDIF}
function inflateMark(var strm : z_stream) : TIdC_LONG; {$IFDEF STATIC_CDECL_PROCS} cdecl; {$ENDIF}
function inflateBack(var strm: z_stream; in_fn: in_func; in_desc: Pointer;
out_fn: out_func; out_desc: Pointer): TIdC_INT; {$IFDEF STATIC_CDECL_PROCS} cdecl; {$ENDIF}
function inflateBackEnd(var strm: z_stream): TIdC_INT; {$IFDEF STATIC_CDECL_PROCS} cdecl; {$ENDIF}
function zlibCompileFlags: TIdC_ULONG; {$IFDEF STATIC_CDECL_PROCS} cdecl; {$ENDIF}
{JPM Additional functions}
function zError (err : TIdC_INT) : PIdAnsiChar; {$IFDEF STATIC_CDECL_PROCS} cdecl; {$ENDIF}
function inflateSyncPoint(var z : TZStreamRec) : TIdC_INT; {$IFDEF STATIC_CDECL_PROCS} cdecl; {$ENDIF}
//const uLongf * get_crc_table (void);
function inflateUndermine(var strm: z_stream; subvert : TIdC_INT ) : TIdC_INT; {$IFDEF STATIC_CDECL_PROCS} cdecl; {$ENDIF}
function get_crc_table : PIdC_ULONG; {$IFDEF STATIC_CDECL_PROCS} cdecl; {$ENDIF}
{end JPM additions}
(* utility functions *)
function compress(dest: PIdAnsiChar; var destLen: TIdC_ULONG;
const source: PIdAnsiChar; sourceLen: TIdC_ULONG): TIdC_INT; {$IFDEF STATIC_CDECL_PROCS} cdecl; {$ENDIF}
function compress2(dest: PIdAnsiChar; var destLen: TIdC_ULONG;
const source: PIdAnsiChar; sourceLen: TIdC_ULONG;
level: TIdC_INT): TIdC_INT; {$IFDEF STATIC_CDECL_PROCS} cdecl; {$ENDIF}
function compressBound(sourceLen: TIdC_ULONG): TIdC_ULONG; {$IFDEF STATIC_CDECL_PROCS} cdecl; {$ENDIF}
function uncompress(dest: PIdAnsiChar; var destLen: TIdC_ULONG;
const source: PIdAnsiChar; sourceLen: TIdC_ULONG): TIdC_INT; {$IFDEF STATIC_CDECL_PROCS} cdecl; {$ENDIF}
(* checksum functions *)
function adler32(adler: TIdC_ULONG;
const buf: PIdAnsiChar; len: TIdC_UINT): TIdC_ULONG; {$IFDEF STATIC_CDECL_PROCS} cdecl; {$ENDIF}
function adler32_combine(crc1, crc2 : TIdC_ULONG; len2 : z_off_t) : TIdC_ULONG; {$IFDEF STATIC_CDECL_PROCS} cdecl; {$ENDIF}
function crc32(crc: TIdC_ULONG; const buf: PIdAnsiChar;
len: TIdC_UINT): TIdC_ULONG; {$IFDEF STATIC_CDECL_PROCS} cdecl; {$ENDIF}
function crc32_combine(crc1, crc2 : TIdC_ULONG; len2 : z_off_t) : TIdC_ULONG; {$IFDEF STATIC_CDECL_PROCS} cdecl; {$ENDIF}
(* various hacks, don't look :) *)
function deflateInit_(var strm: z_stream; level: TIdC_INT;
const version: PIdAnsiChar; stream_size: TIdC_INT): TIdC_INT; {$IFDEF STATIC_CDECL_PROCS} cdecl; {$ENDIF}
function inflateInit_(var strm: z_stream; const version: PIdAnsiChar;
stream_size: TIdC_INT): TIdC_INT; {$IFDEF STATIC_CDECL_PROCS} cdecl; {$ENDIF}
function deflateInit2_(var strm: z_stream;
level, method, windowBits, memLevel, strategy: TIdC_INT;
const version: PIdAnsiChar; stream_size: TIdC_INT): TIdC_INT; {$IFDEF STATIC_CDECL_PROCS} cdecl; {$ENDIF}
function inflateInit2_(var strm: z_stream; windowBits: TIdC_INT;
const version: PIdAnsiChar; stream_size: TIdC_INT): TIdC_INT; {$IFDEF STATIC_CDECL_PROCS} cdecl; {$ENDIF}
function inflateBackInit_(var strm: z_stream;
windowBits: TIdC_INT; window: PIdAnsiChar;
const version: PIdAnsiChar; stream_size: TIdC_INT): TIdC_INT; {$IFDEF STATIC_CDECL_PROCS} cdecl; {$ENDIF}
function deflateSetHeader(var strm: z_stream; var head: gz_header): TIdC_INT; {$IFDEF STATIC_CDECL_PROCS} cdecl; {$ENDIF}
function inflateGetHeader(var strm: z_stream; var head: gz_header): TIdC_INT; {$IFDEF STATIC_CDECL_PROCS} cdecl; {$ENDIF}
{$ENDIF}
{$EXTERNALSYM zlibAllocMem}
function zlibAllocMem(AppData: Pointer; Items, Size: TIdC_UINT): Pointer; cdecl;
{$EXTERNALSYM zlibFreeMem}
procedure zlibFreeMem(AppData, Block: Pointer); cdecl;
{$EXTERNALSYM Load}
function Load : Boolean;
{$EXTERNALSYM Unload}
procedure Unload;
{$EXTERNALSYM Loaded}
function Loaded : Boolean;
{minor additional helper functions}
{$EXTERNALSYM _malloc}
function _malloc(Size: Integer): Pointer; cdecl;
{$EXTERNALSYM _free}
procedure _free(Block: Pointer); cdecl;
{$EXTERNALSYM _memset}
procedure _memset(P: Pointer; B: Byte; count: Integer); cdecl;
{$EXTERNALSYM _memcpy}
procedure _memcpy(dest, source: Pointer; count: Integer); cdecl;
implementation
uses
SysUtils
{$IFNDEF STATICLOAD_ZLIB}
, IdZLibConst
{$IFDEF KYLIXCOMPAT}
, libc
{$ENDIF}
{$IFDEF FPC}
, DynLibs // better add DynLibs only for fpc
{$ENDIF}
{$IFDEF WINDOWS}
, Windows
{$ENDIF}
{$ELSE}
{$IFDEF VCL_XE2_OR_ABOVE}
, System.Win.Crtl {$NOINCLUDE System.Win.Crtl}
{$ENDIF}
{$ENDIF};
{$IFDEF STATICLOAD_ZLIB}
{$IFNDEF VCL_XE2_OR_ABOVE}
{$L adler32.obj}
{$L compress.obj}
{$L crc32.obj}
{$L deflate.obj}
{$L infback.obj}
{$L inffast.obj}
{$L inflate.obj}
{$L inftrees.obj}
{$L trees.obj}
{$L uncompr.obj}
{$L zutil.obj}
{$ELSE}
{$IFDEF WIN32}
{$L ZLib\i386-Win32-ZLib\zlibudec.obj} // undecorated stubs which are not needed for x64 compilation
{$L ZLib\i386-Win32-ZLib\deflate.obj}
{$L ZLib\i386-Win32-ZLib\inflate.obj}
{$L ZLib\i386-Win32-ZLib\infback.obj}
{$L ZLib\i386-Win32-ZLib\inffast.obj}
{$L ZLib\i386-Win32-ZLib\inftrees.obj}
{$L ZLib\i386-Win32-ZLib\trees.obj}
{$L ZLib\i386-Win32-ZLib\compress.obj}
{$L ZLib\i386-Win32-ZLib\uncompr.obj}
{$L ZLib\i386-Win32-ZLib\adler32.obj}
{$L ZLib\i386-Win32-ZLib\crc32.obj}
{$L ZLib\i386-Win32-ZLib\zutil.obj}
{$L ZLib\i386-Win32-ZLib\gzclose.obj}
{$L ZLib\i386-Win32-ZLib\gzread.obj}
{$L ZLib\i386-Win32-ZLib\gzwrite.obj}
{$L ZLib\i386-Win32-ZLib\gzlib.obj}
{$ENDIF}
{$IFDEF WIN64}
{$L ZLib\x86_64-Win64-ZLib\deflate.obj}
{$L ZLib\x86_64-Win64-ZLib\inflate.obj}
{$L ZLib\x86_64-Win64-ZLib\infback.obj}
{$L ZLib\x86_64-Win64-ZLib\inffast.obj}
{$L ZLib\x86_64-Win64-ZLib\inftrees.obj}
{$L ZLib\x86_64-Win64-ZLib\trees.obj}
{$L ZLib\x86_64-Win64-ZLib\compress.obj}
{$L ZLib\x86_64-Win64-ZLib\uncompr.obj}
{$L ZLib\x86_64-Win64-ZLib\adler32.obj}
{$L ZLib\x86_64-Win64-ZLib\crc32.obj}
{$L ZLib\x86_64-Win64-ZLib\zutil.obj}
{$L ZLib\x86_64-Win64-ZLib\gzclose.obj}
{$L ZLib\x86_64-Win64-ZLib\gzread.obj}
{$L ZLib\x86_64-Win64-ZLib\gzwrite.obj}
{$L ZLib\x86_64-Win64-ZLib\gzlib.obj}
{$ENDIF}
{$ENDIF}
function adler32; external;
function adler32_combine; external;
function compress; external;
function compress2; external;
function compressBound; external;
function crc32; external;
function crc32_combine; external;
function deflate; external;
function deflateBound; external;
function deflateCopy; external;
function deflateEnd; external;
function deflateInit_; external;
function deflateInit2_; external;
function deflateParams; external;
function deflatePrime; external;
function deflateTune; external;
function deflateReset; external;
function deflateSetDictionary; external;
function inflate; external;
function inflateBack; external;
function inflateBackEnd; external;
function inflateBackInit_; external;
function inflateCopy; external;
function inflateEnd; external;
function inflateInit_; external;
function inflateInit2_; external;
function inflateReset; external;
function inflateReset2; external;
function inflateSetDictionary; external;
function inflateSync; external;
function uncompress; external;
function zlibCompileFlags; external;
function zError; external;
function inflateSyncPoint; external;
function get_crc_table; external;
function inflateUndermine; external;
function zlibVersion; external;
function deflateSetHeader; external;
function inflatePrime; external;
function inflateMark; external;
function inflateGetHeader; external;
{$ELSE}
var
{$IFDEF UNIX}
hZlib: HModule = nilhandle;
{$ELSE}
hZLib: THandle = 0;
{$ENDIF}
{$IFDEF UNIX}
const
//The extensions will be resolved by IdGlobal.HackLoad
//This is a little messy because symbolic links to libraries may not always be the same
//in various Unix types. Even then, there could possibly be differences.
libzlib = 'libz';
libvers : array [0..3] of string = ('.1','','.3','.2');
{$ENDIF}
{$IFDEF NETWARE} {zlib.nlm comes with netware6}
const
libzlib = 'zlib';
{$ENDIF}
{$IFDEF WIN32}
//Note that this is the official ZLIB1 .DLL from the http://www.zlib.net/
const
libzlib = 'zlib1.dll';
{$ENDIF}
{$IFDEF WIN64}
//Note that this is not an official ZLIB .DLL. It was obtained from:
//http://www.winimage.com/zLibDll/
//
//It is defined with the WINAPI conventions instead of the standard cdecl
//conventions. Get the DLL for Win32-x86.
const
libzlib = 'zlibwapi.dll';
{$ENDIF}
{$IFDEF WINCE}
//Note that zlibce can be found at http://www.tenik.co.jp/~adachi/wince/zlibce/
const
libzlib = 'zlibce';
{$ENDIF}
constructor EIdZLibStubError.Build(const ATitle : String; AError : UInt32);
begin
FTitle := ATitle;
FError := AError;
if AError = 0 then begin
inherited Create(ATitle);
end else begin
FErrorMessage := SysUtils.SysErrorMessage(AError);
inherited Create(ATitle + ': ' + FErrorMessage); {Do not Localize}
end;
end;
function FixupStub(hDll: THandle; const AName: {$IFDEF WINCE}TIdUnicodeString{$ELSE}string{$ENDIF}): Pointer;
begin
if hDll = 0 then begin
raise EIdZLibStubError.Build(Format(RSZLibCallError, [AName]), 0);
end;
Result := GetProcAddress(hDll, {$IFDEF WINCE}PWideChar{$ELSE}PChar{$ENDIF}(AName));
if Result = nil then begin
raise EIdZLibStubError.Build(Format(RSZLibCallError, [AName]), 10022);
end;
end;
function stub_adler32(adler: TIdC_ULONG; const buf: PIdAnsiChar;
len: TIdC_UINT): TIdC_ULONG; cdecl;
begin
adler32 := FixupStub(hZLib, 'adler32'); {Do not Localize}
Result := adler32(adler, buf, len);
end;
function stub_adler32_combine (crc1, crc2 : TIdC_ULONG;
len2 : z_off_t) : TIdC_ULONG; cdecl;
begin
adler32_combine := FixupStub(hZLib, 'adler32_combine'); {Do not Localize}
Result := adler32_combine(crc1, crc2, len2);
end;
function stub_compress(dest: PIdAnsiChar; var destLen: TIdC_ULONG;
const source: PIdAnsiChar; sourceLen: TIdC_ULONG): TIdC_INT; cdecl;
begin
compress := FixupStub(hZLib, 'compress'); {Do not Localize}
Result := compress(dest,destLen,source,sourceLen);
end;
function stub_compress2(dest: PIdAnsiChar; var destLen: TIdC_ULONG;
const source: PIdAnsiChar; sourceLen: TIdC_ULONG;
level: TIdC_INT): TIdC_INT; cdecl;
begin
compress2 := FixupStub(hZLib, 'compress2'); {Do not Localize}
Result := compress2(dest, destLen, source, sourceLen, level);
end;
function stub_compressBound(sourceLen: TIdC_ULONG): TIdC_ULONG; cdecl;
begin
compressBound := FixupStub(hZLib, 'compressBound'); {Do not Localize}
Result := compressBound(sourcelen);
end;
function stub_crc32(crc: TIdC_ULONG; const buf: PIdAnsiChar;
len: TIdC_UINT): TIdC_ULONG; cdecl;
begin
crc32 := FixupStub(hZLib, 'crc32'); {Do not Localize}
Result := crc32(crc, buf, len);
end;
function stub_crc32_combine (crc1, crc2 : TIdC_ULONG;
len2 : z_off_t) : TIdC_ULONG; cdecl;
begin
crc32_combine := FixupStub(hZLib, 'crc32_combine'); {Do not Localize}
Result := crc32_combine(crc1, crc2, len2);
end;
function stub_deflate(var strm: z_stream; flush: TIdC_INT): TIdC_INT; cdecl;
begin
deflate := FixupStub(hZLib, 'deflate'); {Do not Localize}
Result := deflate(strm, flush);
end;
function stub_deflateBound(var strm: z_stream;
sourceLen: TIdC_ULONG): TIdC_ULONG; cdecl;
begin
deflateBound := FixupStub(hZLib, 'deflateBound'); {Do not Localize}
Result := deflateBound(strm, sourceLen);
end;
function stub_deflateCopy(var dest, source: z_stream): TIdC_INT; cdecl;
begin
deflateCopy := FixupStub(hZLib, 'deflateCopy'); {Do not Localize}
Result := deflateCopy(dest, source);
end;
function stub_deflateEnd(var strm: z_stream): TIdC_INT; cdecl;
begin
deflateEnd := FixupStub(hZLib, 'deflateEnd'); {Do not Localize}
Result := deflateEnd(strm);
end;
function stub_deflateInit_(var strm: z_stream; level: TIdC_INT;
const version: PIdAnsiChar; stream_size: TIdC_INT): TIdC_INT;cdecl;
begin
deflateInit_ := FixupStub(hZLib, 'deflateInit_'); {Do not Localize}
Result := deflateInit_(strm, level, version, stream_size);
end;
function stub_deflateInit2_(var strm: z_stream;
level, method, windowBits, memLevel, strategy: TIdC_INT;
const version: PIdAnsiChar; stream_size: TIdC_INT): TIdC_INT;cdecl;
begin
deflateInit2_ := FixupStub(hZLib, 'deflateInit2_'); {Do not Localize}
Result := deflateInit2_(strm,level, method, windowBits, memLevel, strategy,
version, stream_size);
end;
function stub_deflateParams (var strm: z_stream; level, strategy: TIdC_INT): TIdC_INT; cdecl;
begin
deflateParams := FixupStub(hZLib, 'deflateParams'); {Do not Localize}
Result := deflateParams (strm, level, strategy);
end;
function stub_deflatePrime (var strm: z_stream; bits, value: TIdC_INT): TIdC_INT; cdecl;
begin
deflatePrime := FixupStub(hZLib, 'deflatePrime'); {Do not Localize}
Result := deflateParams (strm, bits, value);
end;
function stub_deflateTune(var strm : z_stream; good_length : TIdC_INT;
max_lazy, nice_length, max_chain : TIdC_INT) : TIdC_INT; cdecl;
begin
deflateTune := FixupStub(hZLib, 'deflateTune'); {Do not Localize}
Result := deflateTune(strm, good_length, max_lazy, nice_length, max_chain) ;
end;
function stub_deflateReset (var strm: z_stream): TIdC_INT; cdecl;
begin
deflateReset := FixupStub(hZLib, 'deflateReset'); {Do not Localize}
Result := deflateReset(strm);
end;
function stub_deflateSetDictionary(var strm: z_stream; const dictionary: PIdAnsiChar;
dictLength: TIdC_UINT): TIdC_INT; cdecl;
begin
deflateSetDictionary := FixupStub(hZLib, 'deflateSetDictionary'); {Do not Localize}
Result := deflateSetDictionary(strm, dictionary, dictLength);
end;
function stub_inflate(var strm: z_stream; flush: TIdC_INT): TIdC_INT; cdecl;
begin
inflate := FixupStub(hZLib, 'inflate'); {Do not Localize}
Result := inflate(strm, flush);
end;
function stub_inflateBack(var strm: z_stream; in_fn: in_func; in_desc: Pointer;
out_fn: out_func; out_desc: Pointer): TIdC_INT; cdecl;
begin
inflateBack := FixupStub(hZLib, 'inflateBack'); {Do not Localize}
Result := inflateBack(strm, in_fn, in_desc, out_fn, out_desc);
end;
function stub_inflateBackEnd(var strm: z_stream): TIdC_INT; cdecl;
begin
inflateBackEnd := FixupStub(hZLib, 'inflateBackEnd'); {Do not Localize}
Result := inflateBackEnd(strm);
end;
function stub_inflateEnd(var strm: z_stream): TIdC_INT; cdecl;
begin
inflateEnd := FixupStub(hZLib, 'inflateEnd'); {Do not Localize}
Result := inflateEnd(strm);
end;
function stub_inflateBackInit_(var strm: z_stream;
windowBits: TIdC_INT; window: PIdAnsiChar;
const version: PIdAnsiChar; stream_size: TIdC_INT): TIdC_INT; cdecl;
begin
inflateBackInit_ := FixupStub(hZLib, 'inflateBackInit_'); {Do not Localize}
Result := inflateBackInit_(strm, windowBits, window, version, stream_size);
end;
function stub_inflateInit2_(var strm: z_stream; windowBits: TIdC_INT;
const version: PIdAnsiChar; stream_size: TIdC_INT): TIdC_INT;cdecl;
begin
inflateInit2_ := FixupStub(hZLib, 'inflateInit2_'); {Do not Localize}
Result := inflateInit2_(strm, windowBits, version, stream_size);
end;
function stub_inflateCopy(var dest, source: z_stream): TIdC_INT; cdecl;
begin
inflateCopy := FixupStub(hZLib, 'inflateCopy'); {Do not Localize}
Result := inflateCopy(dest, source);
end;
function stub_inflateInit_(var strm: z_stream; const version: PIdAnsiChar;
stream_size: TIdC_INT): TIdC_INT; cdecl;
begin
inflateInit_ := FixupStub(hZLib, 'inflateInit_'); {Do not Localize}
Result := inflateInit_(strm, version, stream_size);
end;
function stub_inflateReset(var strm: z_stream): TIdC_INT; cdecl;
begin
inflateReset := FixupStub(hZLib, 'inflateReset'); {Do not Localize}
Result := inflateReset(strm);
end;
function stub_inflateReset2(var strm : z_stream; windowBits : TIdC_INT) : TIdC_INT; cdecl;
begin
inflateReset2 := FixupStub(hZLib, 'inflateReset2'); {Do not Localize}
Result := inflateReset2(strm, windowBits);
end;
function stub_inflatePrime(var strm : z_stream; bits, value : TIdC_INT ) : TIdC_INT; cdecl;
begin
inflatePrime := FixupStub(hZLib, 'inflatePrime'); {Do not Localize}
Result := inflatePrime(strm, bits, value);
end;
function stub_inflateMark(var strm : z_stream) : TIdC_LONG; cdecl;
begin
inflateMark := FixupStub(hZLib, 'inflateMark'); {Do not Localize}
Result := inflateMark(strm);
end;
function stub_inflateSetDictionary(var strm: z_stream; const dictionary: PIdAnsiChar;
dictLength: TIdC_UINT): TIdC_INT;cdecl;
begin
inflateSetDictionary := FixupStub(hZLib, 'inflateSetDictionary'); {Do not Localize}
Result := inflateSetDictionary(strm, dictionary, dictLength);
end;
function stub_inflateSync(var strm: z_stream): TIdC_INT; cdecl;
begin
inflateSync := FixupStub(hZLib, 'inflateSync'); {Do not Localize}
Result := inflateSync(strm);
end;
function stub_uncompress (dest: PIdAnsiChar; var destLen: TIdC_ULONG;
const source: PIdAnsiChar; sourceLen: TIdC_ULONG): TIdC_INT;cdecl;
begin
uncompress := FixupStub(hZLib, 'uncompress'); {Do not Localize}
Result := uncompress (dest, destLen, source, sourceLen);
end;
function stub_zlibCompileFlags : TIdC_ULONG; cdecl;
begin
zlibCompileFlags := FixupStub(hZLib, 'zlibCompileFlags'); {Do not Localize}
Result := zlibCompileFlags;
end;
function stub_zError(err : TIdC_INT) : PIdAnsiChar; cdecl;
begin
zError := FixupStub(hZLib, 'zError'); {Do not Localize}
Result := zError(err);
end;
function stub_inflateSyncPoint(var z : TZStreamRec) : TIdC_INT; cdecl;
begin
inflateSyncPoint := FixupStub(hZLib, 'inflateSyncPoint'); {Do not Localize}
Result := inflateSyncPoint(z);
end;
function stub_get_crc_table : PIdC_ULONG; cdecl;
begin
get_crc_table := FixupStub(hZLib, 'get_crc_table'); {Do not Localize}
Result := get_crc_table;
end;
function stub_inflateUndermine(var strm: z_stream; subvert : TIdC_INT ) : TIdC_INT; cdecl;
begin
inflateUndermine := FixupStub(hZLib, 'inflateUndermine'); {Do not Localize}
Result := inflateUndermine(strm,subvert);
end;
function stub_zlibVersion : PIdAnsiChar; cdecl;
begin
Result := '';
zlibVersion := FixupStub(hZLib, 'zlibVersion'); {Do not Localize}
if Assigned(zlibVersion) then begin
Result := zlibVersion;
end;
end;
function stub_deflateSetHeader(var strm: z_stream; var head: gz_header): TIdC_INT; cdecl;
begin
deflateSetHeader := FixupStub(hZLib, 'deflateSetHeader'); {Do not Localize}
Result := deflateSetHeader(strm, head);
end;
function stub_inflateGetHeader(var strm: z_stream; var head: gz_header): TIdC_INT; cdecl;
begin
inflateGetHeader := FixupStub(hZLib, 'inflateGetHeader'); {Do not Localize}
Result := inflateGetHeader(strm, head);
end;
procedure InitializeStubs;
begin
adler32 := stub_adler32;
adler32_combine := stub_adler32_combine;
compress := stub_compress;
compress2 := stub_compress2;
compressBound := stub_compressBound;
crc32 := stub_crc32;
crc32_combine := stub_crc32_combine;
deflate := stub_deflate;
deflateBound := stub_deflateBound;
deflateCopy := stub_deflateCopy;
deflateEnd := stub_deflateEnd;
deflateInit_ := stub_deflateInit_;
deflateInit2_ := stub_deflateInit2_;
deflateParams := stub_deflateParams;
deflatePrime := stub_deflatePrime;
deflateTune := stub_deflateTune;
deflateReset := stub_deflateReset;
deflateSetDictionary := stub_deflateSetDictionary;
inflate := stub_inflate;
inflateBack := stub_inflateBack;
inflateBackEnd := stub_inflateBackEnd;
inflateBackInit_ := stub_inflateBackInit_;
inflateCopy := stub_inflateCopy;
inflateEnd := stub_inflateEnd;
inflateInit_ := stub_inflateInit_;
inflateInit2_ := stub_inflateInit2_;
inflateReset := stub_inflateReset;
inflateReset2 := stub_inflateReset2;
inflatePrime := stub_inflatePrime;
inflateMark := stub_inflateMark;
inflateSetDictionary := stub_inflateSetDictionary;
inflateSync := stub_inflateSync;
uncompress := stub_uncompress;
zlibCompileFlags := stub_zlibCompileFlags;
zError := stub_zError;
inflateUndermine := stub_inflateUndermine;
inflateSyncPoint := stub_inflateSyncPoint;
get_crc_table := stub_get_crc_table;
zlibVersion := stub_zlibVersion;
deflateSetHeader := stub_deflateSetHeader;
inflateGetHeader := stub_inflateGetHeader;
end;
{$ENDIF}
function deflateInit(var strm: z_stream; level: TIdC_INT): TIdC_INT;
begin
// if not Assigned(strm.zalloc) then strm.zalloc := zlibAllocMem;
// if not Assigned(strm.zfree) then strm.zfree := zlibFreeMem;
Result := deflateInit_(strm, level, ZLIB_VERSION, sizeof(z_stream));
end;
function deflateInit2(var strm: z_stream; level, method, windowBits,
memLevel, strategy: TIdC_INT): TIdC_INT;
begin
// if not Assigned(strm.zalloc) then strm.zalloc := zlibAllocMem;
// if not Assigned(strm.zfree) then strm.zfree := zlibFreeMem;
Result := deflateInit2_(strm, level, method, windowBits, memLevel, strategy,
ZLIB_VERSION, sizeof(z_stream));
end;
const
WBits : array[TZStreamType] of TIdC_INT = (MAX_WBITS, MAX_WBITS + 16, -MAX_WBITS);
function deflateInitEx(var strm: z_stream; level: TIdC_INT; streamtype: TZStreamType = zsZLib): TIdC_INT;
begin
Result := deflateInit2(strm, level, Z_DEFLATED, WBits[streamtype],
MAX_MEM_LEVEL, Z_DEFAULT_STRATEGY);
end;
function inflateInitEx(var strm: z_stream; streamtype: TZStreamType = zsZLib): TIdC_INT;
begin
Result := inflateInit2(strm, WBits[streamtype]);
end;
function inflateInit(var strm: z_stream): TIdC_INT;
begin
// if not Assigned(strm.zalloc) then strm.zalloc := zlibAllocMem;
// if not Assigned(strm.zfree) then strm.zfree := zlibFreeMem;
Result := inflateInit_(strm, ZLIB_VERSION, sizeof(z_stream));
end;
function inflateInit2(var strm: z_stream; windowBits: TIdC_INT): TIdC_INT;
begin
if not Assigned(strm.zalloc) then begin
strm.zalloc := zlibAllocMem;
end;
if not Assigned(strm.zfree) then begin
strm.zfree := zlibFreeMem;
end;
Result := inflateInit2_(strm, windowBits, ZLIB_VERSION, SizeOf(z_stream));
end;
function inflateBackInit(var strm: z_stream; windowBits: TIdC_INT;
window: PIdAnsiChar): TIdC_INT;
begin
Result := inflateBackInit_(strm, windowBits, window, ZLIB_VERSION, SizeOf(z_stream));
end;
{minor additional helper functions}
function _malloc(Size: Integer): Pointer; cdecl;
begin
GetMem(Result, Size);
end;
procedure _free(Block: Pointer); cdecl;
begin
FreeMem(Block);
end;
procedure _memset(P: Pointer; B: Byte; count: Integer); cdecl;
begin
FillChar(P^, count, B);
end;
procedure _memcpy(dest, source: Pointer; count: Integer); cdecl;
begin
Move(source^, dest^, count);
end;
function zlibAllocMem(AppData: Pointer; Items, Size: TIdC_UINT): Pointer; cdecl;
begin
GetMem(Result, Items*Size);
// Result := AllocMem(Items * Size);
end;
procedure zlibFreeMem(AppData, Block: Pointer); cdecl;
begin
FreeMem(Block);
end;
{$IFDEF STATICLOAD_ZLIB}
function Load : Boolean;
begin
Result := True;
end;
procedure Unload;
begin
end;
function Loaded : Boolean;
begin
Result := True;
end;
{$ELSE}
var
GIdZLibPath: String = '';
procedure IdZLibSetLibPath(const APath: String);
begin
if APath <> '' then begin
GIdZLibPath := IndyIncludeTrailingPathDelimiter(APath);
end else begin
GIdZLibPath := '';
end;
end;
function Load : Boolean;
begin
Result := Loaded;
if not Result then begin
//In Windows, you should use SafeLoadLibrary instead of the LoadLibrary API
//call because LoadLibrary messes with the FPU control word.
{$IFDEF WINDOWS}
hZLib := SafeLoadLibrary(GIdZLibPath + libzlib);
{$ELSE}
{$IFDEF UNIX}
hZLib := HackLoad(GIdZLibPath + libzlib, libvers);
{$ELSE}
hZLib := LoadLibrary(GIdZLibPath + libzlib);
{$IFDEF USE_INVALIDATE_MOD_CACHE}
InvalidateModuleCache;
{$ENDIF}
{$ENDIF}
{$ENDIF}
Result := Loaded;
end;
end;
procedure Unload;
begin
if Loaded then begin
FreeLibrary(hZLib);
{$IFDEF DELPHI_CROSS}
InvalidateModuleCache;
{$ENDIF}
hZLib := 0;
InitializeStubs;
end;
end;
function Loaded : Boolean;
begin
Result := (hZLib <> 0);
end;
{$ENDIF}
{$IFNDEF STATICLOAD_ZLIB}
initialization
InitializeStubs;
Load;
finalization
Unload;
InitializeStubs;
{$ENDIF}
end.