diff options
-rw-r--r-- | src/libsync/abstractnetworkjob.cpp | 2 | ||||
-rw-r--r-- | src/libsync/abstractnetworkjob.h | 3 | ||||
-rw-r--r-- | src/libsync/account.cpp | 16 | ||||
-rw-r--r-- | src/libsync/account.h | 4 | ||||
-rw-r--r-- | src/libsync/discoveryphase.cpp | 7 | ||||
-rw-r--r-- | src/libsync/discoveryphase.h | 5 | ||||
-rw-r--r-- | src/libsync/networkjobs.cpp | 15 | ||||
-rw-r--r-- | src/libsync/propagateupload.cpp | 6 | ||||
-rw-r--r-- | src/libsync/syncengine.cpp | 9 |
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; |