UINT CScormEngine::CreatePackage(HWND hWndParent) { // Reset progress (should be zero anyway) m_dwProgress = 0; m_dwCurrentFile = 0; m_bCancelRequested = false; // Create a temporary directory _TCHAR tszPath[MAX_PATH]; _TCHAR tszDirectory[MAX_PATH]; bool success = LIo::CreateTempDir(_T("SCO"), tszPath, tszDirectory); if (success) { m_csBaseTempPath = tszPath; m_csRelTempPath = tszDirectory; m_csTargetDir = m_csBaseTempPath + m_csRelTempPath + CString(_T("\\")); } //MessageBox(hWndParent, tszDirectory, tszPath, MB_OK | MB_ICONINFORMATION); if (success) DefineScormKeywords(); CString csImsManifest; if (success) success = LoadXmlResource(csImsManifest, IDR_XML_IMSMANIFEST); if (success && !m_bCancelRequested) { // Let's write the imsmanifest File. LTextBuffer tbImsManifest(csImsManifest); int nKwCount = m_aGeneralKeywords.GetSize(); for (int i=0; i<nKwCount; ++i) tbImsManifest.ReplaceAll(m_aGeneralKeywords[i], m_aGeneralValues[i]); success = tbImsManifest.SaveFile(m_csTargetDir + _T("imsmanifest.xml"), LFILE_TYPE_TEXT_UTF8, false); // Do not write a UTF8 BOM. } /* CString csScoMetadata; if (success) success = LoadXmlResource(csScoMetadata, IDR_XML_SCOMETADATA); if (success && !m_bCancelRequested) { // And now the scometadata.xml file. LTextBuffer tbScoMetadata(csScoMetadata); int nKwCount = m_aGeneralKeywords.GetSize(); for (int i=0; i<nKwCount; ++i) tbScoMetadata.ReplaceAll(m_aGeneralKeywords[i], m_aGeneralValues[i]); success = tbScoMetadata.SaveFile(m_csTargetDir + _T("scometadata.xml"), LFILE_TYPE_TEXT_UTF8, false); // No UTF8 BOM, thank you. }*/ if (success && !m_bCancelRequested) { CZipArchive zip; CScormZipCallback zipCallback(this); zip.SetCallback(&zipCallback); zip.Open(m_csTargetDir + m_csTargetFile + _T(".zip"), CZipArchive::zipCreate); zip.AddNewFile(m_csTargetDir + _T("imsmanifest.xml"), _T("imsmanifest.xml")); // zip.AddNewFile(m_csTargetDir + _T("scometadata.xml"), _T("scometadata.xml")); zip.AddNewFile(m_csRealIndexFileName, m_csIndexFileName); int nFileCount = m_aSourceFiles.GetSize(); for (int i=0; i<nFileCount; ++i) zip.AddNewFile(m_aSourceFiles[i], m_aTargetFiles[i]); zip.Close(); } if (m_bCancelRequested) return ERROR_CANCELLED; return success ? S_OK : E_FAIL; }
int hb_CmpTdSpan( const char * szFile, PHB_ITEM pArray, int iCompLevel, PHB_ITEM pBlock, BOOL bOverWrite, const char * szPassWord, int iSpanSize, BOOL bPath, BOOL bDrive, PHB_ITEM pProgress ) { ULONG ulCount = 0; const char * szDummy; DWORD dwSize; BOOL bAdded = FALSE; BOOL bReturn = TRUE; BOOL bFileExist = hb_fsFile( szFile ); CZipArchive szZip; SpanCallbackc span; SpanActionCallbackc spanac; szZip.SetSpanCallback( &span ); if( iSpanSize == 0 ) { iSpanSize = 1457664; } try { if( ( bFileExist && bOverWrite ) || ! bFileExist ) { szZip.Open( szFile, CZipArchive::zipCreateSpan, iSpanSize ); } else { bReturn = FALSE; return ( int ) bReturn; } } catch( CZipException ) { bReturn = FALSE; } catch( ... ) { } //if (! bReturn ) //{ if( szPassWord != NULL ) { szZip.SetPassword( szPassWord ); } if( pZipI.szComment != NULL ) { szZip.SetGlobalComment( pZipI.szComment ); hb_xfree( pZipI.szComment ); } if( HB_IS_BLOCK( pProgress ) ) { pProgressInfo = pProgress; szZip.SetCallback( &spanac ); } for( ulCount = 1; ( ulCount <= hb_arrayLen( pArray ) ); ulCount++ ) { szDummy = ( char * ) hb_arrayGetCPtr( pArray, ulCount ); dwSize = GetCurrentFileSize( szDummy ); bAdded = FALSE; if( dwSize != ( DWORD ) -1 ) { if( pBlock != NULL ) { PHB_ITEM FileName = hb_itemPutC( NULL, hb_arrayGetCPtr( pArray, ulCount ) ), FilePos = hb_itemPutNI( NULL, ulCount ); hb_vmEvalBlockV( pBlock, 2, FileName, FilePos ); hb_itemRelease( FileName ); hb_itemRelease( FilePos ); } try { if( bPath && ! bAdded ) { szZip.AddNewFile( szDummy, iCompLevel, true, CZipArchive::zipsmSafeSmart, 65536 ); bAdded = TRUE; } else if( ! bDrive && ! bPath && ! bAdded ) { szZip.AddNewFile( szDummy, iCompLevel, false, CZipArchive::zipsmSafeSmart, 65536 ); } } catch( ... ) { } } } //} try { szZip.Close(); } catch( CZipException ) { bReturn = FALSE; } catch( ... ) { } return ( int ) bReturn; }
int hb_CmpTdSpanStd( char * szFile, char * szFiletoCompress, int iCompLevel, PHB_ITEM pBlock, BOOL bOverWrite, char * szPassWord, int iSpanSize, BOOL bPath, BOOL bDrive, PHB_ITEM pProgress ) { DWORD dwSize; BOOL bAdded = FALSE; BOOL bReturn = TRUE; BOOL bFileExist = hb_fsFile( szFile ); CZipArchive szZip; SpanCallbackc span; SpanActionCallbackc spanac; szZip.SetSpanCallback( &span ); if( iSpanSize == 0 ) { iSpanSize = 1457664; } try { if( ( bFileExist && bOverWrite ) || ! bFileExist ) { szZip.Open( szFile, CZipArchive::zipCreateSpan, iSpanSize ); } else { return ( int ) false; } } catch( CZipException ) { bReturn = FALSE; } catch( ... ) { } if( szPassWord != NULL ) { szZip.SetPassword( szPassWord ); } if( pZipI.szComment != NULL ) { szZip.SetGlobalComment( pZipI.szComment ); hb_xfree( pZipI.szComment ); } if( HB_IS_BLOCK( pProgress ) ) { pProgressInfo = pProgress; szZip.SetCallback( &spanac ); } if( bReturn ) { try { if( szPassWord != NULL ) { szZip.SetPassword( szPassWord ); } dwSize = GetCurrentFileSize( szFiletoCompress ); if( pBlock != NULL ) { PHB_ITEM FileName = hb_itemPutC( NULL, szFiletoCompress ); hb_vmEvalBlockV( pBlock, 1, FileName ); hb_itemRelease( FileName ); } #if defined( __WIN32__ ) || defined( __MINGW32__ ) if( bDrive && ! bAdded ) { if( ! szZip.AddNewFileDrv( szFiletoCompress, iCompLevel, true, CZipArchive::zipsmSafeSmart, 65536 ) ) { bReturn = FALSE; } else { bAdded = TRUE; } } #endif if( bPath && ! bAdded ) { if( ! szZip.AddNewFile( szFiletoCompress, iCompLevel, true, CZipArchive::zipsmSafeSmart, 65536 ) ) { bReturn = FALSE; } else { bAdded = TRUE; } } else if( ! bDrive && ! bPath && ! bAdded ) { if( ! szZip.AddNewFile( szFiletoCompress, iCompLevel, false, CZipArchive::zipsmSafeSmart, 65536 ) ) { bReturn = FALSE; } } } catch( ... ) { } } try { szZip.Close(); } catch( CZipException ) { bReturn = FALSE; } catch( ... ) { } if( pProgressInfo ) { hb_itemRelease( pProgressInfo ); } return ( int ) bReturn; }
int hb_CompressFile( const char * szFile, PHB_ITEM pArray, int iCompLevel, PHB_ITEM pBlock, BOOL bOverWrite, const char * szPassWord, BOOL bPath, BOOL bDrive, PHB_ITEM pProgress ) { ULONG ulCount = 0; const char * szDummy; char * szDummyLower = NULL; char * szFileLower = hb_strdup( ( char * ) szFile ); BOOL bFileExist = hb_fsFile( szFile ); BOOL bAdded = FALSE; BOOL bReturn = TRUE; DWORD dwSize; CZipArchive szZip; SpanCallbackc span; SpanActionCallbackc spanac; szZip.SetSpanCallback( &span ); #ifdef HB_OS_WIN_32 hb_strLower( szFileLower, strlen( szFileLower ) ); #endif try { if( ( bFileExist && bOverWrite ) || ! bFileExist ) { szZip.Open( szFile, CZipArchive::zipCreate, 0 ); } else { szZip.Open( szFile, CZipArchive::zipOpen, 0 ); } } catch( CZipException ) { bReturn = FALSE; } catch( ... ) { } if( bReturn ) { if( szPassWord != NULL ) { szZip.SetPassword( szPassWord ); } if( pZipI.szComment != NULL ) { szZip.SetGlobalComment( pZipI.szComment ); hb_xfree( pZipI.szComment ); } if( HB_IS_BLOCK( pProgress ) ) { pProgressInfo = pProgress; szZip.SetCallback( &spanac ); } for( ulCount = 1; ( ulCount <= hb_arrayLen( pArray ) ); ulCount++ ) { szDummy = ( char * ) hb_arrayGetCPtr( pArray, ulCount ); dwSize = GetCurrentFileSize( szDummy ); bAdded = FALSE; szDummyLower = hb_strdup( ( char * ) szDummy ); #ifdef HB_OS_WIN_32 hb_strLower( szDummyLower, strlen( szDummyLower ) ); #endif // Prevent adding current archive file ! if( strstr( szFileLower, szDummyLower ) == NULL && strstr( szDummyLower, szFileLower ) == NULL ) { if( dwSize != ( DWORD ) -1 ) { if( pBlock != NULL ) { PHB_ITEM FileName = hb_itemPutC( NULL, hb_arrayGetCPtr( pArray, ulCount ) ), FilePos = hb_itemPutNI( NULL, ulCount ); hb_vmEvalBlockV( pBlock, 2, FileName, FilePos ); hb_itemRelease( FileName ); hb_itemRelease( FilePos ); } try { if( bPath && ! bAdded ) { szZip.AddNewFile( szDummy, iCompLevel, true, CZipArchive::zipsmSafeSmart, 65536 ); bAdded = TRUE; } else if( ! bDrive && ! bPath && ! bAdded ) { szZip.AddNewFile( szDummy, iCompLevel, false, CZipArchive::zipsmSafeSmart, 65536 ); } } catch( ... ) { } } } hb_xfree( szDummyLower ); } } hb_xfree( szFileLower ); try { szZip.Close(); } catch( CZipException ) { bReturn = FALSE; } catch( ... ) { } return ( int ) bReturn; }