diff options
| author | 2021-07-20 13:10:05 +0800 | |
|---|---|---|
| committer | 2021-07-20 01:10:05 -0400 | |
| commit | 07073734ed3785d1dee487f0c898a645fbd5f03c (patch) | |
| tree | e7c72b615b7a551cc1fb8a6a336bce60e5a0d314 /src/core/loader/nsp.cpp | |
| parent | Merge pull request #6580 from ReinUsesLisp/xfb-radv (diff) | |
| download | yuzu-07073734ed3785d1dee487f0c898a645fbd5f03c.tar.gz yuzu-07073734ed3785d1dee487f0c898a645fbd5f03c.tar.xz yuzu-07073734ed3785d1dee487f0c898a645fbd5f03c.zip | |
file_sys: Support load game collection (#6582)
Adds support for loading games with multiple programs embedded within such as the Dragon Quest 1+2+3 Collection
Diffstat (limited to 'src/core/loader/nsp.cpp')
| -rw-r--r-- | src/core/loader/nsp.cpp | 34 |
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 | ||
| 24 | AppLoader_NSP::AppLoader_NSP(FileSys::VirtualFile file_, | 24 | AppLoader_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 | ||
| 153 | ResultStatus AppLoader_NSP::ReadProgramId(u64& out_program_id) { | 151 | ResultStatus 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; | 159 | ResultStatus 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 | ||