Compact callback now no longer uses global variables. You should be able to compact different archives on different threads now.

This commit is contained in:
Lukas Bagaric
2013-04-23 23:18:56 +02:00
parent 2ab4cbfe95
commit 426e0bb9c1
2 changed files with 18 additions and 23 deletions

View File

@@ -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);
}
}

View File

@@ -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