From 27da7bc9daf951bce69970881bdbc8719378ca39 Mon Sep 17 00:00:00 2001 From: Zach Hilman Date: Sat, 18 Aug 2018 21:28:17 -0400 Subject: filesystem: Add support for loading of system archives --- src/core/file_sys/registered_cache.cpp | 3 ++- src/core/file_sys/romfs_factory.cpp | 38 ++++++++++++++++++++++++++++++++-- src/core/file_sys/romfs_factory.h | 12 ++++++++++- 3 files changed, 49 insertions(+), 4 deletions(-) (limited to 'src/core/file_sys') diff --git a/src/core/file_sys/registered_cache.cpp b/src/core/file_sys/registered_cache.cpp index d25eeee34..b239c9e48 100644 --- a/src/core/file_sys/registered_cache.cpp +++ b/src/core/file_sys/registered_cache.cpp @@ -77,12 +77,13 @@ static ContentRecordType GetCRTypeFromNCAType(NCAContentType type) { case NCAContentType::Control: return ContentRecordType::Control; case NCAContentType::Data: + case static_cast(0x05): ///< Seems to be used on some system archives return ContentRecordType::Data; case NCAContentType::Manual: // TODO(DarkLordZach): Peek at NCA contents to differentiate Manual and Legal. return ContentRecordType::Manual; default: - UNREACHABLE(); + UNREACHABLE_MSG("Invalid NCAContentType={:02X}", static_cast(type)); } } diff --git a/src/core/file_sys/romfs_factory.cpp b/src/core/file_sys/romfs_factory.cpp index 54fbd3267..7ba4042ca 100644 --- a/src/core/file_sys/romfs_factory.cpp +++ b/src/core/file_sys/romfs_factory.cpp @@ -6,7 +6,9 @@ #include #include "common/common_types.h" #include "common/logging/log.h" +#include "core/core.h" #include "core/file_sys/romfs_factory.h" +#include "core/hle/kernel/process.h" namespace FileSys { @@ -17,9 +19,41 @@ RomFSFactory::RomFSFactory(Loader::AppLoader& app_loader) { } } -ResultVal RomFSFactory::Open(u64 title_id) { - // TODO(DarkLordZach): Use title id. +ResultVal RomFSFactory::OpenCurrentProcess() { return MakeResult(file); } +ResultVal RomFSFactory::Open(u64 title_id, StorageId storage, ContentRecordType type) { + switch (storage) { + case StorageId::NandSystem: { + const auto res = Service::FileSystem::GetSystemNANDContents()->GetEntry(title_id, type); + if (res == nullptr) { + // TODO(DarkLordZach): Find the right error code to use here + return ResultCode(-1); + } + const auto romfs = res->GetRomFS(); + if (romfs == nullptr) { + // TODO(DarkLordZach): Find the right error code to use here + return ResultCode(-1); + } + return MakeResult(romfs); + } + case StorageId::NandUser: { + const auto res = Service::FileSystem::GetUserNANDContents()->GetEntry(title_id, type); + if (res == nullptr) { + // TODO(DarkLordZach): Find the right error code to use here + return ResultCode(-1); + } + const auto romfs = res->GetRomFS(); + if (romfs == nullptr) { + // TODO(DarkLordZach): Find the right error code to use here + return ResultCode(-1); + } + return MakeResult(romfs); + } + default: + UNIMPLEMENTED_MSG("Unimplmented storage_id={:02X}", static_cast(storage)); + } +} + } // namespace FileSys diff --git a/src/core/file_sys/romfs_factory.h b/src/core/file_sys/romfs_factory.h index c19787cd4..455cd4159 100644 --- a/src/core/file_sys/romfs_factory.h +++ b/src/core/file_sys/romfs_factory.h @@ -11,12 +11,22 @@ namespace FileSys { +enum class StorageId : u8 { + None = 0, + Host = 1, + GameCard = 2, + NandSystem = 3, + NandUser = 4, + SdCard = 5, +}; + /// File system interface to the RomFS archive class RomFSFactory { public: explicit RomFSFactory(Loader::AppLoader& app_loader); - ResultVal Open(u64 title_id); + ResultVal OpenCurrentProcess(); + ResultVal Open(u64 title_id, StorageId storage, ContentRecordType type); private: VirtualFile file; -- cgit v1.2.3