File indexing completed on 2024-04-14 14:30:34

0001 /*
0002     SPDX-FileCopyrightText: 2008 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 "accesspoint_p.h"
0010 #include "manager_p.h"
0011 #include "wirelessdevice.h"
0012 
0013 #include "nmdebug.h"
0014 
0015 NetworkManager::AccessPointPrivate::AccessPointPrivate(const QString &path, AccessPoint *q)
0016 #ifdef NMQT_STATIC
0017     : iface(NetworkManagerPrivate::DBUS_SERVICE, path, QDBusConnection::sessionBus())
0018 #else
0019     : iface(NetworkManagerPrivate::DBUS_SERVICE, path, QDBusConnection::systemBus())
0020 #endif
0021     , capabilities(AccessPoint::None)
0022     , wpaFlags()
0023     , rsnFlags()
0024     , frequency(0)
0025     , maxBitRate(0)
0026     , mode(AccessPoint::Unknown)
0027     , signalStrength(0)
0028     , lastSeen(-1)
0029     , q_ptr(q)
0030 {
0031     uni = path;
0032 }
0033 
0034 NetworkManager::AccessPoint::Capabilities NetworkManager::AccessPointPrivate::convertCapabilities(int caps)
0035 {
0036     NetworkManager::AccessPoint::Capabilities capFlags;
0037     if (caps & NM_802_11_AP_FLAGS_PRIVACY) {
0038         capFlags |= AccessPoint::Privacy;
0039     }
0040 
0041     return capFlags;
0042 }
0043 
0044 NetworkManager::AccessPoint::WpaFlags NetworkManager::AccessPointPrivate::convertWpaFlags(uint theirFlags)
0045 {
0046     return (AccessPoint::WpaFlags)theirFlags;
0047 }
0048 
0049 NetworkManager::AccessPoint::AccessPoint(const QString &path, QObject *parent)
0050     : QObject(parent)
0051     , d_ptr(new AccessPointPrivate(path, this))
0052 {
0053     Q_D(AccessPoint);
0054 
0055     QDBusConnection::systemBus().connect(NetworkManagerPrivate::DBUS_SERVICE,
0056                                          d->uni,
0057                                          NetworkManagerPrivate::FDO_DBUS_PROPERTIES,
0058                                          QLatin1String("PropertiesChanged"),
0059                                          d,
0060                                          SLOT(dbusPropertiesChanged(QString, QVariantMap, QStringList)));
0061 
0062     // Get all AccessPoint's properties at once
0063     QVariantMap initialProperties = NetworkManagerPrivate::retrieveInitialProperties(d->iface.staticInterfaceName(), path);
0064     if (!initialProperties.isEmpty()) {
0065         d->propertiesChanged(initialProperties);
0066     }
0067 }
0068 
0069 NetworkManager::AccessPoint::~AccessPoint()
0070 {
0071     Q_D(AccessPoint);
0072     delete d;
0073 }
0074 
0075 QString NetworkManager::AccessPoint::uni() const
0076 {
0077     Q_D(const AccessPoint);
0078     return d->uni;
0079 }
0080 
0081 QString NetworkManager::AccessPoint::hardwareAddress() const
0082 {
0083     Q_D(const AccessPoint);
0084     return d->hardwareAddress;
0085 }
0086 
0087 NetworkManager::AccessPoint::Capabilities NetworkManager::AccessPoint::capabilities() const
0088 {
0089     Q_D(const AccessPoint);
0090     return d->capabilities;
0091 }
0092 
0093 NetworkManager::AccessPoint::WpaFlags NetworkManager::AccessPoint::wpaFlags() const
0094 {
0095     Q_D(const AccessPoint);
0096     return d->wpaFlags;
0097 }
0098 
0099 NetworkManager::AccessPoint::WpaFlags NetworkManager::AccessPoint::rsnFlags() const
0100 {
0101     Q_D(const AccessPoint);
0102     return d->rsnFlags;
0103 }
0104 
0105 QString NetworkManager::AccessPoint::ssid() const
0106 {
0107     Q_D(const AccessPoint);
0108     return d->ssid;
0109 }
0110 
0111 QByteArray NetworkManager::AccessPoint::rawSsid() const
0112 {
0113     Q_D(const AccessPoint);
0114     return d->rawSsid;
0115 }
0116 
0117 uint NetworkManager::AccessPoint::frequency() const
0118 {
0119     Q_D(const AccessPoint);
0120     return d->frequency;
0121 }
0122 
0123 uint NetworkManager::AccessPoint::maxBitRate() const
0124 {
0125     Q_D(const AccessPoint);
0126     return d->maxBitRate;
0127 }
0128 
0129 NetworkManager::AccessPoint::OperationMode NetworkManager::AccessPoint::mode() const
0130 {
0131     Q_D(const AccessPoint);
0132     return d->mode;
0133 }
0134 
0135 int NetworkManager::AccessPoint::signalStrength() const
0136 {
0137     Q_D(const AccessPoint);
0138     return d->signalStrength;
0139 }
0140 
0141 int NetworkManager::AccessPoint::lastSeen() const
0142 {
0143     Q_D(const AccessPoint);
0144     return d->lastSeen;
0145 }
0146 
0147 NetworkManager::AccessPoint::OperationMode NetworkManager::AccessPoint::convertOperationMode(uint mode)
0148 {
0149     NetworkManager::AccessPoint::OperationMode ourMode = NetworkManager::AccessPoint::Unknown;
0150     switch (mode) {
0151     case NM_802_11_MODE_UNKNOWN:
0152         ourMode = NetworkManager::AccessPoint::Unknown;
0153         break;
0154     case NM_802_11_MODE_ADHOC:
0155         ourMode = NetworkManager::AccessPoint::Adhoc;
0156         break;
0157     case NM_802_11_MODE_INFRA:
0158         ourMode = NetworkManager::AccessPoint::Infra;
0159         break;
0160     case NM_802_11_MODE_AP:
0161         ourMode = NetworkManager::AccessPoint::ApMode;
0162         break;
0163     default:
0164         qCDebug(NMQT) << Q_FUNC_INFO << "Unhandled mode" << mode;
0165     }
0166     return ourMode;
0167 }
0168 
0169 void NetworkManager::AccessPointPrivate::dbusPropertiesChanged(const QString &interfaceName,
0170                                                                const QVariantMap &properties,
0171                                                                const QStringList &invalidatedProperties)
0172 {
0173     Q_UNUSED(invalidatedProperties);
0174     if (interfaceName == QLatin1String("org.freedesktop.NetworkManager.AccessPoint")) {
0175         propertiesChanged(properties);
0176     }
0177 }
0178 
0179 void NetworkManager::AccessPointPrivate::propertiesChanged(const QVariantMap &properties)
0180 {
0181     Q_Q(AccessPoint);
0182 
0183     // qCDebug(NMQT) << Q_FUNC_INFO << properties;
0184 
0185     QVariantMap::const_iterator it = properties.constBegin();
0186     while (it != properties.constEnd()) {
0187         const QString property = it.key();
0188         if (property == QLatin1String("Flags")) {
0189             capabilities = convertCapabilities(it->toUInt());
0190             Q_EMIT q->capabilitiesChanged(capabilities);
0191         } else if (property == QLatin1String("WpaFlags")) {
0192             wpaFlags = convertWpaFlags(it->toUInt());
0193             Q_EMIT q->wpaFlagsChanged(wpaFlags);
0194         } else if (property == QLatin1String("RsnFlags")) {
0195             rsnFlags = convertWpaFlags(it->toUInt());
0196             Q_EMIT q->rsnFlagsChanged(rsnFlags);
0197         } else if (property == QLatin1String("Ssid")) {
0198             rawSsid = it->toByteArray();
0199             ssid = QString::fromUtf8(rawSsid);
0200             Q_EMIT q->ssidChanged(ssid);
0201         } else if (property == QLatin1String("Frequency")) {
0202             frequency = it->toUInt();
0203             Q_EMIT q->frequencyChanged(frequency);
0204         } else if (property == QLatin1String("HwAddress")) {
0205             hardwareAddress = it->toString();
0206         } else if (property == QLatin1String("Mode")) {
0207             mode = q->convertOperationMode(it->toUInt());
0208         } else if (property == QLatin1String("MaxBitrate")) {
0209             maxBitRate = it->toUInt();
0210             Q_EMIT q->bitRateChanged(maxBitRate);
0211         } else if (property == QLatin1String("Strength")) {
0212             signalStrength = it->toInt();
0213             Q_EMIT q->signalStrengthChanged(signalStrength);
0214         } else if (property == QLatin1String("LastSeen")) {
0215             lastSeen = it->toInt();
0216             Q_EMIT q->lastSeenChanged(lastSeen);
0217         } else {
0218             qCDebug(NMQT) << Q_FUNC_INFO << "Unhandled property" << property;
0219         }
0220         ++it;
0221     }
0222 }
0223 
0224 #include "moc_accesspoint.cpp"
0225 #include "moc_accesspoint_p.cpp"