aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--launcher/InstanceCreationTask.cpp15
-rw-r--r--launcher/InstanceImportTask.cpp9
-rw-r--r--launcher/InstanceImportTask.h1
-rw-r--r--launcher/InstanceList.cpp1
-rw-r--r--launcher/modplatform/flame/FlameInstanceCreationTask.cpp5
-rw-r--r--launcher/modplatform/modrinth/ModrinthInstanceCreationTask.cpp5
-rw-r--r--launcher/modplatform/modrinth/ModrinthInstanceCreationTask.h1
7 files changed, 30 insertions, 7 deletions
diff --git a/launcher/InstanceCreationTask.cpp b/launcher/InstanceCreationTask.cpp
index c8c91997..d7663c2d 100644
--- a/launcher/InstanceCreationTask.cpp
+++ b/launcher/InstanceCreationTask.cpp
@@ -2,11 +2,22 @@
#include <QDebug>
-InstanceCreationTask::InstanceCreationTask() {}
+InstanceCreationTask::InstanceCreationTask() = default;
void InstanceCreationTask::executeTask()
{
- if (updateInstance() || createInstance()) {
+ if (updateInstance()) {
+ emitSucceeded();
+ return;
+ }
+
+ // If this is set, it means we're updating an instance. Since the previous step likely
+ // removed some old files, we'd better not let the user abort the next task, since it'd
+ // put the instance in an invalid state.
+ // TODO: Figure out an unexpensive way of making such file removal a recoverable transaction.
+ setAbortStatus(!shouldOverride());
+
+ if (createInstance()) {
emitSucceeded();
return;
}
diff --git a/launcher/InstanceImportTask.cpp b/launcher/InstanceImportTask.cpp
index 56aabb2d..4819a6ff 100644
--- a/launcher/InstanceImportTask.cpp
+++ b/launcher/InstanceImportTask.cpp
@@ -63,15 +63,20 @@ InstanceImportTask::InstanceImportTask(const QUrl sourceUrl, QWidget* parent)
bool InstanceImportTask::abort()
{
+ if (!canAbort())
+ return false;
+
if (m_filesNetJob)
m_filesNetJob->abort();
m_extractFuture.cancel();
- return false;
+ return Task::abort();
}
void InstanceImportTask::executeTask()
{
+ setAbortStatus(true);
+
if (m_sourceUrl.isLocalFile()) {
m_archivePath = m_sourceUrl.toLocalFile();
processZipPack();
@@ -274,6 +279,7 @@ void InstanceImportTask::processFlame()
connect(inst_creation_task, &Task::finished, inst_creation_task, &InstanceCreationTask::deleteLater);
connect(this, &Task::aborted, inst_creation_task, &InstanceCreationTask::abort);
+ connect(inst_creation_task, &Task::abortStatusChanged, this, &Task::setAbortStatus);
inst_creation_task->start();
}
@@ -336,6 +342,7 @@ void InstanceImportTask::processModrinth()
connect(inst_creation_task, &Task::finished, inst_creation_task, &InstanceCreationTask::deleteLater);
connect(this, &Task::aborted, inst_creation_task, &InstanceCreationTask::abort);
+ connect(inst_creation_task, &Task::abortStatusChanged, this, &Task::setAbortStatus);
inst_creation_task->start();
}
diff --git a/launcher/InstanceImportTask.h b/launcher/InstanceImportTask.h
index acb1f9d6..ef70c819 100644
--- a/launcher/InstanceImportTask.h
+++ b/launcher/InstanceImportTask.h
@@ -58,7 +58,6 @@ class InstanceImportTask : public InstanceTask
public:
explicit InstanceImportTask(const QUrl sourceUrl, QWidget* parent = nullptr);
- bool canAbort() const override { return true; }
bool abort() override;
const QVector<Flame::File> &getBlockedFiles() const
{
diff --git a/launcher/InstanceList.cpp b/launcher/InstanceList.cpp
index 5f604f9a..bf25d2d0 100644
--- a/launcher/InstanceList.cpp
+++ b/launcher/InstanceList.cpp
@@ -785,6 +785,7 @@ class InstanceStaging : public Task {
connect(child, &Task::succeeded, this, &InstanceStaging::childSucceded);
connect(child, &Task::failed, this, &InstanceStaging::childFailed);
connect(child, &Task::aborted, this, &InstanceStaging::childAborted);
+ connect(child, &Task::abortStatusChanged, this, &InstanceStaging::setAbortStatus);
connect(child, &Task::status, this, &InstanceStaging::setStatus);
connect(child, &Task::progress, this, &InstanceStaging::setProgress);
connect(&m_backoffTimer, &QTimer::timeout, this, &InstanceStaging::childSucceded);
diff --git a/launcher/modplatform/flame/FlameInstanceCreationTask.cpp b/launcher/modplatform/flame/FlameInstanceCreationTask.cpp
index 76ac11af..c8b2e297 100644
--- a/launcher/modplatform/flame/FlameInstanceCreationTask.cpp
+++ b/launcher/modplatform/flame/FlameInstanceCreationTask.cpp
@@ -27,6 +27,9 @@ static const FlameAPI api;
bool FlameCreationTask::abort()
{
+ if (!canAbort())
+ return false;
+
if (m_process_update_file_info_job)
m_process_update_file_info_job->abort();
if (m_files_job)
@@ -34,7 +37,7 @@ bool FlameCreationTask::abort()
if (m_mod_id_resolver)
m_mod_id_resolver->abort();
- return true;
+ return Task::abort();
}
bool FlameCreationTask::updateInstance()
diff --git a/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.cpp b/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.cpp
index b5140f34..3234d92b 100644
--- a/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.cpp
+++ b/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.cpp
@@ -19,9 +19,12 @@
bool ModrinthCreationTask::abort()
{
+ if (!canAbort())
+ return false;
+
if (m_files_job)
return m_files_job->abort();
- return true;
+ return Task::abort();
}
bool ModrinthCreationTask::updateInstance()
diff --git a/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.h b/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.h
index bcf80682..e87e4fb9 100644
--- a/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.h
+++ b/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.h
@@ -22,7 +22,6 @@ class ModrinthCreationTask final : public InstanceCreationTask {
}
bool abort() override;
- bool canAbort() const override { return true; }
bool updateInstance() override;
bool createInstance() override;