' ========================================================================================
' LiteZip/LiteUnzip
' ========================================================================================

' LiteZip.dll and LiteUnzip.dll are two Win32 Dynamic Link libraries. The former has
' functions to create a ZIP archive (ie, compress numerous files into a ZIP file). The
' latter has functions to extract the contents of a ZIP archive.

' This project is largely based upon work by Lucian Wischik, who in turn based his work on
' gzip 1.1.4, zlib, and info-zip which are by by Jean-Loup Gailly and Mark Adler. Lucian's
' code has been reworked to be written in plain C, using only the Win32 API, and packaged
' into 2 DLLs. (Also some improvements to error-checking, some added functionality, and
' code-reduction/stream-lining was accomplished). 


' ========================================================================================
' /*
'  * LiteZip.h
'  *
'  * For creating zip files using LITEZIP.DLL.
'  *
'  * This file is a repackaged form of extracts from the zlib code available
'  * at www.gzip.org/zlib,  by Jean-Loup Gailly and Mark Adler. The original
'  * copyright notice may be found in LiteZip.c. The repackaging was done
'  * by Lucian Wischik to simplify and extend its use in Windows/C++. Also
'  * encryption and unicode filenames have been added. Code was further
'  * revamped and turned into a DLL (which supports both UNICODE and ANSI
'  * C strings) by Jeff Glatt.
'  */

' // An HZIP identifies a zip archive that is being created
' ========================================================================================

%TZIP_OPTION_GZIP = &H80000000

' // These are the return codes from Zip functions
%ZR_OK           = 0     ' // Success

' // The following come from general system stuff (e.g. files not openable)
%ZR_NOFILE       = 1     ' // Can't create/open the file
%ZR_NOALLOC      = 2     ' // Failed to allocate memory
%ZR_WRITE        = 3     ' // A general error writing to the file
%ZR_NOTFOUND     = 4     ' // Can't find the specified file in the zip
%ZR_MORE         = 5     ' // There's still more data to be unzipped
%ZR_CORRUPT      = 6     ' // The zipfile is corrupt or not a zipfile
%ZR_READ         = 7     ' // An error reading the file
%ZR_NOTSUPPORTED = 8     ' // The entry is in a format that can't be decompressed by this Unzip add-on

' // The following come from mistakes on the part of the caller
%ZR_ARGS         = 9     ' // Bad arguments passed
%ZR_NOTMMAP      = 10    ' // Tried to ZipGetMemory, but that only works on mmap zipfiles, which yours wasn't
%ZR_MEMSIZE      = 11    ' // The memory-buffer size is too small
%ZR_FAILED       = 12    ' // Already failed when you called this function
%ZR_ENDED        = 13    ' // The zip creation has already been closed
%ZR_MISSIZE      = 14    ' // The source file size turned out mistaken
%ZR_ZMODE        = 15    ' // Tried to mix creating/opening a zip 

' // The following come from bugs within the zip library itself
%ZR_SEEK         = 16    ' // trying to seek in an unseekable file
%ZR_NOCHANGE     = 17    ' // changed its mind on storage, but not allowed
%ZR_FLATE        = 18    ' // An error in the de/inflation code
%ZR_PASSWORD     = 19    ' // Password is incorrect

' ========================================================================================
' DWORD WINAPI ZipCreateFileA(HZIP *zipHandle, const char *fn, const char *password)
' ========================================================================================
DECLARE FUNCTION ZipCreateFile LIB "LITEZIP.DLL" ALIAS "ZipCreateFileA" ( _
  BYREF hZip AS DWORD, BYREF szFilename AS ASCIIZ, BYREF szPassword AS ASCIIZ) AS DWORD

' ========================================================================================
' DWORD WINAPI ZipCreateBuffer(HZIP *zipHandle, void *z, DWORD len, const char *password)
' ========================================================================================
DECLARE FUNCTION ZipCreateBuffer LIB "LITEZIP.DLL" ALIAS "ZipCreateBuffer" ( _
  BYREF hZip AS DWORD, BYVAL lpBuffer AS DWORD, BYVAL nSize AS DWORD, BYREF szPassword AS ASCIIZ) AS DWORD

' ========================================================================================
' DWORD WINAPI ZipCreateHandle(HZIP *zipHandle, HANDLE h, const char *password)
' ========================================================================================
DECLARE FUNCTION ZipCreateHandle LIB "LITEZIP.DLL" ALIAS "ZipCreateHandle" ( _
  BYREF hZip AS DWORD, BYVAL fileHandle AS DWORD, BYREF szPassword AS ASCIIZ) AS DWORD

' ========================================================================================
' DWORD WINAPI ZipAddFileA(HZIP tzip, const char *destname, const char *fn)
' ========================================================================================
DECLARE FUNCTION ZipAddFile LIB "LITEZIP.DLL" ALIAS "ZipAddFileA" ( _
  BYVAL hZip AS DWORD, BYREF szZipname AS ASCIIZ, BYREF szFilename AS ASCIIZ) AS DWORD

