From f44e04b14ce55d813481fe58714a0d8eb33ff772 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A5rten=20Nordheim?= Date: Mon, 25 Sep 2023 11:50:39 +0200 Subject: [PATCH] QNetworkInfo[NetworkManager]: Avoid creating temporary QStrings Previously we had some inline c-string literals. But since the parameter for those is const-ref QString it has to actually allocate the storage and convert the string to UTF-16. By putting it as a function that returns a QString constructed with u""_s, we instead create a cheap non-owning QString that just refers to the string somewhere in memory. As a drive-by: move other string-literals into functions as well. Change-Id: I2f2ca5b979cfa772665fa83689837f991b0c656d Reviewed-by: Marc Mutz --- .../networkmanager/qnetworkmanagerservice.cpp | 41 ++++++++++++++----- 1 file changed, 31 insertions(+), 10 deletions(-) diff --git a/src/plugins/networkinformation/networkmanager/qnetworkmanagerservice.cpp b/src/plugins/networkinformation/networkmanager/qnetworkmanagerservice.cpp index c3b9d3b452..da540dbecc 100644 --- a/src/plugins/networkinformation/networkmanager/qnetworkmanagerservice.cpp +++ b/src/plugins/networkinformation/networkmanager/qnetworkmanagerservice.cpp @@ -27,6 +27,25 @@ QT_BEGIN_NAMESPACE using namespace Qt::StringLiterals; +namespace { +constexpr QLatin1StringView propertiesChangedKey = "PropertiesChanged"_L1; +const QString &stateKey() +{ + static auto key = u"State"_s; + return key; +} +const QString &connectivityKey() +{ + static auto key = u"Connectivity"_s; + return key; +} +const QString &primaryConnectionKey() +{ + static auto key = u"PrimaryConnection"_s; + return key; +} +} + QNetworkManagerInterfaceBase::QNetworkManagerInterfaceBase(QObject *parent) : QDBusAbstractInterface(NM_DBUS_SERVICE, NM_DBUS_PATH, NM_DBUS_INTERFACE, QDBusConnection::systemBus(), parent) @@ -60,28 +79,30 @@ QNetworkManagerInterface::QNetworkManagerInterface(QObject *parent) propertyMap = propsReply.value(); validDBusConnection = QDBusConnection::systemBus().connect(NM_DBUS_SERVICE, NM_DBUS_PATH, - DBUS_PROPERTIES_INTERFACE, "PropertiesChanged"_L1, this, + DBUS_PROPERTIES_INTERFACE, propertiesChangedKey, this, SLOT(setProperties(QString,QMap,QList))); } QNetworkManagerInterface::~QNetworkManagerInterface() { QDBusConnection::systemBus().disconnect(NM_DBUS_SERVICE, NM_DBUS_PATH, - DBUS_PROPERTIES_INTERFACE, "PropertiesChanged"_L1, this, + DBUS_PROPERTIES_INTERFACE, propertiesChangedKey, this, SLOT(setProperties(QString,QMap,QList))); } QNetworkManagerInterface::NMState QNetworkManagerInterface::state() const { - if (propertyMap.contains("State")) - return static_cast(propertyMap.value("State").toUInt()); + if (propertyMap.contains(stateKey())) { + return static_cast(propertyMap.value(stateKey()) + .toUInt()); + } return QNetworkManagerInterface::NM_STATE_UNKNOWN; } QNetworkManagerInterface::NMConnectivityState QNetworkManagerInterface::connectivityState() const { - if (propertyMap.contains("Connectivity")) - return static_cast(propertyMap.value("Connectivity").toUInt()); + if (propertyMap.contains(connectivityKey())) + return static_cast(propertyMap.value(connectivityKey()).toUInt()); return QNetworkManagerInterface::NM_CONNECTIVITY_UNKNOWN; } @@ -104,7 +125,7 @@ static std::optional getPrimaryDevice(const QDBusObjectPath &dev std::optional QNetworkManagerInterface::primaryConnectionDevicePath() const { - auto it = propertyMap.constFind(u"PrimaryConnection"_s); + auto it = propertyMap.constFind(primaryConnectionKey()); if (it != propertyMap.cend()) return it->value(); return std::nullopt; @@ -171,13 +192,13 @@ void QNetworkManagerInterface::setProperties(const QString &interfaceName, } if (valueChanged) { - if (i.key() == "State"_L1) { + if (i.key() == stateKey()) { quint32 state = i.value().toUInt(); Q_EMIT stateChanged(static_cast(state)); - } else if (i.key() == "Connectivity"_L1) { + } else if (i.key() == connectivityKey()) { quint32 state = i.value().toUInt(); Q_EMIT connectivityChanged(static_cast(state)); - } else if (i.key() == "PrimaryConnection"_L1) { + } else if (i.key() == primaryConnectionKey()) { const QDBusObjectPath devicePath = i->value(); Q_EMIT deviceTypeChanged(extractDeviceType(devicePath)); Q_EMIT meteredChanged(extractDeviceMetered(devicePath));