SMG-Decomp
A decompilation of Super Mario Galaxy 1
Loading...
Searching...
No Matches
FileLoader.cpp
1#include "Game/System/FileLoader.hpp"
2#include "Game/Util.hpp"
3
4FileLoader::FileLoader() {
5 mLoaderThread = nullptr;
6 mRequestFileInfos = nullptr;
7 mRequestedFileCount = 0;
8 mFileHolder = nullptr;
9 mArchiveHolder = nullptr;
10 mLoaderThread = new FileLoaderThread(13, 320, MR::getStationedHeapNapa());
11 OSResumeThread(mLoaderThread->mThread);
12 OSInitMutex(&mMutex);
13 mRequestFileInfos = new RequestFileInfo[0x140];
14 mFileHolder = new FileHolder();
15 mArchiveHolder = new ArchiveHolder();
16 mRequestedFileCount = 0;
17}
18
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();
23 }
24
25 RequestFileInfo* info = addRequest(pName);
26 info->_0 = 0;
27 info->mRequestType = direction;
28 info->mFileEntry = mFileHolder->add(pName, pHeap, pData);
29
30 if (jam) {
31 OSJamMessage(&mLoaderThread->mQueue, info, OS_MESSAGE_NOBLOCK);
32 }
33 else {
34 OSSendMessage(&mLoaderThread->mQueue, info, OS_MESSAGE_NOBLOCK);
35 }
36 }
37}
38
39void FileLoader::requestMountArchive(const char *pName, JKRHeap* pHeap, bool jam) {
40 if (isNeedToLoad(pName)) {
41 if (pHeap == nullptr) {
42 pHeap = MR::getCurrentHeap();
43 }
44
45 RequestFileInfo* info = addRequest(pName);
46 info->_0 = 1;
47 info->mRequestType = 1;
48 info->mFileEntry = mFileHolder->add(pName, pHeap, nullptr);
49
50 if (jam) {
51 OSJamMessage(&mLoaderThread->mQueue, info, OS_MESSAGE_NOBLOCK);
52 }
53 else {
54 OSSendMessage(&mLoaderThread->mQueue, info, OS_MESSAGE_NOBLOCK);
55 }
56 }
57}
58
59bool FileLoader::isLoaded(const char *pName) const {
60 return mFileHolder->isExist(pName);
61}
62
63bool FileLoader::isMountedArchive(const char *pName) const {
64 return mArchiveHolder->getArchive(pName) != nullptr;
65}
66
67void* FileLoader::receiveFile(const char *pName) {
68 const RequestFileInfo* info = getRequestFileInfoConst(pName);
69 if (info != nullptr) {
70 info->mFileEntry->waitReadDone();
71 }
72
73 return mFileHolder->getContext(pName);
74}
75
76JKRMemArchive* FileLoader::receiveArchive(const char *pName) {
77 const RequestFileInfo* info = getRequestFileInfoConst(pName);
78 if (info != nullptr) {
79 info->mFileEntry->waitReadDone();
80 }
81
82 return mArchiveHolder->getArchive(pName);
83}
84
85void FileLoader::receiveAllRequestedFile() {
86 for (u32 i = 0; i < mRequestedFileCount; i++) {
87 mRequestFileInfos[i].mFileEntry->waitReadDone();
88 }
89}
90
91JKRMemArchive* FileLoader::createAndAddArchive(void* pData, JKRHeap* pHeap, const char* pName) {
92 return mArchiveHolder->createAndAdd(pData, pHeap, pName)->mArchive;
93}
94
95void FileLoader::getMountedArchiveAndHeap(const char* pName, JKRArchive** pArchive, JKRHeap** pHeap) const {
96 mArchiveHolder->getArchiveAndHeap(pName, pArchive, pHeap);
97}
98
99void FileLoader::clearRequestFileInfo(bool) {
100 mRequestedFileCount = nullptr;
101}
102
103void FileLoader::removeHolderIfIsEqualHeap(JKRHeap* pHeap) {
104 mFileHolder->removeIfIsEqualHeap(pHeap);
105 mArchiveHolder->removeIfIsEqualHeap(pHeap);
106}
107
108void FileLoader::removeFile(const char* pName) {
109 mFileHolder->removeFile(pName);
110}
111
112bool FileLoader::isNeedToLoad(const char* pName) const {
113 const RequestFileInfo* info = getRequestFileInfoConst(pName);
114 return (info == nullptr) ? false : mFileHolder->isExist(pName) == false;
115}
116
117const RequestFileInfo* FileLoader::getRequestFileInfoConst(const char* pName) const {
118 for (u32 i = 0; i < mRequestedFileCount; i++) {
119 RequestFileInfo* info = &mRequestFileInfos[i];
120
121 if (MR::isEqualStringCase(info->mFileName, pName)) {
122 return info;
123 }
124 }
125
126 return nullptr;
127}
128
129#ifdef NON_MATCHING
130// string load is in the wrong spot for some reason
131RequestFileInfo* FileLoader::addRequest(const char* pName) {
132 OSMutex* mutex = &mMutex;
133 OSLockMutex(mutex);
134 s32 count = mRequestedFileCount;
135 mRequestedFileCount = count + 1;
136 RequestFileInfo* info = &mRequestFileInfos[count];
137 info->mFileEntry = nullptr;
138 info->_88 = 0;
139 snprintf(info->mFileName, sizeof(info->mFileName), "%s", pName);
140 OSUnlockMutex(mutex);
141 return info;
142}
143#endif