summaryrefslogtreecommitdiffstats
path: root/src/networksettings/connman
diff options
context:
space:
mode:
authorPasi Petäjäjärvi <pasi.petajajarvi@qt.io>2018-08-30 14:55:54 +0300
committerPasi Petäjäjärvi <pasi.petajajarvi@qt.io>2018-10-25 06:21:43 +0000
commit5d4ba35bc917bc5a48b60da5a4c2cbd03ff4bbf4 (patch)
treefe4ff27ddb78f7443a03cc4c7a4c087045d4073a /src/networksettings/connman
parent9ad08f17c3cd96bb6b9d5d501870cb3987ed9097 (diff)
Add support for dynamically add/remove physical network interfaces
Change-Id: I1690ce5f4b71c1faf14002a9389ca7b5f2b5665d Reviewed-by: Teemu Holappa <teemu.holappa@qt.io>
Diffstat (limited to 'src/networksettings/connman')
-rw-r--r--src/networksettings/connman/connman_manager.xml6
-rw-r--r--src/networksettings/connman/qnetworksettingsinterface_p.cpp5
-rw-r--r--src/networksettings/connman/qnetworksettingsinterface_p.h7
-rw-r--r--src/networksettings/connman/qnetworksettingsmanager_p.cpp36
-rw-r--r--src/networksettings/connman/qnetworksettingsmanager_p.h2
5 files changed, 53 insertions, 3 deletions
diff --git a/src/networksettings/connman/connman_manager.xml b/src/networksettings/connman/connman_manager.xml
index 1c9e552..95bc0cb 100644
--- a/src/networksettings/connman/connman_manager.xml
+++ b/src/networksettings/connman/connman_manager.xml
@@ -77,13 +77,13 @@
<arg name="path" type="o"/>
</method>
- <signal name="NetworkTypeAdded" tp:name-for-bindings="NetworkType_Added">
+ <signal name="TechnologyAdded" tp:name-for-bindings="Technology_Added">
<arg name="technology" type="o"/>
<arg name="properties" type="a{sv}"/>
- <annotation name="org.qtproject.QtDBus.QtTypeName.Out1" value="QVariantMap"/>
+ <annotation name="org.qtproject.QtDBus.QtTypeName.In1" value="QVariantMap"/>
</signal>
- <signal name="NetworkTypeRemoved" tp:name-for-bindings="NetworkType_Removed">
+ <signal name="TechnologyRemoved" tp:name-for-bindings="Technology_Removed">
<arg name="technology" type="o"/>
</signal>
diff --git a/src/networksettings/connman/qnetworksettingsinterface_p.cpp b/src/networksettings/connman/qnetworksettingsinterface_p.cpp
index 5a64c15..5f008ff 100644
--- a/src/networksettings/connman/qnetworksettingsinterface_p.cpp
+++ b/src/networksettings/connman/qnetworksettingsinterface_p.cpp
@@ -103,4 +103,9 @@ void QNetworkSettingsInterfacePrivate::scan()
qDebug() << "Tried to scan while not powered";
}
+QString QNetworkSettingsInterfacePrivate::path() const
+{
+ return m_technology->path();
+}
+
QT_END_NAMESPACE
diff --git a/src/networksettings/connman/qnetworksettingsinterface_p.h b/src/networksettings/connman/qnetworksettingsinterface_p.h
index 728e64a..d85712a 100644
--- a/src/networksettings/connman/qnetworksettingsinterface_p.h
+++ b/src/networksettings/connman/qnetworksettingsinterface_p.h
@@ -63,6 +63,7 @@ public:
QNetworkSettingsType::Types type() const {return m_type.type();}
QNetworkSettingsState::States state() const {return m_state.state();}
bool powered() const {return m_powered;}
+ QString path() const;
public slots:
void updateProperty(const QString &name, const QDBusVariant &value);
@@ -98,6 +99,12 @@ public:
virtual ~ConnmanSettingsInterface() {
}
+
+ QString path() const {
+ if (d_ptr)
+ return d_ptr->path();
+ return QString();
+ }
};
QT_END_NAMESPACE
diff --git a/src/networksettings/connman/qnetworksettingsmanager_p.cpp b/src/networksettings/connman/qnetworksettingsmanager_p.cpp
index bd656c6..2f7965d 100644
--- a/src/networksettings/connman/qnetworksettingsmanager_p.cpp
+++ b/src/networksettings/connman/qnetworksettingsmanager_p.cpp
@@ -94,6 +94,8 @@ bool QNetworkSettingsManagerPrivate::initialize()
this, &QNetworkSettingsManagerPrivate::getServicesFinished);
connect(m_manager, &NetConnmanManagerInterface::ServicesChanged, this, &QNetworkSettingsManagerPrivate::onServicesChanged);
+ connect(m_manager, &NetConnmanManagerInterface::TechnologyAdded, this, &QNetworkSettingsManagerPrivate::onTechnologyAdded);
+ connect(m_manager, &NetConnmanManagerInterface::TechnologyRemoved, this, &QNetworkSettingsManagerPrivate::onTechnologyRemoved);
m_manager->RegisterAgent(QDBusObjectPath(AgentPath));
m_initialized = true;
@@ -154,6 +156,40 @@ void QNetworkSettingsManagerPrivate::onConnmanServiceRegistered(const QString &s
}
}
+void QNetworkSettingsManagerPrivate::onTechnologyAdded(const QDBusObjectPath &technology, const QVariantMap &properties)
+{
+ Q_Q(QNetworkSettingsManager);
+
+ foreach (QNetworkSettingsInterface* item, m_interfaceModel.getModel()) {
+ ConnmanSettingsInterface* tech = qobject_cast<ConnmanSettingsInterface*>(item);
+ if (tech->path() != technology.path()) {
+ ConnmanSettingsInterface *interface = new ConnmanSettingsInterface(technology.path(), properties, this);
+ interface->scanServices();
+
+ if (interface->type() == QNetworkSettingsType::Wired) {
+ m_interfaceModel.insert(0, interface);
+ }
+ else if (interface->type() == QNetworkSettingsType::Wifi) {
+ m_interfaceModel.append(interface);
+ }
+ emit q->interfacesChanged();
+ }
+ }
+}
+
+void QNetworkSettingsManagerPrivate::onTechnologyRemoved(const QDBusObjectPath &technology)
+{
+ Q_Q(QNetworkSettingsManager);
+
+ foreach (QNetworkSettingsInterface* item, m_interfaceModel.getModel()) {
+ ConnmanSettingsInterface* tech = qobject_cast<ConnmanSettingsInterface*>(item);
+ if (tech->path() == technology.path()) {
+ m_interfaceModel.removeInterface(technology.path());
+ emit q->interfacesChanged();
+ }
+ }
+}
+
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 b9133ab..8b5d1a7 100644
--- a/src/networksettings/connman/qnetworksettingsmanager_p.h
+++ b/src/networksettings/connman/qnetworksettingsmanager_p.h
@@ -82,6 +82,8 @@ public slots:
void onServicesChanged(ConnmanMapStructList changed, const QList<QDBusObjectPath> &removed);
void serviceReady();
void onConnmanServiceRegistered(const QString &serviceName);
+ void onTechnologyAdded(const QDBusObjectPath &technology, const QVariantMap &properties);
+ void onTechnologyRemoved(const QDBusObjectPath &technology);
private:
bool initialize();
void handleNewService(const QString& servicePath);