' ========================================================================================
' DWORD WINAPI ZipAddHandleA(HZIP tzip, const char *destname, HANDLE h)
' ========================================================================================
DECLARE FUNCTION ZipAddHandle LIB "LITEZIP.DLL" ALIAS "ZipAddHandleA" ( _
  BYVAL hZip AS DWORD, BYREF szZipname AS ASCIIZ, BYVAL fileHandle AS DWORD) AS DWORD

' ========================================================================================
' DWORD WINAPI ZipAddBufferA(HZIP tzip, const char *destname, const void *src, DWORD len)
' ========================================================================================
DECLARE FUNCTION ZipAddBuffer LIB "LITEZIP.DLL" ALIAS "ZipAddBufferA" ( _
  BYVAL hZip AS DWORD, BYREF szZipname AS ASCIIZ, BYVAL lpBuffer AS DWORD, BYVAL nSize AS DWORD) AS DWORD

' ========================================================================================
' DWORD WINAPI ZipAddPipeA(HZIP tzip, const char *destname, HANDLE h, DWORD len)
' ========================================================================================
DECLARE FUNCTION ZipAddPipe LIB "LITEZIP.DLL" ALIAS "ZipAddPipeA" ( _
  BYVAL hZip AS DWORD, BYREF szZipname AS ASCIIZ, BYVAL fileHandle AS DWORD, BYVAL nSize AS DWORD) AS DWORD

' ========================================================================================
' DWORD WINAPI ZipAddFolderA(HZIP tzip, const char *destname)
' ========================================================================================
DECLARE FUNCTION ZipAddFolder LIB "LITEZIP.DLL" ALIAS "ZipAddFolderA" ( _
  BYVAL hZip AS DWORD, BYREF szZipname AS ASCIIZ) AS DWORD

' ========================================================================================
' DWORD WINAPI ZipGetMemory(HZIP tzip, void **pbuf, DWORD *plen, HANDLE *base)
' ========================================================================================
DECLARE FUNCTION ZipGetMemory LIB "LITEZIP.DLL" ALIAS "ZipGetMemory" ( _
  BYVAL hZip AS DWORD, BYREF bufferPtr AS DWORD, BYREF nSize AS DWORD, BYREF freeHandle AS DWORD) AS DWORD

' ========================================================================================
' DWORD WINAPI ZipResetMemory(HZIP tzip)
' ========================================================================================
DECLARE FUNCTION ZipResetMemory LIB "LITEZIP.DLL" ALIAS "ZipResetMemory" (BYVAL hZip AS DWORD) AS DWORD

' ========================================================================================
' DWORD WINAPI ZipClose(HZIP tzip)
' ========================================================================================
DECLARE FUNCTION ZipClose LIB "LITEZIP.DLL" ALIAS "ZipClose" (BYVAL hZip AS DWORD) AS DWORD

' ========================================================================================
' DWORD WINAPI ZipOptions(HZIP tzip, DWORD flags)
' ========================================================================================
DECLARE FUNCTION ZipOptions LIB "LITEZIP.DLL" ALIAS "ZipOptions" ( _
  BYVAL hZip AS DWORD, BYVAL flags AS DWORD) AS DWORD

' ========================================================================================
' DWORD WINAPI ZipFormatMessageA(DWORD code, char *buf, DWORD len)
' ========================================================================================
DECLARE FUNCTION ZipFormatMessage LIB "LITEZIP.DLL" ALIAS "ZipFormatMessageA" ( _
  BYVAL errornumber AS DWORD, BYREF lpBuffer AS ASCIIZ, BYVAL buffersize AS DWORD) AS DWORD

' ========================================================================================
' DWORD WINAPI ZipAddDirA(HZIP, const char *, DWORD)
' ========================================================================================
DECLARE FUNCTION ZipAddDir LIB "LITEZIP.DLL" ALIAS "ZipAddDirA" ( _
  BYVAL hZip AS DWORD, BYREF szDirName AS ASCIIZ, BYVAL dwOffset AS DWORD) AS DWORD

' ========================================================================================
' /*
'  * LiteUnzip.h 
'  *
'  * For decompressing the contents of zip archives using LITEUNZIP.DLL.
'  *
'  * This file is a repackaged form of extracts from the zlib code available
'  * at www.gzip.org/zlib,  by Jean-Loup Gailly and Mark Adler. The original
'  * copyright notice may be found in unzip.cpp. The repackaging was done
'  * by Lucian Wischik to simplify and extend its use in Windows/C++. Also
'  * encryption and unicode filenames have been added. Code was further
'  * revamped and turned into a DLL by Jeff Glatt.
'  */

' // An HUNZIP identifies a zip archive that has been opened
' ========================================================================================

TYPE ZIPENTRY
  Index AS DWORD                 ' // index of this entry within the zip archive
  Attributes AS DWORD            ' // attributes, as in GetFileAttributes.
  AccessTime AS FILETIME         ' // access filetime
  CreateTime AS FILETIME         ' // create filetime
  ModifyTime AS FILETIME         ' // modify filetime
  CompressedSize AS LONG         ' // sizes of entry, compressed and uncompressed. These
  UncompressedSize AS LONG       ' // may be -1 if not yet known (e.g. being streamed in)
  szName AS ASCIIZ * %MAX_PATH   ' // entry name
