MFTOCEntry *MFFileSystem_GetTocEntry(const char *pFilename, MFTOCEntry *pEntry, int numEntries) { MFCALLSTACK; const char *pSearchString = pFilename; size_t nameLen = MFString_Length(pFilename); bool isDirectory = false; for(size_t a=0; a<nameLen; a++) { if(pFilename[a] == '/') { isDirectory = true; pSearchString = MFStrN(pFilename, a); pFilename += a+1; break; } } for(int a=0; a<numEntries; a++) { if(!MFString_CaseCmp(pSearchString, pEntry[a].pName)) { if(isDirectory) { if(pEntry[a].info.attributes & MFFA_Directory) { return MFFileSystem_GetTocEntry(pFilename, pEntry[a].pChildren, pEntry[a].numChildren); } } else { if(!(pEntry[a].info.attributes & MFFA_Directory)) { return &pEntry[a]; } } } } return NULL; }
MFFile* MFFileSystemZipFile_Open(MFMount *pMount, const char *pFilename, uint32 openFlags) { MFCALLSTACK; MFFile *hFile = NULL; // recurse toc MFTOCEntry *pTOCEntry = MFFileSystem_GetTocEntry(pFilename, pMount->pEntries, pMount->numFiles); if(pTOCEntry) { MFOpenDataZipFile openData; openData.cbSize = sizeof(MFOpenDataZipFile); openData.openFlags = openFlags | MFOF_Zip_AlreadyMounted; openData.pZipArchive = (MFFile*)pMount->pFilesysData; openData.pFilename = MFStr("%s%s", pTOCEntry->pFilesysData ? (char*)pTOCEntry->pFilesysData : "", pTOCEntry->pName); hFile = MFFile_Open(hZipFileSystem, &openData); } return hFile; }