summaryrefslogtreecommitdiff
path: root/src/SFileCompactArchive.cpp
diff options
context:
space:
mode:
authorLadislav <zezula@volny.cz>2013-07-24 23:37:05 -0700
committerLadislav <zezula@volny.cz>2013-07-24 23:37:05 -0700
commit443c92349a38c8ba3b6ac798eb52ce82e5a068bb (patch)
tree6c22431d6358e0104093083071d80694af417841 /src/SFileCompactArchive.cpp
parentd18ad30df72afd78dfa3456e524215bddca7c209 (diff)
parent426e0bb9c117fe043873d4c8f67e62a6ef034cf3 (diff)
Merge pull request #3 from Deaod/master
Make AddFile and Compact callbacks part of TMPQArchive
Diffstat (limited to 'src/SFileCompactArchive.cpp')
-rw-r--r--src/SFileCompactArchive.cpp78
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);