summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorGravatar Zach Hilman2019-06-12 19:23:33 -0400
committerGravatar GitHub2019-06-12 19:23:33 -0400
commit0f08f2d562da931de86896824191b48cd1a0436b (patch)
treecc78aa0dc59702d581a56a403958eaeaa8dc8db7 /src/core
parentMerge pull request #2578 from lioncash/cnmt (diff)
parentfile_sys/card_image: Remove obsolete TODO (diff)
downloadyuzu-0f08f2d562da931de86896824191b48cd1a0436b.tar.gz
yuzu-0f08f2d562da931de86896824191b48cd1a0436b.tar.xz
yuzu-0f08f2d562da931de86896824191b48cd1a0436b.zip
Merge pull request #2577 from lioncash/fs
file_sys/card_image: Minor cleanup
Diffstat (limited to 'src/core')
-rw-r--r--src/core/file_sys/card_image.cpp46
1 files changed, 29 insertions, 17 deletions
diff --git a/src/core/file_sys/card_image.cpp b/src/core/file_sys/card_image.cpp
index 2c145bd09..626ed0042 100644
--- a/src/core/file_sys/card_image.cpp
+++ b/src/core/file_sys/card_image.cpp
@@ -18,11 +18,16 @@
18 18
19namespace FileSys { 19namespace FileSys {
20 20
21constexpr std::array<const char*, 0x4> partition_names = {"update", "normal", "secure", "logo"}; 21constexpr std::array partition_names{
22 "update",
23 "normal",
24 "secure",
25 "logo",
26};
22 27
23XCI::XCI(VirtualFile file_) 28XCI::XCI(VirtualFile file_)
24 : file(std::move(file_)), program_nca_status{Loader::ResultStatus::ErrorXCIMissingProgramNCA}, 29 : file(std::move(file_)), program_nca_status{Loader::ResultStatus::ErrorXCIMissingProgramNCA},
25 partitions(0x4) { 30 partitions(partition_names.size()) {
26 if (file->ReadObject(&header) != sizeof(GamecardHeader)) { 31 if (file->ReadObject(&header) != sizeof(GamecardHeader)) {
27 status = Loader::ResultStatus::ErrorBadXCIHeader; 32 status = Loader::ResultStatus::ErrorBadXCIHeader;
28 return; 33 return;
@@ -43,23 +48,24 @@ XCI::XCI(VirtualFile file_)
43 48
44 for (XCIPartition partition : 49 for (XCIPartition partition :
45 {XCIPartition::Update, XCIPartition::Normal, XCIPartition::Secure, XCIPartition::Logo}) { 50 {XCIPartition::Update, XCIPartition::Normal, XCIPartition::Secure, XCIPartition::Logo}) {
46 auto raw = main_hfs.GetFile(partition_names[static_cast<std::size_t>(partition)]); 51 const auto partition_idx = static_cast<std::size_t>(partition);
47 if (raw != nullptr) 52 auto raw = main_hfs.GetFile(partition_names[partition_idx]);
48 partitions[static_cast<std::size_t>(partition)] = 53
49 std::make_shared<PartitionFilesystem>(raw); 54 if (raw != nullptr) {
55 partitions[partition_idx] = std::make_shared<PartitionFilesystem>(std::move(raw));
56 }
50 } 57 }
51 58
52 secure_partition = std::make_shared<NSP>( 59 secure_partition = std::make_shared<NSP>(
53 main_hfs.GetFile(partition_names[static_cast<std::size_t>(XCIPartition::Secure)])); 60 main_hfs.GetFile(partition_names[static_cast<std::size_t>(XCIPartition::Secure)]));
54 61
55 const auto secure_ncas = secure_partition->GetNCAsCollapsed(); 62 ncas = secure_partition->GetNCAsCollapsed();
56 std::copy(secure_ncas.begin(), secure_ncas.end(), std::back_inserter(ncas));
57
58 program = 63 program =
59 secure_partition->GetNCA(secure_partition->GetProgramTitleID(), ContentRecordType::Program); 64 secure_partition->GetNCA(secure_partition->GetProgramTitleID(), ContentRecordType::Program);
60 program_nca_status = secure_partition->GetProgramStatus(secure_partition->GetProgramTitleID()); 65 program_nca_status = secure_partition->GetProgramStatus(secure_partition->GetProgramTitleID());
61 if (program_nca_status == Loader::ResultStatus::ErrorNSPMissingProgramNCA) 66 if (program_nca_status == Loader::ResultStatus::ErrorNSPMissingProgramNCA) {
62 program_nca_status = Loader::ResultStatus::ErrorXCIMissingProgramNCA; 67 program_nca_status = Loader::ResultStatus::ErrorXCIMissingProgramNCA;
68 }
63 69
64 auto result = AddNCAFromPartition(XCIPartition::Update); 70 auto result = AddNCAFromPartition(XCIPartition::Update);
65 if (result != Loader::ResultStatus::Success) { 71 if (result != Loader::ResultStatus::Success) {
@@ -147,8 +153,9 @@ std::shared_ptr<NCA> XCI::GetNCAByType(NCAContentType type) const {
147 153
148VirtualFile XCI::GetNCAFileByType(NCAContentType type) const { 154VirtualFile XCI::GetNCAFileByType(NCAContentType type) const {
149 auto nca = GetNCAByType(type); 155 auto nca = GetNCAByType(type);
150 if (nca != nullptr) 156 if (nca != nullptr) {
151 return nca->GetBaseFile(); 157 return nca->GetBaseFile();
158 }
152 return nullptr; 159 return nullptr;
153} 160}
154 161
@@ -169,17 +176,22 @@ VirtualDir XCI::GetParentDirectory() const {
169} 176}
170 177
171Loader::ResultStatus XCI::AddNCAFromPartition(XCIPartition part) { 178Loader::ResultStatus XCI::AddNCAFromPartition(XCIPartition part) {
172 if (partitions[static_cast<std::size_t>(part)] == nullptr) { 179 const auto partition_index = static_cast<std::size_t>(part);
180 const auto& partition = partitions[partition_index];
181
182 if (partition == nullptr) {
173 return Loader::ResultStatus::ErrorXCIMissingPartition; 183 return Loader::ResultStatus::ErrorXCIMissingPartition;
174 } 184 }
175 185
176 for (const VirtualFile& file : partitions[static_cast<std::size_t>(part)]->GetFiles()) { 186 for (const VirtualFile& file : partition->GetFiles()) {
177 if (file->GetExtension() != "nca") 187 if (file->GetExtension() != "nca") {
178 continue; 188 continue;
189 }
190
179 auto nca = std::make_shared<NCA>(file, nullptr, 0, keys); 191 auto nca = std::make_shared<NCA>(file, nullptr, 0, keys);
180 // TODO(DarkLordZach): Add proper Rev1+ Support 192 if (nca->IsUpdate()) {
181 if (nca->IsUpdate())
182 continue; 193 continue;
194 }
183 if (nca->GetType() == NCAContentType::Program) { 195 if (nca->GetType() == NCAContentType::Program) {
184 program_nca_status = nca->GetStatus(); 196 program_nca_status = nca->GetStatus();
185 } 197 }
@@ -188,7 +200,7 @@ Loader::ResultStatus XCI::AddNCAFromPartition(XCIPartition part) {
188 } else { 200 } else {
189 const u16 error_id = static_cast<u16>(nca->GetStatus()); 201 const u16 error_id = static_cast<u16>(nca->GetStatus());
190 LOG_CRITICAL(Loader, "Could not load NCA {}/{}, failed with error code {:04X} ({})", 202 LOG_CRITICAL(Loader, "Could not load NCA {}/{}, failed with error code {:04X} ({})",
191 partition_names[static_cast<std::size_t>(part)], nca->GetName(), error_id, 203 partition_names[partition_index], nca->GetName(), error_id,
192 nca->GetStatus()); 204 nca->GetStatus());
193 } 205 }
194 } 206 }