From 62c362eacbdc3c9a3f9be0b66a6c9e27cdae3e78 Mon Sep 17 00:00:00 2001 From: Charles Kerr Date: Mon, 22 Dec 2025 09:34:04 -0600 Subject: [PATCH] fix: clang-tidy warnings in Qt client (#7981) * fix: readability-identifier-naming * fix: misc-unused-using-decls * fix: google-readability-braces-around-statements,hicpp-braces-around-statements,readability-braces-around-statements * fix: cert-err58-cpp * fix: bugprone-unchecked-optional-access * Revert "fix: cert-err58-cpp" This reverts commit 6e6d97228f9f0e3497101508501bd5e497531fa9. * fix: better to keep QStringLiteral; disable spurious cert-err58-cpp warning --- qt/Application.cc | 3 ++- qt/Formatter.cc | 4 ++-- qt/MainWindow.cc | 14 +++++++------ qt/NativeIcon.cc | 32 +++++++++++++++++++++++++++--- qt/RpcClient.cc | 47 +++++++++++++++++--------------------------- qt/RpcClient.h | 4 +--- qt/VariantHelpers.cc | 6 +++--- 7 files changed, 63 insertions(+), 47 deletions(-) diff --git a/qt/Application.cc b/qt/Application.cc index d1b2e1e83..edf6cb95d 100644 --- a/qt/Application.cc +++ b/qt/Application.cc @@ -42,13 +42,14 @@ namespace { +// NOLINTBEGIN(cert-err58-cpp) auto const ConfigName = QStringLiteral("transmission"); - #ifdef QT_DBUS_LIB auto const FDONotificationsServiceName = QStringLiteral("org.freedesktop.Notifications"); auto const FDONotificationsPath = QStringLiteral("/org/freedesktop/Notifications"); auto const FDONotificationsInterfaceName = QStringLiteral("org.freedesktop.Notifications"); #endif +// NOLINTEND(cert-err58-cpp) auto constexpr StatsRefreshIntervalMsec = 3000; auto constexpr SessionRefreshIntervalMsec = 3000; diff --git a/qt/Formatter.cc b/qt/Formatter.cc index 9ffddebeb..3f10cd587 100644 --- a/qt/Formatter.cc +++ b/qt/Formatter.cc @@ -50,9 +50,9 @@ QString Formatter::storage_to_string(int64_t const bytes) QString Formatter::ratio_to_string(double ratio) { static auto constexpr Infinity = "\xE2\x88\x9E"sv; - static auto const none = tr("None").toStdString(); + static auto const None = tr("None").toStdString(); - return QString::fromStdString(tr_strratio(ratio, none, Infinity)); + return QString::fromStdString(tr_strratio(ratio, None, Infinity)); } QString Formatter::time_to_string(int seconds) diff --git a/qt/MainWindow.cc b/qt/MainWindow.cc index a1d972c08..059d44950 100644 --- a/qt/MainWindow.cc +++ b/qt/MainWindow.cc @@ -916,16 +916,16 @@ void MainWindow::refreshIcons() // network icons - auto networkPixmap = [](icons::Type type) + auto network_pixmap = [](icons::Type type) { auto constexpr Size = QSize{ 16, 16 }; return icons::icon(type).pixmap(Size); }; - pixmap_network_idle_ = networkPixmap(icons::Type::NetworkIdle); - pixmap_network_receive_ = networkPixmap(icons::Type::NetworkReceive); - pixmap_network_transmit_ = networkPixmap(icons::Type::NetworkTransmit); - pixmap_network_transmit_receive_ = networkPixmap(icons::Type::NetworkTransmitReceive); - pixmap_network_error_ = networkPixmap(icons::Type::NetworkError); + pixmap_network_idle_ = network_pixmap(icons::Type::NetworkIdle); + pixmap_network_receive_ = network_pixmap(icons::Type::NetworkReceive); + pixmap_network_transmit_ = network_pixmap(icons::Type::NetworkTransmit); + pixmap_network_transmit_receive_ = network_pixmap(icons::Type::NetworkTransmitReceive); + pixmap_network_error_ = network_pixmap(icons::Type::NetworkError); } /** @@ -1602,7 +1602,9 @@ bool MainWindow::event(QEvent* e) case QEvent::Clipboard: if (auto_add_clipboard_links_) + { addTorrentFromClipboard(); + } break; case QEvent::PaletteChange: diff --git a/qt/NativeIcon.cc b/qt/NativeIcon.cc index 3341d8ad0..c87c5519b 100644 --- a/qt/NativeIcon.cc +++ b/qt/NativeIcon.cc @@ -31,9 +31,11 @@ namespace { // https://learn.microsoft.com/en-us/windows/apps/design/style/segoe-ui-symbol-font +// NOLINTNEXTLINE(cert-err58-cpp) auto const Win10IconFamily = QStringLiteral("Segoe MDL2 Assets"); // https://learn.microsoft.com/en-us/windows/apps/design/style/segoe-fluent-icons-font +// NOLINTNEXTLINE(cert-err58-cpp) auto const Win11IconFamily = QStringLiteral("Segoe Fluent Icons"); // Define these two macros to force a specific icon icon during development. @@ -52,10 +54,14 @@ QString getWindowsFontFamily() return DEV_FORCE_FONT_FAMILY; #else if (QOperatingSystemVersion::current() >= QOperatingSystemVersion(QOperatingSystemVersion::Windows, 11)) + { return Win11IconFamily; + } if (QOperatingSystemVersion::current() >= QOperatingSystemVersion(QOperatingSystemVersion::Windows, 10)) + { return Win10IconFamily; + } return {}; #endif @@ -72,7 +78,9 @@ QPixmap makeIconFromCodepoint(QString const family, QChar const codepoint, int c { auto font = QFont{ family }; if (!QFontMetrics{ font }.inFont(codepoint)) + { return {}; + } font.setPixelSize(pixel_size); @@ -439,10 +447,16 @@ QIcon icon(Type const type, QStyle const* const style) auto icon = QIcon{}; auto const name = QString::fromUtf8(std::data(key), std::size(key)); for (int const pixel_size : pixel_sizes) + { if (auto const pixmap = loadSFSymbol(name, pixel_size); !pixmap.isNull()) + { icon.addPixmap(pixmap); + } + } if (!icon.isNull()) + { return icon; + } } #endif @@ -453,10 +467,16 @@ QIcon icon(Type const type, QStyle const* const style) auto icon = QIcon{}; auto const ch = QChar{ key }; for (int const pixel_size : pixel_sizes) + { if (auto pixmap = makeIconFromCodepoint(family, ch, pixel_size); !pixmap.isNull()) + { icon.addPixmap(pixmap); + } + } if (!icon.isNull()) + { return icon; + } } } @@ -465,22 +485,28 @@ QIcon icon(Type const type, QStyle const* const style) auto const name = QString::fromUtf8(std::data(key), std::size(key)); if (auto icon = QIcon::fromTheme(name); !icon.isNull()) + { return icon; + } if (auto icon = QIcon::fromTheme(name + QStringLiteral("-symbolic")); !icon.isNull()) + { return icon; + } } if (info.fallback) + { return style->standardIcon(*info.fallback); + } return {}; } [[nodiscard]] bool shouldBeShownInMenu(Type type) { - static bool const force_icons = !qgetenv("TR_SHOW_MENU_ICONS").isEmpty(); - static bool const is_gnome = qgetenv("XDG_CURRENT_DESKTOP").contains("GNOME"); - return force_icons || !is_gnome || getInfo(type).ok_in_gnome_menus; + static bool const ForceIcons = !qgetenv("TR_SHOW_MENU_ICONS").isEmpty(); + static bool const IsGnome = qgetenv("XDG_CURRENT_DESKTOP").contains("GNOME"); + return ForceIcons || !IsGnome || getInfo(type).ok_in_gnome_menus; } } // namespace icons diff --git a/qt/RpcClient.cc b/qt/RpcClient.cc index 5ba6d6ef7..21d7b4ba1 100644 --- a/qt/RpcClient.cc +++ b/qt/RpcClient.cc @@ -25,9 +25,7 @@ #include "VariantHelpers.h" -using ::trqt::variant_helpers::dictAdd; using ::trqt::variant_helpers::dictFind; -using ::trqt::variant_helpers::variantInit; namespace api_compat = libtransmission::api_compat; namespace @@ -70,7 +68,6 @@ void RpcClient::stop() session_ = nullptr; session_id_.clear(); url_.clear(); - request_.reset(); network_style_ = DefaultNetworkStyle; if (nam_ != nullptr) @@ -89,7 +86,6 @@ void RpcClient::start(QUrl const& url) { url_ = url; url_is_loopback_ = QHostAddress{ url_.host() }.isLoopback(); - request_.reset(); } RpcResponseFuture RpcClient::exec(tr_quark const method, tr_variant* args) @@ -119,41 +115,36 @@ RpcResponseFuture RpcClient::exec(tr_quark const method, tr_variant* args) void RpcClient::sendNetworkRequest(QByteArray const& body, QFutureInterface const& promise) { - if (!request_) + auto req = QNetworkRequest{}; + QNetworkRequest request; + request.setUrl(url_); + request.setRawHeader("User-Agent", "Transmisson/" SHORT_VERSION_STRING); + if (!session_id_.isEmpty()) { - QNetworkRequest request; - request.setUrl(url_); - request.setRawHeader( - "User-Agent", - (QApplication::applicationName() + QLatin1Char('/') + QString::fromUtf8(LONG_VERSION_STRING)).toUtf8()); - request.setRawHeader("Content-Type", "application/json; charset=UTF-8"); - if (!session_id_.isEmpty()) - { - request.setRawHeader(TR_RPC_SESSION_ID_HEADER, session_id_.toUtf8()); - } - - request_ = request; + request.setRawHeader(TR_RPC_SESSION_ID_HEADER, session_id_); } - QNetworkReply* reply = networkAccessManager()->post(*request_, body); - reply->setProperty(RequestBodyKey, body); - reply->setProperty(RequestFutureinterfacePropertyKey, QVariant::fromValue(promise)); - - connect(reply, &QNetworkReply::downloadProgress, this, &RpcClient::dataReadProgress); - connect(reply, &QNetworkReply::uploadProgress, this, &RpcClient::dataSendProgress); - if (verbose_) { qInfo() << "sending POST " << qPrintable(url_.path()); - for (QByteArray const& b : request_->rawHeaderList()) + for (QByteArray const& name : req.rawHeaderList()) { - qInfo() << b.constData() << ": " << request_->rawHeader(b).constData(); + qInfo() << name.constData() << ": " << req.rawHeader(name).constData(); } qInfo() << "Body:"; qInfo() << body.constData(); } + + if (QNetworkReply* reply = networkAccessManager()->post(req, body)) + { + reply->setProperty(RequestBodyKey, body); + reply->setProperty(RequestFutureinterfacePropertyKey, QVariant::fromValue(promise)); + + connect(reply, &QNetworkReply::downloadProgress, this, &RpcClient::dataReadProgress); + connect(reply, &QNetworkReply::uploadProgress, this, &RpcClient::dataSendProgress); + } } void RpcClient::sendLocalRequest(tr_variant const& req, QFutureInterface const& promise, int64_t const id) @@ -252,9 +243,7 @@ void RpcClient::networkRequestFinished(QNetworkReply* reply) static_cast(network_style_)); } - session_id_ = QString::fromUtf8(reply->rawHeader(TR_RPC_SESSION_ID_HEADER)); - request_.reset(); - + session_id_ = reply->rawHeader(TR_RPC_SESSION_ID_HEADER); sendNetworkRequest(reply->property(RequestBodyKey).toByteArray(), promise); return; } diff --git a/qt/RpcClient.h b/qt/RpcClient.h index 7f2a72786..758869eba 100644 --- a/qt/RpcClient.h +++ b/qt/RpcClient.h @@ -96,11 +96,9 @@ private: // TODO: change this default in 5.0.0-beta.1 static auto constexpr DefaultNetworkStyle = libtransmission::api_compat::Style::Tr4; - std::optional request_; - libtransmission::api_compat::Style network_style_ = DefaultNetworkStyle; tr_session* session_ = {}; - QString session_id_; + QByteArray session_id_; QUrl url_; QNetworkAccessManager* nam_ = {}; std::unordered_map> local_requests_; diff --git a/qt/VariantHelpers.cc b/qt/VariantHelpers.cc index f738a37e3..e71ee7d8b 100644 --- a/qt/VariantHelpers.cc +++ b/qt/VariantHelpers.cc @@ -233,7 +233,7 @@ void variantInit(tr_variant* init_me, std::string_view value) namespace { -bool to_int(tr_variant const& src, int* tgt) +bool toInt(tr_variant const& src, int* tgt) { if (auto const val = src.value_if()) { @@ -249,7 +249,7 @@ bool to_int(tr_variant const& src, int* tgt) return false; } -tr_variant from_int(int const& val) +tr_variant fromInt(int const& val) { return static_cast(val); } @@ -263,7 +263,7 @@ void register_qt_converters() [] { using namespace libtransmission::serializer; - Converters::add(to_int, from_int); + Converters::add(toInt, fromInt); }); }