summaryrefslogtreecommitdiff
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
parent43033709ea78369d0fe86d1a014e0743ce8bd33b (diff)
AddFile and Compact callback now part of TMPQArchive
Signed-off-by: Lukas Bagaric <deaeod@gmail.com>
-rw-r--r--src/SFileAddFile.cpp30
-rw-r--r--src/SFileCompactArchive.cpp53
-rw-r--r--src/StormLib.h14
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