Implement most of aocManager

And fix FileDevicePrefix's userdata param type
This commit is contained in:
Léo Lam
2021-03-27 12:35:06 +01:00
parent 96157129f8
commit c3528b3911
7 changed files with 605 additions and 58 deletions
@@ -421,15 +421,14 @@ void ResourceMgrTask::unloadSeadResource(sead::Resource* resource) {
stubbedLogFunction();
}
u32 ResourceMgrTask::getResourceSize(const sead::SafeString& name,
sead::FileDevice* file_device) const {
if (!file_device)
u32 ResourceMgrTask::getResourceSize(const sead::SafeString& name, void* userdata) const {
if (!userdata)
return mResourceInfoContainer.getResourceSize(name);
mFileDevicePrefixesLock.readLock();
for (const auto& entry : mFileDevicePrefixes) {
if (entry.getFileDevice() == file_device) {
if (entry.getUserData() == userdata) {
const u32 size = mResourceInfoContainer.getResourceSize(entry.getPrefix(), name);
if (size == 0 && entry.getField28())
break;
+19 -4
View File
@@ -57,8 +57,8 @@ class FileDevicePrefix {
public:
FileDevicePrefix() = default;
sead::FileDevice* getFileDevice() const { return mFileDevice; }
void setFileDevice(sead::FileDevice* device) { mFileDevice = device; }
void* getUserData() const { return mUserData; }
void setUserData(void* userdata) { mUserData = userdata; }
const sead::SafeString& getPrefix() const { return mPrefix; }
void setPrefix(const sead::SafeString& prefix) { mPrefix = prefix; }
@@ -66,13 +66,15 @@ public:
bool getField28() const { return _28; }
void setField28(bool value) { _28 = value; }
void registerPrefix(const sead::SafeString& prefix, void* userdata, bool set28);
void registerPrefix(const char* prefix, void* userdata, bool set28);
void deregister();
static constexpr size_t getListNodeOffset() { return offsetof(FileDevicePrefix, mListNode); }
private:
sead::ListNode mListNode;
sead::FileDevice* mFileDevice = nullptr;
void* mUserData = nullptr;
sead::SafeString mPrefix;
bool _28 = false;
};
@@ -173,7 +175,7 @@ public:
void unloadSeadResource(sead::Resource* resource);
u32 getResourceSize(const sead::SafeString& name, sead::FileDevice* file_device) const;
u32 getResourceSize(const sead::SafeString& name, void* userdata) const;
void registerFileDevicePrefix(FileDevicePrefix& prefix);
void deregisterFileDevicePrefix(FileDevicePrefix& prefix);
@@ -406,6 +408,19 @@ KSYS_CHECK_SIZE_NX150(sead::TaskBase, 0xd0);
KSYS_CHECK_SIZE_NX150(sead::MethodTreeNode, 0x98);
KSYS_CHECK_SIZE_NX150(ResourceMgrTask, 0x9c0eb8);
inline void FileDevicePrefix::registerPrefix(const sead::SafeString& prefix, void* userdata,
bool set28) {
setUserData(userdata);
setPrefix(prefix);
if (set28)
setField28(true);
ResourceMgrTask::instance()->registerFileDevicePrefix(*this);
}
inline void FileDevicePrefix::registerPrefix(const char* prefix, void* userdata, bool set28) {
registerPrefix(sead::SafeString(prefix), userdata, set28);
}
inline void FileDevicePrefix::deregister() {
if (mListNode.isLinked())
ResourceMgrTask::instance()->deregisterFileDevicePrefix(*this);