summaryrefslogtreecommitdiffstats
path: root/api/logic/FolderInstanceProvider.cpp
diff options
context:
space:
mode:
authorPetr Mrázek <peterix@gmail.com>2017-09-04 08:17:25 +0200
committerPetr Mrázek <peterix@gmail.com>2017-09-04 08:17:25 +0200
commitd80382180ef14d814eb9f6d7f2bf5db362f25cc2 (patch)
tree824dae31e08a961be3b1f0bf0129419ccbbef9b2 /api/logic/FolderInstanceProvider.cpp
parentb8adbb9b73751b022b42180dcc213dc99be9765b (diff)
downloadMultiMC-d80382180ef14d814eb9f6d7f2bf5db362f25cc2.tar
MultiMC-d80382180ef14d814eb9f6d7f2bf5db362f25cc2.tar.gz
MultiMC-d80382180ef14d814eb9f6d7f2bf5db362f25cc2.tar.lz
MultiMC-d80382180ef14d814eb9f6d7f2bf5db362f25cc2.tar.xz
MultiMC-d80382180ef14d814eb9f6d7f2bf5db362f25cc2.zip
NOISSUE refactor pack import (extraction and paths)
It now: * Doesn't extract until it knows the content format is good. * Extracts in a predictable location, not requiring to use a second path for the actual pack root.
Diffstat (limited to 'api/logic/FolderInstanceProvider.cpp')
-rw-r--r--api/logic/FolderInstanceProvider.cpp50
1 files changed, 47 insertions, 3 deletions
diff --git a/api/logic/FolderInstanceProvider.cpp b/api/logic/FolderInstanceProvider.cpp
index 88b5bdc6..4893efd8 100644
--- a/api/logic/FolderInstanceProvider.cpp
+++ b/api/logic/FolderInstanceProvider.cpp
@@ -310,6 +310,52 @@ void FolderInstanceProvider::on_InstFolderChanged(const Setting &setting, QVaria
emit instancesChanged();
}
}
+/*
+class FolderInstanceStaging : public Task
+{
+
+public:
+ FolderInstanceStaging(FolderInstanceProvider * parent, Task * child, const QString& instanceName, const QString& groupName)
+ {
+ m_parent = parent;
+ m_child.reset(child);
+ connect(child, &Task::succeeded, this, &FolderInstanceStaging::childSucceded);
+ connect(child, &Task::failed, this, &FolderInstanceStaging::childFailed);
+ connect(child, &Task::status, this, &FolderInstanceStaging::setStatus);
+ connect(child, &Task::progress, this, &FolderInstanceStaging::setProgress);
+ m_instanceName = instanceName;
+ m_groupName = groupName;
+ }
+
+protected:
+ virtual void executeTask() override
+ {
+ m_stagingPath = m_parent->getStagedInstancePath();
+ m_child->start();
+ }
+
+private slots:
+ void childSucceded()
+ {
+ if(m_parent->commitStagedInstance(m_stagingPath, m_instanceName, m_groupName))
+ emitSucceeded();
+ // TODO: implement exponential backoff retry scheme with limit
+ emitFailed("Failed to commit instance");
+ }
+ void childFailed(const QString & reason)
+ {
+ m_parent->destroyStagingPath(m_stagingPath);
+ emitFailed(reason);
+ }
+
+private:
+ QString m_stagingPath;
+ FolderInstanceProvider * m_parent;
+ unique_qobject_ptr<Task> m_child;
+ QString m_instanceName;
+ QString m_groupName;
+};
+*/
QString FolderInstanceProvider::getStagedInstancePath()
{
@@ -324,8 +370,7 @@ QString FolderInstanceProvider::getStagedInstancePath()
return path;
}
-bool FolderInstanceProvider::commitStagedInstance(const QString& keyPath, const QString& path, const QString& instanceName,
- const QString& groupName)
+bool FolderInstanceProvider::commitStagedInstance(const QString& path, const QString& instanceName, const QString& groupName)
{
QDir dir;
QString instID = FS::DirNameFromString(instanceName, m_instDir);
@@ -335,7 +380,6 @@ bool FolderInstanceProvider::commitStagedInstance(const QString& keyPath, const
if(!dir.rename(path, destination))
{
qWarning() << "Failed to move" << path << "to" << destination;
- destroyStagingPath(keyPath);
return false;
}
groupMap[instID] = groupName;