From dae0b690f796bd421ab69a0219cb1b46095b9f27 Mon Sep 17 00:00:00 2001 From: Zezula Ladislav Date: Wed, 8 Nov 2017 15:31:45 +0100 Subject: [PATCH] + SFileAddListFile and SFileCompactArchive now take "const TCHAR *" instead of "const char *" + Fixed some bugs --- src/FileStream.cpp | 55 ---------- src/SBaseCommon.cpp | 114 +++++++++++++------- src/SBaseFileTable.cpp | 4 +- src/SFileAddFile.cpp | 7 +- src/SFileCompactArchive.cpp | 8 +- src/SFileFindFile.cpp | 10 +- src/SFileGetFileInfo.cpp | 2 +- src/SFileListFile.cpp | 204 ++++++++++++++++++++++-------------- src/SFileOpenFileEx.cpp | 2 +- src/StormCommon.h | 29 +++-- src/StormLib.h | 8 +- test/StormTest.cpp | Bin 171896 -> 346798 bytes test/TLogHelper.cpp | 54 +++++++--- 13 files changed, 279 insertions(+), 218 deletions(-) diff --git a/src/FileStream.cpp b/src/FileStream.cpp index b2370ff..c73223c 100644 --- a/src/FileStream.cpp +++ b/src/FileStream.cpp @@ -2826,58 +2826,3 @@ void FileStream_Close(TFileStream * pStream) STORM_FREE(pStream); } } - -//----------------------------------------------------------------------------- -// Utility functions (ANSI) - -const char * GetPlainFileName(const char * szFileName) -{ - const char * szPlainName = szFileName; - - while(*szFileName != 0) - { - if(*szFileName == '\\' || *szFileName == '/') - szPlainName = szFileName + 1; - szFileName++; - } - - return szPlainName; -} - -void CopyFileName(char * szTarget, const char * szSource, size_t cchLength) -{ - memcpy(szTarget, szSource, cchLength); - szTarget[cchLength] = 0; -} - -//----------------------------------------------------------------------------- -// Utility functions (UNICODE) only exist in the ANSI version of the library -// In ANSI builds, TCHAR = char, so we don't need these functions implemented - -#ifdef _UNICODE -const TCHAR * GetPlainFileName(const TCHAR * szFileName) -{ - const TCHAR * szPlainName = szFileName; - - while(*szFileName != 0) - { - if(*szFileName == '\\' || *szFileName == '/') - szPlainName = szFileName + 1; - szFileName++; - } - - return szPlainName; -} - -void CopyFileName(TCHAR * szTarget, const char * szSource, size_t cchLength) -{ - mbstowcs(szTarget, szSource, cchLength); - szTarget[cchLength] = 0; -} - -void CopyFileName(char * szTarget, const TCHAR * szSource, size_t cchLength) -{ - wcstombs(szTarget, szSource, cchLength); - szTarget[cchLength] = 0; -} -#endif diff --git a/src/SBaseCommon.cpp b/src/SBaseCommon.cpp index aa891df..a131380 100644 --- a/src/SBaseCommon.cpp +++ b/src/SBaseCommon.cpp @@ -93,56 +93,94 @@ unsigned char AsciiToUpperTable_Slash[256] = }; //----------------------------------------------------------------------------- -// Safe string functions +// Safe string functions (for ANSI builds) -void StringCopyA(char * dest, const char * src, size_t nMaxChars) +void StringCopy(char * szTarget, size_t cchTarget, const char * szSource) { - size_t nLength = strlen(src); - - // Don't copy more than nMaxChars - nLength = STORMLIB_MIN(nLength, nMaxChars); - memcpy(dest, src, nLength); - dest[nLength] = 0; -} - -void StringCatA(char * dest, const char * src, size_t nMaxChars) -{ - size_t nLength1 = strlen(dest); - size_t nLength2 = strlen(src); - - // Don't copy more than nMaxChars - if(nLength1 < nMaxChars) + if(cchTarget > 0) { - nLength2 = STORMLIB_MIN(nLength2, (nMaxChars - nLength1)); - memcpy(dest + nLength1, src, nLength2); - dest[nLength1 + nLength2] = 0; + size_t cchSource = strlen(szSource); + + if(cchSource >= cchTarget) + cchSource = cchTarget - 1; + + memcpy(szTarget, szSource, cchSource); + szTarget[cchSource] = 0; } } -void StringCopyT(TCHAR * dest, const TCHAR * src, size_t nMaxChars) +void StringCat(char * szTarget, size_t cchTargetMax, const char * szSource) { - size_t nLength = _tcslen(src); + // Get the current length of the target + size_t cchTarget = strlen(szTarget); - // Don't copy more than nMaxChars - nLength = STORMLIB_MIN(nLength, nMaxChars); - memcpy(dest, src, (nLength * sizeof(TCHAR))); - dest[nLength] = 0; -} - -void StringCatT(TCHAR * dest, const TCHAR * src, size_t nMaxChars) -{ - size_t nLength1 = _tcslen(dest); - size_t nLength2 = _tcslen(src); - - // Don't copy more than nMaxChars - if(nLength1 < nMaxChars) + // Copy the string to the target + if(cchTarget < cchTargetMax) { - nLength2 = STORMLIB_MIN(nLength2, (nMaxChars - nLength1)); - memcpy(dest + nLength1, src, (nLength2 * sizeof(TCHAR))); - dest[nLength1 + nLength2] = 0; + StringCopy(szTarget + cchTarget, (cchTargetMax - cchTarget), szSource); } } +//----------------------------------------------------------------------------- +// Utility functions (UNICODE) only exist in the ANSI version of the library +// In ANSI builds, TCHAR = char, so we don't need these functions implemented + +#ifdef _UNICODE +void StringCopy(TCHAR * szTarget, size_t cchTarget, const char * szSource) +{ + if(cchTarget > 0) + { + size_t cchSource = strlen(szSource); + + if(cchSource >= cchTarget) + cchSource = cchTarget - 1; + + mbstowcs(szTarget, szSource, cchSource); + szTarget[cchSource] = 0; + } +} + +void StringCopy(char * szTarget, size_t cchTarget, const TCHAR * szSource) +{ + if(cchTarget > 0) + { + size_t cchSource = _tcslen(szSource); + + if(cchSource >= cchTarget) + cchSource = cchTarget - 1; + + wcstombs(szTarget, szSource, cchSource); + szTarget[cchSource] = 0; + } +} + +void StringCopy(TCHAR * szTarget, size_t cchTarget, const TCHAR * szSource) +{ + if(cchTarget > 0) + { + size_t cchSource = _tcslen(szSource); + + if(cchSource >= cchTarget) + cchSource = cchTarget - 1; + + memcpy(szTarget, szSource, cchSource * sizeof(TCHAR)); + szTarget[cchSource] = 0; + } +} + +void StringCat(TCHAR * szTarget, size_t cchTargetMax, const TCHAR * szSource) +{ + // Get the current length of the target + size_t cchTarget = _tcslen(szTarget); + + // Copy the string to the target + if(cchTarget < cchTargetMax) + { + StringCopy(szTarget + cchTarget, (cchTargetMax - cchTarget), szSource); + } +} +#endif + //----------------------------------------------------------------------------- // Storm hashing functions diff --git a/src/SBaseFileTable.cpp b/src/SBaseFileTable.cpp index 39ba125..1cb469e 100644 --- a/src/SBaseFileTable.cpp +++ b/src/SBaseFileTable.cpp @@ -891,8 +891,8 @@ TMPQBlock * TranslateBlockTable( TFileEntry * pFileEntry = ha->pFileTable; TMPQBlock * pBlockTable; TMPQBlock * pBlock; - DWORD dwBlockTableSize = ha->pHeader->dwBlockTableSize; DWORD NeedHiBlockTable = 0; + DWORD dwBlockTableSize = ha->pHeader->dwBlockTableSize; // Allocate copy of the hash table pBlockTable = pBlock = STORM_ALLOC(TMPQBlock, dwBlockTableSize); @@ -2617,7 +2617,7 @@ int DefragmentFileTable(TMPQArchive * ha) pTarget++; // Update the block table size - dwBlockTableSize = (DWORD)(pSource - ha->pFileTable) + 1; + dwBlockTableSize = (DWORD)(pTarget - ha->pFileTable); } else { diff --git a/src/SFileAddFile.cpp b/src/SFileAddFile.cpp index 376813b..7dd583f 100644 --- a/src/SFileAddFile.cpp +++ b/src/SFileAddFile.cpp @@ -451,12 +451,11 @@ int SFileAddFile_Init( } else { - // Free all internal files - (listfile), (attributes), (signature) - InvalidateInternalFiles(ha); - // Attempt to allocate new file entry pFileEntry = AllocateFileEntry(ha, szFileName, lcLocale, &dwHashIndex); - if(pFileEntry == NULL) + if(pFileEntry != NULL) + InvalidateInternalFiles(ha); + else nError = ERROR_DISK_FULL; } diff --git a/src/SFileCompactArchive.cpp b/src/SFileCompactArchive.cpp index 2895baa..ff7b25b 100644 --- a/src/SFileCompactArchive.cpp +++ b/src/SFileCompactArchive.cpp @@ -46,7 +46,7 @@ static int CheckIfAllFilesKnown(TMPQArchive * ha) return nError; } -static int CheckIfAllKeysKnown(TMPQArchive * ha, const char * szListFile, LPDWORD pFileKeys) +static int CheckIfAllKeysKnown(TMPQArchive * ha, const TCHAR * szListFile, LPDWORD pFileKeys) { TFileEntry * pFileTableEnd = ha->pFileTable + ha->dwFileTableSize; TFileEntry * pFileEntry; @@ -523,7 +523,7 @@ bool WINAPI SFileSetCompactCallback(HANDLE hMpq, SFILE_COMPACT_CALLBACK pfnCompa return true; } -bool WINAPI SFileCompactArchive(HANDLE hMpq, const char * szListFile, bool /* bReserved */) +bool WINAPI SFileCompactArchive(HANDLE hMpq, const TCHAR * szListFile, bool /* bReserved */) { TFileStream * pTempStream = NULL; TMPQArchive * ha = (TMPQArchive *)hMpq; @@ -568,8 +568,8 @@ bool WINAPI SFileCompactArchive(HANDLE hMpq, const char * szListFile, bool /* bR if(nError == ERROR_SUCCESS) { // Create temporary file name. Prevent buffer overflow - StringCopyT(szTempFile, FileStream_GetFileName(ha->pStream), MAX_PATH); - StringCatT(szTempFile, _T(".tmp"), MAX_PATH); + StringCopy(szTempFile, _countof(szTempFile), FileStream_GetFileName(ha->pStream)); + StringCat(szTempFile, _countof(szTempFile), _T(".tmp")); // Create temporary file pTempStream = FileStream_CreateFile(szTempFile, STREAM_PROVIDER_FLAT | BASE_PROVIDER_FILE); diff --git a/src/SFileFindFile.cpp b/src/SFileFindFile.cpp index 3533549..68e769d 100644 --- a/src/SFileFindFile.cpp +++ b/src/SFileFindFile.cpp @@ -190,9 +190,9 @@ static TFileEntry * FindPatchEntry(TMPQArchive * ha, TFileEntry * pFileEntry) szFileName[0] = 0; // Prepare the prefix for the file name - if(ha->pPatchPrefix != NULL) - StringCopyA(szFileName, ha->pPatchPrefix->szPatchPrefix, MAX_PATH); - StringCatA(szFileName, pFileEntry->szFileName, MAX_PATH); + if(ha->pPatchPrefix && ha->pPatchPrefix->nLength) + StringCopy(szFileName, _countof(szFileName), ha->pPatchPrefix->szPatchPrefix); + StringCat(szFileName, _countof(szFileName), pFileEntry->szFileName); // Try to find the file there pTempEntry = GetFileEntryExact(ha, szFileName, 0, NULL); @@ -275,7 +275,7 @@ static bool DoMPQSearch_FileEntry( } // Fill the file name and plain file name - StringCopyA(lpFindFileData->cFileName, szFileName + nPrefixLength, MAX_PATH-1); + StringCopy(lpFindFileData->cFileName, _countof(lpFindFileData->cFileName), szFileName + nPrefixLength); lpFindFileData->szPlainName = (char *)GetPlainFileName(lpFindFileData->cFileName); return true; } @@ -378,7 +378,7 @@ static void FreeMPQSearch(TMPQSearch *& hs) //----------------------------------------------------------------------------- // Public functions -HANDLE WINAPI SFileFindFirstFile(HANDLE hMpq, const char * szMask, SFILE_FIND_DATA * lpFindFileData, const char * szListFile) +HANDLE WINAPI SFileFindFirstFile(HANDLE hMpq, const char * szMask, SFILE_FIND_DATA * lpFindFileData, const TCHAR * szListFile) { TMPQArchive * ha = (TMPQArchive *)hMpq; TMPQSearch * hs = NULL; diff --git a/src/SFileGetFileInfo.cpp b/src/SFileGetFileInfo.cpp index 4f15501..00b76ca 100644 --- a/src/SFileGetFileInfo.cpp +++ b/src/SFileGetFileInfo.cpp @@ -990,7 +990,7 @@ bool WINAPI SFileGetFileName(HANDLE hFile, char * szFileName) if(szFileName != NULL) { const TCHAR * szStreamName = FileStream_GetFileName(hf->pStream); - CopyFileName(szFileName, szStreamName, _tcslen(szStreamName)); + StringCopy(szFileName, MAX_PATH, szStreamName); } nError = ERROR_SUCCESS; } diff --git a/src/SFileListFile.cpp b/src/SFileListFile.cpp index 588eca4..3fa695f 100644 --- a/src/SFileListFile.cpp +++ b/src/SFileListFile.cpp @@ -19,17 +19,26 @@ #define CACHE_BUFFER_SIZE 0x1000 // Size of the cache buffer #define MAX_LISTFILE_SIZE 0x04000000 // Maximum accepted listfile size is about 68 MB +union TListFileHandle +{ + TFileStream * pStream; // Opened local file + HANDLE hFile; // Opened MPQ file +}; + struct TListFileCache { char * szWildCard; // Self-relative pointer to file mask LPBYTE pBegin; // The begin of the listfile cache LPBYTE pPos; // Current position in the cache LPBYTE pEnd; // The last character in the file cache + DWORD dwFlags; // Flags from TMPQArchive // char szWildCard[wildcard_length]; // Followed by the name mask (if any) // char szListFile[listfile_length]; // Followed by the listfile (if any) }; +typedef bool (*LOAD_LISTFILE)(TListFileHandle * pHandle, void * pvBuffer, DWORD cbBuffer, LPDWORD pdwBytesRead); + //----------------------------------------------------------------------------- // Local functions (cache) @@ -45,6 +54,22 @@ static char * CopyListLine(char * szListLine, const char * szFileName) return szListLine; } +static bool LoadListFile_Stream(TListFileHandle * pHandle, void * pvBuffer, DWORD cbBuffer, LPDWORD pdwBytesRead) +{ + ULONGLONG ByteOffset = 0; + bool bResult; + + bResult = FileStream_Read(pHandle->pStream, &ByteOffset, pvBuffer, cbBuffer); + if(bResult) + *pdwBytesRead = cbBuffer; + return bResult; +} + +static bool LoadListFile_MPQ(TListFileHandle * pHandle, void * pvBuffer, DWORD cbBuffer, LPDWORD pdwBytesRead) +{ + return SFileReadFile(pHandle->hFile, pvBuffer, cbBuffer, pdwBytesRead, NULL); +} + static bool FreeListFileCache(TListFileCache * pCache) { // Valid parameter check @@ -53,16 +78,20 @@ static bool FreeListFileCache(TListFileCache * pCache) return true; } -static TListFileCache * CreateListFileCache(HANDLE hListFile, const char * szWildCard) +static TListFileCache * CreateListFileCache( + LOAD_LISTFILE PfnLoadFile, + TListFileHandle * pHandle, + const char * szWildCard, + DWORD dwFileSize, + DWORD dwMaxSize, + DWORD dwFlags) { TListFileCache * pCache = NULL; size_t cchWildCard = 0; DWORD dwBytesRead = 0; - DWORD dwFileSize; // Get the amount of bytes that need to be allocated - dwFileSize = SFileGetFileSize(hListFile, NULL); - if(dwFileSize == 0 || dwFileSize > MAX_LISTFILE_SIZE) + if(dwFileSize == 0 || dwFileSize > dwMaxSize) return NULL; // Append buffer for name mask, if any @@ -75,6 +104,7 @@ static TListFileCache * CreateListFileCache(HANDLE hListFile, const char * szWil { // Clear the entire structure memset(pCache, 0, sizeof(TListFileCache) + cchWildCard); + pCache->dwFlags = dwFlags; // Shall we copy the mask? if(cchWildCard != 0) @@ -87,7 +117,7 @@ static TListFileCache * CreateListFileCache(HANDLE hListFile, const char * szWil pCache->pBegin = (LPBYTE)(pCache + 1) + cchWildCard; // Load the entire listfile to the cache - SFileReadFile(hListFile, pCache->pBegin, dwFileSize, &dwBytesRead, NULL); + PfnLoadFile(pHandle, pCache->pBegin, dwFileSize, &dwBytesRead); if(dwBytesRead != 0) { // Allocate pointers @@ -105,6 +135,68 @@ static TListFileCache * CreateListFileCache(HANDLE hListFile, const char * szWil return pCache; } +static TListFileCache * CreateListFileCache( + HANDLE hMpq, + const TCHAR * szListFile, + const char * szWildCard, + DWORD dwMaxSize, + DWORD dwFlags) +{ + TListFileCache * pCache = NULL; + TListFileHandle ListHandle = {NULL}; + + // Internal listfile: hMPQ must be non NULL and szListFile must be NULL. + // We load the MPQ::(listfile) file + if(hMpq != NULL && szListFile == NULL) + { + DWORD dwFileSize = 0; + + // Open the file from the MPQ + if(SFileOpenFileEx(hMpq, LISTFILE_NAME, 0, &ListHandle.hFile)) + { + // Get the file size and create the listfile cache + dwFileSize = SFileGetFileSize(ListHandle.hFile, NULL); + pCache = CreateListFileCache(LoadListFile_MPQ, &ListHandle, szWildCard, dwFileSize, dwMaxSize, dwFlags); + + // Close the MPQ file + SFileCloseFile(ListHandle.hFile); + } + + // Return the loaded cache + return pCache; + } + + // External listfile: hMpq must be NULL and szListFile must be non-NULL. + // We load the file using TFileStream + if(hMpq == NULL && szListFile != NULL) + { + ULONGLONG FileSize = 0; + + // Open the local file + ListHandle.pStream = FileStream_OpenFile(szListFile, STREAM_FLAG_READ_ONLY); + if(ListHandle.pStream != NULL) + { + // Verify the file size + FileStream_GetSize(ListHandle.pStream, &FileSize); + if(0 < FileSize && FileSize < MAX_LISTFILE_SIZE) + { + pCache = CreateListFileCache(LoadListFile_Stream, &ListHandle, szWildCard, (DWORD)FileSize, dwMaxSize, dwFlags); + } + + // Close the stream + FileStream_Close(ListHandle.pStream); + } + + // Return the loaded cache + return pCache; + } + + // This combination should never happen + SetLastError(ERROR_INVALID_PARAMETER); + assert(false); + return NULL; +} + #ifdef _DEBUG /* TMPQNameCache * CreateNameCache(HANDLE hListFile, const char * szSearchMask) @@ -423,12 +515,14 @@ int SListFileSaveToMpq(TMPQArchive * ha) static int SFileAddArbitraryListFile( TMPQArchive * ha, - HANDLE hListFile) + HANDLE hMpq, + const TCHAR * szListFile, + DWORD dwMaxSize) { TListFileCache * pCache = NULL; // Create the listfile cache for that file - pCache = CreateListFileCache(hListFile, NULL); + pCache = CreateListFileCache(hMpq, szListFile, NULL, dwMaxSize, ha->dwFlags); if(pCache != NULL) { char * szFileName; @@ -449,79 +543,44 @@ static int SFileAddArbitraryListFile( return (pCache != NULL) ? ERROR_SUCCESS : ERROR_FILE_CORRUPT; } -static int SFileAddExternalListFile( - TMPQArchive * ha, - HANDLE hMpq, - const char * szListFile) -{ - HANDLE hListFile; - int nError = ERROR_SUCCESS; - - // Open the external list file - if(!SFileOpenFileEx(hMpq, szListFile, SFILE_OPEN_LOCAL_FILE, &hListFile)) - return GetLastError(); - - // Add the data from the listfile to MPQ - nError = SFileAddArbitraryListFile(ha, hListFile); - SFileCloseFile(hListFile); - return nError; -} - static int SFileAddInternalListFile( TMPQArchive * ha, HANDLE hMpq) { TMPQHash * pFirstHash; TMPQHash * pHash; - HANDLE hListFile; - DWORD dwFileSize; LCID lcSaveLocale = lcFileLocale; - bool bIgnoreListFile = false; + DWORD dwMaxSize = MAX_LISTFILE_SIZE; int nError = ERROR_SUCCESS; // If there is hash table, we need to support multiple listfiles // with different locales (BrooDat.mpq) if(ha->pHashTable != NULL) { + // If the archive is a malformed map, ignore too large listfiles + if(ha->dwFlags & MPQ_FLAG_MALFORMED) + dwMaxSize = 0x40000; + pFirstHash = pHash = GetFirstHashEntry(ha, LISTFILE_NAME); while(nError == ERROR_SUCCESS && pHash != NULL) { // Set the prefered locale to that from list file SFileSetLocale(pHash->lcLocale); - - // Attempt to open the file with that locale - if(SFileOpenFileEx(hMpq, LISTFILE_NAME, 0, &hListFile)) - { - // If the archive is a malformed map, ignore too large listfiles - if(ha->dwFlags & MPQ_FLAG_MALFORMED) - { - dwFileSize = SFileGetFileSize(hListFile, NULL); - bIgnoreListFile = (dwFileSize > 0x40000); - } - // Add the data from the listfile to MPQ - if(bIgnoreListFile == false) - nError = SFileAddArbitraryListFile(ha, hListFile); - SFileCloseFile(hListFile); - } - - // Restore the original locale - SFileSetLocale(lcSaveLocale); + // Add that listfile + nError = SFileAddArbitraryListFile(ha, hMpq, NULL, dwMaxSize); // Move to the next hash pHash = GetNextHashEntry(ha, pFirstHash, pHash); } + + // Restore the original locale + SFileSetLocale(lcSaveLocale); } else { - // Open the external list file - if(SFileOpenFileEx(hMpq, LISTFILE_NAME, 0, &hListFile)) - { - // Add the data from the listfile to MPQ - // The function also closes the listfile handle - nError = SFileAddArbitraryListFile(ha, hListFile); - SFileCloseFile(hListFile); - } + // Add the single listfile + nError = SFileAddArbitraryListFile(ha, hMpq, NULL, dwMaxSize); } // Return the result of the operation @@ -562,7 +621,7 @@ static bool DoListFileSearch(TListFileCache * pCache, SFILE_FIND_DATA * lpFindFi // File functions // Adds a listfile into the MPQ archive. -int WINAPI SFileAddListFile(HANDLE hMpq, const char * szListFile) +int WINAPI SFileAddListFile(HANDLE hMpq, const TCHAR * szListFile) { TMPQArchive * ha = (TMPQArchive *)hMpq; int nError = ERROR_SUCCESS; @@ -571,7 +630,7 @@ int WINAPI SFileAddListFile(HANDLE hMpq, const char * szListFile) while(ha != NULL) { if(szListFile != NULL) - nError = SFileAddExternalListFile(ha, hMpq, szListFile); + nError = SFileAddArbitraryListFile(ha, NULL, szListFile, MAX_LISTFILE_SIZE); else nError = SFileAddInternalListFile(ha, hMpq); @@ -591,37 +650,24 @@ int WINAPI SFileAddListFile(HANDLE hMpq, const char * szListFile) //----------------------------------------------------------------------------- // Enumerating files in listfile -HANDLE WINAPI SListFileFindFirstFile(HANDLE hMpq, const char * szListFile, const char * szMask, SFILE_FIND_DATA * lpFindFileData) +HANDLE WINAPI SListFileFindFirstFile(HANDLE hMpq, const TCHAR * szListFile, const char * szMask, SFILE_FIND_DATA * lpFindFileData) { TListFileCache * pCache = NULL; - HANDLE hListFile = NULL; - DWORD dwSearchScope = SFILE_OPEN_LOCAL_FILE; // Initialize the structure with zeros memset(lpFindFileData, 0, sizeof(SFILE_FIND_DATA)); - // If the szListFile is NULL, it means we have to open internal listfile - if(szListFile == NULL) - { - // Use SFILE_OPEN_ANY_LOCALE for listfile. This will allow us to load - // the listfile even if there is only non-neutral version of the listfile in the MPQ - dwSearchScope = SFILE_OPEN_ANY_LOCALE; - szListFile = LISTFILE_NAME; - } - // Open the local/internal listfile - if(SFileOpenFileEx(hMpq, szListFile, dwSearchScope, &hListFile)) + pCache = CreateListFileCache(hMpq, szListFile, szMask, 0, 0); + if(pCache != NULL) { - pCache = CreateListFileCache(hListFile, szMask); - SFileCloseFile(hListFile); - } - - if(!DoListFileSearch(pCache, lpFindFileData)) - { - memset(lpFindFileData, 0, sizeof(SFILE_FIND_DATA)); - SetLastError(ERROR_NO_MORE_FILES); - FreeListFileCache(pCache); - pCache = NULL; + if(!DoListFileSearch(pCache, lpFindFileData)) + { + memset(lpFindFileData, 0, sizeof(SFILE_FIND_DATA)); + SetLastError(ERROR_NO_MORE_FILES); + FreeListFileCache(pCache); + pCache = NULL; + } } // Return the listfile cache as handle diff --git a/src/SFileOpenFileEx.cpp b/src/SFileOpenFileEx.cpp index 9ce0ae2..6e4af14 100644 --- a/src/SFileOpenFileEx.cpp +++ b/src/SFileOpenFileEx.cpp @@ -75,7 +75,7 @@ static bool OpenLocalFile(const char * szFileName, HANDLE * PtrFile) TCHAR szFileNameT[MAX_PATH]; // Convert the file name to UNICODE (if needed) - CopyFileName(szFileNameT, szFileName, strlen(szFileName)); + StringCopy(szFileNameT, _countof(szFileNameT), szFileName); // Open the file and create the TMPQFile structure pStream = FileStream_OpenFile(szFileNameT, STREAM_FLAG_READ_ONLY); diff --git a/src/StormCommon.h b/src/StormCommon.h index 868f1c1..95b72a3 100644 --- a/src/StormCommon.h +++ b/src/StormCommon.h @@ -133,11 +133,15 @@ extern unsigned char AsciiToUpperTable[256]; //----------------------------------------------------------------------------- // Safe string functions -void StringCopyA(char * dest, const char * src, size_t nMaxChars); -void StringCatA(char * dest, const char * src, size_t nMaxChars); +void StringCopy(char * szTarget, size_t cchTarget, const char * szSource); +void StringCat(char * szTarget, size_t cchTargetMax, const char * szSource); -void StringCopyT(TCHAR * dest, const TCHAR * src, size_t nMaxChars); -void StringCatT(TCHAR * dest, const TCHAR * src, size_t nMaxChars); +#ifdef _UNICODE +void StringCopy(TCHAR * szTarget, size_t cchTarget, const char * szSource); +void StringCopy(char * szTarget, size_t cchTarget, const TCHAR * szSource); +void StringCopy(TCHAR * szTarget, size_t cchTarget, const TCHAR * szSource); +void StringCat(TCHAR * szTarget, size_t cchTargetMax, const TCHAR * szSource); +#endif //----------------------------------------------------------------------------- // Encryption and decryption functions @@ -296,11 +300,20 @@ void Patch_Finalize(TMPQPatcher * pPatcher); bool CheckWildCard(const char * szString, const char * szWildCard); bool IsInternalMpqFileName(const char * szFileName); -const TCHAR * GetPlainFileName(const TCHAR * szFileName); -const char * GetPlainFileName(const char * szFileName); +template +const XCHAR * GetPlainFileName(const XCHAR * szFileName) +{ + const XCHAR * szPlainName = szFileName; -void CopyFileName(TCHAR * szTarget, const char * szSource, size_t cchLength); -void CopyFileName(char * szTarget, const TCHAR * szSource, size_t cchLength); + while(*szFileName != 0) + { + if(*szFileName == '\\' || *szFileName == '/') + szPlainName = szFileName + 1; + szFileName++; + } + + return szPlainName; +} //----------------------------------------------------------------------------- // Internal support for MPQ modifications diff --git a/src/StormLib.h b/src/StormLib.h index 45dda2e..07defcc 100644 --- a/src/StormLib.h +++ b/src/StormLib.h @@ -998,11 +998,11 @@ bool WINAPI SFileCloseArchive(HANDLE hMpq); // Adds another listfile into MPQ. The currently added listfile(s) remain, // so you can use this API to combining more listfiles. // Note that this function is internally called by SFileFindFirstFile -int WINAPI SFileAddListFile(HANDLE hMpq, const char * szListFile); +int WINAPI SFileAddListFile(HANDLE hMpq, const TCHAR * szListFile); // Archive compacting bool WINAPI SFileSetCompactCallback(HANDLE hMpq, SFILE_COMPACT_CALLBACK CompactCB, void * pvUserData); -bool WINAPI SFileCompactArchive(HANDLE hMpq, const char * szListFile, bool bReserved); +bool WINAPI SFileCompactArchive(HANDLE hMpq, const TCHAR * szListFile, bool bReserved); // Changing the maximum file count DWORD WINAPI SFileGetMaxFileCount(HANDLE hMpq); @@ -1058,11 +1058,11 @@ DWORD WINAPI SFileVerifyArchive(HANDLE hMpq); //----------------------------------------------------------------------------- // Functions for file searching -HANDLE WINAPI SFileFindFirstFile(HANDLE hMpq, const char * szMask, SFILE_FIND_DATA * lpFindFileData, const char * szListFile); +HANDLE WINAPI SFileFindFirstFile(HANDLE hMpq, const char * szMask, SFILE_FIND_DATA * lpFindFileData, const TCHAR * szListFile); bool WINAPI SFileFindNextFile(HANDLE hFind, SFILE_FIND_DATA * lpFindFileData); bool WINAPI SFileFindClose(HANDLE hFind); -HANDLE WINAPI SListFileFindFirstFile(HANDLE hMpq, const char * szListFile, const char * szMask, SFILE_FIND_DATA * lpFindFileData); +HANDLE WINAPI SListFileFindFirstFile(HANDLE hMpq, const TCHAR * szListFile, const char * szMask, SFILE_FIND_DATA * lpFindFileData); bool WINAPI SListFileFindNextFile(HANDLE hFind, SFILE_FIND_DATA * lpFindFileData); bool WINAPI SListFileFindClose(HANDLE hFind); diff --git a/test/StormTest.cpp b/test/StormTest.cpp index 4efa8c73c07d8a10ee9ee91617d553fbe0721230..a8ecf775ccf082acede0e191dc777230ad1c04e5 100644 GIT binary patch literal 346798 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

