From d80382180ef14d814eb9f6d7f2bf5db362f25cc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Mon, 4 Sep 2017 08:17:25 +0200 Subject: 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. --- api/logic/FolderInstanceProvider.cpp | 50 +++++++++++++++++++++++++++++++++--- 1 file changed, 47 insertions(+), 3 deletions(-) (limited to 'api/logic/FolderInstanceProvider.cpp') 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 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; -- cgit v1.2.3