// // Generated By: dol2asm // Translation Unit: JKRFileCache // #include "JSystem/JKernel/JKRFileCache.h" #include "JSystem/JKernel/JKRDvdFile.h" #include "JSystem/JKernel/JKRFileFinder.h" #include "JSystem/JKernel/JKRHeap.h" #include "MSL_C.PPCEABI.bare.H/MSL_Common/src/ctype.h" #include "MSL_C.PPCEABI.bare.H/MSL_Common/src/string.h" #include "dol2asm.h" #include "global.h" // // Forward References: // extern "C" void mount__12JKRFileCacheFPCcP7JKRHeapPCc(); extern "C" void __ct__12JKRFileCacheFPCcPCc(); extern "C" void __dt__12JKRFileCacheFv(); extern "C" void becomeCurrent__12JKRFileCacheFPCc(); extern "C" void getResource__12JKRFileCacheFPCc(); extern "C" void getResource__12JKRFileCacheFUlPCc(); extern "C" void readResource__12JKRFileCacheFPvUlPCc(); extern "C" void readResource__12JKRFileCacheFPvUlUlPCc(); extern "C" void removeResourceAll__12JKRFileCacheFv(); extern "C" void removeResource__12JKRFileCacheFPv(); extern "C" void detachResource__12JKRFileCacheFPv(); extern "C" void getResSize__12JKRFileCacheCFPCv(); extern "C" void countFile__12JKRFileCacheCFPCc(); extern "C" void getFirstFile__12JKRFileCacheCFPCc(); extern "C" void findCacheBlock__12JKRFileCacheCFPCv(); extern "C" void findCacheBlock__12JKRFileCacheCFUl(); extern "C" void findFile__12JKRFileCacheCFPcPCc(); extern "C" void getDvdPathName__12JKRFileCacheCFPCc(); extern "C" void convStrLower__12JKRFileCacheCFPc(); extern "C" void __ct__Q212JKRFileCache11CCacheBlockFUlUlPCv(); extern "C" void getFsResource__12JKRFileCacheFPCc(); extern "C" void getNameResource__12JKRFileCacheFUlPCc(); extern "C" void readFsResource__12JKRFileCacheFPvUlPCc(); extern "C" void readNameResource__12JKRFileCacheFPvUlUlPCc(); extern "C" extern char const* const JKRFileCache__stringBase0; // // External References: // extern "C" void alloc__7JKRHeapFUliP7JKRHeap(); extern "C" void alloc__7JKRHeapFUli(); extern "C" void free__7JKRHeapFPvP7JKRHeap(); extern "C" void free__7JKRHeapFPv(); extern "C" void findFromRoot__7JKRHeapFPv(); extern "C" void* __nw__FUlP7JKRHeapi(); extern "C" void __dl__FPv(); extern "C" void __ct__13JKRFileLoaderFv(); extern "C" void __dt__13JKRFileLoaderFv(); extern "C" void unmount__13JKRFileLoaderFv(); extern "C" void __ct__12JKRDvdFinderFPCc(); extern "C" void read__7JKRFileFPvll(); extern "C" void __ct__10JKRDvdFileFPCc(); extern "C" void __dt__10JKRDvdFileFv(); extern "C" void __ct__10JSUPtrLinkFPv(); extern "C" void __dt__10JSUPtrLinkFv(); extern "C" void __dt__10JSUPtrListFv(); extern "C" void initiate__10JSUPtrListFv(); extern "C" void append__10JSUPtrListFP10JSUPtrLink(); extern "C" void prepend__10JSUPtrListFP10JSUPtrLink(); extern "C" void remove__10JSUPtrListFP10JSUPtrLink(); extern "C" void _savegpr_26(); extern "C" void _savegpr_27(); extern "C" void _savegpr_28(); extern "C" void _savegpr_29(); extern "C" void _restgpr_26(); extern "C" void _restgpr_27(); extern "C" void _restgpr_28(); extern "C" void _restgpr_29(); extern "C" u8 sVolumeList__13JKRFileLoader[12]; extern "C" u8 sSystemHeap__7JKRHeap[4]; extern "C" u8 sCurrentVolume__13JKRFileLoader[4 + 4 /* padding */]; // // Declarations: // /* 802D49B4-802D4AB4 2CF2F4 0100+00 0/0 2/2 0/0 .text mount__12JKRFileCacheFPCcP7JKRHeapPCc */ JKRFileCache* JKRFileCache::mount(const char* path, JKRHeap* heap, const char* param_3) { if (!path || *path != '/') { return NULL; } u32 pathLength = strlen(path); if (pathLength != 1 && path[pathLength - 1] == '/') { return NULL; } JSUList& volumeList = getVolumeList(); JSUListIterator iterator; for (iterator = volumeList.getFirst(); iterator != volumeList.getEnd(); ++iterator) { if (iterator->getVolumeType() == 'CASH') { JKRFileCache* fileCache = (JKRFileCache*)iterator.getObject(); if (fileCache->mRootPath) { if (strcmp(fileCache->mRootPath, path) == 0) { fileCache->mMountCount++; return fileCache; } } } } return new (heap, 0) JKRFileCache(path, param_3); } /* ############################################################################################## */ /* 8039D158-8039D158 0297B8 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */ // #pragma push // #pragma force_active on // SECTION_DEAD static char const* const stringBase_8039D158 = "/"; // SECTION_DEAD static char const* const stringBase_8039D15A = "dvd"; // /* @stringBase0 padding */ // SECTION_DEAD static char const* const pad_8039D15E = "\0"; // #pragma pop /* 802D4AB4-802D4C70 2CF3F4 01BC+00 1/1 0/0 0/0 .text __ct__12JKRFileCacheFPCcPCc */ JKRFileCache::JKRFileCache(const char* path, const char* volume) : mCacheBlockList() { mParentHeap = JKRHeap::findFromRoot(this); mMountCount = 1; mVolumeType = 'CASH'; u32 pathLength = strlen(path); mRootPath = (char*)JKRAllocFromHeap(mParentHeap, pathLength + 1, 1); mCurrentPath = (char*)JKRAllocFromSysHeap(pathLength + 2, 1); strcpy(mRootPath, path); strcpy(mCurrentPath, path); if (path[1] != '\0') { convStrLower(mRootPath); convStrLower(mCurrentPath); strcat(mCurrentPath, "/"); const char* volumePath = volume; if (!volume) { volumePath = strrchr(mRootPath, '/'); volumePath++; } u32 volumeLength = strlen(volumePath) + 1; mVolumePath = (char*)JKRAllocFromSysHeap(volumeLength, 0); strcpy(mVolumePath, volumePath); convStrLower(mVolumePath); mVolumeName = mVolumePath; } else { const char* volumePath = volume; if (!volume) { volumePath = "dvd"; } u32 volumeLength = strlen(volumePath) + 1; mVolumePath = (char*)JKRAllocFromSysHeap(volumeLength, 0); strcpy(mVolumePath, volumePath); convStrLower(mVolumePath); mVolumeName = mVolumePath; } getVolumeList().prepend(&mFileLoaderLink); mIsMounted = true; } /* 802D4C70-802D4D44 2CF5B0 00D4+00 1/0 0/0 0/0 .text __dt__12JKRFileCacheFv */ JKRFileCache::~JKRFileCache() { removeResourceAll(); if (mRootPath) JKRFreeToHeap(mParentHeap, mRootPath); if (mCurrentPath) JKRFreeToSysHeap(mCurrentPath); if (mVolumePath) JKRFreeToSysHeap(mVolumePath); getVolumeList().remove(&mFileLoaderLink); } /* 802D4D44-802D4DD8 2CF684 0094+00 1/0 0/0 0/0 .text becomeCurrent__12JKRFileCacheFPCc */ #ifdef NONMATCHING bool JKRFileCache::becomeCurrent(const char* path) { char* name = getDvdPathName(path); BOOL result = DVDChangeDir(name); bool didChangeDir = (result != 0); if (didChangeDir) { setCurrentVolume(this); JKRFreeToSysHeap(mCurrentPath); mCurrentPath = name; if (mCurrentPath[1]) { strcat(mCurrentPath, "/"); } } else { JKRFreeToSysHeap(name); } return didChangeDir; } #else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off asm bool JKRFileCache::becomeCurrent(char const* param_0) { nofralloc #include "asm/JSystem/JKernel/JKRFileCache/becomeCurrent__12JKRFileCacheFPCc.s" } #pragma pop #endif /* 802D4DD8-802D4EDC 2CF718 0104+00 1/0 0/0 0/0 .text getResource__12JKRFileCacheFPCc */ void* JKRFileCache::getResource(const char* path) { ASSERT(isMounted()); void* buffer = NULL; char* name = getDvdPathName(path); JKRDvdFile dvdFile(name); if (dvdFile.isAvailable()) { CCacheBlock* cacheBlock = findCacheBlock(dvdFile.getFileID()); if (!cacheBlock) { // dvdFile.getFileSize() not inlined u32 fileSize = dvdFile.getFileInfo().length; u32 alignedSize = ALIGN_NEXT(fileSize, 0x20); buffer = JKRAllocFromHeap(mParentHeap, alignedSize, 0x20); if (buffer) { dvdFile.read(buffer, alignedSize, 0); cacheBlock = new (JKRHeap::getSystemHeap(), 0) CCacheBlock(dvdFile.getFileID(), dvdFile.getFileInfo().length, buffer); mCacheBlockList.append(&cacheBlock->mCacheBlockLink); } } else { cacheBlock->mReferenceCount++; buffer = cacheBlock->mMemoryPtr; } } JKRFreeToSysHeap(name); return buffer; } /* 802D4EDC-802D4F64 2CF81C 0088+00 1/0 0/0 0/0 .text getResource__12JKRFileCacheFUlPCc */ void* JKRFileCache::getResource(u32, const char* path) { ASSERT(isMounted()); char finalPath[256]; u32 rootLength = strlen(mRootPath); char* filePath = finalPath + rootLength; strcpy(finalPath, mRootPath); bool found = findFile(finalPath, path); if (!found) return NULL; return getResource(filePath); } /* 802D4F64-802D503C 2CF8A4 00D8+00 1/0 0/0 0/0 .text readResource__12JKRFileCacheFPvUlPCc */ u32 JKRFileCache::readResource(void* dst, u32 dstLength, const char* path) { ASSERT(isMounted()); char* name = getDvdPathName(path); JKRDvdFile dvdFile(name); u32 resourceSize = 0; // !@bug: (maybe?) Infinite Loop: Because dvdFile.isAvailable() is never updated in the loop-body // will would never exit the loop. loop: if (dvdFile.isAvailable()) { // dvdFile.getFileSize() not inlined u32 fileSize = dvdFile.getFileInfo().length; resourceSize = ALIGN_NEXT(fileSize, 0x20); dstLength = ALIGN_PREV(dstLength, 0x20); if (resourceSize > dstLength) { resourceSize = dstLength; } CCacheBlock* cacheBlock = findCacheBlock(dvdFile.getFileID()); if (!cacheBlock) { dvdFile.read(dst, resourceSize, 0); } else { memcpy(dst, cacheBlock->mMemoryPtr, resourceSize); } goto loop; } JKRFreeToSysHeap(name); return resourceSize; } /* 802D503C-802D50D4 2CF97C 0098+00 1/0 0/0 0/0 .text readResource__12JKRFileCacheFPvUlUlPCc */ u32 JKRFileCache::readResource(void* dst, u32 dstLength, u32, const char* path) { ASSERT(isMounted()); char finalPath[256]; u32 rootLength = strlen(mRootPath); char* filePath = finalPath + rootLength; strcpy(finalPath, mRootPath); bool found = findFile(finalPath, path); if (!found) return NULL; return readResource(dst, dstLength, filePath); } /* 802D50D4-802D5164 2CFA14 0090+00 1/0 0/0 0/0 .text removeResourceAll__12JKRFileCacheFv */ #ifdef NONMATCHING void JKRFileCache::removeResourceAll(void) { ASSERT(isMounted()); JSUListIterator iterator; iterator = mCacheBlockList.getFirst(); while (iterator != mCacheBlockList.getEnd()) { JKRFreeToHeap(mParentHeap, iterator->mMemoryPtr); mCacheBlockList.remove(&iterator->mLink); JSUListIterator next = iterator++; CCacheBlock* cacheBlock = next.getObject(); delete cacheBlock; } } #else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off asm void JKRFileCache::removeResourceAll() { nofralloc #include "asm/JSystem/JKernel/JKRFileCache/removeResourceAll__12JKRFileCacheFv.s" } #pragma pop #endif /* 802D5164-802D51F8 2CFAA4 0094+00 1/0 0/0 0/0 .text removeResource__12JKRFileCacheFPv */ bool JKRFileCache::removeResource(void* resource) { ASSERT(isMounted()); CCacheBlock* cacheBlock = findCacheBlock(resource); if (!cacheBlock) return false; u32 referenceCount = cacheBlock->mReferenceCount - 1; cacheBlock->mReferenceCount = referenceCount; if (referenceCount == 0) { JKRFreeToHeap(mParentHeap, resource); mCacheBlockList.remove(&cacheBlock->mCacheBlockLink); delete cacheBlock; } return true; } /* 802D51F8-802D526C 2CFB38 0074+00 1/0 0/0 0/0 .text detachResource__12JKRFileCacheFPv */ bool JKRFileCache::detachResource(void* resource) { ASSERT(isMounted()); CCacheBlock* cacheBlock = findCacheBlock(resource); if (!cacheBlock) return false; mCacheBlockList.remove(&cacheBlock->mCacheBlockLink); delete cacheBlock; return true; } /* 802D526C-802D52A0 2CFBAC 0034+00 1/0 0/0 0/0 .text getResSize__12JKRFileCacheCFPCv */ u32 JKRFileCache::getResSize(const void* resource) const { ASSERT(isMounted()); CCacheBlock* cacheBlock = findCacheBlock(resource); if (cacheBlock == NULL) { return -1; } else { return cacheBlock->mFileSize; } } /* 802D52A0-802D531C 2CFBE0 007C+00 1/0 0/0 0/0 .text countFile__12JKRFileCacheCFPCc */ u32 JKRFileCache::countFile(const char* path) const { ASSERT(isMounted()); DVDDirectory dir; DVDDirectoryEntry dirEntry; u32 count = 0; char* name = getDvdPathName(path); BOOL result = DVDOpenDir(name, &dir); if (result != 0) { while (result = DVDReadDir(&dir, &dirEntry), result != FALSE) { count = count + 1; } DVDCloseDir(&dir); } JKRFreeToSysHeap(name); return count; } /* 802D531C-802D53B8 2CFC5C 009C+00 1/0 0/0 0/0 .text getFirstFile__12JKRFileCacheCFPCc */ JKRFileFinder* JKRFileCache::getFirstFile(const char* path) const { char* name = getDvdPathName(path); JKRHeap* systemHeap = JKRHeap::getSystemHeap(); JKRDvdFinder* finder = new (systemHeap, 0) JKRDvdFinder(name); JKRFreeToSysHeap(name); if (finder->isAvailable() != true) { delete finder; return NULL; } return finder; } /* 802D53B8-802D53E4 2CFCF8 002C+00 3/3 0/0 0/0 .text findCacheBlock__12JKRFileCacheCFPCv */ JKRFileCache::CCacheBlock* JKRFileCache::findCacheBlock(const void* resource) const { JSUListIterator iterator; for (iterator = mCacheBlockList.getFirst(); iterator != mCacheBlockList.getEnd(); ++iterator) { if (iterator->mMemoryPtr == resource) { return iterator.getObject(); } } return NULL; } /* 802D53E4-802D5410 2CFD24 002C+00 2/2 0/0 0/0 .text findCacheBlock__12JKRFileCacheCFUl */ JKRFileCache::CCacheBlock* JKRFileCache::findCacheBlock(u32 fileID) const { JSUListIterator iterator; for (iterator = mCacheBlockList.getFirst(); iterator != mCacheBlockList.getEnd(); ++iterator) { if (iterator->mFileId == fileID) { return iterator.getObject(); } } return NULL; } /* 802D5410-802D551C 2CFD50 010C+00 2/2 0/0 0/0 .text findFile__12JKRFileCacheCFPcPCc */ bool JKRFileCache::findFile(char* path, const char* fileName) const { DVDDirectory dir; DVDDirectoryEntry dirEntry; bool result = false; u32 pathLength = strlen(path); if (DVDOpenDir(path, &dir)) { while (DVDReadDir(&dir, &dirEntry)) { if (dirEntry.is_directory) { char* endOfPath = path + pathLength; *endOfPath = '/'; strcpy(path + pathLength + 1, dirEntry.name); result = findFile(path, fileName); if (result) break; *endOfPath = '\0'; } else { result = (strcmp(fileName, dirEntry.name) == 0); if (result) { strcat(path, "/"); strcat(path, fileName); break; } } } DVDCloseDir(&dir); } return result; } /* 802D551C-802D5624 2CFE5C 0108+00 5/5 0/0 0/0 .text getDvdPathName__12JKRFileCacheCFPCc */ char* JKRFileCache::getDvdPathName(const char* path) const { char* newPath; if (path[0] == '/') { u32 length = strlen(mRootPath) + strlen(path) + 2; newPath = (char*)JKRAllocFromSysHeap(length, 1); strcpy(newPath, mRootPath); if (path[1]) { if (mRootPath[1] == 0) { strcat(newPath, path + 1); } else { strcat(newPath, path); } } } else { u32 length = strlen(mCurrentPath) + strlen(path) + 2; newPath = (char*)JKRAllocFromSysHeap(length, 1); strcpy(newPath, mCurrentPath); strcat(newPath, path); } convStrLower(newPath); return newPath; } /* 802D5624-802D566C 2CFF64 0048+00 2/2 0/0 0/0 .text convStrLower__12JKRFileCacheCFPc */ void JKRFileCache::convStrLower(char* buffer) const { while (*buffer) { *buffer++ = tolower(*buffer); } } /* 802D566C-802D56C8 2CFFAC 005C+00 1/1 0/0 0/0 .text __ct__Q212JKRFileCache11CCacheBlockFUlUlPCv */ JKRFileCache::CCacheBlock::CCacheBlock(u32 fileId, u32 fileSize, const void* resource) : mCacheBlockLink(this) { mReferenceCount = 1; mFileId = fileId; mFileSize = fileSize; mMemoryPtr = (void*)resource; // todo: don't cast away const } /* 802D56C8-802D56F4 2D0008 002C+00 1/0 0/0 0/0 .text getFsResource__12JKRFileCacheFPCc */ void* JKRFileCache::getFsResource(const char* path) { return getResource(path); } /* 802D56F4-802D5720 2D0034 002C+00 1/0 0/0 0/0 .text getNameResource__12JKRFileCacheFUlPCc */ void* JKRFileCache::getNameResource(u32 type, const char* path) { return getResource(type, path); } /* 802D5720-802D574C 2D0060 002C+00 1/0 0/0 0/0 .text readFsResource__12JKRFileCacheFPvUlPCc */ u32 JKRFileCache::readFsResource(void* dst, u32 dstLength, const char* path) { return readResource(dst, dstLength, path); } /* 802D574C-802D5778 2D008C 002C+00 1/0 0/0 0/0 .text readNameResource__12JKRFileCacheFPvUlUlPCc */ u32 JKRFileCache::readNameResource(void* dst, u32 dstLength, u32 type, const char* path) { return readResource(dst, dstLength, type, path); } /* 8039D158-8039D158 0297B8 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */