diff options
Diffstat (limited to 'src/plugins/bearer/networkmanager')
6 files changed, 537 insertions, 284 deletions
diff --git a/src/plugins/bearer/networkmanager/qnetworkmanagerengine.cpp b/src/plugins/bearer/networkmanager/qnetworkmanagerengine.cpp index 08a0bb4c63..5f49ea0b6d 100644 --- a/src/plugins/bearer/networkmanager/qnetworkmanagerengine.cpp +++ b/src/plugins/bearer/networkmanager/qnetworkmanagerengine.cpp @@ -55,25 +55,21 @@ QT_BEGIN_NAMESPACE QNetworkManagerEngine::QNetworkManagerEngine(QObject *parent) : QBearerEngineImpl(parent), - interface(new QNetworkManagerInterface(this)), - systemSettings(new QNetworkManagerSettings(NM_DBUS_SERVICE_SYSTEM_SETTINGS, this)), - userSettings(new QNetworkManagerSettings(NM_DBUS_SERVICE_USER_SETTINGS, this)) + managerInterface(new QNetworkManagerInterface(this)), + systemSettings(new QNetworkManagerSettings(NM_DBUS_SERVICE, this)), + userSettings(new QNetworkManagerSettings(NM_DBUS_SERVICE, this)) { - if (!interface->isValid()) + if (!managerInterface->isValid()) return; - interface->setConnections(); - connect(interface, SIGNAL(deviceAdded(QDBusObjectPath)), + managerInterface->setConnections(); + connect(managerInterface, SIGNAL(deviceAdded(QDBusObjectPath)), this, SLOT(deviceAdded(QDBusObjectPath))); - connect(interface, SIGNAL(deviceRemoved(QDBusObjectPath)), + connect(managerInterface, SIGNAL(deviceRemoved(QDBusObjectPath)), this, SLOT(deviceRemoved(QDBusObjectPath))); -#if 0 - connect(interface, SIGNAL(stateChanged(QString,quint32)), - this, SIGNAL(configurationsChanged())); -#endif - connect(interface, SIGNAL(activationFinished(QDBusPendingCallWatcher*)), + connect(managerInterface, SIGNAL(activationFinished(QDBusPendingCallWatcher*)), this, SLOT(activationFinished(QDBusPendingCallWatcher*))); - connect(interface, SIGNAL(propertiesChanged(QString,QMap<QString,QVariant>)), + connect(managerInterface, SIGNAL(propertiesChanged(QString,QMap<QString,QVariant>)), this, SLOT(interfacePropertiesChanged(QString,QMap<QString,QVariant>))); qDBusRegisterMetaType<QNmSettingsMap>(); @@ -100,52 +96,56 @@ void QNetworkManagerEngine::initialize() QMutexLocker locker(&mutex); // Get current list of access points. - foreach (const QDBusObjectPath &devicePath, interface->getDevices()) { + foreach (const QDBusObjectPath &devicePath, managerInterface->getDevices()) { locker.unlock(); - deviceAdded(devicePath); + deviceAdded(devicePath); //add all accesspoints locker.relock(); } // Get connections. + foreach (const QDBusObjectPath &settingsPath, systemSettings->listConnections()) { locker.unlock(); - newConnection(settingsPath, systemSettings); + if (!hasIdentifier(settingsPath.path())) + newConnection(settingsPath, systemSettings); //add system connection configs locker.relock(); } + foreach (const QDBusObjectPath &settingsPath, userSettings->listConnections()) { locker.unlock(); - newConnection(settingsPath, userSettings); + if (!hasIdentifier(settingsPath.path())) + newConnection(settingsPath, userSettings); locker.relock(); } // Get active connections. - foreach (const QDBusObjectPath &acPath, interface->activeConnections()) { + foreach (const QDBusObjectPath &acPath, managerInterface->activeConnections()) { QNetworkManagerConnectionActive *activeConnection = - new QNetworkManagerConnectionActive(acPath.path()); + new QNetworkManagerConnectionActive(acPath.path(),this); activeConnections.insert(acPath.path(), activeConnection); activeConnection->setConnections(); connect(activeConnection, SIGNAL(propertiesChanged(QString,QMap<QString,QVariant>)), this, SLOT(activeConnectionPropertiesChanged(QString,QMap<QString,QVariant>))); } + Q_EMIT updateCompleted(); } bool QNetworkManagerEngine::networkManagerAvailable() const { QMutexLocker locker(&mutex); - return interface->isValid(); + return managerInterface->isValid(); } QString QNetworkManagerEngine::getInterfaceFromId(const QString &id) { QMutexLocker locker(&mutex); - foreach (const QDBusObjectPath &acPath, interface->activeConnections()) { + foreach (const QDBusObjectPath &acPath, managerInterface->activeConnections()) { QNetworkManagerConnectionActive activeConnection(acPath.path()); - const QString identifier = QString::number(qHash(activeConnection.serviceName() + ' ' + - activeConnection.connection().path())); + const QString identifier = activeConnection.connection().path(); if (id == identifier) { QList<QDBusObjectPath> devices = activeConnection.devices(); @@ -161,24 +161,11 @@ QString QNetworkManagerEngine::getInterfaceFromId(const QString &id) return QString(); } + bool QNetworkManagerEngine::hasIdentifier(const QString &id) { QMutexLocker locker(&mutex); - - if (connectionFromId(id)) - return true; - - for (int i = 0; i < accessPoints.count(); ++i) { - QNetworkManagerInterfaceAccessPoint *accessPoint = accessPoints.at(i); - - const QString identifier = - QString::number(qHash(accessPoint->connectionInterface()->path())); - - if (id == identifier) - return true; - } - - return false; + return accessPointConfigurations.contains(id); } void QNetworkManagerEngine::connectToId(const QString &id) @@ -194,18 +181,17 @@ void QNetworkManagerEngine::connectToId(const QString &id) const QString connectionType = map.value("connection").value("type").toString(); QString dbusDevicePath; - foreach (const QDBusObjectPath &devicePath, interface->getDevices()) { + foreach (const QDBusObjectPath &devicePath, managerInterface->getDevices()) { QNetworkManagerInterfaceDevice device(devicePath.path()); - if (device.deviceType() == DEVICE_TYPE_802_3_ETHERNET && + if (device.deviceType() == DEVICE_TYPE_ETHERNET && connectionType == QLatin1String("802-3-ethernet")) { dbusDevicePath = devicePath.path(); break; - } else if (device.deviceType() == DEVICE_TYPE_802_11_WIRELESS && + } else if (device.deviceType() == DEVICE_TYPE_WIFI && connectionType == QLatin1String("802-11-wireless")) { dbusDevicePath = devicePath.path(); break; - } - else if (device.deviceType() == DEVICE_TYPE_GSM && + } else if (device.deviceType() == DEVICE_TYPE_MODEM && connectionType == QLatin1String("gsm")) { dbusDevicePath = devicePath.path(); break; @@ -214,23 +200,34 @@ void QNetworkManagerEngine::connectToId(const QString &id) const QString service = connection->connectionInterface()->service(); const QString settingsPath = connection->connectionInterface()->path(); + QString specificPath = configuredAccessPoints.key(settingsPath); + + if (specificPath.isEmpty()) + specificPath = "/"; - interface->activateConnection(service, QDBusObjectPath(settingsPath), - QDBusObjectPath(dbusDevicePath), QDBusObjectPath("/")); + managerInterface->activateConnection(service, QDBusObjectPath(settingsPath), + QDBusObjectPath(dbusDevicePath), QDBusObjectPath(specificPath)); } void QNetworkManagerEngine::disconnectFromId(const QString &id) { QMutexLocker locker(&mutex); - foreach (const QDBusObjectPath &acPath, interface->activeConnections()) { + QNetworkManagerSettingsConnection *connection = connectionFromId(id); + QNmSettingsMap map = connection->getSettings(); + bool connectionAutoconnect = map.value("connection").value("autoconnect",true).toBool(); //if not present is true !! + if (connectionAutoconnect) { //autoconnect connections will simply be reconnected by nm + emit connectionError(id, QBearerEngineImpl::OperationNotSupported); + return; + } + + foreach (const QDBusObjectPath &acPath, managerInterface->activeConnections()) { QNetworkManagerConnectionActive activeConnection(acPath.path()); - const QString identifier = QString::number(qHash(activeConnection.serviceName() + ' ' + - activeConnection.connection().path())); + const QString identifier = activeConnection.connection().path(); if (id == identifier && accessPointConfigurations.contains(id)) { - interface->deactivateConnection(acPath); + managerInterface->deactivateConnection(acPath); break; } } @@ -238,15 +235,26 @@ void QNetworkManagerEngine::disconnectFromId(const QString &id) void QNetworkManagerEngine::requestUpdate() { + if (managerInterface->wirelessEnabled()) { + QHashIterator<QString, QNetworkManagerInterfaceDeviceWireless *> i(wirelessDevices); + while (i.hasNext()) { + i.next(); + i.value()->requestScan(); + } + } + QMetaObject::invokeMethod(this, "updateCompleted", Qt::QueuedConnection); +} + +void QNetworkManagerEngine::scanFinished() +{ QMetaObject::invokeMethod(this, "updateCompleted", Qt::QueuedConnection); } void QNetworkManagerEngine::interfacePropertiesChanged(const QString &path, const QMap<QString, QVariant> &properties) { - QMutexLocker locker(&mutex); - Q_UNUSED(path) + QMutexLocker locker(&mutex); QMapIterator<QString, QVariant> i(properties); while (i.hasNext()) { @@ -269,7 +277,7 @@ void QNetworkManagerEngine::interfacePropertiesChanged(const QString &path, QNetworkManagerConnectionActive *activeConnection = this->activeConnections.value(acPath.path()); if (!activeConnection) { - activeConnection = new QNetworkManagerConnectionActive(acPath.path()); + activeConnection = new QNetworkManagerConnectionActive(acPath.path(),this); this->activeConnections.insert(acPath.path(), activeConnection); activeConnection->setConnections(); @@ -277,15 +285,14 @@ void QNetworkManagerEngine::interfacePropertiesChanged(const QString &path, this, SLOT(activeConnectionPropertiesChanged(QString,QMap<QString,QVariant>))); } - const QString id = QString::number(qHash(activeConnection->serviceName() + ' ' + - activeConnection->connection().path())); + const QString id = activeConnection->connection().path(); identifiers.removeOne(id); QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id); if (ptr) { ptr->mutex.lock(); - if (activeConnection->state() == 2 && + if (activeConnection->state() == NM_ACTIVE_CONNECTION_STATE_ACTIVATED && ptr->state != QNetworkConfiguration::Active) { ptr->state = QNetworkConfiguration::Active; ptr->mutex.unlock(); @@ -303,13 +310,13 @@ void QNetworkManagerEngine::interfacePropertiesChanged(const QString &path, delete this->activeConnections.take(priorActiveConnections.takeFirst()); while (!identifiers.isEmpty()) { - // These configurations are not active QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(identifiers.takeFirst()); ptr->mutex.lock(); if ((ptr->state & QNetworkConfiguration::Active) == QNetworkConfiguration::Active) { - ptr->state = QNetworkConfiguration::Discovered; + QNetworkConfiguration::StateFlags flag = QNetworkConfiguration::Defined; + ptr->state = (flag | QNetworkConfiguration::Discovered); ptr->mutex.unlock(); locker.unlock(); @@ -335,15 +342,14 @@ void QNetworkManagerEngine::activeConnectionPropertiesChanged(const QString &pat if (!activeConnection) return; - const QString id = QString::number(qHash(activeConnection->serviceName() + ' ' + - activeConnection->connection().path())); + const QString id = activeConnection->connection().path(); QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id); if (ptr) { ptr->mutex.lock(); - if (activeConnection->state() == 2 && + if (activeConnection->state() == NM_ACTIVE_CONNECTION_STATE_ACTIVATED && ptr->state != QNetworkConfiguration::Active) { - ptr->state = QNetworkConfiguration::Active; + ptr->state |= QNetworkConfiguration::Active; ptr->mutex.unlock(); locker.unlock(); @@ -355,34 +361,63 @@ void QNetworkManagerEngine::activeConnectionPropertiesChanged(const QString &pat } } -void QNetworkManagerEngine::devicePropertiesChanged(const QString &path, - const QMap<QString, QVariant> &properties) +void QNetworkManagerEngine::devicePropertiesChanged(const QString &/*path*/,quint32 /*state*/) +{ +// Q_UNUSED(path); +// Q_UNUSED(state) +} + +void QNetworkManagerEngine::deviceConnectionsChanged(const QStringList &activeConnectionsList) { - Q_UNUSED(path); - Q_UNUSED(properties); + QMutexLocker locker(&mutex); + for (int i = 0; i < connections.count(); ++i) { + if (activeConnectionsList.contains(connections.at(i)->connectionInterface()->path())) + continue; + + const QString settingsPath = connections.at(i)->connectionInterface()->path(); + + QNetworkConfigurationPrivatePointer ptr = + accessPointConfigurations.value(settingsPath); + ptr->mutex.lock(); + QNetworkConfiguration::StateFlags flag = QNetworkConfiguration::Defined; + ptr->state = (flag | QNetworkConfiguration::Discovered); + ptr->mutex.unlock(); + + locker.unlock(); + emit configurationChanged(ptr); + locker.relock(); + Q_EMIT updateCompleted(); + } } void QNetworkManagerEngine::deviceAdded(const QDBusObjectPath &path) { - QNetworkManagerInterfaceDevice device(path.path()); - if (device.deviceType() == DEVICE_TYPE_802_11_WIRELESS) { + QMutexLocker locker(&mutex); + QNetworkManagerInterfaceDevice *iDevice; + iDevice = new QNetworkManagerInterfaceDevice(path.path(),this); + connect(iDevice,SIGNAL(connectionsChanged(QStringList)), + this,SLOT(deviceConnectionsChanged(QStringList))); + + connect(iDevice,SIGNAL(stateChanged(QString,quint32)), + this,SLOT(devicePropertiesChanged(QString,quint32))); + iDevice->setConnections(); + interfaceDevices.insert(path.path(),iDevice); + + if (iDevice->deviceType() == DEVICE_TYPE_WIFI) { QNetworkManagerInterfaceDeviceWireless *wirelessDevice = - new QNetworkManagerInterfaceDeviceWireless(device.connectionInterface()->path()); + new QNetworkManagerInterfaceDeviceWireless(iDevice->connectionInterface()->path(),this); wirelessDevice->setConnections(); - connect(wirelessDevice, SIGNAL(accessPointAdded(QString,QDBusObjectPath)), - this, SLOT(newAccessPoint(QString,QDBusObjectPath))); - connect(wirelessDevice, SIGNAL(accessPointRemoved(QString,QDBusObjectPath)), - this, SLOT(removeAccessPoint(QString,QDBusObjectPath))); - connect(wirelessDevice, SIGNAL(propertiesChanged(QString,QMap<QString,QVariant>)), - this, SLOT(devicePropertiesChanged(QString,QMap<QString,QVariant>))); + connect(wirelessDevice, SIGNAL(accessPointAdded(QString)), + this, SLOT(newAccessPoint(QString))); + connect(wirelessDevice, SIGNAL(accessPointRemoved(QString)), + this, SLOT(removeAccessPoint(QString))); + connect(wirelessDevice,SIGNAL(scanDone()),this,SLOT(scanFinished())); foreach (const QDBusObjectPath &apPath, wirelessDevice->getAccessPoints()) - newAccessPoint(QString(), apPath); + newAccessPoint(apPath.path()); - mutex.lock(); wirelessDevices.insert(path.path(), wirelessDevice); - mutex.unlock(); } } @@ -390,47 +425,73 @@ void QNetworkManagerEngine::deviceRemoved(const QDBusObjectPath &path) { QMutexLocker locker(&mutex); - delete wirelessDevices.take(path.path()); + if (interfaceDevices.contains(path.path())) { + locker.unlock(); + delete interfaceDevices.take(path.path()); + locker.relock(); + } + if (wirelessDevices.contains(path.path())) { + locker.unlock(); + delete wirelessDevices.take(path.path()); + locker.relock(); + } } void QNetworkManagerEngine::newConnection(const QDBusObjectPath &path, QNetworkManagerSettings *settings) { QMutexLocker locker(&mutex); - if (!settings) settings = qobject_cast<QNetworkManagerSettings *>(sender()); if (!settings) return; + settings->deleteLater(); QNetworkManagerSettingsConnection *connection = new QNetworkManagerSettingsConnection(settings->connectionInterface()->service(), - path.path()); + path.path(),this); + QString apPath; + for (int i = 0; i < accessPoints.count(); ++i) { + if (connection->getSsid() == accessPoints.at(i)->ssid()) { + // remove the corresponding accesspoint from configurations + apPath = accessPoints.at(i)->connectionInterface()->path(); + + QNetworkConfigurationPrivatePointer ptr + = accessPointConfigurations.take(apPath); + if (ptr) { + locker.unlock(); + emit configurationRemoved(ptr); + locker.relock(); + } + } + } connections.append(connection); - connect(connection, SIGNAL(removed(QString)), this, SLOT(removeConnection(QString))); - connect(connection, SIGNAL(updated(QNmSettingsMap)), - this, SLOT(updateConnection(QNmSettingsMap))); + connect(connection,SIGNAL(removed(QString)),this,SLOT(removeConnection(QString))); + connect(connection,SIGNAL(updated()),this,SLOT(updateConnection())); + connection->setConnections(); - const QString service = connection->connectionInterface()->service(); const QString settingsPath = connection->connectionInterface()->path(); + if (connection->getType() == DEVICE_TYPE_WIFI + && !configuredAccessPoints.contains(settingsPath)) + configuredAccessPoints.insert(apPath,settingsPath); + QNetworkConfigurationPrivate *cpPriv = - parseConnection(service, settingsPath, connection->getSettings()); + parseConnection(settingsPath, connection->getSettings()); // Check if connection is active. - foreach (const QDBusObjectPath &acPath, interface->activeConnections()) { + foreach (const QDBusObjectPath &acPath, managerInterface->activeConnections()) { QNetworkManagerConnectionActive activeConnection(acPath.path()); - if (activeConnection.serviceName() == service && + if (activeConnection.defaultRoute() && activeConnection.connection().path() == settingsPath && - activeConnection.state() == 2) { + activeConnection.state() == NM_ACTIVE_CONNECTION_STATE_ACTIVATED) { cpPriv->state |= QNetworkConfiguration::Active; break; } } - QNetworkConfigurationPrivatePointer ptr(cpPriv); accessPointConfigurations.insert(ptr->id, ptr); @@ -442,27 +503,34 @@ void QNetworkManagerEngine::removeConnection(const QString &path) { QMutexLocker locker(&mutex); - Q_UNUSED(path) - QNetworkManagerSettingsConnection *connection = qobject_cast<QNetworkManagerSettingsConnection *>(sender()); if (!connection) return; + connection->deleteLater(); connections.removeAll(connection); - const QString id = QString::number(qHash(connection->connectionInterface()->service() + ' ' + - connection->connectionInterface()->path())); + const QString id = path; QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.take(id); - connection->deleteLater(); - - locker.unlock(); - emit configurationRemoved(ptr); + if (ptr) { + locker.unlock(); + emit configurationRemoved(ptr); + locker.relock(); + } + // add base AP back into configurations + QMapIterator<QString, QString> i(configuredAccessPoints); + while (i.hasNext()) { + i.next(); + if (i.value() == path) { + newAccessPoint(i.key()); + } + } } -void QNetworkManagerEngine::updateConnection(const QNmSettingsMap &settings) +void QNetworkManagerEngine::updateConnection() { QMutexLocker locker(&mutex); @@ -471,17 +539,16 @@ void QNetworkManagerEngine::updateConnection(const QNmSettingsMap &settings) if (!connection) return; - const QString service = connection->connectionInterface()->service(); + connection->deleteLater(); const QString settingsPath = connection->connectionInterface()->path(); - QNetworkConfigurationPrivate *cpPriv = parseConnection(service, settingsPath, settings); + QNetworkConfigurationPrivate *cpPriv = parseConnection(settingsPath, connection->getSettings()); // Check if connection is active. - foreach (const QDBusObjectPath &acPath, interface->activeConnections()) { + foreach (const QDBusObjectPath &acPath, managerInterface->activeConnections()) { QNetworkManagerConnectionActive activeConnection(acPath.path()); - if (activeConnection.serviceName() == service && - activeConnection.connection().path() == settingsPath && + if (activeConnection.connection().path() == settingsPath && activeConnection.state() == NM_ACTIVE_CONNECTION_STATE_ACTIVATED) { cpPriv->state |= QNetworkConfiguration::Active; break; @@ -501,6 +568,7 @@ void QNetworkManagerEngine::updateConnection(const QNmSettingsMap &settings) locker.unlock(); emit configurationChanged(ptr); + locker.relock(); delete cpPriv; } @@ -508,21 +576,22 @@ void QNetworkManagerEngine::activationFinished(QDBusPendingCallWatcher *watcher) { QMutexLocker locker(&mutex); + watcher->deleteLater(); + QDBusPendingReply<QDBusObjectPath> reply(*watcher); if (!reply.isError()) { QDBusObjectPath result = reply.value(); QNetworkManagerConnectionActive activeConnection(result.path()); - const QString id = QString::number(qHash(activeConnection.serviceName() + ' ' + - activeConnection.connection().path())); + const QString id = activeConnection.connection().path(); QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id); if (ptr) { ptr->mutex.lock(); - if (activeConnection.state() == 2 && + if (activeConnection.state() == NM_ACTIVE_CONNECTION_STATE_ACTIVATED && ptr->state != QNetworkConfiguration::Active) { - ptr->state = QNetworkConfiguration::Active; + ptr->state |= QNetworkConfiguration::Active; ptr->mutex.unlock(); locker.unlock(); @@ -535,42 +604,41 @@ void QNetworkManagerEngine::activationFinished(QDBusPendingCallWatcher *watcher) } } -void QNetworkManagerEngine::newAccessPoint(const QString &path, const QDBusObjectPath &objectPath) +void QNetworkManagerEngine::newAccessPoint(const QString &path) { QMutexLocker locker(&mutex); - Q_UNUSED(path) - QNetworkManagerInterfaceAccessPoint *accessPoint = - new QNetworkManagerInterfaceAccessPoint(objectPath.path()); - accessPoints.append(accessPoint); - - accessPoint->setConnections(); - connect(accessPoint, SIGNAL(propertiesChanged(QMap<QString,QVariant>)), - this, SLOT(updateAccessPoint(QMap<QString,QVariant>))); + new QNetworkManagerInterfaceAccessPoint(path,this); - // Check if configuration for this SSID already exists. + bool okToAdd = true; for (int i = 0; i < accessPoints.count(); ++i) { - if (accessPoint != accessPoints.at(i) && - accessPoint->ssid() == accessPoints.at(i)->ssid()) { - return; + if (accessPoints.at(i)->connectionInterface()->path() == path) { + okToAdd = false; } } + if (okToAdd) { + accessPoints.append(accessPoint); + accessPoint->setConnections(); + connect(accessPoint, SIGNAL(propertiesChanged(QMap<QString,QVariant>)), + this, SLOT(updateAccessPoint(QMap<QString,QVariant>))); + } // Check if configuration exists for connection. if (!accessPoint->ssid().isEmpty()) { for (int i = 0; i < connections.count(); ++i) { QNetworkManagerSettingsConnection *connection = connections.at(i); - + const QString settingsPath = connection->connectionInterface()->path(); if (accessPoint->ssid() == connection->getSsid()) { - const QString service = connection->connectionInterface()->service(); - const QString settingsPath = connection->connectionInterface()->path(); - const QString connectionId = QString::number(qHash(service + ' ' + settingsPath)); + if (!configuredAccessPoints.contains(path)) { + configuredAccessPoints.insert(path,settingsPath); + } QNetworkConfigurationPrivatePointer ptr = - accessPointConfigurations.value(connectionId); + accessPointConfigurations.value(settingsPath); ptr->mutex.lock(); - ptr->state = QNetworkConfiguration::Discovered; + QNetworkConfiguration::StateFlags flag = QNetworkConfiguration::Defined; + ptr->state = (flag | QNetworkConfiguration::Discovered); ptr->mutex.unlock(); locker.unlock(); @@ -585,9 +653,9 @@ void QNetworkManagerEngine::newAccessPoint(const QString &path, const QDBusObjec ptr->name = accessPoint->ssid(); ptr->isValid = true; - ptr->id = QString::number(qHash(objectPath.path())); + ptr->id = path; ptr->type = QNetworkConfiguration::InternetAccessPoint; - if(accessPoint->flags() == NM_802_11_AP_FLAGS_PRIVACY) { + if (accessPoint->flags() == NM_802_11_AP_FLAGS_PRIVACY) { ptr->purpose = QNetworkConfiguration::PrivatePurpose; } else { ptr->purpose = QNetworkConfiguration::PublicPurpose; @@ -601,30 +669,24 @@ void QNetworkManagerEngine::newAccessPoint(const QString &path, const QDBusObjec emit configurationAdded(ptr); } -void QNetworkManagerEngine::removeAccessPoint(const QString &path, - const QDBusObjectPath &objectPath) +void QNetworkManagerEngine::removeAccessPoint(const QString &path) { QMutexLocker locker(&mutex); - - Q_UNUSED(path) - for (int i = 0; i < accessPoints.count(); ++i) { QNetworkManagerInterfaceAccessPoint *accessPoint = accessPoints.at(i); - if (accessPoint->connectionInterface()->path() == objectPath.path()) { + if (accessPoint->connectionInterface()->path() == path) { accessPoints.removeOne(accessPoint); - if (configuredAccessPoints.contains(accessPoint)) { + if (configuredAccessPoints.contains(accessPoint->connectionInterface()->path())) { // find connection and change state to Defined - configuredAccessPoints.removeOne(accessPoint); + configuredAccessPoints.remove(accessPoint->connectionInterface()->path()); for (int i = 0; i < connections.count(); ++i) { QNetworkManagerSettingsConnection *connection = connections.at(i); - if (accessPoint->ssid() == connection->getSsid()) { - const QString service = connection->connectionInterface()->service(); + if (accessPoint->ssid() == connection->getSsid()) {//might not have bssid yet const QString settingsPath = connection->connectionInterface()->path(); - const QString connectionId = - QString::number(qHash(service + ' ' + settingsPath)); + const QString connectionId = settingsPath; QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(connectionId); @@ -640,17 +702,17 @@ void QNetworkManagerEngine::removeAccessPoint(const QString &path, } } else { QNetworkConfigurationPrivatePointer ptr = - accessPointConfigurations.take(QString::number(qHash(objectPath.path()))); + accessPointConfigurations.take(path); if (ptr) { locker.unlock(); + + locker.unlock(); emit configurationRemoved(ptr); locker.relock(); } } - delete accessPoint; - break; } } @@ -666,19 +728,19 @@ void QNetworkManagerEngine::updateAccessPoint(const QMap<QString, QVariant> &map qobject_cast<QNetworkManagerInterfaceAccessPoint *>(sender()); if (!accessPoint) return; - + accessPoint->deleteLater(); for (int i = 0; i < connections.count(); ++i) { QNetworkManagerSettingsConnection *connection = connections.at(i); if (accessPoint->ssid() == connection->getSsid()) { - const QString service = connection->connectionInterface()->service(); const QString settingsPath = connection->connectionInterface()->path(); - const QString connectionId = QString::number(qHash(service + ' ' + settingsPath)); + const QString connectionId = settingsPath; QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(connectionId); ptr->mutex.lock(); - ptr->state = QNetworkConfiguration::Discovered; + QNetworkConfiguration::StateFlags flag = QNetworkConfiguration::Defined; + ptr->state = (flag | QNetworkConfiguration::Discovered); ptr->mutex.unlock(); locker.unlock(); @@ -688,14 +750,16 @@ void QNetworkManagerEngine::updateAccessPoint(const QMap<QString, QVariant> &map } } -QNetworkConfigurationPrivate *QNetworkManagerEngine::parseConnection(const QString &service, - const QString &settingsPath, +QNetworkConfigurationPrivate *QNetworkManagerEngine::parseConnection(const QString &settingsPath, const QNmSettingsMap &map) { + // Q_UNUSED(service); + QMutexLocker locker(&mutex); QNetworkConfigurationPrivate *cpPriv = new QNetworkConfigurationPrivate; cpPriv->name = map.value("connection").value("id").toString(); + cpPriv->isValid = true; - cpPriv->id = QString::number(qHash(service + ' ' + settingsPath)); + cpPriv->id = settingsPath; cpPriv->type = QNetworkConfiguration::InternetAccessPoint; cpPriv->purpose = QNetworkConfiguration::PublicPurpose; @@ -708,15 +772,14 @@ QNetworkConfigurationPrivate *QNetworkManagerEngine::parseConnection(const QStri cpPriv->bearerType = QNetworkConfiguration::BearerEthernet; cpPriv->purpose = QNetworkConfiguration::PublicPurpose; - foreach (const QDBusObjectPath &devicePath, interface->getDevices()) { + foreach (const QDBusObjectPath &devicePath, managerInterface->getDevices()) { QNetworkManagerInterfaceDevice device(devicePath.path()); - if (device.deviceType() == DEVICE_TYPE_802_3_ETHERNET) { + if (device.deviceType() == DEVICE_TYPE_ETHERNET) { QNetworkManagerInterfaceDeviceWired wiredDevice(device.connectionInterface()->path()); if (wiredDevice.carrier()) { cpPriv->state |= QNetworkConfiguration::Discovered; break; } - } } } else if (connectionType == QLatin1String("802-11-wireless")) { @@ -724,35 +787,57 @@ QNetworkConfigurationPrivate *QNetworkManagerEngine::parseConnection(const QStri const QString connectionSsid = map.value("802-11-wireless").value("ssid").toString(); const QString connectionSecurity = map.value("802-11-wireless").value("security").toString(); - if(!connectionSecurity.isEmpty()) { + if (!connectionSecurity.isEmpty()) { cpPriv->purpose = QNetworkConfiguration::PrivatePurpose; } else { cpPriv->purpose = QNetworkConfiguration::PublicPurpose; } for (int i = 0; i < accessPoints.count(); ++i) { - if (connectionSsid == accessPoints.at(i)->ssid()) { + if (connectionSsid == accessPoints.at(i)->ssid() + && map.value("802-11-wireless").value("seen-bssids").toStringList().contains(accessPoints.at(i)->hwAddress())) { cpPriv->state |= QNetworkConfiguration::Discovered; - if (!configuredAccessPoints.contains(accessPoints.at(i))) { - configuredAccessPoints.append(accessPoints.at(i)); + if (!configuredAccessPoints.contains(accessPoints.at(i)->connectionInterface()->path())) { + configuredAccessPoints.insert(accessPoints.at(i)->connectionInterface()->path(),settingsPath); - const QString accessPointId = - QString::number(qHash(accessPoints.at(i)->connectionInterface()->path())); + const QString accessPointId = accessPoints.at(i)->connectionInterface()->path(); QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.take(accessPointId); if (ptr) { - mutex.unlock(); + locker.unlock(); emit configurationRemoved(ptr); - mutex.lock(); + locker.relock(); } } break; } } - } else if (connectionType == "gsm") { - cpPriv->bearerType = QNetworkConfiguration::Bearer2G; - } else if (connectionType == "cdma") { - cpPriv->bearerType = QNetworkConfiguration::BearerCDMA2000; + } else if (connectionType == QLatin1String("gsm")) { + + foreach (const QDBusObjectPath &devicePath, managerInterface->getDevices()) { + QNetworkManagerInterfaceDevice device(devicePath.path()); + + if (device.deviceType() == DEVICE_TYPE_MODEM) { + QNetworkManagerInterfaceDeviceModem deviceModem(device.connectionInterface()->path(),this); + switch (deviceModem.currentCapabilities()) { + case 2: + cpPriv->bearerType = QNetworkConfiguration::Bearer2G; + break; + case 4: + cpPriv->bearerType = QNetworkConfiguration::Bearer3G; + break; + case 8: + cpPriv->bearerType = QNetworkConfiguration::Bearer4G; + break; + default: + cpPriv->bearerType = QNetworkConfiguration::BearerUnknown; + break; + }; + } + } + + cpPriv->purpose = QNetworkConfiguration::PrivatePurpose; + cpPriv->state |= QNetworkConfiguration::Discovered; } return cpPriv; @@ -762,12 +847,7 @@ QNetworkManagerSettingsConnection *QNetworkManagerEngine::connectionFromId(const { for (int i = 0; i < connections.count(); ++i) { QNetworkManagerSettingsConnection *connection = connections.at(i); - const QString service = connection->connectionInterface()->service(); - const QString settingsPath = connection->connectionInterface()->path(); - - const QString identifier = QString::number(qHash(service + ' ' + settingsPath)); - - if (id == identifier) + if (id == connection->connectionInterface()->path()) return connection; } @@ -789,8 +869,7 @@ QNetworkSession::State QNetworkManagerEngine::sessionStateForId(const QString &i foreach (const QString &acPath, activeConnections.keys()) { QNetworkManagerConnectionActive *activeConnection = activeConnections.value(acPath); - const QString identifier = QString::number(qHash(activeConnection->serviceName() + ' ' + - activeConnection->connection().path())); + const QString identifier = activeConnection->connection().path(); if (id == identifier) { switch (activeConnection->state()) { @@ -884,7 +963,8 @@ quint64 QNetworkManagerEngine::startTime(const QString &id) QNetworkConfigurationManager::Capabilities QNetworkManagerEngine::capabilities() const { return QNetworkConfigurationManager::ForcedRoaming | - QNetworkConfigurationManager::CanStartAndStopInterfaces; + QNetworkConfigurationManager::DataStatistics | + QNetworkConfigurationManager::CanStartAndStopInterfaces; } QNetworkSessionPrivate *QNetworkManagerEngine::createSessionBackend() diff --git a/src/plugins/bearer/networkmanager/qnetworkmanagerengine.h b/src/plugins/bearer/networkmanager/qnetworkmanagerengine.h index 19a569d01e..ab1cfea71e 100644 --- a/src/plugins/bearer/networkmanager/qnetworkmanagerengine.h +++ b/src/plugins/bearer/networkmanager/qnetworkmanagerengine.h @@ -93,36 +93,37 @@ private Q_SLOTS: const QMap<QString, QVariant> &properties); void activeConnectionPropertiesChanged(const QString &path, const QMap<QString, QVariant> &properties); - void devicePropertiesChanged(const QString &path, - const QMap<QString, QVariant> &properties); + void devicePropertiesChanged(const QString &path, quint32); void deviceAdded(const QDBusObjectPath &path); void deviceRemoved(const QDBusObjectPath &path); void newConnection(const QDBusObjectPath &path, QNetworkManagerSettings *settings = 0); void removeConnection(const QString &path); - void updateConnection(const QNmSettingsMap &settings); + void updateConnection(); void activationFinished(QDBusPendingCallWatcher *watcher); + void deviceConnectionsChanged(const QStringList &activeConnectionsList); - void newAccessPoint(const QString &path, const QDBusObjectPath &objectPath); - void removeAccessPoint(const QString &path, const QDBusObjectPath &objectPath); + void newAccessPoint(const QString &path); + void removeAccessPoint(const QString &path); void updateAccessPoint(const QMap<QString, QVariant> &map); + void scanFinished(); private: - QNetworkConfigurationPrivate *parseConnection(const QString &service, - const QString &settingsPath, + QNetworkConfigurationPrivate *parseConnection(const QString &settingsPath, const QNmSettingsMap &map); QNetworkManagerSettingsConnection *connectionFromId(const QString &id) const; -private: - QNetworkManagerInterface *interface; + QNetworkManagerInterface *managerInterface; QNetworkManagerSettings *systemSettings; QNetworkManagerSettings *userSettings; QHash<QString, QNetworkManagerInterfaceDeviceWireless *> wirelessDevices; QHash<QString, QNetworkManagerConnectionActive *> activeConnections; QList<QNetworkManagerSettingsConnection *> connections; QList<QNetworkManagerInterfaceAccessPoint *> accessPoints; - QList<QNetworkManagerInterfaceAccessPoint *> configuredAccessPoints; + QHash<QString, QNetworkManagerInterfaceDevice *> interfaceDevices; + + QMap<QString,QString> configuredAccessPoints; //ap, settings path }; QT_END_NAMESPACE diff --git a/src/plugins/bearer/networkmanager/qnetworkmanagerservice.cpp b/src/plugins/bearer/networkmanager/qnetworkmanagerservice.cpp index d249d85c4d..f249ac6100 100644 --- a/src/plugins/bearer/networkmanager/qnetworkmanagerservice.cpp +++ b/src/plugins/bearer/networkmanager/qnetworkmanagerservice.cpp @@ -97,21 +97,21 @@ bool QNetworkManagerInterface::setConnections() QDBusConnection dbusConnection = QDBusConnection::systemBus(); bool allOk = false; - if (!dbusConnection.connect(QLatin1String(NM_DBUS_SERVICE), + if (dbusConnection.connect(QLatin1String(NM_DBUS_SERVICE), QLatin1String(NM_DBUS_PATH), QLatin1String(NM_DBUS_INTERFACE), QLatin1String("PropertiesChanged"), nmDBusHelper,SLOT(slotPropertiesChanged(QMap<QString,QVariant>)))) { allOk = true; } - if (!dbusConnection.connect(QLatin1String(NM_DBUS_SERVICE), + if (dbusConnection.connect(QLatin1String(NM_DBUS_SERVICE), QLatin1String(NM_DBUS_PATH), QLatin1String(NM_DBUS_INTERFACE), QLatin1String("DeviceAdded"), this,SIGNAL(deviceAdded(QDBusObjectPath)))) { allOk = true; } - if (!dbusConnection.connect(QLatin1String(NM_DBUS_SERVICE), + if (dbusConnection.connect(QLatin1String(NM_DBUS_SERVICE), QLatin1String(NM_DBUS_PATH), QLatin1String(NM_DBUS_INTERFACE), QLatin1String("DeviceRemoved"), @@ -133,18 +133,17 @@ QList <QDBusObjectPath> QNetworkManagerInterface::getDevices() const return reply.value(); } -void QNetworkManagerInterface::activateConnection( const QString &serviceName, +void QNetworkManagerInterface::activateConnection( const QString &, QDBusObjectPath connectionPath, QDBusObjectPath devicePath, QDBusObjectPath specificObject) { QDBusPendingCall pendingCall = d->connectionInterface->asyncCall(QLatin1String("ActivateConnection"), - QVariant(serviceName), QVariant::fromValue(connectionPath), QVariant::fromValue(devicePath), QVariant::fromValue(specificObject)); - QDBusPendingCallWatcher *callWatcher = new QDBusPendingCallWatcher(pendingCall, this); + QDBusPendingCallWatcher *callWatcher = new QDBusPendingCallWatcher(pendingCall); connect(callWatcher, SIGNAL(finished(QDBusPendingCallWatcher*)), this, SIGNAL(activationFinished(QDBusPendingCallWatcher*))); } @@ -323,18 +322,31 @@ bool QNetworkManagerInterfaceDevice::setConnections() if(!isValid() ) return false; - bool allOk = false; + bool allOk = true; delete nmDBusHelper; nmDBusHelper = new QNmDBusHelper(this); connect(nmDBusHelper,SIGNAL(pathForStateChanged(QString,quint32)), this, SIGNAL(stateChanged(QString,quint32))); + if (QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE), d->path, QLatin1String(NM_DBUS_INTERFACE_DEVICE), QLatin1String("StateChanged"), nmDBusHelper,SLOT(deviceStateChanged(quint32)))) { - allOk = true; + allOk = false; } + + connect(nmDBusHelper, SIGNAL(pathForConnectionsChanged(QStringList)), + this,SIGNAL(connectionsChanged(QStringList))); + + if (QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE), + d->path, + QLatin1String(NM_DBUS_INTERFACE_ACCESS_POINT), + QLatin1String("PropertiesChanged"), + nmDBusHelper,SLOT(slotPropertiesChanged(QMap<QString,QVariant>))) ) { + allOk = false; + } + return allOk; } @@ -415,18 +427,18 @@ bool QNetworkManagerInterfaceDeviceWired::setConnections() if(!isValid() ) return false; - bool allOk = false; + bool allOk = true; delete nmDBusHelper; nmDBusHelper = new QNmDBusHelper(this); connect(nmDBusHelper, SIGNAL(pathForPropertiesChanged(QString,QMap<QString,QVariant>)), this,SIGNAL(propertiesChanged(QString,QMap<QString,QVariant>))); - if (QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE), + if (!QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE), d->path, QLatin1String(NM_DBUS_INTERFACE_DEVICE_WIRED), QLatin1String("PropertiesChanged"), nmDBusHelper,SLOT(slotPropertiesChanged(QMap<QString,QVariant>))) ) { - allOk = true; + allOk = false; } return allOk; } @@ -492,44 +504,50 @@ bool QNetworkManagerInterfaceDeviceWireless::setConnections() return false; QDBusConnection dbusConnection = QDBusConnection::systemBus(); - bool allOk = false; + bool allOk = true; delete nmDBusHelper; nmDBusHelper = new QNmDBusHelper(this); connect(nmDBusHelper, SIGNAL(pathForPropertiesChanged(QString,QMap<QString,QVariant>)), this,SIGNAL(propertiesChanged(QString,QMap<QString,QVariant>))); - connect(nmDBusHelper, SIGNAL(pathForAccessPointAdded(QString,QDBusObjectPath)), - this,SIGNAL(accessPointAdded(QString,QDBusObjectPath))); + connect(nmDBusHelper, SIGNAL(pathForAccessPointAdded(QString)), + this,SIGNAL(accessPointAdded(QString))); - connect(nmDBusHelper, SIGNAL(pathForAccessPointRemoved(QString,QDBusObjectPath)), - this,SIGNAL(accessPointRemoved(QString,QDBusObjectPath))); + connect(nmDBusHelper, SIGNAL(pathForAccessPointRemoved(QString)), + this,SIGNAL(accessPointRemoved(QString))); - if(!dbusConnection.connect(QLatin1String(NM_DBUS_SERVICE), + if (!dbusConnection.connect(QLatin1String(NM_DBUS_SERVICE), d->path, QLatin1String(NM_DBUS_INTERFACE_DEVICE_WIRELESS), QLatin1String("AccessPointAdded"), nmDBusHelper, SLOT(slotAccessPointAdded(QDBusObjectPath)))) { - allOk = true; + allOk = false; } - if(!dbusConnection.connect(QLatin1String(NM_DBUS_SERVICE), + if (!dbusConnection.connect(QLatin1String(NM_DBUS_SERVICE), d->path, QLatin1String(NM_DBUS_INTERFACE_DEVICE_WIRELESS), QLatin1String("AccessPointRemoved"), nmDBusHelper, SLOT(slotAccessPointRemoved(QDBusObjectPath)))) { - allOk = true; + allOk = false; } - if(!dbusConnection.connect(QLatin1String(NM_DBUS_SERVICE), + if (!dbusConnection.connect(QLatin1String(NM_DBUS_SERVICE), d->path, QLatin1String(NM_DBUS_INTERFACE_DEVICE_WIRELESS), QLatin1String("PropertiesChanged"), nmDBusHelper,SLOT(slotPropertiesChanged(QMap<QString,QVariant>)))) { - allOk = true; + allOk = false; + } + if (!dbusConnection.connect(QLatin1String(NM_DBUS_SERVICE), + d->path, + QLatin1String(NM_DBUS_INTERFACE_DEVICE_WIRELESS), + QLatin1String("ScanDone"), + this, SLOT(scanIsDone()))) { + allOk = false; } - return allOk; } @@ -569,6 +587,89 @@ quint32 QNetworkManagerInterfaceDeviceWireless::wirelessCapabilities() const return d->connectionInterface->property("WirelelessCapabilities").toUInt(); } +void QNetworkManagerInterfaceDeviceWireless::scanIsDone() +{ + Q_EMIT scanDone(); +} + +void QNetworkManagerInterfaceDeviceWireless::requestScan() +{ + d->connectionInterface->asyncCall(QLatin1String("RequestScan")); +} + + +class QNetworkManagerInterfaceDeviceModemPrivate +{ +public: + QDBusInterface *connectionInterface; + QString path; + bool valid; +}; + +QNetworkManagerInterfaceDeviceModem::QNetworkManagerInterfaceDeviceModem(const QString &ifaceDevicePath, QObject *parent) + : QObject(parent), nmDBusHelper(0) +{ + d = new QNetworkManagerInterfaceDeviceModemPrivate(); + d->path = ifaceDevicePath; + d->connectionInterface = new QDBusInterface(QLatin1String(NM_DBUS_SERVICE), + d->path, + QLatin1String(NM_DBUS_INTERFACE_DEVICE_MODEM), + QDBusConnection::systemBus(), parent); + if (!d->connectionInterface->isValid()) { + d->valid = false; + return; + } + d->valid = true; +} + +QNetworkManagerInterfaceDeviceModem::~QNetworkManagerInterfaceDeviceModem() +{ + delete d->connectionInterface; + delete d; +} + +bool QNetworkManagerInterfaceDeviceModem::isValid() +{ + + return d->valid; +} + +bool QNetworkManagerInterfaceDeviceModem::setConnections() +{ + if (!isValid() ) + return false; + + bool allOk = true; + + delete nmDBusHelper; + nmDBusHelper = new QNmDBusHelper(this); + connect(nmDBusHelper, SIGNAL(pathForPropertiesChanged(QString,QMap<QString,QVariant>)), + this,SIGNAL(propertiesChanged(QString,QMap<QString,QVariant>))); + if (!QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE), + d->path, + QLatin1String(NM_DBUS_INTERFACE_DEVICE_MODEM), + QLatin1String("PropertiesChanged"), + nmDBusHelper,SLOT(slotDevicePropertiesChanged(QMap<QString,QVariant>))) ) { + allOk = false; + } + return allOk; +} + +QDBusInterface *QNetworkManagerInterfaceDeviceModem::connectionInterface() const +{ + return d->connectionInterface; +} + +quint32 QNetworkManagerInterfaceDeviceModem::modemCapabilities() const +{ + return d->connectionInterface->property("ModemCapabilities").toUInt(); +} + +quint32 QNetworkManagerInterfaceDeviceModem::currentCapabilities() const +{ + return d->connectionInterface->property("CurrentCapabilities").toUInt(); +} + class QNetworkManagerSettingsPrivate { public: @@ -606,12 +707,14 @@ bool QNetworkManagerSettings::isValid() bool QNetworkManagerSettings::setConnections() { - bool allOk = false; + bool allOk = true; - if (!QDBusConnection::systemBus().connect(d->path, QLatin1String(NM_DBUS_PATH_SETTINGS), - QLatin1String(NM_DBUS_IFACE_SETTINGS), QLatin1String("NewConnection"), - this, SIGNAL(newConnection(QDBusObjectPath)))) { - allOk = true; + if (!QDBusConnection::systemBus().connect(d->path, + QLatin1String(NM_DBUS_PATH_SETTINGS), + QLatin1String(NM_DBUS_IFACE_SETTINGS), + QLatin1String("NewConnection"), + this, SIGNAL(newConnection(QDBusObjectPath)))) { + allOk = false; } return allOk; @@ -623,6 +726,14 @@ QList <QDBusObjectPath> QNetworkManagerSettings::listConnections() return reply.value(); } +QString QNetworkManagerSettings::getConnectionByUuid(const QString &uuid) +{ + QList<QVariant> argumentList; + argumentList << QVariant::fromValue(uuid); + QDBusReply<QDBusObjectPath > reply = d->connectionInterface->callWithArgumentList(QDBus::Block,QLatin1String("GetConnectionByUuid"), argumentList); + return reply.value().path(); +} + QDBusInterface *QNetworkManagerSettings::connectionInterface() const { return d->connectionInterface; @@ -676,13 +787,13 @@ bool QNetworkManagerSettingsConnection::setConnections() return false; QDBusConnection dbusConnection = QDBusConnection::systemBus(); - bool allOk = false; - if(!dbusConnection.connect(d->service, d->path, - QLatin1String(NM_DBUS_IFACE_SETTINGS_CONNECTION), QLatin1String("Updated"), - this, SIGNAL(updated(QNmSettingsMap)))) { - allOk = true; - } else { - QDBusError error = dbusConnection.lastError(); + bool allOk = true; + if (!dbusConnection.connect(d->service, + d->path, + QLatin1String(NM_DBUS_IFACE_SETTINGS_CONNECTION), + QLatin1String("Updated"), + this, SIGNAL(updated()))) { + allOk = false; } delete nmDBusHelper; @@ -690,12 +801,13 @@ bool QNetworkManagerSettingsConnection::setConnections() connect(nmDBusHelper, SIGNAL(pathForSettingsRemoved(QString)), this,SIGNAL(removed(QString))); - if (!dbusConnection.connect(d->service, d->path, - QLatin1String(NM_DBUS_IFACE_SETTINGS_CONNECTION), QLatin1String("Removed"), - nmDBusHelper, SIGNAL(slotSettingsRemoved()))) { - allOk = true; + if (!dbusConnection.connect(d->service, + d->path, + QLatin1String(NM_DBUS_IFACE_SETTINGS_CONNECTION), + QLatin1String("Removed"), + nmDBusHelper, SIGNAL(slotSettingsRemoved()))) { + allOk = false; } - return allOk; } @@ -717,9 +829,9 @@ NMDeviceType QNetworkManagerSettingsConnection::getType() d->settingsMap.value(QLatin1String("connection")).value(QLatin1String("type")).toString(); if (devType == QLatin1String("802-3-ethernet")) - return DEVICE_TYPE_802_3_ETHERNET; + return DEVICE_TYPE_ETHERNET; else if (devType == QLatin1String("802-11-wireless")) - return DEVICE_TYPE_802_11_WIRELESS; + return DEVICE_TYPE_WIFI; else return DEVICE_TYPE_UNKNOWN; } @@ -766,10 +878,10 @@ QString QNetworkManagerSettingsConnection::getMacAddress() { NMDeviceType type = getType(); - if (type == DEVICE_TYPE_802_3_ETHERNET) { + if (type == DEVICE_TYPE_ETHERNET) { return d->settingsMap.value(QLatin1String("802-3-ethernet")) .value(QLatin1String("mac-address")).toString(); - } else if (type == DEVICE_TYPE_802_11_WIRELESS) { + } else if (type == DEVICE_TYPE_WIFI) { return d->settingsMap.value(QLatin1String("802-11-wireless")) .value(QLatin1String("mac-address")).toString(); } else { @@ -779,7 +891,7 @@ QString QNetworkManagerSettingsConnection::getMacAddress() QStringList QNetworkManagerSettingsConnection::getSeenBssids() { - if (getType() == DEVICE_TYPE_802_11_WIRELESS) { + if (getType() == DEVICE_TYPE_WIFI) { return d->settingsMap.value(QLatin1String("802-11-wireless")) .value(QLatin1String("seen-bssids")).toStringList(); } else { @@ -795,7 +907,7 @@ public: bool valid; }; -QNetworkManagerConnectionActive::QNetworkManagerConnectionActive( const QString &activeConnectionObjectPath, QObject *parent) +QNetworkManagerConnectionActive::QNetworkManagerConnectionActive(const QString &activeConnectionObjectPath, QObject *parent) : QObject(parent), nmDBusHelper(0) { d = new QNetworkManagerConnectionActivePrivate(); @@ -827,17 +939,18 @@ bool QNetworkManagerConnectionActive::setConnections() if(!isValid() ) return false; - bool allOk = false; + bool allOk = true; delete nmDBusHelper; nmDBusHelper = new QNmDBusHelper(this); connect(nmDBusHelper, SIGNAL(pathForPropertiesChanged(QString,QMap<QString,QVariant>)), this,SIGNAL(propertiesChanged(QString,QMap<QString,QVariant>))); - if (QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE), + + if (!QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE), d->path, QLatin1String(NM_DBUS_INTERFACE_ACTIVE_CONNECTION), QLatin1String("PropertiesChanged"), - nmDBusHelper,SLOT(slotPropertiesChanged(QMap<QString,QVariant>))) ) { - allOk = true; + nmDBusHelper,SLOT(activeConnectionPropertiesChanged(QMap<QString,QVariant>))) ) { + allOk = false; } return allOk; @@ -848,11 +961,6 @@ QDBusInterface *QNetworkManagerConnectionActive::connectionInterface() const return d->connectionInterface; } -QString QNetworkManagerConnectionActive::serviceName() const -{ - return d->connectionInterface->property("ServiceName").toString(); -} - QDBusObjectPath QNetworkManagerConnectionActive::connection() const { QVariant prop = d->connectionInterface->property("Connection"); diff --git a/src/plugins/bearer/networkmanager/qnetworkmanagerservice.h b/src/plugins/bearer/networkmanager/qnetworkmanagerservice.h index 6b15642386..11ddaf7088 100644 --- a/src/plugins/bearer/networkmanager/qnetworkmanagerservice.h +++ b/src/plugins/bearer/networkmanager/qnetworkmanagerservice.h @@ -64,31 +64,32 @@ typedef enum NMDeviceType { DEVICE_TYPE_UNKNOWN = 0, - DEVICE_TYPE_802_3_ETHERNET, - DEVICE_TYPE_802_11_WIRELESS, - DEVICE_TYPE_GSM, - DEVICE_TYPE_CDMA + DEVICE_TYPE_ETHERNET, + DEVICE_TYPE_WIFI, + DEVICE_TYPE_MODEM = 8 } NMDeviceType; typedef enum { NM_DEVICE_STATE_UNKNOWN = 0, - NM_DEVICE_STATE_UNMANAGED, - NM_DEVICE_STATE_UNAVAILABLE, - NM_DEVICE_STATE_DISCONNECTED, - NM_DEVICE_STATE_PREPARE, - NM_DEVICE_STATE_CONFIG, - NM_DEVICE_STATE_NEED_AUTH, - NM_DEVICE_STATE_IP_CONFIG, - NM_DEVICE_STATE_ACTIVATED, - NM_DEVICE_STATE_FAILED + NM_DEVICE_STATE_UNMANAGED = 10, + NM_DEVICE_STATE_UNAVAILABLE = 20, + NM_DEVICE_STATE_DISCONNECTED = 30, + NM_DEVICE_STATE_PREPARE = 40, + NM_DEVICE_STATE_CONFIG = 50, + NM_DEVICE_STATE_NEED_AUTH = 60, + NM_DEVICE_STATE_IP_CONFIG = 70, + NM_DEVICE_STATE_ACTIVATED = 100, + NM_DEVICE_STATE_DEACTIVATING = 110, + NM_DEVICE_STATE_FAILED = 120 } NMDeviceState; typedef enum { NM_ACTIVE_CONNECTION_STATE_UNKNOWN = 0, NM_ACTIVE_CONNECTION_STATE_ACTIVATING, - NM_ACTIVE_CONNECTION_STATE_ACTIVATED + NM_ACTIVE_CONNECTION_STATE_ACTIVATED, + NM_ACTIVE_CONNECTION_STATE_DEACTIVATED } NMActiveConnectionState; #define NM_DBUS_SERVICE "org.freedesktop.NetworkManager" @@ -98,13 +99,14 @@ typedef enum #define NM_DBUS_INTERFACE_DEVICE NM_DBUS_INTERFACE ".Device" #define NM_DBUS_INTERFACE_DEVICE_WIRED NM_DBUS_INTERFACE_DEVICE ".Wired" #define NM_DBUS_INTERFACE_DEVICE_WIRELESS NM_DBUS_INTERFACE_DEVICE ".Wireless" +#define NM_DBUS_INTERFACE_DEVICE_MODEM NM_DBUS_INTERFACE_DEVICE ".Modem" #define NM_DBUS_PATH_ACCESS_POINT NM_DBUS_PATH "/AccessPoint" #define NM_DBUS_INTERFACE_ACCESS_POINT NM_DBUS_INTERFACE ".AccessPoint" -#define NM_DBUS_PATH_SETTINGS "/org/freedesktop/NetworkManagerSettings" +#define NM_DBUS_PATH_SETTINGS "/org/freedesktop/NetworkManager/Settings" -#define NM_DBUS_IFACE_SETTINGS_CONNECTION "org.freedesktop.NetworkManagerSettings.Connection" -#define NM_DBUS_IFACE_SETTINGS "org.freedesktop.NetworkManagerSettings" +#define NM_DBUS_IFACE_SETTINGS_CONNECTION "org.freedesktop.NetworkManager.Settings.Connection" +#define NM_DBUS_IFACE_SETTINGS "org.freedesktop.NetworkManager.Settings" #define NM_DBUS_INTERFACE_ACTIVE_CONNECTION NM_DBUS_INTERFACE ".Connection.Active" #define NM_DBUS_INTERFACE_IP4_CONFIG NM_DBUS_INTERFACE ".IP4Config" @@ -256,7 +258,8 @@ public: Q_SIGNALS: void stateChanged(const QString &, quint32); - + void propertiesChanged(const QString &, QMap<QString,QVariant>); + void connectionsChanged(QStringList); private: QNetworkManagerInterfaceDevicePrivate *d; QNmDBusHelper *nmDBusHelper; @@ -320,15 +323,55 @@ public: bool setConnections(); bool isValid(); + void requestScan(); Q_SIGNALS: void propertiesChanged( const QString &, QMap<QString,QVariant>); - void accessPointAdded(const QString &,QDBusObjectPath); - void accessPointRemoved(const QString &,QDBusObjectPath); + void accessPointAdded(const QString &); + void accessPointRemoved(const QString &); + void scanDone(); +private Q_SLOTS: + void scanIsDone(); private: QNetworkManagerInterfaceDeviceWirelessPrivate *d; QNmDBusHelper *nmDBusHelper; }; +class QNetworkManagerInterfaceDeviceModemPrivate; +class QNetworkManagerInterfaceDeviceModem : public QObject +{ + Q_OBJECT + +public: + + enum ModemCapability { + None = 0x0, + Pots = 0x1, + Cmda_Edvo = 0x2, + Gsm_Umts = 0x4, + Lte = 0x08 + }; + + explicit QNetworkManagerInterfaceDeviceModem(const QString &ifaceDevicePath, + QObject *parent = 0); + ~QNetworkManagerInterfaceDeviceModem(); + + QDBusObjectPath path() const; + QDBusInterface *connectionInterface() const; + + bool setConnections(); + bool isValid(); + + quint32 modemCapabilities() const; + quint32 currentCapabilities() const; + +Q_SIGNALS: + void propertiesChanged( const QString &, QMap<QString,QVariant>); +private: + QNetworkManagerInterfaceDeviceModemPrivate *d; + QNmDBusHelper *nmDBusHelper; +}; + + class QNetworkManagerSettingsPrivate; class QNetworkManagerSettings : public QObject { @@ -341,6 +384,7 @@ public: QDBusInterface *connectionInterface() const; QList <QDBusObjectPath> listConnections(); + QString getConnectionByUuid(const QString &uuid); bool setConnections(); bool isValid(); @@ -375,7 +419,7 @@ public: Q_SIGNALS: - void updated(const QNmSettingsMap &settings); + void updated(); void removed(const QString &path); private: diff --git a/src/plugins/bearer/networkmanager/qnmdbushelper.cpp b/src/plugins/bearer/networkmanager/qnmdbushelper.cpp index a2e055d784..0decfd78b9 100644 --- a/src/plugins/bearer/networkmanager/qnmdbushelper.cpp +++ b/src/plugins/bearer/networkmanager/qnmdbushelper.cpp @@ -60,7 +60,7 @@ QNmDBusHelper::~QNmDBusHelper() void QNmDBusHelper::deviceStateChanged(quint32 state) { QDBusMessage msg = this->message(); - if(state == NM_DEVICE_STATE_ACTIVATED + if (state == NM_DEVICE_STATE_ACTIVATED || state == NM_DEVICE_STATE_DISCONNECTED || state == NM_DEVICE_STATE_UNAVAILABLE || state == NM_DEVICE_STATE_FAILED) { @@ -70,18 +70,14 @@ void QNmDBusHelper::deviceStateChanged(quint32 state) void QNmDBusHelper::slotAccessPointAdded(QDBusObjectPath path) { - if(path.path().length() > 2) { - QDBusMessage msg = this->message(); - emit pathForAccessPointAdded(msg.path(), path); - } + if (path.path().length() > 2) + emit pathForAccessPointAdded(path.path()); } void QNmDBusHelper::slotAccessPointRemoved(QDBusObjectPath path) { - if(path.path().length() > 2) { - QDBusMessage msg = this->message(); - emit pathForAccessPointRemoved(msg.path(), path); - } + if (path.path().length() > 2) + emit pathForAccessPointRemoved(path.path()); } void QNmDBusHelper::slotPropertiesChanged(QMap<QString,QVariant> map) @@ -90,23 +86,29 @@ void QNmDBusHelper::slotPropertiesChanged(QMap<QString,QVariant> map) QMapIterator<QString, QVariant> i(map); while (i.hasNext()) { i.next(); - if( i.key() == "State") { //state only applies to device interfaces + if (i.key() == QStringLiteral("State")) { quint32 state = i.value().toUInt(); - if( state == NM_DEVICE_STATE_ACTIVATED + if (state == NM_DEVICE_STATE_ACTIVATED || state == NM_DEVICE_STATE_DISCONNECTED || state == NM_DEVICE_STATE_UNAVAILABLE || state == NM_DEVICE_STATE_FAILED) { - emit pathForPropertiesChanged( msg.path(), map); + emit pathForPropertiesChanged(msg.path(), map); } - } else if( i.key() == "ActiveAccessPoint") { + } else if (i.key() == QStringLiteral("ActiveAccessPoint")) { emit pathForPropertiesChanged(msg.path(), map); - // qWarning() << __PRETTY_FUNCTION__ << i.key() << ": " << i.value().value<QDBusObjectPath>().path(); - // } else if( i.key() == "Strength") - // qWarning() << __PRETTY_FUNCTION__ << i.key() << ": " << i.value().toUInt(); - // else - // qWarning() << __PRETTY_FUNCTION__ << i.key() << ": " << i.value(); - } else if (i.key() == "ActiveConnections") { + } else if (i.key() == QStringLiteral("ActiveConnections")) { emit pathForPropertiesChanged(msg.path(), map); + } else if (i.key() == QStringLiteral("AvailableConnections")) { + const QDBusArgument &dbusArgs = i.value().value<QDBusArgument>(); + QDBusObjectPath path; + QStringList paths; + dbusArgs.beginArray(); + while (!dbusArgs.atEnd()) { + dbusArgs >> path; + paths << path.path(); + } + dbusArgs.endArray(); + emit pathForConnectionsChanged(paths); } } } @@ -117,6 +119,22 @@ void QNmDBusHelper::slotSettingsRemoved() emit pathForSettingsRemoved(msg.path()); } +void QNmDBusHelper::activeConnectionPropertiesChanged(QMap<QString,QVariant> map) +{ + QDBusMessage msg = this->message(); + QMapIterator<QString, QVariant> i(map); + while (i.hasNext()) { + i.next(); + if (i.key() == QStringLiteral("State")) { + quint32 state = i.value().toUInt(); + if (state == NM_ACTIVE_CONNECTION_STATE_ACTIVATED + || state == NM_ACTIVE_CONNECTION_STATE_DEACTIVATED) { + emit pathForPropertiesChanged(msg.path(), map); + } + } + } +} + QT_END_NAMESPACE #endif // QT_NO_DBUS diff --git a/src/plugins/bearer/networkmanager/qnmdbushelper.h b/src/plugins/bearer/networkmanager/qnmdbushelper.h index cd5e8a3494..e224af87f1 100644 --- a/src/plugins/bearer/networkmanager/qnmdbushelper.h +++ b/src/plugins/bearer/networkmanager/qnmdbushelper.h @@ -51,17 +51,19 @@ class QNmDBusHelper: public QObject, protected QDBusContext public slots: void deviceStateChanged(quint32); - void slotAccessPointAdded( QDBusObjectPath ); - void slotAccessPointRemoved( QDBusObjectPath ); - void slotPropertiesChanged( QMap<QString,QVariant>); + void slotAccessPointAdded(QDBusObjectPath); + void slotAccessPointRemoved(QDBusObjectPath); + void slotPropertiesChanged(QMap<QString,QVariant>); void slotSettingsRemoved(); + void activeConnectionPropertiesChanged(QMap<QString,QVariant>); Q_SIGNALS: void pathForStateChanged(const QString &, quint32); - void pathForAccessPointAdded(const QString &, QDBusObjectPath ); - void pathForAccessPointRemoved(const QString &, QDBusObjectPath ); + void pathForAccessPointAdded(const QString &); + void pathForAccessPointRemoved(const QString &); void pathForPropertiesChanged(const QString &, QMap<QString,QVariant>); void pathForSettingsRemoved(const QString &); + void pathForConnectionsChanged(const QStringList &pathsList); }; QT_END_NAMESPACE |