From bb7d330516e5ae743af862ea22ab01b651ef8dee Mon Sep 17 00:00:00 2001 From: Camila San Date: Mon, 3 Jun 2019 17:50:16 +0200 Subject: [PATCH] Add error category for http file lock error status 423. It filters the error out of the list of blocking errors. It now shows up in the Activities and Notificattions list as a warning. Signed-off-by: Camila San --- src/gui/activitylistmodel.cpp | 3 ++- src/gui/activitywidget.cpp | 5 +++++ src/gui/folder.cpp | 4 ++++ src/gui/folder.h | 3 ++- src/libsync/owncloudpropagator.cpp | 1 + src/libsync/owncloudpropagator_p.h | 2 +- src/libsync/progressdispatcher.cpp | 3 ++- src/libsync/propagatedownload.cpp | 6 ++++++ src/libsync/syncfileitem.h | 1 + src/libsync/syncfilestatustracker.cpp | 3 ++- src/libsync/syncresult.cpp | 8 ++++++++ src/libsync/syncresult.h | 6 ++++++ 12 files changed, 40 insertions(+), 5 deletions(-) diff --git a/src/gui/activitylistmodel.cpp b/src/gui/activitylistmodel.cpp index 5b084784b4..ae3a7c6b30 100644 --- a/src/gui/activitylistmodel.cpp +++ b/src/gui/activitylistmodel.cpp @@ -105,7 +105,8 @@ QVariant ActivityListModel::data(const QModelIndex &index, int role) const } else if(a._status == SyncFileItem::SoftError || a._status == SyncFileItem::FileIgnored || a._status == SyncFileItem::Conflict - || a._status == SyncFileItem::Restoration){ + || a._status == SyncFileItem::Restoration + || a._status == SyncFileItem::FileLocked){ return QIcon(QLatin1String(":/client/resources/state-warning.svg")); } return QIcon(QLatin1String(":/client/resources/state-sync.svg")); diff --git a/src/gui/activitywidget.cpp b/src/gui/activitywidget.cpp index 71a86dd28b..c293a0384a 100644 --- a/src/gui/activitywidget.cpp +++ b/src/gui/activitywidget.cpp @@ -121,6 +121,11 @@ void ActivityWidget::slotProgressInfo(const QString &folder, const ProgressInfo continue; } + if(activity._status == SyncFileItem::FileLocked && !QFileInfo(f->path() + activity._file).exists()){ + _model->removeActivityFromActivityList(activity); + continue; + } + if(activity._status == SyncFileItem::FileIgnored && !QFileInfo(f->path() + activity._file).exists()){ _model->removeActivityFromActivityList(activity); diff --git a/src/gui/folder.cpp b/src/gui/folder.cpp index 97625c5c64..f5aedacf07 100644 --- a/src/gui/folder.cpp +++ b/src/gui/folder.cpp @@ -351,6 +351,10 @@ void Folder::showSyncResultPopup() createGuiLog(_syncResult.firstItemError()->_file, LogStatusError, errorCount); } + if (int lockedCount = _syncResult.numLockedItems()) { + createGuiLog(_syncResult.firstItemLocked()->_file, LogStatusFileLocked, lockedCount); + } + qCInfo(lcFolder) << "Folder sync result: " << int(_syncResult.status()); } diff --git a/src/gui/folder.h b/src/gui/folder.h index 05bd62a4e4..48a2e52f70 100644 --- a/src/gui/folder.h +++ b/src/gui/folder.h @@ -344,7 +344,8 @@ private: LogStatusNew, LogStatusError, LogStatusConflict, - LogStatusUpdated + LogStatusUpdated, + LogStatusFileLocked }; void createGuiLog(const QString &filename, LogStatus status, int count, diff --git a/src/libsync/owncloudpropagator.cpp b/src/libsync/owncloudpropagator.cpp index bf358153ef..ac03a1b971 100644 --- a/src/libsync/owncloudpropagator.cpp +++ b/src/libsync/owncloudpropagator.cpp @@ -269,6 +269,7 @@ void PropagateItemJob::done(SyncFileItem::Status statusArg, const QString &error case SyncFileItem::FileIgnored: case SyncFileItem::NoStatus: case SyncFileItem::BlacklistedError: + case SyncFileItem::FileLocked: // nothing break; } diff --git a/src/libsync/owncloudpropagator_p.h b/src/libsync/owncloudpropagator_p.h index cb266a80d9..90841e5379 100644 --- a/src/libsync/owncloudpropagator_p.h +++ b/src/libsync/owncloudpropagator_p.h @@ -93,7 +93,7 @@ inline SyncFileItem::Status classifyError(QNetworkReply::NetworkError nerror, if (anotherSyncNeeded) { *anotherSyncNeeded = true; } - return SyncFileItem::SoftError; + return SyncFileItem::FileLocked; } return SyncFileItem::NormalError; diff --git a/src/libsync/progressdispatcher.cpp b/src/libsync/progressdispatcher.cpp index e17279a53e..179d283193 100644 --- a/src/libsync/progressdispatcher.cpp +++ b/src/libsync/progressdispatcher.cpp @@ -91,7 +91,8 @@ bool Progress::isWarningKind(SyncFileItem::Status kind) return kind == SyncFileItem::SoftError || kind == SyncFileItem::NormalError || kind == SyncFileItem::FatalError || kind == SyncFileItem::FileIgnored || kind == SyncFileItem::Conflict || kind == SyncFileItem::Restoration - || kind == SyncFileItem::DetailError || kind == SyncFileItem::BlacklistedError; + || kind == SyncFileItem::DetailError || kind == SyncFileItem::BlacklistedError + || kind == SyncFileItem::FileLocked; } bool Progress::isIgnoredKind(SyncFileItem::Status kind) diff --git a/src/libsync/propagatedownload.cpp b/src/libsync/propagatedownload.cpp index 07c7c5f18c..da2d88b827 100644 --- a/src/libsync/propagatedownload.cpp +++ b/src/libsync/propagatedownload.cpp @@ -571,6 +571,12 @@ void PropagateDownloadFile::slotGetFinished() qCWarning(lcPropagateDownload) << "server replied 404, assuming file was deleted"; } + // Getting a 423 means that the file is locked + const bool fileLocked = _item->_httpErrorCode == 423; + if (fileLocked) { + qCWarning(lcPropagateDownload) << "server replied 423, file is Locked"; + } + // Don't keep the temporary file if it is empty or we // used a bad range header or the file's not on the server anymore. if (_tmpFile.size() == 0 || badRangeHeader || fileNotFound) { diff --git a/src/libsync/syncfileitem.h b/src/libsync/syncfileitem.h index 461627ba36..e054ab83a4 100644 --- a/src/libsync/syncfileitem.h +++ b/src/libsync/syncfileitem.h @@ -59,6 +59,7 @@ public: Conflict, FileIgnored, ///< The file is in the ignored list (or blacklisted with no retries left) + FileLocked, ///< The file is locked Restoration, ///< The file was restored because what should have been done was not allowed /** For errors that should only appear in the error view. diff --git a/src/libsync/syncfilestatustracker.cpp b/src/libsync/syncfilestatustracker.cpp index 6dc2514ff8..c492b34d54 100644 --- a/src/libsync/syncfilestatustracker.cpp +++ b/src/libsync/syncfilestatustracker.cpp @@ -105,7 +105,8 @@ static inline bool showWarningInSocketApi(const SyncFileItem &item) return item._instruction == CSYNC_INSTRUCTION_IGNORE || status == SyncFileItem::FileIgnored || status == SyncFileItem::Conflict - || status == SyncFileItem::Restoration; + || status == SyncFileItem::Restoration + || status == SyncFileItem::FileLocked; } SyncFileStatusTracker::SyncFileStatusTracker(SyncEngine *syncEngine) diff --git a/src/libsync/syncresult.cpp b/src/libsync/syncresult.cpp index 8550b4628e..a3481c74fa 100644 --- a/src/libsync/syncresult.cpp +++ b/src/libsync/syncresult.cpp @@ -28,6 +28,7 @@ SyncResult::SyncResult() , _numNewConflictItems(0) , _numOldConflictItems(0) , _numErrorItems(0) + , _numLockedItems(0) { } @@ -139,6 +140,13 @@ void SyncResult::processCompletedItem(const SyncFileItemPtr &item) _folderStructureWasChanged = true; } + if(item->_status == SyncFileItem::FileLocked){ + _numLockedItems++; + if (!_firstItemLocked) { + _firstItemLocked = item; + } + } + // Process the item to the gui if (item->_status == SyncFileItem::FatalError || item->_status == SyncFileItem::NormalError) { //: this displays an error string (%2) for a file %1 diff --git a/src/libsync/syncresult.h b/src/libsync/syncresult.h index 6c484ee4d2..1a0c680ca5 100644 --- a/src/libsync/syncresult.h +++ b/src/libsync/syncresult.h @@ -72,12 +72,16 @@ public: int numErrorItems() const { return _numErrorItems; } bool hasUnresolvedConflicts() const { return _numNewConflictItems + _numOldConflictItems > 0; } + int numLockedItems() const { return _numLockedItems; } + bool hasLockedFiles() const { return _numLockedItems > 0; } + const SyncFileItemPtr &firstItemNew() const { return _firstItemNew; } const SyncFileItemPtr &firstItemDeleted() const { return _firstItemDeleted; } const SyncFileItemPtr &firstItemUpdated() const { return _firstItemUpdated; } const SyncFileItemPtr &firstItemRenamed() const { return _firstItemRenamed; } const SyncFileItemPtr &firstNewConflictItem() const { return _firstNewConflictItem; } const SyncFileItemPtr &firstItemError() const { return _firstItemError; } + const SyncFileItemPtr &firstItemLocked() const { return _firstItemLocked; } void processCompletedItem(const SyncFileItemPtr &item); @@ -101,6 +105,7 @@ private: int _numNewConflictItems; int _numOldConflictItems; int _numErrorItems; + int _numLockedItems; SyncFileItemPtr _firstItemNew; SyncFileItemPtr _firstItemDeleted; @@ -108,6 +113,7 @@ private: SyncFileItemPtr _firstItemRenamed; SyncFileItemPtr _firstNewConflictItem; SyncFileItemPtr _firstItemError; + SyncFileItemPtr _firstItemLocked; }; }