diff --git a/networkmanagement/CMakeLists.txt b/networkmanagement/CMakeLists.txt index 56da6ae..e72ba11 100644 --- a/networkmanagement/CMakeLists.txt +++ b/networkmanagement/CMakeLists.txt @@ -2,6 +2,9 @@ set(NETWORKMGR_SRCS appletproxymodel.cpp appletproxymodel.h + activeconnection.cpp + activeconnection.h + networkitemslist.cpp networkitemslist.h @@ -11,18 +14,12 @@ set(NETWORKMGR_SRCS networkmodelitem.cpp networkmodelitem.h - network.cpp - network.h - wiressitemsettings.cpp wiressitemsettings.h uiutils.cpp uiutils.h - connectionicon.cpp - connectionicon.h - identitymodel.cpp identitymodel.h @@ -62,4 +59,4 @@ target_link_libraries (cutefishnm_qmlplugins ) install(TARGETS cutefishnm_qmlplugins DESTINATION ${INSTALL_QMLDIR}/Cutefish/NetworkManagement) -install(FILES qmldir DESTINATION ${INSTALL_QMLDIR}/Cutefish/NetworkManagement) \ No newline at end of file +install(FILES qmldir DESTINATION ${INSTALL_QMLDIR}/Cutefish/NetworkManagement) diff --git a/networkmanagement/activeconnection.cpp b/networkmanagement/activeconnection.cpp new file mode 100644 index 0000000..18a6301 --- /dev/null +++ b/networkmanagement/activeconnection.cpp @@ -0,0 +1,91 @@ +/* + * Copyright (C) 2021 CutefishOS Team. + * + * Author: cutefishos + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "activeconnection.h" + +ActiveConnection::ActiveConnection(QObject *parent) + : QObject(parent) + , m_wirelessNetwork(nullptr) +{ + statusChanged(NetworkManager::status()); + connect(NetworkManager::notifier(), &NetworkManager::Notifier::statusChanged, this, &ActiveConnection::statusChanged); +} + +void ActiveConnection::statusChanged(NetworkManager::Status status) +{ + if (status == NetworkManager::Connected) { + NetworkManager::ActiveConnection::Ptr activeConnection = NetworkManager::primaryConnection(); + + if (activeConnection) { + NetworkManager::ConnectionSettings::ConnectionType type = activeConnection->type(); + if ((type == NetworkManager::ConnectionSettings::Wireless) && activeConnection->isValid()) { + NetworkManager::Connection::Ptr selectedConnection = activeConnection->connection(); + m_wirelessName = selectedConnection->name(); + emit wirelessNameChanged(); + + updateWirelessIcon(NetworkManager::findNetworkInterface(activeConnection->devices().first())); + } + } + + } else { + m_wirelessName.clear(); + emit wirelessNameChanged(); + } +} + +void ActiveConnection::updateWirelessIcon(NetworkManager::Device::Ptr device) +{ + if (!device) + return; + + // clear + if (m_wirelessNetwork) { + disconnect(m_wirelessNetwork.data()); + } + + NetworkManager::WirelessDevice::Ptr wifiDevice = device.objectCast(); + NetworkManager::AccessPoint::Ptr ap = wifiDevice->activeAccessPoint(); + + m_wirelessNetwork = wifiDevice->findNetwork(m_wirelessName); + + if (m_wirelessNetwork) { + updateWirelessIconForSignalStrength(m_wirelessNetwork->signalStrength()); + connect(m_wirelessNetwork.data(), &NetworkManager::WirelessNetwork::signalStrengthChanged, + this, &ActiveConnection::updateWirelessIconForSignalStrength, Qt::UniqueConnection); + } +} + +void ActiveConnection::updateWirelessIconForSignalStrength(int strength) +{ + int iconStrength = 0; + + if (strength == 0) + iconStrength = 0; + else if (strength <= 25) + iconStrength = 25; + else if (strength <= 50) + iconStrength = 50; + else if (strength <= 75) + iconStrength = 75; + else if (strength <= 100) + iconStrength = 100; + + m_wirelessIcon = QString("network-wireless-connected-%1").arg(iconStrength); + emit wirelessIconChanged(); +} diff --git a/networkmanagement/activeconnection.h b/networkmanagement/activeconnection.h new file mode 100644 index 0000000..6989d23 --- /dev/null +++ b/networkmanagement/activeconnection.h @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2021 CutefishOS Team. + * + * Author: cutefishos + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef ACTIVECONNECTION_H +#define ACTIVECONNECTION_H + +#include + +#include +#include +#include +#include + +class ActiveConnection : public QObject +{ + Q_OBJECT + Q_PROPERTY(QString wirelessName READ wirelessName NOTIFY wirelessNameChanged) + Q_PROPERTY(QString wirelessIcon READ wirelessIcon NOTIFY wirelessIconChanged) + +public: + explicit ActiveConnection(QObject *parent = nullptr); + + QString wirelessName() { return m_wirelessName; } + QString wirelessIcon() { return m_wirelessIcon; } + +signals: + void wirelessNameChanged(); + void wirelessIconChanged(); + +private slots: + void statusChanged(NetworkManager::Status status); + void updateWirelessIcon(NetworkManager::Device::Ptr device); + void updateWirelessIconForSignalStrength(int strength); + +private: + QString m_wirelessName; + QString m_wirelessIcon; + + NetworkManager::WirelessNetwork::Ptr m_wirelessNetwork; +}; + +#endif // ACTIVECONNECTION_H diff --git a/networkmanagement/connectionicon.cpp b/networkmanagement/connectionicon.cpp deleted file mode 100644 index 74c2b56..0000000 --- a/networkmanagement/connectionicon.cpp +++ /dev/null @@ -1,657 +0,0 @@ -/* - Copyright 2013 Jan Grulich - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) version 3, or any - later version accepted by the membership of KDE e.V. (or its - successor approved by the membership of KDE e.V.), which shall - act as a proxy defined in Section 6 of version 3 of the license. - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - You should have received a copy of the GNU Lesser General Public - License along with this library. If not, see . -*/ - -#include "connectionicon.h" -#include "uiutils.h" - -#include -#include -#include -#include -#include -#include -#include -#include - -#if WITH_MODEMMANAGER_SUPPORT -#include -#endif - -ConnectionIcon::ConnectionIcon(QObject* parent) - : QObject(parent) - , m_signal(0) - , m_wirelessNetwork(nullptr) - , m_connecting(false) - , m_limited(false) - , m_vpn(false) -#if WITH_MODEMMANAGER_SUPPORT - , m_modemNetwork(nullptr) -#endif -{ - connect(NetworkManager::notifier(), &NetworkManager::Notifier::primaryConnectionChanged, this, &ConnectionIcon::primaryConnectionChanged); - connect(NetworkManager::notifier(), &NetworkManager::Notifier::activatingConnectionChanged, this, &ConnectionIcon::activatingConnectionChanged); - connect(NetworkManager::notifier(), &NetworkManager::Notifier::activeConnectionAdded, this, &ConnectionIcon::activeConnectionAdded); - connect(NetworkManager::notifier(), &NetworkManager::Notifier::connectivityChanged, this, &ConnectionIcon::connectivityChanged); - connect(NetworkManager::notifier(), &NetworkManager::Notifier::deviceAdded, this, &ConnectionIcon::deviceAdded); - connect(NetworkManager::notifier(), &NetworkManager::Notifier::deviceRemoved, this, &ConnectionIcon::deviceRemoved); - connect(NetworkManager::notifier(), &NetworkManager::Notifier::networkingEnabledChanged, this, &ConnectionIcon::networkingEnabledChanged); - connect(NetworkManager::notifier(), &NetworkManager::Notifier::statusChanged, this, &ConnectionIcon::statusChanged); - connect(NetworkManager::notifier(), &NetworkManager::Notifier::wirelessEnabledChanged, this, &ConnectionIcon::wirelessEnabledChanged); - connect(NetworkManager::notifier(), &NetworkManager::Notifier::wirelessHardwareEnabledChanged, this, &ConnectionIcon::wirelessEnabledChanged); - connect(NetworkManager::notifier(), &NetworkManager::Notifier::wwanEnabledChanged, this, &ConnectionIcon::wwanEnabledChanged); - connect(NetworkManager::notifier(), &NetworkManager::Notifier::wwanHardwareEnabledChanged, this, &ConnectionIcon::wwanEnabledChanged); - - for (const NetworkManager::Device::Ptr &device : NetworkManager::networkInterfaces()) { - if (device->type() == NetworkManager::Device::Ethernet) { - NetworkManager::WiredDevice::Ptr wiredDevice = device.staticCast(); - if (wiredDevice) { - connect(wiredDevice.data(), &NetworkManager::WiredDevice::carrierChanged, this, &ConnectionIcon::carrierChanged); - } - } else if (device->type() == NetworkManager::Device::Wifi) { - NetworkManager::WirelessDevice::Ptr wifiDevice = device.staticCast(); - if (wifiDevice) { - connect(wifiDevice.data(), &NetworkManager::WirelessDevice::availableConnectionAppeared, this, &ConnectionIcon::wirelessNetworkAppeared); - connect(wifiDevice.data(), &NetworkManager::WirelessDevice::networkAppeared, this, &ConnectionIcon::wirelessNetworkAppeared); - } - } - } - - for (const NetworkManager::ActiveConnection::Ptr &activeConnection : NetworkManager::activeConnections()) { - addActiveConnection(activeConnection->path()); - } - setStates(); - - setIcons(); - - QDBusPendingReply pendingReply = NetworkManager::checkConnectivity(); - QDBusPendingCallWatcher *callWatcher = new QDBusPendingCallWatcher(pendingReply); - connect(callWatcher, &QDBusPendingCallWatcher::finished, this, [this] (QDBusPendingCallWatcher *watcher) { - QDBusPendingReply reply = *watcher; - if (reply.isValid()) { - connectivityChanged((NetworkManager::Connectivity)reply.value()); - } - watcher->deleteLater(); - }); -} - -ConnectionIcon::~ConnectionIcon() -{ -} - -bool ConnectionIcon::connecting() const -{ - return m_connecting; -} - -QString ConnectionIcon::connectionIcon() const -{ - if (m_vpn && !m_connectionIcon.contains("available")) { - return m_connectionIcon + "-locked"; - } - - if (m_limited && !m_connectionIcon.contains("available")) { - return m_connectionIcon + "-limited"; - } - - return m_connectionIcon; -} - -QString ConnectionIcon::connectionTooltipIcon() const -{ - return m_connectionTooltipIcon; -} - -QString ConnectionIcon::currentSSID() const -{ - return m_currentSSID; -} - -void ConnectionIcon::activatingConnectionChanged(const QString& connection) -{ - Q_UNUSED(connection); - setIcons(); -} - -void ConnectionIcon::addActiveConnection(const QString &activeConnection) -{ - NetworkManager::ActiveConnection::Ptr active = NetworkManager::findActiveConnection(activeConnection); - - if (active) { - NetworkManager::VpnConnection::Ptr vpnConnection; - connect(active.data(), &NetworkManager::ActiveConnection::destroyed, this, &ConnectionIcon::activeConnectionDestroyed); - if (active->vpn()) { - vpnConnection = active.objectCast(); - connect(vpnConnection.data(), &NetworkManager::VpnConnection::stateChanged, this, &ConnectionIcon::vpnConnectionStateChanged); - } else { - connect(active.data(), &NetworkManager::ActiveConnection::stateChanged, this, &ConnectionIcon::activeConnectionStateChanged, Qt::UniqueConnection); - } - } -} - -void ConnectionIcon::activeConnectionAdded(const QString &activeConnection) -{ - addActiveConnection(activeConnection); - setStates(); -} - -void ConnectionIcon::activeConnectionStateChanged(NetworkManager::ActiveConnection::State state) -{ - Q_UNUSED(state); - setStates(); -} - -void ConnectionIcon::activeConnectionDestroyed() -{ - setStates(); -} - -void ConnectionIcon::carrierChanged(bool carrier) -{ - Q_UNUSED(carrier); - setIcons(); -} - -void ConnectionIcon::connectivityChanged(NetworkManager::Connectivity conn) -{ - const bool needsPortal = conn == NetworkManager::Portal; - if (needsPortal != m_needsPortal) { - m_needsPortal = needsPortal; - Q_EMIT needsPortalChanged(needsPortal); - } - setLimited(conn == NetworkManager::Portal || conn == NetworkManager::Limited); -} - -void ConnectionIcon::deviceAdded(const QString& device) -{ - NetworkManager::Device::Ptr dev = NetworkManager::findNetworkInterface(device); - - if (!dev) { - return; - } - - if (dev->type() == NetworkManager::Device::Ethernet) { - NetworkManager::WiredDevice::Ptr wiredDev = dev.objectCast(); - connect(wiredDev.data(), &NetworkManager::WiredDevice::carrierChanged, this, &ConnectionIcon::carrierChanged); - } -} - -void ConnectionIcon::deviceRemoved(const QString& device) -{ - Q_UNUSED(device); - - if (NetworkManager::status() == NetworkManager::Disconnected) { - setDisconnectedIcon(); - } -} - -#if WITH_MODEMMANAGER_SUPPORT -void ConnectionIcon::modemNetworkRemoved() -{ - m_modemNetwork.clear(); -} - -void ConnectionIcon::modemSignalChanged(const ModemManager::SignalQualityPair &signalQuality) -{ - int diff = m_signal - signalQuality.signal; - - if (diff >= 10 || - diff <= -10) { - m_signal = signalQuality.signal; - - setIconForModem(); - } -} -#endif - -void ConnectionIcon::networkingEnabledChanged(bool enabled) -{ - if (!enabled) { - setConnectionIcon("network-unavailable"); - } -} - -void ConnectionIcon::primaryConnectionChanged(const QString& connection) -{ - if (!connection.isEmpty()) { - setIcons(); - } -} - -void ConnectionIcon::statusChanged(NetworkManager::Status status) -{ - if (status == NetworkManager::Disconnected) { - setDisconnectedIcon(); - } -} - -void ConnectionIcon::vpnConnectionStateChanged(NetworkManager::VpnConnection::State state, NetworkManager::VpnConnection::StateChangeReason reason) -{ - Q_UNUSED(state); - Q_UNUSED(reason); - setStates(); - setIcons(); -} - -void ConnectionIcon::wirelessEnabledChanged(bool enabled) -{ - Q_UNUSED(enabled); - - m_currentSSID = ""; - emit currentSSIDChanged(); - - setIcons(); -} - -void ConnectionIcon::wwanEnabledChanged(bool enabled) -{ - Q_UNUSED(enabled); - setIcons(); - -} - -void ConnectionIcon::wirelessNetworkAppeared(const QString& network) -{ - Q_UNUSED(network); - setIcons(); -} - -void ConnectionIcon::setStates() -{ - bool connecting = false; - bool vpn = false; - for (const NetworkManager::ActiveConnection::Ptr &activeConnection : NetworkManager::activeConnections()) { - NetworkManager::VpnConnection::Ptr vpnConnection; - if (activeConnection->vpn()) { - vpnConnection = activeConnection.objectCast(); - } - - if (!vpnConnection) { - if (activeConnection->state() == NetworkManager::ActiveConnection::Activating && UiUtils::isConnectionTypeSupported(activeConnection->type())) { - connecting = true; - } - if (activeConnection->type() == NetworkManager::ConnectionSettings::ConnectionType::WireGuard) { - vpn = true; - } - } else { - if (vpnConnection->state() == NetworkManager::VpnConnection::Activated) { - vpn = true; - } else if (vpnConnection->state() == NetworkManager::VpnConnection::Prepare || - vpnConnection->state() == NetworkManager::VpnConnection::NeedAuth || - vpnConnection->state() == NetworkManager::VpnConnection::Connecting || - vpnConnection->state() == NetworkManager::VpnConnection::GettingIpConfig) { - connecting = true; - } - } - } - - setVpn(vpn); - setConnecting(connecting); -} - -void ConnectionIcon::setIcons() -{ - m_signal = 0; -#if WITH_MODEMMANAGER_SUPPORT - if (m_modemNetwork) { - disconnect(m_modemNetwork.data(), nullptr, this, nullptr); - m_modemNetwork.clear(); - } -#endif - if (m_wirelessNetwork) { - disconnect(m_wirelessNetwork.data(), nullptr, this, nullptr); - m_wirelessNetwork.clear(); - } - - NetworkManager::ActiveConnection::Ptr connection = NetworkManager::activatingConnection(); - - // Set icon based on the current primary connection if the activating connection is virtual - // since we're not setting icons for virtual connections - if (!connection - || (connection && UiUtils::isConnectionTypeVirtual(connection->type())) - || connection->type() == NetworkManager::ConnectionSettings::WireGuard) { - connection = NetworkManager::primaryConnection(); - } - - /* Fallback: If we still don't have an active connection with default route or the default route goes through a connection - of generic type (some type of VPNs) we need to go through all other active connections and pick the one with - highest probability of being the main one (order is: vpn, wired, wireless, gsm, cdma, bluetooth) */ - if ((!connection && !NetworkManager::activeConnections().isEmpty()) || (connection && connection->type() == NetworkManager::ConnectionSettings::Generic) - || (connection && connection->type() == NetworkManager::ConnectionSettings::Tun)) { - for (const NetworkManager::ActiveConnection::Ptr &activeConnection : NetworkManager::activeConnections()) { - const NetworkManager::ConnectionSettings::ConnectionType type = activeConnection->type(); - if (type == NetworkManager::ConnectionSettings::Bluetooth) { - if (connection && connection->type() <= NetworkManager::ConnectionSettings::Bluetooth) { - connection = activeConnection; - } - } else if (type == NetworkManager::ConnectionSettings::Cdma) { - if (connection && connection->type() <= NetworkManager::ConnectionSettings::Cdma) { - connection = activeConnection; - } - } else if (type == NetworkManager::ConnectionSettings::Gsm) { - if (connection && connection->type() <= NetworkManager::ConnectionSettings::Gsm) { - connection = activeConnection; - } - } else if (type == NetworkManager::ConnectionSettings::Vpn) { - connection = activeConnection; - } else if (type == NetworkManager::ConnectionSettings::WireGuard) { - connection = activeConnection; - } else if (type == NetworkManager::ConnectionSettings::Wired) { - if (connection && (connection->type() != NetworkManager::ConnectionSettings::Vpn - || connection->type() != NetworkManager::ConnectionSettings::WireGuard)) { - connection = activeConnection; - } - } else if (type == NetworkManager::ConnectionSettings::Wireless) { - if (connection && (connection->type() != NetworkManager::ConnectionSettings::Vpn && - (connection->type() != NetworkManager::ConnectionSettings::Wired))) { - connection = activeConnection; - } - } - } - } - - if (connection && !connection->devices().isEmpty()) { - NetworkManager::Device::Ptr device = NetworkManager::findNetworkInterface(connection->devices().first()); - - if (device) { - NetworkManager::Device::Type type = device->type(); - if (type == NetworkManager::Device::Wifi) { - NetworkManager::WirelessDevice::Ptr wifiDevice = device.objectCast(); - if (wifiDevice->mode() == NetworkManager::WirelessDevice::Adhoc) { - setWirelessIconForSignalStrength(100); - } else { - NetworkManager::AccessPoint::Ptr ap = wifiDevice->activeAccessPoint(); - if (ap) { - setWirelessIcon(device, ap->ssid()); - } - } - } else if (type == NetworkManager::Device::Ethernet) { - setConnectionIcon("network-wired-activated"); - setConnectionTooltipIcon("network-wired-activated"); - } else if (type == NetworkManager::Device::Modem) { -#if WITH_MODEMMANAGER_SUPPORT - setModemIcon(device); -#else - setConnectionIcon("network-mobile-0"); - setConnectionTooltipIcon("phone"); -#endif - } else if (type == NetworkManager::Device::Bluetooth) { - NetworkManager::BluetoothDevice::Ptr btDevice = device.objectCast(); - if (btDevice) { - if (btDevice->bluetoothCapabilities().testFlag(NetworkManager::BluetoothDevice::Dun)) { -#if WITH_MODEMMANAGER_SUPPORT - setModemIcon(device); -#else - setConnectionIcon("network-mobile-0"); - setConnectionTooltipIcon("phone"); -#endif - } else { - setConnectionIcon("network-bluetooth-activated"); - setConnectionTooltipIcon("preferences-system-bluetooth"); - } - } - } else if (type == 29) { // TODO change to WireGuard enum value once it is added - // WireGuard is a VPN but is not implemented - // in NetworkManager as a VPN, so we don't want to - // do anything just because it has a device - // associated with it. - } else { - // Ignore other devices (bond/bridge/team etc.) - setDisconnectedIcon(); - } - } - } else { - setDisconnectedIcon(); - } -} - -void ConnectionIcon::setDisconnectedIcon() -{ - // if (Configuration::airplaneModeEnabled()) { - // setConnectionIcon(QStringLiteral("network-flightmode-on")); - // return; - // } - - if (NetworkManager::status() == NetworkManager::Unknown || - NetworkManager::status() == NetworkManager::Asleep) { - setConnectionIcon("network-unavailable"); - return; - } - - bool wired = false; - bool wireless = false; - bool modem = false; - - m_limited = false; - m_vpn = false; - - for (const NetworkManager::Device::Ptr &device : NetworkManager::networkInterfaces()) { - if (device->type() == NetworkManager::Device::Ethernet) { - NetworkManager::WiredDevice::Ptr wiredDev = device.objectCast(); - if (wiredDev->carrier()) { - wired = true; - } - } else if (device->type() == NetworkManager::Device::Wifi && - NetworkManager::isWirelessEnabled() && - NetworkManager::isWirelessHardwareEnabled()) { - NetworkManager::WirelessDevice::Ptr wifiDevice = device.objectCast(); - if (!wifiDevice->accessPoints().isEmpty() || !wifiDevice->availableConnections().isEmpty()) { - wireless = true; - } - } else if (device->type() == NetworkManager::Device::Modem && - NetworkManager::isWwanEnabled() && - NetworkManager::isWwanHardwareEnabled()) { - modem = true; - } - } - - if (wired) { - setConnectionIcon("network-wired-available"); - setConnectionTooltipIcon("network-wired"); - return; - } else if (wireless) { - setConnectionIcon("network-wireless-available"); - setConnectionTooltipIcon("network-wireless-connected-00"); - return; - } else if (modem) { - setConnectionIcon("network-mobile-available"); - setConnectionTooltipIcon("phone"); - return; - } else { - setConnectionIcon("network-unavailable"); - setConnectionTooltipIcon("network-wired"); - } -} - -#if WITH_MODEMMANAGER_SUPPORT -void ConnectionIcon::setModemIcon(const NetworkManager::Device::Ptr & device) -{ - NetworkManager::ModemDevice::Ptr modemDevice = device.objectCast(); - - if (!modemDevice) { - setConnectionIcon("network-mobile-100"); - - return; - } - - ModemManager::ModemDevice::Ptr modem = ModemManager::findModemDevice(device->udi()); - if (modem) { - if (modem->hasInterface(ModemManager::ModemDevice::ModemInterface)) { - m_modemNetwork = modem->interface(ModemManager::ModemDevice::ModemInterface).objectCast(); - } - } - - if (m_modemNetwork) { - connect(m_modemNetwork.data(), &ModemManager::Modem::signalQualityChanged, this, &ConnectionIcon::modemSignalChanged, Qt::UniqueConnection); - connect(m_modemNetwork.data(), &ModemManager::Modem::accessTechnologiesChanged, this, &ConnectionIcon::setIconForModem, Qt::UniqueConnection); - connect(m_modemNetwork.data(), &ModemManager::Modem::destroyed, this, &ConnectionIcon::modemNetworkRemoved); - - m_signal = m_modemNetwork->signalQuality().signal; - setIconForModem(); - } else { - setConnectionIcon("network-mobile-0"); - setConnectionTooltipIcon("phone"); - return; - } -} - -void ConnectionIcon::setIconForModem() -{ - if (!m_signal) { - m_signal = m_modemNetwork->signalQuality().signal; - } - QString strength = "00"; - - if (m_signal == 0) { - strength = '0'; - } else if (m_signal < 20) { - strength = "20"; - } else if (m_signal < 40) { - strength = "40"; - } else if (m_signal < 60) { - strength = "60"; - } else if (m_signal < 80) { - strength = "80"; - } else { - strength = "100"; - } - - QString result; - - switch(m_modemNetwork->accessTechnologies()) { - case MM_MODEM_ACCESS_TECHNOLOGY_GSM: - case MM_MODEM_ACCESS_TECHNOLOGY_GSM_COMPACT: - result = "network-mobile-%1"; - break; - case MM_MODEM_ACCESS_TECHNOLOGY_GPRS: - result = "network-mobile-%1-gprs"; - break; - case MM_MODEM_ACCESS_TECHNOLOGY_EDGE: - result = "network-mobile-%1-edge"; - break; - case MM_MODEM_ACCESS_TECHNOLOGY_UMTS: - result = "network-mobile-%1-umts"; - break; - case MM_MODEM_ACCESS_TECHNOLOGY_HSDPA: - result = "network-mobile-%1-hsdpa"; - break; - case MM_MODEM_ACCESS_TECHNOLOGY_HSUPA: - result = "network-mobile-%1-hsupa"; - break; - case MM_MODEM_ACCESS_TECHNOLOGY_HSPA: - case MM_MODEM_ACCESS_TECHNOLOGY_HSPA_PLUS: - result = "network-mobile-%1-hspa"; - break; - case MM_MODEM_ACCESS_TECHNOLOGY_LTE: - result = "network-mobile-%1-lte"; - break; - default: - result = "network-mobile-%1"; - break; - } - - setConnectionIcon(QString(result).arg(strength)); - setConnectionTooltipIcon("phone"); -} -#endif - -void ConnectionIcon::setWirelessIcon(const NetworkManager::Device::Ptr &device, const QString& ssid) -{ - NetworkManager::WirelessDevice::Ptr wirelessDevice = device.objectCast(); - if (device) { - m_wirelessNetwork = wirelessDevice->findNetwork(ssid); - } else { - m_wirelessNetwork.clear(); - } - - if (m_wirelessNetwork) { - m_currentSSID = ssid; - emit currentSSIDChanged(); - - connect(m_wirelessNetwork.data(), &NetworkManager::WirelessNetwork::signalStrengthChanged, this, &ConnectionIcon::setWirelessIconForSignalStrength, Qt::UniqueConnection); - - setWirelessIconForSignalStrength(m_wirelessNetwork->signalStrength()); - } else { - setDisconnectedIcon(); - - m_currentSSID = ""; - emit currentSSIDChanged(); - } -} - -void ConnectionIcon::setWirelessIconForSignalStrength(int strength) -{ - int iconStrength = 100; - if (strength == 0) { - iconStrength = 0; - setConnectionTooltipIcon("network-wireless-connected-00"); - } else if (strength <= 25) { - iconStrength = 25; - setConnectionTooltipIcon("network-wireless-connected-25"); - } else if (strength <= 50) { - iconStrength = 50; - setConnectionTooltipIcon("network-wireless-connected-50"); - } else if (strength < 75) { - iconStrength = 75; - setConnectionTooltipIcon("network-wireless-connected-75"); - } else if (strength < 100) { - setConnectionTooltipIcon("network-wireless-connected-100"); - } - - QString icon = QString("network-wireless-%1").arg(iconStrength); - - setConnectionIcon(icon); -} - -void ConnectionIcon::setConnecting(bool connecting) -{ - if (connecting != m_connecting) { - m_connecting = connecting; - Q_EMIT connectingChanged(m_connecting); - } -} - -void ConnectionIcon::setConnectionIcon(const QString & icon) -{ - if (icon != m_connectionIcon) { - m_connectionIcon = icon; - Q_EMIT connectionIconChanged(connectionIcon()); - } -} - -void ConnectionIcon::setConnectionTooltipIcon(const QString & icon) -{ - if (icon != m_connectionTooltipIcon) { - m_connectionTooltipIcon = icon; - Q_EMIT connectionTooltipIconChanged(m_connectionTooltipIcon); - } -} - -void ConnectionIcon::setVpn(bool vpn) -{ - if (m_vpn != vpn) { - m_vpn = vpn; - Q_EMIT connectionIconChanged(connectionIcon()); - } -} - -void ConnectionIcon::setLimited(bool limited) -{ - if (m_limited != limited) { - m_limited = limited; - Q_EMIT connectionIconChanged(connectionIcon()); - } -} diff --git a/networkmanagement/connectionicon.h b/networkmanagement/connectionicon.h deleted file mode 100644 index f05ff56..0000000 --- a/networkmanagement/connectionicon.h +++ /dev/null @@ -1,108 +0,0 @@ -/* - Copyright 2013 Jan Grulich - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) version 3, or any - later version accepted by the membership of KDE e.V. (or its - successor approved by the membership of KDE e.V.), which shall - act as a proxy defined in Section 6 of version 3 of the license. - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - You should have received a copy of the GNU Lesser General Public - License along with this library. If not, see . -*/ - -#ifndef PLASMA_NM_CONNECTION_ICON_H -#define PLASMA_NM_CONNECTION_ICON_H - -#include -#include -#include -#include -#if WITH_MODEMMANAGER_SUPPORT -#include -#endif - -class ConnectionIcon : public QObject -{ - Q_OBJECT - Q_PROPERTY(bool connecting READ connecting NOTIFY connectingChanged) - Q_PROPERTY(QString connectionIcon READ connectionIcon NOTIFY connectionIconChanged) - Q_PROPERTY(QString connectionTooltipIcon READ connectionTooltipIcon NOTIFY connectionTooltipIconChanged) - Q_PROPERTY(bool needsPortal READ needsPortal NOTIFY needsPortalChanged) - Q_PROPERTY(QString currentSSID READ currentSSID NOTIFY currentSSIDChanged) - -public: - explicit ConnectionIcon(QObject* parent = nullptr); - ~ConnectionIcon() override; - - bool connecting() const; - QString connectionIcon() const; - QString connectionTooltipIcon() const; - - QString currentSSID() const; - - bool needsPortal() const { return m_needsPortal; } - -private Q_SLOTS: - void activatingConnectionChanged(const QString & connection); - void activeConnectionAdded(const QString & activeConnection); - void activeConnectionDestroyed(); - void activeConnectionStateChanged(NetworkManager::ActiveConnection::State state); - void carrierChanged(bool carrier); - void connectivityChanged(NetworkManager::Connectivity connectivity); - void deviceAdded(const QString & device); - void deviceRemoved(const QString & device); - void networkingEnabledChanged(bool enabled); - void primaryConnectionChanged(const QString & connection); -#if WITH_MODEMMANAGER_SUPPORT - void modemNetworkRemoved(); - void modemSignalChanged(const ModemManager::SignalQualityPair &signalQuality); - void setIconForModem(); -#endif - void statusChanged(NetworkManager::Status status); - void setWirelessIconForSignalStrength(int strength); - void vpnConnectionStateChanged(NetworkManager::VpnConnection::State state, NetworkManager::VpnConnection::StateChangeReason reason); - void wirelessEnabledChanged(bool enabled); - void wirelessNetworkAppeared(const QString &network); - void wwanEnabledChanged(bool enabled); -Q_SIGNALS: - void connectingChanged(bool connecting); - void connectionIconChanged(const QString & icon); - void connectionTooltipIconChanged(const QString & icon); - void needsPortalChanged(bool needsPortal); - void currentSSIDChanged(); - -private: - void addActiveConnection(const QString & activeConnection); - void setConnecting(bool connecting); - void setConnectionIcon(const QString & icon); - void setConnectionTooltipIcon(const QString & icon); - void setVpn(bool vpn); - void setLimited(bool limited); - uint m_signal; - NetworkManager::WirelessNetwork::Ptr m_wirelessNetwork; - - QString m_currentSSID; - - bool m_connecting; - bool m_limited; - bool m_vpn; - QString m_connectionIcon; - QString m_connectionTooltipIcon; - bool m_needsPortal = false; - - void setDisconnectedIcon(); - void setIcons(); - void setStates(); - void setWirelessIcon(const NetworkManager::Device::Ptr & device, const QString & ssid); -#if WITH_MODEMMANAGER_SUPPORT - ModemManager::Modem::Ptr m_modemNetwork; - void setModemIcon(const NetworkManager::Device::Ptr & device); -#endif -}; - -#endif // PLASMA_NM_CONNECTION_ICON_H diff --git a/networkmanagement/network.cpp b/networkmanagement/network.cpp deleted file mode 100644 index 75014c3..0000000 --- a/networkmanagement/network.cpp +++ /dev/null @@ -1,322 +0,0 @@ -#include "network.h" -#include "uiutils.h" -#include - -#include -#include - -Network::Network(QObject *parent) - : QObject(parent) - , m_wirelessNetwork(nullptr) -{ - ::passwd *pw = ::getpwuid(::getuid()); - m_userName = QString::fromLocal8Bit(pw->pw_name); - - connect(NetworkManager::notifier(), &NetworkManager::Notifier::networkingEnabledChanged, this, &Network::enabledChanged); - connect(NetworkManager::notifier(), &NetworkManager::Notifier::wirelessEnabledChanged, this, &Network::onWirelessEnabledChanged); - connect(NetworkManager::notifier(), &NetworkManager::Notifier::wirelessHardwareEnabledChanged, this, &Network::wirelessHardwareEnabledChanged); - connect(NetworkManager::notifier(), &NetworkManager::Notifier::statusChanged, this, &Network::statusChanged); - connect(NetworkManager::notifier(), &NetworkManager::Notifier::activatingConnectionChanged, this, &Network::activatingConnectionChanged); - - for (const NetworkManager::Device::Ptr &device : NetworkManager::networkInterfaces()) { - if (device->type() == NetworkManager::Device::Wifi) { - NetworkManager::WirelessDevice::Ptr wifiDevice = device.staticCast(); - if (wifiDevice) { - connect(wifiDevice.data(), &NetworkManager::WirelessDevice::availableConnectionAppeared, this, &Network::onWirelessNetworkAppeared); - connect(wifiDevice.data(), &NetworkManager::WirelessDevice::networkAppeared, this, &Network::onWirelessNetworkAppeared); - } - } - } - - statusChanged(NetworkManager::status()); - changeActiveConnections(); - updateIcons(); -} - -bool Network::isEnabled() const -{ - return NetworkManager::isNetworkingEnabled(); -} - -void Network::setEnabled(bool enabled) -{ - NetworkManager::setNetworkingEnabled(enabled); -} - -bool Network::isWirelessEnabled() const -{ - return NetworkManager::isWirelessEnabled(); -} - -void Network::setWirelessEnabled(bool enabled) -{ - NetworkManager::setWirelessEnabled(enabled); -} - -bool Network::isWirelessHardwareEnabled() const -{ - return NetworkManager::isWirelessHardwareEnabled(); -} - -QString Network::wirelessConnectionName() const -{ - return m_wirelessConnectionName; -} - -QString Network::wirelessIconName() const -{ - return m_wirelessIconName; -} - -Network::SortedConnectionType Network::connectionTypeToSortedType(NetworkManager::ConnectionSettings::ConnectionType type) -{ - switch (type) { - case NetworkManager::ConnectionSettings::Adsl: - return Network::Adsl; - break; - case NetworkManager::ConnectionSettings::Bluetooth: - return Network::Bluetooth; - break; - case NetworkManager::ConnectionSettings::Cdma: - return Network::Cdma; - break; - case NetworkManager::ConnectionSettings::Gsm: - return Network::Gsm; - break; - case NetworkManager::ConnectionSettings::Infiniband: - return Network::Infiniband; - break; - case NetworkManager::ConnectionSettings::OLPCMesh: - return Network::OLPCMesh; - break; - case NetworkManager::ConnectionSettings::Pppoe: - return Network::Pppoe; - break; - case NetworkManager::ConnectionSettings::Vpn: - return Network::Vpn; - break; - case NetworkManager::ConnectionSettings::Wired: - return Network::Wired; - break; - case NetworkManager::ConnectionSettings::Wireless: - return Network::Wireless; - break; - default: - return Network::Other; - break; - } -} - -void Network::statusChanged(NetworkManager::Status status) -{ - if (status == NetworkManager::ConnectedLinkLocal || - status == NetworkManager::ConnectedSiteOnly || - status == NetworkManager::Connected) { - changeActiveConnections(); - } - - if (status == NetworkManager::Disconnected) { - resetWireless(); - } -} - -void Network::changeActiveConnections() -{ - if (NetworkManager::status() != NetworkManager::Connected && - NetworkManager::status() != NetworkManager::ConnectedLinkLocal && - NetworkManager::status() != NetworkManager::ConnectedSiteOnly) { - - m_wirelessConnectionName = ""; - emit wirelessConnectionNameChanged(); - - return; - } - - QString activeConnections; - QList activeConnectionList = NetworkManager::activeConnections(); - std::sort(activeConnectionList.begin(), activeConnectionList.end(), [](const NetworkManager::ActiveConnection::Ptr &left, const NetworkManager::ActiveConnection::Ptr &right) { - return Network::connectionTypeToSortedType(left->type()) < Network::connectionTypeToSortedType(right->type()); - }); - - for (const NetworkManager::ActiveConnection::Ptr &active : activeConnectionList) { - if (active->devices().isEmpty() && !UiUtils::isConnectionTypeSupported(active->type())) - continue; - - NetworkManager::Device::Ptr device = NetworkManager::findNetworkInterface(active->devices().first()); - NetworkManager::Connection::Ptr connection = active->connection(); - bool connecting = false; - bool connected = false; - - if (active->state() == NetworkManager::ActiveConnection::Activated) - connected = true; - else if (active->state() == NetworkManager::ActiveConnection::Activating) - connecting = true; - - if (device->type() == NetworkManager::Device::Wifi) { - if (m_wirelessConnectionName != connection->name()) { - m_wirelessConnectionName = connection->name(); - emit wirelessConnectionNameChanged(); - - updateIcons(); - } - } - - connect(connection.data(), &NetworkManager::Connection::updated, this, &Network::changeActiveConnections, Qt::UniqueConnection); - } -} - -void Network::activatingConnectionChanged() -{ - updateIcons(); -} - -void Network::defaultChanged() -{ - statusChanged(NetworkManager::status()); -} - -void Network::onWirelessEnabledChanged() -{ - if (!isWirelessEnabled()) { - resetWireless(); - } else { - updateIcons(); - } - - emit wirelessEnabledChanged(); -} - -void Network::onWirelessNetworkAppeared(const QString& network) -{ - Q_UNUSED(network); - - updateIcons(); -} - -void Network::updateIcons() -{ - if (m_wirelessNetwork) { - disconnect(m_wirelessNetwork.data(), nullptr, this, nullptr); - m_wirelessNetwork.clear(); - } - - NetworkManager::ActiveConnection::Ptr connection = NetworkManager::activatingConnection(); - - // Set icon based on the current primary connection if the activating connection is virtual - // since we're not setting icons for virtual connections - if (!connection - || (connection && UiUtils::isConnectionTypeVirtual(connection->type())) - || connection->type() == NetworkManager::ConnectionSettings::WireGuard) { - connection = NetworkManager::primaryConnection(); - } - - /* Fallback: If we still don't have an active connection with default route or the default route goes through a connection - of generic type (some type of VPNs) we need to go through all other active connections and pick the one with - highest probability of being the main one (order is: vpn, wired, wireless, gsm, cdma, bluetooth) */ - if ((!connection && !NetworkManager::activeConnections().isEmpty()) || (connection && connection->type() == NetworkManager::ConnectionSettings::Generic) - || (connection && connection->type() == NetworkManager::ConnectionSettings::Tun)) { - for (const NetworkManager::ActiveConnection::Ptr &activeConnection : NetworkManager::activeConnections()) { - const NetworkManager::ConnectionSettings::ConnectionType type = activeConnection->type(); - if (type == NetworkManager::ConnectionSettings::Bluetooth) { - if (connection && connection->type() <= NetworkManager::ConnectionSettings::Bluetooth) { - connection = activeConnection; - } - } else if (type == NetworkManager::ConnectionSettings::Cdma) { - if (connection && connection->type() <= NetworkManager::ConnectionSettings::Cdma) { - connection = activeConnection; - } - } else if (type == NetworkManager::ConnectionSettings::Gsm) { - if (connection && connection->type() <= NetworkManager::ConnectionSettings::Gsm) { - connection = activeConnection; - } - } else if (type == NetworkManager::ConnectionSettings::Vpn) { - connection = activeConnection; - } else if (type == NetworkManager::ConnectionSettings::WireGuard) { - connection = activeConnection; - } else if (type == NetworkManager::ConnectionSettings::Wired) { - if (connection && (connection->type() != NetworkManager::ConnectionSettings::Vpn - || connection->type() != NetworkManager::ConnectionSettings::WireGuard)) { - connection = activeConnection; - } - } else if (type == NetworkManager::ConnectionSettings::Wireless) { - if (connection && (connection->type() != NetworkManager::ConnectionSettings::Vpn && - (connection->type() != NetworkManager::ConnectionSettings::Wired))) { - connection = activeConnection; - } - } - } - } - - if (connection && !connection->devices().isEmpty()) { - NetworkManager::Device::Ptr device = NetworkManager::findNetworkInterface(connection->devices().first()); - - if (device) { - NetworkManager::Device::Type type = device->type(); - - if (type == NetworkManager::Device::Wifi) { - NetworkManager::WirelessDevice::Ptr wifiDevice = device.objectCast(); - - if (wifiDevice->mode() == NetworkManager::WirelessDevice::Adhoc) { - updateWirelessIconForSignalStrength(100); - } else { - NetworkManager::AccessPoint::Ptr ap = wifiDevice->activeAccessPoint(); - if (ap) { - updateWirelessIcon(device, ap->ssid()); - } - } - } else if (type == NetworkManager::Device::Ethernet) { - - } else { - resetWireless(); - } - } else { - resetWireless(); - } - } -} - -void Network::updateWirelessIcon(const NetworkManager::Device::Ptr &device, const QString& ssid) -{ - NetworkManager::WirelessDevice::Ptr wirelessDevice = device.objectCast(); - - if (device) { - m_wirelessNetwork = wirelessDevice->findNetwork(ssid); - } else { - m_wirelessNetwork.clear(); - } - - if (m_wirelessNetwork) { - connect(m_wirelessNetwork.data(), &NetworkManager::WirelessNetwork::signalStrengthChanged, this, &Network::updateWirelessIconForSignalStrength, Qt::UniqueConnection); - updateWirelessIconForSignalStrength(m_wirelessNetwork->signalStrength()); - } else { - resetWireless(); - } -} - -void Network::updateWirelessIconForSignalStrength(int strength) -{ - int iconStrength = 0; - - if (strength == 0) - iconStrength = 0; - else if (strength <= 25) - iconStrength = 25; - else if (strength <= 50) - iconStrength = 50; - else if (strength <= 75) - iconStrength = 75; - else if (strength <= 100) - iconStrength = 100; - - m_wirelessIconName = QString("network-wireless-connected-%1").arg(iconStrength); - emit wirelessIconNameChanged(); -} - -void Network::resetWireless() -{ - m_wirelessConnectionName = ""; - m_wirelessIconName = ""; - - emit wirelessConnectionNameChanged(); - emit wirelessIconNameChanged(); -} diff --git a/networkmanagement/network.h b/networkmanagement/network.h deleted file mode 100644 index 00297a9..0000000 --- a/networkmanagement/network.h +++ /dev/null @@ -1,78 +0,0 @@ -#ifndef NETWORK_H -#define NETWORK_H - -#include -#include -#include -#include - -class Network : public QObject -{ - Q_OBJECT - Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled NOTIFY enabledChanged) - Q_PROPERTY(bool wirelessEnabled READ isWirelessEnabled WRITE setWirelessEnabled NOTIFY wirelessEnabledChanged) - Q_PROPERTY(bool wirelessHardwareEnabled READ isWirelessHardwareEnabled NOTIFY wirelessHardwareEnabledChanged) - Q_PROPERTY(QString wirelessConnectionName READ wirelessConnectionName NOTIFY wirelessConnectionNameChanged) - Q_PROPERTY(QString wirelessIconName READ wirelessIconName NOTIFY wirelessIconNameChanged) - -public: - enum SortedConnectionType { - Wired, - Wireless, - Gsm, - Cdma, - Pppoe, - Adsl, - Infiniband, - OLPCMesh, - Bluetooth, - Vpn, - Other - }; - Q_ENUM(SortedConnectionType) - - explicit Network(QObject *parent = nullptr); - - bool isEnabled() const; - void setEnabled(bool enabled); - - bool isWirelessEnabled() const; - void setWirelessEnabled(bool enabled); - - bool isWirelessHardwareEnabled() const; - - QString wirelessConnectionName() const; - QString wirelessIconName() const; - - static SortedConnectionType connectionTypeToSortedType(NetworkManager::ConnectionSettings::ConnectionType type); - -signals: - void enabledChanged(); - void wirelessEnabledChanged(); - void wirelessHardwareEnabledChanged(); - void wirelessConnectionNameChanged(); - void wirelessIconNameChanged(); - -private slots: - void statusChanged(NetworkManager::Status status); - void changeActiveConnections(); - void activatingConnectionChanged(); - void defaultChanged(); - - void onWirelessEnabledChanged(); - void onWirelessNetworkAppeared(const QString& network); - - void updateIcons(); - void updateWirelessIcon(const NetworkManager::Device::Ptr &device, const QString& ssid); - void updateWirelessIconForSignalStrength(int strength); - - void resetWireless(); - -private: - QString m_userName; - QString m_wirelessConnectionName; - QString m_wirelessIconName; - NetworkManager::WirelessNetwork::Ptr m_wirelessNetwork; -}; - -#endif diff --git a/networkmanagement/qmlplugins.cpp b/networkmanagement/qmlplugins.cpp index cc4b428..d544c52 100644 --- a/networkmanagement/qmlplugins.cpp +++ b/networkmanagement/qmlplugins.cpp @@ -1,10 +1,9 @@ #include "qmlplugins.h" #include "networkmodel.h" #include "networkmodelitem.h" +#include "activeconnection.h" #include "appletproxymodel.h" #include "wiressitemsettings.h" -#include "connectionicon.h" -#include "network.h" #include "identitymodel.h" #include "handler.h" #include "enabledconnections.h" @@ -18,15 +17,14 @@ void QmlPlugins::registerTypes(const char* uri) { qmlRegisterUncreatableType(uri, 1, 0, "NetworkModelItem", QLatin1String("Cannot instantiate NetworkModelItem")); + qmlRegisterType(uri, 1, 0, "ActiveConnection"); qmlRegisterType(uri, 1, 0, "AppletProxyModel"); qmlRegisterType(uri, 1, 0, "NetworkModel"); qmlRegisterType(uri, 1, 0, "WirelessItemSettings"); - qmlRegisterType(uri, 1, 0, "ConnectionIcon"); - qmlRegisterType(uri, 1, 0, "Network"); qmlRegisterType(uri, 1, 0, "IdentityModel"); qmlRegisterType(uri, 1, 0, "Handler"); qmlRegisterType(uri, 1, 0, "EnabledConnections"); qmlRegisterType(uri, 1, 0, "WifiSettings"); qmlRegisterType(uri, 1, 0, "Configuration"); qmlRegisterUncreatableType(uri, 1, 0, "Enums", "You cannot create Enums on yourself"); -} \ No newline at end of file +}