summaryrefslogtreecommitdiffstats
path: root/src/network/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'src/network/kernel')
-rw-r--r--src/network/kernel/qnetconmonitor_darwin.mm9
-rw-r--r--src/network/kernel/qnetconmonitor_p.h4
-rw-r--r--src/network/kernel/qnetconmonitor_stub.cpp9
-rw-r--r--src/network/kernel/qnetconmonitor_win.cpp43
4 files changed, 51 insertions, 14 deletions
diff --git a/src/network/kernel/qnetconmonitor_darwin.mm b/src/network/kernel/qnetconmonitor_darwin.mm
index f6daf9ed50..9c0c4a55f4 100644
--- a/src/network/kernel/qnetconmonitor_darwin.mm
+++ b/src/network/kernel/qnetconmonitor_darwin.mm
@@ -310,8 +310,8 @@ public:
bool isOnlineIpv6 = false;
};
-QNetworkStatusMonitor::QNetworkStatusMonitor()
- : QObject(*new QNetworkStatusMonitorPrivate)
+QNetworkStatusMonitor::QNetworkStatusMonitor(QObject *parent)
+ : QObject(*new QNetworkStatusMonitorPrivate, parent)
{
Q_D(QNetworkStatusMonitor);
@@ -385,6 +385,11 @@ bool QNetworkStatusMonitor::isNetworkAccessible()
return d->isOnlineIpv4 || d->isOnlineIpv6;
}
+bool QNetworkStatusMonitor::event(QEvent *event)
+{
+ return QObject::event(event);
+}
+
bool QNetworkStatusMonitor::isEnabled()
{
return true;
diff --git a/src/network/kernel/qnetconmonitor_p.h b/src/network/kernel/qnetconmonitor_p.h
index 282bac5081..30e3fa16ea 100644
--- a/src/network/kernel/qnetconmonitor_p.h
+++ b/src/network/kernel/qnetconmonitor_p.h
@@ -96,7 +96,7 @@ class Q_AUTOTEST_EXPORT QNetworkStatusMonitor : public QObject
Q_OBJECT
public:
- QNetworkStatusMonitor();
+ QNetworkStatusMonitor(QObject *parent);
~QNetworkStatusMonitor();
bool isNetworkAccessible();
@@ -105,6 +105,8 @@ public:
void stop();
bool isMonitoring() const;
+ bool event(QEvent *event) override;
+
static bool isEnabled();
Q_SIGNALS:
diff --git a/src/network/kernel/qnetconmonitor_stub.cpp b/src/network/kernel/qnetconmonitor_stub.cpp
index 1ad4e9ba5a..a8ff861739 100644
--- a/src/network/kernel/qnetconmonitor_stub.cpp
+++ b/src/network/kernel/qnetconmonitor_stub.cpp
@@ -100,8 +100,8 @@ class QNetworkStatusMonitorPrivate : public QObjectPrivate
{
};
-QNetworkStatusMonitor::QNetworkStatusMonitor()
- : QObject(*new QNetworkStatusMonitorPrivate)
+QNetworkStatusMonitor::QNetworkStatusMonitor(QObject *parent)
+ : QObject(*new QNetworkStatusMonitorPrivate, parent)
{
}
@@ -128,6 +128,11 @@ bool QNetworkStatusMonitor::isNetworkAccessible()
return false;
}
+bool QNetworkStatusMonitor::event(QEvent *event)
+{
+ return QObject::event(event);
+}
+
bool QNetworkStatusMonitor::isEnabled()
{
return false;
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;