summaryrefslogtreecommitdiff
path: root/src/core/loader/nsp.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/loader/nsp.cpp')
-rw-r--r--src/core/loader/nsp.cpp34
1 files changed, 18 insertions, 16 deletions
diff --git a/src/core/loader/nsp.cpp b/src/core/loader/nsp.cpp
index d815a7cd3..8b167ad3c 100644
--- a/src/core/loader/nsp.cpp
+++ b/src/core/loader/nsp.cpp
@@ -23,10 +23,9 @@ namespace Loader {
23 23
24AppLoader_NSP::AppLoader_NSP(FileSys::VirtualFile file_, 24AppLoader_NSP::AppLoader_NSP(FileSys::VirtualFile file_,
25 const Service::FileSystem::FileSystemController& fsc, 25 const Service::FileSystem::FileSystemController& fsc,
26 const FileSys::ContentProvider& content_provider, 26 const FileSys::ContentProvider& content_provider, u64 program_id,
27 std::size_t program_index) 27 std::size_t program_index)
28 : AppLoader(file_), nsp(std::make_unique<FileSys::NSP>(file_, program_index)), 28 : AppLoader(file_), nsp(std::make_unique<FileSys::NSP>(file_, program_id, program_index)) {
29 title_id(nsp->GetProgramTitleID()) {
30 29
31 if (nsp->GetStatus() != ResultStatus::Success) { 30 if (nsp->GetStatus() != ResultStatus::Success) {
32 return; 31 return;
@@ -46,12 +45,8 @@ AppLoader_NSP::AppLoader_NSP(FileSys::VirtualFile file_,
46 return pm.ParseControlNCA(*control_nca); 45 return pm.ParseControlNCA(*control_nca);
47 }(); 46 }();
48 47
49 if (title_id == 0) {
50 return;
51 }
52
53 secondary_loader = std::make_unique<AppLoader_NCA>( 48 secondary_loader = std::make_unique<AppLoader_NCA>(
54 nsp->GetNCAFile(title_id, FileSys::ContentRecordType::Program)); 49 nsp->GetNCAFile(nsp->GetProgramTitleID(), FileSys::ContentRecordType::Program));
55 } 50 }
56} 51}
57 52
@@ -68,10 +63,11 @@ FileType AppLoader_NSP::IdentifyType(const FileSys::VirtualFile& nsp_file) {
68 } 63 }
69 64
70 // Non-Extracted Type case 65 // Non-Extracted Type case
66 const auto program_id = nsp.GetProgramTitleID();
71 if (!nsp.IsExtractedType() && 67 if (!nsp.IsExtractedType() &&
72 nsp.GetNCA(nsp.GetFirstTitleID(), FileSys::ContentRecordType::Program) != nullptr && 68 nsp.GetNCA(program_id, FileSys::ContentRecordType::Program) != nullptr &&
73 AppLoader_NCA::IdentifyType(nsp.GetNCAFile( 69 AppLoader_NCA::IdentifyType(
74 nsp.GetFirstTitleID(), FileSys::ContentRecordType::Program)) == FileType::NCA) { 70 nsp.GetNCAFile(program_id, FileSys::ContentRecordType::Program)) == FileType::NCA) {
75 return FileType::NSP; 71 return FileType::NSP;
76 } 72 }
77 } 73 }
@@ -84,6 +80,8 @@ AppLoader_NSP::LoadResult AppLoader_NSP::Load(Kernel::KProcess& process, Core::S
84 return {ResultStatus::ErrorAlreadyLoaded, {}}; 80 return {ResultStatus::ErrorAlreadyLoaded, {}};
85 } 81 }
86 82
83 const auto title_id = nsp->GetProgramTitleID();
84
87 if (!nsp->IsExtractedType() && title_id == 0) { 85 if (!nsp->IsExtractedType() && title_id == 0) {
88 return {ResultStatus::ErrorNSPMissingProgramNCA, {}}; 86 return {ResultStatus::ErrorNSPMissingProgramNCA, {}};
89 } 87 }
@@ -93,7 +91,7 @@ AppLoader_NSP::LoadResult AppLoader_NSP::Load(Kernel::KProcess& process, Core::S
93 return {nsp_status, {}}; 91 return {nsp_status, {}};
94 } 92 }
95 93
96 const auto nsp_program_status = nsp->GetProgramStatus(title_id); 94 const auto nsp_program_status = nsp->GetProgramStatus();
97 if (nsp_program_status != ResultStatus::Success) { 95 if (nsp_program_status != ResultStatus::Success) {
98 return {nsp_program_status, {}}; 96 return {nsp_program_status, {}};
99 } 97 }
@@ -134,8 +132,8 @@ ResultStatus AppLoader_NSP::ReadUpdateRaw(FileSys::VirtualFile& out_file) {
134 return ResultStatus::ErrorNoPackedUpdate; 132 return ResultStatus::ErrorNoPackedUpdate;
135 } 133 }
136 134
137 const auto read = 135 const auto read = nsp->GetNCAFile(FileSys::GetUpdateTitleID(nsp->GetProgramTitleID()),
138 nsp->GetNCAFile(FileSys::GetUpdateTitleID(title_id), FileSys::ContentRecordType::Program); 136 FileSys::ContentRecordType::Program);
139 137
140 if (read == nullptr) { 138 if (read == nullptr) {
141 return ResultStatus::ErrorNoPackedUpdate; 139 return ResultStatus::ErrorNoPackedUpdate;
@@ -151,11 +149,15 @@ ResultStatus AppLoader_NSP::ReadUpdateRaw(FileSys::VirtualFile& out_file) {
151} 149}
152 150
153ResultStatus AppLoader_NSP::ReadProgramId(u64& out_program_id) { 151ResultStatus AppLoader_NSP::ReadProgramId(u64& out_program_id) {
154 if (title_id == 0) { 152 out_program_id = nsp->GetProgramTitleID();
153 if (out_program_id == 0) {
155 return ResultStatus::ErrorNotInitialized; 154 return ResultStatus::ErrorNotInitialized;
156 } 155 }
156 return ResultStatus::Success;
157}
157 158
158 out_program_id = title_id; 159ResultStatus AppLoader_NSP::ReadProgramIds(std::vector<u64>& out_program_ids) {
160 out_program_ids = nsp->GetProgramTitleIDs();
159 return ResultStatus::Success; 161 return ResultStatus::Success;
160} 162}
161 163