diff options
Diffstat (limited to 'src/network/kernel/qnetconmonitor_win.cpp')
-rw-r--r-- | src/network/kernel/qnetconmonitor_win.cpp | 43 |
1 files changed, 34 insertions, 9 deletions
diff --git a/src/network/kernel/qnetconmonitor_win.cpp b/src/network/kernel/qnetconmonitor_win.cpp index b8cf23529a..da38bf695c 100644 --- a/src/network/kernel/qnetconmonitor_win.cpp +++ b/src/network/kernel/qnetconmonitor_win.cpp @@ -512,7 +512,6 @@ public: Q_REQUIRED_RESULT bool start(); - Q_REQUIRED_RESULT bool stop(); private: @@ -659,8 +658,6 @@ QNetworkStatusMonitorPrivate::~QNetworkStatusMonitorPrivate() return; if (monitoring) stop(); - managerEvents.Reset(); - CoUninitialize(); } void QNetworkStatusMonitorPrivate::setConnectivity(NLM_CONNECTIVITY newConnectivity) @@ -676,10 +673,20 @@ void QNetworkStatusMonitorPrivate::setConnectivity(NLM_CONNECTIVITY newConnectiv bool QNetworkStatusMonitorPrivate::start() { - if (comInitFailed) - return false; - Q_ASSERT(managerEvents); Q_ASSERT(!monitoring); + + if (comInitFailed) { + auto hr = CoInitialize(nullptr); + if (FAILED(hr)) { + qCWarning(lcNetMon) << "Failed to initialize COM:" << errorStringFromHResult(hr); + comInitFailed = true; + return false; + } + comInitFailed = false; + } + if (!managerEvents) + managerEvents = new QNetworkListManagerEvents(this); + if (managerEvents->start()) monitoring = true; return monitoring; @@ -689,11 +696,19 @@ void QNetworkStatusMonitorPrivate::stop() { Q_ASSERT(managerEvents); Q_ASSERT(monitoring); - if (managerEvents->stop()) - monitoring = false; + // Can return false but realistically shouldn't since that would break everything: + managerEvents->stop(); + monitoring = false; + managerEvents.Reset(); + + CoUninitialize(); + comInitFailed = true; // we check this value in start() to see if we need to re-initialize } -QNetworkStatusMonitor::QNetworkStatusMonitor() : QObject(*new QNetworkStatusMonitorPrivate) {} +QNetworkStatusMonitor::QNetworkStatusMonitor(QObject *parent) + : QObject(*new QNetworkStatusMonitorPrivate, parent) +{ +} QNetworkStatusMonitor::~QNetworkStatusMonitor() {} @@ -730,6 +745,16 @@ bool QNetworkStatusMonitor::isNetworkAccessible() | NLM_CONNECTIVITY_IPV4_LOCALNETWORK | NLM_CONNECTIVITY_IPV6_LOCALNETWORK); } +bool QNetworkStatusMonitor::event(QEvent *event) +{ + if (event->type() == QEvent::ThreadChange && isMonitoring()) { + stop(); + QMetaObject::invokeMethod(this, &QNetworkStatusMonitor::start, Qt::QueuedConnection); + } + + return QObject::event(event); +} + bool QNetworkStatusMonitor::isEnabled() { return true; |