summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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