summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/file_sys/card_image.cpp1
-rw-r--r--src/core/file_sys/content_archive.cpp4
-rw-r--r--src/core/file_sys/content_archive.h1
-rw-r--r--src/core/loader/nca.h2
-rw-r--r--src/core/loader/xci.cpp33
-rw-r--r--src/core/loader/xci.h5
-rw-r--r--src/yuzu/game_list.cpp5
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
142NCA::NCA(VirtualFile file_) : file(std::move(file_)) { 142NCA::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
42private: 40private:
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 {
26AppLoader_XCI::AppLoader_XCI(FileSys::VirtualFile file) 26AppLoader_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
31AppLoader_XCI::~AppLoader_XCI() = default; 49AppLoader_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
92ResultStatus 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
99ResultStatus 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
37private: 39private:
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