diff options
author | Hannah von Reth <hannah.vonreth@owncloud.com> | 2021-04-29 14:00:20 +0300 |
---|---|---|
committer | Hannah von Reth <hannah.vonreth@owncloud.com> | 2021-04-29 14:00:20 +0300 |
commit | 9e6d325c9c8a6e8d0782ae803bdd30b6736d6c2f (patch) | |
tree | 43ae485f53af5234b41e90b71e053ca51116bf86 /src/gui/socketapi | |
parent | 550578a9fad54c92ed506acb3a1d7dc7cfc23a99 (diff) | |
parent | 557e41a52e3df3ab7b540e49ff3448686fbedfd8 (diff) |
Merge remote-tracking branch 'origin/2.8' into master
Diffstat (limited to 'src/gui/socketapi')
-rw-r--r-- | src/gui/socketapi/socketuploadjob.cpp | 69 | ||||
-rw-r--r-- | src/gui/socketapi/socketuploadjob.h | 5 |
2 files changed, 69 insertions, 5 deletions
diff --git a/src/gui/socketapi/socketuploadjob.cpp b/src/gui/socketapi/socketuploadjob.cpp index dca5ab331..b708ca781 100644 --- a/src/gui/socketapi/socketuploadjob.cpp +++ b/src/gui/socketapi/socketuploadjob.cpp @@ -23,6 +23,7 @@ #include "syncengine.h" #include "theme.h" +#include <QBuffer> #include <QDir> #include <QFileInfo> #include <QJsonArray> @@ -31,12 +32,48 @@ using namespace OCC; +namespace { +const QString backupTagNameC() +{ + return QStringLiteral("backup_finished"); +} +const QUrl tagUrl(const OCC::AccountPtr &account) +{ + return Utility::concatUrlPath(account->url(), QStringLiteral("remote.php/dav/systemtags")); +} +} + SocketUploadJob::SocketUploadJob(const QSharedPointer<SocketApiJobV2> &job) : _apiJob(job) { connect(job.data(), &SocketApiJobV2::finished, this, &SocketUploadJob::deleteLater); } +void SocketUploadJob::prepareTag(const AccountPtr &account) +{ + auto tagJob = new OCC::SimpleNetworkJob(account, this); + connect(tagJob, &OCC::SimpleNetworkJob::finishedSignal, this, [account, this] { + auto propfindJob = new OCC::LsColJob(account, tagUrl(account), this); + propfindJob->setProperties({ QByteArrayLiteral("http://owncloud.org/ns:display-name"), QByteArrayLiteral("http://owncloud.org/ns:id") }); + + connect(propfindJob, &LsColJob::directoryListingIterated, this, [this](const QString &, const QMap<QString, QString> &data) { + if (data["display-name"] == backupTagNameC()) { + _finisedTagId = data["id"].toInt(); + } + }); + connect(propfindJob, &LsColJob::finishedWithError, this, [this] { + fail(tr("Failed to rerieve tags")); + }); + propfindJob->start(); + }); + const QJsonObject json({ { QStringLiteral("name"), backupTagNameC() }, + { QStringLiteral("userVisible"), QStringLiteral("true") }, + { QStringLiteral("userAssignable"), QStringLiteral("false") } }); + QNetworkRequest req; + tagJob->prepareRequest(QByteArrayLiteral("POST"), tagUrl(account), req, json); + tagJob->start(); +} + void SocketUploadJob::start() { _localPath = _apiJob->arguments()[QLatin1String("localPath")].toString(); @@ -87,13 +124,29 @@ void SocketUploadJob::start() Q_EMIT ProgressDispatcher::instance()->progressInfo(_localPath, info); }); connect(engine, &OCC::SyncEngine::itemCompleted, this, [this](const OCC::SyncFileItemPtr item) { - _syncedFiles.append(item->_file); + if (item->_errorString.isEmpty()) { + _syncedFiles.append(item->_file); + } else { + _errorFiles.append(QStringLiteral("%1: %2").arg(item->_file, item->_errorString)); + } }); - connect(engine, &OCC::SyncEngine::finished, this, [this](bool ok) { + connect(engine, &OCC::SyncEngine::finished, this, [engine, this](bool ok) { if (ok) { - logMessage(_localPath, tr("Backup of %1 succeeded").arg(QDir::toNativeSeparators(_localPath))); - _apiJob->success({ { QStringLiteral("localPath"), _localPath }, { QStringLiteral("syncedFiles"), QJsonArray::fromStringList(_syncedFiles) } }); + auto tagJob = new OCC::SimpleNetworkJob(engine->account(), this); + connect(tagJob, &OCC::SimpleNetworkJob::finishedSignal, this, [tagJob, this] { + if (tagJob->reply()->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt() == 201) { + logMessage(_localPath, tr("Backup of %1 succeeded").arg(QDir::toNativeSeparators(_localPath))); + _apiJob->success({ { QStringLiteral("localPath"), _localPath }, { QStringLiteral("syncedFiles"), QJsonArray::fromStringList(_syncedFiles) } }); + } else { + fail(tr("Failed to set success tag")); + } + }); + OC_ASSERT(_finisedTagId > 0); + tagJob->prepareRequest(QByteArrayLiteral("PUT"), Utility::concatUrlPath(engine->account()->url(), QStringLiteral("remote.php/dav/systemtags-relations/files/%1/%2").arg(_backupFileId, QString::number(_finisedTagId)))); + tagJob->start(); + } else { + fail(tr("Failed to create backup: %1").arg(_errorFiles.join(", "))); } }); connect(engine, &OCC::SyncEngine::syncError, this, [this](const QString &error, ErrorCategory) { @@ -108,9 +161,15 @@ void SocketUploadJob::start() } engine->setSyncOptions(opt); + prepareTag(account->account()); + // create the dir, fail if it already exists auto mkdir = new OCC::MkColJob(engine->account(), remotePath); - connect(mkdir, &OCC::MkColJob::finishedWithoutError, engine, &OCC::SyncEngine::startSync); + connect(mkdir, &OCC::MkColJob::finishedWithoutError, this, [engine, mkdir, this]{ + auto reply = mkdir->reply(); + _backupFileId = reply->rawHeader(QByteArrayLiteral("OC-FileId")); + engine->startSync(); + }); connect(mkdir, &OCC::MkColJob::finishedWithError, this, [remotePath, this](QNetworkReply *reply) { if (reply->error() == 202) { fail(QStringLiteral("Destination %1 already exists").arg(remotePath)); diff --git a/src/gui/socketapi/socketuploadjob.h b/src/gui/socketapi/socketuploadjob.h index 2ee375990..557cabfaa 100644 --- a/src/gui/socketapi/socketuploadjob.h +++ b/src/gui/socketapi/socketuploadjob.h @@ -38,5 +38,10 @@ private: QString _localPath; QSharedPointer<SocketApiJobV2> _apiJob; QStringList _syncedFiles; + QStringList _errorFiles; + int _finisedTagId = -1; + QByteArray _backupFileId; + + void prepareTag(const AccountPtr &account); }; } |