Skip to content

Commit

Permalink
Added QFutureWatcher
Browse files Browse the repository at this point in the history
Signed-off-by: Trial97 <alexandru.tripon97@gmail.com>

abort
  • Loading branch information
Trial97 committed Jul 17, 2023
1 parent fe73d69 commit 8b017fb
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 24 deletions.
55 changes: 38 additions & 17 deletions launcher/MMCZip.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
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;
return ZipResult();

auto absolute = file.absoluteFilePath();
auto relative = m_dir.relativeFilePath(absolute);
Expand All @@ -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
20 changes: 18 additions & 2 deletions launcher/MMCZip.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@
#include <quazip/JlCompress.h>
#include <QDir>
#include <QFileInfo>
#include <QFuture>
#include <QFutureWatcher>
#include <QHash>
#include <QSet>
#include <QString>
Expand Down Expand Up @@ -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);
};
Expand All @@ -160,17 +167,26 @@ 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;
QString m_destination_prefix;
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
7 changes: 2 additions & 5 deletions launcher/ui/dialogs/ExportInstanceDialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

0 comments on commit 8b017fb

Please sign in to comment.