Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/owncloud/client.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHannah von Reth <hannah.vonreth@owncloud.com>2021-04-29 14:00:20 +0300
committerHannah von Reth <hannah.vonreth@owncloud.com>2021-04-29 14:00:20 +0300
commit9e6d325c9c8a6e8d0782ae803bdd30b6736d6c2f (patch)
tree43ae485f53af5234b41e90b71e053ca51116bf86 /src/gui/socketapi
parent550578a9fad54c92ed506acb3a1d7dc7cfc23a99 (diff)
parent557e41a52e3df3ab7b540e49ff3448686fbedfd8 (diff)
Merge remote-tracking branch 'origin/2.8' into master
Diffstat (limited to 'src/gui/socketapi')
-rw-r--r--src/gui/socketapi/socketuploadjob.cpp69
-rw-r--r--src/gui/socketapi/socketuploadjob.h5
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);
};
}