diff options
-rw-r--r-- | .qmake.conf | 2 | ||||
-rw-r--r-- | src/imports/networksettings/plugin.cpp | 2 | ||||
-rw-r--r-- | src/networksettings/connman/connman_manager.xml | 6 | ||||
-rw-r--r-- | src/networksettings/connman/qnetworksettingsinterface_p.cpp | 5 | ||||
-rw-r--r-- | src/networksettings/connman/qnetworksettingsinterface_p.h | 7 | ||||
-rw-r--r-- | src/networksettings/connman/qnetworksettingsmanager_p.cpp | 36 | ||||
-rw-r--r-- | src/networksettings/connman/qnetworksettingsmanager_p.h | 2 | ||||
-rw-r--r-- | src/networksettings/qnetworksettingsinterfacemodel.cpp | 55 | ||||
-rw-r--r-- | src/networksettings/qnetworksettingsinterfacemodel.h | 9 |
9 files changed, 119 insertions, 5 deletions
diff --git a/.qmake.conf b/.qmake.conf index d532748..243940d 100644 --- a/.qmake.conf +++ b/.qmake.conf @@ -1,3 +1,3 @@ load(qt_build_config) -MODULE_VERSION=5.11.2 +MODULE_VERSION=5.12.0 CMAKE_MODULE_TESTS=- diff --git a/src/imports/networksettings/plugin.cpp b/src/imports/networksettings/plugin.cpp index ee49594..6900550 100644 --- a/src/imports/networksettings/plugin.cpp +++ b/src/imports/networksettings/plugin.cpp @@ -47,7 +47,7 @@ \brief Provides singleton QML types for controlling network settings. Provides singleton QML types for controlling network settings in an - embedded device.QAbstractItemModel + embedded device. Import the module as follows: 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); diff --git a/src/networksettings/qnetworksettingsinterfacemodel.cpp b/src/networksettings/qnetworksettingsinterfacemodel.cpp index ff234ac..09b96ba 100644 --- a/src/networksettings/qnetworksettingsinterfacemodel.cpp +++ b/src/networksettings/qnetworksettingsinterfacemodel.cpp @@ -123,6 +123,7 @@ QVariant QNetworkSettingsInterfaceModel::data(const QModelIndex & index, int rol void QNetworkSettingsInterfaceModel::append(QNetworkSettingsInterface* item) { item->setParent(this); + connectStateChanges(item); beginInsertRows(QModelIndex(), rowCount(), rowCount()); m_items.append(item); @@ -135,12 +136,19 @@ void QNetworkSettingsInterfaceModel::append(QNetworkSettingsInterface* item) void QNetworkSettingsInterfaceModel::insert(int row, QNetworkSettingsInterface* item) { item->setParent(this); + connectStateChanges(item); beginInsertRows(QModelIndex(), row, row); m_items.insert(row, item); endInsertRows(); } +void QNetworkSettingsInterfaceModel::connectStateChanges(QNetworkSettingsInterface* item) +{ + connect(item, &QNetworkSettingsInterface::stateChanged, this, &QNetworkSettingsInterfaceModel::connectionStatusChanged); + connect(item, &QNetworkSettingsInterface::poweredChanged, this, &QNetworkSettingsInterfaceModel::poweredChanged); +} + /*! Removes the row \a row from the model. */ @@ -151,6 +159,24 @@ void QNetworkSettingsInterfaceModel::remove(int row) endRemoveRows(); } +bool QNetworkSettingsInterfaceModel::removeInterface(const QString &name) +{ + bool ret = false; + for (int i=0; i < m_items.count(); i++) { + if (m_items.at(i)->name() == name) { + remove(i); + ret = true; + break; + } + } + return ret; +} + +void QNetworkSettingsInterfaceModel::updated(int row) +{ + dataChanged(createIndex(row, 0), createIndex(row, 0)); +} + /*! Returns the network interface model. */ @@ -159,4 +185,33 @@ QList<QNetworkSettingsInterface*> QNetworkSettingsInterfaceModel::getModel() return m_items; } +void QNetworkSettingsInterfaceModel::connectionStatusChanged() +{ + QNetworkSettingsInterface *s = qobject_cast<QNetworkSettingsInterface*>(sender()); + + int row = 0; + foreach (QNetworkSettingsInterface* item, m_items) { + if (item == s) { + updated(row); + break; + } + row++; + } + +} + +void QNetworkSettingsInterfaceModel::poweredChanged() +{ + QNetworkSettingsInterface *s = qobject_cast<QNetworkSettingsInterface*>(sender()); + int row = 0; + foreach (QNetworkSettingsInterface* item, m_items) { + if (item == s) { + updated(row); + break; + } + row++; + } +} + + QT_END_NAMESPACE diff --git a/src/networksettings/qnetworksettingsinterfacemodel.h b/src/networksettings/qnetworksettingsinterfacemodel.h index 4ecebc7..6dd1f2a 100644 --- a/src/networksettings/qnetworksettingsinterfacemodel.h +++ b/src/networksettings/qnetworksettingsinterfacemodel.h @@ -59,6 +59,15 @@ public: Powered }; + void updated(int row); + bool removeInterface(const QString &name); +private Q_SLOTS: + void connectionStatusChanged(); + void poweredChanged(); + +private: + void connectStateChanges(QNetworkSettingsInterface* item); + private: QList<QNetworkSettingsInterface*> m_items; QHash<int, QByteArray> m_roleNames; |