From 1b4851a941cbafb7bf7a45feee7149cefa7e0acb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Wed, 26 Oct 2016 18:12:33 +0200 Subject: 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. --- api/logic/InstanceImportTask.cpp | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) (limited to 'api/logic/InstanceImportTask.cpp') 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 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::finished, this, &InstanceImportTask::extractFinished); + connect(&m_extractFutureWatcher, &QFutureWatcher::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; +} -- cgit v1.2.3