Add support for system applets

This commit is contained in:
Pengfei
2021-08-07 01:00:39 +08:00
parent 5b55f801f0
commit ed8d6a1a82
3 changed files with 19 additions and 19 deletions
+5 -7
View File
@@ -488,7 +488,7 @@ static std::string FindTMD(const std::string& path) {
} }
bool SDMCImporter::LoadTMD(ContentType type, u64 id, TitleMetadata& out) const { bool SDMCImporter::LoadTMD(ContentType type, u64 id, TitleMetadata& out) const {
const bool is_nand = type == ContentType::SystemTitle; const bool is_nand = type == ContentType::SystemTitle || type == ContentType::SystemApplet;
auto& title_db = is_nand ? nand_title_db : sdmc_title_db; auto& title_db = is_nand ? nand_title_db : sdmc_title_db;
const auto physical_path = const auto physical_path =
@@ -656,8 +656,7 @@ void SDMCImporter::AbortDumpCXI() {
} }
bool SDMCImporter::CanBuildLegitCIA(const ContentSpecifier& specifier) const { bool SDMCImporter::CanBuildLegitCIA(const ContentSpecifier& specifier) const {
if (specifier.type != ContentType::Application && specifier.type != ContentType::Update && if (!CanBuildCIA(specifier.type)) {
specifier.type != ContentType::DLC && specifier.type != ContentType::SystemTitle) {
return false; return false;
} }
@@ -681,9 +680,7 @@ bool SDMCImporter::BuildCIA(CIABuildType build_type, const ContentSpecifier& spe
return false; return false;
} }
if (specifier.type != ContentType::Application && specifier.type != ContentType::Update && if (!CanBuildCIA(specifier.type)) {
specifier.type != ContentType::DLC && specifier.type != ContentType::SystemTitle) {
LOG_ERROR(Core, "Unsupported specifier type {}", static_cast<int>(specifier.type)); LOG_ERROR(Core, "Unsupported specifier type {}", static_cast<int>(specifier.type));
return false; return false;
} }
@@ -694,7 +691,8 @@ bool SDMCImporter::BuildCIA(CIABuildType build_type, const ContentSpecifier& spe
return false; return false;
} }
const bool is_nand = specifier.type == ContentType::SystemTitle; const bool is_nand =
specifier.type == ContentType::SystemTitle || specifier.type == ContentType::SystemApplet;
const auto physical_path = const auto physical_path =
is_nand ? fmt::format("{}{:08x}/{:08x}/content/", config.system_titles_path, is_nand ? fmt::format("{}{:08x}/{:08x}/content/", config.system_titles_path,
(specifier.id >> 32), (specifier.id & 0xFFFFFFFF)) (specifier.id >> 32), (specifier.id & 0xFFFFFFFF))
+6
View File
@@ -36,6 +36,12 @@ enum class ContentType {
SystemApplet, // This should belong to System Title, but they cause problems so a new category. SystemApplet, // This should belong to System Title, but they cause problems so a new category.
}; };
constexpr bool CanBuildCIA(ContentType type) {
return type == ContentType::Application || type == ContentType::Update ||
type == ContentType::DLC || type == ContentType::SystemTitle ||
type == ContentType::SystemApplet;
}
/** /**
* Encryption type of an importable content. * Encryption type of an importable content.
*/ */
+8 -12
View File
@@ -511,10 +511,8 @@ void ImportDialog::OnContextMenu(const QPoint& point) {
connect(dump_cxi, &QAction::triggered, connect(dump_cxi, &QAction::triggered,
[this, specifier] { StartDumpingCXISingle(specifier); }); [this, specifier] { StartDumpingCXISingle(specifier); });
} }
if (specifier.type == Core::ContentType::Application || if (Core::CanBuildCIA(specifier.type)) {
specifier.type == Core::ContentType::Update || QAction* build_cia = context_menu.addAction(tr("Build CIA..."));
specifier.type == Core::ContentType::DLC) {
QAction* build_cia = context_menu.addAction(tr("Build CIA (standard)"));
connect(build_cia, &QAction::triggered, connect(build_cia, &QAction::triggered,
[this, specifier] { StartBuildingCIASingle(specifier); }); [this, specifier] { StartBuildingCIASingle(specifier); });
} }
@@ -802,7 +800,8 @@ void ImportDialog::StartBatchDumpingCXI() {
void ImportDialog::StartBuildingCIASingle(const Core::ContentSpecifier& specifier) { void ImportDialog::StartBuildingCIASingle(const Core::ContentSpecifier& specifier) {
CIABuildDialog dialog(this, CIABuildDialog dialog(this,
/*is_dir*/ false, /*is_dir*/ false,
/*is_nand*/ specifier.type == Core::ContentType::SystemTitle, /*is_nand*/ specifier.type == Core::ContentType::SystemTitle ||
specifier.type == Core::ContentType::SystemApplet,
/*enable_legit*/ importer->CanBuildLegitCIA(specifier), /*enable_legit*/ importer->CanBuildLegitCIA(specifier),
last_build_cia_path); last_build_cia_path);
if (dialog.exec() != QDialog::Accepted) { if (dialog.exec() != QDialog::Accepted) {
@@ -829,12 +828,8 @@ void ImportDialog::StartBatchBuildingCIA() {
} }
const auto removed_iter = std::remove_if( const auto removed_iter = std::remove_if(
to_import.begin(), to_import.end(), [](const Core::ContentSpecifier& specifier) { to_import.begin(), to_import.end(),
return specifier.type != Core::ContentType::Application && [](const Core::ContentSpecifier& specifier) { return !Core::CanBuildCIA(specifier.type); });
specifier.type != Core::ContentType::Update &&
specifier.type != Core::ContentType::DLC &&
specifier.type != Core::ContentType::SystemTitle;
});
if (removed_iter == to_import.begin()) { // No Titles selected if (removed_iter == to_import.begin()) { // No Titles selected
QMessageBox::critical(this, tr("threeSD"), QMessageBox::critical(this, tr("threeSD"),
tr("The contents selected are not supported.<br>You can only build " tr("The contents selected are not supported.<br>You can only build "
@@ -852,7 +847,8 @@ void ImportDialog::StartBatchBuildingCIA() {
const bool is_nand = std::all_of(to_import.begin(), to_import.end(), const bool is_nand = std::all_of(to_import.begin(), to_import.end(),
[](const Core::ContentSpecifier& specifier) { [](const Core::ContentSpecifier& specifier) {
return specifier.type == Core::ContentType::SystemTitle; return specifier.type == Core::ContentType::SystemTitle ||
specifier.type == Core::ContentType::SystemApplet;
}); });
const bool enable_legit = std::all_of(to_import.begin(), to_import.end(), const bool enable_legit = std::all_of(to_import.begin(), to_import.end(),
[this](const Core::ContentSpecifier& specifier) { [this](const Core::ContentSpecifier& specifier) {