diff options
author | Petr Mrázek <peterix@gmail.com> | 2016-10-26 18:12:33 +0200 |
---|---|---|
committer | Petr Mrázek <peterix@gmail.com> | 2016-10-26 18:21:25 +0200 |
commit | 1b4851a941cbafb7bf7a45feee7149cefa7e0acb (patch) | |
tree | 6626a47c9d2f2b4a37302b0e036ab1ffc5033f3f /api/logic/InstanceImportTask.cpp | |
parent | d66fdcd4cc6913508d2987c14cd9fc4d6760b8a5 (diff) | |
download | PrismLauncher-1b4851a941cbafb7bf7a45feee7149cefa7e0acb.tar.gz PrismLauncher-1b4851a941cbafb7bf7a45feee7149cefa7e0acb.tar.bz2 PrismLauncher-1b4851a941cbafb7bf7a45feee7149cefa7e0acb.zip |
NOISSUE use QtConcurrent to run FS operations in worker threads
Not all operations - only the ones that aren't in error handling.
The API for QFuture is too nasty to do much more in a sensible way.
Diffstat (limited to 'api/logic/InstanceImportTask.cpp')
-rw-r--r-- | api/logic/InstanceImportTask.cpp | 32 |
1 files changed, 25 insertions, 7 deletions
diff --git a/api/logic/InstanceImportTask.cpp b/api/logic/InstanceImportTask.cpp index 99f2553f..23897778 100644 --- a/api/logic/InstanceImportTask.cpp +++ b/api/logic/InstanceImportTask.cpp @@ -8,6 +8,7 @@ #include "NullInstance.h" #include "settings/INISettingsObject.h" #include "icons/IIconList.h" +#include <QtConcurrentRun> InstanceImportTask::InstanceImportTask(SettingsObjectPtr settings, const QUrl sourceUrl, BaseInstanceProvider * target, const QString &instName, const QString &instIcon, const QString &instGroup) @@ -86,19 +87,29 @@ static QFileInfo findRecursive(const QString &dir, const QString &name) void InstanceImportTask::extractAndTweak() { setStatus(tr("Extracting modpack")); - QString stagingPath = m_target->getStagedInstancePath(); - QDir extractDir(stagingPath); + m_stagingPath = m_target->getStagedInstancePath(); + QDir extractDir(m_stagingPath); qDebug() << "Attempting to create instance from" << m_archivePath; - if (MMCZip::extractDir(m_archivePath, extractDir.absolutePath()).isEmpty()) + + m_extractFuture = QtConcurrent::run(QThreadPool::globalInstance(), MMCZip::extractDir, m_archivePath, extractDir.absolutePath()); + connect(&m_extractFutureWatcher, &QFutureWatcher<QStringList>::finished, this, &InstanceImportTask::extractFinished); + connect(&m_extractFutureWatcher, &QFutureWatcher<QStringList>::canceled, this, &InstanceImportTask::extractAborted); + m_extractFutureWatcher.setFuture(m_extractFuture); +} + +void InstanceImportTask::extractFinished() +{ + if (m_extractFuture.result().isEmpty()) { - m_target->destroyStagingPath(stagingPath); + m_target->destroyStagingPath(m_stagingPath); emitFailed(tr("Failed to extract modpack")); return; } + QDir extractDir(m_stagingPath); const QFileInfo instanceCfgFile = findRecursive(extractDir.absolutePath(), "instance.cfg"); if (!instanceCfgFile.isFile() || !instanceCfgFile.exists()) { - m_target->destroyStagingPath(stagingPath); + m_target->destroyStagingPath(m_stagingPath); emitFailed(tr("Archive does not contain instance.cfg")); return; } @@ -136,11 +147,18 @@ void InstanceImportTask::extractAndTweak() iconList->installIcons({importIconPath}); } } - if (!m_target->commitStagedInstance(stagingPath, actualDir, m_instName, m_instGroup)) + if (!m_target->commitStagedInstance(m_stagingPath, actualDir, m_instName, m_instGroup)) { - m_target->destroyStagingPath(stagingPath); + m_target->destroyStagingPath(m_stagingPath); emitFailed(tr("Unable to commit instance")); return; } emitSucceeded(); } + +void InstanceImportTask::extractAborted() +{ + m_target->destroyStagingPath(m_stagingPath); + emitFailed(tr("Instance import has been aborted.")); + return; +} |