summaryrefslogtreecommitdiffstats
path: root/api/logic/InstanceImportTask.cpp
diff options
context:
space:
mode:
authorPetr Mrázek <peterix@gmail.com>2016-10-26 18:12:33 +0200
committerPetr Mrázek <peterix@gmail.com>2016-10-26 18:21:25 +0200
commit1b4851a941cbafb7bf7a45feee7149cefa7e0acb (patch)
tree6626a47c9d2f2b4a37302b0e036ab1ffc5033f3f /api/logic/InstanceImportTask.cpp
parentd66fdcd4cc6913508d2987c14cd9fc4d6760b8a5 (diff)
downloadMultiMC-1b4851a941cbafb7bf7a45feee7149cefa7e0acb.tar
MultiMC-1b4851a941cbafb7bf7a45feee7149cefa7e0acb.tar.gz
MultiMC-1b4851a941cbafb7bf7a45feee7149cefa7e0acb.tar.lz
MultiMC-1b4851a941cbafb7bf7a45feee7149cefa7e0acb.tar.xz
MultiMC-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.cpp32
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;
+}