Warning, file /plasma/plasma-nm/libs/declarative/connectionicon.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: 2013 Jan Grulich <jgrulich@redhat.com>
0003 
0004     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0005 */
0006 
0007 #include "connectionicon.h"
0008 #include "configuration.h"
0009 #include "uiutils.h"
0010 
0011 #include <NetworkManagerQt/BluetoothDevice>
0012 #include <NetworkManagerQt/Connection>
0013 #include <NetworkManagerQt/ConnectionSettings>
0014 #include <NetworkManagerQt/Device>
0015 #include <NetworkManagerQt/ModemDevice>
0016 #include <NetworkManagerQt/WiredDevice>
0017 #include <NetworkManagerQt/WirelessDevice>
0018 #include <NetworkManagerQt/WirelessSetting>
0019 
0020 #include <ModemManagerQt/Manager>
0021 
0022 ConnectionIcon::ConnectionIcon(QObject *parent)
0023     : QObject(parent)
0024     , m_wirelessNetwork(nullptr)
0025     , m_modemNetwork(nullptr)
0026 {
0027     connect(NetworkManager::notifier(), &NetworkManager::Notifier::primaryConnectionChanged, this, &ConnectionIcon::primaryConnectionChanged);
0028     connect(NetworkManager::notifier(), &NetworkManager::Notifier::activatingConnectionChanged, this, &ConnectionIcon::activatingConnectionChanged);
0029     connect(NetworkManager::notifier(), &NetworkManager::Notifier::activeConnectionAdded, this, &ConnectionIcon::activeConnectionAdded);
0030     connect(NetworkManager::notifier(), &NetworkManager::Notifier::connectivityChanged, this, &ConnectionIcon::connectivityChanged);
0031     connect(NetworkManager::notifier(), &NetworkManager::Notifier::deviceAdded, this, &ConnectionIcon::deviceAdded);
0032     connect(NetworkManager::notifier(), &NetworkManager::Notifier::deviceRemoved, this, &ConnectionIcon::deviceRemoved);
0033     connect(NetworkManager::notifier(), &NetworkManager::Notifier::networkingEnabledChanged, this, &ConnectionIcon::networkingEnabledChanged);
0034     connect(NetworkManager::notifier(), &NetworkManager::Notifier::statusChanged, this, &ConnectionIcon::statusChanged);
0035     connect(NetworkManager::notifier(), &NetworkManager::Notifier::wirelessEnabledChanged, this, &ConnectionIcon::wirelessEnabledChanged);
0036     connect(NetworkManager::notifier(), &NetworkManager::Notifier::wirelessHardwareEnabledChanged, this, &ConnectionIcon::wirelessEnabledChanged);
0037     connect(NetworkManager::notifier(), &NetworkManager::Notifier::wwanEnabledChanged, this, &ConnectionIcon::wwanEnabledChanged);
0038     connect(NetworkManager::notifier(), &NetworkManager::Notifier::wwanHardwareEnabledChanged, this, &ConnectionIcon::wwanEnabledChanged);
0039 
0040     for (const NetworkManager::Device::Ptr &device : NetworkManager::networkInterfaces()) {
0041         if (device->type() == NetworkManager::Device::Ethernet) {
0042             NetworkManager::WiredDevice::Ptr wiredDevice = device.staticCast<NetworkManager::WiredDevice>();
0043             if (wiredDevice) {
0044                 connect(wiredDevice.data(), &NetworkManager::WiredDevice::carrierChanged, this, &ConnectionIcon::carrierChanged);
0045             }
0046         } else if (device->type() == NetworkManager::Device::Wifi) {
0047             NetworkManager::WirelessDevice::Ptr wifiDevice = device.staticCast<NetworkManager::WirelessDevice>();
0048             if (wifiDevice) {
0049                 connect(wifiDevice.data(), &NetworkManager::WirelessDevice::availableConnectionAppeared, this, &ConnectionIcon::wirelessNetworkAppeared);
0050                 connect(wifiDevice.data(), &NetworkManager::WirelessDevice::networkAppeared, this, &ConnectionIcon::wirelessNetworkAppeared);
0051             }
0052         }
0053     }
0054 
0055     for (const NetworkManager::ActiveConnection::Ptr &activeConnection : NetworkManager::activeConnections()) {
0056         addActiveConnection(activeConnection->path());
0057     }
0058     setStates();
0059 
0060     setIcons();
0061 
0062     QDBusPendingReply<uint> pendingReply = NetworkManager::checkConnectivity();
0063     auto callWatcher = new QDBusPendingCallWatcher(pendingReply);
0064     connect(callWatcher, &QDBusPendingCallWatcher::finished, this, [this](QDBusPendingCallWatcher *watcher) {
0065         QDBusPendingReply<uint> reply = *watcher;
0066         if (reply.isValid()) {
0067             connectivityChanged((NetworkManager::Connectivity)reply.value());
0068         }
0069         watcher->deleteLater();
0070     });
0071 }
0072 
0073 ConnectionIcon::~ConnectionIcon() = default;
0074 
0075 bool ConnectionIcon::connecting() const
0076 {
0077     return m_connecting;
0078 }
0079 
0080 QString ConnectionIcon::connectionIcon() const
0081 {
0082     if (m_vpn && !m_connectionIcon.contains(QLatin1String("available"))) {
0083         return m_connectionIcon + QStringLiteral("-locked");
0084     }
0085 
0086     if (m_limited && !m_connectionIcon.contains(QLatin1String("available"))) {
0087         return m_connectionIcon + QStringLiteral("-limited");
0088     }
0089 
0090     return m_connectionIcon;
0091 }
0092 
0093 QString ConnectionIcon::connectionTooltipIcon() const
0094 {
0095     return m_connectionTooltipIcon;
0096 }
0097 
0098 void ConnectionIcon::activatingConnectionChanged(const QString &connection)
0099 {
0100     Q_UNUSED(connection);
0101     setIcons();
0102 }
0103 
0104 void ConnectionIcon::addActiveConnection(const QString &activeConnection)
0105 {
0106     NetworkManager::ActiveConnection::Ptr active = NetworkManager::findActiveConnection(activeConnection);
0107 
0108     if (active) {
0109         NetworkManager::VpnConnection::Ptr vpnConnection;
0110         connect(active.data(), &NetworkManager::ActiveConnection::destroyed, this, &ConnectionIcon::activeConnectionDestroyed);
0111         if (active->vpn()) {
0112             vpnConnection = active.objectCast<NetworkManager::VpnConnection>();
0113             connect(vpnConnection.data(), &NetworkManager::VpnConnection::stateChanged, this, &ConnectionIcon::vpnConnectionStateChanged);
0114         } else {
0115             connect(active.data(), &NetworkManager::ActiveConnection::stateChanged, this, &ConnectionIcon::activeConnectionStateChanged, Qt::UniqueConnection);
0116         }
0117     }
0118 }
0119 
0120 void ConnectionIcon::activeConnectionAdded(const QString &activeConnection)
0121 {
0122     addActiveConnection(activeConnection);
0123     setStates();
0124 }
0125 
0126 void ConnectionIcon::activeConnectionStateChanged(NetworkManager::ActiveConnection::State state)
0127 {
0128     Q_UNUSED(state);
0129     setStates();
0130 }
0131 
0132 void ConnectionIcon::activeConnectionDestroyed()
0133 {
0134     setStates();
0135 }
0136 
0137 void ConnectionIcon::carrierChanged(bool carrier)
0138 {
0139     Q_UNUSED(carrier);
0140     setIcons();
0141 }
0142 
0143 void ConnectionIcon::connectivityChanged(NetworkManager::Connectivity conn)
0144 {
0145     const bool needsPortal = conn == NetworkManager::Portal;
0146     if (needsPortal != m_needsPortal) {
0147         m_needsPortal = needsPortal;
0148         Q_EMIT needsPortalChanged(needsPortal);
0149     }
0150     setLimited(conn == NetworkManager::Portal || conn == NetworkManager::Limited);
0151 }
0152 
0153 void ConnectionIcon::deviceAdded(const QString &device)
0154 {
0155     NetworkManager::Device::Ptr dev = NetworkManager::findNetworkInterface(device);
0156 
0157     if (!dev) {
0158         return;
0159     }
0160 
0161     if (dev->type() == NetworkManager::Device::Ethernet) {
0162         NetworkManager::WiredDevice::Ptr wiredDev = dev.objectCast<NetworkManager::WiredDevice>();
0163         connect(wiredDev.data(), &NetworkManager::WiredDevice::carrierChanged, this, &ConnectionIcon::carrierChanged);
0164     }
0165 }
0166 
0167 void ConnectionIcon::deviceRemoved(const QString &device)
0168 {
0169     Q_UNUSED(device);
0170 
0171     if (NetworkManager::status() == NetworkManager::Disconnected) {
0172         setDisconnectedIcon();
0173     }
0174 }
0175 
0176 void ConnectionIcon::modemNetworkRemoved()
0177 {
0178     m_modemNetwork.clear();
0179 }
0180 
0181 void ConnectionIcon::modemSignalChanged(ModemManager::SignalQualityPair signalQuality)
0182 {
0183     int diff = m_signal - signalQuality.signal;
0184 
0185     if (diff >= 10 || diff <= -10) {
0186         m_signal = signalQuality.signal;
0187 
0188         setIconForModem();
0189     }
0190 }
0191 
0192 void ConnectionIcon::networkingEnabledChanged(bool enabled)
0193 {
0194     if (!enabled) {
0195         setConnectionIcon(QStringLiteral("network-unavailable"));
0196     }
0197 }
0198 
0199 void ConnectionIcon::primaryConnectionChanged(const QString &connection)
0200 {
0201     if (!connection.isEmpty()) {
0202         setIcons();
0203     }
0204 }
0205 
0206 void ConnectionIcon::statusChanged(NetworkManager::Status status)
0207 {
0208     if (status == NetworkManager::Disconnected) {
0209         setDisconnectedIcon();
0210     }
0211 }
0212 
0213 void ConnectionIcon::vpnConnectionStateChanged(NetworkManager::VpnConnection::State state, NetworkManager::VpnConnection::StateChangeReason reason)
0214 {
0215     Q_UNUSED(state);
0216     Q_UNUSED(reason);
0217     setStates();
0218     setIcons();
0219 }
0220 
0221 void ConnectionIcon::wirelessEnabledChanged(bool enabled)
0222 {
0223     Q_UNUSED(enabled);
0224     setIcons();
0225 }
0226 
0227 void ConnectionIcon::wwanEnabledChanged(bool enabled)
0228 {
0229     Q_UNUSED(enabled);
0230     setIcons();
0231 }
0232 
0233 void ConnectionIcon::wirelessNetworkAppeared(const QString &network)
0234 {
0235     Q_UNUSED(network);
0236     setIcons();
0237 }
0238 
0239 void ConnectionIcon::setStates()
0240 {
0241     bool connecting = false;
0242     bool vpn = false;
0243     for (const NetworkManager::ActiveConnection::Ptr &activeConnection : NetworkManager::activeConnections()) {
0244         NetworkManager::VpnConnection::Ptr vpnConnection;
0245         if (activeConnection->vpn()) {
0246             vpnConnection = activeConnection.objectCast<NetworkManager::VpnConnection>();
0247         }
0248 
0249         if (!vpnConnection) {
0250             if (activeConnection->state() == NetworkManager::ActiveConnection::Activating && UiUtils::isConnectionTypeSupported(activeConnection->type())) {
0251                 connecting = true;
0252             }
0253             if (activeConnection->type() == NetworkManager::ConnectionSettings::ConnectionType::WireGuard) {
0254                 vpn = true;
0255             }
0256         } else {
0257             if (vpnConnection->state() == NetworkManager::VpnConnection::Activated) {
0258                 vpn = true;
0259             } else if (vpnConnection->state() == NetworkManager::VpnConnection::Prepare //
0260                        || vpnConnection->state() == NetworkManager::VpnConnection::NeedAuth //
0261                        || vpnConnection->state() == NetworkManager::VpnConnection::Connecting //
0262                        || vpnConnection->state() == NetworkManager::VpnConnection::GettingIpConfig) {
0263                 connecting = true;
0264             }
0265         }
0266     }
0267 
0268     setVpn(vpn);
0269     setConnecting(connecting);
0270 }
0271 
0272 void ConnectionIcon::setIcons()
0273 {
0274     m_signal = 0;
0275     if (m_modemNetwork) {
0276         disconnect(m_modemNetwork.data(), nullptr, this, nullptr);
0277         m_modemNetwork.clear();
0278     }
0279     if (m_wirelessNetwork) {
0280         disconnect(m_wirelessNetwork.data(), nullptr, this, nullptr);
0281         m_wirelessNetwork.clear();
0282     }
0283 
0284     NetworkManager::ActiveConnection::Ptr connection = NetworkManager::activatingConnection();
0285 
0286     // Set icon based on the current primary connection if the activating connection is virtual
0287     // since we're not setting icons for virtual connections
0288     if (!connection || (connection && UiUtils::isConnectionTypeVirtual(connection->type()))
0289         || connection->type() == NetworkManager::ConnectionSettings::WireGuard) {
0290         connection = NetworkManager::primaryConnection();
0291     }
0292 
0293     /* Fallback: If we still don't have an active connection with default route or the default route goes through a connection
0294                  of generic type (some type of VPNs) we need to go through all other active connections and pick the one with
0295                  highest probability of being the main one (order is: vpn, wired, wireless, gsm, cdma, bluetooth) */
0296     if ((!connection && !NetworkManager::activeConnections().isEmpty()) || (connection && connection->type() == NetworkManager::ConnectionSettings::Generic)
0297         || (connection && connection->type() == NetworkManager::ConnectionSettings::Tun)) {
0298         for (const NetworkManager::ActiveConnection::Ptr &activeConnection : NetworkManager::activeConnections()) {
0299             const NetworkManager::ConnectionSettings::ConnectionType type = activeConnection->type();
0300             if (type == NetworkManager::ConnectionSettings::Bluetooth) {
0301                 if (connection && connection->type() <= NetworkManager::ConnectionSettings::Bluetooth) {
0302                     connection = activeConnection;
0303                 }
0304             } else if (type == NetworkManager::ConnectionSettings::Cdma) {
0305                 if (connection && connection->type() <= NetworkManager::ConnectionSettings::Cdma) {
0306                     connection = activeConnection;
0307                 }
0308             } else if (type == NetworkManager::ConnectionSettings::Gsm) {
0309                 if (connection && connection->type() <= NetworkManager::ConnectionSettings::Gsm) {
0310                     connection = activeConnection;
0311                 }
0312             } else if (type == NetworkManager::ConnectionSettings::Vpn) {
0313                 connection = activeConnection;
0314             } else if (type == NetworkManager::ConnectionSettings::WireGuard) {
0315                 connection = activeConnection;
0316             } else if (type == NetworkManager::ConnectionSettings::Wired) {
0317                 if (connection
0318                     && (connection->type() != NetworkManager::ConnectionSettings::Vpn //
0319                         || connection->type() != NetworkManager::ConnectionSettings::WireGuard)) {
0320                     connection = activeConnection;
0321                 }
0322             } else if (type == NetworkManager::ConnectionSettings::Wireless) {
0323                 if (connection
0324                     && (connection->type() != NetworkManager::ConnectionSettings::Vpn //
0325                         && (connection->type() != NetworkManager::ConnectionSettings::Wired))) {
0326                     connection = activeConnection;
0327                 }
0328             }
0329         }
0330     }
0331 
0332     if (connection && !connection->devices().isEmpty()) {
0333         NetworkManager::Device::Ptr device = NetworkManager::findNetworkInterface(connection->devices().first());
0334 
0335         if (device) {
0336             NetworkManager::Device::Type type = device->type();
0337             if (type == NetworkManager::Device::Wifi) {
0338                 NetworkManager::WirelessDevice::Ptr wifiDevice = device.objectCast<NetworkManager::WirelessDevice>();
0339                 if (wifiDevice->mode() == NetworkManager::WirelessDevice::Adhoc) {
0340                     setWirelessIconForSignalStrength(100);
0341                 } else {
0342                     NetworkManager::AccessPoint::Ptr ap = wifiDevice->activeAccessPoint();
0343                     if (ap) {
0344                         setWirelessIcon(device, ap->ssid());
0345                     }
0346                 }
0347             } else if (type == NetworkManager::Device::Ethernet) {
0348                 setConnectionIcon(QStringLiteral("network-wired-activated"));
0349                 setConnectionTooltipIcon(QStringLiteral("network-wired-activated"));
0350             } else if (type == NetworkManager::Device::Modem) {
0351                 setModemIcon(device);
0352             } else if (type == NetworkManager::Device::Bluetooth) {
0353                 NetworkManager::BluetoothDevice::Ptr btDevice = device.objectCast<NetworkManager::BluetoothDevice>();
0354                 if (btDevice) {
0355                     if (btDevice->bluetoothCapabilities().testFlag(NetworkManager::BluetoothDevice::Dun)) {
0356                         setModemIcon(device);
0357                     } else {
0358                         setConnectionIcon(QStringLiteral("network-bluetooth-activated"));
0359                         setConnectionTooltipIcon(QStringLiteral("preferences-system-bluetooth"));
0360                     }
0361                 }
0362             } else if (type == 29) { // TODO change to WireGuard enum value once it is added
0363                 // WireGuard is a VPN but is not implemented
0364                 // in NetworkManager as a VPN, so we don't want to
0365                 // do anything just because it has a device
0366                 // associated with it.
0367             } else {
0368                 // Ignore other devices (bond/bridge/team etc.)
0369                 setDisconnectedIcon();
0370             }
0371         }
0372     } else {
0373         setDisconnectedIcon();
0374     }
0375 }
0376 
0377 void ConnectionIcon::setDisconnectedIcon()
0378 {
0379     if (Configuration::self().airplaneModeEnabled()) {
0380         setConnectionIcon(QStringLiteral("network-flightmode-on"));
0381         return;
0382     }
0383 
0384     if (NetworkManager::status() == NetworkManager::Unknown //
0385         || NetworkManager::status() == NetworkManager::Asleep) {
0386         setConnectionIcon(QStringLiteral("network-unavailable"));
0387         return;
0388     }
0389 
0390     bool wired = false;
0391     bool wireless = false;
0392     bool modem = false;
0393 
0394     m_limited = false;
0395     m_vpn = false;
0396 
0397     for (const NetworkManager::Device::Ptr &device : NetworkManager::networkInterfaces()) {
0398         if (device->type() == NetworkManager::Device::Ethernet) {
0399             NetworkManager::WiredDevice::Ptr wiredDev = device.objectCast<NetworkManager::WiredDevice>();
0400             if (wiredDev->carrier()) {
0401                 wired = true;
0402             }
0403         } else if (device->type() == NetworkManager::Device::Wifi //
0404                    && NetworkManager::isWirelessEnabled() //
0405                    && NetworkManager::isWirelessHardwareEnabled()) {
0406             NetworkManager::WirelessDevice::Ptr wifiDevice = device.objectCast<NetworkManager::WirelessDevice>();
0407             if (!wifiDevice->accessPoints().isEmpty() || !wifiDevice->availableConnections().isEmpty()) {
0408                 wireless = true;
0409             }
0410         } else if (device->type() == NetworkManager::Device::Modem //
0411                    && NetworkManager::isWwanEnabled() //
0412                    && NetworkManager::isWwanHardwareEnabled()) {
0413             modem = true;
0414         }
0415     }
0416 
0417     if (wired) {
0418         setConnectionIcon(QStringLiteral("network-wired-available"));
0419         setConnectionTooltipIcon(QStringLiteral("network-wired"));
0420         return;
0421     } else if (wireless) {
0422         setConnectionIcon(QStringLiteral("network-wireless-available"));
0423         setConnectionTooltipIcon(QStringLiteral("network-wireless-connected-00"));
0424         return;
0425     } else if (modem) {
0426         setConnectionIcon(QStringLiteral("network-mobile-available"));
0427         setConnectionTooltipIcon(QStringLiteral("phone"));
0428         return;
0429     } else {
0430         setConnectionIcon(QStringLiteral("network-unavailable"));
0431         setConnectionTooltipIcon(QStringLiteral("network-wired"));
0432     }
0433 }
0434 
0435 void ConnectionIcon::setModemIcon(const NetworkManager::Device::Ptr &device)
0436 {
0437     NetworkManager::ModemDevice::Ptr modemDevice = device.objectCast<NetworkManager::ModemDevice>();
0438 
0439     if (!modemDevice) {
0440         setConnectionIcon(QStringLiteral("network-mobile-100"));
0441 
0442         return;
0443     }
0444 
0445     ModemManager::ModemDevice::Ptr modem = ModemManager::findModemDevice(device->udi());
0446     if (modem) {
0447         if (modem->hasInterface(ModemManager::ModemDevice::ModemInterface)) {
0448             m_modemNetwork = modem->interface(ModemManager::ModemDevice::ModemInterface).objectCast<ModemManager::Modem>();
0449         }
0450     }
0451 
0452     if (m_modemNetwork) {
0453         connect(m_modemNetwork.data(), &ModemManager::Modem::signalQualityChanged, this, &ConnectionIcon::modemSignalChanged, Qt::UniqueConnection);
0454         connect(m_modemNetwork.data(), &ModemManager::Modem::accessTechnologiesChanged, this, &ConnectionIcon::setIconForModem, Qt::UniqueConnection);
0455         connect(m_modemNetwork.data(), &ModemManager::Modem::destroyed, this, &ConnectionIcon::modemNetworkRemoved);
0456 
0457         m_signal = m_modemNetwork->signalQuality().signal;
0458         setIconForModem();
0459     } else {
0460         setConnectionIcon(QStringLiteral("network-mobile-0"));
0461         setConnectionTooltipIcon(QStringLiteral("phone"));
0462         return;
0463     }
0464 }
0465 
0466 void ConnectionIcon::setIconForModem()
0467 {
0468     if (!m_signal) {
0469         m_signal = m_modemNetwork->signalQuality().signal;
0470     }
0471     QString strength = QStringLiteral("00");
0472 
0473     if (m_signal == 0) {
0474         strength = QLatin1Char('0');
0475     } else if (m_signal < 20) {
0476         strength = QStringLiteral("20");
0477     } else if (m_signal < 40) {
0478         strength = QStringLiteral("40");
0479     } else if (m_signal < 60) {
0480         strength = QStringLiteral("60");
0481     } else if (m_signal < 80) {
0482         strength = QStringLiteral("80");
0483     } else {
0484         strength = QStringLiteral("100");
0485     }
0486 
0487     QString result;
0488 
0489     switch (m_modemNetwork->accessTechnologies()) {
0490     case MM_MODEM_ACCESS_TECHNOLOGY_GSM:
0491     case MM_MODEM_ACCESS_TECHNOLOGY_GSM_COMPACT:
0492         result = QStringLiteral("network-mobile-%1");
0493         break;
0494     case MM_MODEM_ACCESS_TECHNOLOGY_GPRS:
0495         result = QStringLiteral("network-mobile-%1-gprs");
0496         break;
0497     case MM_MODEM_ACCESS_TECHNOLOGY_EDGE:
0498         result = QStringLiteral("network-mobile-%1-edge");
0499         break;
0500     case MM_MODEM_ACCESS_TECHNOLOGY_UMTS:
0501         result = QStringLiteral("network-mobile-%1-umts");
0502         break;
0503     case MM_MODEM_ACCESS_TECHNOLOGY_HSDPA:
0504         result = QStringLiteral("network-mobile-%1-hsdpa");
0505         break;
0506     case MM_MODEM_ACCESS_TECHNOLOGY_HSUPA:
0507         result = QStringLiteral("network-mobile-%1-hsupa");
0508         break;
0509     case MM_MODEM_ACCESS_TECHNOLOGY_HSPA:
0510     case MM_MODEM_ACCESS_TECHNOLOGY_HSPA_PLUS:
0511         result = QStringLiteral("network-mobile-%1-hspa");
0512         break;
0513     case MM_MODEM_ACCESS_TECHNOLOGY_LTE:
0514         result = QStringLiteral("network-mobile-%1-lte");
0515         break;
0516 #if MM_CHECK_VERSION(1, 14, 0)
0517     case MM_MODEM_ACCESS_TECHNOLOGY_5GNR:
0518         result = QStringLiteral("network-mobile-%1-5g");
0519         break;
0520 #endif
0521     default:
0522         result = QStringLiteral("network-mobile-%1");
0523         break;
0524     }
0525 
0526     setConnectionIcon(QString(result).arg(strength));
0527     setConnectionTooltipIcon(QStringLiteral("phone"));
0528 }
0529 
0530 void ConnectionIcon::setWirelessIcon(const NetworkManager::Device::Ptr &device, const QString &ssid)
0531 {
0532     NetworkManager::WirelessDevice::Ptr wirelessDevice = device.objectCast<NetworkManager::WirelessDevice>();
0533     if (device) {
0534         m_wirelessNetwork = wirelessDevice->findNetwork(ssid);
0535     } else {
0536         m_wirelessNetwork.clear();
0537     }
0538 
0539     if (m_wirelessNetwork) {
0540         connect(m_wirelessNetwork.data(),
0541                 &NetworkManager::WirelessNetwork::signalStrengthChanged,
0542                 this,
0543                 &ConnectionIcon::setWirelessIconForSignalStrength,
0544                 Qt::UniqueConnection);
0545 
0546         setWirelessIconForSignalStrength(m_wirelessNetwork->signalStrength());
0547     } else {
0548         setDisconnectedIcon();
0549     }
0550 }
0551 
0552 void ConnectionIcon::setWirelessIconForSignalStrength(int strength)
0553 {
0554     int iconStrength = 100;
0555     if (strength == 0) {
0556         iconStrength = 0;
0557         setConnectionTooltipIcon(QStringLiteral("network-wireless-connected-00"));
0558     } else if (strength < 20) {
0559         iconStrength = 20;
0560         setConnectionTooltipIcon(QStringLiteral("network-wireless-connected-20"));
0561     } else if (strength < 40) {
0562         iconStrength = 40;
0563         setConnectionTooltipIcon(QStringLiteral("network-wireless-connected-40"));
0564     } else if (strength < 60) {
0565         iconStrength = 60;
0566         setConnectionTooltipIcon(QStringLiteral("network-wireless-connected-60"));
0567     } else if (strength < 80) {
0568         iconStrength = 80;
0569         setConnectionTooltipIcon(QStringLiteral("network-wireless-connected-80"));
0570     } else if (strength < 100) {
0571         setConnectionTooltipIcon(QStringLiteral("network-wireless-connected-100"));
0572     }
0573 
0574     const QString icon = QStringLiteral("network-wireless-%1").arg(iconStrength);
0575 
0576     setConnectionIcon(icon);
0577 }
0578 
0579 void ConnectionIcon::setConnecting(bool connecting)
0580 {
0581     if (connecting != m_connecting) {
0582         m_connecting = connecting;
0583         Q_EMIT connectingChanged(m_connecting);
0584     }
0585 }
0586 
0587 void ConnectionIcon::setConnectionIcon(const QString &icon)
0588 {
0589     if (icon != m_connectionIcon) {
0590         m_connectionIcon = icon;
0591         Q_EMIT connectionIconChanged(connectionIcon());
0592     }
0593 }
0594 
0595 void ConnectionIcon::setConnectionTooltipIcon(const QString &icon)
0596 {
0597     if (icon != m_connectionTooltipIcon) {
0598         m_connectionTooltipIcon = icon;
0599         Q_EMIT connectionTooltipIconChanged(m_connectionTooltipIcon);
0600     }
0601 }
0602 
0603 void ConnectionIcon::setVpn(bool vpn)
0604 {
0605     if (m_vpn != vpn) {
0606         m_vpn = vpn;
0607         Q_EMIT connectionIconChanged(connectionIcon());
0608     }
0609 }
0610 
0611 void ConnectionIcon::setLimited(bool limited)
0612 {
0613     if (m_limited != limited) {
0614         m_limited = limited;
0615         Q_EMIT connectionIconChanged(connectionIcon());
0616     }
0617 }