From ce9936791f325828c2dfba0ad34c12e7bd62a480 Mon Sep 17 00:00:00 2001 From: Viktor Szakats Date: Wed, 3 Sep 2008 09:31:45 +0000 Subject: [PATCH] 2008-09-03 10:28 UTC+0200 Viktor Szakats (harbour.01 syenar hu) * contrib/hbziparch/hbziparc.c * contrib/hbziparch/hbzipnew.cpp % Merged slightly different internal functions, thus removing significant redundancy. Higher level hb_unzipFile(), hb_unzipFileIndex(), hb_unzipAllFile() are now functionally the same, since the only difference was how the file list parameter was handled. ! Removed any remaining Win32 dependency. --- harbour/ChangeLog | 10 + harbour/contrib/hbziparch/hbziparc.c | 637 +++++++++---------------- harbour/contrib/hbziparch/hbzipnew.cpp | 482 ++++--------------- 3 files changed, 348 insertions(+), 781 deletions(-) diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 8649f423ed..864f0cd3bb 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -8,6 +8,16 @@ 2008-12-31 13:59 UTC+0100 Foo Bar (foo.bar foobar.org) */ +2008-09-03 10:28 UTC+0200 Viktor Szakats (harbour.01 syenar hu) + * contrib/hbziparch/hbziparc.c + * contrib/hbziparch/hbzipnew.cpp + % Merged slightly different internal functions, thus + removing significant redundancy. + Higher level hb_unzipFile(), hb_unzipFileIndex(), hb_unzipAllFile() + are now functionally the same, since the only difference was + how the file list parameter was handled. + ! Removed any remaining Win32 dependency. + 2008-09-02 23:37 UTC+0200 Viktor Szakats (harbour.01 syenar hu) * contrib/hbziparch/hbziparc.c * contrib/hbziparch/hbzipnew.cpp diff --git a/harbour/contrib/hbziparch/hbziparc.c b/harbour/contrib/hbziparch/hbziparc.c index d306e531a3..bf64ebe08c 100644 --- a/harbour/contrib/hbziparch/hbziparc.c +++ b/harbour/contrib/hbziparch/hbziparc.c @@ -60,16 +60,13 @@ HB_EXTERN_BEGIN extern void hb_fsDirectory( PHB_ITEM pDir, char * szSkleton, char * szAttributes, BOOL bDirOnly, BOOL bFullPath ); +extern char * hb_FNAddZipExt( const char * szFile ); extern PHB_ITEM hb_GetFileNamesFromZip( char * szFile, BOOL bVerbose ); extern ULONG hb_GetNumberofFilestoUnzip( char * szFile ); extern BOOL hb_TransferFilesFromzip( char * szSource, char * szDest, PHB_ITEM pArray ); extern BOOL hb_SetCallbackFunc( PHB_ITEM pFunc ); -extern BOOL hb_CmpPkSpan( char * szFile, PHB_ITEM pArray, int iCompLevel, PHB_ITEM pBlock, BOOL bOverWrite, char * szPassWord, BOOL bPath, BOOL bDrive, PHB_ITEM pProgress ); -extern BOOL hb_CmpTdSpan( char * szFile, PHB_ITEM pArray, int iCompLevel, PHB_ITEM pBlock, BOOL bOverWrite, char * szPassWord, long iSpanSize, BOOL bPath, BOOL bDrive, PHB_ITEM pProgress ); -extern BOOL hb_CompressFile( char * szFile, PHB_ITEM pArray, int iCompLevel, PHB_ITEM pBlock, BOOL bOverWrite, char * szPassWord, BOOL bPath, BOOL bDrive, PHB_ITEM pProgress ); -extern BOOL hb_UnzipAll( char * szFile, PHB_ITEM pBlock, BOOL bWithPath, char * szPassWord, char * pbyBuffer, PHB_ITEM pDiskBlock, PHB_ITEM pProgress ); -extern BOOL hb_UnzipSel( char * szFile, PHB_ITEM pBlock, BOOL bWithPath, char * szPassWord, const char * szPath, PHB_ITEM pArray, PHB_ITEM pProgress ); -extern BOOL hb_UnzipSelIndex( char * szFile, PHB_ITEM pBlock, BOOL bWithPath, char * szPassWord, char * szPath, PHB_ITEM pSelArray, PHB_ITEM pProgress ); +extern BOOL hb_CompressFile( char * szFile, PHB_ITEM pArray, int iCompLevel, PHB_ITEM pBlock, BOOL bOverwrite, char * szPassword, long iSpanSize, BOOL bPath, BOOL bDrive, PHB_ITEM pProgress, BOOL bSpan ); +extern BOOL hb_Unzip( char * szFile, PHB_ITEM pBlock, BOOL bWithPath, char * szPassword, const char * szPath, PHB_ITEM pArray, PHB_ITEM pProgress ); extern BOOL hb_DeleteSel( char * szFile, PHB_ITEM pArray ); extern int hb_CheckSpanMode( char * szFile ); extern void hb_SetZipBuff( int a, int b, int c ); @@ -80,22 +77,6 @@ extern void hb_SetZipReadOnly( BOOL bRead ); HB_EXTERN_END -static void hb_ClearArchiveFlag( PHB_ITEM pProcFiles ) -{ - ULONG nPos, nLen = hb_arrayLen( pProcFiles ); - - for( nPos = 0; nPos < nLen; nPos++ ) - { - ULONG nAttr; - - hb_fsGetAttr( ( BYTE * ) hb_arrayGetCPtr( pProcFiles, nPos + 1 ), &nAttr ); - /* TOFIX: Doesn't work for some reason. - May be a problem or property of hb_fsSetAttr(). */ - nAttr &= ~HB_FA_ARCHIVE; - hb_fsSetAttr( ( BYTE * ) hb_arrayGetCPtr( pProcFiles, nPos + 1 ), nAttr ); - } -} - static void UnzipCreateArray( const char * szSkleton, PHB_ITEM pProcFiles, PHB_ITEM pZipFiles ) { ULONG nPos, nLen = hb_arrayLen( pZipFiles ); @@ -103,31 +84,31 @@ static void UnzipCreateArray( const char * szSkleton, PHB_ITEM pProcFiles, PHB_I for( nPos = 0; nPos < nLen; nPos++ ) { const char * szEntry = hb_arrayGetCPtr( pZipFiles, nPos + 1 ); - BOOL bOkAdd = TRUE; + BOOL bAdd = TRUE; if( szSkleton ) - bOkAdd = hb_strMatchFile( szEntry, ( const char * ) szSkleton ); + bAdd = hb_strMatchFile( szEntry, ( const char * ) szSkleton ); - if( ! bOkAdd ) + if( ! bAdd ) { PHB_FNAME pFileName = hb_fsFNameSplit( szEntry ); if( pFileName->szName ) { char * pszFile = ( char * ) hb_xgrab( _POSIX_PATH_MAX + 1 ); - pFileName->szPath = ( char * ) ""; + pFileName->szPath = ""; hb_fsFNameMerge( pszFile, pFileName ); - bOkAdd = hb_strMatchFile( szSkleton, pszFile ); + bAdd = hb_strMatchFile( szSkleton, pszFile ); hb_xfree( pszFile ); - if( ! bOkAdd ) - bOkAdd = hb_strMatchFile( szSkleton, szEntry ); + if( ! bAdd ) + bAdd = hb_strMatchFile( szSkleton, szEntry ); } hb_xfree( pFileName ); } - if( bOkAdd ) + if( bAdd ) { PHB_ITEM pTemp = hb_itemPutC( NULL, szEntry ); hb_arrayAddForward( pProcFiles, pTemp ); @@ -197,17 +178,17 @@ static PHB_ITEM ZipCreateExclude( PHB_ITEM pExcludeParam ) { PHB_ITEM pDirFiles = hb_itemNew( NULL ); ULONG nDirPos, nDirLen; - + hb_fsDirectory( pDirFiles, szExclude, NULL, 0, TRUE ); nDirLen = hb_arrayLen( pDirFiles ); - + for( nDirPos = 0; nDirPos < nDirLen; nDirPos++ ) { PHB_ITEM pTemp = hb_itemPutC( NULL, hb_arrayGetCPtr( hb_arrayGetItemPtr( pDirFiles, nDirPos + 1 ), F_NAME ) ); hb_arrayAddForward( pExcludeFiles, pTemp ); hb_itemRelease( pTemp ); } - + hb_itemRelease( pDirFiles ); } else @@ -223,49 +204,49 @@ static PHB_ITEM ZipCreateExclude( PHB_ITEM pExcludeParam ) return pExcludeFiles; } -static PHB_ITEM ZipCreateArray( PHB_ITEM pParam, BOOL bFullPath, PHB_ITEM pExcludeParam ) +static PHB_ITEM ZipCreateArray( PHB_ITEM pParamFiles, BOOL bFullPath, PHB_ITEM pExcludeParam ) { PHB_ITEM pProcFiles = hb_itemArrayNew( 0 ); - if( pParam ) + if( pParamFiles ) { PHB_ITEM pExcludeFiles = ZipCreateExclude( pExcludeParam ); PHB_ITEM pParamArray; PHB_ITEM pDirFiles = hb_itemNew( NULL ); - + ULONG nArrayPos, nArrayLen; - if( HB_IS_STRING( pParam ) ) + if( HB_IS_STRING( pParamFiles ) ) { PHB_ITEM pTemp; - + pParamArray = hb_itemArrayNew( 0 ); - - pTemp = hb_itemPutC( NULL, hb_itemGetCPtr( pParam ) ); + + pTemp = hb_itemPutC( NULL, hb_itemGetCPtr( pParamFiles ) ); hb_arrayAddForward( pParamArray, pTemp ); hb_itemRelease( pTemp ); } else - pParamArray = hb_arrayClone( pParam ); - + pParamArray = hb_arrayClone( pParamFiles ); + nArrayLen = hb_arrayLen( pParamArray ); - + for( nArrayPos = 0; nArrayPos < nArrayLen; nArrayPos++ ) { char * szArrEntry = hb_arrayGetCPtr( pParamArray, nArrayPos + 1 ); - - if( strchr( szArrEntry, '*' ) || + + if( strchr( szArrEntry, '*' ) || strchr( szArrEntry, '?' ) ) { ULONG nPos, nLen; - + hb_fsDirectory( pDirFiles, szArrEntry, NULL, 0, bFullPath ); nLen = hb_arrayLen( pDirFiles ); - + for( nPos = 0; nPos < nLen; nPos++ ) { char * pszEntry = hb_arrayGetCPtr( hb_arrayGetItemPtr( pDirFiles, nPos + 1 ), F_NAME ); - + if( ZipTestExclude( pszEntry, pExcludeFiles ) ) { PHB_ITEM pTemp = hb_itemPutC( NULL, pszEntry ); @@ -273,7 +254,7 @@ static PHB_ITEM ZipCreateArray( PHB_ITEM pParam, BOOL bFullPath, PHB_ITEM pExclu hb_itemRelease( pTemp ); } } - + hb_itemClear( pDirFiles ); } else @@ -283,7 +264,7 @@ static PHB_ITEM ZipCreateArray( PHB_ITEM pParam, BOOL bFullPath, PHB_ITEM pExclu hb_itemRelease( pTemp ); } } - + hb_itemRelease( pParamArray ); hb_itemRelease( pDirFiles ); hb_itemRelease( pExcludeFiles ); @@ -292,20 +273,6 @@ static PHB_ITEM ZipCreateArray( PHB_ITEM pParam, BOOL bFullPath, PHB_ITEM pExclu return pProcFiles; } -static char * hb_FNAddZipExt( const char * szFile ) -{ - PHB_FNAME pZipFileName = hb_fsFNameSplit( szFile ); - char * pszZipFileName = ( char * ) hb_xgrab( _POSIX_PATH_MAX + 1 ); - - if( ! pZipFileName->szExtension ) - pZipFileName->szExtension = ".zip"; - - hb_fsFNameMerge( pszZipFileName, pZipFileName ); - hb_xfree( pZipFileName ); - - return pszZipFileName; -} - /* * $DOC$ * $FUNCNAME$ @@ -411,160 +378,22 @@ HB_FUNC( HB_ZIPFILE ) if( ISCHAR( 1 ) ) { PHB_ITEM pProcFiles = ZipCreateArray( hb_param( 2, HB_IT_STRING | HB_IT_ARRAY ), - ISLOG( 11 ) ? hb_parl( 11 ) : TRUE, + ISLOG( 11 ) ? hb_parl( 11 ) : TRUE, hb_param( 10, HB_IT_STRING | HB_IT_ARRAY ) ); if( hb_arrayLen( pProcFiles ) ) { - char * pszZipFileName = hb_FNAddZipExt( hb_parc( 1 ) ); - - bReturn = hb_CompressFile( pszZipFileName, + bReturn = hb_CompressFile( hb_parc( 1 ), pProcFiles, ISNUM( 3 ) ? hb_parni( 3 ) : -1, hb_param( 4, HB_IT_BLOCK ), hb_parl( 5 ), hb_parc( 6 ), + 0, hb_parl( 7 ), hb_parl( 8 ), - hb_param( 9, HB_IT_BLOCK ) ); - - if( bReturn ) - hb_ClearArchiveFlag( pProcFiles ); - - hb_xfree( pszZipFileName ); - } - - hb_itemRelease( pProcFiles ); - } - - hb_retl( bReturn ); -} - -/* - * $DOC$ - * $FUNCNAME$ - * HB_ZIPFILEBYTDSPAN() - * $CATEGORY$ - * Zip Functions - * $ONELINER$ - * Create a zip file - * $SYNTAX$ - * HB_ZIPFILEBYTDSPAN( , | , , - * , , , , , , - * ) ---> lCompress - * $ARGUMENTS$ - * Name of the zip file - * - * Name of a file to Compress, Drive and/or path - * can be used - * _or_ - * An array containing files to compress, Drive and/or path - * can be used - * - * Compression level ranging from 0 to 9 - * - * Code block to execute while compressing - * - * Toggle to overwrite the file if exists - * - * Password to encrypt the files - * - * Size of the archive, in bytes. Default is 1457664 bytes - * - * Toggle to store the path or not - * - * Toggle to store the Drive letter and path or not - * - * Code block for File Progress - * $RETURNS$ - * .T. if file was create, otherwise .F. - * $DESCRIPTION$ - * This function creates a zip file named . If the extension - * is omitted, .zip will be assumed. If the second parameter is a - * character string, this file will be added to the zip file. If the - * second parameter is an array, all file names contained in - * will be compressed. - * - * If is used, it determines the compression type where 0 means - * no compression and 9 means best compression. - * - * If is used, every time the file is opened to compress it - * will evaluate bBlock. Parameters of bBlock are cFile and nPos. - * - * If is used, it toggles to overwrite or not the existing - * file. Default is to overwrite the file, otherwise if is - * false the new files are added to the . - * - * If is used, it tells thats the path should also be stored ' - * with the file name. Default is false. - * - * If is used, it tells thats the Drive and path should also - * be stored with the file name. Default is false. - * - * If is used, an Code block is evaluated, showing the total - * of that file has being processed. - * The codeblock must be defined as follow {|nPos,nTotal| GaugeUpdate(aGauge1,(nPos/nTotal))} - * $EXAMPLES$ - * FUNCTION MAIN() - * - * IF HB_ZIPFILEBYTDSPAN( "test.zip", "test.prg" ) - * qout( "File was successfully created" ) - * ENDIF - * - * IF HB_ZIPFILEBYTDSPAN( "test1.zip", { "test.prg", "C:\windows\win.ini" } ) - * qout( "File was successfully created" ) - * ENDIF - * - * IF HB_ZIPFILEBYTDSPAN( "test2.zip", { "test.prg", "C:\windows\win.ini" }, 9, {|nPos,cFile| qout(cFile) }, "hello",, 521421 ) - * qout("File was successfully created" ) - * ENDIF - * - * aFiles := { "test.prg", "C:\windows\win.ini" } - * nLen := Len( aFiles ) - * aGauge := GaugeNew( 5, 5, 7, 40, "W/B", "W+/B", "." ) - * GaugeDisplay( aGauge ) - * HB_ZIPFILEBYTDSPAN( "test33.zip", aFiles, 9, {|cFile,nPos| GaugeUpdate( aGauge, nPos/nLen) },, "hello",, 6585452 ) - * Return NIL - * $STATUS$ - * R - * $COMPLIANCE$ - * This function is a Harbour extension - * $PLATFORMS$ - * All - * $FILES$ - * Library is hbziparch.lib - * $END$ - */ - -HB_FUNC( HB_ZIPFILEBYTDSPAN ) -{ - BOOL bReturn = FALSE; - - if( ISCHAR( 1 ) ) - { - PHB_ITEM pProcFiles = ZipCreateArray( hb_param( 2, HB_IT_STRING | HB_IT_ARRAY ), - ISLOG( 12 ) ? hb_parl( 12 ) : TRUE, - hb_param( 11, HB_IT_STRING | HB_IT_ARRAY ) ); - - if( hb_arrayLen( pProcFiles ) ) - { - char * pszZipFileName = hb_FNAddZipExt( hb_parc( 1 ) ); - - bReturn = hb_CmpTdSpan( pszZipFileName, - pProcFiles, - ISNUM( 3 ) ? hb_parni( 3 ) : -1, - hb_param( 4, HB_IT_BLOCK ), - hb_parl( 5 ), - hb_parc( 6 ), - hb_parnl( 7 ), - hb_parl( 8 ), - hb_parl( 9 ), - hb_param( 10, HB_IT_BLOCK ) ); - - if( bReturn ) - hb_ClearArchiveFlag( pProcFiles ); - - hb_xfree( pszZipFileName ); + hb_param( 9, HB_IT_BLOCK ), + FALSE ); } hb_itemRelease( pProcFiles ); @@ -684,27 +513,149 @@ HB_FUNC( HB_ZIPFILEBYPKSPAN ) if( ISCHAR( 1 ) ) { PHB_ITEM pProcFiles = ZipCreateArray( hb_param( 2, HB_IT_STRING | HB_IT_ARRAY ), - ISLOG( 11 ) ? hb_parl( 11 ) : TRUE, + ISLOG( 11 ) ? hb_parl( 11 ) : TRUE, hb_param( 10, HB_IT_STRING | HB_IT_ARRAY ) ); if( hb_arrayLen( pProcFiles ) ) { - char * pszZipFileName = hb_FNAddZipExt( hb_parc( 1 ) ); + bReturn = hb_CompressFile( hb_parc( 1 ), + pProcFiles, + ISNUM( 3 ) ? hb_parni( 3 ) : -1, + hb_param( 4, HB_IT_BLOCK ), + hb_parl( 5 ), + hb_parc( 6 ), + 0, + hb_parl( 7 ), + hb_parl( 8 ), + hb_param( 9, HB_IT_BLOCK ), + TRUE ); + } - bReturn = hb_CmpPkSpan( pszZipFileName, - pProcFiles, - ISNUM( 3 ) ? hb_parni( 3 ) : -1, - hb_param( 4, HB_IT_BLOCK ), - hb_parl( 5 ), - hb_parc( 6 ), - hb_parl( 7 ), - hb_parl( 8 ), - hb_param( 9, HB_IT_BLOCK ) ); + hb_itemRelease( pProcFiles ); + } - if( bReturn ) - hb_ClearArchiveFlag( pProcFiles ); + hb_retl( bReturn ); +} - hb_xfree( pszZipFileName ); +/* + * $DOC$ + * $FUNCNAME$ + * HB_ZIPFILEBYTDSPAN() + * $CATEGORY$ + * Zip Functions + * $ONELINER$ + * Create a zip file + * $SYNTAX$ + * HB_ZIPFILEBYTDSPAN( , | , , + * , , , , , , + * ) ---> lCompress + * $ARGUMENTS$ + * Name of the zip file + * + * Name of a file to Compress, Drive and/or path + * can be used + * _or_ + * An array containing files to compress, Drive and/or path + * can be used + * + * Compression level ranging from 0 to 9 + * + * Code block to execute while compressing + * + * Toggle to overwrite the file if exists + * + * Password to encrypt the files + * + * Size of the archive, in bytes. Default is 1457664 bytes + * + * Toggle to store the path or not + * + * Toggle to store the Drive letter and path or not + * + * Code block for File Progress + * $RETURNS$ + * .T. if file was create, otherwise .F. + * $DESCRIPTION$ + * This function creates a zip file named . If the extension + * is omitted, .zip will be assumed. If the second parameter is a + * character string, this file will be added to the zip file. If the + * second parameter is an array, all file names contained in + * will be compressed. + * + * If is used, it determines the compression type where 0 means + * no compression and 9 means best compression. + * + * If is used, every time the file is opened to compress it + * will evaluate bBlock. Parameters of bBlock are cFile and nPos. + * + * If is used, it toggles to overwrite or not the existing + * file. Default is to overwrite the file, otherwise if is + * false the new files are added to the . + * + * If is used, it tells thats the path should also be stored ' + * with the file name. Default is false. + * + * If is used, it tells thats the Drive and path should also + * be stored with the file name. Default is false. + * + * If is used, an Code block is evaluated, showing the total + * of that file has being processed. + * The codeblock must be defined as follow {|nPos,nTotal| GaugeUpdate(aGauge1,(nPos/nTotal))} + * $EXAMPLES$ + * FUNCTION MAIN() + * + * IF HB_ZIPFILEBYTDSPAN( "test.zip", "test.prg" ) + * qout( "File was successfully created" ) + * ENDIF + * + * IF HB_ZIPFILEBYTDSPAN( "test1.zip", { "test.prg", "C:\windows\win.ini" } ) + * qout( "File was successfully created" ) + * ENDIF + * + * IF HB_ZIPFILEBYTDSPAN( "test2.zip", { "test.prg", "C:\windows\win.ini" }, 9, {|nPos,cFile| qout(cFile) }, "hello",, 521421 ) + * qout("File was successfully created" ) + * ENDIF + * + * aFiles := { "test.prg", "C:\windows\win.ini" } + * nLen := Len( aFiles ) + * aGauge := GaugeNew( 5, 5, 7, 40, "W/B", "W+/B", "." ) + * GaugeDisplay( aGauge ) + * HB_ZIPFILEBYTDSPAN( "test33.zip", aFiles, 9, {|cFile,nPos| GaugeUpdate( aGauge, nPos/nLen) },, "hello",, 6585452 ) + * Return NIL + * $STATUS$ + * R + * $COMPLIANCE$ + * This function is a Harbour extension + * $PLATFORMS$ + * All + * $FILES$ + * Library is hbziparch.lib + * $END$ + */ + +HB_FUNC( HB_ZIPFILEBYTDSPAN ) +{ + BOOL bReturn = FALSE; + + if( ISCHAR( 1 ) ) + { + PHB_ITEM pProcFiles = ZipCreateArray( hb_param( 2, HB_IT_STRING | HB_IT_ARRAY ), + ISLOG( 12 ) ? hb_parl( 12 ) : TRUE, + hb_param( 11, HB_IT_STRING | HB_IT_ARRAY ) ); + + if( hb_arrayLen( pProcFiles ) ) + { + bReturn = hb_CompressFile( hb_parc( 1 ), + pProcFiles, + ISNUM( 3 ) ? hb_parni( 3 ) : -1, + hb_param( 4, HB_IT_BLOCK ), + hb_parl( 5 ), + hb_parc( 6 ), + ISNUM( 7 ) ? hb_parnl( 7 ) : 1457664, + hb_parl( 8 ), + hb_parl( 9 ), + hb_param( 10, HB_IT_BLOCK ), + TRUE ); } hb_itemRelease( pProcFiles ); @@ -788,132 +739,40 @@ HB_FUNC( HB_UNZIPFILE ) if( ISCHAR( 1 ) ) { char * pszZipFileName = hb_FNAddZipExt( hb_parc( 1 ) ); + PHB_ITEM pParamFiles = hb_param( 6, HB_IT_STRING | HB_IT_NUMERIC | HB_IT_ARRAY ); + PHB_ITEM pProcFiles = hb_itemArrayNew( 0 ); + PHB_ITEM pZipFiles = hb_GetFileNamesFromZip( pszZipFileName, FALSE ); + ULONG nZipLen = hb_arrayLen( pZipFiles ); - if( hb_CheckSpanMode( pszZipFileName ) <= 0 ) + if( pParamFiles ) { - PHB_ITEM pUnzip = hb_param( 6, HB_IT_STRING | HB_IT_ARRAY ); - PHB_ITEM pProcFiles = hb_itemArrayNew( 0 ); - PHB_ITEM pZipFiles = hb_GetFileNamesFromZip( pszZipFileName, FALSE ); - - if( ! pUnzip ) - UnzipCreateArray( "*", pProcFiles, pZipFiles ); - else if( HB_IS_ARRAY( pUnzip ) ) + if( HB_IS_ARRAY( pParamFiles ) ) { - ULONG nPos, nLen = hb_arrayLen( pUnzip ); - + ULONG nPos, nLen = hb_arrayLen( pParamFiles ); + for( nPos = 0; nPos < nLen; nPos++ ) - UnzipCreateArray( hb_arrayGetCPtr( pUnzip, nPos + 1 ), pProcFiles, pZipFiles ); + { + HB_TYPE type = hb_arrayGetType( pParamFiles, nPos + 1 ); + + if( type & HB_IT_NUMERIC ) + { + ULONG nZipPos = hb_arrayGetNL( pParamFiles, nPos + 1 ); + + if( nZipPos > 0 && nZipPos <= nZipLen ) + { + PHB_ITEM pTemp = hb_itemPutNL( NULL, nZipPos ); + hb_arrayAddForward( pProcFiles, pTemp ); + hb_itemRelease( pTemp ); + } + } + else if( type & HB_IT_STRING ) + UnzipCreateArray( hb_arrayGetCPtr( pParamFiles, nPos + 1 ), pProcFiles, pZipFiles ); + } } - else - UnzipCreateArray( hb_itemGetCPtr( pUnzip ), pProcFiles, pZipFiles ); - - if( hb_arrayLen( pProcFiles ) ) + else if( HB_IS_NUMERIC( pParamFiles ) ) { - bReturn = hb_UnzipSel( pszZipFileName, - hb_param( 2, HB_IT_BLOCK ), - hb_parl( 3 ), - hb_parc( 4 ), - hb_parc( 5 ), - pProcFiles, - hb_param( 7, HB_IT_BLOCK ) ); - } - - hb_itemRelease( pZipFiles ); - hb_itemRelease( pProcFiles ); - } - - hb_xfree( pszZipFileName ); - } - - hb_retl( bReturn ); -} - -/* - * $DOC$ - * $FUNCNAME$ - * HB_UNZIPFILEINDEX() - * $CATEGORY$ - * Zip Functions - * $ONELINER$ - * Unzip a compressed file referenced by it number in the zipfile - * $SYNTAX$ - * HB_UNZIPFILEINDEX( , , , , , - * | , ) ---> lCompress - * $ARGUMENTS$ - * Name of the zip file - * - * Code block to execute while compressing - * - * Toggle to create directory if needed - * - * Password to use to extract files - * - * Path to extract the files to - mandatory. - * - * | A File or Array of files position to extract - mandatory - * - * Code block for File Progress - * $RETURNS$ - * .T. if all file was successfully restored, otherwise .F. - * $DESCRIPTION$ - * This function restores all files contained inside the . - * If the extension is omitted, .zip will be assumed. If a file already - * exists, it will be overwritten. - * - * If is used, every time the file is opened to compress it - * will evaluate bBlock. Parameters of bBlock are cFile and nPos. - * - * The is a mandatory parameter. Set to ".\" to extract to the - * current dir - * - * If or are not provided, no files will be extracted! - * Make sure you provide the file or files you want extracted - * - * If is used, an Code block is evaluated, showing the total - * of that file has being processed. - * The codeblock must be defined as follow {|nPos,nTotal| GaugeUpdate(aGauge1,(nPos/nTotal))} - * $EXAMPLES$ - * FUNCTION MAIN() - * - * IF HB_UNZIPFILEINDEX( "test.zip",,,, ".\", 1 ) - * qout( "File was successfully created" ) - * ENDIF - * - * IF HB_UNZIPFILEINDEX( "test2.zip", {|cFile| qout(cFile) },,, ".\", { 1, 2 } ) - * qout( "File was successfully created" ) - * ENDIF - * - * Return NIL - * $STATUS$ - * R - * $COMPLIANCE$ - * This function is a Harbour extension - * $PLATFORMS$ - * All - * $FILES$ - * Library is hbziparch.lib - * $END$ - */ - -HB_FUNC( HB_UNZIPFILEINDEX ) -{ - BOOL bReturn = FALSE; - - if( ISCHAR( 1 ) ) - { - PHB_ITEM pDelZip = hb_param( 6, HB_IT_NUMERIC | HB_IT_ARRAY ); - - if( pDelZip ) - { - char * pszZipFileName = hb_FNAddZipExt( hb_parc( 1 ) ); - PHB_ITEM pZipFiles = hb_GetFileNamesFromZip( pszZipFileName, FALSE ); - ULONG nZipLen = hb_arrayLen( pZipFiles ); - PHB_ITEM pProcFiles = hb_itemArrayNew( 0 ); - - if( HB_IS_NUMERIC( pDelZip ) ) - { - ULONG nZipPos = hb_itemGetNL( pDelZip ); - + ULONG nZipPos = hb_itemGetNL( pParamFiles ); + if( nZipPos > 0 && nZipPos <= nZipLen ) { PHB_ITEM pTemp = hb_itemPutNL( NULL, nZipPos ); @@ -922,60 +781,36 @@ HB_FUNC( HB_UNZIPFILEINDEX ) } } else - { - ULONG nPos, nLen = hb_arrayLen( pDelZip ); - - for( nPos = 0; nPos < nLen; nPos++ ) - { - ULONG nZipPos = hb_arrayGetNL( pDelZip, nPos + 1 ); - - if( nZipPos > 0 && nZipPos <= nZipLen ) - { - PHB_ITEM pTemp = hb_itemPutNL( NULL, nZipPos ); - hb_arrayAddForward( pProcFiles, pTemp ); - hb_itemRelease( pTemp ); - } - } - } - - if( hb_arrayLen( pProcFiles ) ) - { - bReturn = hb_UnzipSelIndex( pszZipFileName, - hb_param( 2, HB_IT_BLOCK ), - hb_parl( 3 ), - hb_parc( 4 ), - hb_parc( 5 ), - pProcFiles, - hb_param( 7, HB_IT_BLOCK ) ); - } - - hb_itemRelease( pProcFiles ); - hb_itemRelease( pZipFiles ); - hb_xfree( pszZipFileName ); + UnzipCreateArray( hb_itemGetCPtr( pParamFiles ), pProcFiles, pZipFiles ); } + + if( ! pParamFiles || hb_arrayLen( pProcFiles ) ) + { + bReturn = hb_Unzip( pszZipFileName, + hb_param( 2, HB_IT_BLOCK ), + hb_parl( 3 ), + hb_parc( 4 ), + hb_parc( 5 ), + pParamFiles ? pProcFiles : NULL, + hb_param( 7, HB_IT_BLOCK ) ); + } + + hb_itemRelease( pZipFiles ); + hb_itemRelease( pProcFiles ); + hb_xfree( pszZipFileName ); } hb_retl( bReturn ); } +HB_FUNC( HB_UNZIPFILEINDEX ) +{ + HB_FUNC_EXEC( HB_UNZIPFILE ); +} + HB_FUNC( HB_UNZIPALLFILE ) { - if( ISCHAR( 1 ) ) - { - char * szZipFile = hb_FNAddZipExt( hb_parc( 1 ) ); - - hb_retl( hb_UnzipAll( szZipFile, - hb_param( 2, HB_IT_BLOCK ), - hb_parl( 3 ), - hb_parc( 4 ), - hb_parc( 5 ), - hb_param( 6, HB_IT_BLOCK ), - hb_param( 7, HB_IT_BLOCK ) ) ); - - hb_xfree( szZipFile ); - } - else - hb_retl( FALSE ); + HB_FUNC_EXEC( HB_UNZIPFILE ); } /* $DOC$ @@ -1020,34 +855,34 @@ HB_FUNC( HB_ZIPDELETEFILES ) if( ISCHAR( 1 ) ) { - PHB_ITEM pDelZip = hb_param( 2, HB_IT_STRING | HB_IT_ARRAY | HB_IT_NUMERIC ); + PHB_ITEM pParamFiles = hb_param( 2, HB_IT_STRING | HB_IT_ARRAY | HB_IT_NUMERIC ); - if( pDelZip ) + if( pParamFiles ) { char * pszZipFileName = hb_FNAddZipExt( hb_parc( 1 ) ); PHB_ITEM pZipFiles = hb_GetFileNamesFromZip( pszZipFileName, FALSE ); ULONG nZipLen = hb_arrayLen( pZipFiles ); - + if( nZipLen ) { PHB_ITEM pProcFiles = hb_itemArrayNew( 0 ); - if( HB_IS_STRING( pDelZip ) ) + if( HB_IS_STRING( pParamFiles ) ) { - if( hb_itemGetCLen( pDelZip ) ) - UnzipCreateArray( hb_itemGetCPtr( pDelZip ), pProcFiles, pZipFiles ); + if( hb_itemGetCLen( pParamFiles ) ) + UnzipCreateArray( hb_itemGetCPtr( pParamFiles ), pProcFiles, pZipFiles ); } - else if( HB_IS_ARRAY( pDelZip ) ) + else if( HB_IS_ARRAY( pParamFiles ) ) { - ULONG nPos, nLen = hb_arrayLen( pDelZip ); - + ULONG nPos, nLen = hb_arrayLen( pParamFiles ); + for( nPos = 0; nPos < nLen; nPos++ ) - UnzipCreateArray( hb_arrayGetCPtr( pDelZip, nPos + 1 ), pProcFiles, pZipFiles ); + UnzipCreateArray( hb_arrayGetCPtr( pParamFiles, nPos + 1 ), pProcFiles, pZipFiles ); } - else if( HB_IS_NUMERIC( pDelZip ) ) + else if( HB_IS_NUMERIC( pParamFiles ) ) { - ULONG nZipPos = hb_itemGetNL( pDelZip ); - + ULONG nZipPos = hb_itemGetNL( pParamFiles ); + if( nZipPos > 0 && nZipPos <= nZipLen ) { PHB_ITEM pTemp = hb_itemPutC( NULL, hb_arrayGetCPtr( pZipFiles, nZipPos ) ); @@ -1055,7 +890,7 @@ HB_FUNC( HB_ZIPDELETEFILES ) hb_itemRelease( pTemp ); } } - + if( hb_arrayLen( pProcFiles ) ) bReturn = hb_DeleteSel( pszZipFileName, pProcFiles ); diff --git a/harbour/contrib/hbziparch/hbzipnew.cpp b/harbour/contrib/hbziparch/hbzipnew.cpp index bca9f3126c..b75e6222a2 100644 --- a/harbour/contrib/hbziparch/hbzipnew.cpp +++ b/harbour/contrib/hbziparch/hbzipnew.cpp @@ -50,8 +50,6 @@ * */ -#define HB_OS_WIN_32_USED - #include "hbapi.h" #include "hbapiitm.h" #include "hbapifs.h" @@ -75,6 +73,12 @@ #define HBZA_FI_CRC32 8 #define HBZA_FI_ATTR 9 +#define FILE_ATTRIBUTE_READONLY 0x00000001 +#define FILE_ATTRIBUTE_HIDDEN 0x00000002 +#define FILE_ATTRIBUTE_SYSTEM 0x00000004 +#define FILE_ATTRIBUTE_DIRECTORY 0x00000010 +#define FILE_ATTRIBUTE_ARCHIVE 0x00000020 + typedef struct { int iWrite; @@ -120,6 +124,20 @@ class CHBZipActionCallback : public CZipActionCallback } }; +char * hb_FNAddZipExt( const char * szFile ) +{ + PHB_FNAME pZipFileName = hb_fsFNameSplit( szFile ); + char * pszZipFileName = ( char * ) hb_xgrab( _POSIX_PATH_MAX + 1 ); + + if( ! pZipFileName->szExtension ) + pZipFileName->szExtension = ".zip"; + + hb_fsFNameMerge( pszZipFileName, pZipFileName ); + hb_xfree( pZipFileName ); + + return pszZipFileName; +} + int hb_CheckSpanMode( char * szFile ) { CZipArchive myzip; @@ -295,7 +313,7 @@ PHB_ITEM hb_GetFileNamesFromZip( char * szFile, BOOL bVerbose ) for( nZipFPos = 0; nZipFPos < nZipFCount; nZipFPos++ ) { CZipFileHeader fh; - + myzip.GetFileInfo( fh, nZipFPos ); if( bVerbose ) @@ -328,7 +346,6 @@ PHB_ITEM hb_GetFileNamesFromZip( char * szFile, BOOL bVerbose ) hb_arraySetNL( pTempArray, HBZA_FI_RATIO , iRatio ); } - #if defined( HB_OS_WIN_32 ) { DWORD uAttr = fh.GetSystemAttr(); szAttr[ 0 ] = uAttr & FILE_ATTRIBUTE_READONLY ? 'r' : '-'; @@ -339,12 +356,6 @@ PHB_ITEM hb_GetFileNamesFromZip( char * szFile, BOOL bVerbose ) if( fh.m_uMethod == 0 || uAttr & FILE_ATTRIBUTE_DIRECTORY ) szMethod = "Stored"; } - #else - szAttr[ 0 ] = - szAttr[ 1 ] = - szAttr[ 2 ] = - szAttr[ 3 ] = ' '; - #endif szAttr[ 4 ] = fh.IsEncrypted() ? '*' : ' '; @@ -368,7 +379,7 @@ PHB_ITEM hb_GetFileNamesFromZip( char * szFile, BOOL bVerbose ) break; } } - + hb_arraySetC( pTempArray, HBZA_FI_METHOD, szMethod ); snprintf( szCRC, sizeof( szCRC ), "%8.8lx", ( ULONG ) fh.m_uCrc32 ); @@ -461,19 +472,17 @@ BOOL hb_DeleteSel( char * szFile, PHB_ITEM pArray ) return bReturn; } -BOOL hb_UnzipAll( char * szFile, PHB_ITEM pBlock, BOOL bWithPath, char * szPassword, char * pbyBuffer, PHB_ITEM pDiskBlock, PHB_ITEM pProgress ) +BOOL hb_Unzip( char * szFile, PHB_ITEM pBlock, BOOL bWithPath, char * szPassword, const char * szPath, PHB_ITEM pProcFiles, PHB_ITEM pProgress ) { CZipArchive myzip; CHBZipSegmCallback cb_Segm; BOOL bReturn = hb_zipopenread( &myzip, &cb_Segm, szFile ); - HB_SYMBOL_UNUSED( pDiskBlock ); - if( bReturn ) { CHBZipActionCallback cb_Action; char * pszPath = ( char * ) hb_xgrab( _POSIX_PATH_MAX + 1 ); - ZIP_INDEX_TYPE uiCount; + ZIP_INDEX_TYPE nZipFPos; if( szPassword ) myzip.SetPassword( szPassword ); @@ -484,76 +493,59 @@ BOOL hb_UnzipAll( char * szFile, PHB_ITEM pBlock, BOOL bWithPath, char * szPassw myzip.SetCallback( &cb_Action ); } - hb_strncpy( pszPath, pbyBuffer && strcmp( pbyBuffer, ".\\" ) ? pbyBuffer : "", _POSIX_PATH_MAX ); + hb_strncpy( pszPath, szPath && strcmp( szPath, ".\\" ) ? szPath : "", _POSIX_PATH_MAX ); myzip.SetRootPath( pszPath ); - for( uiCount = 0; uiCount < myzip.GetCount(); uiCount++ ) + if( pProcFiles ) { - CZipFileHeader fh; - myzip.GetFileInfo( fh, uiCount ); - - if( pBlock && HB_IS_BLOCK( pBlock ) ) + ULONG nPos; + + for( nPos = 1; nPos <= hb_arrayLen( pProcFiles ); nPos++ ) { - PHB_ITEM pFileName = hb_itemPutC( NULL, ( char * ) ( LPCTSTR ) fh.GetFileName() ); - PHB_ITEM pFilePos = hb_itemPutNL( NULL, ( LONG ) uiCount ); - hb_vmEvalBlockV( pBlock, 2, pFileName, pFilePos ); - hb_itemRelease( pFileName ); - hb_itemRelease( pFilePos ); - } - - try - { - myzip.SetPassword( szPassword ); - myzip.ExtractFile( uiCount, ( LPCTSTR ) pszPath, bWithPath ? true : false, NULL, 65536 ); - } - catch( ... ) - { - myzip.CloseFile( NULL, true ); + HB_TYPE type = hb_arrayGetType( pProcFiles, nPos ); + + if( type & HB_IT_NUMERIC ) + { + nZipFPos = myzip.FindFile( ( LPCTSTR ) hb_arrayGetCPtr( pProcFiles, nPos ), false ); + + if( nZipFPos == ( ZIP_INDEX_TYPE ) -1 ) + nZipFPos = myzip.FindFile( ( LPCTSTR ) hb_arrayGetCPtr( pProcFiles, nPos ), true ); + } + else if( type & HB_IT_STRING ) + nZipFPos = ( ZIP_INDEX_TYPE ) hb_arrayGetNL( pProcFiles, nPos ) - 1; + else + nZipFPos = ( ZIP_INDEX_TYPE ) -1; + + if( nZipFPos != ( ZIP_INDEX_TYPE ) -1 ) + { + CZipFileHeader fh; + myzip.GetFileInfo( fh, nZipFPos ); + + if( pBlock && HB_IS_BLOCK( pBlock ) ) + { + PHB_ITEM pFileName = hb_itemPutC( NULL, ( char * ) ( LPCTSTR ) fh.GetFileName() ); + PHB_ITEM pFilePos = hb_itemPutNL( NULL, nPos ); + hb_vmEvalBlockV( pBlock, 2, pFileName, pFilePos ); + hb_itemRelease( pFileName ); + hb_itemRelease( pFilePos ); + } + + try + { + myzip.ExtractFile( nZipFPos, ( LPCTSTR ) pszPath, bWithPath ? true : false, NULL, 65536 ); + } + catch( ... ) + { + bReturn = FALSE; + myzip.CloseFile( NULL, true ); + } + } } } - - hb_xfree( pszPath ); - - myzip.Close(); - } - - return bReturn; -} - -BOOL hb_UnzipSel( char * szFile, PHB_ITEM pBlock, BOOL lWithPath, char * szPassword, const char * pbyBuffer, PHB_ITEM pSelArray, PHB_ITEM pProgress ) -{ - CZipArchive myzip; - CHBZipSegmCallback cb_Segm; - BOOL bReturn = hb_zipopenread( &myzip, &cb_Segm, szFile ); - - if( bReturn ) - { - CHBZipActionCallback cb_Action; - char * pszPath = ( char * ) hb_xgrab( _POSIX_PATH_MAX + 1 ); - ULONG nPos; - - if( szPassword ) - myzip.SetPassword( szPassword ); - - if( pProgress && HB_IS_BLOCK( pProgress ) ) + else { - s_hbzaSettings.pProgressBlock = pProgress; - myzip.SetCallback( &cb_Action ); - } - - hb_strncpy( pszPath, pbyBuffer && strcmp( pbyBuffer, ".\\" ) ? pbyBuffer : "", _POSIX_PATH_MAX ); - - myzip.SetRootPath( pszPath ); - - for( nPos = 1; nPos <= hb_arrayLen( pSelArray ); nPos++ ) - { - ZIP_INDEX_TYPE nZipFPos = myzip.FindFile( ( LPCTSTR ) hb_arrayGetCPtr( pSelArray, nPos ), false ); - - if( nZipFPos == ( ZIP_INDEX_TYPE ) -1 ) - nZipFPos = myzip.FindFile( ( LPCTSTR ) hb_arrayGetCPtr( pSelArray, nPos ), true ); - - if( nZipFPos != ( ZIP_INDEX_TYPE ) -1 ) + for( nZipFPos = 0; nZipFPos < myzip.GetCount(); nZipFPos++ ) { CZipFileHeader fh; myzip.GetFileInfo( fh, nZipFPos ); @@ -561,7 +553,7 @@ BOOL hb_UnzipSel( char * szFile, PHB_ITEM pBlock, BOOL lWithPath, char * szPassw if( pBlock && HB_IS_BLOCK( pBlock ) ) { PHB_ITEM pFileName = hb_itemPutC( NULL, ( char * ) ( LPCTSTR ) fh.GetFileName() ); - PHB_ITEM pFilePos = hb_itemPutNI( NULL, nPos ); + PHB_ITEM pFilePos = hb_itemPutNL( NULL, ( LONG ) nZipFPos ); hb_vmEvalBlockV( pBlock, 2, pFileName, pFilePos ); hb_itemRelease( pFileName ); hb_itemRelease( pFilePos ); @@ -569,7 +561,7 @@ BOOL hb_UnzipSel( char * szFile, PHB_ITEM pBlock, BOOL lWithPath, char * szPassw try { - myzip.ExtractFile( nZipFPos, ( LPCTSTR ) pszPath, lWithPath ? true : false, NULL, 65536 ); + myzip.ExtractFile( nZipFPos, ( LPCTSTR ) pszPath, bWithPath ? true : false, NULL, 65536 ); } catch( ... ) { @@ -587,58 +579,6 @@ BOOL hb_UnzipSel( char * szFile, PHB_ITEM pBlock, BOOL lWithPath, char * szPassw return bReturn; } -BOOL hb_UnzipSelIndex( char * szFile, PHB_ITEM pBlock, BOOL lWithPath, char * szPassword, char * pszPath, PHB_ITEM pSelArray, PHB_ITEM pProgress ) -{ - CZipArchive myzip; - CHBZipSegmCallback cb_Segm; - BOOL bReturn = hb_zipopenread( &myzip, &cb_Segm, szFile ); - - if( bReturn ) - { - CHBZipActionCallback cb_Action; - ULONG nPos; - - if( szPassword ) - myzip.SetPassword( szPassword ); - - if( pProgress && HB_IS_BLOCK( pProgress ) ) - { - s_hbzaSettings.pProgressBlock = pProgress; - myzip.SetCallback( &cb_Action ); - } - - for( nPos = 0; nPos <= hb_arrayLen( pSelArray ); nPos++ ) - { - ZIP_INDEX_TYPE nZipFPos = ( ZIP_INDEX_TYPE ) hb_arrayGetNL( pSelArray, nPos ) - 1; - - CZipFileHeader fh; - - myzip.GetFileInfo( fh, nZipFPos ); - - if( pBlock && HB_IS_BLOCK( pBlock ) ) - { - PHB_ITEM pFileName = hb_itemPutC( NULL, ( char * ) ( LPCTSTR ) fh.GetFileName() ); - hb_vmEvalBlockV( pBlock, 1, pFileName ); - hb_itemRelease( pFileName ); - } - - try - { - myzip.ExtractFile( nZipFPos, ( LPCTSTR ) pszPath, lWithPath ? true : false, NULL, 65536 ); - } - catch( ... ) - { - bReturn = FALSE; - myzip.CloseFile( NULL, true ); - } - } - - myzip.Close(); - } - - return bReturn; -} - BOOL hb_TransferFilesFromzip( char * szSource, char * szDest, PHB_ITEM pArray ) { CZipArchive myzipSource; @@ -699,26 +639,25 @@ BOOL hb_TransferFilesFromzip( char * szSource, char * szDest, PHB_ITEM pArray ) return FALSE; } -BOOL hb_CompressFile( char * szFile, PHB_ITEM pArray, int iCompLevel, PHB_ITEM pBlock, BOOL bOverWrite, char * szPassword, BOOL bPath, BOOL bDrive, PHB_ITEM pProgress ) +BOOL hb_CompressFile( char * szFile, PHB_ITEM pProcFiles, int iCompLevel, PHB_ITEM pBlock, BOOL bOverwrite, char * szPassword, long iSpanSize, BOOL bPath, BOOL bDrive, PHB_ITEM pProgress, BOOL bSpan ) { CZipArchive myzip; BOOL bReturn = TRUE; - BOOL bFileExist = hb_fsFileExists( szFile ); - char * szFileLower = hb_strdup( ( char * ) szFile ); + char * pszZipFileName = hb_FNAddZipExt( szFile ); CHBZipSegmCallback cb_Segm; myzip.SetSegmCallback( &cb_Segm ); - #ifdef HB_OS_WIN_32 - hb_strLower( szFileLower, strlen( szFileLower ) ); - #endif - try { - if( ( bFileExist && bOverWrite ) || !bFileExist ) - myzip.Open( szFile, CZipArchive::zipCreate, 0 ); + BOOL bFileExist = hb_fsFileExists( pszZipFileName ); + + if( ( bFileExist && bOverwrite ) || !bFileExist ) + myzip.Open( pszZipFileName, bSpan ? CZipArchive::zipCreateSegm : CZipArchive::zipCreate, bSpan ? iSpanSize : 0 ); + else if( ! bSpan ) + myzip.Open( pszZipFileName, CZipArchive::zipOpen, 0 ); else - myzip.Open( szFile, CZipArchive::zipOpen, 0 ); + bReturn = FALSE; } catch( CZipException ) { @@ -732,6 +671,10 @@ BOOL hb_CompressFile( char * szFile, PHB_ITEM pArray, int iCompLevel, PHB_ITEM p CHBZipActionCallback cb_Action; ULONG nPos; + #ifndef HB_OS_UNIX_COMPATIBLE + hb_strLower( pszZipFileName, strlen( pszZipFileName ) ); + #endif + if( szPassword ) myzip.SetPassword( szPassword ); @@ -747,19 +690,19 @@ BOOL hb_CompressFile( char * szFile, PHB_ITEM pArray, int iCompLevel, PHB_ITEM p myzip.SetCallback( &cb_Action ); } - for( nPos = 1; nPos <= hb_arrayLen( pArray ); nPos++ ) + for( nPos = 1; nPos <= hb_arrayLen( pProcFiles ); nPos++ ) { - const char * szDummy = hb_arrayGetCPtr( pArray, nPos ); - char * szDummyLower = hb_strdup( szDummy ); + const char * szDummy = hb_arrayGetCPtr( pProcFiles, nPos ); + char * pszDummyLower = hb_strdup( szDummy ); - #ifdef HB_OS_WIN_32 - hb_strLower( szDummyLower, strlen( szDummyLower ) ); + #ifndef HB_OS_UNIX_COMPATIBLE + hb_strLower( pszDummyLower, strlen( pszDummyLower ) ); #endif /* Prevent adding current archive file. */ /* TOFIX: strstr() is not suitable for portable filename comparison. */ - if( ! strstr( szFileLower, szDummyLower ) && - ! strstr( szDummyLower, szFileLower ) ) + if( ! strstr( pszZipFileName, pszDummyLower ) && + ! strstr( pszDummyLower, pszZipFileName ) ) { if( hb_fsFileExists( szDummy ) ) { @@ -781,11 +724,11 @@ BOOL hb_CompressFile( char * szFile, PHB_ITEM pArray, int iCompLevel, PHB_ITEM p } } - hb_xfree( szDummyLower ); + hb_xfree( pszDummyLower ); } } - hb_xfree( szFileLower ); + hb_xfree( pszZipFileName ); try { @@ -798,243 +741,22 @@ BOOL hb_CompressFile( char * szFile, PHB_ITEM pArray, int iCompLevel, PHB_ITEM p catch( ... ) {} - return bReturn; -} - -BOOL hb_CompressFileStd( char * szFile, char * szFiletoCompress, int iCompLevel, PHB_ITEM pBlock, BOOL bOverWrite, char * szPassword, BOOL bPath, BOOL bDrive, PHB_ITEM pProgress ) -{ - CZipArchive myzip; - BOOL bReturn = TRUE; - BOOL bFileExist = hb_fsFileExists( szFile ); - - CHBZipSegmCallback cb_Segm; - myzip.SetSegmCallback( &cb_Segm ); - - try - { - if( ( bFileExist && bOverWrite ) || !bFileExist ) - myzip.Open( szFile, CZipArchive::zipCreate, 0 ); - else - myzip.Open( szFile, CZipArchive::zipOpen, 0 ); - } - catch( CZipException ) - { - bReturn = FALSE; - } - - if( bReturn ) - { - CHBZipActionCallback cb_Action; - - if( szPassword ) - myzip.SetPassword( szPassword ); - - if( s_hbzaSettings.pszComment ) - { - myzip.SetGlobalComment( s_hbzaSettings.pszComment ); - hb_xfree( s_hbzaSettings.pszComment ); - } - - if( pProgress && HB_IS_BLOCK( pProgress ) ) - { - s_hbzaSettings.pProgressBlock = pProgress; - myzip.SetCallback( &cb_Action ); - } - - try - { - if( hb_fsFileExists( szFiletoCompress ) ) - { - if( pBlock && HB_IS_BLOCK( pBlock ) ) - { - PHB_ITEM pFileName = hb_itemPutC( NULL, szFiletoCompress ); - hb_vmEvalBlockV( pBlock, 1, pFileName ); - hb_itemRelease( pFileName ); - } - - if( ! myzip.AddNewFile( szFiletoCompress, iCompLevel, ( bDrive || bPath ) ? true : false, CZipArchive::zipsmSafeSmart, 65536 ) ) - bReturn = FALSE; - } - } - catch( ... ) - {} - } - - try - { - myzip.Close(); - } - catch( CZipException ) - { - bReturn = FALSE; - } - catch( ... ) - {} - - return bReturn; -} - -BOOL hb_CmpPkSpan( char * szFile, PHB_ITEM pArray, int iCompLevel, PHB_ITEM pBlock, BOOL bOverWrite, char * szPassword, BOOL bPath, BOOL bDrive, PHB_ITEM pProgress ) -{ - CZipArchive myzip; - BOOL bReturn = TRUE; - BOOL bFileExist = hb_fsFileExists( szFile ); - - CHBZipSegmCallback cb_Segm; - myzip.SetSegmCallback( &cb_Segm ); - - bDrive = FALSE; - - try - { - if( ( bFileExist && bOverWrite ) || !bFileExist ) - myzip.Open( szFile, CZipArchive::zipCreateSegm, 0 ); - else - bReturn = FALSE; - } - catch( CZipException ) - { - bReturn = FALSE; - } - catch( ... ) - {} - if( bReturn ) { - CHBZipActionCallback cb_Action; - ULONG nPos; + ULONG nPos, nLen = hb_arrayLen( pProcFiles ); - if( szPassword ) - myzip.SetPassword( szPassword ); - - if( s_hbzaSettings.pszComment ) + for( nPos = 0; nPos < nLen; nPos++ ) { - myzip.SetGlobalComment( s_hbzaSettings.pszComment ); - hb_xfree( s_hbzaSettings.pszComment ); - } - - if( pProgress && HB_IS_BLOCK( pProgress ) ) - { - s_hbzaSettings.pProgressBlock = pProgress; - myzip.SetCallback( &cb_Action ); - } - - for( nPos = 1; nPos <= hb_arrayLen( pArray ); nPos++ ) - { - if( pBlock && HB_IS_BLOCK( pBlock ) ) - { - PHB_ITEM pFileName = hb_itemPutC( NULL, hb_arrayGetCPtr( pArray, nPos ) ); - PHB_ITEM pFilePos = hb_itemPutNI( NULL, nPos ); - hb_vmEvalBlockV( pBlock, 2, pFileName, pFilePos ); - hb_itemRelease( pFileName ); - hb_itemRelease( pFilePos ); - } - - try - { - myzip.AddNewFile( hb_arrayGetCPtr( pArray, nPos ), iCompLevel, ( bDrive || bPath ) ? true : false, CZipArchive::zipsmSafeSmart, 65536 ); - } - catch( ... ) - {} + ULONG nAttr; + + hb_fsGetAttr( ( BYTE * ) hb_arrayGetCPtr( pProcFiles, nPos + 1 ), &nAttr ); + /* TOFIX: Doesn't work for some reason. + May be a problem or property of hb_fsSetAttr(). */ + nAttr &= ~HB_FA_ARCHIVE; + hb_fsSetAttr( ( BYTE * ) hb_arrayGetCPtr( pProcFiles, nPos + 1 ), nAttr ); } } - try - { - myzip.Close(); - } - catch( CZipException ) - { - bReturn = FALSE; - } - catch( ... ) - {} - - return bReturn; -} - -BOOL hb_CmpTdSpan( char * szFile, PHB_ITEM pArray, int iCompLevel, PHB_ITEM pBlock, BOOL bOverWrite, char * szPassword, long iSpanSize, BOOL bPath, BOOL bDrive, PHB_ITEM pProgress ) -{ - CZipArchive myzip; - BOOL bReturn = TRUE; - BOOL bFileExist = hb_fsFileExists( szFile ); - - CHBZipSegmCallback cb_Segm; - myzip.SetSegmCallback( &cb_Segm ); - - if( iSpanSize == 0 ) - iSpanSize = 1457664; - - try - { - if( ( bFileExist && bOverWrite ) || !bFileExist ) - myzip.Open( szFile, CZipArchive::zipCreateSegm, iSpanSize ); - else - bReturn = FALSE; - } - catch( CZipException ) - { - bReturn = FALSE; - } - catch( ... ) - {} - - if( bReturn ) - { - CHBZipActionCallback cb_Action; - ULONG nPos; - - if( szPassword ) - myzip.SetPassword( szPassword ); - - if( s_hbzaSettings.pszComment ) - { - myzip.SetGlobalComment( s_hbzaSettings.pszComment ); - hb_xfree( s_hbzaSettings.pszComment ); - } - - if( pProgress && HB_IS_BLOCK( pProgress ) ) - { - s_hbzaSettings.pProgressBlock = pProgress; - myzip.SetCallback( &cb_Action ); - } - - for( nPos = 1; nPos <= hb_arrayLen( pArray ); nPos++ ) - { - const char * szDummy = hb_arrayGetCPtr( pArray, nPos ); - - if( hb_fsFileExists( szDummy ) ) - { - if( pBlock && HB_IS_BLOCK( pBlock ) ) - { - PHB_ITEM pFileName = hb_itemPutC( NULL, szDummy ); - PHB_ITEM pFilePos = hb_itemPutNI( NULL, nPos ); - hb_vmEvalBlockV( pBlock, 2, pFileName, pFilePos ); - hb_itemRelease( pFileName ); - hb_itemRelease( pFilePos ); - } - - try - { - myzip.AddNewFile( szDummy, iCompLevel, ( bDrive || bPath ) ? true : false, CZipArchive::zipsmSafeSmart, 65536 ); - } - catch( ... ) - {} - } - } - } - - try - { - myzip.Close(); - } - catch( CZipException ) - { - bReturn = FALSE; - } - catch( ... ) - {} - return bReturn; }