From 2ab4cbfe957101aa96acb346e7ce1fe55ed8b683 Mon Sep 17 00:00:00 2001 From: Lukas Bagaric Date: Mon, 22 Apr 2013 22:55:05 +0200 Subject: AddFile and Compact callback now part of TMPQArchive Signed-off-by: Lukas Bagaric --- src/SFileAddFile.cpp | 30 ++++++++++++++----------- src/SFileCompactArchive.cpp | 53 ++++++++++++++++++++++++--------------------- src/StormLib.h | 14 ++++++++---- 3 files changed, 55 insertions(+), 42 deletions(-) diff --git a/src/SFileAddFile.cpp b/src/SFileAddFile.cpp index 3441b26..9d338b4 100644 --- a/src/SFileAddFile.cpp +++ b/src/SFileAddFile.cpp @@ -6,6 +6,7 @@ /* Date Ver Who Comment */ /* -------- ---- --- ------- */ /* 27.03.10 1.00 Lad Splitted from SFileCreateArchiveEx.cpp */ +/* 21.04.13 1.01 Dea AddFile callback now part of TMPQArchive */ /*****************************************************************************/ #define __STORMLIB_SELF__ @@ -46,8 +47,6 @@ typedef struct _WAVE_FILE_HEADER // Kept here for compatibility with code that was created with StormLib version < 6.50 static DWORD DefaultDataCompression = MPQ_COMPRESSION_PKWARE; -static SFILE_ADDFILE_CALLBACK AddFileCB = NULL; -static void * pvUserData = NULL; //----------------------------------------------------------------------------- // MPQ write data functions @@ -200,8 +199,8 @@ static int WriteDataToMpqFile( } // Call the compact callback, if any - if(AddFileCB != NULL) - AddFileCB(pvUserData, hf->dwFilePos, hf->dwDataSize, false); + if(ha->aAddFileCB != NULL) + ha->aAddFileCB(ha->pvAddFileUserData, hf->dwFilePos, hf->dwDataSize, false); // Update the compressed file size pFileEntry->dwCmpSize += dwBytesInSector; @@ -465,8 +464,8 @@ int SFileAddFile_Init( pFileEntry->FileTime = FileTime; // Call the callback, if needed - if(AddFileCB != NULL) - AddFileCB(pvUserData, 0, hf->dwDataSize, false); + if(ha->aAddFileCB != NULL) + ha->aAddFileCB(ha->pvAddFileUserData, 0, hf->dwDataSize, false); } // If an error occured, remember it @@ -658,8 +657,8 @@ int SFileAddFile_Finish(TMPQFile * hf) if(!hf->bErrorOccured) { // Call the user callback, if any - if(AddFileCB != NULL) - AddFileCB(pvUserData, hf->dwDataSize, hf->dwDataSize, true); + if(ha->aAddFileCB != NULL) + ha->aAddFileCB(ha->pvAddFileUserData, hf->dwDataSize, hf->dwDataSize, true); // Update the size of the block table ha->pHeader->dwBlockTableSize = ha->dwFileTableSize; @@ -673,8 +672,6 @@ int SFileAddFile_Finish(TMPQFile * hf) // Clear the add file callback FreeMPQFile(hf); - pvUserData = NULL; - AddFileCB = NULL; return nError; } @@ -1269,9 +1266,16 @@ bool WINAPI SFileSetFileLocale(HANDLE hFile, LCID lcNewLocale) //----------------------------------------------------------------------------- // Sets add file callback -bool WINAPI SFileSetAddFileCallback(HANDLE /* hMpq */, SFILE_ADDFILE_CALLBACK aAddFileCB, void * pvData) +bool WINAPI SFileSetAddFileCallback(HANDLE hMpq, SFILE_ADDFILE_CALLBACK aAddFileCB, void * pvData) { - pvUserData = pvData; - AddFileCB = aAddFileCB; + TMPQArchive * ha = (TMPQArchive *) hMpq; + + if (!IsValidMpqHandle(ha)) { + SetLastError(ERROR_INVALID_HANDLE); + return false; + } + + ha->pvAddFileUserData = pvData; + ha->aAddFileCB = aAddFileCB; return true; } diff --git a/src/SFileCompactArchive.cpp b/src/SFileCompactArchive.cpp index 004ca7d..d096cb1 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__ @@ -17,10 +18,8 @@ /* Local variables */ /*****************************************************************************/ -static SFILE_COMPACT_CALLBACK CompactCB = NULL; static ULONGLONG CompactBytesProcessed = 0; static ULONGLONG CompactTotalBytes = 0; -static void * pvUserData = NULL; /*****************************************************************************/ /* Local functions */ @@ -37,8 +36,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, CompactBytesProcessed, CompactTotalBytes); nError = SFileAddListFile((HANDLE)ha, szListFile); } @@ -81,6 +80,7 @@ static int CheckIfAllFilesKnown(TMPQArchive * ha, const char * szListFile, LPDWO } static int CopyNonMpqData( + TMPQArchive * ha, TFileStream * pSrcStream, TFileStream * pTrgStream, ULONGLONG & ByteOffset, @@ -114,10 +114,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->aCompactCB(ha->pvCompactUserData, CCB_COPYING_NON_MPQ_DATA, CompactBytesProcessed, CompactTotalBytes); } // Decrement the number of data to be copied @@ -199,10 +199,10 @@ static int CopyMpqFileSectors( } // Update compact progress - if(CompactCB != NULL) + if(ha->aCompactCB != NULL) { CompactBytesProcessed += dwSectorOffsLen; - CompactCB(pvUserData, CCB_COMPACTING_FILES, CompactBytesProcessed, CompactTotalBytes); + ha->aCompactCB(ha->pvCompactUserData, CCB_COMPACTING_FILES, CompactBytesProcessed, CompactTotalBytes); } STORM_FREE(SectorOffsetsCopy); @@ -257,10 +257,10 @@ static int CopyMpqFileSectors( } // Update compact progress - if(CompactCB != NULL) + if(ha->aCompactCB != NULL) { CompactBytesProcessed += dwRawDataInSector; - CompactCB(pvUserData, CCB_COMPACTING_FILES, CompactBytesProcessed, CompactTotalBytes); + ha->aCompactCB(ha->pvCompactUserData, CCB_COMPACTING_FILES, CompactBytesProcessed, CompactTotalBytes); } // Adjust byte counts @@ -285,10 +285,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->aCompactCB(ha->pvCompactUserData, CCB_COMPACTING_FILES, CompactBytesProcessed, CompactTotalBytes); } // Size of the CRC block is also included in the compressed file size @@ -444,10 +444,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; } @@ -514,12 +521,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, CompactBytesProcessed, 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 +540,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 @@ -576,18 +583,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->aCompactCB(ha->pvCompactUserData, CCB_CLOSING_ARCHIVE, CompactBytesProcessed, CompactTotalBytes); } } - // Invalidate the compact callback - pvUserData = NULL; - CompactCB = NULL; - // Cleanup and return if(pTempStream != NULL) FileStream_Close(pTempStream); diff --git a/src/StormLib.h b/src/StormLib.h index a355eb6..68bdac3 100644 --- a/src/StormLib.h +++ b/src/StormLib.h @@ -590,10 +590,10 @@ typedef struct _TMPQBlock // Patch file information, preceding the sector offset table typedef struct _TPatchInfo { - DWORD dwLength; // Length of patch info header, in bytes - DWORD dwFlags; // Flags. 0x80000000 = MD5 (?) - DWORD dwDataSize; // Uncompressed size of the patch file - BYTE md5[0x10]; // MD5 of the entire patch file after decompression + DWORD dwLength; // Length of patch info header, in bytes + DWORD dwFlags; // Flags. 0x80000000 = MD5 (?) + DWORD dwDataSize; // Uncompressed size of the patch file + BYTE md5[0x10]; // MD5 of the entire patch file after decompression // Followed by the sector table (variable length) } TPatchInfo; @@ -744,6 +744,12 @@ typedef struct _TMPQArchive DWORD dwFileFlags2; // Flags for (attributes) DWORD dwAttrFlags; // Flags for the (attributes) file, see MPQ_ATTRIBUTE_XXX DWORD dwFlags; // See MPQ_FLAG_XXXXX + + SFILE_ADDFILE_CALLBACK aAddFileCB; // Callback function for adding files + void * pvAddFileUserData; // User data thats passed to the callback + + SFILE_COMPACT_CALLBACK aCompactCB; // Callback function for compacting the archive + void * pvCompactUserData; // User data thats passed to the callback } TMPQArchive; // File handle structure -- cgit v1.2.3 From 426e0bb9c117fe043873d4c8f67e62a6ef034cf3 Mon Sep 17 00:00:00 2001 From: Lukas Bagaric Date: Tue, 23 Apr 2013 23:18:56 +0200 Subject: Compact callback now no longer uses global variables. You should be able to compact different archives on different threads now. --- src/SFileCompactArchive.cpp | 39 ++++++++++++++++----------------------- src/StormLib.h | 2 ++ 2 files changed, 18 insertions(+), 23 deletions(-) diff --git a/src/SFileCompactArchive.cpp b/src/SFileCompactArchive.cpp index d096cb1..f408419 100644 --- a/src/SFileCompactArchive.cpp +++ b/src/SFileCompactArchive.cpp @@ -14,13 +14,6 @@ #include "StormLib.h" #include "StormCommon.h" -/*****************************************************************************/ -/* Local variables */ -/*****************************************************************************/ - -static ULONGLONG CompactBytesProcessed = 0; -static ULONGLONG CompactTotalBytes = 0; - /*****************************************************************************/ /* Local functions */ /*****************************************************************************/ @@ -37,7 +30,7 @@ static int CheckIfAllFilesKnown(TMPQArchive * ha, const char * szListFile, LPDWO { // Notify the user if(ha->aCompactCB != NULL) - ha->aCompactCB(ha->pvCompactUserData, CCB_CHECKING_FILES, CompactBytesProcessed, CompactTotalBytes); + ha->aCompactCB(ha->pvCompactUserData, CCB_CHECKING_FILES, ha->CompactBytesProcessed, ha->CompactTotalBytes); nError = SFileAddListFile((HANDLE)ha, szListFile); } @@ -116,8 +109,8 @@ static int CopyNonMpqData( // Update the progress if(ha->aCompactCB != NULL) { - CompactBytesProcessed += dwToRead; - ha->aCompactCB(ha->pvCompactUserData, 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 @@ -201,8 +194,8 @@ static int CopyMpqFileSectors( // Update compact progress if(ha->aCompactCB != NULL) { - CompactBytesProcessed += dwSectorOffsLen; - ha->aCompactCB(ha->pvCompactUserData, CCB_COMPACTING_FILES, CompactBytesProcessed, CompactTotalBytes); + ha->CompactBytesProcessed += dwSectorOffsLen; + ha->aCompactCB(ha->pvCompactUserData, CCB_COMPACTING_FILES, ha->CompactBytesProcessed, ha->CompactTotalBytes); } STORM_FREE(SectorOffsetsCopy); @@ -259,8 +252,8 @@ static int CopyMpqFileSectors( // Update compact progress if(ha->aCompactCB != NULL) { - CompactBytesProcessed += dwRawDataInSector; - ha->aCompactCB(ha->pvCompactUserData, CCB_COMPACTING_FILES, CompactBytesProcessed, CompactTotalBytes); + ha->CompactBytesProcessed += dwRawDataInSector; + ha->aCompactCB(ha->pvCompactUserData, CCB_COMPACTING_FILES, ha->CompactBytesProcessed, ha->CompactTotalBytes); } // Adjust byte counts @@ -287,8 +280,8 @@ static int CopyMpqFileSectors( // Update compact progress if(ha->aCompactCB != NULL) { - CompactBytesProcessed += dwCrcLength; - ha->aCompactCB(ha->pvCompactUserData, 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 @@ -498,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); } @@ -522,7 +515,7 @@ bool WINAPI SFileCompactArchive(HANDLE hMpq, const char * szListFile, bool /* bR { // Inform the application about the progress if(ha->aCompactCB != NULL) - ha->aCompactCB(ha->pvCompactUserData, CCB_COPYING_NON_MPQ_DATA, CompactBytesProcessed, CompactTotalBytes); + ha->aCompactCB(ha->pvCompactUserData, CCB_COPYING_NON_MPQ_DATA, ha->CompactBytesProcessed, ha->CompactTotalBytes); ByteOffset = 0; ByteCount = ha->UserDataPos; @@ -555,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 @@ -585,9 +578,9 @@ bool WINAPI SFileCompactArchive(HANDLE hMpq, const char * szListFile, bool /* bR nError = SaveMPQTables(ha); if(nError == ERROR_SUCCESS && ha->aCompactCB != NULL) { - CompactBytesProcessed += (ha->pHeader->dwHashTableSize * sizeof(TMPQHash)); - CompactBytesProcessed += (ha->pHeader->dwBlockTableSize * sizeof(TMPQBlock)); - ha->aCompactCB(ha->pvCompactUserData, 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); } } diff --git a/src/StormLib.h b/src/StormLib.h index 68bdac3..a2d5513 100644 --- a/src/StormLib.h +++ b/src/StormLib.h @@ -750,6 +750,8 @@ typedef struct _TMPQArchive SFILE_COMPACT_CALLBACK aCompactCB; // Callback function for compacting the archive void * pvCompactUserData; // User data thats passed to the callback + ULONGLONG CompactBytesProcessed; // Amount of bytes that have been processed during a particular compact call + ULONGLONG CompactTotalBytes; // Total amount of bytes to be compacted } TMPQArchive; // File handle structure -- cgit v1.2.3