diff options
Diffstat (limited to 'src/SFileCompactArchive.cpp')
-rw-r--r-- | src/SFileCompactArchive.cpp | 78 |
1 files changed, 37 insertions, 41 deletions
diff --git a/src/SFileCompactArchive.cpp b/src/SFileCompactArchive.cpp index 004ca7d..f408419 100644 --- a/src/SFileCompactArchive.cpp +++ b/src/SFileCompactArchive.cpp @@ -7,6 +7,7 @@ /* -------- ---- --- ------- */ /* 14.04.03 1.00 Lad Splitted from SFileCreateArchiveEx.cpp */ /* 19.11.03 1.01 Dan Big endian handling */ +/* 21.04.13 1.02 Dea Compact callback now part of TMPQArchive */ /*****************************************************************************/ #define __STORMLIB_SELF__ @@ -14,15 +15,6 @@ #include "StormCommon.h" /*****************************************************************************/ -/* Local variables */ -/*****************************************************************************/ - -static SFILE_COMPACT_CALLBACK CompactCB = NULL; -static ULONGLONG CompactBytesProcessed = 0; -static ULONGLONG CompactTotalBytes = 0; -static void * pvUserData = NULL; - -/*****************************************************************************/ /* Local functions */ /*****************************************************************************/ @@ -37,8 +29,8 @@ static int CheckIfAllFilesKnown(TMPQArchive * ha, const char * szListFile, LPDWO if(nError == ERROR_SUCCESS && szListFile != NULL) { // Notify the user - if(CompactCB != NULL) - CompactCB(pvUserData, CCB_CHECKING_FILES, CompactBytesProcessed, CompactTotalBytes); + if(ha->aCompactCB != NULL) + ha->aCompactCB(ha->pvCompactUserData, CCB_CHECKING_FILES, ha->CompactBytesProcessed, ha->CompactTotalBytes); nError = SFileAddListFile((HANDLE)ha, szListFile); } @@ -81,6 +73,7 @@ static int CheckIfAllFilesKnown(TMPQArchive * ha, const char * szListFile, LPDWO } static int CopyNonMpqData( + TMPQArchive * ha, TFileStream * pSrcStream, TFileStream * pTrgStream, ULONGLONG & ByteOffset, @@ -114,10 +107,10 @@ static int CopyNonMpqData( } // Update the progress - if(CompactCB != NULL) + if(ha->aCompactCB != NULL) { - CompactBytesProcessed += dwToRead; - CompactCB(pvUserData, CCB_COPYING_NON_MPQ_DATA, CompactBytesProcessed, CompactTotalBytes); + ha->CompactBytesProcessed += dwToRead; + ha->aCompactCB(ha->pvCompactUserData, CCB_COPYING_NON_MPQ_DATA, ha->CompactBytesProcessed, ha->CompactTotalBytes); } // Decrement the number of data to be copied @@ -199,10 +192,10 @@ static int CopyMpqFileSectors( } // Update compact progress - if(CompactCB != NULL) + if(ha->aCompactCB != NULL) { - CompactBytesProcessed += dwSectorOffsLen; - CompactCB(pvUserData, CCB_COMPACTING_FILES, CompactBytesProcessed, CompactTotalBytes); + ha->CompactBytesProcessed += dwSectorOffsLen; + ha->aCompactCB(ha->pvCompactUserData, CCB_COMPACTING_FILES, ha->CompactBytesProcessed, ha->CompactTotalBytes); } STORM_FREE(SectorOffsetsCopy); @@ -257,10 +250,10 @@ static int CopyMpqFileSectors( } // Update compact progress - if(CompactCB != NULL) + if(ha->aCompactCB != NULL) { - CompactBytesProcessed += dwRawDataInSector; - CompactCB(pvUserData, CCB_COMPACTING_FILES, CompactBytesProcessed, CompactTotalBytes); + ha->CompactBytesProcessed += dwRawDataInSector; + ha->aCompactCB(ha->pvCompactUserData, CCB_COMPACTING_FILES, ha->CompactBytesProcessed, ha->CompactTotalBytes); } // Adjust byte counts @@ -285,10 +278,10 @@ static int CopyMpqFileSectors( nError = GetLastError(); // Update compact progress - if(CompactCB != NULL) + if(ha->aCompactCB != NULL) { - CompactBytesProcessed += dwCrcLength; - CompactCB(pvUserData, CCB_COMPACTING_FILES, CompactBytesProcessed, CompactTotalBytes); + ha->CompactBytesProcessed += dwCrcLength; + ha->aCompactCB(ha->pvCompactUserData, CCB_COMPACTING_FILES, ha->CompactBytesProcessed, ha->CompactTotalBytes); } // Size of the CRC block is also included in the compressed file size @@ -444,10 +437,17 @@ static int CopyMpqFiles(TMPQArchive * ha, LPDWORD pFileKeys, TFileStream * pNewS /* Public functions */ /*****************************************************************************/ -bool WINAPI SFileSetCompactCallback(HANDLE /* hMpq */, SFILE_COMPACT_CALLBACK aCompactCB, void * pvData) +bool WINAPI SFileSetCompactCallback(HANDLE hMpq, SFILE_COMPACT_CALLBACK aCompactCB, void * pvData) { - CompactCB = aCompactCB; - pvUserData = pvData; + TMPQArchive * ha = (TMPQArchive *) hMpq; + + if (!IsValidMpqHandle(ha)) { + SetLastError(ERROR_INVALID_HANDLE); + return false; + } + + ha->aCompactCB = aCompactCB; + ha->pvCompactUserData = pvData; return true; } @@ -491,8 +491,8 @@ bool WINAPI SFileCompactArchive(HANDLE hMpq, const char * szListFile, bool /* bR if(nError == ERROR_SUCCESS) { // Initialize the progress variables for compact callback - FileStream_GetSize(ha->pStream, &CompactTotalBytes); - CompactBytesProcessed = 0; + FileStream_GetSize(ha->pStream, &(ha->CompactTotalBytes)); + ha->CompactBytesProcessed = 0; nError = CheckIfAllFilesKnown(ha, szListFile, pFileKeys); } @@ -514,12 +514,12 @@ bool WINAPI SFileCompactArchive(HANDLE hMpq, const char * szListFile, bool /* bR if(nError == ERROR_SUCCESS && ha->UserDataPos != 0) { // Inform the application about the progress - if(CompactCB != NULL) - CompactCB(pvUserData, CCB_COPYING_NON_MPQ_DATA, CompactBytesProcessed, CompactTotalBytes); + if(ha->aCompactCB != NULL) + ha->aCompactCB(ha->pvCompactUserData, CCB_COPYING_NON_MPQ_DATA, ha->CompactBytesProcessed, ha->CompactTotalBytes); ByteOffset = 0; ByteCount = ha->UserDataPos; - nError = CopyNonMpqData(ha->pStream, pTempStream, ByteOffset, ByteCount); + nError = CopyNonMpqData(ha, ha->pStream, pTempStream, ByteOffset, ByteCount); } // Write the MPQ user data (if any) @@ -533,7 +533,7 @@ bool WINAPI SFileCompactArchive(HANDLE hMpq, const char * szListFile, bool /* bR assert(ha->pUserData != NULL); assert(ha->pUserData->dwHeaderOffs == ByteCount); - nError = CopyNonMpqData(ha->pStream, pTempStream, ByteOffset, ByteCount); + nError = CopyNonMpqData(ha, ha->pStream, pTempStream, ByteOffset, ByteCount); } // Write the MPQ header @@ -548,7 +548,7 @@ bool WINAPI SFileCompactArchive(HANDLE hMpq, const char * szListFile, bool /* bR BSWAP_TMPQHEADER(ha->pHeader); // Update the progress - CompactBytesProcessed += ha->pHeader->dwHeaderSize; + ha->CompactBytesProcessed += ha->pHeader->dwHeaderSize; } // Now copy all files @@ -576,18 +576,14 @@ bool WINAPI SFileCompactArchive(HANDLE hMpq, const char * szListFile, bool /* bR // nError = SaveMPQTables(ha); - if(nError == ERROR_SUCCESS && CompactCB != NULL) + if(nError == ERROR_SUCCESS && ha->aCompactCB != NULL) { - CompactBytesProcessed += (ha->pHeader->dwHashTableSize * sizeof(TMPQHash)); - CompactBytesProcessed += (ha->pHeader->dwBlockTableSize * sizeof(TMPQBlock)); - CompactCB(pvUserData, CCB_CLOSING_ARCHIVE, CompactBytesProcessed, CompactTotalBytes); + ha->CompactBytesProcessed += (ha->pHeader->dwHashTableSize * sizeof(TMPQHash)); + ha->CompactBytesProcessed += (ha->pHeader->dwBlockTableSize * sizeof(TMPQBlock)); + ha->aCompactCB(ha->pvCompactUserData, CCB_CLOSING_ARCHIVE, ha->CompactBytesProcessed, ha->CompactTotalBytes); } } - // Invalidate the compact callback - pvUserData = NULL; - CompactCB = NULL; - // Cleanup and return if(pTempStream != NULL) FileStream_Close(pTempStream); |