summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/SFileAddFile.cpp30
-rw-r--r--src/SFileCompactArchive.cpp78
-rw-r--r--src/StormLib.h16
3 files changed, 66 insertions, 58 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..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);
diff --git a/src/StormLib.h b/src/StormLib.h
index a355eb6..a2d5513 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,14 @@ 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
+ 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