parent
a1879a4cfc
commit
c59db765fa
@ -0,0 +1,91 @@
|
||||
/*
|
||||
* Copyright (C) 2021 CutefishOS Team.
|
||||
*
|
||||
* Author: cutefishos <cutefishos@foxmail.com>
|
||||
*
|
||||
* 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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#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::WirelessDevice>();
|
||||
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();
|
||||
}
|
@ -0,0 +1,58 @@
|
||||
/*
|
||||
* Copyright (C) 2021 CutefishOS Team.
|
||||
*
|
||||
* Author: cutefishos <cutefishos@foxmail.com>
|
||||
*
|
||||
* 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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef ACTIVECONNECTION_H
|
||||
#define ACTIVECONNECTION_H
|
||||
|
||||
#include <QObject>
|
||||
|
||||
#include <NetworkManagerQt/ActiveConnection>
|
||||
#include <NetworkManagerQt/Connection>
|
||||
#include <NetworkManagerQt/Settings>
|
||||
#include <NetworkManagerQt/WirelessDevice>
|
||||
|
||||
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
|
@ -1,657 +0,0 @@
|
||||
/*
|
||||
Copyright 2013 Jan Grulich <jgrulich@redhat.com>
|
||||
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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "connectionicon.h"
|
||||
#include "uiutils.h"
|
||||
|
||||
#include <NetworkManagerQt/BluetoothDevice>
|
||||
#include <NetworkManagerQt/Connection>
|
||||
#include <NetworkManagerQt/ConnectionSettings>
|
||||
#include <NetworkManagerQt/Device>
|
||||
#include <NetworkManagerQt/ModemDevice>
|
||||
#include <NetworkManagerQt/WiredDevice>
|
||||
#include <NetworkManagerQt/WirelessDevice>
|
||||
#include <NetworkManagerQt/WirelessSetting>
|
||||
|
||||
#if WITH_MODEMMANAGER_SUPPORT
|
||||
#include <ModemManagerQt/manager.h>
|
||||
#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<NetworkManager::WiredDevice>();
|
||||
if (wiredDevice) {
|
||||
connect(wiredDevice.data(), &NetworkManager::WiredDevice::carrierChanged, this, &ConnectionIcon::carrierChanged);
|
||||
}
|
||||
} else if (device->type() == NetworkManager::Device::Wifi) {
|
||||
NetworkManager::WirelessDevice::Ptr wifiDevice = device.staticCast<NetworkManager::WirelessDevice>();
|
||||
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<uint> pendingReply = NetworkManager::checkConnectivity();
|
||||
QDBusPendingCallWatcher *callWatcher = new QDBusPendingCallWatcher(pendingReply);
|
||||
connect(callWatcher, &QDBusPendingCallWatcher::finished, this, [this] (QDBusPendingCallWatcher *watcher) {
|
||||
QDBusPendingReply<uint> 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<NetworkManager::VpnConnection>();
|
||||
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<NetworkManager::WiredDevice>();
|
||||
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<NetworkManager::VpnConnection>();
|
||||
}
|
||||
|
||||
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<NetworkManager::WirelessDevice>();
|
||||
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<NetworkManager::BluetoothDevice>();
|
||||
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<NetworkManager::WiredDevice>();
|
||||
if (wiredDev->carrier()) {
|
||||
wired = true;
|
||||
}
|
||||
} else if (device->type() == NetworkManager::Device::Wifi &&
|
||||
NetworkManager::isWirelessEnabled() &&
|
||||
NetworkManager::isWirelessHardwareEnabled()) {
|
||||
NetworkManager::WirelessDevice::Ptr wifiDevice = device.objectCast<NetworkManager::WirelessDevice>();
|
||||
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<NetworkManager::ModemDevice>();
|
||||
|
||||
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<ModemManager::Modem>();
|
||||
}
|
||||
}
|
||||
|
||||
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<NetworkManager::WirelessDevice>();
|
||||
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());
|
||||
}
|
||||
}
|
@ -1,108 +0,0 @@
|
||||
/*
|
||||
Copyright 2013 Jan Grulich <jgrulich@redhat.com>
|
||||
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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef PLASMA_NM_CONNECTION_ICON_H
|
||||
#define PLASMA_NM_CONNECTION_ICON_H
|
||||
|
||||
#include <NetworkManagerQt/Manager>
|
||||
#include <NetworkManagerQt/ActiveConnection>
|
||||
#include <NetworkManagerQt/VpnConnection>
|
||||
#include <NetworkManagerQt/WirelessNetwork>
|
||||
#if WITH_MODEMMANAGER_SUPPORT
|
||||
#include <ModemManagerQt/modem.h>
|
||||
#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
|
@ -1,322 +0,0 @@
|
||||
#include "network.h"
|
||||
#include "uiutils.h"
|
||||
#include <QDebug>
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <pwd.h>
|
||||
|
||||
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<NetworkManager::WirelessDevice>();
|
||||
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<NetworkManager::ActiveConnection::Ptr> 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<NetworkManager::WirelessDevice>();
|
||||
|
||||
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<NetworkManager::WirelessDevice>();
|
||||
|
||||
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();
|
||||
}
|
@ -1,78 +0,0 @@
|
||||
#ifndef NETWORK_H
|
||||
#define NETWORK_H
|
||||
|
||||
#include <QObject>
|
||||
#include <NetworkManagerQt/Device>
|
||||
#include <NetworkManagerQt/Manager>
|
||||
#include <NetworkManagerQt/WirelessNetwork>
|
||||
|
||||
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
|
Loading…
Reference in New Issue