## Coverage profiler SDK - Pakovací komponenty

### Pakovací komponenta ZLIB

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