From 9034db2caa91a686fb8e783b13f3ad5723285bc8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pasi=20Pet=C3=A4j=C3=A4j=C3=A4rvi?= Date: Wed, 22 Aug 2018 15:30:28 +0300 Subject: Fix connman connection initialization after it is available Currently if connman service is not up and running, we never try again to initialize connection to it and request network information. * Requires at least d-bus daemon to be running Change-Id: I70b0358ee255174edce8d578517e9df091206ceb Reviewed-by: Teemu Holappa --- .../connman/qnetworksettingsmanager_p.cpp | 38 ++++++++++++++++++++-- .../connman/qnetworksettingsmanager_p.h | 4 +++ 2 files changed, 39 insertions(+), 3 deletions(-) (limited to 'src/networksettings') diff --git a/src/networksettings/connman/qnetworksettingsmanager_p.cpp b/src/networksettings/connman/qnetworksettingsmanager_p.cpp index ea9e682..ff792d9 100644 --- a/src/networksettings/connman/qnetworksettingsmanager_p.cpp +++ b/src/networksettings/connman/qnetworksettingsmanager_p.cpp @@ -36,6 +36,8 @@ QT_BEGIN_NAMESPACE +const QString ConnManServiceName(QStringLiteral("net.connman")); + QNetworkSettingsManagerPrivate::QNetworkSettingsManagerPrivate(QNetworkSettingsManager *parent) :QObject(parent) ,q_ptr(parent) @@ -44,7 +46,9 @@ QNetworkSettingsManagerPrivate::QNetworkSettingsManagerPrivate(QNetworkSettingsM , m_serviceFilter(Q_NULLPTR) , m_manager(Q_NULLPTR) , m_agent(Q_NULLPTR) + , m_serviceWatcher(Q_NULLPTR) , m_currentWifiConnection(Q_NULLPTR) + , m_initialized(false) { qDBusRegisterMetaType(); qDBusRegisterMetaType(); @@ -55,7 +59,25 @@ QNetworkSettingsManagerPrivate::QNetworkSettingsManagerPrivate(QNetworkSettingsM m_serviceModel = new QNetworkSettingsServiceModel(this); m_serviceFilter = new QNetworkSettingsServiceFilter(this); m_serviceFilter->setSourceModel(m_serviceModel); - m_manager = new NetConnmanManagerInterface(QStringLiteral("net.connman"), QStringLiteral("/"), + + QDBusConnectionInterface* bus = QDBusConnection::systemBus().interface(); + if (bus->isServiceRegistered(ConnManServiceName)) { + if (!initialize()) + qWarning("Failed to initialize connman connection"); + } else { + m_serviceWatcher = new QDBusServiceWatcher(this); + m_serviceWatcher->setConnection(QDBusConnection::systemBus()); + m_serviceWatcher->setWatchedServices(QStringList({ConnManServiceName})); + connect(m_serviceWatcher, &QDBusServiceWatcher::serviceRegistered, this, &QNetworkSettingsManagerPrivate::onConnmanServiceRegistered); + } +} + +bool QNetworkSettingsManagerPrivate::initialize() +{ + if (m_initialized && m_manager) + return m_initialized; + + m_manager = new NetConnmanManagerInterface(ConnManServiceName, QStringLiteral("/"), QDBusConnection::systemBus(), this); if (m_manager->isValid()) { @@ -73,11 +95,13 @@ QNetworkSettingsManagerPrivate::QNetworkSettingsManagerPrivate(QNetworkSettingsM connect(m_manager, &NetConnmanManagerInterface::ServicesChanged, this, &QNetworkSettingsManagerPrivate::onServicesChanged); m_manager->RegisterAgent(QDBusObjectPath(AgentPath)); - } - else { + m_initialized = true; + } else { delete m_manager; m_manager = NULL; + m_initialized = false; } + return m_initialized; } void QNetworkSettingsManagerPrivate::requestInput(const QString& service, const QString& type) @@ -121,6 +145,14 @@ void QNetworkSettingsManagerPrivate::tryNextConnection() } } +void QNetworkSettingsManagerPrivate::onConnmanServiceRegistered(const QString &serviceName) +{ + if (serviceName == ConnManServiceName) { + if (!initialize()) + qWarning("Failed to initialize connman connection"); + } +} + void QNetworkSettingsManagerPrivate::getServicesFinished(QDBusPendingCallWatcher *watcher) { Q_Q(QNetworkSettingsManager); diff --git a/src/networksettings/connman/qnetworksettingsmanager_p.h b/src/networksettings/connman/qnetworksettingsmanager_p.h index cfc2e64..d2146a9 100644 --- a/src/networksettings/connman/qnetworksettingsmanager_p.h +++ b/src/networksettings/connman/qnetworksettingsmanager_p.h @@ -79,7 +79,9 @@ public slots: void requestInput(const QString& service, const QString& type); void onServicesChanged(ConnmanMapStructList changed, const QList &removed); void serviceReady(); + void onConnmanServiceRegistered(const QString &serviceName); private: + bool initialize(); void handleNewService(const QString& servicePath); protected: QNetworkSettingsInterfaceModel m_interfaceModel; @@ -90,8 +92,10 @@ protected: private: NetConnmanManagerInterface *m_manager; QNetworkSettingsUserAgent *m_agent; + QDBusServiceWatcher *m_serviceWatcher; QString m_currentSsid; QNetworkSettingsService *m_currentWifiConnection; + bool m_initialized; }; QT_END_NAMESPACE -- cgit v1.2.3