File indexing completed on 2025-03-23 12:49:55
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"