diff --git a/src/frontend/CMakeLists.txt b/src/frontend/CMakeLists.txt index a459ab4..2fb5302 100644 --- a/src/frontend/CMakeLists.txt +++ b/src/frontend/CMakeLists.txt @@ -9,8 +9,8 @@ endif() file(GLOB_RECURSE THEMES ${PROJECT_SOURCE_DIR}/dist/themes/*) add_executable(threeSD - helpers/import_job.cpp - helpers/import_job.h + helpers/multi_job.cpp + helpers/multi_job.h helpers/simple_job.cpp helpers/simple_job.h import_dialog.cpp diff --git a/src/frontend/helpers/import_job.cpp b/src/frontend/helpers/multi_job.cpp similarity index 75% rename from src/frontend/helpers/import_job.cpp rename to src/frontend/helpers/multi_job.cpp index 29c3703..08adf7b 100644 --- a/src/frontend/helpers/import_job.cpp +++ b/src/frontend/helpers/multi_job.cpp @@ -3,15 +3,17 @@ // Refer to the license.txt file included. #include -#include "frontend/helpers/import_job.h" +#include "frontend/helpers/multi_job.h" -ImportJob::ImportJob(QObject* parent, Core::SDMCImporter& importer_, - std::vector contents_) - : QThread(parent), importer(importer_), contents(std::move(contents_)) {} +MultiJob::MultiJob(QObject* parent, Core::SDMCImporter& importer_, + std::vector contents_, ExecuteFunc execute_func_, + DeleteFunc delete_func_) + : QThread(parent), importer(importer_), contents(std::move(contents_)), + execute_func(std::move(execute_func_)), delete_func(std::move(delete_func_)) {} -ImportJob::~ImportJob() = default; +MultiJob::~MultiJob() = default; -void ImportJob::run() { +void MultiJob::run() { u64 total_size = 0; for (const auto& content : contents) { total_size += content.maximum_size; @@ -38,7 +40,8 @@ void ImportJob::run() { UpdateETA(size_imported + current_size); emit ProgressUpdated(size_imported + current_size, current_size, eta); }; - if (!importer.ImportContent(content, callback)) { + if (!execute_func(importer, content, callback)) { + delete_func(importer, content); importer.DeleteContent(content); if (!cancelled) { failed_contents.emplace_back(content); @@ -55,11 +58,11 @@ void ImportJob::run() { emit Completed(); } -void ImportJob::Cancel() { +void MultiJob::Cancel() { cancelled.store(true); importer.AbortImporting(); } -std::vector ImportJob::GetFailedContents() const { +std::vector MultiJob::GetFailedContents() const { return failed_contents; } diff --git a/src/frontend/helpers/import_job.h b/src/frontend/helpers/multi_job.h similarity index 65% rename from src/frontend/helpers/import_job.h rename to src/frontend/helpers/multi_job.h index 3e0a3e0..f976811 100644 --- a/src/frontend/helpers/import_job.h +++ b/src/frontend/helpers/multi_job.h @@ -5,16 +5,22 @@ #pragma once #include +#include #include #include "core/importer.h" -class ImportJob : public QThread { +class MultiJob : public QThread { Q_OBJECT public: - explicit ImportJob(QObject* parent, Core::SDMCImporter& importer, - std::vector contents); - ~ImportJob() override; + using ExecuteFunc = std::function; + using DeleteFunc = std::function; + + explicit MultiJob(QObject* parent, Core::SDMCImporter& importer, + std::vector contents, ExecuteFunc execute_func, + DeleteFunc delete_func); + ~MultiJob() override; void run() override; void Cancel(); @@ -41,6 +47,8 @@ private: Core::SDMCImporter& importer; std::vector contents; std::vector failed_contents; + ExecuteFunc execute_func; + DeleteFunc delete_func; }; Q_DECLARE_METATYPE(Core::ContentSpecifier) diff --git a/src/frontend/import_dialog.cpp b/src/frontend/import_dialog.cpp index 1c2acb5..b277cd6 100644 --- a/src/frontend/import_dialog.cpp +++ b/src/frontend/import_dialog.cpp @@ -19,7 +19,7 @@ #include "common/assert.h" #include "common/logging/log.h" #include "common/scope_exit.h" -#include "frontend/helpers/import_job.h" +#include "frontend/helpers/multi_job.h" #include "frontend/helpers/simple_job.h" #include "frontend/import_dialog.h" #include "ui_import_dialog.h" @@ -512,9 +512,17 @@ void ImportDialog::StartImporting() { dialog->setWindowModality(Qt::WindowModal); dialog->setMinimumDuration(0); - auto* job = new ImportJob(this, importer, std::move(to_import)); + auto* job = new MultiJob( + this, importer, std::move(to_import), + [](Core::SDMCImporter& importer, const Core::ContentSpecifier& content, + const Core::SDMCImporter::ProgressCallback& callback) { + return importer.ImportContent(content, callback); + }, + [](Core::SDMCImporter& importer, const Core::ContentSpecifier& content) { + return importer.DeleteContent(content); + }); - connect(job, &ImportJob::NextContent, this, + connect(job, &MultiJob::NextContent, this, [this, bar, dialog, multiplier, total_count]( u64 size_imported, u64 count, Core::ContentSpecifier next_content, int eta) { bar->setValue(static_cast(size_imported / multiplier)); @@ -528,7 +536,7 @@ void ImportDialog::StartImporting() { current_content = next_content; current_count = count; }); - connect(job, &ImportJob::ProgressUpdated, this, + connect(job, &MultiJob::ProgressUpdated, this, [this, bar, dialog, multiplier, total_count](u64 total_size_imported, u64 current_size_imported, int eta) { bar->setValue(static_cast(total_size_imported / multiplier)); @@ -542,7 +550,7 @@ void ImportDialog::StartImporting() { .arg(ReadableByteSize(current_content.maximum_size)) .arg(FormatETA(eta))); }); - connect(job, &ImportJob::Completed, this, [this, dialog, job] { + connect(job, &MultiJob::Completed, this, [this, dialog, job] { dialog->setValue(dialog->maximum()); const auto failed_contents = job->GetFailedContents(); @@ -570,7 +578,7 @@ void ImportDialog::StartImporting() { cancel_dialog->setCancelButton(nullptr); cancel_dialog->setMinimumDuration(0); cancel_dialog->setValue(0); - connect(job, &ImportJob::Completed, cancel_dialog, &QProgressDialog::hide); + connect(job, &MultiJob::Completed, cancel_dialog, &QProgressDialog::hide); job->Cancel(); });