diff options
| author | 2019-06-12 19:23:33 -0400 | |
|---|---|---|
| committer | 2019-06-12 19:23:33 -0400 | |
| commit | 0f08f2d562da931de86896824191b48cd1a0436b (patch) | |
| tree | cc78aa0dc59702d581a56a403958eaeaa8dc8db7 /src/core | |
| parent | Merge pull request #2578 from lioncash/cnmt (diff) | |
| parent | file_sys/card_image: Remove obsolete TODO (diff) | |
| download | yuzu-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.cpp | 46 |
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 | ||
| 19 | namespace FileSys { | 19 | namespace FileSys { |
| 20 | 20 | ||
| 21 | constexpr std::array<const char*, 0x4> partition_names = {"update", "normal", "secure", "logo"}; | 21 | constexpr std::array partition_names{ |
| 22 | "update", | ||
| 23 | "normal", | ||
| 24 | "secure", | ||
| 25 | "logo", | ||
| 26 | }; | ||
| 22 | 27 | ||
| 23 | XCI::XCI(VirtualFile file_) | 28 | XCI::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 | ||
| 148 | VirtualFile XCI::GetNCAFileByType(NCAContentType type) const { | 154 | VirtualFile 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 | ||
| 171 | Loader::ResultStatus XCI::AddNCAFromPartition(XCIPartition part) { | 178 | Loader::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 | } |