aboutsummaryrefslogtreecommitdiff
path: root/launcher
diff options
context:
space:
mode:
authorTheKodeToad <TheKodeToad@proton.me>2023-05-02 14:23:27 +0100
committerTheKodeToad <TheKodeToad@proton.me>2023-05-02 14:23:31 +0100
commite0380960fda706a70bef6f63610bcfa68775e21d (patch)
tree8455d6124314395402b5bdc21e3b3afe520510ca /launcher
parent709736d3f9a77206b5b6f809e5e45495f1db1315 (diff)
downloadPrismLauncher-e0380960fda706a70bef6f63610bcfa68775e21d.tar.gz
PrismLauncher-e0380960fda706a70bef6f63610bcfa68775e21d.tar.bz2
PrismLauncher-e0380960fda706a70bef6f63610bcfa68775e21d.zip
Change to use future
Signed-off-by: TheKodeToad <TheKodeToad@proton.me>
Diffstat (limited to 'launcher')
-rw-r--r--launcher/modplatform/modrinth/ModrinthPackExportTask.cpp57
-rw-r--r--launcher/modplatform/modrinth/ModrinthPackExportTask.h8
2 files changed, 40 insertions, 25 deletions
diff --git a/launcher/modplatform/modrinth/ModrinthPackExportTask.cpp b/launcher/modplatform/modrinth/ModrinthPackExportTask.cpp
index 54932131..d2ef0653 100644
--- a/launcher/modplatform/modrinth/ModrinthPackExportTask.cpp
+++ b/launcher/modplatform/modrinth/ModrinthPackExportTask.cpp
@@ -62,8 +62,11 @@ bool ModrinthPackExportTask::abort()
return true;
}
- pendingAbort = true;
- return true;
+ if (buildZipFuture.isRunning()) {
+ buildZipFuture.cancel();
+ return true;
+ }
+ return false;
}
void ModrinthPackExportTask::collectFiles()
@@ -190,44 +193,37 @@ void ModrinthPackExportTask::parseApiResponse(const QByteArray* response)
void ModrinthPackExportTask::buildZip()
{
- static_cast<void>(QtConcurrent::run(QThreadPool::globalInstance(), [this]() {
- setStatus("Adding files...");
+ setStatus("Adding files...");
+
+ buildZipFuture = QtConcurrent::run(QThreadPool::globalInstance(), [this]() {
QuaZip zip(output);
if (!zip.open(QuaZip::mdCreate)) {
QFile::remove(output);
- emitFailed(tr("Could not create file"));
- return;
+ return BuildZipResult(tr("Could not create file"));
}
- if (pendingAbort) {
- QMetaObject::invokeMethod(this, &ModrinthPackExportTask::emitAborted, Qt::QueuedConnection);
- return;
- }
+ if (buildZipFuture.isCanceled())
+ return BuildZipResult();
QuaZipFile indexFile(&zip);
if (!indexFile.open(QIODevice::WriteOnly, QuaZipNewInfo("modrinth.index.json"))) {
QFile::remove(output);
- QMetaObject::invokeMethod(
- this, [this]() { emitFailed(tr("Could not create index")); }, Qt::QueuedConnection);
- return;
+ return BuildZipResult(tr("Could not create index"));
}
indexFile.write(generateIndex());
size_t progress = 0;
for (const QFileInfo& file : files) {
- if (pendingAbort) {
+ if (buildZipFuture.isCanceled()) {
QFile::remove(output);
- QMetaObject::invokeMethod(this, &ModrinthPackExportTask::emitAborted, Qt::QueuedConnection);
- return;
+ return BuildZipResult();
}
setProgress(progress, files.length());
const QString relative = gameRoot.relativeFilePath(file.absoluteFilePath());
if (!resolvedFiles.contains(relative) && !JlCompress::compressFile(&zip, file.absoluteFilePath(), "overrides/" + relative)) {
QFile::remove(output);
- QMetaObject::invokeMethod(
- this, [this, relative]() { emitFailed(tr("Could not read and compress %1").arg(relative)); }, Qt::QueuedConnection);
- return;
+ return BuildZipResult(tr("Could not read and compress %1").arg(relative));
}
progress++;
}
@@ -236,13 +232,26 @@ void ModrinthPackExportTask::buildZip()
if (zip.getZipError() != 0) {
QFile::remove(output);
- QMetaObject::invokeMethod(
- this, [this]() { emitFailed(tr("A zip error occurred")); }, Qt::QueuedConnection);
- return;
+ return BuildZipResult(tr("A zip error occurred"));
}
- QMetaObject::invokeMethod(this, &ModrinthPackExportTask::emitSucceeded, Qt::QueuedConnection);
- }));
+ return BuildZipResult();
+ });
+ connect(&buildZipWatcher, &QFutureWatcher<BuildZipResult>::finished, this, &ModrinthPackExportTask::finish);
+ buildZipWatcher.setFuture(buildZipFuture);
+}
+
+void ModrinthPackExportTask::finish()
+{
+ if (buildZipFuture.isCanceled())
+ emitAborted();
+ else {
+ const BuildZipResult result = buildZipFuture.result();
+ if (result.has_value())
+ emitFailed(result.value());
+ else
+ emitSucceeded();
+ }
}
QByteArray ModrinthPackExportTask::generateIndex()
diff --git a/launcher/modplatform/modrinth/ModrinthPackExportTask.h b/launcher/modplatform/modrinth/ModrinthPackExportTask.h
index 25045cf2..5426d6da 100644
--- a/launcher/modplatform/modrinth/ModrinthPackExportTask.h
+++ b/launcher/modplatform/modrinth/ModrinthPackExportTask.h
@@ -18,6 +18,8 @@
#pragma once
+#include <QFuture>
+#include <QFutureWatcher>
#include "BaseInstance.h"
#include "MMCZip.h"
#include "minecraft/MinecraftInstance.h"
@@ -54,18 +56,22 @@ class ModrinthPackExportTask : public Task {
const QString output;
const MMCZip::FilterFunction filter;
+ typedef std::optional<QString> BuildZipResult;
+
ModrinthAPI api;
QFileInfoList files;
QMap<QString, QString> pendingHashes;
QMap<QString, ResolvedFile> resolvedFiles;
Task::Ptr task;
- bool pendingAbort = false;
+ QFuture<BuildZipResult> buildZipFuture;
+ QFutureWatcher<BuildZipResult> buildZipWatcher;
void collectFiles();
void collectHashes();
void makeApiRequest();
void parseApiResponse(const QByteArray* response);
void buildZip();
+ void finish();
QByteArray generateIndex();
};