1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
#pragma once
#include <container/seadListImpl.h>
#include <prim/seadRuntimeTypeInfo.h>
#include <prim/seadSafeString.h>
#include <prim/seadTypedBitFlag.h>
#include "KingSystem/Utils/Thread/ManagedTaskHandle.h"
#include "KingSystem/Utils/Types.h"
namespace sead {
class DirectResource;
}
namespace ksys::res {
class Context;
class ILoadRequest;
class ResourceUnit;
class Handle {
SEAD_RTTI_BASE(Handle)
public:
enum class Status {
/// "No File" (2)
NoFile = 0,
_1 = 1,
/// "Size Zero" (8)
SizeZero = 2,
_3 = 3,
_4 = 4,
_5 = 5,
_6 = 6,
_7 = 7,
_8 = 8,
/// "Compose NG" (9)
ParseFailed = 9,
/// "AllocSizeNG" (10)
BadAllocSize = 10,
/// "Edited" (11)?
Edited = 11,
/// "HeapSizeNG" (12)
BadHeapSize = 12,
/// "FileDeviceNG" (13)
FileDeviceError = 13,
/// "Canceled" (16)
Cancelled = 14,
/// Unknown
Unknown = 15,
};
Handle();
virtual ~Handle();
Status getStatus() const;
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 requestedLoad() 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 hasParsedResource() 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();
ResourceUnit* getUnit() const { return mUnit; }
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:
enum class Flag : u8 {
Dummy = 0x1,
LoadRequested = 0x2,
UnloadRequested = 0x4,
LoadUnloadFlags = Dummy | LoadRequested | UnloadRequested,
Parsed = 0x8,
AllStatusFlags = LoadUnloadFlags | Parsed,
};
void updateResourceMgrFlag_();
void updateStatusAndUnload_();
void waitForResourceAndParse_(Context* context);
inline bool checkPathChange_(const sead::SafeString& path);
sead::TypedBitFlag<Flag> mFlags = Flag::Dummy;
Status mStatus = Status::NoFile;
ResourceUnit* mUnit = nullptr;
util::ManagedTaskHandle mTaskHandle;
sead::ListNode mListNode;
};
KSYS_CHECK_SIZE_NX150(Handle, 0x50);
} // namespace ksys::res
|