mirror of
https://github.com/encounter/Petari.git
synced 2026-03-30 11:34:15 -07:00
126 lines
2.8 KiB
C++
126 lines
2.8 KiB
C++
#include "Game/System/NANDManager.hpp"
|
|
#include "Game/Util.hpp"
|
|
#include "Game/SingletonHolder.hpp"
|
|
#include <JSystem/JKernel/JKRExpHeap.hpp>
|
|
#include <cstdio>
|
|
|
|
NANDRequestInfo::NANDRequestInfo() {
|
|
init();
|
|
}
|
|
|
|
void NANDRequestInfo::init() {
|
|
_40 = 0;
|
|
mRequestStatus = 4;
|
|
mRequestResult = 0;
|
|
mReqStr[0] = 0;
|
|
mFSBlock = 0;
|
|
_4C = nullptr;
|
|
_50 = nullptr;
|
|
_54 = 0;
|
|
}
|
|
|
|
bool NANDRequestInfo::isDone() const {
|
|
return mRequestStatus == 0;
|
|
}
|
|
|
|
const char* NANDRequestInfo::setMove(const char *pDest, const char *pSrc) {
|
|
init();
|
|
mRequestStatus = 0;
|
|
snprintf(mReqStr, sizeof(mReqStr), "%s", pDest);
|
|
_50 = (void*)pSrc;
|
|
return mReqStr;
|
|
}
|
|
|
|
const char* NANDRequestInfo::setWriteSeq(const char *pName, const void *a2, u32 block, u8 permission, u8 attr) {
|
|
init();
|
|
_4C = a2;
|
|
mRequestStatus = 2;
|
|
mFSBlock = block;
|
|
mPermission = permission;
|
|
mAttribute = attr;
|
|
snprintf(mReqStr, sizeof(mReqStr), "%s", pName);
|
|
return mReqStr;
|
|
}
|
|
|
|
const char* NANDRequestInfo::setReadSeq(const char *pName, void *a2, u32 block, u32 *a4) {
|
|
init();
|
|
_4C = a2;
|
|
mRequestStatus = 3;
|
|
mFSBlock = block;
|
|
_50 = a4;
|
|
snprintf(mReqStr, sizeof(mReqStr), "%s", pName);
|
|
return mReqStr;
|
|
}
|
|
|
|
const char* NANDRequestInfo::setCheck(u32 block, u32 node, u32 *a3) {
|
|
init();
|
|
mFSBlock = block;
|
|
mRequestStatus = 4;
|
|
mINode = node;
|
|
_50 = a3;
|
|
return mReqStr;
|
|
}
|
|
|
|
NANDManager::NANDManager() {
|
|
mManager = nullptr;
|
|
mManager = new NANDManagerThread(0xD, 0x100, MR::getStationedHeapNapa());
|
|
OSResumeThread(mManager->mThread);
|
|
OSInitMutex(&mMutex);
|
|
}
|
|
|
|
bool NANDManager::addRequest(NANDRequestInfo *pReq) {
|
|
OSLockMutex(&mMutex);
|
|
pReq->_40 = 1;
|
|
bool ret = OSSendMessage(&mManager->mQueue, pReq, 0);
|
|
OSUnlockMutex(&mMutex);
|
|
return ret;
|
|
}
|
|
|
|
s32 NANDResultCode::getCode() const {
|
|
return mCode;
|
|
}
|
|
|
|
bool NANDResultCode::isSuccess() const {
|
|
return mCode == 0;
|
|
}
|
|
|
|
bool NANDResultCode::isSaveDataCorrupted() const {
|
|
return (mCode == -5 || mCode == -15);
|
|
}
|
|
|
|
bool NANDResultCode::isNANDCorrupted() const {
|
|
return mCode == -4;
|
|
}
|
|
|
|
bool NANDResultCode::isMaxBlocks() const {
|
|
return mCode == -9;
|
|
}
|
|
|
|
bool NANDResultCode::isMaxFiles() const {
|
|
return mCode == -11;
|
|
}
|
|
|
|
bool NANDResultCode::isNoExistFile() const {
|
|
return mCode == -12;
|
|
}
|
|
|
|
bool NANDResultCode::isBusyOrAllocFailed() const {
|
|
return (mCode == -3 || mCode == -2);
|
|
}
|
|
|
|
bool NANDResultCode::isUnknown() const {
|
|
return mCode == -64;
|
|
}
|
|
|
|
namespace MR {
|
|
void addRequestToNANDManager(NANDRequestInfo *pInfo) {
|
|
SingletonHolder<NANDManager>::sInstance->addRequest(pInfo);
|
|
}
|
|
};
|
|
|
|
const char* NANDRequestInfo::setDelete(const char *pName) {
|
|
init();
|
|
mRequestStatus = 1;
|
|
snprintf(mReqStr, sizeof(mReqStr), "%s", pName);
|
|
return mReqStr;
|
|
} |