소스 검색

submission_package: Move NCA reading code to its own function

This too, is completely separate behavior from what is in the
constructor, so we can move this to its own isolated function to keep
everything self-contained.
Lioncash 7 년 전
부모
커밋
fd312abedd
2개의 변경된 파일48개의 추가작업 그리고 43개의 파일을 삭제
  1. 46 43
      src/core/file_sys/submission_package.cpp
  2. 2 0
      src/core/file_sys/submission_package.h

+ 46 - 43
src/core/file_sys/submission_package.cpp

@@ -71,49 +71,7 @@ NSP::NSP(VirtualFile file_)
     const auto files = pfs->GetFiles();
 
     SetTicketKeys(files);
-
-    for (const auto& outer_file : files) {
-        if (outer_file->GetName().substr(outer_file->GetName().size() - 9) != ".cnmt.nca") {
-            continue;
-        }
-
-        const auto nca = std::make_shared<NCA>(outer_file);
-        if (nca->GetStatus() != Loader::ResultStatus::Success) {
-            program_status[nca->GetTitleId()] = nca->GetStatus();
-            continue;
-        }
-
-        const auto section0 = nca->GetSubdirectories()[0];
-
-        for (const auto& inner_file : section0->GetFiles()) {
-            if (inner_file->GetExtension() != "cnmt")
-                continue;
-
-            const CNMT cnmt(inner_file);
-            auto& ncas_title = ncas[cnmt.GetTitleID()];
-
-            ncas_title[ContentRecordType::Meta] = nca;
-            for (const auto& rec : cnmt.GetContentRecords()) {
-                const auto id_string = Common::HexArrayToString(rec.nca_id, false);
-                const auto next_file = pfs->GetFile(fmt::format("{}.nca", id_string));
-                if (next_file == nullptr) {
-                    LOG_WARNING(Service_FS,
-                        "NCA with ID {}.nca is listed in content metadata, but cannot "
-                        "be found in PFS. NSP appears to be corrupted.",
-                        id_string);
-                    continue;
-                }
-
-                auto next_nca = std::make_shared<NCA>(next_file);
-                if (next_nca->GetType() == NCAContentType::Program)
-                    program_status[cnmt.GetTitleID()] = next_nca->GetStatus();
-                if (next_nca->GetStatus() == Loader::ResultStatus::Success)
-                    ncas_title[rec.type] = std::move(next_nca);
-            }
-
-            break;
-        }
-    }
+    ReadNCAs(files);
 }
 
 NSP::~NSP() = default;
@@ -253,4 +211,49 @@ VirtualDir NSP::GetParentDirectory() const {
 bool NSP::ReplaceFileWithSubdirectory(VirtualFile file, VirtualDir dir) {
     return false;
 }
+
+void NSP::ReadNCAs(const std::vector<VirtualFile>& files) {
+    for (const auto& outer_file : files) {
+        if (outer_file->GetName().substr(outer_file->GetName().size() - 9) != ".cnmt.nca") {
+            continue;
+        }
+
+        const auto nca = std::make_shared<NCA>(outer_file);
+        if (nca->GetStatus() != Loader::ResultStatus::Success) {
+            program_status[nca->GetTitleId()] = nca->GetStatus();
+            continue;
+        }
+
+        const auto section0 = nca->GetSubdirectories()[0];
+
+        for (const auto& inner_file : section0->GetFiles()) {
+            if (inner_file->GetExtension() != "cnmt")
+                continue;
+
+            const CNMT cnmt(inner_file);
+            auto& ncas_title = ncas[cnmt.GetTitleID()];
+
+            ncas_title[ContentRecordType::Meta] = nca;
+            for (const auto& rec : cnmt.GetContentRecords()) {
+                const auto id_string = Common::HexArrayToString(rec.nca_id, false);
+                const auto next_file = pfs->GetFile(fmt::format("{}.nca", id_string));
+                if (next_file == nullptr) {
+                    LOG_WARNING(Service_FS,
+                                "NCA with ID {}.nca is listed in content metadata, but cannot "
+                                "be found in PFS. NSP appears to be corrupted.",
+                                id_string);
+                    continue;
+                }
+
+                auto next_nca = std::make_shared<NCA>(next_file);
+                if (next_nca->GetType() == NCAContentType::Program)
+                    program_status[cnmt.GetTitleID()] = next_nca->GetStatus();
+                if (next_nca->GetStatus() == Loader::ResultStatus::Success)
+                    ncas_title[rec.type] = std::move(next_nca);
+            }
+
+            break;
+        }
+    }
+}
 } // namespace FileSys

+ 2 - 0
src/core/file_sys/submission_package.h

@@ -59,6 +59,8 @@ protected:
     bool ReplaceFileWithSubdirectory(VirtualFile file, VirtualDir dir) override;
 
 private:
+    void ReadNCAs(const std::vector<VirtualFile>& files);
+
     VirtualFile file;
 
     bool extracted;