aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTrial97 <alexandru.tripon97@gmail.com>2023-07-17 17:42:15 +0300
committerTrial97 <alexandru.tripon97@gmail.com>2023-07-17 17:52:00 +0300
commitb0940d696baa24ddcf29a5d3393196c1047dcd3f (patch)
tree7a4af66640c9b3edab45ef808d1f256cd57ea17b
parentfe73d696cb714d724948176f0bfbb356412b0f11 (diff)
downloadPrismLauncher-b0940d696baa24ddcf29a5d3393196c1047dcd3f.tar.gz
PrismLauncher-b0940d696baa24ddcf29a5d3393196c1047dcd3f.tar.bz2
PrismLauncher-b0940d696baa24ddcf29a5d3393196c1047dcd3f.zip
Added QFutureWatcher
Signed-off-by: Trial97 <alexandru.tripon97@gmail.com> abort forgot Signed-off-by: Trial97 <alexandru.tripon97@gmail.com>
-rw-r--r--launcher/MMCZip.cpp59
-rw-r--r--launcher/MMCZip.h20
-rw-r--r--launcher/ui/dialogs/ExportInstanceDialog.cpp7
3 files changed, 60 insertions, 26 deletions
diff --git a/launcher/MMCZip.cpp b/launcher/MMCZip.cpp
index cc749197..acd6bf7e 100644
--- a/launcher/MMCZip.cpp
+++ b/launcher/MMCZip.cpp
@@ -424,36 +424,35 @@ bool collectFileListRecursively(const QString& rootDir, const QString& subDir, Q
void ExportToZipTask::executeTask()
{
- (void)QtConcurrent::run(QThreadPool::globalInstance(), [this]() { exportZip(); });
+ setStatus("Adding files...");
+ setProgress(0, m_files.length());
+ m_build_zip_future = QtConcurrent::run(QThreadPool::globalInstance(), [this]() { return exportZip(); });
+ connect(&m_build_zip_watcher, &QFutureWatcher<ZipResult>::finished, this, &ExportToZipTask::finish);
+ m_build_zip_watcher.setFuture(m_build_zip_future);
}
-void ExportToZipTask::exportZip()
+auto ExportToZipTask::exportZip() -> ZipResult
{
- setStatus("Adding files...");
- setProgress(0, m_files.length());
if (!m_dir.exists()) {
- emitFailed(tr("Folder doesn't exist"));
- return;
+ return ZipResult(tr("Folder doesn't exist"));
}
if (!m_output.isOpen() && !m_output.open(QuaZip::mdCreate)) {
- emitFailed(tr("Could not create file"));
- return;
+ return ZipResult(tr("Could not create file"));
}
for (auto fileName : m_extra_files.keys()) {
- if (!isRunning())
- return;
+ if (m_build_zip_future.isCanceled())
+ return ZipResult();
QuaZipFile indexFile(&m_output);
if (!indexFile.open(QIODevice::WriteOnly, QuaZipNewInfo(fileName))) {
- emitFailed(tr("Could not create:") + fileName);
- return;
+ return ZipResult(tr("Could not create:") + fileName);
}
indexFile.write(m_extra_files[fileName]);
}
for (const QFileInfo& file : m_files) {
- if (!isRunning())
- return;
+ if (m_build_zip_future.isCanceled())
+ return ZipResult();
auto absolute = file.absoluteFilePath();
auto relative = m_dir.relativeFilePath(absolute);
@@ -467,17 +466,39 @@ void ExportToZipTask::exportZip()
}
if (!m_exclude_files.contains(relative) && !JlCompress::compressFile(&m_output, absolute, m_destination_prefix + relative)) {
- emitFailed(tr("Could not read and compress %1").arg(relative));
- return;
+ return ZipResult(tr("Could not read and compress %1").arg(relative));
}
}
m_output.close();
if (m_output.getZipError() != 0) {
- emitFailed(tr("A zip error occurred"));
- return;
+ return ZipResult(tr("A zip error occurred"));
+ }
+ return ZipResult();
+}
+
+void ExportToZipTask::finish()
+{
+ if (m_build_zip_future.isCanceled()) {
+ QFile::remove(m_output_path);
+ emitAborted();
+ } else if (auto result = m_build_zip_future.result(); result.has_value()) {
+ QFile::remove(m_output_path);
+ emitFailed(result.value());
+ } else {
+ emitSucceeded();
+ }
+}
+
+bool ExportToZipTask::abort()
+{
+ if (m_build_zip_future.isRunning()) {
+ m_build_zip_future.cancel();
+ // NOTE: Here we don't do `emitAborted()` because it will be done when `m_build_zip_future` actually cancels, which may not occur
+ // immediately.
+ return true;
}
- emitSucceeded();
+ return false;
}
} // namespace MMCZip \ No newline at end of file
diff --git a/launcher/MMCZip.h b/launcher/MMCZip.h
index ce76bc77..bc527ad1 100644
--- a/launcher/MMCZip.h
+++ b/launcher/MMCZip.h
@@ -40,6 +40,8 @@
#include <quazip/JlCompress.h>
#include <QDir>
#include <QFileInfo>
+#include <QFuture>
+#include <QFutureWatcher>
#include <QHash>
#include <QSet>
#include <QString>
@@ -148,7 +150,12 @@ bool collectFileListRecursively(const QString& rootDir, const QString& subDir, Q
class ExportToZipTask : public Task {
public:
ExportToZipTask(QString outputPath, QDir dir, QFileInfoList files, QString destinationPrefix = "", bool followSymlinks = false)
- : m_output(outputPath), m_dir(dir), m_files(files), m_destination_prefix(destinationPrefix), m_follow_symlinks(followSymlinks)
+ : m_output_path(outputPath)
+ , m_output(outputPath)
+ , m_dir(dir)
+ , m_files(files)
+ , m_destination_prefix(destinationPrefix)
+ , m_follow_symlinks(followSymlinks)
{
setAbortable(true);
};
@@ -160,11 +167,17 @@ class ExportToZipTask : public Task {
void setExcludeFiles(QStringList excludeFiles) { m_exclude_files = excludeFiles; }
void addExtraFile(QString fileName, QByteArray data) { m_extra_files.insert(fileName, data); }
+ typedef std::optional<QString> ZipResult;
+
protected:
virtual void executeTask() override;
- void exportZip();
+ bool abort() override;
+
+ ZipResult exportZip();
+ void finish();
private:
+ QString m_output_path;
QuaZip m_output;
QDir m_dir;
QFileInfoList m_files;
@@ -172,5 +185,8 @@ class ExportToZipTask : public Task {
bool m_follow_symlinks;
QStringList m_exclude_files;
QHash<QString, QByteArray> m_extra_files;
+
+ QFuture<ZipResult> m_build_zip_future;
+ QFutureWatcher<ZipResult> m_build_zip_watcher;
};
} // namespace MMCZip
diff --git a/launcher/ui/dialogs/ExportInstanceDialog.cpp b/launcher/ui/dialogs/ExportInstanceDialog.cpp
index 1a3f8cd4..d1a69b93 100644
--- a/launcher/ui/dialogs/ExportInstanceDialog.cpp
+++ b/launcher/ui/dialogs/ExportInstanceDialog.cpp
@@ -146,11 +146,8 @@ void ExportInstanceDialog::doExport()
auto task = makeShared<MMCZip::ExportToZipTask>(output, m_instance->instanceRoot(), files, "", true);
- connect(task.get(), &Task::failed, this, [this, output](QString reason) {
- CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->show();
- QFile::remove(output);
- });
- connect(task.get(), &Task::aborted, this, [output] { QFile::remove(output); });
+ connect(task.get(), &Task::failed, this,
+ [this, output](QString reason) { CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->show(); });
connect(task.get(), &Task::finished, this, [task] { task->deleteLater(); });
ProgressDialog progress(this);