mirror of https://github.com/zeldaret/botw.git
ksys/res: Implement all of Handle
This commit is contained in:
parent
436085f61d
commit
b16ba552db
|
@ -90789,33 +90789,33 @@
|
|||
0x00000071012017d4,ResourceLoadArg3::ctor,60,_ZN4ksys3res23SimplePackedLoadRequestC1Ev
|
||||
0x0000007101201810,Res::ctor,72,_ZN4ksys3res6HandleC1Ev
|
||||
0x0000007101201858,Res::dtor,156,_ZN4ksys3res6HandleD1Ev
|
||||
0x00000071012018f4,Res::unload,136,_ZN4ksys3res6Handle6unloadEv
|
||||
0x00000071012018f4,Res::unload,136,_ZN4ksys3res6Handle13requestUnloadEv
|
||||
0x000000710120197c,Res::dtorDelete,164,_ZN4ksys3res6HandleD0Ev
|
||||
0x0000007101201a20,Res::getResource,104,
|
||||
0x0000007101201a88,Res::hasResourceAndIsParseOk,96,
|
||||
0x0000007101201ae8,Res::getResourceWithoutChecks,12,
|
||||
0x0000007101201af4,Res::getError,8,
|
||||
0x0000007101201afc,Res::setError,12,
|
||||
0x0000007101201b08,Res::submitLoadForSyncRequestAndGetResource,444,
|
||||
0x0000007101201cc4,Res::isStartedLoadAndFailed,12,
|
||||
0x0000007101201a20,Res::getResource,104,_ZNK4ksys3res6Handle11getResourceEv
|
||||
0x0000007101201a88,Res::hasResourceAndIsParseOk,96,_ZNK4ksys3res6Handle9isSuccessEv
|
||||
0x0000007101201ae8,Res::getResourceWithoutChecks,12,_ZNK4ksys3res6Handle20getResourceUncheckedEv
|
||||
0x0000007101201af4,Res::getError,8,_ZNK4ksys3res6Handle9getStatusEv
|
||||
0x0000007101201afc,Res::setError,12,_ZN4ksys3res6Handle24setStatusForResourceMgr_ERKNS1_6StatusE
|
||||
0x0000007101201b08,Res::submitLoadForSyncRequestAndGetResource,444,_ZN4ksys3res6Handle4loadERKN4sead14SafeStringBaseIcEEPKNS0_12ILoadRequestEPNS1_6StatusE
|
||||
0x0000007101201cc4,Res::isStartedLoadAndFailed,12,_ZNK4ksys3res6Handle10isFlag2SetEv
|
||||
0x0000007101201cd0,ResourceLoadArg::dtor,20,_ZN4ksys3res11LoadRequestD2Ev
|
||||
0x0000007101201ce4,Res::submitLoadRequest,380,
|
||||
0x0000007101201e60,Res::waitForReady,68,
|
||||
0x0000007101201ea4,sub_7101201EA4,104,
|
||||
0x0000007101201f0c,Res::parseResource,404,
|
||||
0x00000071012020a0,Res::k,12,
|
||||
0x00000071012020ac,Res::setSomeFlagOnResMgrDependingOnPath,784,
|
||||
0x00000071012023bc,Res::c,260,
|
||||
0x00000071012024c0,Res::submitUnloadRequest,136,
|
||||
0x0000007101202548,Res::submitUnloadForSyncRequest,132,
|
||||
0x00000071012025cc,Res::submitUnloadForSyncRequest2,148,
|
||||
0x0000007101202660,Res::resetBinderStatusMaybe,112,
|
||||
0x00000071012026d0,sub_71012026D0,84,
|
||||
0x0000007101202724,Res::isReady,128,
|
||||
0x00000071012027a4,Res::isReady_,220,
|
||||
0x0000007101202880,Res::i,148,
|
||||
0x0000007101202914,Res::makeEmptyString,32,
|
||||
0x0000007101202934,Res::parse,204,
|
||||
0x0000007101201ce4,Res::submitLoadRequest,380,_ZN4ksys3res6Handle11requestLoadERKN4sead14SafeStringBaseIcEEPKNS0_12ILoadRequestEPNS1_6StatusE
|
||||
0x0000007101201e60,Res::waitForReady,68,_ZN4ksys3res6Handle12waitForReadyEv
|
||||
0x0000007101201ea4,sub_7101201EA4,104,_ZN4ksys3res6Handle12waitForReadyERKN4sead8TickSpanE
|
||||
0x0000007101201f0c,Res::parseResource,404,_ZN4ksys3res6Handle13parseResourceEPNS0_7ContextE
|
||||
0x00000071012020a0,Res::k,12,_ZNK4ksys3res6Handle10isFlag8SetEv
|
||||
0x00000071012020ac,Res::setSomeFlagOnResMgrDependingOnPath,784,_ZN4ksys3res6Handle22updateResourceMgrFlag_Ev!
|
||||
0x00000071012023bc,Res::c,260,_ZN4ksys3res6Handle22updateStatusAndUnload_Ev
|
||||
0x00000071012024c0,Res::submitUnloadRequest,136,_ZN4ksys3res6Handle14requestUnload2Ev
|
||||
0x0000007101202548,Res::submitUnloadForSyncRequest,132,_ZN4ksys3res6Handle6unloadEv
|
||||
0x00000071012025cc,Res::submitUnloadForSyncRequest2,148,_ZN4ksys3res6Handle27unloadAndResetUnitFlag20000Ev
|
||||
0x0000007101202660,Res::resetBinderStatusMaybe,112,_ZN4ksys3res6Handle27resetUnitFlag20000IfSuccessEv
|
||||
0x00000071012026d0,sub_71012026D0,84,_ZNK4ksys3res6Handle6isBusyEv
|
||||
0x0000007101202724,Res::isReady,128,_ZNK4ksys3res6Handle19isReadyOrNeedsParseEv
|
||||
0x00000071012027a4,Res::isReady_,220,_ZNK4ksys3res6Handle7isReadyEv
|
||||
0x0000007101202880,Res::i,148,_ZNK4ksys3res6Handle15checkLoadStatusEv
|
||||
0x0000007101202914,Res::makeEmptyString,32,_ZN4ksys3res6Handle15makeEmptyStringEv
|
||||
0x0000007101202934,Res::parse,204,_ZN4ksys3res6Handle24waitForResourceAndParse_EPNS0_7ContextE
|
||||
0x0000007101202a00,ResourceLoadArgBase::rtti1,112,_ZNK4ksys3res12ILoadRequest27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE
|
||||
0x0000007101202a70,ResourceLoadArgBase::rtti2,92,_ZNK4ksys3res12ILoadRequest18getRuntimeTypeInfoEv
|
||||
0x0000007101202acc,Res::rtti1,112,_ZNK4ksys3res6Handle27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE
|
||||
|
@ -91011,6 +91011,7 @@
|
|||
0x000000710120dca4,ResourceBinder::errorIsZero,16,_ZNK4ksys3res12ResourceUnit9isStatus0Ev
|
||||
0x000000710120dcb4,ResourceBinder::needsPrepareLoad,80,_ZNK4ksys3res12ResourceUnit22isTask1ActiveOrStatus7Ev
|
||||
0x000000710120dd04,ResourceBinder::errorIsOne,16,_ZNK4ksys3res12ResourceUnit9isStatus1Ev
|
||||
0x000000710120dd14,_ZNK4ksys3res12ResourceUnit10needsParseEv,0xc8,_ZNK4ksys3res12ResourceUnit10needsParseEv
|
||||
0x000000710120dddc,ResourceBinder::errorMinus9Stuff,44,_ZNK4ksys3res12ResourceUnit15isStatus9_12_15Ev
|
||||
0x000000710120de08,ResourceBinder::isParseOk,228,_ZNK4ksys3res12ResourceUnit9isParseOkEv?
|
||||
0x000000710120deec,ResourceBinder::getStatusByteRightShift7Stuff,12,_ZNK4ksys3res12ResourceUnit19isStatusFlag8000SetEv
|
||||
|
|
Can't render this file because it is too large.
|
|
@ -100,7 +100,6 @@ target_sources(uking PRIVATE
|
|||
resHandle.h
|
||||
resInfoContainer.cpp
|
||||
resInfoContainer.h
|
||||
resLoadRequest.cpp
|
||||
resLoadRequest.h
|
||||
resMemoryTask.cpp
|
||||
resMemoryTask.h
|
||||
|
|
|
@ -2,8 +2,11 @@
|
|||
#include <container/seadBuffer.h>
|
||||
#include <prim/seadSafeString.h>
|
||||
#include <time/seadTickTime.h>
|
||||
#include "KingSystem/Resource/resLoadRequest.h"
|
||||
#include "KingSystem/Resource/resResource.h"
|
||||
#include "KingSystem/Resource/resResourceMgrTask.h"
|
||||
#include "KingSystem/Resource/resSystem.h"
|
||||
#include "KingSystem/Utils/Debug.h"
|
||||
|
||||
namespace ksys::res {
|
||||
|
||||
|
@ -40,13 +43,28 @@ const sead::SafeString sStatusStrings_[0x11] = {
|
|||
};
|
||||
const sead::Buffer<const sead::SafeString> sStatusStrings{0x11, sStatusStrings_};
|
||||
|
||||
ILoadRequest::~ILoadRequest() {
|
||||
;
|
||||
}
|
||||
|
||||
LoadRequest::LoadRequest() = default;
|
||||
|
||||
LoadRequest::LoadRequest(s32 load_data_alignment, u32 arg_c, bool arg_20)
|
||||
: _20(arg_20), mLoadDataAlignment(load_data_alignment) {
|
||||
_c = arg_c;
|
||||
}
|
||||
|
||||
SimpleLoadRequest::SimpleLoadRequest() = default;
|
||||
|
||||
SimplePackedLoadRequest::SimplePackedLoadRequest() = default;
|
||||
|
||||
Handle::Handle() = default;
|
||||
|
||||
Handle::~Handle() {
|
||||
unload();
|
||||
requestUnload();
|
||||
}
|
||||
|
||||
void Handle::unload() {
|
||||
void Handle::requestUnload() {
|
||||
if (!mFlags.isOn(Flag::_2))
|
||||
return;
|
||||
|
||||
|
@ -69,4 +87,398 @@ void Handle::unload() {
|
|||
ResourceMgrTask::instance()->requestUnload(this);
|
||||
}
|
||||
|
||||
sead::DirectResource* Handle::getResource() const {
|
||||
if (!isSuccess())
|
||||
return nullptr;
|
||||
return mUnit->mResource;
|
||||
}
|
||||
|
||||
bool Handle::isSuccess() const {
|
||||
if (mFlags.isOff(Flag::_2))
|
||||
return false;
|
||||
|
||||
if (isBusy())
|
||||
return false;
|
||||
|
||||
if (!mUnit || !mUnit->isParseOk())
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
sead::DirectResource* Handle::getResourceUnchecked() const {
|
||||
return mUnit->mResource;
|
||||
}
|
||||
|
||||
Handle::Status Handle::getStatus() const {
|
||||
return mStatus;
|
||||
}
|
||||
|
||||
void Handle::setStatusForResourceMgr_(const Status& status) {
|
||||
mStatus = status;
|
||||
}
|
||||
|
||||
inline bool Handle::checkPathChange_(const sead::SafeString& path) {
|
||||
if (!mFlags.isOn(Flag::_2))
|
||||
return true;
|
||||
|
||||
stubbedLogFunction();
|
||||
sead::FormatFixedSafeString<512> message("↓↓↓\n前回ファイル:%s\n今回ファイル:%s\n↑↑↑\n",
|
||||
mUnit ? mUnit->mPath.cstr() : "***", path.cstr());
|
||||
util::PrintDebug(message);
|
||||
return false;
|
||||
}
|
||||
|
||||
sead::DirectResource* Handle::load(const sead::SafeString& path, const ILoadRequest* request,
|
||||
Handle::Status* out_status) {
|
||||
if (checkPathChange_(path)) {
|
||||
mFlags.reset(Flag::_F);
|
||||
mFlags.set(Flag::_2);
|
||||
mStatus = Status::_0;
|
||||
if (request) {
|
||||
ResourceMgrTask::instance()->requestLoadForSync(this, path, *request);
|
||||
} else {
|
||||
LoadRequest temp_request;
|
||||
ResourceMgrTask::instance()->requestLoadForSync(this, path, temp_request);
|
||||
}
|
||||
if (out_status)
|
||||
*out_status = mStatus;
|
||||
} else {
|
||||
if (out_status)
|
||||
*out_status = Status::_8;
|
||||
}
|
||||
|
||||
return getResource();
|
||||
}
|
||||
|
||||
bool Handle::isFlag2Set() const {
|
||||
return mFlags.isOn(Flag::_2);
|
||||
}
|
||||
|
||||
bool Handle::requestLoad(const sead::SafeString& path, const ILoadRequest* request,
|
||||
Handle::Status* out_status) {
|
||||
if (checkPathChange_(path)) {
|
||||
mFlags.reset(Flag::_F);
|
||||
mFlags.set(Flag::_2);
|
||||
mStatus = Status::_0;
|
||||
|
||||
Handle::Status ret;
|
||||
if (request) {
|
||||
ret = ResourceMgrTask::instance()->requestLoad(this, path, *request);
|
||||
} else {
|
||||
LoadRequest temp_request;
|
||||
ret = ResourceMgrTask::instance()->requestLoad(this, path, temp_request);
|
||||
}
|
||||
|
||||
if (out_status)
|
||||
*out_status = ret;
|
||||
|
||||
return ret == Status::_7;
|
||||
}
|
||||
|
||||
if (out_status)
|
||||
*out_status = Status::_8;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool Handle::waitForReady() {
|
||||
if (mTaskHandle.isTaskAttached())
|
||||
mTaskHandle.wait();
|
||||
|
||||
if (mUnit)
|
||||
mUnit->waitForTask1();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Handle::waitForReady(const sead::TickSpan& span) {
|
||||
if (mTaskHandle.isTaskAttached() && !mTaskHandle.wait(span))
|
||||
return false;
|
||||
|
||||
if (mUnit && !mUnit->waitForTask1(span))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Handle::parseResource(Context* context) {
|
||||
if (mFlags.isOn(Flag::_8))
|
||||
return true;
|
||||
|
||||
if (mFlags.isOn(Flag::_4))
|
||||
return false;
|
||||
|
||||
if (mTaskHandle.getStatus() == util::ManagedTaskHandle::Status::TaskRemoved ||
|
||||
(mUnit && mUnit->isTask1NotQueued())) {
|
||||
stubbedLogFunction();
|
||||
mStatus = Status::_14;
|
||||
updateResourceMgrFlag_();
|
||||
requestUnload();
|
||||
mFlags.set(Flag::_8);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (mStatus == Status::_1 || mStatus == Status::_2 || mStatus == Status::_3 ||
|
||||
mStatus == Status::_8 || mStatus == Status::_9 || mStatus == Status::_10 ||
|
||||
mStatus == Status::_11 || mStatus == Status::_12 || mStatus == Status::_13 ||
|
||||
mStatus == Status::_14) {
|
||||
updateResourceMgrFlag_();
|
||||
requestUnload();
|
||||
mFlags.set(Flag::_8);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (mStatus == Status::_0)
|
||||
return false;
|
||||
|
||||
if (!mUnit) {
|
||||
stubbedLogFunction();
|
||||
return false;
|
||||
}
|
||||
|
||||
switch (mUnit->getStatus()) {
|
||||
case ResourceUnit::Status::_0:
|
||||
case ResourceUnit::Status::_7:
|
||||
return false;
|
||||
case ResourceUnit::Status::_8:
|
||||
case ResourceUnit::Status::_10:
|
||||
case ResourceUnit::Status::_11:
|
||||
case ResourceUnit::Status::_13:
|
||||
waitForResourceAndParse_(context);
|
||||
break;
|
||||
case ResourceUnit::Status::_9:
|
||||
updateStatusAndUnload_();
|
||||
break;
|
||||
case ResourceUnit::Status::_12:
|
||||
case ResourceUnit::Status::_15:
|
||||
mStatus = Status::_9;
|
||||
updateResourceMgrFlag_();
|
||||
requestUnload();
|
||||
mFlags.set(Flag::_8);
|
||||
return true;
|
||||
case ResourceUnit::Status::_14:
|
||||
if (mStatus == Status::_7)
|
||||
mStatus = Status::_4;
|
||||
updateResourceMgrFlag_();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
mFlags.set(Flag::_8);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Handle::isFlag8Set() const {
|
||||
return mFlags.isOn(Flag::_8);
|
||||
}
|
||||
|
||||
// NON_MATCHING: switch
|
||||
void Handle::updateResourceMgrFlag_() {
|
||||
sead::FixedSafeString<128> path("***");
|
||||
if (mUnit)
|
||||
path = mUnit->mPath;
|
||||
|
||||
bool warn = true;
|
||||
switch (mStatus) {
|
||||
case Status::_3:
|
||||
if (!mUnit || !mUnit->mArena1->isFlag1Set())
|
||||
break;
|
||||
if (!returnFalse())
|
||||
warn = false;
|
||||
break;
|
||||
case Status::_4:
|
||||
static_cast<void>(static_cast<volatile ResourceUnit*>(mUnit)->mStatusFlags);
|
||||
if (!returnFalse())
|
||||
warn = false;
|
||||
break;
|
||||
case Status::_5:
|
||||
case Status::_6:
|
||||
case Status::_8:
|
||||
if (!returnFalse())
|
||||
warn = false;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (warn)
|
||||
stubbedLogFunction();
|
||||
|
||||
if (mStatus != Status::_3 || !mUnit || !mUnit->mArena1)
|
||||
return;
|
||||
|
||||
auto* heap = mUnit->mArena1->getHeap();
|
||||
|
||||
if (!mUnit->mArena1->isFlag1Set() || returnFalse())
|
||||
stubbedLogFunction();
|
||||
|
||||
if (!mUnit->mArena1->isFlag10Set())
|
||||
return;
|
||||
|
||||
const s32 type =
|
||||
(heap->getName().startsWith("Sound") || heap->getName().startsWith("Audio")) ? 0 : 1;
|
||||
res::ResourceMgrTask::instance()->setFlag2000Or5000(type);
|
||||
}
|
||||
|
||||
void Handle::updateStatusAndUnload_() {
|
||||
auto* unit = mUnit;
|
||||
if (unit && unit->isStatus9_12_15()) {
|
||||
mStatus = [&] {
|
||||
if (unit->mStatusFlags.isOn(ResourceUnit::StatusFlag::FailedMaybe))
|
||||
return Status::_1;
|
||||
if (unit->mStatusFlags.isOn(ResourceUnit::StatusFlag::FileSizeIsZero))
|
||||
return Status::_2;
|
||||
if (unit->mStatusFlags.isOn(ResourceUnit::StatusFlag::_400))
|
||||
return Status::_9;
|
||||
if (unit->mStatusFlags.isOn(ResourceUnit::StatusFlag::FileSizeExceedsAllocSize))
|
||||
return Status::_10;
|
||||
if (unit->mStatusFlags.isOn(ResourceUnit::StatusFlag::_1000))
|
||||
return Status::_11;
|
||||
if (unit->mStatusFlags.isOn(ResourceUnit::StatusFlag::FileOrResInstanceTooLargeForHeap))
|
||||
return Status::_12;
|
||||
if (unit->mStatusFlags.isOn(ResourceUnit::StatusFlag::LoadFailed))
|
||||
return Status::_13;
|
||||
|
||||
#ifdef MATCHING_HACK_NX_CLANG
|
||||
asm("");
|
||||
#endif
|
||||
return Status::_3;
|
||||
}();
|
||||
}
|
||||
updateResourceMgrFlag_();
|
||||
requestUnload();
|
||||
}
|
||||
|
||||
void Handle::requestUnload2() {
|
||||
requestUnload();
|
||||
}
|
||||
|
||||
void Handle::unload() {
|
||||
if (!mFlags.isOn(Flag::_2))
|
||||
return;
|
||||
|
||||
mFlags.reset(Flag::_7);
|
||||
mFlags.set(Flag::_4);
|
||||
|
||||
if (mTaskHandle.hasTask()) {
|
||||
mTaskHandle.removeTaskFromQueue();
|
||||
if (!mUnit) {
|
||||
stubbedLogFunction();
|
||||
mStatus = Status::_14;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (mUnit)
|
||||
ResourceMgrTask::instance()->requestUnloadForSync(this);
|
||||
}
|
||||
|
||||
void Handle::unloadAndResetUnitFlag20000() {
|
||||
if (!mFlags.isOn(Flag::_2))
|
||||
return;
|
||||
|
||||
mFlags.reset(Flag::_7);
|
||||
mFlags.set(Flag::_4);
|
||||
|
||||
if (mTaskHandle.hasTask()) {
|
||||
mTaskHandle.removeTaskFromQueue();
|
||||
if (!mUnit) {
|
||||
stubbedLogFunction();
|
||||
mStatus = Status::_14;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
ResourceUnit* unit = mUnit;
|
||||
if (!unit)
|
||||
return;
|
||||
|
||||
stubbedLogFunction();
|
||||
unit->mStatusFlags.reset(ResourceUnit::StatusFlag::_20000);
|
||||
ResourceMgrTask::instance()->requestUnloadForSync(this);
|
||||
}
|
||||
|
||||
void Handle::resetUnitFlag20000IfSuccess() {
|
||||
if (mFlags.isOff(Flag::_2))
|
||||
return;
|
||||
|
||||
ResourceUnit* unit = mUnit;
|
||||
|
||||
if (isBusy())
|
||||
return;
|
||||
|
||||
if (!mUnit || !mUnit->isParseOk())
|
||||
return;
|
||||
|
||||
if (unit)
|
||||
unit->mStatusFlags.reset(ResourceUnit::StatusFlag::_20000);
|
||||
}
|
||||
|
||||
bool Handle::isBusy() const {
|
||||
if (mTaskHandle.isTaskAttached())
|
||||
return true;
|
||||
|
||||
if (mFlags.isOn(Flag::_2) && mUnit)
|
||||
return mUnit->isTask1ActiveOrStatus7();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool Handle::isReadyOrNeedsParse() const {
|
||||
if ((mFlags.getDirect() & 0xA) != u32(Flag::_2) || isBusy())
|
||||
return false;
|
||||
|
||||
if (isReady())
|
||||
return true;
|
||||
|
||||
return mUnit && mUnit->needsParse();
|
||||
}
|
||||
|
||||
bool Handle::isReady() const {
|
||||
if (isSuccess())
|
||||
return true;
|
||||
|
||||
return checkLoadStatus();
|
||||
}
|
||||
|
||||
bool Handle::checkLoadStatus() const {
|
||||
if (isBusy())
|
||||
return false;
|
||||
|
||||
bool ok = false;
|
||||
if (mFlags.isOn(Flag::_2) && mUnit)
|
||||
ok = mUnit->isStatus9_12_15();
|
||||
|
||||
ok |= mStatus == Status::_1 || mStatus == Status::_2 || mStatus == Status::_3 ||
|
||||
mStatus == Status::_8 || mStatus == Status::_9 || mStatus == Status::_10 ||
|
||||
mStatus == Status::_11 || mStatus == Status::_12 || mStatus == Status::_13 ||
|
||||
mStatus == Status::_14;
|
||||
|
||||
return ok;
|
||||
}
|
||||
|
||||
sead::SafeString Handle::makeEmptyString() {
|
||||
return sead::SafeString::cEmptyString;
|
||||
}
|
||||
|
||||
void Handle::waitForResourceAndParse_(Context* context) {
|
||||
if (!mUnit) {
|
||||
updateResourceMgrFlag_();
|
||||
return;
|
||||
}
|
||||
|
||||
if (mUnit->waitForResourceAndParse(context)) {
|
||||
if (mStatus == Status::_7)
|
||||
mStatus = Status::_4;
|
||||
updateResourceMgrFlag_();
|
||||
return;
|
||||
}
|
||||
|
||||
mStatus = Status::_9;
|
||||
updateResourceMgrFlag_();
|
||||
requestUnload();
|
||||
}
|
||||
|
||||
} // namespace ksys::res
|
||||
|
|
|
@ -13,6 +13,7 @@ class DirectResource;
|
|||
|
||||
namespace ksys::res {
|
||||
|
||||
class Context;
|
||||
class ILoadRequest;
|
||||
class ResourceUnit;
|
||||
|
||||
|
@ -43,15 +44,42 @@ public:
|
|||
|
||||
Status getStatus() const;
|
||||
|
||||
sead::DirectResource* load(const sead::SafeString& path, const ILoadRequest& request,
|
||||
Status* out_status = nullptr);
|
||||
sead::DirectResource* getResource() const;
|
||||
bool isSuccess() const;
|
||||
sead::DirectResource* getResourceUnchecked() const;
|
||||
|
||||
sead::DirectResource* load(const sead::SafeString& path, const ILoadRequest* request,
|
||||
Status* out_status = nullptr);
|
||||
bool isFlag2Set() const;
|
||||
bool requestLoad(const sead::SafeString& path, const ILoadRequest* request,
|
||||
Status* out_status = nullptr);
|
||||
|
||||
bool waitForReady();
|
||||
bool waitForReady(const sead::TickSpan& span);
|
||||
|
||||
bool parseResource(Context* context);
|
||||
bool isFlag8Set() const;
|
||||
|
||||
void requestUnload();
|
||||
void unload();
|
||||
// TODO: how does this differ?
|
||||
void requestUnload2();
|
||||
void unloadAndResetUnitFlag20000();
|
||||
void resetUnitFlag20000IfSuccess();
|
||||
|
||||
bool isBusy() const;
|
||||
bool isReadyOrNeedsParse() const;
|
||||
bool isReady() const;
|
||||
bool checkLoadStatus() const;
|
||||
|
||||
sead::SafeString makeEmptyString();
|
||||
|
||||
void setUnit(ResourceUnit* unit) { mUnit = unit; }
|
||||
|
||||
bool isLinked() const { return mListNode.isLinked(); }
|
||||
|
||||
void setStatusForResourceMgr_(const Status& status);
|
||||
|
||||
static size_t getListNodeOffset() { return offsetof(Handle, mListNode); }
|
||||
|
||||
private:
|
||||
|
@ -61,8 +89,15 @@ private:
|
|||
_4 = 0x4,
|
||||
_7 = 0x7,
|
||||
_8 = 0x8,
|
||||
_F = 0xF,
|
||||
};
|
||||
|
||||
void updateResourceMgrFlag_();
|
||||
void updateStatusAndUnload_();
|
||||
void waitForResourceAndParse_(Context* context);
|
||||
|
||||
inline bool checkPathChange_(const sead::SafeString& path);
|
||||
|
||||
sead::TypedBitFlag<Flag> mFlags = Flag::_1;
|
||||
Status mStatus = Status::_0;
|
||||
ResourceUnit* mUnit = nullptr;
|
||||
|
|
|
@ -34,7 +34,7 @@ bool ResourceInfoContainer::loadResourceSizeTable() {
|
|||
req.mRequester = "ResourceInfoContainer";
|
||||
req.mPath = "System/Resource/ResourceSizeTable.product.rsizetable";
|
||||
req._c = 1;
|
||||
return sead::DynamicCast<Resource>(mRstbHandle.load(req.mPath, req));
|
||||
return sead::DynamicCast<Resource>(mRstbHandle.load(req.mPath, &req));
|
||||
};
|
||||
|
||||
const Resource* resource = load_res();
|
||||
|
|
|
@ -1,20 +0,0 @@
|
|||
#include "KingSystem/Resource/resLoadRequest.h"
|
||||
|
||||
namespace ksys::res {
|
||||
|
||||
ILoadRequest::~ILoadRequest() {
|
||||
;
|
||||
}
|
||||
|
||||
LoadRequest::LoadRequest() = default;
|
||||
|
||||
LoadRequest::LoadRequest(s32 load_data_alignment, u32 arg_c, bool arg_20)
|
||||
: _20(arg_20), mLoadDataAlignment(load_data_alignment) {
|
||||
_c = arg_c;
|
||||
}
|
||||
|
||||
SimpleLoadRequest::SimpleLoadRequest() = default;
|
||||
|
||||
SimplePackedLoadRequest::SimplePackedLoadRequest() = default;
|
||||
|
||||
} // namespace ksys::res
|
|
@ -137,11 +137,13 @@ public:
|
|||
|
||||
bool isFlag4Set() const;
|
||||
|
||||
s32 requestLoad(Handle* handle, const sead::SafeString& path, const ILoadRequest& request);
|
||||
Handle::Status requestLoad(Handle* handle, const sead::SafeString& path,
|
||||
const ILoadRequest& request);
|
||||
void addSExtensionPrefix(sead::StringBuilder& builder) const;
|
||||
s32 requestLoadForSync(Handle* handle, const sead::SafeString& path,
|
||||
const ILoadRequest& request);
|
||||
s32 requestUnload(Handle* handle);
|
||||
Handle::Status requestLoadForSync(Handle* handle, const sead::SafeString& path,
|
||||
const ILoadRequest& request);
|
||||
void requestUnload(Handle* handle);
|
||||
void requestUnloadForSync(Handle* handle);
|
||||
|
||||
void registerUnit(ResourceUnit* unit);
|
||||
void deregisterUnit(ResourceUnit* unit);
|
||||
|
|
|
@ -50,7 +50,7 @@ bool ResourceUnit::init(const ResourceUnit::InitArg& arg) {
|
|||
request.mRequester = "ResourceUnit";
|
||||
request._c = 2;
|
||||
request.mPack = arg.load_req->mPackHandle;
|
||||
mArchiveRes = sead::DynamicCast<sead::ArchiveRes>(mArchiveResHandle.load("", request));
|
||||
mArchiveRes = sead::DynamicCast<sead::ArchiveRes>(mArchiveResHandle.load("", &request));
|
||||
}
|
||||
|
||||
mMapNode.key().setKey(mPath);
|
||||
|
@ -123,7 +123,7 @@ ResourceUnit::~ResourceUnit() {
|
|||
void ResourceUnit::unloadArchiveRes() {
|
||||
if (mArchiveRes) {
|
||||
mArchiveRes = nullptr;
|
||||
mArchiveResHandle.unload();
|
||||
mArchiveResHandle.requestUnload();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -141,11 +141,16 @@ ResourceUnit::Status ResourceUnit::getStatus() const {
|
|||
return mStatus;
|
||||
}
|
||||
|
||||
static const ResourceUnit::Status sUnitStatusTransitionTable[] = {
|
||||
ResourceUnit::Status::_8, ResourceUnit::Status::_11, ResourceUnit::Status::_11,
|
||||
ResourceUnit::Status::_14, ResourceUnit::Status::_14,
|
||||
};
|
||||
|
||||
// NON_MATCHING: ldr + sxtw -> ldrsw
|
||||
void ResourceUnit::updateStatus() {
|
||||
static const Status sMap[] = {Status::_8, Status::_11, Status::_11, Status::_14, Status::_14};
|
||||
if (Status::_2 <= mStatus && mStatus <= Status::_6)
|
||||
mStatus = sMap[s32(mStatus)];
|
||||
const s32 idx = mStatus;
|
||||
if (Status::_2 <= idx && idx <= Status::_6)
|
||||
mStatus = sUnitStatusTransitionTable[idx];
|
||||
}
|
||||
|
||||
bool ResourceUnit::isTask1NotQueued() const {
|
||||
|
@ -168,6 +173,13 @@ bool ResourceUnit::isStatus1() const {
|
|||
return mStatus == Status::_1;
|
||||
}
|
||||
|
||||
bool ResourceUnit::needsParse() const {
|
||||
auto* res = sead::DynamicCast<Resource>(mResource);
|
||||
if (mStatus != Status::_8 && mStatus != Status::_11)
|
||||
return false;
|
||||
return res && res->needsParse();
|
||||
}
|
||||
|
||||
bool ResourceUnit::isStatus9_12_15() const {
|
||||
return mStatus == Status::_9 || mStatus == Status::_12 || mStatus == Status::_15;
|
||||
}
|
||||
|
@ -176,13 +188,15 @@ bool ResourceUnit::isStatus9_12_15() const {
|
|||
bool ResourceUnit::isParseOk() const {
|
||||
auto* ksys_res = sead::DynamicCast<res::Resource>(mResource);
|
||||
|
||||
if (mStatus == Status::_14)
|
||||
const auto status = mStatus.value();
|
||||
|
||||
if (status == Status::_14)
|
||||
return true;
|
||||
|
||||
if (mStatus == Status::_8 && !ksys_res)
|
||||
if (status == Status::_8 && !ksys_res)
|
||||
return mResource != nullptr;
|
||||
|
||||
if (mStatus == Status::_8 && ksys_res)
|
||||
if (status == Status::_8 && ksys_res)
|
||||
return !ksys_res->needsParse();
|
||||
|
||||
return false;
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
#include <KingSystem/Utils/StrTreeMap.h>
|
||||
#include <hostio/seadHostIONode.h>
|
||||
#include <prim/seadEnum.h>
|
||||
#include <prim/seadRuntimeTypeInfo.h>
|
||||
#include <prim/seadSafeString.h>
|
||||
#include <prim/seadTypedBitFlag.h>
|
||||
|
@ -48,24 +49,7 @@ private:
|
|||
class ResourceUnit : public sead::hostio::Node {
|
||||
SEAD_RTTI_BASE(ResourceUnit)
|
||||
public:
|
||||
enum class Status {
|
||||
_0 = 0,
|
||||
_1 = 1,
|
||||
_2 = 2,
|
||||
_3 = 3,
|
||||
_4 = 4,
|
||||
_5 = 5,
|
||||
_6 = 6,
|
||||
_7 = 7,
|
||||
_8 = 8,
|
||||
_9 = 9,
|
||||
_10 = 10,
|
||||
_11 = 11,
|
||||
_12 = 12,
|
||||
_13 = 13,
|
||||
_14 = 14,
|
||||
_15 = 15,
|
||||
};
|
||||
SEAD_ENUM(Status, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15)
|
||||
|
||||
struct InitArg {
|
||||
InitArg() = default;
|
||||
|
@ -119,6 +103,7 @@ public:
|
|||
bool isStatus0() const;
|
||||
bool isTask1ActiveOrStatus7() const;
|
||||
bool isStatus1() const;
|
||||
bool needsParse() const;
|
||||
bool isStatus9_12_15() const;
|
||||
bool isParseOk() const;
|
||||
bool isStatusFlag8000Set() const;
|
||||
|
|
Loading…
Reference in New Issue