aboutsummaryrefslogtreecommitdiff
path: root/src/core/loader/loader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/loader/loader.cpp')
-rw-r--r--src/core/loader/loader.cpp28
1 files changed, 25 insertions, 3 deletions
diff --git a/src/core/loader/loader.cpp b/src/core/loader/loader.cpp
index c13fb49b8..f2a183ba1 100644
--- a/src/core/loader/loader.cpp
+++ b/src/core/loader/loader.cpp
@@ -5,9 +5,9 @@
#include <memory>
#include <ostream>
#include <string>
+#include "common/file_util.h"
#include "common/logging/log.h"
#include "common/string_util.h"
-#include "core/file_sys/vfs_real.h"
#include "core/hle/kernel/process.h"
#include "core/loader/deconstructed_rom_directory.h"
#include "core/loader/elf.h"
@@ -15,6 +15,7 @@
#include "core/loader/nca.h"
#include "core/loader/nro.h"
#include "core/loader/nso.h"
+#include "core/loader/nsp.h"
#include "core/loader/xci.h"
namespace Loader {
@@ -34,6 +35,7 @@ FileType IdentifyFile(FileSys::VirtualFile file) {
CHECK_TYPE(NCA)
CHECK_TYPE(XCI)
CHECK_TYPE(NAX)
+ CHECK_TYPE(NSP)
#undef CHECK_TYPE
@@ -59,6 +61,8 @@ FileType GuessFromFilename(const std::string& name) {
return FileType::NCA;
if (extension == "xci")
return FileType::XCI;
+ if (extension == "nsp")
+ return FileType::NSP;
return FileType::Unknown;
}
@@ -77,6 +81,8 @@ std::string GetFileTypeString(FileType type) {
return "XCI";
case FileType::NAX:
return "NAX";
+ case FileType::NSP:
+ return "NSP";
case FileType::DeconstructedRomDirectory:
return "Directory";
case FileType::Error:
@@ -87,7 +93,7 @@ std::string GetFileTypeString(FileType type) {
return "unknown";
}
-constexpr std::array<const char*, 49> RESULT_MESSAGES{
+constexpr std::array<const char*, 58> RESULT_MESSAGES{
"The operation completed successfully.",
"The loader requested to load is already loaded.",
"The operation is not implemented.",
@@ -137,13 +143,25 @@ constexpr std::array<const char*, 49> RESULT_MESSAGES{
"The AES Key Generation Source could not be found.",
"The SD Save Key Source could not be found.",
"The SD NCA Key Source could not be found.",
+ "The NSP file is missing a Program-type NCA.",
+ "The BKTR-type NCA has a bad BKTR header.",
+ "The BKTR Subsection entry is not located immediately after the Relocation entry.",
+ "The BKTR Subsection entry is not at the end of the media block.",
+ "The BKTR-type NCA has a bad Relocation block.",
+ "The BKTR-type NCA has a bad Subsection block.",
+ "The BKTR-type NCA has a bad Relocation bucket.",
+ "The BKTR-type NCA has a bad Subsection bucket.",
+ "The BKTR-type NCA is missing the base RomFS.",
};
std::ostream& operator<<(std::ostream& os, ResultStatus status) {
- os << RESULT_MESSAGES.at(static_cast<size_t>(status));
+ os << RESULT_MESSAGES.at(static_cast<std::size_t>(status));
return os;
}
+AppLoader::AppLoader(FileSys::VirtualFile file) : file(std::move(file)) {}
+AppLoader::~AppLoader() = default;
+
/**
* Get a loader for a file with a specific type
* @param file The file to load
@@ -179,6 +197,10 @@ static std::unique_ptr<AppLoader> GetFileLoader(FileSys::VirtualFile file, FileT
case FileType::NAX:
return std::make_unique<AppLoader_NAX>(std::move(file));
+ // NX NSP (Nintendo Submission Package) file format
+ case FileType::NSP:
+ return std::make_unique<AppLoader_NSP>(std::move(file));
+
// NX deconstructed ROM directory.
case FileType::DeconstructedRomDirectory:
return std::make_unique<AppLoader_DeconstructedRomDirectory>(std::move(file));