Warning, file /frameworks/networkmanager-qt/src/wirelessdevice.cpp was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).

0001 /*
0002     SPDX-FileCopyrightText: 2008, 2011 Will Stephenson <wstephenson@kde.org>
0003     SPDX-FileCopyrightText: 2013 Daniel Nicoletti <dantti12@gmail.com>
0004     SPDX-FileCopyrightText: 2013 Jan Grulich <jgrulich@redhat.com>
0005 
0006     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0007 */
0008 
0009 #include "wirelessdevice.h"
0010 #include "wirelessdevice_p.h"
0011 
0012 #undef signals
0013 #include <libnm/NetworkManager.h>
0014 #define signals Q_SIGNALS
0015 
0016 #include "manager_p.h"
0017 
0018 #include "nmdebug.h"
0019 #include "utils.h"
0020 
0021 NetworkManager::WirelessDevicePrivate::WirelessDevicePrivate(const QString &path, WirelessDevice *q)
0022     : DevicePrivate(path, q)
0023 #ifdef NMQT_STATIC
0024     , wirelessIface(NetworkManagerPrivate::DBUS_SERVICE, path, QDBusConnection::sessionBus())
0025 #else
0026     , wirelessIface(NetworkManagerPrivate::DBUS_SERVICE, path, QDBusConnection::systemBus())
0027 #endif
0028     , bitRate(0)
0029 {
0030 }
0031 
0032 NetworkManager::WirelessDevice::WirelessDevice(const QString &path, QObject *parent)
0033     : Device(*new WirelessDevicePrivate(path, this), parent)
0034 {
0035     Q_D(WirelessDevice);
0036 
0037     qDBusRegisterMetaType<QList<QDBusObjectPath>>();
0038 
0039 #ifdef NMQT_STATIC
0040     connect(&d->wirelessIface, &OrgFreedesktopNetworkManagerDeviceWirelessInterface::PropertiesChanged, d, &WirelessDevicePrivate::propertiesChanged);
0041 #endif
0042 
0043     connect(&d->wirelessIface, &OrgFreedesktopNetworkManagerDeviceWirelessInterface::AccessPointAdded, d, &WirelessDevicePrivate::accessPointAdded);
0044     connect(&d->wirelessIface, &OrgFreedesktopNetworkManagerDeviceWirelessInterface::AccessPointRemoved, d, &WirelessDevicePrivate::accessPointRemoved);
0045 
0046     const QList<QDBusObjectPath> aps = d->wirelessIface.accessPoints();
0047     // qCDebug(NMQT) << "AccessPoint list";
0048     for (const QDBusObjectPath &op : aps) {
0049         // qCDebug(NMQT) << "  " << op.path();
0050         d->accessPointAdded(op);
0051     }
0052 
0053     // Get all WirelessDevices's properties at once
0054     QVariantMap initialProperties = NetworkManagerPrivate::retrieveInitialProperties(d->wirelessIface.staticInterfaceName(), path);
0055     if (!initialProperties.isEmpty()) {
0056         d->propertiesChanged(initialProperties);
0057     }
0058 
0059 }
0060 
0061 NetworkManager::WirelessDevice::~WirelessDevice()
0062 {
0063 }
0064 
0065 NetworkManager::Device::Type NetworkManager::WirelessDevice::type() const
0066 {
0067     return NetworkManager::Device::Wifi;
0068 }
0069 
0070 QStringList NetworkManager::WirelessDevice::accessPoints() const
0071 {
0072     Q_D(const WirelessDevice);
0073     return d->apMap.keys();
0074 }
0075 
0076 QDBusPendingReply<> NetworkManager::WirelessDevice::requestScan(const QVariantMap &options)
0077 {
0078     Q_D(WirelessDevice);
0079     d->lastRequestScan = QDateTime::currentDateTime();
0080     return d->wirelessIface.RequestScan(options);
0081 }
0082 
0083 NetworkManager::AccessPoint::Ptr NetworkManager::WirelessDevice::activeAccessPoint() const
0084 {
0085     Q_D(const WirelessDevice);
0086     return d->activeAccessPoint;
0087 }
0088 
0089 QString NetworkManager::WirelessDevice::hardwareAddress() const
0090 {
0091     Q_D(const WirelessDevice);
0092     return d->hardwareAddress;
0093 }
0094 
0095 QString NetworkManager::WirelessDevice::permanentHardwareAddress() const
0096 {
0097     Q_D(const WirelessDevice);
0098     return d->permanentHardwareAddress;
0099 }
0100 
0101 NetworkManager::WirelessDevice::OperationMode NetworkManager::WirelessDevice::mode() const
0102 {
0103     Q_D(const WirelessDevice);
0104     return d->mode;
0105 }
0106 
0107 int NetworkManager::WirelessDevice::bitRate() const
0108 {
0109     Q_D(const WirelessDevice);
0110     return d->bitRate;
0111 }
0112 
0113 QDateTime NetworkManager::WirelessDevice::lastScan() const
0114 {
0115     Q_D(const WirelessDevice);
0116     return d->lastScan;
0117 }
0118 
0119 QDateTime NetworkManager::WirelessDevice::lastRequestScan() const
0120 {
0121     Q_D(const WirelessDevice);
0122     return d->lastRequestScan;
0123 }
0124 
0125 NetworkManager::WirelessDevice::Capabilities NetworkManager::WirelessDevice::wirelessCapabilities() const
0126 {
0127     Q_D(const WirelessDevice);
0128     return d->wirelessCapabilities;
0129 }
0130 
0131 NetworkManager::AccessPoint::Ptr NetworkManager::WirelessDevice::findAccessPoint(const QString &uni)
0132 {
0133     Q_D(WirelessDevice);
0134     NetworkManager::AccessPoint::Ptr accessPoint;
0135 
0136     QMap<QString, NetworkManager::AccessPoint::Ptr>::ConstIterator mapIt = d->apMap.constFind(uni);
0137     if (mapIt != d->apMap.constEnd()) {
0138         accessPoint = mapIt.value();
0139     } else if (!uni.isEmpty() && uni != QLatin1String("/")) {
0140         d->accessPointAdded(QDBusObjectPath(uni));
0141         mapIt = d->apMap.constFind(uni);
0142         if (mapIt != d->apMap.constEnd()) {
0143             accessPoint = mapIt.value();
0144         }
0145     }
0146 
0147     return accessPoint;
0148 }
0149 
0150 NetworkManager::WirelessNetwork::List NetworkManager::WirelessDevice::networks() const
0151 {
0152     Q_D(const WirelessDevice);
0153     return d->networks.values();
0154 }
0155 
0156 NetworkManager::WirelessNetwork::Ptr NetworkManager::WirelessDevice::findNetwork(const QString &ssid) const
0157 {
0158     Q_D(const WirelessDevice);
0159     NetworkManager::WirelessNetwork::Ptr ret;
0160     if (d->networks.contains(ssid)) {
0161         ret = d->networks.value(ssid);
0162     }
0163     return ret;
0164 }
0165 
0166 void NetworkManager::WirelessDevicePrivate::accessPointAdded(const QDBusObjectPath &accessPoint)
0167 {
0168     // kDebug(1441) << apPath.path();
0169     Q_Q(WirelessDevice);
0170 
0171     if (!apMap.contains(accessPoint.path())) {
0172         NetworkManager::AccessPoint::Ptr accessPointPtr(new NetworkManager::AccessPoint(accessPoint.path()), &QObject::deleteLater);
0173         apMap.insert(accessPoint.path(), accessPointPtr);
0174         Q_EMIT q->accessPointAppeared(accessPoint.path());
0175 
0176         const QString ssid = accessPointPtr->ssid();
0177         if (!ssid.isEmpty() && !networks.contains(ssid)) {
0178             NetworkManager::WirelessNetwork::Ptr wifiNetwork(new NetworkManager::WirelessNetwork(accessPointPtr, q), &QObject::deleteLater);
0179             networks.insert(ssid, wifiNetwork);
0180             connect(wifiNetwork.data(), &WirelessNetwork::disappeared, this, &WirelessDevicePrivate::removeNetwork);
0181             Q_EMIT q->networkAppeared(ssid);
0182         }
0183     }
0184 }
0185 
0186 void NetworkManager::WirelessDevicePrivate::accessPointRemoved(const QDBusObjectPath &accessPoint)
0187 {
0188     // kDebug(1441) << apPath.path();
0189     Q_Q(WirelessDevice);
0190     if (!apMap.contains(accessPoint.path())) {
0191         qCDebug(NMQT) << "Access point list lookup failed for " << accessPoint.path();
0192     }
0193     Q_EMIT q->accessPointDisappeared(accessPoint.path());
0194     apMap.remove(accessPoint.path());
0195 }
0196 
0197 void NetworkManager::WirelessDevicePrivate::removeNetwork(const QString &network)
0198 {
0199     Q_Q(WirelessDevice);
0200 
0201     if (networks.contains(network)) {
0202         networks.remove(network);
0203         Q_EMIT q->networkDisappeared(network);
0204     }
0205 }
0206 
0207 void NetworkManager::WirelessDevicePrivate::propertyChanged(const QString &property, const QVariant &value)
0208 {
0209     Q_Q(WirelessDevice);
0210 
0211     if (property == QLatin1String("ActiveAccessPoint")) {
0212         QDBusObjectPath activeAccessPointTmp = qdbus_cast<QDBusObjectPath>(value);
0213         activeAccessPoint = q->findAccessPoint(activeAccessPointTmp.path());
0214         Q_EMIT q->activeAccessPointChanged(activeAccessPointTmp.path());
0215     } else if (property == QLatin1String("HwAddress")) {
0216         hardwareAddress = value.toString();
0217         Q_EMIT q->hardwareAddressChanged(hardwareAddress);
0218     } else if (property == QLatin1String("PermHwAddress")) {
0219         permanentHardwareAddress = value.toString();
0220         Q_EMIT q->permanentHardwareAddressChanged(permanentHardwareAddress);
0221     } else if (property == QLatin1String("Bitrate")) {
0222         bitRate = value.toUInt();
0223         Q_EMIT q->bitRateChanged(bitRate);
0224     } else if (property == QLatin1String("Mode")) {
0225         mode = q->convertOperationMode(value.toUInt());
0226         Q_EMIT q->modeChanged(mode);
0227     } else if (property == QLatin1String("WirelessCapabilities")) {
0228         wirelessCapabilities = q->convertCapabilities(value.toUInt());
0229         Q_EMIT q->wirelessCapabilitiesChanged(wirelessCapabilities);
0230     } else if (property == QLatin1String("LastScan")) {
0231         lastScan = NetworkManager::clockBootTimeToDateTime(value.toLongLong());
0232         Q_EMIT q->lastScanChanged(lastScan);
0233     } else if (property == QLatin1String("AccessPoints")) {
0234         // TODO use this instead AccessPointAdded/Removed signals?
0235     } else {
0236         DevicePrivate::propertyChanged(property, value);
0237     }
0238 }
0239 
0240 NetworkManager::WirelessDevice::OperationMode NetworkManager::WirelessDevice::convertOperationMode(uint theirMode)
0241 {
0242     NetworkManager::WirelessDevice::OperationMode ourMode = NetworkManager::WirelessDevice::Unknown;
0243     switch (theirMode) {
0244     case NM_802_11_MODE_UNKNOWN:
0245         ourMode = NetworkManager::WirelessDevice::Unknown;
0246         break;
0247     case NM_802_11_MODE_ADHOC:
0248         ourMode = NetworkManager::WirelessDevice::Adhoc;
0249         break;
0250     case NM_802_11_MODE_INFRA:
0251         ourMode = NetworkManager::WirelessDevice::Infra;
0252         break;
0253     case NM_802_11_MODE_AP:
0254         ourMode = NetworkManager::WirelessDevice::ApMode;
0255         break;
0256     default:
0257         qCDebug(NMQT) << Q_FUNC_INFO << "Unhandled mode" << theirMode;
0258     }
0259     return ourMode;
0260 }
0261 
0262 NetworkManager::WirelessDevice::Capabilities NetworkManager::WirelessDevice::convertCapabilities(uint caps)
0263 {
0264     return (NetworkManager::WirelessDevice::Capabilities)caps;
0265 }