Coverage profiler SDK - Pakovací komponenty

Pakovací komponenta BZIP2

BZIP je WIN32 konzolová aplikace pro kompresi a dekompresi souborů. Dokáže komprimovat pouze jeden soubor a nelze ovlivnit název výstupního souboru po zkomprimování a dekomprimování.

#INCLUDE "Main.h"

*************************************************************
* Procedura, která vrátí objekt pro pakování a rozpakování
*************************************************************
PROCEDURE GetInterface(loObj)
*@loObj - Vlastnost do které se zapíše odkaz na objekt pro pakování
loObj=CREATEOBJECT("_bzip2_Archiver")


*************************************************************
* Vlastní třída pro pakování a rozpakování
*************************************************************
DEFINE CLASS _bzip2_Archiver AS Custom
   Name="_bzip2_Archiver"
  
   * Dekompresní metoda
   PROCEDURE Decompress(loPack)
      * loPack - Objekt pro rozpakování
      LOCAL lcDir,lcProgram,lctmpFile,liz,lcStartupInfo,lcProcessInfo,liRet
      LOCAL ARRAY laDir(1)
      
      lctmpFile=loPack.File_S && Převezmi název zdrojového souboru (zkomprimovaného)
      lcDir=ExtractPathFromFile(lctmpFile) + CHR(0) && Zjisti adresář, kde se nachází zkomprimovaný soubor

      * Vytvoř C++ strukturu z VFP objektu
      lcStartupInfo=loPack.SI.CreateString()
      lcProcessInfo=loPack.PI.CreateString()

      lcProgram = loPack.PU.D_File+" -d "+lctmpFile+" -fk" + CHR(0)
      =SetLastError(0) && Resetuj chybu pro vlákno
      liRet=_PP_ProcessFailed
      IF CreateProcess(.NULL., lcProgram, 0, 0, 1,  NORMAL_PRIORITY_CLASS, 0, @lcDir, @lcStartupInfo, @lcProcessInfo)#0
         * Výborně neselhalo to
         loPack.PI.ReadString(@lcProcessInfo) && Načti informace o spuštěném procesu.
         * Nyní běhej ve smyčce tak dlouho, dokud proces běží
         DO WHILE WaitForSingleObject(loPack.PI.hProcess, 250 ) = WAIT_TIMEOUT

         ENDDO
         =CloseHandle(loPack.PI.hProcess) && Uzavři handle
         * Přejmenuj soubor na požadovaný název
         liRet=IIF(MoveFile((lctmpFile+".out"+CHR(0)),(loPack.File_D+CHR(0)))=1,_PP_ErrOK,_PP_PAUNFailed)
         IF FILE(lctmpFile+".out") && Pokud tam soubor zůstal
            DELE FILE (lctmpFile+".out") && Pak jej smaž
         ENDIF
      ENDIF
      RETURN liRet
   ENDPROC

   * Kompresní metoda
   PROCEDURE Compress(loPack)
      * loPack - Objekt pro zpakování

      LOCAL lcDir,lcProgram,lcStartupInfo,lcProcessInfo,liRet,liExitCode

      lcDir=ExtractPathFromFile(loPack.File_S) + CHR(0) && Zjisti adresář, kde se nachází soubor pro komprimaci
      lcProgram = loPack.PU.C_File+" -zfk9 "+loPack.File_S + CHR(0)

      * Vytvoř C++ strukturu z VFP objektu
      lcStartupInfo=loPack.SI.CreateString()
      lcProcessInfo=loPack.PI.CreateString()

      =SetLastError(0) && Resetuj chybu pro vlákno 
      liRet=_PP_ProcessFailed
      IF CreateProcess(.NULL., lcProgram, 0, 0, 1, NORMAL_PRIORITY_CLASS, 0, @lcDir, @lcStartupInfo, @lcProcessInfo)#0
         * Výborně neselhalo to
         loPack.PI.ReadString(@lcProcessInfo) && Načti informace o spuštěném procesu.

         * Nyní běhej ve smyčce tak dlouho, dokud proces běží
         liExitCode=STILL_ACTIVE
         DO WHILE liExitCode=STILL_ACTIVE
            =Sleep(500) && Počkej půl vteřiny
            =GetExitCodeProcess(loPack.PI.hProcess,@liExitCode ) && Zjisti návratový hodnotu z procesu
         ENDDO

         =CloseHandle(loPack.PI.hProcess) && Uzavři handle
         * Nyní přemlasknu výstupní soubor novým jménem
         loPack.File_D=loPack.File_S+".bz2"
         liRet=_PP_ErrOK
      ENDIF
      RETURN liRet
   ENDPROC
ENDDEFIN