summaryrefslogtreecommitdiff
path: root/src/core/loader
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/loader')
-rw-r--r--src/core/loader/loader.cpp12
-rw-r--r--src/core/loader/loader.h4
-rw-r--r--src/core/loader/nsp.cpp5
-rw-r--r--src/core/loader/nsp.h3
-rw-r--r--src/core/loader/xci.cpp5
-rw-r--r--src/core/loader/xci.h3
6 files changed, 20 insertions, 12 deletions
diff --git a/src/core/loader/loader.cpp b/src/core/loader/loader.cpp
index deffe7379..d91c15561 100644
--- a/src/core/loader/loader.cpp
+++ b/src/core/loader/loader.cpp
@@ -198,10 +198,11 @@ AppLoader::~AppLoader() = default;
198 * @param system The system context to use. 198 * @param system The system context to use.
199 * @param file The file to retrieve the loader for 199 * @param file The file to retrieve the loader for
200 * @param type The file type 200 * @param type The file type
201 * @param program_index Specifies the index within the container of the program to launch.
201 * @return std::unique_ptr<AppLoader> a pointer to a loader object; nullptr for unsupported type 202 * @return std::unique_ptr<AppLoader> a pointer to a loader object; nullptr for unsupported type
202 */ 203 */
203static std::unique_ptr<AppLoader> GetFileLoader(Core::System& system, FileSys::VirtualFile file, 204static std::unique_ptr<AppLoader> GetFileLoader(Core::System& system, FileSys::VirtualFile file,
204 FileType type) { 205 FileType type, std::size_t program_index) {
205 switch (type) { 206 switch (type) {
206 // Standard ELF file format. 207 // Standard ELF file format.
207 case FileType::ELF: 208 case FileType::ELF:
@@ -222,7 +223,7 @@ static std::unique_ptr<AppLoader> GetFileLoader(Core::System& system, FileSys::V
222 // NX XCI (nX Card Image) file format. 223 // NX XCI (nX Card Image) file format.
223 case FileType::XCI: 224 case FileType::XCI:
224 return std::make_unique<AppLoader_XCI>(std::move(file), system.GetFileSystemController(), 225 return std::make_unique<AppLoader_XCI>(std::move(file), system.GetFileSystemController(),
225 system.GetContentProvider()); 226 system.GetContentProvider(), program_index);
226 227
227 // NX NAX (NintendoAesXts) file format. 228 // NX NAX (NintendoAesXts) file format.
228 case FileType::NAX: 229 case FileType::NAX:
@@ -231,7 +232,7 @@ static std::unique_ptr<AppLoader> GetFileLoader(Core::System& system, FileSys::V
231 // NX NSP (Nintendo Submission Package) file format 232 // NX NSP (Nintendo Submission Package) file format
232 case FileType::NSP: 233 case FileType::NSP:
233 return std::make_unique<AppLoader_NSP>(std::move(file), system.GetFileSystemController(), 234 return std::make_unique<AppLoader_NSP>(std::move(file), system.GetFileSystemController(),
234 system.GetContentProvider()); 235 system.GetContentProvider(), program_index);
235 236
236 // NX KIP (Kernel Internal Process) file format 237 // NX KIP (Kernel Internal Process) file format
237 case FileType::KIP: 238 case FileType::KIP:
@@ -246,7 +247,8 @@ static std::unique_ptr<AppLoader> GetFileLoader(Core::System& system, FileSys::V
246 } 247 }
247} 248}
248 249
249std::unique_ptr<AppLoader> GetLoader(Core::System& system, FileSys::VirtualFile file) { 250std::unique_ptr<AppLoader> GetLoader(Core::System& system, FileSys::VirtualFile file,
251 std::size_t program_index) {
250 FileType type = IdentifyFile(file); 252 FileType type = IdentifyFile(file);
251 const FileType filename_type = GuessFromFilename(file->GetName()); 253 const FileType filename_type = GuessFromFilename(file->GetName());
252 254
@@ -260,7 +262,7 @@ std::unique_ptr<AppLoader> GetLoader(Core::System& system, FileSys::VirtualFile
260 262
261 LOG_DEBUG(Loader, "Loading file {} as {}...", file->GetName(), GetFileTypeString(type)); 263 LOG_DEBUG(Loader, "Loading file {} as {}...", file->GetName(), GetFileTypeString(type));
262 264
263 return GetFileLoader(system, std::move(file), type); 265 return GetFileLoader(system, std::move(file), type, program_index);
264} 266}
265 267
266} // namespace Loader 268} // namespace Loader
diff --git a/src/core/loader/loader.h b/src/core/loader/loader.h
index 8dc2d7615..36e79e71d 100644
--- a/src/core/loader/loader.h
+++ b/src/core/loader/loader.h
@@ -293,9 +293,11 @@ protected:
293 * 293 *
294 * @param system The system context. 294 * @param system The system context.
295 * @param file The bootable file. 295 * @param file The bootable file.
296 * @param program_index Specifies the index within the container of the program to launch.
296 * 297 *
297 * @return the best loader for this file. 298 * @return the best loader for this file.
298 */ 299 */
299std::unique_ptr<AppLoader> GetLoader(Core::System& system, FileSys::VirtualFile file); 300std::unique_ptr<AppLoader> GetLoader(Core::System& system, FileSys::VirtualFile file,
301 std::size_t program_index = 0);
300 302
301} // namespace Loader 303} // namespace Loader
diff --git a/src/core/loader/nsp.cpp b/src/core/loader/nsp.cpp
index e821937fd..928f64c8c 100644
--- a/src/core/loader/nsp.cpp
+++ b/src/core/loader/nsp.cpp
@@ -23,8 +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,
27 : AppLoader(file), nsp(std::make_unique<FileSys::NSP>(file)), 27 std::size_t program_index)
28 : AppLoader(file), nsp(std::make_unique<FileSys::NSP>(file, program_index)),
28 title_id(nsp->GetProgramTitleID()) { 29 title_id(nsp->GetProgramTitleID()) {
29 30
30 if (nsp->GetStatus() != ResultStatus::Success) { 31 if (nsp->GetStatus() != ResultStatus::Success) {
diff --git a/src/core/loader/nsp.h b/src/core/loader/nsp.h
index 36e8e3533..f0518ac47 100644
--- a/src/core/loader/nsp.h
+++ b/src/core/loader/nsp.h
@@ -28,7 +28,8 @@ class AppLoader_NSP final : public AppLoader {
28public: 28public:
29 explicit AppLoader_NSP(FileSys::VirtualFile file, 29 explicit AppLoader_NSP(FileSys::VirtualFile file,
30 const Service::FileSystem::FileSystemController& fsc, 30 const Service::FileSystem::FileSystemController& fsc,
31 const FileSys::ContentProvider& content_provider); 31 const FileSys::ContentProvider& content_provider,
32 std::size_t program_index);
32 ~AppLoader_NSP() override; 33 ~AppLoader_NSP() override;
33 34
34 /** 35 /**
diff --git a/src/core/loader/xci.cpp b/src/core/loader/xci.cpp
index 536e721fc..aaa250cea 100644
--- a/src/core/loader/xci.cpp
+++ b/src/core/loader/xci.cpp
@@ -22,8 +22,9 @@ namespace Loader {
22 22
23AppLoader_XCI::AppLoader_XCI(FileSys::VirtualFile file, 23AppLoader_XCI::AppLoader_XCI(FileSys::VirtualFile file,
24 const Service::FileSystem::FileSystemController& fsc, 24 const Service::FileSystem::FileSystemController& fsc,
25 const FileSys::ContentProvider& content_provider) 25 const FileSys::ContentProvider& content_provider,
26 : AppLoader(file), xci(std::make_unique<FileSys::XCI>(file)), 26 std::size_t program_index)
27 : AppLoader(file), xci(std::make_unique<FileSys::XCI>(file, program_index)),
27 nca_loader(std::make_unique<AppLoader_NCA>(xci->GetProgramNCAFile())) { 28 nca_loader(std::make_unique<AppLoader_NCA>(xci->GetProgramNCAFile())) {
28 if (xci->GetStatus() != ResultStatus::Success) { 29 if (xci->GetStatus() != ResultStatus::Success) {
29 return; 30 return;
diff --git a/src/core/loader/xci.h b/src/core/loader/xci.h
index 6dc1f9243..764dc8328 100644
--- a/src/core/loader/xci.h
+++ b/src/core/loader/xci.h
@@ -28,7 +28,8 @@ class AppLoader_XCI final : public AppLoader {
28public: 28public:
29 explicit AppLoader_XCI(FileSys::VirtualFile file, 29 explicit AppLoader_XCI(FileSys::VirtualFile file,
30 const Service::FileSystem::FileSystemController& fsc, 30 const Service::FileSystem::FileSystemController& fsc,
31 const FileSys::ContentProvider& content_provider); 31 const FileSys::ContentProvider& content_provider,
32 std::size_t program_index);
32 ~AppLoader_XCI() override; 33 ~AppLoader_XCI() override;
33 34
34 /** 35 /**