From 1652f4a05d65cf410701e38c4334fba9cf81eb95 Mon Sep 17 00:00:00 2001 From: Teemu Holappa Date: Tue, 1 Nov 2016 13:02:10 +0200 Subject: Fix QNetworkSettingsManager usage from the C++ Fixed servicesChanged signal handling. Fixed services and interfaces functions return types in QNetworkSettingsManager. Task-number: QTBUG-56760 Change-Id: Iaade0d5c06e8ff8f8dea4b421e226ae6348a9fe5 Reviewed-by: Rainer Keller --- .../connman/qnetworksettingsmanager_p.cpp | 60 ++++++++++++++-------- .../connman/qnetworksettingsmanager_p.h | 5 +- .../connman/qnetworksettingsservice_p.cpp | 1 + src/networksettings/qnetworksettings.h | 4 +- src/networksettings/qnetworksettingsmanager.cpp | 6 +-- src/networksettings/qnetworksettingsmanager.h | 13 +++-- src/networksettings/qnetworksettingsservicemodel.h | 2 +- 7 files changed, 59 insertions(+), 32 deletions(-) (limited to 'src/networksettings') diff --git a/src/networksettings/connman/qnetworksettingsmanager_p.cpp b/src/networksettings/connman/qnetworksettingsmanager_p.cpp index 6fecd86..22e8005 100644 --- a/src/networksettings/connman/qnetworksettingsmanager_p.cpp +++ b/src/networksettings/connman/qnetworksettingsmanager_p.cpp @@ -98,25 +98,7 @@ void QNetworkSettingsManagerPrivate::getServicesFinished(QDBusPendingCallWatcher foreach (const ConnmanMapStruct &object, reply.value()) { const QString servicePath = object.objectPath.path(); - QNetworkSettingsService *service = new QNetworkSettingsService(servicePath, this); - m_serviceModel->append(service); - - //Update status property - QString n = qdbus_cast(object.propertyMap[PropertyName]); - QString t = qdbus_cast(object.propertyMap[PropertyType]); - QString s = qdbus_cast(object.propertyMap[PropertyState]); - - QNetworkSettingsType type; - t >> type; - QNetworkSettingsState state; - s >> state; - - foreach (QNetworkSettingsInterface* item, m_interfaceModel.getModel()) { - ConnmanSettingsInterface* technology = qobject_cast(item); - if (technology->name() == n && technology->type() == type.type()) { - technology->setState(state.state()); - } - } + handleNewService(servicePath); } emit q->servicesChanged(); } @@ -161,9 +143,26 @@ void QNetworkSettingsManagerPrivate::onServicesChanged(ConnmanMapStructList chan if (!found) newServices.append(map.objectPath.path()); } + foreach (QString newService, newServices) { - QNetworkSettingsService *service = new QNetworkSettingsService(newService, this); + handleNewService(newService); + } +} + +void QNetworkSettingsManagerPrivate::handleNewService(const QString &servicePath) +{ + Q_Q(QNetworkSettingsManager); + + QNetworkSettingsService *service = new QNetworkSettingsService(servicePath, this); + + if (service->name().length() > 0 && service->type() != QNetworkSettingsType::Unknown) { m_serviceModel->append(service); + emit q->servicesChanged(); + } + else { + //Service name or type not set, wait for update + connect(service, &QNetworkSettingsService::nameChanged, this, &QNetworkSettingsManagerPrivate::serviceReady); + connect(service, &QNetworkSettingsService::typeChanged, this, &QNetworkSettingsManagerPrivate::serviceReady); } } @@ -171,3 +170,24 @@ void QNetworkSettingsManagerPrivate::setUserAgent(QNetworkSettingsUserAgent *age { m_agent = agent; } + +void QNetworkSettingsManagerPrivate::serviceReady() +{ + Q_Q(QNetworkSettingsManager); + + QNetworkSettingsService* service = qobject_cast(sender()); + if (service->name().length() > 0 && service->type() != QNetworkSettingsType::Unknown) { + service->disconnect(this); + m_serviceModel->append(service); + emit q->servicesChanged(); + + //Update the interface state accordingly + foreach (QNetworkSettingsInterface* item, m_interfaceModel.getModel()) { + ConnmanSettingsInterface* technology = qobject_cast(item); + if (technology->name() == service->name() && technology->type() == service->type()) { + technology->setState(technology->state()); + } + } + + } +} diff --git a/src/networksettings/connman/qnetworksettingsmanager_p.h b/src/networksettings/connman/qnetworksettingsmanager_p.h index 5eb5470..b6e23ab 100644 --- a/src/networksettings/connman/qnetworksettingsmanager_p.h +++ b/src/networksettings/connman/qnetworksettingsmanager_p.h @@ -38,6 +38,7 @@ class NetConnmanManagerInterface; class QNetworkSettingsServiceModel; class QNetworkSettingsServiceFilter; +class QNetworkSettingsService; class QNetworkSettingsManagerPrivate : public QObject { @@ -53,7 +54,9 @@ public slots: void getTechnologiesFinished(QDBusPendingCallWatcher *watcher); void requestInput(const QString& service, const QString& type); void onServicesChanged(ConnmanMapStructList changed, const QList &removed); - + void serviceReady(); +private: + void handleNewService(const QString& servicePath); protected: QNetworkSettingsInterfaceModel m_interfaceModel; QNetworkSettingsServiceModel *m_serviceModel; diff --git a/src/networksettings/connman/qnetworksettingsservice_p.cpp b/src/networksettings/connman/qnetworksettingsservice_p.cpp index 8a7b2cf..e8aabff 100644 --- a/src/networksettings/connman/qnetworksettingsservice_p.cpp +++ b/src/networksettings/connman/qnetworksettingsservice_p.cpp @@ -362,6 +362,7 @@ void QNetworkSettingsServicePrivate::updateProperty(const QString& key, const QV else if (key == PropertyType) { QString value = qdbus_cast(val); value >> m_type; + emit q->typeChanged(); } else if (key == PropertyStrength) { m_wifiConfig.setSignalStrength(val.toInt()); diff --git a/src/networksettings/qnetworksettings.h b/src/networksettings/qnetworksettings.h index da75acd..5323f98 100644 --- a/src/networksettings/qnetworksettings.h +++ b/src/networksettings/qnetworksettings.h @@ -166,12 +166,11 @@ class Q_DECL_EXPORT QNetworkSettingsProxy : public QObject { Q_OBJECT Q_ENUMS(MethodType) -public: Q_PROPERTY(QUrl url READ url WRITE setUrl NOTIFY urlChanged) Q_PROPERTY(QAbstractItemModel* servers READ servers NOTIFY serversChanged) Q_PROPERTY(QAbstractItemModel* excludes READ excludes NOTIFY excludesChanged) Q_PROPERTY(MethodType method READ method WRITE setMethod NOTIFY methodChanged) - +public: explicit QNetworkSettingsProxy(QObject *parent = Q_NULLPTR); enum MethodType {Direct, Auto, Manual}; @@ -202,6 +201,7 @@ private: class Q_DECL_EXPORT QNetworkSettingsWireless : public QObject { Q_OBJECT + Q_ENUMS(SecurityFlags) Q_PROPERTY(int signalStrength READ signalStrength WRITE setSignalStrength NOTIFY signalStrengthChanged) Q_PROPERTY(bool hidden READ hidden NOTIFY hiddenChanged) Q_PROPERTY(bool isOutOfRange READ outOfRange WRITE setOutOfRange NOTIFY outOfRangeChanged) diff --git a/src/networksettings/qnetworksettingsmanager.cpp b/src/networksettings/qnetworksettingsmanager.cpp index ceee7ad..caf6057 100644 --- a/src/networksettings/qnetworksettingsmanager.cpp +++ b/src/networksettings/qnetworksettingsmanager.cpp @@ -39,19 +39,19 @@ QNetworkSettingsManager::QNetworkSettingsManager(QObject *parent) : { } -QAbstractItemModel* QNetworkSettingsManager::services() +QNetworkSettingsServiceFilter *QNetworkSettingsManager::services() { Q_D(QNetworkSettingsManager); return d->m_serviceFilter; } -QAbstractItemModel* QNetworkSettingsManager::interfaces() +QNetworkSettingsInterfaceModel *QNetworkSettingsManager::interfaces() { Q_D(QNetworkSettingsManager); return &d->m_interfaceModel; } -QNetworkSettingsService* QNetworkSettingsManager::getService(const QString& name, const int type) +QNetworkSettingsService* QNetworkSettingsManager::service(const QString& name, const int type) { Q_D(QNetworkSettingsManager); diff --git a/src/networksettings/qnetworksettingsmanager.h b/src/networksettings/qnetworksettingsmanager.h index ba34974..86a60c4 100644 --- a/src/networksettings/qnetworksettingsmanager.h +++ b/src/networksettings/qnetworksettingsmanager.h @@ -35,24 +35,27 @@ QT_FORWARD_DECLARE_CLASS(QNetworkSettingsManagerPrivate) QT_FORWARD_DECLARE_CLASS(QNetworkSettingsService) +QT_FORWARD_DECLARE_CLASS(QNetworkSettingsServiceModel) QT_FORWARD_DECLARE_CLASS(QNetworkSettingsUserAgent) +QT_FORWARD_DECLARE_CLASS(QNetworkSettingsServiceFilter) +QT_FORWARD_DECLARE_CLASS(QNetworkSettingsInterfaceModel) class Q_DECL_EXPORT QNetworkSettingsManager : public QObject { Q_OBJECT Q_ENUMS(StateTypes NetworkTypeTypes) - Q_PROPERTY(QAbstractItemModel* services READ services NOTIFY servicesChanged) - Q_PROPERTY(QAbstractItemModel* interfaces READ interfaces NOTIFY interfacesChanged) + Q_PROPERTY(QNetworkSettingsServiceFilter* services READ services NOTIFY servicesChanged) + Q_PROPERTY(QNetworkSettingsInterfaceModel* interfaces READ interfaces NOTIFY interfacesChanged) Q_PROPERTY(QNetworkSettingsUserAgent* userAgent READ userAgent CONSTANT) public: explicit QNetworkSettingsManager(QObject* parent = Q_NULLPTR); - QAbstractItemModel* services(); - QAbstractItemModel* interfaces(); + QNetworkSettingsServiceFilter* services(); + QNetworkSettingsInterfaceModel* interfaces(); void setUserAgent(QNetworkSettingsUserAgent *agent); QNetworkSettingsUserAgent* userAgent(); - Q_INVOKABLE QNetworkSettingsService* getService(const QString& name, const int type); + Q_INVOKABLE QNetworkSettingsService* service(const QString& name, const int type); Q_SIGNALS: void servicesChanged(); diff --git a/src/networksettings/qnetworksettingsservicemodel.h b/src/networksettings/qnetworksettingsservicemodel.h index ab225bd..c158ec4 100644 --- a/src/networksettings/qnetworksettingsservicemodel.h +++ b/src/networksettings/qnetworksettingsservicemodel.h @@ -70,7 +70,7 @@ private: QHash m_roleNames; }; -class QNetworkSettingsServiceFilter : public QSortFilterProxyModel +class Q_DECL_EXPORT QNetworkSettingsServiceFilter : public QSortFilterProxyModel { Q_OBJECT Q_PROPERTY(QNetworkSettingsType::Types type READ type WRITE setType NOTIFY typeChanged) -- cgit v1.2.3