From 1671759a9ef01b1e6533d4caf72cfd1ac3c9223e Mon Sep 17 00:00:00 2001 From: Ville Voutilainen Date: Thu, 3 Aug 2017 19:13:52 +0300 Subject: Introduce a placeholder for removed wired networks Disable entering the wired network settings when none have been seen. When a wired network is cable-disconnected, leave a placeholder for it. When a new wired network is cable-connected, replace the placeholder with that. Task-number: QTBUG-60979 Change-Id: I8eeb20d25d765c7bb104ad2e698e4d0686c8dc2d Reviewed-by: Teemu Holappa --- .../connman/qnetworksettingsmanager_p.cpp | 7 ++++ .../connman/qnetworksettingsservice_p.cpp | 10 ++++++ .../connman/qnetworksettingsservice_p.h | 3 ++ src/networksettings/qnetworksettingsservice.cpp | 12 +++++++ src/networksettings/qnetworksettingsservice.h | 2 ++ .../qnetworksettingsservicemodel.cpp | 37 ++++++++++++++++++++++ src/networksettings/qnetworksettingsservicemodel.h | 5 +++ 7 files changed, 76 insertions(+) (limited to 'src/networksettings') diff --git a/src/networksettings/connman/qnetworksettingsmanager_p.cpp b/src/networksettings/connman/qnetworksettingsmanager_p.cpp index 22e8005..e3f6d0b 100644 --- a/src/networksettings/connman/qnetworksettingsmanager_p.cpp +++ b/src/networksettings/connman/qnetworksettingsmanager_p.cpp @@ -114,6 +114,7 @@ void QNetworkSettingsManagerPrivate::getTechnologiesFinished(QDBusPendingCallWat foreach (const ConnmanMapStruct &object, reply.value()) { ConnmanSettingsInterface *item = new ConnmanSettingsInterface(object.objectPath.path(), object.propertyMap, this); + item->scanServices(); if (item->type() == QNetworkSettingsType::Wired) { m_interfaceModel.insert(0, item); @@ -158,6 +159,9 @@ void QNetworkSettingsManagerPrivate::handleNewService(const QString &servicePath if (service->name().length() > 0 && service->type() != QNetworkSettingsType::Unknown) { m_serviceModel->append(service); emit q->servicesChanged(); + if (service->type() == QNetworkSettingsType::Wired) { + m_serviceFilter->setWiredNetworksAvailable(true); + } } else { //Service name or type not set, wait for update @@ -180,6 +184,9 @@ void QNetworkSettingsManagerPrivate::serviceReady() service->disconnect(this); m_serviceModel->append(service); emit q->servicesChanged(); + if (service->type() == QNetworkSettingsType::Wired) { + m_serviceFilter->setWiredNetworksAvailable(true); + } //Update the interface state accordingly foreach (QNetworkSettingsInterface* item, m_interfaceModel.getModel()) { diff --git a/src/networksettings/connman/qnetworksettingsservice_p.cpp b/src/networksettings/connman/qnetworksettingsservice_p.cpp index 49213c4..f5876e7 100644 --- a/src/networksettings/connman/qnetworksettingsservice_p.cpp +++ b/src/networksettings/connman/qnetworksettingsservice_p.cpp @@ -324,6 +324,16 @@ void QNetworkSettingsServicePrivate::disconnectService() } +void QNetworkSettingsServicePrivate::setPlaceholderState(bool placeholderState) +{ + m_placeholderState = placeholderState; +} + +bool QNetworkSettingsServicePrivate::placeholderState() const +{ + return m_placeholderState; +} + void QNetworkSettingsServicePrivate::propertiesUpdated(QDBusPendingCallWatcher *call) { QDBusPendingReply reply = *call; diff --git a/src/networksettings/connman/qnetworksettingsservice_p.h b/src/networksettings/connman/qnetworksettingsservice_p.h index 7f3930d..76b5182 100644 --- a/src/networksettings/connman/qnetworksettingsservice_p.h +++ b/src/networksettings/connman/qnetworksettingsservice_p.h @@ -72,6 +72,8 @@ protected: void setupQNetworkSettingsProxy(); void connectService(); void disconnectService(); + void setPlaceholderState(bool placeholderState); + bool placeholderState() const; QString m_id; QString m_name; @@ -84,6 +86,7 @@ protected: QNetworkSettingsWireless m_wifiConfig; QNetworkSettingsType m_type; NetConnmanServiceInterface *m_service; + bool m_placeholderState; }; #endif // QNETWORKSETTINGSSERVICEPRIVATE_H diff --git a/src/networksettings/qnetworksettingsservice.cpp b/src/networksettings/qnetworksettingsservice.cpp index cbbfd10..e910bc3 100644 --- a/src/networksettings/qnetworksettingsservice.cpp +++ b/src/networksettings/qnetworksettingsservice.cpp @@ -151,6 +151,18 @@ QNetworkSettingsWireless* QNetworkSettingsService::wirelessConfig() return &d->m_wifiConfig; } +void QNetworkSettingsService::setPlaceholderState(bool placeholderState) +{ + Q_D(QNetworkSettingsService); + d->setPlaceholderState(placeholderState); +} + +bool QNetworkSettingsService::placeholderState() const +{ + Q_D(const QNetworkSettingsService); + return d->placeholderState(); +} + /*! \qmlproperty object NetworkService::domains \readonly diff --git a/src/networksettings/qnetworksettingsservice.h b/src/networksettings/qnetworksettingsservice.h index ba6bf07..3019b2d 100644 --- a/src/networksettings/qnetworksettingsservice.h +++ b/src/networksettings/qnetworksettingsservice.h @@ -63,6 +63,8 @@ public: QAbstractItemModel* domains(); QAbstractItemModel* nameservers(); QNetworkSettingsWireless* wirelessConfig(); + void setPlaceholderState(bool placeholderState); + bool placeholderState() const; Q_INVOKABLE void setAutoConnect(const bool autoconnect); Q_INVOKABLE void setupIpv4Config(); diff --git a/src/networksettings/qnetworksettingsservicemodel.cpp b/src/networksettings/qnetworksettingsservicemodel.cpp index ce8ea86..f7a8a26 100644 --- a/src/networksettings/qnetworksettingsservicemodel.cpp +++ b/src/networksettings/qnetworksettingsservicemodel.cpp @@ -75,11 +75,31 @@ QVariant QNetworkSettingsServiceModel::data(const QModelIndex & index, int role) return QVariant(); } +bool QNetworkSettingsServiceModel::replacePlaceholder(QNetworkSettingsService* item) +{ + if (item->type() == QNetworkSettingsType::Wired) { + for (int i = 0; i < m_items.size(); ++i) { + QNetworkSettingsService* existing = m_items.at(i); + if (existing->placeholderState()) { + m_items.replace(i, item); + existing->deleteLater(); + updated(i); + return true; + } + } + } + return false; +} + void QNetworkSettingsServiceModel::append(QNetworkSettingsService* item) { item->setParent(this); connectStateChanges(item); + if ((item->type() == QNetworkSettingsType::Wired) && replacePlaceholder(item)) { + return; + } + beginResetModel(); m_items.append(item); endResetModel(); @@ -89,6 +109,11 @@ void QNetworkSettingsServiceModel::insert(int row, QNetworkSettingsService* item { item->setParent(this); connectStateChanges(item); + + if ((item->type() == QNetworkSettingsType::Wired) && replacePlaceholder(item)) { + return; + } + beginInsertRows(QModelIndex(), row, row); m_items.insert(row, item); endInsertRows(); @@ -105,6 +130,12 @@ void QNetworkSettingsServiceModel::connectStateChanges(QNetworkSettingsService* void QNetworkSettingsServiceModel::remove(int row) { QNetworkSettingsService* item = m_items.at(row); + if (item->type() == QNetworkSettingsType::Wired) { + /* Don't remove a wired service so that it doesn't become undefined in the UI. + This avoids problems when a cable is disconnected. */ + item->setPlaceholderState(true); + return; + } item->deleteLater(); beginRemoveRows(QModelIndex(), row, row); m_items.removeAt(row); @@ -262,3 +293,9 @@ int QNetworkSettingsServiceFilter::activeRow() const } return -1; } + +void QNetworkSettingsServiceFilter::setWiredNetworksAvailable(bool wiredNetworksAvailable) +{ + m_wiredNetworksAvailable = wiredNetworksAvailable; + emit wiredNetworksAvailableChanged(); +} diff --git a/src/networksettings/qnetworksettingsservicemodel.h b/src/networksettings/qnetworksettingsservicemodel.h index 0b0e674..91f3b6d 100644 --- a/src/networksettings/qnetworksettingsservicemodel.h +++ b/src/networksettings/qnetworksettingsservicemodel.h @@ -46,6 +46,7 @@ public: QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const; QHash roleNames() const; + bool replacePlaceholder(QNetworkSettingsService* networkService); void append(QNetworkSettingsService* networkService); void insert(int row, QNetworkSettingsService* networkInterface); void remove(int row); @@ -76,6 +77,7 @@ class Q_DECL_EXPORT QNetworkSettingsServiceFilter : public QSortFilterProxyModel { Q_OBJECT Q_PROPERTY(QNetworkSettingsType::Types type READ type WRITE setType NOTIFY typeChanged) + Q_PROPERTY(bool wiredNetworksAvailable MEMBER m_wiredNetworksAvailable WRITE setWiredNetworksAvailable NOTIFY wiredNetworksAvailableChanged) public: explicit QNetworkSettingsServiceFilter(QObject* parent = Q_NULLPTR); virtual ~QNetworkSettingsServiceFilter(); @@ -84,10 +86,13 @@ public: void setType(QNetworkSettingsType::Types type); Q_INVOKABLE QVariant itemFromRow(const int row) const; Q_INVOKABLE int activeRow() const; + void setWiredNetworksAvailable(bool); Q_SIGNALS: void typeChanged(); + void wiredNetworksAvailableChanged(); private: QNetworkSettingsType::Types m_type; + bool m_wiredNetworksAvailable; }; QT_END_NAMESPACE -- cgit v1.2.3