From 5d4ba35bc917bc5a48b60da5a4c2cbd03ff4bbf4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pasi=20Pet=C3=A4j=C3=A4j=C3=A4rvi?= Date: Thu, 30 Aug 2018 14:55:54 +0300 Subject: Add support for dynamically add/remove physical network interfaces Change-Id: I1690ce5f4b71c1faf14002a9389ca7b5f2b5665d Reviewed-by: Teemu Holappa --- src/networksettings/connman/connman_manager.xml | 6 ++-- .../connman/qnetworksettingsinterface_p.cpp | 5 +++ .../connman/qnetworksettingsinterface_p.h | 7 +++++ .../connman/qnetworksettingsmanager_p.cpp | 36 ++++++++++++++++++++++ .../connman/qnetworksettingsmanager_p.h | 2 ++ 5 files changed, 53 insertions(+), 3 deletions(-) (limited to 'src/networksettings/connman') 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 @@ - + - + - + 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(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(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 &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); -- cgit v1.2.3