Przeglądaj źródła

loader: Add NSP file type and NSP-specific errors

Zach Hilman 8 lat temu
rodzic
commit
b555311438
2 zmienionych plików z 14 dodań i 2 usunięć
  1. 12 2
      src/core/loader/loader.cpp
  2. 2 0
      src/core/loader/loader.h

+ 12 - 2
src/core/loader/loader.cpp

@@ -15,6 +15,7 @@
 #include "core/loader/nca.h"
 #include "core/loader/nca.h"
 #include "core/loader/nro.h"
 #include "core/loader/nro.h"
 #include "core/loader/nso.h"
 #include "core/loader/nso.h"
+#include "core/loader/nsp.h"
 #include "core/loader/xci.h"
 #include "core/loader/xci.h"
 
 
 namespace Loader {
 namespace Loader {
@@ -34,6 +35,7 @@ FileType IdentifyFile(FileSys::VirtualFile file) {
     CHECK_TYPE(NCA)
     CHECK_TYPE(NCA)
     CHECK_TYPE(XCI)
     CHECK_TYPE(XCI)
     CHECK_TYPE(NAX)
     CHECK_TYPE(NAX)
+    CHECK_TYPE(NSP)
 
 
 #undef CHECK_TYPE
 #undef CHECK_TYPE
 
 
@@ -59,6 +61,8 @@ FileType GuessFromFilename(const std::string& name) {
         return FileType::NCA;
         return FileType::NCA;
     if (extension == "xci")
     if (extension == "xci")
         return FileType::XCI;
         return FileType::XCI;
+    if (extension == "nsp")
+        return FileType::NSP;
 
 
     return FileType::Unknown;
     return FileType::Unknown;
 }
 }
@@ -77,6 +81,8 @@ std::string GetFileTypeString(FileType type) {
         return "XCI";
         return "XCI";
     case FileType::NAX:
     case FileType::NAX:
         return "NAX";
         return "NAX";
+    case FileType::NSP:
+        return "NSP";
     case FileType::DeconstructedRomDirectory:
     case FileType::DeconstructedRomDirectory:
         return "Directory";
         return "Directory";
     case FileType::Error:
     case FileType::Error:
@@ -87,7 +93,7 @@ std::string GetFileTypeString(FileType type) {
     return "unknown";
     return "unknown";
 }
 }
 
 
-constexpr std::array<const char*, 49> RESULT_MESSAGES{
+constexpr std::array<const char*, 50> RESULT_MESSAGES{
     "The operation completed successfully.",
     "The operation completed successfully.",
     "The loader requested to load is already loaded.",
     "The loader requested to load is already loaded.",
     "The operation is not implemented.",
     "The operation is not implemented.",
@@ -137,7 +143,7 @@ constexpr std::array<const char*, 49> RESULT_MESSAGES{
     "The AES Key Generation Source could not be found.",
     "The AES Key Generation Source could not be found.",
     "The SD Save Key Source could not be found.",
     "The SD Save Key Source could not be found.",
     "The SD NCA Key Source could not be found.",
     "The SD NCA Key Source could not be found.",
-};
+    "The NSP file is missing a Program-type NCA."};
 
 
 std::ostream& operator<<(std::ostream& os, ResultStatus status) {
 std::ostream& operator<<(std::ostream& os, ResultStatus status) {
     os << RESULT_MESSAGES.at(static_cast<size_t>(status));
     os << RESULT_MESSAGES.at(static_cast<size_t>(status));
@@ -182,6 +188,10 @@ static std::unique_ptr<AppLoader> GetFileLoader(FileSys::VirtualFile file, FileT
     case FileType::NAX:
     case FileType::NAX:
         return std::make_unique<AppLoader_NAX>(std::move(file));
         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.
     // NX deconstructed ROM directory.
     case FileType::DeconstructedRomDirectory:
     case FileType::DeconstructedRomDirectory:
         return std::make_unique<AppLoader_DeconstructedRomDirectory>(std::move(file));
         return std::make_unique<AppLoader_DeconstructedRomDirectory>(std::move(file));

+ 2 - 0
src/core/loader/loader.h

@@ -29,6 +29,7 @@ enum class FileType {
     NSO,
     NSO,
     NRO,
     NRO,
     NCA,
     NCA,
+    NSP,
     XCI,
     XCI,
     NAX,
     NAX,
     DeconstructedRomDirectory,
     DeconstructedRomDirectory,
@@ -105,6 +106,7 @@ enum class ResultStatus : u16 {
     ErrorMissingAESKeyGenerationSource,
     ErrorMissingAESKeyGenerationSource,
     ErrorMissingSDSaveKeySource,
     ErrorMissingSDSaveKeySource,
     ErrorMissingSDNCAKeySource,
     ErrorMissingSDNCAKeySource,
+    ErrorNSPMissingProgramNCA,
 };
 };
 
 
 std::ostream& operator<<(std::ostream& os, ResultStatus status);
 std::ostream& operator<<(std::ostream& os, ResultStatus status);