summaryrefslogtreecommitdiff
path: root/src/core/file_sys
diff options
context:
space:
mode:
authorGravatar Zach Hilman2018-08-25 22:42:54 -0400
committerGravatar Zach Hilman2018-09-04 14:29:19 -0400
commite4e55d064edd71fbf359dec9d6b5efad4f0d6c91 (patch)
tree2ab6e2d16084e7071d89139e6ab25b2c11a31990 /src/core/file_sys
parentqt: Add UI support for NSP files (diff)
downloadyuzu-e4e55d064edd71fbf359dec9d6b5efad4f0d6c91.tar.gz
yuzu-e4e55d064edd71fbf359dec9d6b5efad4f0d6c91.tar.xz
yuzu-e4e55d064edd71fbf359dec9d6b5efad4f0d6c91.zip
nsp: Comply with style and performance guidelines
Diffstat (limited to 'src/core/file_sys')
-rw-r--r--src/core/file_sys/card_image.cpp1
-rw-r--r--src/core/file_sys/card_image.h2
-rw-r--r--src/core/file_sys/submission_package.cpp57
-rw-r--r--src/core/file_sys/submission_package.h2
4 files changed, 37 insertions, 25 deletions
diff --git a/src/core/file_sys/card_image.cpp b/src/core/file_sys/card_image.cpp
index d0f1afac0..e07ac8503 100644
--- a/src/core/file_sys/card_image.cpp
+++ b/src/core/file_sys/card_image.cpp
@@ -12,6 +12,7 @@
12#include "core/file_sys/content_archive.h" 12#include "core/file_sys/content_archive.h"
13#include "core/file_sys/nca_metadata.h" 13#include "core/file_sys/nca_metadata.h"
14#include "core/file_sys/partition_filesystem.h" 14#include "core/file_sys/partition_filesystem.h"
15#include "core/file_sys/submission_package.h"
15#include "core/file_sys/vfs_offset.h" 16#include "core/file_sys/vfs_offset.h"
16#include "core/loader/loader.h" 17#include "core/loader/loader.h"
17 18
diff --git a/src/core/file_sys/card_image.h b/src/core/file_sys/card_image.h
index b73f1d900..4d07d3d05 100644
--- a/src/core/file_sys/card_image.h
+++ b/src/core/file_sys/card_image.h
@@ -11,7 +11,6 @@
11#include "common/swap.h" 11#include "common/swap.h"
12#include "core/file_sys/vfs.h" 12#include "core/file_sys/vfs.h"
13#include "core/loader/loader.h" 13#include "core/loader/loader.h"
14#include "submission_package.h"
15 14
16namespace Loader { 15namespace Loader {
17enum class ResultStatus : u16; 16enum class ResultStatus : u16;
@@ -21,6 +20,7 @@ namespace FileSys {
21 20
22class NCA; 21class NCA;
23enum class NCAContentType : u8; 22enum class NCAContentType : u8;
23class NSP;
24 24
25enum class GamecardSize : u8 { 25enum class GamecardSize : u8 {
26 S_1GB = 0xFA, 26 S_1GB = 0xFA,
diff --git a/src/core/file_sys/submission_package.cpp b/src/core/file_sys/submission_package.cpp
index 660771cf8..ce05a5845 100644
--- a/src/core/file_sys/submission_package.cpp
+++ b/src/core/file_sys/submission_package.cpp
@@ -72,21 +72,21 @@ NSP::NSP(VirtualFile file_)
72 72
73 ncas_title[ContentRecordType::Meta] = nca; 73 ncas_title[ContentRecordType::Meta] = nca;
74 for (const auto& rec : cnmt.GetContentRecords()) { 74 for (const auto& rec : cnmt.GetContentRecords()) {
75 const auto next_file = pfs->GetFile( 75 const auto id_string = Common::HexArrayToString(rec.nca_id, false);
76 fmt::format("{}.nca", Common::HexArrayToString(rec.nca_id, false))); 76 const auto next_file = pfs->GetFile(fmt::format("{}.nca", id_string));
77 if (next_file == nullptr) { 77 if (next_file == nullptr) {
78 LOG_WARNING(Service_FS, 78 LOG_WARNING(Service_FS,
79 "NCA with ID {}.nca is listed in content metadata, but cannot " 79 "NCA with ID {}.nca is listed in content metadata, but cannot "
80 "be found in PFS. NSP appears to be corrupted.", 80 "be found in PFS. NSP appears to be corrupted.",
81 Common::HexArrayToString(rec.nca_id, false)); 81 id_string);
82 continue; 82 continue;
83 } 83 }
84 84
85 const auto next_nca = std::make_shared<NCA>(next_file); 85 auto next_nca = std::make_shared<NCA>(next_file);
86 if (next_nca->GetType() == NCAContentType::Program) 86 if (next_nca->GetType() == NCAContentType::Program)
87 program_status[cnmt.GetTitleID()] = next_nca->GetStatus(); 87 program_status[cnmt.GetTitleID()] = next_nca->GetStatus();
88 if (next_nca->GetStatus() == Loader::ResultStatus::Success) 88 if (next_nca->GetStatus() == Loader::ResultStatus::Success)
89 ncas_title[rec.type] = next_nca; 89 ncas_title[rec.type] = std::move(next_nca);
90 } 90 }
91 91
92 break; 92 break;
@@ -95,14 +95,17 @@ NSP::NSP(VirtualFile file_)
95 } 95 }
96} 96}
97 97
98NSP::~NSP() = default;
99
98Loader::ResultStatus NSP::GetStatus() const { 100Loader::ResultStatus NSP::GetStatus() const {
99 return status; 101 return status;
100} 102}
101 103
102Loader::ResultStatus NSP::GetProgramStatus(u64 title_id) const { 104Loader::ResultStatus NSP::GetProgramStatus(u64 title_id) const {
103 if (program_status.find(title_id) != program_status.end()) 105 const auto iter = program_status.find(title_id);
104 return program_status.at(title_id); 106 if (iter == program_status.end())
105 return Loader::ResultStatus::ErrorNSPMissingProgramNCA; 107 return Loader::ResultStatus::ErrorNSPMissingProgramNCA;
108 return iter->second;
106} 109}
107 110
108u64 NSP::GetFirstTitleID() const { 111u64 NSP::GetFirstTitleID() const {
@@ -112,16 +115,19 @@ u64 NSP::GetFirstTitleID() const {
112} 115}
113 116
114u64 NSP::GetProgramTitleID() const { 117u64 NSP::GetProgramTitleID() const {
115 auto out = GetFirstTitleID(); 118 const auto out = GetFirstTitleID();
116 for (const auto other_tid : GetTitleIDs()) { 119 if ((out & 0x800) == 0)
117 if ((out & 0x800) != 0) 120 return out;
118 out = other_tid; 121
119 } 122 const auto ids = GetTitleIDs();
120 return out; 123 const auto iter =
124 std::find_if(ids.begin(), ids.end(), [](u64 tid) { return (tid & 0x800) == 0; });
125 return iter == ids.end() ? out : *iter;
121} 126}
122 127
123std::vector<u64> NSP::GetTitleIDs() const { 128std::vector<u64> NSP::GetTitleIDs() const {
124 std::vector<u64> out; 129 std::vector<u64> out;
130 out.reserve(ncas.size());
125 for (const auto& kv : ncas) 131 for (const auto& kv : ncas)
126 out.push_back(kv.first); 132 out.push_back(kv.first);
127 return out; 133 return out;
@@ -156,7 +162,7 @@ std::multimap<u64, std::shared_ptr<NCA>> NSP::GetNCAsByTitleID() const {
156 std::multimap<u64, std::shared_ptr<NCA>> out; 162 std::multimap<u64, std::shared_ptr<NCA>> out;
157 for (const auto& map : ncas) { 163 for (const auto& map : ncas) {
158 for (const auto& inner_map : map.second) 164 for (const auto& inner_map : map.second)
159 out.insert({map.first, inner_map.second}); 165 out.emplace(map.first, inner_map.second);
160 } 166 }
161 return out; 167 return out;
162} 168}
@@ -168,13 +174,16 @@ std::map<u64, std::map<ContentRecordType, std::shared_ptr<NCA>>> NSP::GetNCAs()
168std::shared_ptr<NCA> NSP::GetNCA(u64 title_id, ContentRecordType type) const { 174std::shared_ptr<NCA> NSP::GetNCA(u64 title_id, ContentRecordType type) const {
169 if (extracted) 175 if (extracted)
170 LOG_WARNING(Service_FS, "called on an NSP that is of type extracted."); 176 LOG_WARNING(Service_FS, "called on an NSP that is of type extracted.");
171 if (ncas.find(title_id) != ncas.end()) {
172 const auto& inner_map = ncas.at(title_id);
173 if (inner_map.find(type) != inner_map.end())
174 return inner_map.at(type);
175 }
176 177
177 return nullptr; 178 const auto title_id_iter = ncas.find(title_id);
179 if (title_id_iter == ncas.end())
180 return nullptr;
181
182 const auto type_iter = title_id_iter->second.find(type);
183 if (type_iter == title_id_iter->second.end())
184 return nullptr;
185
186 return type_iter->second;
178} 187}
179 188
180VirtualFile NSP::GetNCAFile(u64 title_id, ContentRecordType type) const { 189VirtualFile NSP::GetNCAFile(u64 title_id, ContentRecordType type) const {
@@ -197,9 +206,9 @@ std::vector<Core::Crypto::Key128> NSP::GetTitlekey() const {
197 continue; 206 continue;
198 } 207 }
199 208
200 Core::Crypto::Key128 key{}; 209 out.emplace_back();
201 ticket_file->Read(key.data(), key.size(), Core::Crypto::TICKET_FILE_TITLEKEY_OFFSET); 210 ticket_file->Read(out.back().data(), out.back().size(),
202 out.push_back(key); 211 Core::Crypto::TICKET_FILE_TITLEKEY_OFFSET);
203 } 212 }
204 return out; 213 return out;
205} 214}
diff --git a/src/core/file_sys/submission_package.h b/src/core/file_sys/submission_package.h
index 7b520df57..482a8b71f 100644
--- a/src/core/file_sys/submission_package.h
+++ b/src/core/file_sys/submission_package.h
@@ -10,6 +10,7 @@
10#include "common/common_types.h" 10#include "common/common_types.h"
11#include "common/swap.h" 11#include "common/swap.h"
12#include "core/file_sys/content_archive.h" 12#include "core/file_sys/content_archive.h"
13#include "core/file_sys/romfs_factory.h"
13#include "core/file_sys/vfs.h" 14#include "core/file_sys/vfs.h"
14#include "core/loader/loader.h" 15#include "core/loader/loader.h"
15#include "romfs_factory.h" 16#include "romfs_factory.h"
@@ -19,6 +20,7 @@ namespace FileSys {
19class NSP : public ReadOnlyVfsDirectory { 20class NSP : public ReadOnlyVfsDirectory {
20public: 21public:
21 explicit NSP(VirtualFile file); 22 explicit NSP(VirtualFile file);
23 ~NSP();
22 24
23 Loader::ResultStatus GetStatus() const; 25 Loader::ResultStatus GetStatus() const;
24 Loader::ResultStatus GetProgramStatus(u64 title_id) const; 26 Loader::ResultStatus GetProgramStatus(u64 title_id) const;