Skip to content

Commit 9b38569

Browse files
committed
Refactor code for handling folder status
* Improve documentation * Use hash-map and switch with no code duplication instead of a big if-else-if-…-else with duplicated code
1 parent 55fa6a3 commit 9b38569

File tree

2 files changed

+28
-29
lines changed

2 files changed

+28
-29
lines changed

syncthingconnector/syncthingdir.cpp

+27-28
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include <c++utilities/conversion/stringconversion.h>
44

55
#include <QCoreApplication>
6+
#include <QHash>
67
#include <QJsonObject>
78
#include <QStringBuilder>
89

@@ -107,49 +108,47 @@ bool SyncthingDir::finalizeStatusUpdate(SyncthingDirStatus newStatus, SyncthingE
107108
/*!
108109
* \brief Assigns the status from the specified status string.
109110
* \returns Returns whether the status has actually changed.
111+
* \remarks
112+
* The status mapping is defined by `lib/model/folderstate.go`. Additional statuses are made up on UI-level
113+
* in `gui/default/syncthing/core/syncthingController.js` but those are not handled by this function.
110114
*/
111115
bool SyncthingDir::assignStatus(const QString &statusStr, SyncthingEventId eventId, CppUtilities::DateTime time)
112116
{
113117
if (!checkWhetherStatusUpdateRelevant(eventId, time)) {
114118
return false;
115119
}
116120

117-
// identify statusStr
118-
SyncthingDirStatus newStatus;
119-
if (statusStr == QLatin1String("idle")) {
121+
static const auto statusMapping = QHash<QString, SyncthingDirStatus>{
122+
{QStringLiteral("idle"), SyncthingDirStatus::Idle},
123+
{QStringLiteral("scanning"), SyncthingDirStatus::Scanning},
124+
{QStringLiteral("scan-waiting"), SyncthingDirStatus::WaitingToScan},
125+
{QStringLiteral("sync-waiting"), SyncthingDirStatus::WaitingToSync},
126+
{QStringLiteral("sync-preparing"), SyncthingDirStatus::PreparingToSync},
127+
{QStringLiteral("syncing"), SyncthingDirStatus::Synchronizing},
128+
{QStringLiteral("cleaning"), SyncthingDirStatus::Cleaning},
129+
{QStringLiteral("clean-waiting"), SyncthingDirStatus::WaitingToClean},
130+
{QStringLiteral("error"), SyncthingDirStatus::OutOfSync},
131+
};
132+
133+
const auto i = statusMapping.find(statusStr);
134+
const auto newStatus = i != statusMapping.cend() ? *i : SyncthingDirStatus::Unknown;
135+
switch (newStatus) {
136+
case SyncthingDirStatus::Idle:
137+
case SyncthingDirStatus::OutOfSync:
120138
completionPercentage = 0;
121-
newStatus = SyncthingDirStatus::Idle;
122-
} else if (statusStr == QLatin1String("scanning")) {
123-
newStatus = SyncthingDirStatus::Scanning;
124-
} else if (statusStr == QLatin1String("scan-waiting")) {
125-
newStatus = SyncthingDirStatus::WaitingToScan;
126-
} else if (statusStr == QLatin1String("sync-waiting")) {
127-
newStatus = SyncthingDirStatus::WaitingToSync;
128-
} else if (statusStr == QLatin1String("sync-preparing")) {
129-
// ensure status changed signal is emitted
130-
if (!itemErrors.empty()) {
131-
status = SyncthingDirStatus::Unknown;
132-
}
133-
newStatus = SyncthingDirStatus::PreparingToSync;
134-
} else if (statusStr == QLatin1String("syncing")) {
139+
break;
140+
case Data::SyncthingDirStatus::WaitingToSync:
141+
case Data::SyncthingDirStatus::PreparingToSync:
135142
// ensure status changed signal is emitted
136143
if (!itemErrors.empty()) {
137144
status = SyncthingDirStatus::Unknown;
138145
}
139-
newStatus = SyncthingDirStatus::Synchronizing;
140-
} else if (statusStr == QLatin1String("cleaning")) {
141-
newStatus = SyncthingDirStatus::Cleaning;
142-
} else if (statusStr == QLatin1String("clean-waiting")) {
143-
newStatus = SyncthingDirStatus::WaitingToClean;
144-
} else if (statusStr == QLatin1String("error")) {
145-
completionPercentage = 0;
146-
newStatus = SyncthingDirStatus::OutOfSync;
147-
} else {
148-
newStatus = SyncthingDirStatus::Idle;
146+
break;
147+
default:
148+
;
149149
}
150150

151151
rawStatus = statusStr;
152-
153152
return finalizeStatusUpdate(newStatus, eventId, time);
154153
}
155154

syncthingconnector/syncthingdir.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ namespace Data {
2727
/// and SyncthingDirectoryModel::data(), SyncthingDirectoryModel::dirStatusString() and SyncthingDirectoryModel::dirStatusColor().
2828
enum class SyncthingDirStatus {
2929
Unknown, /**< directory status is unknown */
30-
Idle, /**< directory is idling ("idle") */
30+
Idle, /**< directory is up-to-date ("idle") */
3131
Scanning, /**< directory is scanning ("scanning") */
3232
WaitingToScan, /**< directory is waiting to scan ("scan-waiting") */
3333
WaitingToSync, /**< directory is waiting to sync ("sync-waiting") */

0 commit comments

Comments
 (0)