@@ -26,29 +26,95 @@ struct ParsedAppXml
26
26
uint32 sdk_version;
27
27
};
28
28
29
+ enum class CosCapabilityGroup : uint32
30
+ {
31
+ None = 0 ,
32
+ BSP = 1 ,
33
+ DK = 3 ,
34
+ USB = 9 ,
35
+ UHS = 12 ,
36
+ FS = 11 ,
37
+ MCP = 13 ,
38
+ NIM = 14 ,
39
+ ACT = 15 ,
40
+ FPD = 16 ,
41
+ BOSS = 17 ,
42
+ ACP = 18 ,
43
+ PDM = 19 ,
44
+ AC = 20 ,
45
+ NDM = 21 ,
46
+ NSEC = 22
47
+ };
48
+
49
+ enum class CosCapabilityBits : uint64
50
+ {
51
+ All = 0xFFFFFFFFFFFFFFFFull
52
+ };
53
+
54
+ enum class CosCapabilityBitsFS : uint64
55
+ {
56
+ ODD_READ = (1llu << 0 ),
57
+ ODD_WRITE = (1llu << 1 ),
58
+ ODD_RAW_OPEN = (1llu << 2 ),
59
+ ODD_MOUNT = (1llu << 3 ),
60
+ SLCCMPT_READ = (1llu << 4 ),
61
+ SLCCMPT_WRITE = (1llu << 5 ),
62
+ SLCCMPT_RAW_OPEN = (1llu << 6 ),
63
+ SLCCMPT_MOUNT = (1llu << 7 ),
64
+ SLC_READ = (1llu << 8 ),
65
+ SLC_WRITE = (1llu << 9 ),
66
+ SLC_RAW_OPEN = (1llu << 10 ),
67
+ SLC_MOUNT = (1llu << 11 ),
68
+ MLC_READ = (1llu << 12 ),
69
+ MLC_WRITE = (1llu << 13 ),
70
+ MLC_RAW_OPEN = (1llu << 14 ),
71
+ MLC_MOUNT = (1llu << 15 ),
72
+ SDCARD_READ = (1llu << 16 ),
73
+ SDCARD_WRITE = (1llu << 17 ),
74
+ SDCARD_RAW_OPEN = (1llu << 18 ),
75
+ SDCARD_MOUNT = (1llu << 19 ),
76
+ HFIO_READ = (1llu << 20 ),
77
+ HFIO_WRITE = (1llu << 21 ),
78
+ HFIO_RAW_OPEN = (1llu << 22 ),
79
+ HFIO_MOUNT = (1llu << 23 ),
80
+ RAMDISK_READ = (1llu << 24 ),
81
+ RAMDISK_WRITE = (1llu << 25 ),
82
+ RAMDISK_RAW_OPEN = (1llu << 26 ),
83
+ RAMDISK_MOUNT = (1llu << 27 ),
84
+ USB_READ = (1llu << 28 ),
85
+ USB_WRITE = (1llu << 29 ),
86
+ USB_RAW_OPEN = (1llu << 30 ),
87
+ USB_MOUNT = (1llu << 31 ),
88
+ OTHER_READ = (1llu << 32 ),
89
+ OTHER_WRITE = (1llu << 33 ),
90
+ OTHER_RAW_OPEN = (1llu << 34 ),
91
+ OTHER_MOUNT = (1llu << 35 )
92
+ };
93
+ ENABLE_BITMASK_OPERATORS (CosCapabilityBitsFS);
94
+
29
95
struct ParsedCosXml
30
96
{
97
+ public:
98
+
31
99
std::string argstr;
32
100
33
- static ParsedCosXml* Parse (uint8* xmlData, size_t xmlLen)
101
+ struct Permission
34
102
{
35
- pugi::xml_document app_doc;
36
- if (!app_doc.load_buffer_inplace (xmlData, xmlLen))
37
- return nullptr ;
38
-
39
- const auto root = app_doc.child (" app" );
40
- if (!root)
41
- return nullptr ;
103
+ CosCapabilityGroup group{CosCapabilityGroup::None};
104
+ CosCapabilityBits mask{CosCapabilityBits::All};
105
+ };
106
+ Permission permissions[19 ]{};
42
107
43
- ParsedCosXml* parsedCos = new ParsedCosXml ( );
108
+ static ParsedCosXml* Parse (uint8* xmlData, size_t xmlLen );
44
109
45
- for (const auto & child : root.children ())
110
+ CosCapabilityBits GetCapabilityBits (CosCapabilityGroup group) const
111
+ {
112
+ for (const auto & perm : permissions)
46
113
{
47
- std::string_view name = child.name ();
48
- if (name == " argstr" )
49
- parsedCos->argstr = child.text ().as_string ();
114
+ if (perm.group == group)
115
+ return perm.mask ;
50
116
}
51
- return parsedCos ;
117
+ return CosCapabilityBits::All ;
52
118
}
53
119
};
54
120
@@ -151,7 +217,7 @@ class TitleInfo
151
217
// cos.xml
152
218
std::string GetArgStr () const ;
153
219
154
- // meta.xml also contains a version which seems to match the one from app.xml
220
+ // meta.xml also contains a version field which seems to match the one from app.xml
155
221
// the titleId in meta.xml seems to be the title id of the base game for updates specifically. For AOC content it's the AOC's titleId
156
222
157
223
TitleIdParser::TITLE_TYPE GetTitleType ();
@@ -160,6 +226,11 @@ class TitleInfo
160
226
return m_parsedMetaXml;
161
227
}
162
228
229
+ ParsedCosXml* GetCosInfo ()
230
+ {
231
+ return m_parsedCosXml;
232
+ }
233
+
163
234
std::string GetPrintPath () const ; // formatted path including type and WUA subpath. Intended for logging and user-facing information
164
235
std::string GetInstallPath () const ; // installation subpath, relative to storage base. E.g. "usr/title/.../..." or "sys/title/.../..."
165
236
0 commit comments