summaryrefslogtreecommitdiffstats
path: root/src/networksettings
diff options
context:
space:
mode:
authorPasi Petäjäjärvi <pasi.petajajarvi@qt.io>2018-08-22 15:30:28 +0300
committerPasi Petäjäjärvi <pasi.petajajarvi@qt.io>2018-08-24 07:24:46 +0000
commit9034db2caa91a686fb8e783b13f3ad5723285bc8 (patch)
treee266dbc3a983aad25d4ac712c5a4831e1612c28b /src/networksettings
parent1dabfa51cb834efd85ccb60e70e2ce3558b4deaf (diff)
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 <teemu.holappa@qt.io>
Diffstat (limited to 'src/networksettings')
-rw-r--r--src/networksettings/connman/qnetworksettingsmanager_p.cpp38
-rw-r--r--src/networksettings/connman/qnetworksettingsmanager_p.h4
2 files changed, 39 insertions, 3 deletions
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<ConnmanMapStruct>();
qDBusRegisterMetaType<ConnmanMapStructList>();
@@ -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<QDBusObjectPath> &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