// Copyright (C) 2021 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only #include #include #include #include #include #include #include #include #include #include #if QT_CONFIG(cpp_winrt) && !defined(Q_CC_CLANG) #define SUPPORTS_WINRT 1 #endif #ifdef SUPPORTS_WINRT #include #include #endif using namespace Microsoft::WRL; QT_BEGIN_NAMESPACE Q_DECLARE_LOGGING_CATEGORY(lcNetInfoNLM) inline QString errorStringFromHResult(HRESULT hr) { _com_error error(hr); return QString::fromWCharArray(error.ErrorMessage()); } class QNetworkListManagerEvents : public QObject, public INetworkListManagerEvents { Q_OBJECT public: QNetworkListManagerEvents(); virtual ~QNetworkListManagerEvents(); HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObject) override; ULONG STDMETHODCALLTYPE AddRef() override { return ++ref; } ULONG STDMETHODCALLTYPE Release() override { if (--ref == 0) { delete this; return 0; } return ref; } HRESULT STDMETHODCALLTYPE ConnectivityChanged(NLM_CONNECTIVITY newConnectivity) override; [[nodiscard]] bool start(); bool stop(); [[nodiscard]] bool checkBehindCaptivePortal(); signals: void connectivityChanged(NLM_CONNECTIVITY); void transportMediumChanged(QNetworkInformation::TransportMedium); void isMeteredChanged(bool); private: ComPtr networkListManager = nullptr; ComPtr connectionPoint = nullptr; #ifdef SUPPORTS_WINRT void emitWinRTUpdates(); winrt::event_token token; #endif QAtomicInteger ref = 0; DWORD cookie = 0; }; QT_END_NAMESPACE