File indexing completed on 2024-04-21 15:06:31

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