Tato komponenta nepracuje přímo s soubory, ale s řetězci jak při kompresi tak i dekompresi. Dále je nutné při dekompresi znát velikost souboru před kompresí.
#INCLUDE "Main.h"
*************************************************************
* Procedura, která vrátí objekt pro pakování a rozpakování
*************************************************************
PROCEDURE GetInterface(loObj)
*@loObj - Proměnná do které se zapíše odkaz na objekt pro pakování
loObj=CREATEOBJECT("_ZLib_Archiver")
*************************************************************
* Vlastní třída pro pakování a rozpakování
*************************************************************
DEFINE CLASS _ZLib_Archiver AS Custom
Name="_ZLib_Archiver"
* Dekompresní metoda
PROCEDURE Decompress(loPack)
* loPack - Objekt pro rozpakování
* Pokus se zavést potřebnou funkci z DLL knihovny
IF !LoadDllFunc("DECLARE INTEGER uncompress IN "+loPack.PU.D_File+" STRING @, INTEGER @, STRING @, INTEGER")
RETURN _PP_ProcessFailed
ENDIF
LOCAL lcDest, lnDestLen, lnSourceLen,lcSource
lcSource =FILETOSTR(loPack.File_S) && Načti soubor do řetězce (zkomprimovaný soubor)
lnSourceLen = LEN(lcSource) && Zjisti jeho délku
lnDestLen = loPack.File.Size && Velikost souboru před kompresí
lcDest = SPACE(lnDestLen) && Nadefinuj buffer
liRet=_PP_PAUNFailed
* Proveď dekompresi souboru
IF uncompress(@lcDest, @lnDestLen, @lcSource, lnSourceLen)=0
lcDest = LEFT(lcDest, lnDestLen) && Musí se zkrátit na potřebnou délku !!!
liRet=IIF(STRTOFILE(lcDest,loPack.File_D)>0,_PP_ErrOK,_PP_PAUNFailed) && Ulož řetězec jako soubor
ELSE
ENDIF
RETURN liRet
ENDPROC
* Kompresní metoda
PROCEDURE Compress(loPack)
* loPack - Objekt pro rozpakování
* Pokus se zavést potřebnou funkci z DLL knihovny
IF !LoadDllFunc("DECLARE INTEGER compress IN "+loPack.PU.C_File+" STRING @, INTEGER @, STRING @, INTEGER")
RETURN _PP_ProcessFailed
ENDIF
LOCAL lcDest, lnDestLen, lnSourceLen,lcSource,liRet
lcSource=FILETOSTR(loPack.File_S) && Načti soubor do řetězce (soubor před komprimací)
lnSourceLen = LEN(lcSource) && Velikost souboru před komprimací
lnDestLen = INT(lnSourceLen*1.001+12) && Přesně takhle velký buffer
lcDest = SPACE(lnDestLen) && Nadefinuj potřebný buffer
liRet=_PP_PAUNFailed
* Proveď kompresi souboru
IF compress(@lcDest, @lnDestLen, @lcSource, lnSourceLen)=0
lcDest = LEFT(lcDest, lnDestLen) && Musí se zkrátit na potřebnou délku !!!
liRet=IIF(STRTOFILE(lcDest,loPack.File_D)>0,_PP_ErrOK,_PP_PAUNFailed) && Ulož řetězec jako soubor
ELSE
ENDIF
RETURN liRet
ENDPROC
ENDDEFIN