diff options
author | Nayd <dnpd.dd@gmail.com> | 2015-01-11 22:12:49 +0000 |
---|---|---|
committer | Nayd <dnpd.dd@gmail.com> | 2015-01-11 23:02:19 +0000 |
commit | 31e3dc2e75459f681480ae09641f1087096dfd69 (patch) | |
tree | 70685fc84efd01d450f8bc06a4cb266e6478b694 /dep/CascLib/src/CascFindFile.cpp | |
parent | 8bbd9133d57fc34b77544cbdd59526ed9ccaa607 (diff) |
Dep/CascLib: Update to https://github.com/ladislav-zezula/CascLib/commit/5d3789af3435534c288c2145e158d422651c7fe1
Closes #13866
Diffstat (limited to 'dep/CascLib/src/CascFindFile.cpp')
-rw-r--r-- | dep/CascLib/src/CascFindFile.cpp | 66 |
1 files changed, 21 insertions, 45 deletions
diff --git a/dep/CascLib/src/CascFindFile.cpp b/dep/CascLib/src/CascFindFile.cpp index f1b14560bed..753e00a90a2 100644 --- a/dep/CascLib/src/CascFindFile.cpp +++ b/dep/CascLib/src/CascFindFile.cpp @@ -72,7 +72,7 @@ static bool VerifyRootEntry(TCascSearch * pSearch, PCASC_ROOT_ENTRY pRootEntry, // dwRootEntries++; // Now try to find that encoding key in the array of encoding keys - QueryKey.pbData = pRootEntry->EncodingKey; + QueryKey.pbData = (LPBYTE)pRootEntry->EncodingKey; QueryKey.cbData = MD5_HASH_SIZE; pEncodingEntry = FindEncodingEntry(hs, &QueryKey, NULL); if(pEncodingEntry == NULL) @@ -94,7 +94,9 @@ static bool VerifyRootEntry(TCascSearch * pSearch, PCASC_ROOT_ENTRY pRootEntry, pFindData->FileNameHash = pRootEntry->FileNameHash; pFindData->dwPackageIndex = 0; pFindData->dwLocaleFlags = pRootEntry->Locales; - pFindData->dwFileSize = ConvertBytesToInteger_4(pEncodingEntry->FileSizeBytes); + + // Fill-in the file size + pFindData->dwFileSize = ConvertBytesToInteger_4(pEncodingEntry->FileSizeBE); return true; } @@ -104,7 +106,7 @@ static TCascSearch * AllocateSearchHandle(TCascStorage * hs, const TCHAR * szLis size_t cbToAllocate; // When using the MNDX info, do not allocate the extra bit array - cbToAllocate = sizeof(TCascSearch) + ((hs->pMndxInfo == NULL) ? (hs->nRootEntries / 8) : 0); + cbToAllocate = sizeof(TCascSearch) + ((hs->pMndxInfo == NULL) ? (hs->RootTable.TableSize / 8) : 0); pSearch = (TCascSearch *)CASC_ALLOC(BYTE, cbToAllocate); if(pSearch != NULL) { @@ -147,53 +149,28 @@ static bool DoStorageSearch_ListFile(TCascSearch * pSearch, PCASC_FIND_DATA pFin { PCASC_ROOT_ENTRY pRootEntry; TCascStorage * hs = pSearch->hs; - size_t RootIndex; + DWORD TableIndex = 0; - for(;;) + // Get next file from the listfile + while(ListFile_GetNext(pSearch->pCache, pSearch->szMask, pSearch->szFileName, MAX_PATH)) { - // Shall we get a new file name from the listfile? - if(pSearch->FileNameHash == 0) +#ifdef _DEBUG + //if(!_stricmp(pSearch->szFileName, "Character\\NightElf\\Female\\NightElf_FemaleFacialLowerHair01_02_HD.blp")) + // DebugBreak(); +#endif + + // Find the root entry + pRootEntry = FindRootEntry(hs, pSearch->szFileName, &TableIndex); + if(pRootEntry != NULL) { - // Try to get next file from the listfile - if(!ListFile_GetNext(pSearch->pCache, pSearch->szMask, pSearch->szFileName, MAX_PATH)) - break; - -// if(!_stricmp(pSearch->szFileName, "Interface\\Glues\\MODELS\\UI_MainMenu_Warlords\\Caustic_MedFreq.blp")) -// DebugBreak(); - - // Normalize the file name - strcpy(pSearch->szNormName, pSearch->szFileName); - NormalizeFileName_UpperBkSlash(pSearch->szNormName); - - // Find the first root entry belonging to this file name - pRootEntry = FindFirstRootEntry(pSearch->hs, pSearch->szNormName, &RootIndex); - if(pRootEntry == NULL) - continue; - - // We have the name now, search all locales - pSearch->FileNameHash = pRootEntry->FileNameHash; - pSearch->RootIndex = RootIndex; - } - - // Is the root index in range? - while(pSearch->RootIndex < hs->nRootEntries) - { - // Get the next root entry. If name mismatches, stop searching - pRootEntry = hs->ppRootEntries[pSearch->RootIndex]; - if(pRootEntry->FileNameHash != pSearch->FileNameHash) - break; - // Verify whether the file exists in the storage - if(VerifyRootEntry(pSearch, pRootEntry, pFindData, pSearch->RootIndex++)) + if(VerifyRootEntry(pSearch, pRootEntry, pFindData, TableIndex)) { strcpy(pFindData->szFileName, pSearch->szFileName); pFindData->szPlainName = (char *)GetPlainFileName(pFindData->szFileName); return true; } } - - // Reset the name hash and root index and retry search - pSearch->FileNameHash = 0; } // Listfile search ended @@ -206,13 +183,13 @@ static bool DoStorageSearch_Hash(TCascSearch * pSearch, PCASC_FIND_DATA pFindDat TCascStorage * hs = pSearch->hs; // Check if there is more files with the same name hash - while(pSearch->RootIndex < hs->nRootEntries) + while(pSearch->RootIndex < hs->RootTable.TableSize) { // Get the pointer to the root entry - pRootEntry = hs->ppRootEntries[pSearch->RootIndex]; + pRootEntry = hs->RootTable.TablePtr + pSearch->RootIndex; // Verify if that root entry exists in the CASC storage - // Note that the file name will be there from the previous search + // and was not found before if(VerifyRootEntry(pSearch, pRootEntry, pFindData, pSearch->RootIndex)) { pFindData->szFileName[0] = 0; @@ -242,7 +219,6 @@ static bool DoStorageSearch(TCascSearch * pSearch, PCASC_FIND_DATA pFindData) pSearch->pCache = ListFile_OpenExternal(pSearch->szListFile); // Move the search phase to the listfile searching - pSearch->FileNameHash = 0; pSearch->RootIndex = 0; pSearch->dwState++; @@ -259,7 +235,7 @@ static bool DoStorageSearch(TCascSearch * pSearch, PCASC_FIND_DATA pFindData) return true; // Move to the nameless search state - pSearch->RootIndex = 0; + assert(pSearch->RootIndex == 0); pSearch->dwState++; } |