!oH=Z+d+WtS%dH=}Y%%9%-(a(nd5IQlPf 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 %=G1#UGnDb#7?+w+_H)D>{X4+M!xL}FZ9;Ar{ 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 literal 171896 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 W{CtF1y%OzSPd4{}dL*NV?*9YfYYavJ diff --git a/test/TLogHelper.cpp b/test/TLogHelper.cpp index d22b76d..6565578 100644 --- a/test/TLogHelper.cpp +++ b/test/TLogHelper.cpp @@ -16,7 +16,7 @@ class TLogHelper { public: - TLogHelper(const char * szNewMainTitle = NULL, const char * szNewSubTitle1 = NULL, const char * szNewSubTitle2 = NULL); + TLogHelper(const char * szNewMainTitle = NULL, const TCHAR * szNewSubTitle1 = NULL, const TCHAR * szNewSubTitle2 = NULL); ~TLogHelper(); #if defined(UNICODE) || defined(UNICODE) @@ -24,6 +24,7 @@ class TLogHelper // On ANSI builds is TCHAR = char, so we don't need them at all int PrintWithClreol(const TCHAR * szFormat, va_list argList, bool bPrintPrefix, bool bPrintLastError, bool bPrintEndOfLine); void PrintProgress(const TCHAR * szFormat, ...); + void PrintMessage(const TCHAR * szFormat, ...); int PrintErrorVa(const TCHAR * szFormat, ...); int PrintError(const TCHAR * szFormat, const TCHAR * szFileName = NULL); #endif // defined(UNICODE) || defined(UNICODE) @@ -48,9 +49,9 @@ class TLogHelper char * CopyFormatCharacter(char * szBuffer, const char *& szFormat); int GetConsoleWidth(); - const char * szMainTitle; // Title of the text (usually name) - const char * szSubTitle1; // Title of the text (can be name of the tested file) - const char * szSubTitle2; // Title of the text (can be name of the tested file) + const char * szMainTitle; // Title of the text (usually name) + const TCHAR * szSubTitle1; // Title of the text (can be name of the tested file) + const TCHAR * szSubTitle2; // Title of the text (can be name of the tested file) size_t nTextLength; // Length of the previous progress message bool bMessagePrinted; }; @@ -74,7 +75,7 @@ class TLogHelper // Constructor and destructor -TLogHelper::TLogHelper(const char * szNewMainTitle, const char * szNewSubTitle1, const char * szNewSubTitle2) +TLogHelper::TLogHelper(const char * szNewMainTitle, const TCHAR * szNewSubTitle1, const TCHAR * szNewSubTitle2) { UserString = ""; UserCount = 1; @@ -102,12 +103,15 @@ TLogHelper::TLogHelper(const char * szNewMainTitle, const char * szNewSubTitle1, TLogHelper::~TLogHelper() { - const char * szSaveMainTitle = szMainTitle; - const char * szSaveSubTitle1 = szSubTitle1; - const char * szSaveSubTitle2 = szSubTitle2; + const TCHAR * szSaveSubTitle1 = szSubTitle1; + const TCHAR * szSaveSubTitle2 = szSubTitle2; + TCHAR szSaveMainTitle[0x80]; - // Set both to NULL so the won't be printed - szMainTitle = szSubTitle1 = szSubTitle2 = NULL; + // Set both to NULL so they won't be printed + StringCopy(szSaveMainTitle, _countof(szSaveMainTitle), szMainTitle); + szSubTitle1 = NULL; + szSubTitle2 = NULL; + szMainTitle = NULL; // Print the final information if(szSaveMainTitle != NULL && bMessagePrinted == false) @@ -115,11 +119,11 @@ TLogHelper::~TLogHelper() if(bDontPrintResult == false) { if(szSaveSubTitle1 != NULL && szSaveSubTitle2 != NULL) - PrintMessage("%s (%s+%s) succeeded.", szSaveMainTitle, szSaveSubTitle1, szSaveSubTitle2); + PrintMessage(_T("%s (%s+%s) succeeded."), szSaveMainTitle, szSaveSubTitle1, szSaveSubTitle2); else if(szSaveSubTitle1 != NULL) - PrintMessage("%s (%s) succeeded.", szSaveMainTitle, szSaveSubTitle1); + PrintMessage(_T("%s (%s) succeeded."), szSaveMainTitle, szSaveSubTitle1); else - PrintMessage("%s succeeded.", szSaveMainTitle); + PrintMessage(_T("%s succeeded."), szSaveMainTitle); } else { @@ -167,8 +171,10 @@ int TLogHelper::PrintWithClreol(const TCHAR * szFormat, va_list argList, bool bP // Copy the message format itself. Replace %s with "%s", unless it's (%s) if(szFormat != NULL) { - szBuffer = CopyFormatCharacter(szBuffer, szFormat); - szFormat += nLength; + while(szFormat[0] != 0) + { + szBuffer = CopyFormatCharacter(szBuffer, szFormat); + } } // Append the last error @@ -216,6 +222,15 @@ void TLogHelper::PrintProgress(const TCHAR * szFormat, ...) va_end(argList); } +void TLogHelper::PrintMessage(const TCHAR * szFormat, ...) +{ + va_list argList; + + va_start(argList, szFormat); + PrintWithClreol(szFormat, argList, true, false, true); + va_end(argList); +} + int TLogHelper::PrintErrorVa(const TCHAR * szFormat, ...) { va_list argList; @@ -254,7 +269,7 @@ int TLogHelper::PrintWithClreol(const char * szFormat, va_list argList, bool bPr if(szMainTitle != NULL && bPrintPrefix) { while(szMainTitle[nLength] != 0) - *szBuffer++ = szMainTitle[nLength++]; + *szBuffer++ = (char)szMainTitle[nLength++]; *szBuffer++ = ':'; *szBuffer++ = ' '; @@ -337,7 +352,12 @@ int TLogHelper::PrintErrorVa(const char * szFormat, ...) int TLogHelper::PrintError(const char * szFormat, const char * szFileName) { - return PrintErrorVa(szFormat, szFileName); + TCHAR szFileNameT[MAX_PATH]; + TCHAR szFormatT[0x200]; + + StringCopy(szFileNameT, _countof(szFileNameT), szFileName); + StringCopy(szFormatT, _countof(szFormatT), szFormat); + return PrintErrorVa(szFormatT, szFileNameT); } //-----------------------------------------------------------------------------