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