summaryrefslogtreecommitdiffstats
path: root/src/core/file_sys
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/file_sys')
-rw-r--r--src/core/file_sys/card_image.cpp33
-rw-r--r--src/core/file_sys/card_image.h7
2 files changed, 33 insertions, 7 deletions
diff --git a/src/core/file_sys/card_image.cpp b/src/core/file_sys/card_image.cpp
index ce4423fa6..d0f1afac0 100644
--- a/src/core/file_sys/card_image.cpp
+++ b/src/core/file_sys/card_image.cpp
@@ -10,6 +10,7 @@
#include "common/logging/log.h"
#include "core/file_sys/card_image.h"
#include "core/file_sys/content_archive.h"
+#include "core/file_sys/nca_metadata.h"
#include "core/file_sys/partition_filesystem.h"
#include "core/file_sys/vfs_offset.h"
#include "core/loader/loader.h"
@@ -44,15 +45,19 @@ XCI::XCI(VirtualFile file_) : file(std::move(file_)), partitions(0x4) {
partitions[static_cast<size_t>(partition)] = std::make_shared<PartitionFilesystem>(raw);
}
- program_nca_status = Loader::ResultStatus::ErrorXCIMissingProgramNCA;
+ secure_partition = std::make_shared<NSP>(
+ main_hfs.GetFile(partition_names[static_cast<size_t>(XCIPartition::Secure)]));
- auto result = AddNCAFromPartition(XCIPartition::Secure);
- if (result != Loader::ResultStatus::Success) {
- status = result;
- return;
- }
+ const auto secure_ncas = secure_partition->GetNCAsCollapsed();
+ std::copy(secure_ncas.begin(), secure_ncas.end(), std::back_inserter(ncas));
+
+ program_nca_status = Loader::ResultStatus::ErrorXCIMissingProgramNCA;
+ program =
+ secure_partition->GetNCA(secure_partition->GetProgramTitleID(), ContentRecordType::Program);
+ if (program != nullptr)
+ program_nca_status = program->GetStatus();
- result = AddNCAFromPartition(XCIPartition::Update);
+ auto result = AddNCAFromPartition(XCIPartition::Update);
if (result != Loader::ResultStatus::Success) {
status = result;
return;
@@ -89,6 +94,10 @@ VirtualDir XCI::GetPartition(XCIPartition partition) const {
return partitions[static_cast<size_t>(partition)];
}
+std::shared_ptr<NSP> XCI::GetSecurePartitionNSP() const {
+ return secure_partition;
+}
+
VirtualDir XCI::GetSecurePartition() const {
return GetPartition(XCIPartition::Secure);
}
@@ -105,6 +114,16 @@ VirtualDir XCI::GetLogoPartition() const {
return GetPartition(XCIPartition::Logo);
}
+std::shared_ptr<NCA> XCI::GetProgramNCA() const {
+ return program;
+}
+
+VirtualFile XCI::GetProgramNCAFile() const {
+ if (GetProgramNCA() == nullptr)
+ return nullptr;
+ return GetProgramNCA()->GetBaseFile();
+}
+
const std::vector<std::shared_ptr<NCA>>& XCI::GetNCAs() const {
return ncas;
}
diff --git a/src/core/file_sys/card_image.h b/src/core/file_sys/card_image.h
index 4f104d18a..b73f1d900 100644
--- a/src/core/file_sys/card_image.h
+++ b/src/core/file_sys/card_image.h
@@ -10,6 +10,8 @@
#include "common/common_types.h"
#include "common/swap.h"
#include "core/file_sys/vfs.h"
+#include "core/loader/loader.h"
+#include "submission_package.h"
namespace Loader {
enum class ResultStatus : u16;
@@ -71,11 +73,14 @@ public:
u8 GetFormatVersion() const;
VirtualDir GetPartition(XCIPartition partition) const;
+ std::shared_ptr<NSP> GetSecurePartitionNSP() const;
VirtualDir GetSecurePartition() const;
VirtualDir GetNormalPartition() const;
VirtualDir GetUpdatePartition() const;
VirtualDir GetLogoPartition() const;
+ std::shared_ptr<NCA> GetProgramNCA() const;
+ VirtualFile GetProgramNCAFile() const;
const std::vector<std::shared_ptr<NCA>>& GetNCAs() const;
std::shared_ptr<NCA> GetNCAByType(NCAContentType type) const;
VirtualFile GetNCAFileByType(NCAContentType type) const;
@@ -101,6 +106,8 @@ private:
Loader::ResultStatus program_nca_status;
std::vector<VirtualDir> partitions;
+ std::shared_ptr<NSP> secure_partition;
+ std::shared_ptr<NCA> program;
std::vector<std::shared_ptr<NCA>> ncas;
};
} // namespace FileSys