1#include "Game/System/FileLoader.hpp"
2#include "Game/Util.hpp"
4FileLoader::FileLoader() {
5 mLoaderThread =
nullptr;
6 mRequestFileInfos =
nullptr;
7 mRequestedFileCount = 0;
9 mArchiveHolder =
nullptr;
11 OSResumeThread(mLoaderThread->mThread);
16 mRequestedFileCount = 0;
19void FileLoader::requestLoadToMainRAM(
const char *pName, u8 *pData, JKRHeap* pHeap, JKRDvdRipper::EAllocDirection direction,
bool jam) {
20 if (isNeedToLoad(pName)) {
21 if (pHeap ==
nullptr) {
22 pHeap = MR::getCurrentHeap();
27 info->mRequestType = direction;
28 info->mFileEntry = mFileHolder->add(pName, pHeap, pData);
31 OSJamMessage(&mLoaderThread->mQueue, info, OS_MESSAGE_NOBLOCK);
34 OSSendMessage(&mLoaderThread->mQueue, info, OS_MESSAGE_NOBLOCK);
39void FileLoader::requestMountArchive(
const char *pName, JKRHeap* pHeap,
bool jam) {
40 if (isNeedToLoad(pName)) {
41 if (pHeap ==
nullptr) {
42 pHeap = MR::getCurrentHeap();
47 info->mRequestType = 1;
48 info->mFileEntry = mFileHolder->add(pName, pHeap,
nullptr);
51 OSJamMessage(&mLoaderThread->mQueue, info, OS_MESSAGE_NOBLOCK);
54 OSSendMessage(&mLoaderThread->mQueue, info, OS_MESSAGE_NOBLOCK);
59bool FileLoader::isLoaded(
const char *pName)
const {
60 return mFileHolder->isExist(pName);
63bool FileLoader::isMountedArchive(
const char *pName)
const {
64 return mArchiveHolder->getArchive(pName) !=
nullptr;
67void* FileLoader::receiveFile(
const char *pName) {
69 if (info !=
nullptr) {
70 info->mFileEntry->waitReadDone();
73 return mFileHolder->getContext(pName);
76JKRMemArchive* FileLoader::receiveArchive(
const char *pName) {
78 if (info !=
nullptr) {
79 info->mFileEntry->waitReadDone();
82 return mArchiveHolder->getArchive(pName);
85void FileLoader::receiveAllRequestedFile() {
86 for (u32 i = 0; i < mRequestedFileCount; i++) {
87 mRequestFileInfos[i].mFileEntry->waitReadDone();
91JKRMemArchive* FileLoader::createAndAddArchive(
void* pData, JKRHeap* pHeap,
const char* pName) {
92 return mArchiveHolder->createAndAdd(pData, pHeap, pName)->mArchive;
95void FileLoader::getMountedArchiveAndHeap(
const char* pName, JKRArchive** pArchive, JKRHeap** pHeap)
const {
96 mArchiveHolder->getArchiveAndHeap(pName, pArchive, pHeap);
99void FileLoader::clearRequestFileInfo(
bool) {
100 mRequestedFileCount =
nullptr;
103void FileLoader::removeHolderIfIsEqualHeap(JKRHeap* pHeap) {
104 mFileHolder->removeIfIsEqualHeap(pHeap);
105 mArchiveHolder->removeIfIsEqualHeap(pHeap);
108void FileLoader::removeFile(
const char* pName) {
109 mFileHolder->removeFile(pName);
112bool FileLoader::isNeedToLoad(
const char* pName)
const {
114 return (info ==
nullptr) ? false : mFileHolder->isExist(pName) ==
false;
117const RequestFileInfo* FileLoader::getRequestFileInfoConst(
const char* pName)
const {
118 for (u32 i = 0; i < mRequestedFileCount; i++) {
121 if (MR::isEqualStringCase(info->mFileName, pName)) {
132 OSMutex* mutex = &mMutex;
134 s32 count = mRequestedFileCount;
135 mRequestedFileCount = count + 1;
137 info->mFileEntry =
nullptr;
139 snprintf(info->mFileName,
sizeof(info->mFileName),
"%s", pName);
140 OSUnlockMutex(mutex);