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