File indexing completed on 2024-12-08 13:24:49
0001 /* 0002 SPDX-FileCopyrightText: 2016-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 0007 #include "creatableconnectionsmodel.h" 0008 #include <KLocalizedString> 0009 #include <KPluginMetaData> 0010 #include <NetworkManagerQt/Manager> 0011 0012 CreatableConnectionItem::CreatableConnectionItem(const QString &typeName, 0013 const QString &typeSection, 0014 const QString &description, 0015 const QString &icon, 0016 NetworkManager::ConnectionSettings::ConnectionType type, 0017 const QString &vpnType, 0018 const QString &specificType, 0019 bool shared, 0020 QObject *parent) 0021 : QObject(parent) 0022 , m_shared(shared) 0023 , m_connectionType(type) 0024 , m_description(description) 0025 , m_icon(icon) 0026 , m_specificType(specificType) 0027 , m_typeName(typeName) 0028 , m_typeSection(typeSection) 0029 , m_vpnType(vpnType) 0030 { 0031 } 0032 0033 CreatableConnectionItem::CreatableConnectionItem(QObject *parent) 0034 : QObject(parent) 0035 { 0036 } 0037 0038 CreatableConnectionItem::~CreatableConnectionItem() = default; 0039 NetworkManager::ConnectionSettings::ConnectionType CreatableConnectionItem::connectionType() const 0040 { 0041 return m_connectionType; 0042 } 0043 0044 void CreatableConnectionItem::setConnectionType(NetworkManager::ConnectionSettings::ConnectionType type) 0045 { 0046 m_connectionType = type; 0047 } 0048 0049 QString CreatableConnectionItem::description() const 0050 { 0051 return m_description; 0052 } 0053 0054 void CreatableConnectionItem::setDescription(const QString &description) 0055 { 0056 m_description = description; 0057 } 0058 0059 QString CreatableConnectionItem::icon() const 0060 { 0061 return m_icon; 0062 } 0063 0064 void CreatableConnectionItem::setIcon(const QString &icon) 0065 { 0066 m_icon = icon; 0067 } 0068 0069 bool CreatableConnectionItem::shared() const 0070 { 0071 return m_shared; 0072 } 0073 0074 void CreatableConnectionItem::setShared(bool shared) 0075 { 0076 m_shared = shared; 0077 } 0078 0079 QString CreatableConnectionItem::specificType() const 0080 { 0081 return m_specificType; 0082 } 0083 0084 void CreatableConnectionItem::setSpecificType(const QString &specificType) 0085 { 0086 m_specificType = specificType; 0087 } 0088 0089 QString CreatableConnectionItem::typeName() const 0090 { 0091 return m_typeName; 0092 } 0093 0094 void CreatableConnectionItem::setTypeName(const QString &typeName) 0095 { 0096 m_typeName = typeName; 0097 } 0098 0099 QString CreatableConnectionItem::typeSection() const 0100 { 0101 return m_typeSection; 0102 } 0103 0104 void CreatableConnectionItem::setTypeSection(const QString &typeSection) 0105 { 0106 m_typeSection = typeSection; 0107 } 0108 0109 QString CreatableConnectionItem::vpnType() const 0110 { 0111 return m_vpnType; 0112 } 0113 0114 void CreatableConnectionItem::setVpnType(const QString &vpnType) 0115 { 0116 m_vpnType = vpnType; 0117 } 0118 0119 CreatableConnectionsModel::CreatableConnectionsModel(QObject *parent) 0120 : QAbstractListModel(parent) 0121 { 0122 populateModel(); 0123 } 0124 0125 void CreatableConnectionsModel::populateModel() 0126 { 0127 beginResetModel(); 0128 0129 if (!m_list.isEmpty()) { 0130 qDeleteAll(m_list); 0131 m_list.clear(); 0132 } 0133 0134 CreatableConnectionItem *connectionItem{nullptr}; 0135 connectionItem = new CreatableConnectionItem(i18n("DSL"), 0136 i18n("Hardware based connections"), 0137 i18n("Some DSL description"), 0138 QStringLiteral("network-modem"), 0139 NetworkManager::ConnectionSettings::Pppoe); 0140 m_list << connectionItem; 0141 0142 connectionItem = new CreatableConnectionItem(i18n("Infiniband"), 0143 i18n("Hardware based connections"), 0144 i18n("Some infiniband description"), 0145 QStringLiteral("network-wired"), 0146 NetworkManager::ConnectionSettings::Infiniband); 0147 m_list << connectionItem; 0148 0149 connectionItem = new CreatableConnectionItem(i18n("Mobile Broadband"), 0150 i18n("Hardware based connections"), 0151 i18n("Some mobile broadband description"), 0152 QStringLiteral("smartphone"), 0153 NetworkManager::ConnectionSettings::Gsm); 0154 m_list << connectionItem; 0155 0156 connectionItem = new CreatableConnectionItem(i18n("Wired Ethernet"), 0157 i18n("Hardware based connections"), 0158 i18n("Some wired ethernet description"), 0159 QStringLiteral("network-wired"), 0160 NetworkManager::ConnectionSettings::Wired); 0161 m_list << connectionItem; 0162 0163 connectionItem = new CreatableConnectionItem(i18n("Wired Ethernet (shared)"), 0164 i18n("Hardware based connections"), 0165 i18n("Some wired ethernet description"), 0166 QStringLiteral("network-wired"), 0167 NetworkManager::ConnectionSettings::Wired, 0168 QString(), 0169 QString(), 0170 true); // VpnType and SpecificType are empty 0171 m_list << connectionItem; 0172 0173 connectionItem = new CreatableConnectionItem(i18n("Wi-Fi"), 0174 i18n("Hardware based connections"), 0175 i18n("Some wi-fi description"), 0176 QStringLiteral("network-wireless"), 0177 NetworkManager::ConnectionSettings::Wireless); 0178 m_list << connectionItem; 0179 0180 connectionItem = new CreatableConnectionItem(i18n("Wi-Fi (shared)"), 0181 i18n("Hardware based connections"), 0182 i18n("Some wi-fi description"), 0183 QStringLiteral("network-wireless"), 0184 NetworkManager::ConnectionSettings::Wireless, 0185 QString(), 0186 QString(), 0187 true); // VpnType and SpecificType are empty 0188 m_list << connectionItem; 0189 0190 connectionItem = new CreatableConnectionItem(i18n("Bond"), 0191 i18n("Virtual connections"), 0192 i18n("Some bond description"), 0193 QStringLiteral("network-wired"), 0194 NetworkManager::ConnectionSettings::Bond, 0195 QString(), 0196 QString(), 0197 true); // VpnType and SpecificType are empty 0198 m_list << connectionItem; 0199 0200 connectionItem = new CreatableConnectionItem(i18n("Bridge"), 0201 i18n("Virtual connections"), 0202 i18n("Some bond description"), 0203 QStringLiteral("network-wired"), 0204 NetworkManager::ConnectionSettings::Bridge, 0205 QString(), 0206 QString(), 0207 true); // VpnType and SpecificType are empty 0208 m_list << connectionItem; 0209 0210 connectionItem = new CreatableConnectionItem(i18n("Team"), 0211 i18n("Virtual connections"), 0212 i18n("Some team description"), 0213 QStringLiteral("network-wired"), 0214 NetworkManager::ConnectionSettings::Team, 0215 QString(), 0216 QString(), 0217 true); // VpnType and SpecificType are empty 0218 m_list << connectionItem; 0219 0220 connectionItem = new CreatableConnectionItem(i18n("Vlan"), 0221 i18n("Virtual connections"), 0222 i18n("Some vlan description"), 0223 QStringLiteral("network-wired"), 0224 NetworkManager::ConnectionSettings::Vlan, 0225 QString(), 0226 QString(), 0227 true); // VpnType and SpecificType are empty 0228 m_list << connectionItem; 0229 0230 QVector<KPluginMetaData> plugins = KPluginMetaData::findPlugins(QStringLiteral("plasma/network/vpn")); 0231 0232 std::sort(plugins.begin(), plugins.end(), [](const auto &left, const auto &right) { 0233 return QString::localeAwareCompare(left.name(), right.name()) <= 0; 0234 }); 0235 0236 for (const auto &service : std::as_const(plugins)) { 0237 const QString vpnType = service.value(QStringLiteral("X-NetworkManager-Services")); 0238 const QString vpnSubType = service.value(QStringLiteral("X-NetworkManager-Services-Subtype")); 0239 const QString vpnDescription = service.description(); 0240 0241 connectionItem = new CreatableConnectionItem(service.name(), 0242 i18n("VPN connections"), 0243 vpnDescription, 0244 QStringLiteral("network-vpn"), 0245 NetworkManager::ConnectionSettings::Vpn, 0246 vpnType, 0247 vpnSubType, 0248 false); 0249 m_list << connectionItem; 0250 } 0251 0252 // WireGuard changed from VPN plugin to primary device in version 1.16 of NetworkManager 0253 if (NetworkManager::checkVersion(1, 16, 0)) { 0254 connectionItem = new CreatableConnectionItem(i18n("WireGuard"), 0255 i18n("VPN connections"), 0256 i18n("WireGuard"), 0257 QStringLiteral("network-vpn"), 0258 NetworkManager::ConnectionSettings::WireGuard, 0259 QStringLiteral("WireGuard"), 0260 QString(), 0261 true); // VpnType and SpecificType are empty 0262 m_list << connectionItem; 0263 } 0264 0265 // Placeholder for VPN import 0266 connectionItem = new CreatableConnectionItem(i18n("Import VPN connection…"), 0267 i18n("Other"), 0268 i18n("Import a saved configuration file"), 0269 QStringLiteral("document-import"), 0270 NetworkManager::ConnectionSettings::Vpn, 0271 QStringLiteral("imported"), 0272 QStringLiteral("imported"), 0273 false); 0274 m_list << connectionItem; 0275 endResetModel(); 0276 } 0277 0278 CreatableConnectionsModel::~CreatableConnectionsModel() = default; 0279 0280 QVariant CreatableConnectionsModel::data(const QModelIndex &index, int role) const 0281 { 0282 const int row = index.row(); 0283 0284 if (row >= 0 && row < m_list.count()) { 0285 CreatableConnectionItem *item = m_list.at(row); 0286 0287 switch (role) { 0288 case ConnectionDescription: 0289 return item->description(); 0290 case ConnectionIcon: 0291 return item->icon(); 0292 case ConnectionSpeficType: 0293 return item->specificType(); 0294 case ConnectionShared: 0295 return item->shared(); 0296 case ConnectionType: 0297 return item->connectionType(); 0298 case ConnectionTypeName: 0299 return item->typeName(); 0300 case ConnectionTypeSection: 0301 return item->typeSection(); 0302 case ConnectionVpnType: 0303 return item->vpnType(); 0304 default: 0305 break; 0306 } 0307 } 0308 0309 return {}; 0310 } 0311 0312 QHash<int, QByteArray> CreatableConnectionsModel::roleNames() const 0313 { 0314 QHash<int, QByteArray> roles = QAbstractListModel::roleNames(); 0315 roles[ConnectionDescription] = "ConnectionDescription"; 0316 roles[ConnectionIcon] = "ConnectionIcon"; 0317 roles[ConnectionSpeficType] = "ConnectionSpecificType"; 0318 roles[ConnectionShared] = "ConnectionShared"; 0319 roles[ConnectionType] = "ConnectionType"; 0320 roles[ConnectionTypeName] = "ConnectionTypeName"; 0321 roles[ConnectionTypeSection] = "ConnectionTypeSection"; 0322 roles[ConnectionVpnType] = "ConnectionVpnType"; 0323 0324 return roles; 0325 } 0326 0327 int CreatableConnectionsModel::rowCount(const QModelIndex &parent) const 0328 { 0329 Q_UNUSED(parent); 0330 return m_list.count(); 0331 }