aboutsummaryrefslogtreecommitdiff
path: root/dep/CascLib/src/CascFindFile.cpp
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2019-08-10 19:01:24 +0200
committerShauren <shauren.trinity@gmail.com>2019-08-10 19:01:24 +0200
commitcd720efbfa60f434f420ab66e220eca742c48e45 (patch)
tree3c960ac5249d0711b71fbfdc62f6c0b665ed85ee /dep/CascLib/src/CascFindFile.cpp
parent0d6320dfd3932865edb69c8528327b767bd476ef (diff)
Dep/CascLib: Update to ladislav-zezula/CascLib@b91f87c770c78340dcd96df970e55b5c0469e884
Diffstat (limited to 'dep/CascLib/src/CascFindFile.cpp')
-rw-r--r--dep/CascLib/src/CascFindFile.cpp70
1 files changed, 41 insertions, 29 deletions
diff --git a/dep/CascLib/src/CascFindFile.cpp b/dep/CascLib/src/CascFindFile.cpp
index 129403188c5..f33541f07d0 100644
--- a/dep/CascLib/src/CascFindFile.cpp
+++ b/dep/CascLib/src/CascFindFile.cpp
@@ -24,49 +24,52 @@ static void ResetFindData(PCASC_FIND_DATA pFindData)
pFindData->szFileName[0] = 0;
pFindData->szPlainName = pFindData->szFileName;
pFindData->TagBitMask = 0;
+ pFindData->FileSize = CASC_INVALID_SIZE64;
pFindData->dwFileDataId = CASC_INVALID_ID;
- pFindData->dwFileSize = CASC_INVALID_SIZE;
pFindData->dwLocaleFlags = CASC_INVALID_ID;
pFindData->dwContentFlags = CASC_INVALID_ID;
+ pFindData->dwSpanCount = 1;
pFindData->NameType = CascNameFull;
pFindData->bFileAvailable = false;
- pFindData->bCanOpenByName = false;
- pFindData->bCanOpenByDataId = false;
- pFindData->bCanOpenByCKey = false;
- pFindData->bCanOpenByEKey = false;
}
-static void SupplyFakeFileName(PCASC_FIND_DATA pFindData)
+static void SupplyFakeFileName(PCASC_FIND_DATA pFindData, PCASC_CKEY_ENTRY pCKeyEntry)
{
- // If the file can be open by file data id, create fake file name
- if(pFindData->bCanOpenByDataId)
+ // If there is a file data ID, create fake file name
+ if(pFindData->dwFileDataId != CASC_INVALID_ID)
{
CascStrPrintf(pFindData->szFileName, _countof(pFindData->szFileName), "FILE%08X.dat", pFindData->dwFileDataId);
pFindData->NameType = CascNameDataId;
return;
}
- // If the file can be open by CKey, convert the CKey to file name
- if(pFindData->bCanOpenByCKey)
+ // If there is a CKey, convert the CKey to file name
+ if(pCKeyEntry->Flags & CASC_CE_HAS_CKEY)
{
StringFromBinary(pFindData->CKey, MD5_HASH_SIZE, pFindData->szFileName);
pFindData->NameType = CascNameCKey;
return;
}
- // CKey should be always present
- StringFromBinary(pFindData->EKey, MD5_HASH_SIZE, pFindData->szFileName);
- pFindData->NameType = CascNameEKey;
- assert(pFindData->bCanOpenByEKey != false);
+ // EKey should be always present
+ if(pCKeyEntry->Flags & CASC_CE_HAS_EKEY)
+ {
+ StringFromBinary(pFindData->EKey, MD5_HASH_SIZE, pFindData->szFileName);
+ pFindData->NameType = CascNameEKey;
+ return;
+ }
+
+ assert(false);
}
static bool CopyCKeyEntryToFindData(PCASC_FIND_DATA pFindData, PCASC_CKEY_ENTRY pCKeyEntry)
{
+ ULONGLONG ContentSize = 0;
+ ULONGLONG EncodedSize = 0;
+
// Supply both keys
CopyMemory16(pFindData->CKey, pCKeyEntry->CKey);
CopyMemory16(pFindData->EKey, pCKeyEntry->EKey);
- pFindData->bCanOpenByCKey = (pCKeyEntry->Flags & CASC_CE_HAS_CKEY) ? true : false;
- pFindData->bCanOpenByEKey = (pCKeyEntry->Flags & CASC_CE_HAS_EKEY) ? true : false;
// Supply the tag mask
pFindData->TagBitMask = pCKeyEntry->TagBitMask;
@@ -77,15 +80,21 @@ static bool CopyCKeyEntryToFindData(PCASC_FIND_DATA pFindData, PCASC_CKEY_ENTRY
// If we retrieved the file size directly from the root provider, use it
// Otherwise, supply EncodedSize or ContentSize, whichever is available (but ContentSize > EncodedSize)
- if(pFindData->dwFileSize == CASC_INVALID_SIZE)
- pFindData->dwFileSize = pCKeyEntry->ContentSize;
+ pFindData->dwSpanCount = GetFileSpanInfo(pCKeyEntry, &ContentSize, &EncodedSize);
+ if(pFindData->FileSize == CASC_INVALID_SIZE64)
+ {
+ if(ContentSize != CASC_INVALID_SIZE64)
+ pFindData->FileSize = ContentSize;
+ else
+ pFindData->FileSize = EncodedSize;
+ }
// Set flag indicating that the file is locally available
pFindData->bFileAvailable = (pCKeyEntry->Flags & CASC_CE_FILE_IS_LOCAL);
// Supply a fake file name, if there is none supplied by the root handler
if(pFindData->szFileName[0] == 0)
- SupplyFakeFileName(pFindData);
+ SupplyFakeFileName(pFindData, pCKeyEntry);
return true;
}
@@ -127,9 +136,12 @@ static bool DoStorageSearch_CKey(TCascSearch * pSearch, PCASC_FIND_DATA pFindDat
// Check for CKeys that haven't been found yet
while(pSearch->nFileIndex < nTotalItems)
{
- // Locate the n-th CKey entry. If this entry is not referenced by the root handler, we include it in the search result
+ // Locate the n-th CKey entry.
pCKeyEntry = (PCASC_CKEY_ENTRY)hs->CKeyArray.ItemAt(pSearch->nFileIndex++);
- if((pCKeyEntry->Flags & CASC_CE_FOLDER_ENTRY) == 0 && pCKeyEntry->RefCount == 0)
+// BREAK_ON_XKEY3(pCKeyEntry->CKey, 0x2B, 0xfc, 0xe4);
+
+ // Only report files that are unreferenced by the ROOT handler
+ if(pCKeyEntry->IsFile() && pCKeyEntry->RefCount == 0)
{
return CopyCKeyEntryToFindData(pFindData, pCKeyEntry);
}
@@ -189,31 +201,31 @@ HANDLE WINAPI CascFindFirstFile(
{
TCascStorage * hs;
TCascSearch * pSearch = NULL;
- int nError = ERROR_SUCCESS;
+ DWORD dwErrCode = ERROR_SUCCESS;
// Check parameters
if((hs = TCascStorage::IsValid(hStorage)) == NULL)
- nError = ERROR_INVALID_HANDLE;
+ dwErrCode = ERROR_INVALID_HANDLE;
if(szMask == NULL || pFindData == NULL)
- nError = ERROR_INVALID_PARAMETER;
+ dwErrCode = ERROR_INVALID_PARAMETER;
// Init the search structure and search handle
- if(nError == ERROR_SUCCESS)
+ if(dwErrCode == ERROR_SUCCESS)
{
// Allocate the search handle
pSearch = new TCascSearch(hs, szListFile, szMask);
if(pSearch == NULL)
- nError = ERROR_NOT_ENOUGH_MEMORY;
+ dwErrCode = ERROR_NOT_ENOUGH_MEMORY;
}
// Perform search
- if(nError == ERROR_SUCCESS)
+ if(dwErrCode == ERROR_SUCCESS)
{
if(!DoStorageSearch(pSearch, pFindData))
- nError = ERROR_NO_MORE_FILES;
+ dwErrCode = ERROR_NO_MORE_FILES;
}
- if(nError != ERROR_SUCCESS)
+ if(dwErrCode != ERROR_SUCCESS)
{
delete pSearch;
pSearch = (TCascSearch *)INVALID_HANDLE_VALUE;