END TYPE

' ========================================================================================
' DWORD WINAPI UnzipOpenFileA(HUNZIP *tunzip, const char *fn, const char *password)
' ========================================================================================
DECLARE FUNCTION UnzipOpenFile LIB "LITEUNZIP.DLL" ALIAS "UnzipOpenFileA" ( _
  BYREF hUnzip AS DWORD, BYREF szFilename AS ASCIIZ, BYREF szPassword AS ASCIIZ) AS DWORD

' ========================================================================================
' DWORD WINAPI UnzipOpenBuffer(HUNZIP *tunzip, void *z, DWORD len, const char *password)
' ========================================================================================
DECLARE FUNCTION UnzipOpenBuffer LIB "LITEUNZIP.DLL" ALIAS "UnzipOpenBuffer" ( _
  BYREF hUnzip AS DWORD, BYVAL lpBuffer AS DWORD, BYVAL nSize AS DWORD, BYREF szPassword AS ASCIIZ) AS DWORD

' ========================================================================================
' DWORD WINAPI UnzipOpenHandle(HUNZIP *tunzip, HANDLE h, const char *password)
' ========================================================================================
DECLARE FUNCTION UnzipOpenHandle LIB "LITEUNZIP.DLL" ALIAS "UnzipOpenHandle" ( _
  BYREF hUnzip AS DWORD, BYVAL fileHandle AS DWORD, BYREF szPassword AS ASCIIZ) AS DWORD

' ========================================================================================
' DWORD WINAPI UnzipGetItemA(HUNZIP tunzip, ZIPENTRY *ze)
' ========================================================================================
DECLARE FUNCTION UnzipGetItem LIB "LITEUNZIP.DLL" ALIAS "UnzipGetItemA" ( _
  BYVAL hUnzip AS DWORD, BYREF ze AS ZIPENTRY) AS DWORD

' ========================================================================================
' DWORD WINAPI UnzipFindItemA(HUNZIP tunzip, ZIPENTRY *ze, BOOL ic)
' ========================================================================================
DECLARE FUNCTION UnzipFindItem LIB "LITEUNZIP.DLL" ALIAS "UnzipFindItemA" ( _
  BYVAL hUnzip AS DWORD, BYREF ze AS ZIPENTRY, BYREF ic AS LONG) AS DWORD

' ========================================================================================
' DWORD WINAPI UnzipItemToFileA(HUNZIP tunzip, const char *fn, ZIPENTRY *ze)
' ========================================================================================
DECLARE FUNCTION UnzipItemToFile LIB "LITEUNZIP.DLL" ALIAS "UnzipItemToFileA" ( _
  BYVAL hUnzip AS DWORD, BYREF szFilename AS ASCIIZ, BYREF ze AS ZIPENTRY) AS DWORD

' ========================================================================================
' DWORD WINAPI UnzipItemToHandle(HUNZIP tunzip, HANDLE h, ZIPENTRY *ze)
' ========================================================================================
DECLARE FUNCTION UnzipItemToHandle LIB "LITEUNZIP.DLL" ALIAS "UnzipItemToHandle" ( _
  BYVAL hUnzip AS DWORD, BYVAL dwHandle AS DWORD, BYREF ze AS ZIPENTRY) AS DWORD

' ========================================================================================
' DWORD WINAPI UnzipItemToBuffer(HUNZIP tunzip, void *z, DWORD len, ZIPENTRY *ze)
' ========================================================================================
DECLARE FUNCTION UnzipItemToBuffer LIB "LITEUNZIP.DLL" ALIAS "UnzipItemToBuffer" ( _
  BYVAL hUnzip AS DWORD, BYVAL buffer AS DWORD, BYVAL bufSize AS DWORD, BYREF ze AS ZIPENTRY) AS DWORD

' ========================================================================================
' DWORD WINAPI UnzipSetBaseDirA(HUNZIP tunzip, const char *dir)
' ========================================================================================
DECLARE FUNCTION UnzipSetBaseDir LIB "LITEUNZIP.DLL" ALIAS "UnzipSetBaseDirA" ( _
  BYVAL hUnzip AS DWORD, BYREF szDirName AS ASCIIZ) AS DWORD

' ========================================================================================
' DWORD WINAPI UnzipFormatMessageA(DWORD code, char *buf, DWORD len)
' ========================================================================================
DECLARE FUNCTION UnzipFormatMessage LIB "LITEUNZIP.DLL" ALIAS "UnzipFormatMessageA" ( _
  BYVAL errornumber AS DWORD, BYREF lpBuffer AS ASCIIZ, BYVAL buffersize AS LONG) AS DWORD

' ========================================================================================
' DWORD WINAPI UnzipClose(HUNZIP tunzip)
' ========================================================================================
DECLARE FUNCTION UnzipClose LIB "LITEUNZIP.DLL" ALIAS "UnzipClose" (BYVAL hUnzip AS DWORD) AS DWORD
