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:
-rw-r--r--src/libsync/abstractnetworkjob.cpp2
-rw-r--r--src/libsync/abstractnetworkjob.h3
-rw-r--r--src/libsync/account.cpp16
-rw-r--r--src/libsync/account.h4
-rw-r--r--src/libsync/discoveryphase.cpp7
-rw-r--r--src/libsync/discoveryphase.h5
-rw-r--r--src/libsync/networkjobs.cpp15
-rw-r--r--src/libsync/propagateupload.cpp6
-rw-r--r--src/libsync/syncengine.cpp9
9 files changed, 52 insertions, 15 deletions
diff --git a/src/libsync/abstractnetworkjob.cpp b/src/libsync/abstractnetworkjob.cpp
index 599e5be9a..ad874ed30 100644
--- a/src/libsync/abstractnetworkjob.cpp
+++ b/src/libsync/abstractnetworkjob.cpp
@@ -44,9 +44,9 @@ AbstractNetworkJob::AbstractNetworkJob(AccountPtr account, const QString &path,
: QObject(parent)
, _timedout(false)
, _followRedirects(false)
+ , _account(account)
, _ignoreCredentialFailure(false)
, _reply(0)
- , _account(account)
, _path(path)
, _redirectCount(0)
{
diff --git a/src/libsync/abstractnetworkjob.h b/src/libsync/abstractnetworkjob.h
index c471cca4c..08e71cf8b 100644
--- a/src/libsync/abstractnetworkjob.h
+++ b/src/libsync/abstractnetworkjob.h
@@ -91,11 +91,12 @@ private slots:
void slotFinished();
virtual void slotTimeout();
+protected:
+ AccountPtr _account;
private:
QNetworkReply* addTimer(QNetworkReply *reply);
bool _ignoreCredentialFailure;
QPointer<QNetworkReply> _reply; // (QPointer because the NetworkManager may be destroyed before the jobs at exit)
- AccountPtr _account;
QString _path;
QTimer _timer;
int _redirectCount;
diff --git a/src/libsync/account.cpp b/src/libsync/account.cpp
index cbf537f83..73a68872c 100644
--- a/src/libsync/account.cpp
+++ b/src/libsync/account.cpp
@@ -478,9 +478,25 @@ QString Account::serverVersion()
return _serverVersion;
}
+int Account::serverVersionInt()
+{
+ // FIXME: Use Qt 5.5 QVersionNumber
+ auto components = serverVersion().split('.');
+ return (components.value(0).toInt() << 16)
+ + (components.value(1).toInt() << 8)
+ + components.value(2).toInt();
+}
+
void Account::setServerVersion(const QString& version)
{
_serverVersion = version;
}
+bool Account::rootEtagChangesNotOnlySubFolderEtags()
+{
+ return (serverVersionInt() >= 0x080100);
+}
+
+
+
} // namespace OCC
diff --git a/src/libsync/account.h b/src/libsync/account.h
index e142a9a49..cb706c42b 100644
--- a/src/libsync/account.h
+++ b/src/libsync/account.h
@@ -154,6 +154,10 @@ public:
const Capabilities &capabilities() const;
void setServerVersion(const QString &version);
QString serverVersion();
+ int serverVersionInt();
+
+ // Fixed from 8.1 https://github.com/owncloud/client/issues/3730
+ bool rootEtagChangesNotOnlySubFolderEtags();
void clearCookieJar();
void lendCookieJarTo(QNetworkAccessManager *guest);
diff --git a/src/libsync/discoveryphase.cpp b/src/libsync/discoveryphase.cpp
index dcf2500ae..8273d7dc3 100644
--- a/src/libsync/discoveryphase.cpp
+++ b/src/libsync/discoveryphase.cpp
@@ -327,6 +327,10 @@ void DiscoverySingleDirectoryJob::directoryListingIteratedSlot(QString file,QMap
//This works in concerto with the RequestEtagJob and the Folder object to check if the remote folder changed.
if (map.contains("getetag")) {
_etagConcatenation += map.value("getetag");
+
+ if (_firstEtag.isEmpty()) {
+ _firstEtag = map.value("getetag"); // for directory itself
+ }
}
}
@@ -339,6 +343,7 @@ void DiscoverySingleDirectoryJob::lsJobFinishedWithoutErrorSlot()
deleteLater();
return;
}
+ emit etag(_firstEtag);
emit etagConcatenation(_etagConcatenation);
emit finishedWithResult(_results);
deleteLater();
@@ -410,6 +415,8 @@ void DiscoveryMainThread::doOpendirSlot(QString subPath, DiscoveryDirectoryResul
this, SLOT(singleDirectoryJobFirstDirectoryPermissionsSlot(QString)));
QObject::connect(_singleDirJob, SIGNAL(etagConcatenation(QString)),
this, SIGNAL(etagConcatenation(QString)));
+ QObject::connect(_singleDirJob, SIGNAL(etag(QString)),
+ this, SIGNAL(etag(QString)));
_singleDirJob->start();
}
diff --git a/src/libsync/discoveryphase.h b/src/libsync/discoveryphase.h
index 0c320a561..71d126a07 100644
--- a/src/libsync/discoveryphase.h
+++ b/src/libsync/discoveryphase.h
@@ -87,6 +87,7 @@ public:
signals:
void firstDirectoryPermissions(const QString &);
void etagConcatenation(const QString &);
+ void etag(const QString &);
void finishedWithResult(const QList<FileStatPointer> &);
void finishedWithError(int csyncErrnoCode, QString msg);
private slots:
@@ -97,6 +98,7 @@ private:
QList<FileStatPointer> _results;
QString _subPath;
QString _etagConcatenation;
+ QString _firstEtag;
AccountPtr _account;
bool _ignoredFirst;
QPointer<LsColJob> _lsColJob;
@@ -134,7 +136,8 @@ public slots:
void slotGetSizeFinishedWithError();
void slotGetSizeResult(const QVariantMap&);
signals:
- void etagConcatenation(QString);
+ void etag(const QString &);
+ void etagConcatenation(const QString &);
public:
void setupHooks(DiscoveryJob* discoveryJob, const QString &pathPrefix);
};
diff --git a/src/libsync/networkjobs.cpp b/src/libsync/networkjobs.cpp
index 0d7f8b682..2a62ee455 100644
--- a/src/libsync/networkjobs.cpp
+++ b/src/libsync/networkjobs.cpp
@@ -46,11 +46,16 @@ RequestEtagJob::RequestEtagJob(AccountPtr account, const QString &path, QObject
void RequestEtagJob::start()
{
QNetworkRequest req;
- // Let's always request all entries inside a directory. There are/were bugs in the server
- // where a root or root-folder ETag is not updated when its contents change. We work around
- // this by concatenating the ETags of the root and its contents.
- req.setRawHeader("Depth", "1");
- // See https://github.com/owncloud/core/issues/5255 and others
+ if (_account && _account->rootEtagChangesNotOnlySubFolderEtags()) {
+ // Fixed from 8.1 https://github.com/owncloud/client/issues/3730
+ req.setRawHeader("Depth", "0");
+ } else {
+ // Let's always request all entries inside a directory. There are/were bugs in the server
+ // where a root or root-folder ETag is not updated when its contents change. We work around
+ // this by concatenating the ETags of the root and its contents.
+ req.setRawHeader("Depth", "1");
+ // See https://github.com/owncloud/core/issues/5255 and others
+ }
QByteArray xml("<?xml version=\"1.0\" ?>\n"
"<d:propfind xmlns:d=\"DAV:\">\n"
diff --git a/src/libsync/propagateupload.cpp b/src/libsync/propagateupload.cpp
index 905b379db..4fe2182f2 100644
--- a/src/libsync/propagateupload.cpp
+++ b/src/libsync/propagateupload.cpp
@@ -513,11 +513,7 @@ void PropagateUploadFileQNAM::startNextChunk()
if (!env.isEmpty()) {
parallelChunkUpload = env != "false" && env != "0";
} else {
- auto version = _propagator->account()->serverVersion();
- auto components = version.split('.');
- int versionNum = (components.value(0).toInt() << 16)
- + (components.value(1).toInt() << 8)
- + components.value(2).toInt();
+ int versionNum = _propagator->account()->serverVersionInt();
if (versionNum < 0x080003) {
// Disable parallel chunk upload severs older than 8.0.3 to avoid too many
// internal sever errors (#2743, #2938)
diff --git a/src/libsync/syncengine.cpp b/src/libsync/syncengine.cpp
index 807af160f..ca2f8ff7c 100644
--- a/src/libsync/syncengine.cpp
+++ b/src/libsync/syncengine.cpp
@@ -676,8 +676,13 @@ void SyncEngine::startSync()
_discoveryMainThread = new DiscoveryMainThread(account());
_discoveryMainThread->setParent(this);
connect(this, SIGNAL(finished()), _discoveryMainThread, SLOT(deleteLater()));
- connect(_discoveryMainThread, SIGNAL(etagConcatenation(QString)), this, SLOT(slotRootEtagReceived(QString)));
-
+ qDebug() << "=====Server" << account()->serverVersion()
+ << QString("rootEtagChangesNotOnlySubFolderEtags=%1").arg(account()->rootEtagChangesNotOnlySubFolderEtags());
+ if (account()->rootEtagChangesNotOnlySubFolderEtags()) {
+ connect(_discoveryMainThread, SIGNAL(etag(QString)), this, SLOT(slotRootEtagReceived(QString)));
+ } else {
+ connect(_discoveryMainThread, SIGNAL(etagConcatenation(QString)), this, SLOT(slotRootEtagReceived(QString)));
+ }
DiscoveryJob *discoveryJob = new DiscoveryJob(_csync_ctx);
discoveryJob->_selectiveSyncBlackList = selectiveSyncBlackList;