diff --git a/src/core/hle/romfs.cpp b/src/core/hle/romfs.cpp index 3157df71d..efd0ec48e 100644 --- a/src/core/hle/romfs.cpp +++ b/src/core/hle/romfs.cpp @@ -53,7 +53,17 @@ static bool MatchName(const u8* buffer, u32 name_length, const std::u16string& n return name == std::u16string(name_buffer.begin(), name_buffer.end()); } -const u8* GetFilePointer(const u8* romfs, const std::vector& path) { +RomFSFile::RomFSFile(const u8* data, u64 length) : data(data), length(length) {} + +const u8* RomFSFile::Data() const { + return data; +} + +u64 RomFSFile::Length() const { + return length; +} + +const RomFSFile GetFile(const u8* romfs, const std::vector& path) { constexpr u32 INVALID_FIELD = 0xFFFFFFFF; // Split path into directory names and file name @@ -73,7 +83,7 @@ const u8* GetFilePointer(const u8* romfs, const std::vector& pat child_dir_offset = dir.first_child_dir_offset; while (true) { if (child_dir_offset == INVALID_FIELD) { - return nullptr; + return RomFSFile(); } const u8* current_child_dir = romfs + header.dir_table_offset + child_dir_offset; std::memcpy(&dir, current_child_dir, sizeof(dir)); @@ -92,11 +102,11 @@ const u8* GetFilePointer(const u8* romfs, const std::vector& pat const u8* current_file = romfs + header.file_table_offset + file_offset; std::memcpy(&file, current_file, sizeof(file)); if (MatchName(current_file + sizeof(file), file.name_length, file_name)) { - return romfs + header.data_offset + file.data_offset; + return RomFSFile(romfs + header.data_offset + file.data_offset, file.data_length); } file_offset = file.next_file_offset; } - return nullptr; + return RomFSFile(); } } // namespace RomFS diff --git a/src/core/hle/romfs.h b/src/core/hle/romfs.h index ee9f29760..41f1d4700 100644 --- a/src/core/hle/romfs.h +++ b/src/core/hle/romfs.h @@ -10,13 +10,25 @@ namespace RomFS { +class RomFSFile { +public: + RomFSFile() = default; + RomFSFile(const u8* data, u64 length); + const u8* Data() const; + u64 Length() const; + +private: + const u8* data = nullptr; + u64 length = 0; +}; + /** - * Gets the pointer to a file in a RomFS image. + * Gets a RomFSFile class to a file in a RomFS image. * @param romfs The pointer to the RomFS image * @param path A vector containing the directory names and file name of the path to the file - * @return the pointer to the file + * @return the RomFSFile to the file * @todo reimplement this with a full RomFS manager */ -const u8* GetFilePointer(const u8* romfs, const std::vector& path); +const RomFSFile GetFile(const u8* romfs, const std::vector& path); } // namespace RomFS diff --git a/src/core/hle/service/apt/apt.cpp b/src/core/hle/service/apt/apt.cpp index 98c263b64..b30f42541 100644 --- a/src/core/hle/service/apt/apt.cpp +++ b/src/core/hle/service/apt/apt.cpp @@ -143,9 +143,9 @@ bool Module::LoadSharedFont() { const char16_t* file_name[4] = {u"cbf_std.bcfnt.lz", u"cbf_zh-Hans-CN.bcfnt.lz", u"cbf_ko-Hang-KR.bcfnt.lz", u"cbf_zh-Hant-TW.bcfnt.lz"}; - const u8* font_file = - RomFS::GetFilePointer(romfs_buffer.data(), {file_name[font_region_code - 1]}); - if (font_file == nullptr) + const RomFS::RomFSFile font_file = + RomFS::GetFile(romfs_buffer.data(), {file_name[font_region_code - 1]}); + if (font_file.Data() == nullptr) return false; struct { @@ -159,7 +159,7 @@ bool Module::LoadSharedFont() { shared_font_header.status = 2; // successfully loaded shared_font_header.region = font_region_code; shared_font_header.decompressed_size = - DecompressLZ11(font_file, shared_font_mem->GetPointer(0x80)); + DecompressLZ11(font_file.Data(), shared_font_mem->GetPointer(0x80)); std::memcpy(shared_font_mem->GetPointer(), &shared_font_header, sizeof(shared_font_header)); *shared_font_mem->GetPointer(0x83) = 'U'; // Change the magic from "CFNT" to "CFNU"