From bfe579613a12efe13be35b1a52975dddeb0d8026 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A5rten=20Nordheim?= Date: Thu, 21 Oct 2021 13:07:33 +0200 Subject: QNI: Add a convenience method for loading the default plugin We have some official plugins, we may as well treat them as default and give a convenient function which loads those. Change-Id: I6251c77ac042b795bcf24b86e510e960ee4bab54 Reviewed-by: Qt CI Bot Reviewed-by: Timur Pocheptsov --- src/network/kernel/qnetworkinformation.cpp | 55 +++++++++++++++++++++- src/network/kernel/qnetworkinformation.h | 1 + src/network/kernel/qnetworkinformation_p.h | 11 +++++ .../android/qandroidnetworkinformationbackend.cpp | 9 ++-- ...networklistmanagernetworkinformationbackend.cpp | 10 ++-- .../qnetworkmanagernetworkinformationbackend.cpp | 10 ++-- ...networkreachabilitynetworkinformationbackend.mm | 11 +++-- .../tst_qnetworkinformation.cpp | 5 +- 8 files changed, 94 insertions(+), 18 deletions(-) diff --git a/src/network/kernel/qnetworkinformation.cpp b/src/network/kernel/qnetworkinformation.cpp index 79375dee81..4f0b1405ef 100644 --- a/src/network/kernel/qnetworkinformation.cpp +++ b/src/network/kernel/qnetworkinformation.cpp @@ -603,12 +603,63 @@ QNetworkInformation::Features QNetworkInformation::supportedFeatures() const return d_func()->backend->featuresSupported(); } +/*! + \since 6.3 + + Attempts to load the platform-default backend. + + This platform-to-plugin mapping is as follows: + + \table + \header + \li Platform + \li Plugin-name + \row + \li Windows + \li networklistmanager + \row + \li Apple (macOS/iOS) + \li scnetworkreachability + \row + \li Android + \li android + \row + \li Linux + \li networkmanager + \endtable + + This function is provided for convenience where the default for a given + platform is good enough. If you are not using the default plugins you must + use one of the other load() overloads. + + Returns \c true if it managed to load the backend or if it was already + loaded. Returns \c false otherwise. + + \sa instance +*/ +bool QNetworkInformation::load() +{ + int index = -1; +#ifdef Q_OS_WIN + index = QNetworkInformationBackend::PluginNamesWindowsIndex; +#elif defined(Q_OS_DARWIN) + index = QNetworkInformationBackend::PluginNamesAppleIndex; +#elif defined(Q_OS_ANDROID) + index = QNetworkInformationBackend::PluginNamesAndroidIndex; +#elif defined(Q_OS_LINUX) + index = QNetworkInformationBackend::PluginNamesLinuxIndex; +#endif + if (index == -1) + return false; + return load(QNetworkInformationBackend::PluginNames[index]); +} + /*! Attempts to load a backend whose name matches \a backend (case insensitively). Returns \c true if it managed to load the requested backend or - if it was already loaded. Returns \c false otherwise + if it was already loaded. Returns \c false otherwise. \sa instance */ @@ -622,7 +673,7 @@ bool QNetworkInformation::load(QStringView backend) Load a backend which supports \a features. Returns \c true if it managed to load the requested backend or - if it was already loaded. Returns \c false otherwise + if it was already loaded. Returns \c false otherwise. \sa instance */ diff --git a/src/network/kernel/qnetworkinformation.h b/src/network/kernel/qnetworkinformation.h index febf5bbc8f..e280894fef 100644 --- a/src/network/kernel/qnetworkinformation.h +++ b/src/network/kernel/qnetworkinformation.h @@ -96,6 +96,7 @@ public: bool supports(Features features) const; Features supportedFeatures() const; + static bool load(); static bool load(QStringView backend); static bool load(Features features); static QStringList availableBackends(); diff --git a/src/network/kernel/qnetworkinformation_p.h b/src/network/kernel/qnetworkinformation_p.h index ba07870be3..971340b6e3 100644 --- a/src/network/kernel/qnetworkinformation_p.h +++ b/src/network/kernel/qnetworkinformation_p.h @@ -67,6 +67,17 @@ class Q_NETWORK_EXPORT QNetworkInformationBackend : public QObject using TransportMedium = QNetworkInformation::TransportMedium; public: + static inline const char16_t PluginNames[4][22] = { + { u"networklistmanager" }, + { u"scnetworkreachability" }, + { u"android" }, + { u"networkmanager" }, + }; + static constexpr int PluginNamesWindowsIndex = 0; + static constexpr int PluginNamesAppleIndex = 1; + static constexpr int PluginNamesAndroidIndex = 2; + static constexpr int PluginNamesLinuxIndex = 3; + QNetworkInformationBackend() = default; ~QNetworkInformationBackend() override; diff --git a/src/plugins/networkinformation/android/qandroidnetworkinformationbackend.cpp b/src/plugins/networkinformation/android/qandroidnetworkinformationbackend.cpp index 14e42a9de8..8f90ea82bd 100644 --- a/src/plugins/networkinformation/android/qandroidnetworkinformationbackend.cpp +++ b/src/plugins/networkinformation/android/qandroidnetworkinformationbackend.cpp @@ -47,7 +47,10 @@ QT_BEGIN_NAMESPACE Q_DECLARE_LOGGING_CATEGORY(lcNetInfoAndroid) Q_LOGGING_CATEGORY(lcNetInfoAndroid, "qt.network.info.android"); -static const QString backendName = QStringLiteral("android"); +static QString backendName() { + return QString::fromUtf16(QNetworkInformationBackend::PluginNames + [QNetworkInformationBackend::PluginNamesAndroidIndex]); +} class QAndroidNetworkInformationBackend : public QNetworkInformationBackend { @@ -56,7 +59,7 @@ public: QAndroidNetworkInformationBackend(); ~QAndroidNetworkInformationBackend() { m_valid = false; } - QString name() const override { return backendName; } + QString name() const override { return backendName(); } QNetworkInformation::Features featuresSupported() const override { return featuresSupportedStatic(); @@ -88,7 +91,7 @@ class QAndroidNetworkInformationBackendFactory : public QNetworkInformationBacke public: QAndroidNetworkInformationBackendFactory() = default; ~QAndroidNetworkInformationBackendFactory() = default; - QString name() const override { return backendName; } + QString name() const override { return backendName(); } QNetworkInformation::Features featuresSupported() const override { return QAndroidNetworkInformationBackend::featuresSupportedStatic(); diff --git a/src/plugins/networkinformation/networklistmanager/qnetworklistmanagernetworkinformationbackend.cpp b/src/plugins/networkinformation/networklistmanager/qnetworklistmanagernetworkinformationbackend.cpp index e8b36be02e..3e6e4074bb 100644 --- a/src/plugins/networkinformation/networklistmanager/qnetworklistmanagernetworkinformationbackend.cpp +++ b/src/plugins/networkinformation/networklistmanager/qnetworklistmanagernetworkinformationbackend.cpp @@ -50,7 +50,11 @@ QT_BEGIN_NAMESPACE // Declared in qnetworklistmanagerevents.h Q_LOGGING_CATEGORY(lcNetInfoNLM, "qt.network.info.netlistmanager"); -static const QString backendName = QStringLiteral("networklistmanager"); +static QString backendName() +{ + return QString::fromUtf16(QNetworkInformationBackend::PluginNames + [QNetworkInformationBackend::PluginNamesWindowsIndex]); +} namespace { bool testCONNECTIVITY(NLM_CONNECTIVITY connectivity, NLM_CONNECTIVITY flag) @@ -90,7 +94,7 @@ public: QNetworkListManagerNetworkInformationBackend(); ~QNetworkListManagerNetworkInformationBackend(); - QString name() const override { return backendName; } + QString name() const override { return backendName(); } QNetworkInformation::Features featuresSupported() const override { return featuresSupportedStatic(); @@ -130,7 +134,7 @@ class QNetworkListManagerNetworkInformationBackendFactory : public QNetworkInfor public: QNetworkListManagerNetworkInformationBackendFactory() = default; ~QNetworkListManagerNetworkInformationBackendFactory() = default; - QString name() const override { return backendName; } + QString name() const override { return backendName(); } QNetworkInformation::Features featuresSupported() const override { return QNetworkListManagerNetworkInformationBackend::featuresSupportedStatic(); diff --git a/src/plugins/networkinformation/networkmanager/qnetworkmanagernetworkinformationbackend.cpp b/src/plugins/networkinformation/networkmanager/qnetworkmanagernetworkinformationbackend.cpp index ad61b6baea..5e2f4b61e6 100644 --- a/src/plugins/networkinformation/networkmanager/qnetworkmanagernetworkinformationbackend.cpp +++ b/src/plugins/networkinformation/networkmanager/qnetworkmanagernetworkinformationbackend.cpp @@ -120,7 +120,11 @@ transportMediumFromDeviceType(QNetworkManagerInterface::NMDeviceType type) } } -static QString backendName = QStringLiteral("networkmanager"); +static QString backendName() +{ + return QString::fromUtf16(QNetworkInformationBackend::PluginNames + [QNetworkInformationBackend::PluginNamesLinuxIndex]); +} class QNetworkManagerNetworkInformationBackend : public QNetworkInformationBackend { @@ -129,7 +133,7 @@ public: QNetworkManagerNetworkInformationBackend(); ~QNetworkManagerNetworkInformationBackend() = default; - QString name() const override { return backendName; } + QString name() const override { return backendName(); } QNetworkInformation::Features featuresSupported() const override { if (!isValid()) @@ -160,7 +164,7 @@ class QNetworkManagerNetworkInformationBackendFactory : public QNetworkInformati public: QNetworkManagerNetworkInformationBackendFactory() = default; ~QNetworkManagerNetworkInformationBackendFactory() = default; - QString name() const override { return backendName; } + QString name() const override { return backendName(); } QNetworkInformation::Features featuresSupported() const override { if (!QNetworkManagerInterfaceBase::networkManagerAvailable()) diff --git a/src/plugins/networkinformation/scnetworkreachability/qscnetworkreachabilitynetworkinformationbackend.mm b/src/plugins/networkinformation/scnetworkreachability/qscnetworkreachabilitynetworkinformationbackend.mm index c732afc012..1da671e549 100644 --- a/src/plugins/networkinformation/scnetworkreachability/qscnetworkreachabilitynetworkinformationbackend.mm +++ b/src/plugins/networkinformation/scnetworkreachability/qscnetworkreachabilitynetworkinformationbackend.mm @@ -48,8 +48,11 @@ QT_BEGIN_NAMESPACE Q_DECLARE_LOGGING_CATEGORY(lcNetInfoSCR) Q_LOGGING_CATEGORY(lcNetInfoSCR, "qt.network.info.scnetworkreachability"); - -static QString backendName = QStringLiteral("scnetworkreachability"); +static QString backendName() +{ + return QString::fromUtf16(QNetworkInformationBackend::PluginNames + [QNetworkInformationBackend::PluginNamesAppleIndex]); +} class QSCNetworkReachabilityNetworkInformationBackend : public QNetworkInformationBackend { @@ -58,7 +61,7 @@ public: QSCNetworkReachabilityNetworkInformationBackend(); ~QSCNetworkReachabilityNetworkInformationBackend(); - QString name() const override { return backendName; } + QString name() const override { return backendName(); } QNetworkInformation::Features featuresSupported() const override { return featuresSupportedStatic(); @@ -87,7 +90,7 @@ class QSCNetworkReachabilityNetworkInformationBackendFactory : public QNetworkIn public: QSCNetworkReachabilityNetworkInformationBackendFactory() = default; ~QSCNetworkReachabilityNetworkInformationBackendFactory() = default; - QString name() const override { return backendName; } + QString name() const override { return backendName(); } QNetworkInformation::Features featuresSupported() const override { return QSCNetworkReachabilityNetworkInformationBackend::featuresSupportedStatic(); diff --git a/tests/manual/qnetworkinformation/tst_qnetworkinformation.cpp b/tests/manual/qnetworkinformation/tst_qnetworkinformation.cpp index e38ff7494f..8cac940874 100644 --- a/tests/manual/qnetworkinformation/tst_qnetworkinformation.cpp +++ b/tests/manual/qnetworkinformation/tst_qnetworkinformation.cpp @@ -46,9 +46,8 @@ int main(int argc, char **argv) QCoreApplication app(argc, argv); #endif - if (!QNetworkInformation::load(QNetworkInformation::Feature::Reachability - | QNetworkInformation::Feature::CaptivePortal - | QNetworkInformation::Feature::TransportMedium)) { + // Use the platform-default: + if (!QNetworkInformation::load()) { qWarning("Failed to load any backend"); qDebug() << "Backends available:" << QNetworkInformation::availableBackends().join(", "); return -1; -- cgit v1.2.3