aboutsummaryrefslogtreecommitdiff
path: root/src/SFileCompactArchive.cpp
diff options
context:
space:
mode:
authorLukas Bagaric <deaeod@gmail.com>2013-04-22 22:55:05 +0200
committerLukas Bagaric <deaeod@gmail.com>2013-04-22 22:55:05 +0200
commit2ab4cbfe957101aa96acb346e7ce1fe55ed8b683 (patch)
tree25ddfa1be579b170430590cc2c77f476134cf304 /src/SFileCompactArchive.cpp
parent43033709ea78369d0fe86d1a014e0743ce8bd33b (diff)
AddFile and Compact callback now part of TMPQArchive
Signed-off-by: Lukas Bagaric <deaeod@gmail.com>
Diffstat (limited to 'src/SFileCompactArchive.cpp')
-rw-r--r--src/SFileCompactArchive.cpp53
1 files changed, 28 insertions, 25 deletions
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);