File indexing completed on 2024-05-05 09:54:19

0001 /*
0002     SPDX-FileCopyrightText: 2013-2018 Jan Grulich <jgrulich@redhat.com>
0003 
0004     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0005 */
0006 #include "networkmodelitem.h"
0007 #include "networkmodel.h"
0008 #include "uiutils.h"
0009 
0010 #include <unordered_map>
0011 
0012 #include <NetworkManagerQt/AdslDevice>
0013 #include <NetworkManagerQt/BluetoothDevice>
0014 #include <NetworkManagerQt/BondDevice>
0015 #include <NetworkManagerQt/BridgeDevice>
0016 #include <NetworkManagerQt/InfinibandDevice>
0017 #include <NetworkManagerQt/Manager>
0018 #include <NetworkManagerQt/ModemDevice>
0019 #include <NetworkManagerQt/Settings>
0020 #include <NetworkManagerQt/TeamDevice>
0021 #include <NetworkManagerQt/VlanDevice>
0022 #include <NetworkManagerQt/VpnSetting>
0023 #include <NetworkManagerQt/WiredDevice>
0024 #include <NetworkManagerQt/WirelessDevice>
0025 #include <NetworkManagerQt/WirelessSetting>
0026 
0027 #include <KLocalizedString>
0028 
0029 #include <ModemManagerQt/Manager>
0030 #include <ModemManagerQt/Modem3Gpp>
0031 #include <ModemManagerQt/Modem>
0032 #include <ModemManagerQt/ModemCdma>
0033 #include <ModemManagerQt/ModemDevice>
0034 
0035 #include <QStringBuilder>
0036 
0037 namespace
0038 {
0039 using ConnectionType = NetworkManager::ConnectionSettings::ConnectionType;
0040 
0041 static const std::unordered_map<ConnectionType, QString> s_connectionTypeToString{
0042     {ConnectionType::Unknown, i18nc("@info:tooltip", "The connection type is Unknown")},
0043     {ConnectionType::Adsl, i18nc("@info:tooltip", "The connection type is ADSL")},
0044     {ConnectionType::Bluetooth, i18nc("@info:tooltip", "The connection type is Bluetooth")},
0045     {ConnectionType::Bridge, i18nc("@info:tooltip", "The connection type is Bridge")},
0046     {ConnectionType::Cdma, i18nc("@info:tooltip", "The connection type is CDMA")},
0047     {ConnectionType::Gsm, i18nc("@info:tooltip", "The connection type is GSM")},
0048     {ConnectionType::Infiniband, i18nc("@info:tooltip", "The connection type is Infiniband")},
0049     {ConnectionType::OLPCMesh, i18nc("@info:tooltip", "The connection type is OLPC Mesh")},
0050     {ConnectionType::Pppoe, i18nc("@info:tooltip", "The connection type is PPOPE")},
0051     {ConnectionType::Vlan, i18nc("@info:tooltip", "The connection type is VLAN")},
0052     {ConnectionType::Vpn, i18nc("@info:tooltip", "The connection type is VPN")},
0053     {ConnectionType::Wimax, i18nc("@info:tooltip", "The connection type is Wimax")},
0054     {ConnectionType::Wired, i18nc("@info:tooltip", "The connection type is Wired")},
0055     {ConnectionType::Wireless, i18nc("@info:tooltip", "The connection type is Wireless")},
0056     {ConnectionType::Team, i18nc("@info:tooltip", "The connection type is Team")},
0057     {ConnectionType::Generic, i18nc("@info:tooltip", "The connection type is Generic")},
0058     {ConnectionType::Tun, i18nc("@info:tooltip", "The connection type is Tunnel")},
0059     {ConnectionType::IpTunnel, i18nc("@info:tooltip", "The connection type is IP Tunnel")},
0060     {ConnectionType::WireGuard, i18nc("@info:tooltip", "The connection type is WireGuard")},
0061 };
0062 }
0063 
0064 NetworkModelItem::NetworkModelItem(QObject *parent)
0065     : QObject(parent)
0066     , m_connectionState(NetworkManager::ActiveConnection::Deactivated)
0067     , m_deviceState(NetworkManager::Device::UnknownState)
0068     , m_detailsValid(false)
0069     , m_delayModelUpdates(false)
0070     , m_duplicate(false)
0071     , m_mode(NetworkManager::WirelessSetting::Infrastructure)
0072     , m_securityType(NetworkManager::NoneSecurity)
0073     , m_signal(0)
0074     , m_slave(false)
0075     , m_type(NetworkManager::ConnectionSettings::Unknown)
0076     , m_vpnState(NetworkManager::VpnConnection::Unknown)
0077     , m_rxBytes(0)
0078     , m_txBytes(0)
0079 {
0080 }
0081 
0082 NetworkModelItem::NetworkModelItem(const NetworkModelItem *item, QObject *parent)
0083     : QObject(parent)
0084     , m_connectionPath(item->connectionPath())
0085     , m_connectionState(NetworkManager::ActiveConnection::Deactivated)
0086     , m_detailsValid(false)
0087     , m_delayModelUpdates(item->delayModelUpdates())
0088     , m_duplicate(true)
0089     , m_mode(item->mode())
0090     , m_name(item->name())
0091     , m_securityType(item->securityType())
0092     , m_slave(item->slave())
0093     , m_ssid(item->ssid())
0094     , m_timestamp(item->timestamp())
0095     , m_type(item->type())
0096     , m_uuid(item->uuid())
0097     , m_vpnState(NetworkManager::VpnConnection::Unknown)
0098     , m_rxBytes(0)
0099     , m_txBytes(0)
0100 {
0101 }
0102 
0103 NetworkModelItem::~NetworkModelItem() = default;
0104 
0105 QString NetworkModelItem::activeConnectionPath() const
0106 {
0107     return m_activeConnectionPath;
0108 }
0109 
0110 void NetworkModelItem::setActiveConnectionPath(const QString &path)
0111 {
0112     m_activeConnectionPath = path;
0113 }
0114 
0115 QString NetworkModelItem::connectionPath() const
0116 {
0117     return m_connectionPath;
0118 }
0119 
0120 void NetworkModelItem::setConnectionPath(const QString &path)
0121 {
0122     if (m_connectionPath != path) {
0123         m_connectionPath = path;
0124         m_changedRoles << NetworkModel::ConnectionPathRole << NetworkModel::UniRole;
0125     }
0126 }
0127 
0128 NetworkManager::ActiveConnection::State NetworkModelItem::connectionState() const
0129 {
0130     return m_connectionState;
0131 }
0132 
0133 void NetworkModelItem::setConnectionState(NetworkManager::ActiveConnection::State state)
0134 {
0135     if (m_connectionState != state) {
0136         m_connectionState = state;
0137         m_changedRoles << NetworkModel::ConnectionStateRole << NetworkModel::SectionRole;
0138         refreshIcon();
0139     }
0140 }
0141 
0142 QStringList NetworkModelItem::details() const
0143 {
0144     if (!m_detailsValid) {
0145         updateDetails();
0146     }
0147     return m_details;
0148 }
0149 
0150 QString NetworkModelItem::devicePath() const
0151 {
0152     return m_devicePath;
0153 }
0154 
0155 QString NetworkModelItem::deviceName() const
0156 {
0157     return m_deviceName;
0158 }
0159 
0160 void NetworkModelItem::setDeviceName(const QString &name)
0161 {
0162     if (m_deviceName != name) {
0163         m_deviceName = name;
0164         m_changedRoles << NetworkModel::DeviceName;
0165     }
0166 }
0167 
0168 void NetworkModelItem::setDevicePath(const QString &path)
0169 {
0170     if (m_devicePath != path) {
0171         m_devicePath = path;
0172         m_changedRoles << NetworkModel::DevicePathRole << NetworkModel::ItemTypeRole << NetworkModel::UniRole;
0173     }
0174 }
0175 
0176 QString NetworkModelItem::deviceState() const
0177 {
0178     return UiUtils::connectionStateToString(m_deviceState);
0179 }
0180 
0181 void NetworkModelItem::setDeviceState(const NetworkManager::Device::State state)
0182 {
0183     if (m_deviceState != state) {
0184         m_deviceState = state;
0185         m_changedRoles << NetworkModel::DeviceStateRole;
0186     }
0187 }
0188 
0189 bool NetworkModelItem::duplicate() const
0190 {
0191     return m_duplicate;
0192 }
0193 
0194 void NetworkModelItem::setIcon(const QString &icon)
0195 {
0196     if (icon != m_icon) {
0197         m_icon = icon;
0198         m_changedRoles << NetworkModel::ConnectionIconRole;
0199     }
0200 }
0201 
0202 void NetworkModelItem::refreshIcon()
0203 {
0204     setIcon(computeIcon());
0205 }
0206 
0207 QString NetworkModelItem::computeIcon() const
0208 {
0209     switch (m_type) {
0210     case NetworkManager::ConnectionSettings::Adsl:
0211         return QStringLiteral("network-mobile-100");
0212         break;
0213     case NetworkManager::ConnectionSettings::Bluetooth:
0214         return QStringLiteral("network-wireless-bluetooth-symbolic");
0215         break;
0216     case NetworkManager::ConnectionSettings::Bond:
0217         break;
0218     case NetworkManager::ConnectionSettings::Bridge:
0219         break;
0220     case NetworkManager::ConnectionSettings::Cdma:
0221     case NetworkManager::ConnectionSettings::Gsm:
0222         if (m_signal == 0) {
0223             return QStringLiteral("network-mobile-0");
0224         } else if (m_signal < 20) {
0225             return QStringLiteral("network-mobile-20");
0226         } else if (m_signal < 40) {
0227             return QStringLiteral("network-mobile-40");
0228         } else if (m_signal < 60) {
0229             return QStringLiteral("network-mobile-60");
0230         } else if (m_signal < 80) {
0231             return QStringLiteral("network-mobile-80");
0232         } else {
0233             return QStringLiteral("network-mobile-100");
0234         }
0235         break;
0236     case NetworkManager::ConnectionSettings::Infiniband:
0237         break;
0238     case NetworkManager::ConnectionSettings::OLPCMesh:
0239         break;
0240     case NetworkManager::ConnectionSettings::Pppoe:
0241         return QStringLiteral("network-mobile-100");
0242         break;
0243     case NetworkManager::ConnectionSettings::Vlan:
0244         break;
0245     case NetworkManager::ConnectionSettings::Vpn:
0246     case NetworkManager::ConnectionSettings::WireGuard:
0247         return QStringLiteral("network-vpn");
0248         break;
0249     case NetworkManager::ConnectionSettings::Wired:
0250         if (m_connectionState == NetworkManager::ActiveConnection::Activated) {
0251             return QStringLiteral("network-wired-activated");
0252         } else {
0253             return QStringLiteral("network-wired");
0254         }
0255         break;
0256     case NetworkManager::ConnectionSettings::Wireless:
0257         if (m_signal == 0) {
0258             if (m_mode == NetworkManager::WirelessSetting::Adhoc || m_mode == NetworkManager::WirelessSetting::Ap) {
0259                 return (m_securityType <= NetworkManager::NoneSecurity) ? QStringLiteral("network-wireless-100")
0260                                                                         : QStringLiteral("network-wireless-100-locked");
0261             }
0262             return (m_securityType <= NetworkManager::NoneSecurity) ? QStringLiteral("network-wireless-0") : QStringLiteral("network-wireless-0-locked");
0263         } else if (m_signal < 20) {
0264             return (m_securityType <= NetworkManager::NoneSecurity) ? QStringLiteral("network-wireless-20") : QStringLiteral("network-wireless-20-locked");
0265         } else if (m_signal < 40) {
0266             return (m_securityType <= NetworkManager::NoneSecurity) ? QStringLiteral("network-wireless-40") : QStringLiteral("network-wireless-40-locked");
0267         } else if (m_signal < 60) {
0268             return (m_securityType <= NetworkManager::NoneSecurity) ? QStringLiteral("network-wireless-60") : QStringLiteral("network-wireless-60-locked");
0269         } else if (m_signal < 80) {
0270             return (m_securityType <= NetworkManager::NoneSecurity) ? QStringLiteral("network-wireless-80") : QStringLiteral("network-wireless-80-locked");
0271         } else {
0272             return (m_securityType <= NetworkManager::NoneSecurity) ? QStringLiteral("network-wireless-100") : QStringLiteral("network-wireless-100-locked");
0273         }
0274         break;
0275     default:
0276         break;
0277     }
0278 
0279     if (m_connectionState == NetworkManager::ActiveConnection::Activated) {
0280         return QStringLiteral("network-wired-activated");
0281     } else {
0282         return QStringLiteral("network-wired");
0283     }
0284 }
0285 
0286 NetworkModelItem::ItemType NetworkModelItem::itemType() const
0287 {
0288     if (!m_devicePath.isEmpty() //
0289         || m_type == NetworkManager::ConnectionSettings::Bond //
0290         || m_type == NetworkManager::ConnectionSettings::Bridge //
0291         || m_type == NetworkManager::ConnectionSettings::Vlan //
0292         || m_type == NetworkManager::ConnectionSettings::Team //
0293         || ((NetworkManager::status() == NetworkManager::Connected //
0294              || NetworkManager::status() == NetworkManager::ConnectedLinkLocal //
0295              || NetworkManager::status() == NetworkManager::ConnectedSiteOnly)
0296             && (m_type == NetworkManager::ConnectionSettings::Vpn || m_type == NetworkManager::ConnectionSettings::WireGuard))) {
0297         if (m_connectionPath.isEmpty() && m_type == NetworkManager::ConnectionSettings::Wireless) {
0298             return NetworkModelItem::AvailableAccessPoint;
0299         } else {
0300             return NetworkModelItem::AvailableConnection;
0301         }
0302     }
0303     return NetworkModelItem::UnavailableConnection;
0304 }
0305 
0306 NetworkManager::WirelessSetting::NetworkMode NetworkModelItem::mode() const
0307 {
0308     return m_mode;
0309 }
0310 
0311 void NetworkModelItem::setMode(const NetworkManager::WirelessSetting::NetworkMode mode)
0312 {
0313     if (m_mode != mode) {
0314         m_mode = mode;
0315         refreshIcon();
0316     }
0317 }
0318 
0319 QString NetworkModelItem::name() const
0320 {
0321     return m_name;
0322 }
0323 
0324 void NetworkModelItem::setName(const QString &name)
0325 {
0326     if (m_name != name) {
0327         m_name = name;
0328         m_changedRoles << NetworkModel::ItemUniqueNameRole << NetworkModel::NameRole;
0329     }
0330 }
0331 
0332 QString NetworkModelItem::originalName() const
0333 {
0334     if (m_deviceName.isEmpty()) {
0335         return m_name;
0336     }
0337     return m_name % QLatin1String(" (") % m_deviceName % ')';
0338 }
0339 
0340 QString NetworkModelItem::sectionType() const
0341 {
0342     if (m_connectionState == NetworkManager::ActiveConnection::Deactivated) {
0343         return QStringLiteral("Available connections");
0344     } else {
0345         return {};
0346     }
0347 }
0348 
0349 NetworkManager::WirelessSecurityType NetworkModelItem::securityType() const
0350 {
0351     return m_securityType;
0352 }
0353 
0354 void NetworkModelItem::setSecurityType(NetworkManager::WirelessSecurityType type)
0355 {
0356     if (m_securityType != type) {
0357         m_securityType = type;
0358         m_changedRoles << NetworkModel::SecurityTypeStringRole << NetworkModel::SecurityTypeRole;
0359         refreshIcon();
0360     }
0361 }
0362 
0363 int NetworkModelItem::signal() const
0364 {
0365     return m_signal;
0366 }
0367 
0368 void NetworkModelItem::setSignal(int signal)
0369 {
0370     if (m_signal != signal) {
0371         m_signal = signal;
0372         m_changedRoles << NetworkModel::SignalRole;
0373         refreshIcon();
0374     }
0375 }
0376 
0377 bool NetworkModelItem::slave() const
0378 {
0379     return m_slave;
0380 }
0381 
0382 void NetworkModelItem::setSlave(bool slave)
0383 {
0384     if (m_slave != slave) {
0385         m_slave = slave;
0386         m_changedRoles << NetworkModel::SlaveRole;
0387     }
0388 }
0389 
0390 QString NetworkModelItem::specificPath() const
0391 {
0392     return m_specificPath;
0393 }
0394 
0395 void NetworkModelItem::setSpecificPath(const QString &path)
0396 {
0397     if (m_specificPath != path) {
0398         m_specificPath = path;
0399         m_changedRoles << NetworkModel::SpecificPathRole;
0400     }
0401 }
0402 
0403 QString NetworkModelItem::ssid() const
0404 {
0405     return m_ssid;
0406 }
0407 
0408 void NetworkModelItem::setSsid(const QString &ssid)
0409 {
0410     if (m_ssid != ssid) {
0411         m_ssid = ssid;
0412         m_changedRoles << NetworkModel::SsidRole << NetworkModel::UniRole;
0413     }
0414 }
0415 
0416 NetworkManager::ConnectionSettings::ConnectionType NetworkModelItem::type() const
0417 {
0418     return m_type;
0419 }
0420 
0421 QDateTime NetworkModelItem::timestamp() const
0422 {
0423     return m_timestamp;
0424 }
0425 
0426 void NetworkModelItem::setTimestamp(const QDateTime &date)
0427 {
0428     if (m_timestamp != date) {
0429         m_timestamp = date;
0430         m_changedRoles << NetworkModel::TimeStampRole;
0431     }
0432 }
0433 
0434 void NetworkModelItem::setType(NetworkManager::ConnectionSettings::ConnectionType type)
0435 {
0436     if (m_type == type) {
0437         return;
0438     }
0439 
0440     m_type = type;
0441 
0442     const auto it = s_connectionTypeToString.find(type);
0443     if (it != s_connectionTypeToString.end()) {
0444         m_accessibleDescription = it->second;
0445     } else {
0446         m_accessibleDescription = s_connectionTypeToString.at(NetworkManager::ConnectionSettings::ConnectionType::Unknown);
0447     }
0448 
0449     m_changedRoles << NetworkModel::TypeRole << NetworkModel::ItemTypeRole << NetworkModel::UniRole << Qt::AccessibleDescriptionRole;
0450 
0451     refreshIcon();
0452 }
0453 
0454 QString NetworkModelItem::accessibleDescription() const
0455 {
0456     return m_accessibleDescription;
0457 }
0458 
0459 QString NetworkModelItem::uni() const
0460 {
0461     if (m_type == NetworkManager::ConnectionSettings::Wireless && m_uuid.isEmpty()) {
0462         return m_ssid + '%' + m_devicePath;
0463     } else {
0464         return m_connectionPath + '%' + m_devicePath;
0465     }
0466 }
0467 
0468 QString NetworkModelItem::uuid() const
0469 {
0470     return m_uuid;
0471 }
0472 
0473 void NetworkModelItem::setUuid(const QString &uuid)
0474 {
0475     if (m_uuid != uuid) {
0476         m_uuid = uuid;
0477         m_changedRoles << NetworkModel::UuidRole;
0478     }
0479 }
0480 
0481 QString NetworkModelItem::vpnState() const
0482 {
0483     return UiUtils::vpnConnectionStateToString(m_vpnState);
0484 }
0485 
0486 void NetworkModelItem::setVpnState(NetworkManager::VpnConnection::State state)
0487 {
0488     if (m_vpnState != state) {
0489         m_vpnState = state;
0490         m_changedRoles << NetworkModel::VpnState;
0491     }
0492 }
0493 
0494 QString NetworkModelItem::vpnType() const
0495 {
0496     return m_vpnType;
0497 }
0498 
0499 void NetworkModelItem::setVpnType(const QString &type)
0500 {
0501     if (m_vpnType != type) {
0502         m_vpnType = type;
0503         m_changedRoles << NetworkModel::VpnType;
0504     }
0505 }
0506 
0507 qulonglong NetworkModelItem::rxBytes() const
0508 {
0509     return m_rxBytes;
0510 }
0511 
0512 void NetworkModelItem::setRxBytes(qulonglong bytes)
0513 {
0514     if (m_rxBytes != bytes) {
0515         m_rxBytes = bytes;
0516         m_changedRoles << NetworkModel::RxBytesRole;
0517     }
0518 }
0519 
0520 qulonglong NetworkModelItem::txBytes() const
0521 {
0522     return m_txBytes;
0523 }
0524 
0525 void NetworkModelItem::setTxBytes(qulonglong bytes)
0526 {
0527     if (m_txBytes != bytes) {
0528         m_txBytes = bytes;
0529         m_changedRoles << NetworkModel::TxBytesRole;
0530     }
0531 }
0532 
0533 bool NetworkModelItem::delayModelUpdates() const
0534 {
0535     return m_delayModelUpdates;
0536 }
0537 
0538 void NetworkModelItem::setDelayModelUpdates(bool delay)
0539 {
0540     // special case, does not need m_changedRoles
0541     m_delayModelUpdates = delay;
0542 }
0543 
0544 bool NetworkModelItem::operator==(const NetworkModelItem *item) const
0545 {
0546     if (!item->uuid().isEmpty() && !uuid().isEmpty()) {
0547         if (item->devicePath() == devicePath() && item->uuid() == uuid()) {
0548             return true;
0549         }
0550     } else if (item->type() == NetworkManager::ConnectionSettings::Wireless && type() == NetworkManager::ConnectionSettings::Wireless) {
0551         if (item->ssid() == ssid() && item->devicePath() == devicePath()) {
0552             return true;
0553         }
0554     }
0555 
0556     return false;
0557 }
0558 
0559 void NetworkModelItem::invalidateDetails()
0560 {
0561     m_detailsValid = false;
0562     m_changedRoles << NetworkModel::ConnectionDetailsRole;
0563 }
0564 
0565 void NetworkModelItem::updateDetails() const
0566 {
0567     m_detailsValid = true;
0568     m_details.clear();
0569 
0570     if (itemType() == NetworkModelItem::UnavailableConnection) {
0571         return;
0572     }
0573 
0574     NetworkManager::Device::Ptr device = NetworkManager::findNetworkInterface(m_devicePath);
0575 
0576     // Get IPv[46]Address and related nameservers + IPv[46] default gateway
0577     if (device && device->ipV4Config().isValid() && m_connectionState == NetworkManager::ActiveConnection::Activated) {
0578         if (!device->ipV4Config().addresses().isEmpty()) {
0579             QHostAddress addr = device->ipV4Config().addresses().first().ip();
0580             if (!addr.isNull() && addr.isGlobal()) {
0581                 m_details << i18n("IPv4 Address") << addr.toString();
0582             }
0583         }
0584         if (!device->ipV4Config().gateway().isEmpty()) {
0585             QString addr = device->ipV4Config().gateway();
0586             if (!addr.isNull()) {
0587                 m_details << i18n("IPv4 Default Gateway") << addr;
0588             }
0589         }
0590         if (!device->ipV4Config().nameservers().isEmpty()) {
0591             QHostAddress addr1 = device->ipV4Config().nameservers().first();
0592             QHostAddress addr2 = device->ipV4Config().nameservers().last();
0593             if (!addr1.isNull()) {
0594                 m_details << i18n("IPv4 Primary Nameserver") << addr1.toString();
0595             }
0596             if (!addr2.isNull() && !addr1.isNull()) {
0597                 if (addr2 != addr1) {
0598                     m_details << i18n("IPv4 Secondary Nameserver") << addr2.toString();
0599                 }
0600             }
0601         }
0602     }
0603 
0604     if (device && device->ipV6Config().isValid() && m_connectionState == NetworkManager::ActiveConnection::Activated) {
0605         if (!device->ipV6Config().addresses().isEmpty()) {
0606             QHostAddress addr = device->ipV6Config().addresses().first().ip();
0607             if (!addr.isNull() && addr.isGlobal() && !addr.isUniqueLocalUnicast()) {
0608                 m_details << i18n("IPv6 Address") << addr.toString();
0609             } else if (!addr.isNull() && addr.isGlobal() && addr.isUniqueLocalUnicast()) {
0610                 m_details << i18n("IPv6 ULA Address") << addr.toString();
0611             }
0612         }
0613         if (!device->ipV6Config().gateway().isEmpty()) {
0614             QString addr = device->ipV6Config().gateway();
0615             if (!addr.isNull()) {
0616                 m_details << i18n("IPv6 Default Gateway") << addr;
0617             }
0618         }
0619         if (!device->ipV6Config().nameservers().isEmpty()) {
0620             QHostAddress addr1 = device->ipV6Config().nameservers().first();
0621             QHostAddress addr2 = device->ipV6Config().nameservers().last();
0622             if (!addr1.isNull()) {
0623                 m_details << i18n("IPv6 Primary Nameserver") << addr1.toString();
0624             }
0625             if (!addr2.isNull() && !addr1.isNull()) {
0626                 if (addr2 != addr1) {
0627                     m_details << i18n("IPv6 Secondary Nameserver") << addr2.toString();
0628                 }
0629             }
0630         }
0631     }
0632     if (m_type == NetworkManager::ConnectionSettings::Wired) {
0633         NetworkManager::WiredDevice::Ptr wiredDevice = device.objectCast<NetworkManager::WiredDevice>();
0634         if (wiredDevice) {
0635             if (m_connectionState == NetworkManager::ActiveConnection::Activated) {
0636                 m_details << i18n("Connection speed") << UiUtils::connectionSpeed(wiredDevice->bitRate());
0637             }
0638             m_details << i18n("MAC Address") << wiredDevice->hardwareAddress();
0639         }
0640     } else if (m_type == NetworkManager::ConnectionSettings::Wireless) {
0641         NetworkManager::WirelessDevice::Ptr wirelessDevice = device.objectCast<NetworkManager::WirelessDevice>();
0642         m_details << i18n("Access Point (SSID)") << m_ssid;
0643         if (m_mode == NetworkManager::WirelessSetting::Infrastructure) {
0644             m_details << i18n("Signal Strength") << i18nc("WiFi signal strength percentage indicator", "%1%", m_signal);
0645         }
0646         m_details << i18n("Security Type") << UiUtils::labelFromWirelessSecurity(m_securityType);
0647         if (wirelessDevice) {
0648             if (m_connectionState == NetworkManager::ActiveConnection::Activated) {
0649                 m_details << i18n("Connection Speed") << UiUtils::connectionSpeed(wirelessDevice->bitRate());
0650             }
0651             const NetworkManager::AccessPoint::Ptr accessPoint = wirelessDevice->findAccessPoint(m_specificPath);
0652             if (accessPoint) {
0653                 m_details << i18n("Frequency") << UiUtils::wirelessFrequencyToString(accessPoint->frequency());
0654                 m_details << i18n("BSSID") << accessPoint->hardwareAddress();
0655             }
0656             m_details << i18n("MAC Address") << wirelessDevice->hardwareAddress();
0657         }
0658     } else if (m_type == NetworkManager::ConnectionSettings::Gsm || m_type == NetworkManager::ConnectionSettings::Cdma) {
0659         NetworkManager::ModemDevice::Ptr modemDevice = device.objectCast<NetworkManager::ModemDevice>();
0660         if (modemDevice) {
0661             ModemManager::ModemDevice::Ptr modem = ModemManager::findModemDevice(modemDevice->udi());
0662             if (modem) {
0663                 ModemManager::Modem::Ptr modemNetwork = modem->interface(ModemManager::ModemDevice::ModemInterface).objectCast<ModemManager::Modem>();
0664 
0665                 if (m_type == NetworkManager::ConnectionSettings::Gsm) {
0666                     ModemManager::Modem3gpp::Ptr gsmNet = modem->interface(ModemManager::ModemDevice::GsmInterface).objectCast<ModemManager::Modem3gpp>();
0667                     if (gsmNet) {
0668                         m_details << i18n("Operator") << gsmNet->operatorName();
0669                     }
0670                 } else {
0671                     ModemManager::ModemCdma::Ptr cdmaNet = modem->interface(ModemManager::ModemDevice::CdmaInterface).objectCast<ModemManager::ModemCdma>();
0672                     m_details << i18n("Network ID") << QStringLiteral("%1").arg(cdmaNet->nid());
0673                 }
0674 
0675                 if (modemNetwork) {
0676                     m_details << i18n("Signal Quality") << QStringLiteral("%1%").arg(modemNetwork->signalQuality().signal);
0677                     m_details << i18n("Access Technology") << UiUtils::convertAccessTechnologyToString(modemNetwork->accessTechnologies());
0678                 }
0679             }
0680         }
0681     } else if (m_type == NetworkManager::ConnectionSettings::Vpn) {
0682         m_details << i18n("VPN Plugin") << m_vpnType;
0683 
0684         if (m_connectionState == NetworkManager::ActiveConnection::Activated) {
0685             NetworkManager::ActiveConnection::Ptr active = NetworkManager::findActiveConnection(m_activeConnectionPath);
0686             NetworkManager::VpnConnection::Ptr vpnConnection;
0687 
0688             if (active) {
0689                 vpnConnection = NetworkManager::VpnConnection::Ptr(new NetworkManager::VpnConnection(active->path()), &QObject::deleteLater);
0690             }
0691 
0692             if (vpnConnection && !vpnConnection->banner().isEmpty()) {
0693                 m_details << i18n("Banner") << vpnConnection->banner().simplified();
0694             }
0695         }
0696     } else if (m_type == NetworkManager::ConnectionSettings::Bluetooth) {
0697         NetworkManager::BluetoothDevice::Ptr bluetoothDevice = device.objectCast<NetworkManager::BluetoothDevice>();
0698         if (bluetoothDevice) {
0699             m_details << i18n("Name") << bluetoothDevice->name();
0700             if (bluetoothDevice->bluetoothCapabilities() == NetworkManager::BluetoothDevice::Pan) {
0701                 m_details << i18n("Capabilities") << QStringLiteral("PAN");
0702             } else if (bluetoothDevice->bluetoothCapabilities() == NetworkManager::BluetoothDevice::Dun) {
0703                 m_details << i18n("Capabilities") << QStringLiteral("DUN");
0704             }
0705             m_details << i18n("MAC Address") << bluetoothDevice->hardwareAddress();
0706         }
0707     } else if (m_type == NetworkManager::ConnectionSettings::Infiniband) {
0708         NetworkManager::InfinibandDevice::Ptr infinibandDevice = device.objectCast<NetworkManager::InfinibandDevice>();
0709         m_details << i18n("Type") << i18n("Infiniband");
0710         if (infinibandDevice) {
0711             m_details << i18n("MAC Address") << infinibandDevice->hwAddress();
0712         }
0713     } else if (m_type == NetworkManager::ConnectionSettings::Bond) {
0714         NetworkManager::BondDevice::Ptr bondDevice = device.objectCast<NetworkManager::BondDevice>();
0715         m_details << i18n("Type") << i18n("Bond");
0716         if (bondDevice) {
0717             m_details << i18n("MAC Address") << bondDevice->hwAddress();
0718         }
0719     } else if (m_type == NetworkManager::ConnectionSettings::Bridge) {
0720         NetworkManager::BridgeDevice::Ptr bridgeDevice = device.objectCast<NetworkManager::BridgeDevice>();
0721         m_details << i18n("Type") << i18n("Bridge");
0722         if (bridgeDevice) {
0723             m_details << i18n("MAC Address") << bridgeDevice->hwAddress();
0724         }
0725     } else if (m_type == NetworkManager::ConnectionSettings::Vlan) {
0726         NetworkManager::VlanDevice::Ptr vlanDevice = device.objectCast<NetworkManager::VlanDevice>();
0727         m_details << i18n("Type") << i18n("Vlan");
0728         if (vlanDevice) {
0729             m_details << i18n("Vlan ID") << QString("%1").arg(vlanDevice->vlanId());
0730             m_details << i18n("MAC Address") << vlanDevice->hwAddress();
0731         }
0732     } else if (m_type == NetworkManager::ConnectionSettings::Adsl) {
0733         m_details << i18n("Type") << i18n("Adsl");
0734     } else if (m_type == NetworkManager::ConnectionSettings::Team) {
0735         NetworkManager::TeamDevice::Ptr teamDevice = device.objectCast<NetworkManager::TeamDevice>();
0736         m_details << i18n("Type") << i18n("Team");
0737         if (teamDevice) {
0738             m_details << i18n("MAC Address") << teamDevice->hwAddress();
0739         }
0740     }
0741 
0742     if (device && m_connectionState == NetworkManager::ActiveConnection::Activated) {
0743         m_details << i18n("Device") << device->interfaceName();
0744     }
0745 }
0746 
0747 #include "moc_networkmodelitem.cpp"