SMG-Decomp
A decompilation of Super Mario Galaxy 1
Loading...
Searching...
No Matches
NANDManagerThread.cpp
1#include "Game/System/NANDManagerThread.hpp"
2#include "Game/System/NANDManager.hpp"
3
4NANDManagerThread::NANDManagerThread(int a1, int a2, JKRHeap *pHeap) : OSThreadWrapper(0x8000, a2, a1, pHeap) {
5
6}
7
8s32 NANDManagerThread::run() {
9 // OSInitFastCast
10 __asm {
11 li r3, 4
12 oris r3, r3, 4
13 mtspr 0x392, r3
14 li r3, 5
15 oris r3, r3, 5
16 mtspr 0x393, r3
17 li r3, 6
18 oris r3, r3, 6
19 mtspr 0x394, r3
20 li r3, 7
21 oris r3, r3, 7
22 mtspr 0x395, r3
23 };
24
25 while (true) {
26 OSMessage msg;
27 OSReceiveMessage(&mQueue, &msg, 1);
28 NANDRequestInfo* info = (NANDRequestInfo*)msg;
29 info->_40 = 2;
30
31 switch (info->mRequestStatus) {
32 case 1:
33 info->mRequestResult = NANDDelete(info->mReqStr);
34 break;
35 case 0:
36 info->mRequestResult = NANDMove(info->mReqStr, (const char*)info->_50);
37 break;
38 case 2:
39 executeWriteSequence(info);
40 break;
41 case 3:
42 executeReadSequence(info);
43 break;
44 case 4:
45 info->mRequestResult = NANDCheck(info->mFSBlock, info->mINode, (u32*)info->_50);
46 break;
47 }
48
49 info->_40 = 0;
50
51 if (info->_54 != nullptr) {
52 (info->_54)(info);
53 }
54 }
55}
56
57void NANDManagerThread::executeWriteSequence(NANDRequestInfo *pInfo) {
58 pInfo->mRequestResult = NANDCreate(pInfo->mReqStr, pInfo->mPermission, pInfo->mAttribute);
59 if (pInfo->mRequestResult == 0 || pInfo->mRequestResult == -6) {
60 NANDFileInfo info;
61 pInfo->mRequestResult = NANDOpen(pInfo->mReqStr, &info, 2);
62
63 if (pInfo->mRequestResult != 0) {
64 pInfo->mFSBlock = 0;
65 }
66 else {
67 pInfo->mRequestResult = NANDWrite(&info, pInfo->_4C, pInfo->mFSBlock);
68
69 if (pInfo->mRequestResult < 0) {
70 NANDClose(&info);
71 pInfo->mFSBlock = 0;
72 }
73 else {
74 pInfo->mFSBlock = pInfo->mRequestResult;
75 pInfo->mRequestResult = NANDClose(&info);
76 }
77 }
78 }
79}
80
81void NANDManagerThread::executeReadSequence(NANDRequestInfo *pInfo) {
82 NANDFileInfo info;
83 pInfo->mRequestResult = NANDOpen(pInfo->mReqStr, &info, 1);
84
85 if (pInfo->mRequestResult != 0) {
86 pInfo->mFSBlock = 0;
87 return;
88 }
89
90 u32 length = 0;
91 pInfo->mRequestResult = NANDGetLength(&info, &length);
92
93 if (pInfo->mRequestResult != 0) {
94 NANDClose(&info);
95 pInfo->mFSBlock = 0;
96 return;
97 }
98
99 if (pInfo->_50 != nullptr) {
100 *(u32*)(pInfo->_50) = length;
101 }
102
103 if (pInfo->mFSBlock < length) {
104 pInfo->mFSBlock = 0;
105 pInfo->mRequestResult = -15;
106 NANDClose(&info);
107 }
108 else {
109 pInfo->mRequestResult = NANDRead(&info, (void*)pInfo->_4C, length);
110
111 if (pInfo->mRequestResult < 0) {
112 NANDClose(&info);
113 pInfo->mFSBlock = 0;
114 return;
115 }
116 else {
117 pInfo->mFSBlock = pInfo->mRequestResult;
118 pInfo->mRequestResult = NANDClose(&info);
119 }
120 }
121}
122
123NANDManagerThread::~NANDManagerThread() {
124
125}