diff --git a/src/common/utility.cpp b/src/common/utility.cpp index bc2681ecd6c5..ce31bac851a7 100644 --- a/src/common/utility.cpp +++ b/src/common/utility.cpp @@ -58,6 +58,14 @@ #include "utility_unix.cpp" #endif +namespace { +constexpr auto bytes = 1024; +constexpr auto kilobytes = bytes; +constexpr auto megabytes = bytes * kilobytes; +constexpr qint64 gigabytes = bytes * megabytes; +constexpr qint64 terabytes = bytes * gigabytes; +} + namespace OCC { Q_LOGGING_CATEGORY(lcUtility, "nextcloud.sync.utility", QtInfoMsg) @@ -114,46 +122,40 @@ void Utility::removeFavLink(const QString &folder) removeFavLink_private(folder); } -QString Utility::octetsToString(qint64 octets) -{ -#define THE_FACTOR 1024 - static const qint64 kb = THE_FACTOR; - static const qint64 mb = THE_FACTOR * kb; - static const qint64 gb = THE_FACTOR * mb; - static const qint64 tb = THE_FACTOR * gb; - - QString s; - qreal value = octets; - - // Whether we care about decimals: only for GB/MB and only - // if it's less than 10 units. - bool round = true; - - if (octets >= tb) { - s = QCoreApplication::translate("Utility", "%L1 TB"); - value /= tb; - } else if (octets >= gb) { - s = QCoreApplication::translate("Utility", "%L1 GB"); - value /= gb; - round = false; - } else if (octets >= mb) { - s = QCoreApplication::translate("Utility", "%L1 MB"); - value /= mb; - round = false; - } else if (octets >= kb) { - s = QCoreApplication::translate("Utility", "%L1 KB"); - value /= kb; - } else { - s = QCoreApplication::translate("Utility", "%L1 B"); +QString Utility::octetsToString(const qint64 octets) +{ + auto unitName = QCoreApplication::translate("Utility", "%L1 B"); + qreal dataSize = octets; + + // Display decimals when value < TB and unit < 10 + auto showDecimals = true; + + if (octets >= terabytes) { + unitName = QCoreApplication::translate("Utility", "%L1 TB"); + dataSize /= terabytes; + showDecimals = false; + } else if (octets >= gigabytes) { + unitName = QCoreApplication::translate("Utility", "%L1 GB"); + dataSize /= gigabytes; + showDecimals = false; + } else if (octets >= megabytes) { + unitName = QCoreApplication::translate("Utility", "%L1 MB"); + dataSize /= megabytes; + showDecimals = false; + } else if (octets >= kilobytes) { + unitName = QCoreApplication::translate("Utility", "%L1 KB"); + dataSize /= kilobytes; } - if (value > 9.95) - round = true; + if (dataSize > 9.95) { + showDecimals = true; + } - if (round) - return s.arg(qRound(value)); + if (showDecimals) { + return unitName.arg(qRound(dataSize)); + } - return s.arg(value, 0, 'g', 2); + return unitName.arg(dataSize, 0, 'g', 2); } // Qtified version of get_platforms() in csync_owncloud.c diff --git a/src/common/utility.h b/src/common/utility.h index 9f5f71a5b976..9357b4908d60 100644 --- a/src/common/utility.h +++ b/src/common/utility.h @@ -57,7 +57,7 @@ namespace Utility { OCSYNC_EXPORT void setupFavLink(const QString &folder); OCSYNC_EXPORT void removeFavLink(const QString &folder); OCSYNC_EXPORT bool writeRandomFile(const QString &fname, int size = -1); - OCSYNC_EXPORT QString octetsToString(qint64 octets); + OCSYNC_EXPORT QString octetsToString(const qint64 octets); OCSYNC_EXPORT QByteArray userAgentString(); OCSYNC_EXPORT QByteArray friendlyUserAgentString(); /**