39namespace rex::filesystem {
54inline constexpr u32 kSTFSBlockSize = 0x1000;
56inline constexpr u32 kSTFSMaxBlocks = 4913000;
79 be_u32 total_block_count;
80 be_u32 free_block_count;
82 [[nodiscard]]
constexpr u32 GetFileTableBlockNumber()
const {
86 constexpr void SetFileTableBlockNumber(u32 value) {
90 [[nodiscard]]
constexpr bool IsValid()
const {
112 void SetLevel0NextBlock(u32 value) {
info_raw = (
info_raw & ~0xFFFFFFu) | (value & 0xFFFFFF); }
114 [[nodiscard]] STFSHashState GetLevel0AllocationState()
const {
115 return static_cast<STFSHashState
>(
static_cast<u8
>((
info_raw >> 30) & 0x3));
118 void SetLevel0AllocationState(STFSHashState value) {
122 [[nodiscard]] u32 GetLevelNFreeBlockCount()
const {
return info_raw & 0x7FFF; }
124 void SetLevelNNumBlocksFree(u32 value) {
info_raw = (
info_raw & ~0x7FFFu) | (value & 0x7FFF); }
126 [[nodiscard]] u32 GetLevelNNumBlocksUnk()
const {
return (
info_raw >> 15) & 0x7FFF; }
128 void SetLevelNNumBlocksUnk(u32 value) {
139 void SetLevelNActiveIndex(
bool value) {
143 [[nodiscard]]
bool IsLevelNWritable()
const {
return (
info_raw & 0x80000000) != 0; }
145 void SetLevelNWriteable(
bool value) {
175 [[nodiscard]]
constexpr u32 GetValidDataBlocks()
const {
179 constexpr void SetValidDataBlocks(u32 value) {
183 [[nodiscard]]
constexpr u32 GetAllocatedDataBlocks()
const {
187 constexpr void SetAllocatedDataBlocks(u32 value) {
191 [[nodiscard]]
constexpr u32 GetStartBlockNumber()
const {
195 constexpr void SetStartBlockNumber(u32 value) {
209 u8 descriptor_length;
212 u8 worker_thread_priority;
217 u8 must_be_zero_for_future_usage : 6;
219 u8 zero_for_downlevel_clients : 1;
226 [[nodiscard]]
constexpr u32 GetDataBlockCount()
const {
230 [[nodiscard]]
constexpr u32 GetStartDataBlock()
const {
234REX_STATIC_ASSERT_SIZE(SVODDeviceDescriptor, 0x24);
247 be_u16 season_number;
248 be_u16 episode_number;
263 u8 profile_transfer : 1;
264 u8 device_transfer : 1;
266 u8 kinect_enabled : 1;
267 u8 disable_network_storage : 1;
268 u8 deep_link_supported : 1;
277 static constexpr u32 kThumbLengthV1 = 0x4000;
278 static constexpr u32 kThumbLengthV2 = 0x3D00;
279 static constexpr u32 kNumLanguagesV1 = 9;
283 BE<kernel::XContentType> content_type;
294 be_u64 data_file_size;
295 BE<XContentVolumeType> volume_type;
305 be_u16
uint[kNumLanguagesV1][128];
306 char16_t chars[kNumLanguagesV1][128];
309 be_u16
uint[kNumLanguagesV1][128];
310 char16_t chars[kNumLanguagesV1][128];
349 [[nodiscard]] std::u16string GetPublisher()
const;
351 [[nodiscard]] std::u16string GetTitleName()
const;
373REX_STATIC_ASSERT_SIZE(XContentMetadata, 0x93D6);
377inline std::u16string ReadBigEndianUnits(
const be_u16* units,
size_t count) {
378 std::u16string result;
379 for (
size_t i = 0; i < count && units[i] != 0; ++i) {
380 result.push_back(
static_cast<char16_t>(
static_cast<u16
>(units[i])));
386 if (language == kernel::XLanguage::kSChinese) {
389 const u32 slot =
static_cast<u32
>(language) - 1;
397 return FindLanguageSlot(language).value_or(std::to_underlying(kernel::XLanguage::kEnglish) - 1);
403 const u32 slot = detail::LanguageSlot(language);
404 if (slot < kNumLanguagesV1) {
414 const u32 slot = detail::LanguageSlot(language);
415 if (slot < kNumLanguagesV1) {
419 return detail::ReadBigEndianUnits(
description_ex_raw.uint[slot - kNumLanguagesV1], 128);
424inline std::u16string XContentMetadata::GetPublisher()
const {
425 return detail::ReadBigEndianUnits(publisher_raw.uint, 64);
428inline std::u16string XContentMetadata::GetTitleName()
const {
429 return detail::ReadBigEndianUnits(title_name_raw.uint, 64);
433 std::u16string_view value) {
434 const std::optional<u32> found = detail::FindLanguageSlot(language);
438 const u32 slot = *found;
439 char16_t* destination =
nullptr;
440 if (slot < kNumLanguagesV1) {
453 std::u16string_view value) {
454 const std::optional<u32> found = detail::FindLanguageSlot(language);
458 const u32 slot = *found;
459 char16_t* destination =
nullptr;
460 if (slot < kNumLanguagesV1) {
481 BE<XContentPackageType> magic;
494REX_STATIC_ASSERT_SIZE(XContentHeader, 0x344);
507namespace rex::filesystem {
542 [[nodiscard]]
virtual const std::filesystem::path& GetPath()
const = 0;
550 [[nodiscard]]
virtual std::span<const ContainerNode>
GetNodes()
const = 0;
552 [[nodiscard]]
virtual const ContainerNode& GetRoot()
const = 0;
573 std::span<u8> buffer)
const = 0;
virtual std::span< const u8 > View(const ContainerNode &node) const =0
virtual std::span< const ContainerNode > GetNodes() const =0
virtual u64 GetTotalSize() const =0
virtual std::string GetNodePath(const ContainerNode &node) const =0
virtual Result< size_t > Read(const ContainerNode &node, u64 offset, std::span< u8 > buffer) const =0
virtual const XContentPackageHeader * GetHeader() const =0
virtual Result< void > Extract(const std::filesystem::path &destination) const =0
virtual const ContainerNode * Find(std::string_view path) const =0
Content package and language IDs.
XEX image reader and PE image parsing.
@ kSTFS
Definition mount.h:33
XLanguage
Definition content.h:156
@ kSChineseDeprecated
Definition content.h:167
constexpr u32 LoadUint24LE(const u8 *p)
Definition endian.h:247
constexpr void StoreUint24LE(u8 *p, u32 value)
Definition endian.h:257
T load(const void *mem)
Definition endian.h:134
std::expected< T, Error > Result
Definition result.h:98
XContentVolumeType
Definition stfs.h:49
@ kSVOD
Definition stfs.h:51
STFSHashState
Definition stfs.h:98
@ kFreePresent
Definition stfs.h:100
@ kFree
Definition stfs.h:99
ContainerType
Definition stfs.h:509
constexpr std::array< u32, 3 > kSTFSBlocksPerHashLevel
Definition stfs.h:59
XContentPackageType
Definition stfs.h:42
@ kPirs
Definition stfs.h:44
@ kLive
Definition stfs.h:45
@ kCon
Definition stfs.h:43
FileStat info
Definition stfs.h:524
u32 parent
Definition stfs.h:525
std::vector< u32 > children
Definition stfs.h:526
std::vector< ContainerExtent > extents
Definition stfs.h:527
Definition file_stat.h:45
STFSDirectoryEntry entries[0x40]
Definition stfs.h:203
be_u16 create_date
Definition stfs.h:170
u8 valid_data_blocks_raw[3]
Definition stfs.h:165
be_u16 directory_index
Definition stfs.h:168
be_u16 modified_time
Definition stfs.h:173
struct rex::filesystem::STFSDirectoryEntry::@062356056335360040122271207357120140221040356220 flags
char name[40]
Definition stfs.h:159
u8 allocated_data_blocks_raw[3]
Definition stfs.h:166
be_u16 create_time
Definition stfs.h:171
be_u16 modified_date
Definition stfs.h:172
u8 start_block_number_raw[3]
Definition stfs.h:167
u32 GetLevel0NextBlock() const
Definition stfs.h:110
be_u32 info_raw
Definition stfs.h:107
bool IsLevelNActiveIndexSet() const
Definition stfs.h:137
STFSHashEntry entries[170]
Definition stfs.h:152
be_u32 block_count
Definition stfs.h:153
u8 directory_overallocated
u8 directory_index_bounds_valid
u16 file_table_block_count
Definition stfs.h:76
u8 top_hash_table_hash[0x14]
Definition stfs.h:78
u8 file_table_block_number_raw[3]
Definition stfs.h:77
u8 descriptor_length
Definition stfs.h:65
u8 block_cache_element_count
Definition stfs.h:210
u8 start_data_block_raw[3]
Definition stfs.h:223
u8 first_fragment_hash_entry[0x14]
Definition stfs.h:213
u8 worker_thread_processor
Definition stfs.h:211
u8 data_block_count_raw[3]
Definition stfs.h:222
u8 move_only_transfer
Definition stfs.h:265
be_u32 colorizable
Definition stfs.h:255
u8 skeleton_version_mask
Definition stfs.h:257
be_u32 license_flags
Definition stfs.h:239
be_u64 licensee_id
Definition stfs.h:237
static constexpr u32 kNumLanguagesV2
Definition stfs.h:281
union rex::filesystem::XContentMetadata::@077353323141217117134140232004315077054233260246 display_name_raw
union rex::filesystem::XContentMetadata::@165172350104132313155041062151030300324230002153 metadata_v2
be_u32 thumbnail_size
Definition stfs.h:324
std::u16string GetDisplayName(kernel::XLanguage language) const
Definition stfs.h:402
kernel::XEXOptExecutionInfo execution_info
Definition stfs.h:286
be_u64 online_creator
Definition stfs.h:296
void SetPublisher(std::u16string_view value)
Definition stfs.h:472
u8 title_thumbnail[kThumbLengthV2]
Definition stfs.h:331
bool SetDescription(kernel::XLanguage language, std::u16string_view value)
Definition stfs.h:452
u8 thumbnail[kThumbLengthV2]
Definition stfs.h:326
be_u32 metadata_version
Definition stfs.h:284
be_u32 data_file_count
Definition stfs.h:293
be_u32 title_thumbnail_size
Definition stfs.h:325
union rex::filesystem::XContentMetadata::@225215021171175152344323276024070143354070223171 display_name_ex_raw
union rex::filesystem::XContentMetadata::@234032230263246373276355357125165067155234216324 description_raw
union rex::filesystem::XContentMetadata::@041324034061221337154025105337152042276375360050 volume_descriptor
union rex::filesystem::XContentMetadata::@263073205202042234034376111102030200121123062057 description_ex_raw
std::u16string GetDescription(kernel::XLanguage language) const
Definition stfs.h:413
bool SetDisplayName(kernel::XLanguage language, std::u16string_view value)
Definition stfs.h:432
void SetTitleName(std::u16string_view value)
Definition stfs.h:476
ASCII and UTF-8 text operations, the string builder and the string keys.
size_t CopyAndSwapTruncating(char16_t *dest, const std::u16string_view source, size_t dest_buffer_count)
Definition text.h:207
Integer types, byte order wrappers and size literals.
char16_t chars[kNumLanguagesV2 - kNumLanguagesV1][128]
be_u16 uint[kNumLanguagesV2 - kNumLanguagesV1][128]
be_u16 uint[kNumLanguagesV1][128]
char16_t chars[kNumLanguagesV1][128]
be_u16 uint[kNumLanguagesV2 - kNumLanguagesV1][128]
char16_t chars[kNumLanguagesV2 - kNumLanguagesV1][128]
be_u16 uint[kNumLanguagesV1][128]
char16_t chars[kNumLanguagesV1][128]
XContentAvatarAsset avatar_asset_data
Move only function, const propagating pointer and scope guard.