diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/file_sys/card_image.cpp | 1 | ||||
| -rw-r--r-- | src/core/file_sys/content_archive.cpp | 4 | ||||
| -rw-r--r-- | src/core/file_sys/content_archive.h | 1 | ||||
| -rw-r--r-- | src/core/loader/nca.h | 2 | ||||
| -rw-r--r-- | src/core/loader/xci.cpp | 33 | ||||
| -rw-r--r-- | src/core/loader/xci.h | 5 | ||||
| -rw-r--r-- | src/yuzu/game_list.cpp | 5 |
7 files changed, 46 insertions, 5 deletions
diff --git a/src/core/file_sys/card_image.cpp b/src/core/file_sys/card_image.cpp index 395eea8ae..e897d9913 100644 --- a/src/core/file_sys/card_image.cpp +++ b/src/core/file_sys/card_image.cpp | |||
| @@ -5,6 +5,7 @@ | |||
| 5 | #include <array> | 5 | #include <array> |
| 6 | #include <string> | 6 | #include <string> |
| 7 | #include <core/loader/loader.h> | 7 | #include <core/loader/loader.h> |
| 8 | #include "common/logging/log.h" | ||
| 8 | #include "core/file_sys/card_image.h" | 9 | #include "core/file_sys/card_image.h" |
| 9 | #include "core/file_sys/partition_filesystem.h" | 10 | #include "core/file_sys/partition_filesystem.h" |
| 10 | #include "core/file_sys/vfs_offset.h" | 11 | #include "core/file_sys/vfs_offset.h" |
diff --git a/src/core/file_sys/content_archive.cpp b/src/core/file_sys/content_archive.cpp index 79e70f6ef..8cd1f5e6a 100644 --- a/src/core/file_sys/content_archive.cpp +++ b/src/core/file_sys/content_archive.cpp | |||
| @@ -140,6 +140,10 @@ VirtualFile NCA::Decrypt(NCASectionHeader header, VirtualFile in, u64 starting_o | |||
| 140 | } | 140 | } |
| 141 | 141 | ||
| 142 | NCA::NCA(VirtualFile file_) : file(std::move(file_)) { | 142 | NCA::NCA(VirtualFile file_) : file(std::move(file_)) { |
| 143 | if (file == nullptr) { | ||
| 144 | status = Loader::ResultStatus::ErrorInvalidFormat; | ||
| 145 | return; | ||
| 146 | } | ||
| 143 | if (sizeof(NCAHeader) != file->ReadObject(&header)) | 147 | if (sizeof(NCAHeader) != file->ReadObject(&header)) |
| 144 | LOG_ERROR(Loader, "File reader errored out during header read."); | 148 | LOG_ERROR(Loader, "File reader errored out during header read."); |
| 145 | 149 | ||
diff --git a/src/core/file_sys/content_archive.h b/src/core/file_sys/content_archive.h index 6492163b5..a984a4d36 100644 --- a/src/core/file_sys/content_archive.h +++ b/src/core/file_sys/content_archive.h | |||
| @@ -12,6 +12,7 @@ | |||
| 12 | #include "common/common_funcs.h" | 12 | #include "common/common_funcs.h" |
| 13 | #include "common/common_types.h" | 13 | #include "common/common_types.h" |
| 14 | #include "common/swap.h" | 14 | #include "common/swap.h" |
| 15 | #include "control_metadata.h" | ||
| 15 | #include "core/crypto/key_manager.h" | 16 | #include "core/crypto/key_manager.h" |
| 16 | #include "core/file_sys/partition_filesystem.h" | 17 | #include "core/file_sys/partition_filesystem.h" |
| 17 | #include "core/loader/loader.h" | 18 | #include "core/loader/loader.h" |
diff --git a/src/core/loader/nca.h b/src/core/loader/nca.h index 443bc1202..7f7d8ea0b 100644 --- a/src/core/loader/nca.h +++ b/src/core/loader/nca.h | |||
| @@ -35,8 +35,6 @@ public: | |||
| 35 | ResultStatus ReadRomFS(FileSys::VirtualFile& dir) override; | 35 | ResultStatus ReadRomFS(FileSys::VirtualFile& dir) override; |
| 36 | ResultStatus ReadProgramId(u64& out_program_id) override; | 36 | ResultStatus ReadProgramId(u64& out_program_id) override; |
| 37 | 37 | ||
| 38 | ResultStatus ReadProgramId(u64& out_program_id) override; | ||
| 39 | |||
| 40 | ~AppLoader_NCA(); | 38 | ~AppLoader_NCA(); |
| 41 | 39 | ||
| 42 | private: | 40 | private: |
diff --git a/src/core/loader/xci.cpp b/src/core/loader/xci.cpp index eb4dee2c2..d3fe24419 100644 --- a/src/core/loader/xci.cpp +++ b/src/core/loader/xci.cpp | |||
| @@ -26,7 +26,25 @@ namespace Loader { | |||
| 26 | AppLoader_XCI::AppLoader_XCI(FileSys::VirtualFile file) | 26 | AppLoader_XCI::AppLoader_XCI(FileSys::VirtualFile file) |
| 27 | : AppLoader(file), xci(std::make_unique<FileSys::XCI>(file)), | 27 | : AppLoader(file), xci(std::make_unique<FileSys::XCI>(file)), |
| 28 | nca_loader(std::make_unique<AppLoader_NCA>( | 28 | nca_loader(std::make_unique<AppLoader_NCA>( |
| 29 | xci->GetNCAFileByType(FileSys::NCAContentType::Program))) {} | 29 | xci->GetNCAFileByType(FileSys::NCAContentType::Program))) { |
| 30 | if (xci->GetStatus() != ResultStatus::Success) | ||
| 31 | return; | ||
| 32 | const auto control_nca = xci->GetNCAByType(FileSys::NCAContentType::Control); | ||
| 33 | if (control_nca == nullptr || control_nca->GetStatus() != ResultStatus::Success) | ||
| 34 | return; | ||
| 35 | const auto romfs = FileSys::ExtractRomFS(control_nca->GetRomFS()); | ||
| 36 | if (romfs == nullptr) | ||
| 37 | return; | ||
| 38 | for (const auto& language : FileSys::LANGUAGE_NAMES) { | ||
| 39 | icon_file = romfs->GetFile("icon_" + std::string(language) + ".dat"); | ||
| 40 | if (icon_file != nullptr) | ||
| 41 | break; | ||
| 42 | } | ||
| 43 | const auto nacp_raw = romfs->GetFile("control.nacp"); | ||
| 44 | if (nacp_raw == nullptr) | ||
| 45 | return; | ||
| 46 | nacp_file = std::make_shared<FileSys::NACP>(nacp_raw); | ||
| 47 | } | ||
| 30 | 48 | ||
| 31 | AppLoader_XCI::~AppLoader_XCI() = default; | 49 | AppLoader_XCI::~AppLoader_XCI() = default; |
| 32 | 50 | ||
| @@ -71,4 +89,17 @@ ResultStatus AppLoader_XCI::ReadProgramId(u64& out_program_id) { | |||
| 71 | return nca_loader->ReadProgramId(out_program_id); | 89 | return nca_loader->ReadProgramId(out_program_id); |
| 72 | } | 90 | } |
| 73 | 91 | ||
| 92 | ResultStatus AppLoader_XCI::ReadIcon(std::vector<u8>& buffer) { | ||
| 93 | if (icon_file == nullptr) | ||
| 94 | return ResultStatus::ErrorInvalidFormat; | ||
| 95 | buffer = icon_file->ReadAllBytes(); | ||
| 96 | return ResultStatus::Success; | ||
| 97 | } | ||
| 98 | |||
| 99 | ResultStatus AppLoader_XCI::ReadTitle(std::string& title) { | ||
| 100 | if (nacp_file == nullptr) | ||
| 101 | return ResultStatus::ErrorInvalidFormat; | ||
| 102 | title = nacp_file->GetApplicationName(); | ||
| 103 | return ResultStatus::Success; | ||
| 104 | } | ||
| 74 | } // namespace Loader | 105 | } // namespace Loader |
diff --git a/src/core/loader/xci.h b/src/core/loader/xci.h index 0dbcfbdf8..973833050 100644 --- a/src/core/loader/xci.h +++ b/src/core/loader/xci.h | |||
| @@ -33,12 +33,17 @@ public: | |||
| 33 | 33 | ||
| 34 | ResultStatus ReadRomFS(FileSys::VirtualFile& dir) override; | 34 | ResultStatus ReadRomFS(FileSys::VirtualFile& dir) override; |
| 35 | ResultStatus ReadProgramId(u64& out_program_id) override; | 35 | ResultStatus ReadProgramId(u64& out_program_id) override; |
| 36 | ResultStatus ReadIcon(std::vector<u8>& buffer) override; | ||
| 37 | ResultStatus ReadTitle(std::string& title) override; | ||
| 36 | 38 | ||
| 37 | private: | 39 | private: |
| 38 | FileSys::ProgramMetadata metadata; | 40 | FileSys::ProgramMetadata metadata; |
| 39 | 41 | ||
| 40 | std::unique_ptr<FileSys::XCI> xci; | 42 | std::unique_ptr<FileSys::XCI> xci; |
| 41 | std::unique_ptr<AppLoader_NCA> nca_loader; | 43 | std::unique_ptr<AppLoader_NCA> nca_loader; |
| 44 | |||
| 45 | FileSys::VirtualFile icon_file; | ||
| 46 | std::shared_ptr<FileSys::NACP> nacp_file; | ||
| 42 | }; | 47 | }; |
| 43 | 48 | ||
| 44 | } // namespace Loader | 49 | } // namespace Loader |
diff --git a/src/yuzu/game_list.cpp b/src/yuzu/game_list.cpp index 481d91be5..5f47f5a2b 100644 --- a/src/yuzu/game_list.cpp +++ b/src/yuzu/game_list.cpp | |||
| @@ -9,6 +9,7 @@ | |||
| 9 | #include <QKeyEvent> | 9 | #include <QKeyEvent> |
| 10 | #include <QMenu> | 10 | #include <QMenu> |
| 11 | #include <QThreadPool> | 11 | #include <QThreadPool> |
| 12 | #include <boost/container/flat_map.hpp> | ||
| 12 | #include "common/common_paths.h" | 13 | #include "common/common_paths.h" |
| 13 | #include "common/logging/log.h" | 14 | #include "common/logging/log.h" |
| 14 | #include "common/string_util.h" | 15 | #include "common/string_util.h" |
| @@ -458,9 +459,9 @@ void GameListWorker::AddFstEntriesToGameList(const std::string& dir_path, unsign | |||
| 458 | // Use from metadata pool. | 459 | // Use from metadata pool. |
| 459 | if (nca_control_map.find(program_id) != nca_control_map.end()) { | 460 | if (nca_control_map.find(program_id) != nca_control_map.end()) { |
| 460 | const auto nca = nca_control_map[program_id]; | 461 | const auto nca = nca_control_map[program_id]; |
| 461 | auto control_dir = nca->GetSection(0); | 462 | const auto control_dir = nca->GetSubdirectories()[0]; |
| 462 | 463 | ||
| 463 | auto nacp_file = control_dir->GetFile("control.nacp"); | 464 | const auto nacp_file = control_dir->GetFile("control.nacp"); |
| 464 | FileSys::NACP nacp(nacp_file); | 465 | FileSys::NACP nacp(nacp_file); |
| 465 | name = nacp.GetApplicationName(); | 466 | name = nacp.GetApplicationName(); |
| 466 | 467 | ||