diff --git a/kcm/package/contents/ui/editor/ConnectionEditor.qml b/kcm/package/contents/ui/editor/ConnectionEditor.qml index 97ee5cf4..7d327ce1 100644 --- a/kcm/package/contents/ui/editor/ConnectionEditor.qml +++ b/kcm/package/contents/ui/editor/ConnectionEditor.qml @@ -1,121 +1,120 @@ /* Copyright 2018 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 . */ import QtQuick 2.6 import QtQuick.Layouts 1.3 import QtQuick.Controls 2.2 as QtControls import org.kde.kcm 1.2 import org.kde.kirigami 2.0 as Kirigami import org.kde.plasma.networkmanagement 0.2 as PlasmaNM SimpleKCM { id: connectionEditorPage title: connectionSetting.connectionNameTextField.text PlasmaNM.Utils { id: nmUtils } - ColumnLayout { spacing: Kirigami.Units.smallSpacing StackLayout { Layout.alignment: Qt.AlignHCenter Layout.fillWidth: true Layout.minimumWidth: Kirigami.Units.gridUnit * 25 Layout.maximumWidth: Kirigami.Units.gridUnit * 40 currentIndex: expertModeCheckbox.checked ? 1 : 0 ColumnLayout { id: simpleLayout //spacing is managed by FormLayout spacing: 0 ConnectionSetting { id: connectionSetting Layout.fillWidth: true twinFormLayouts: connectionSpecificSetting.item } Loader { id: connectionSpecificSetting Layout.fillWidth: true } } ColumnLayout { QtControls.TabBar { id: tabBar Layout.fillWidth: true QtControls.TabButton { text: connectionSetting.settingName } QtControls.TabButton { text: connectionSpecificSetting.item.settingName } // FIXME just placeholders for now QtControls.TabButton { text: i18n("IP") } } StackLayout { id: expertLayout Layout.fillWidth: true currentIndex: tabBar.currentIndex // Items will be re-parented } } // FIXME this is probably not the best solution onCurrentIndexChanged: { tabBar.currentIndex = 0 connectionSetting.parent = currentIndex ? expertLayout : simpleLayout connectionSpecificSetting.parent = currentIndex ? expertLayout : simpleLayout } } } function loadConnectionSettings() { connectionSetting.connectionNameTextField.text = connectionSettingsObject.id // Load general connection setting connectionSetting.loadSettings() // Load connection specific setting if (connectionSettingsObject.connectionType == PlasmaNM.Enums.Wired) { connectionSpecificSetting.source = "WiredSetting.qml" } else if (connectionSettingsObject.connectionType == PlasmaNM.Enums.Wireless) { connectionSpecificSetting.source = "WirelessSetting.qml" } connectionSpecificSetting.item.twinFormLayouts = connectionSetting; connectionSpecificSetting.item.loadSettings() } } diff --git a/kcm/package/contents/ui/editor/ConnectionSetting.qml b/kcm/package/contents/ui/editor/ConnectionSetting.qml index 871abda7..a313181f 100644 --- a/kcm/package/contents/ui/editor/ConnectionSetting.qml +++ b/kcm/package/contents/ui/editor/ConnectionSetting.qml @@ -1,144 +1,152 @@ /* Copyright 2018 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 . */ import QtQuick 2.6 import QtQuick.Layouts 1.3 import QtQuick.Controls 2.2 as QtControls import org.kde.kirigami 2.5 as Kirigami import org.kde.plasma.networkmanagement 0.2 as PlasmaNM Kirigami.FormLayout { id: connectionSetting property string settingName: i18n("Connection") property alias connectionNameTextField: connectionNameTextField QtControls.TextField { id: connectionNameTextField focus: true Kirigami.FormData.label: i18n("Network Name:") } QtControls.CheckBox { id: autoconnectCheckbox checked: true text: i18n("Automatically connect to this network when it is available") } RowLayout { Layout.fillWidth: true QtControls.CheckBox { id: allUsersAllowedCheckbox Layout.fillWidth: true text: i18n("All users may connect to this network") } // TODO implement advanced configuration QtControls.Button { id: advancedPermissionsButton Layout.alignment: Qt.AlignRight enabled: !allUsersAllowedCheckbox.checked text: i18n("Advanced...") QtControls.ToolTip.text: i18n("Edit advanced permissions for this connection") QtControls.ToolTip.visible: advancedPermissionsButton.hovered visible: expertModeCheckbox.checked } } QtControls.CheckBox { id: autoconnectVpnCheckbox text: i18n("Automatically connect to VPN when using this connection") } RowLayout { Item { Layout.preferredWidth: Kirigami.Units.gridUnit + Kirigami.Units.smallSpacing } QtControls.ComboBox { id: vpnListCombobox enabled: autoconnectVpnCheckbox.checked model: nmUtils.vpnConnections() } } Item { Kirigami.FormData.isSection: true } QtControls.ComboBox { id: firewallZoneCombobox Kirigami.FormData.label: i18n("Firewall zone:") model: nmUtils.firewallZones() visible: expertModeCheckbox.checked } QtControls.SpinBox { id: prioritySpinBox Kirigami.FormData.label: i18n("Priority:") value: 0 QtControls.ToolTip { text: i18n("If the connection is set to autoconnect, connections with higher priority will be preferred.\nDefaults to 0. The higher number means higher priority. An negative number can be used to \nindicate priority lower than the default.") } } + QtControls.ComboBox { + id: connectionMeteredCombobox + Kirigami.FormData.label: i18n("Connection metered:") + model: [ i18n("Auto"), i18n("Yes"), i18n("No") ] + visible: expertModeCheckbox.checked + } function loadSettings() { if (connectionSettingsObject.connectionType == PlasmaNM.Enums.Vpn) { autoconnectCheckbox.enabled = false autoconnectVpnCheckbox.enabled = false prioritySpinBox.enabled = false } else { autoconnectCheckbox.enabled = true autoconnectVpnCheckbox.enabled = true prioritySpinBox.enabled = true } autoconnectCheckbox.checked = connectionSettingsObject.autoconnect allUsersAllowedCheckbox.checked = !connectionSettingsObject.permissions.length prioritySpinBox.value = connectionSettingsObject.priority if (connectionSettingsObject.zone.length) { firewallZoneCombobox.currentIndex = firewallZoneCombobox.find(connectionSettingsObject.zone) } else { firewallZoneCombobox.currentIndex = 0 // Default } if (connectionSettingsObject.secondaryConnection.length && connectionSettingsObject.vpnConnections.length) { autoconnectVpnCheckbox.checked = true vpnListCombobox.currentIndex = vpnListCombobox.find(connectionSettingsObject.secondaryConnection) } else { autoconnectVpnCheckbox.checked = false } + + connectionMeteredCombobox.currentIndex = connectionSettingsObject.metered } } diff --git a/libs/editor/settings/connectionsettings.cpp b/libs/editor/settings/connectionsettings.cpp index c96244c1..f7cd76d1 100644 --- a/libs/editor/settings/connectionsettings.cpp +++ b/libs/editor/settings/connectionsettings.cpp @@ -1,498 +1,512 @@ /* Copyright 2018 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 "connectionsettings.h" #include "setting.h" #include "wirelesssetting.h" #include #include #include #include #include class ConnectionSettingsPrivate { public: NetworkManager::ConnectionSettings::Ptr connectionSettings; QMap settings; int pendingReplies; bool valid; bool secretsLoaded; NMStringMap vpnConnections; }; ConnectionSettings::ConnectionSettings(QObject *parent) : ConnectionSettings(nullptr, parent) { } ConnectionSettings::ConnectionSettings(const NetworkManager::ConnectionSettings::Ptr &settings, QObject *parent) : QObject(parent) , d_ptr(new ConnectionSettingsPrivate()) { Q_D(ConnectionSettings); // Load list of VPN connections NetworkManager::Connection::List list = NetworkManager::listConnections(); - Q_FOREACH (const NetworkManager::Connection::Ptr & conn, list) { + for (const NetworkManager::Connection::Ptr & conn : list) { NetworkManager::ConnectionSettings::Ptr conSet = conn->settings(); if (conSet->connectionType() == NetworkManager::ConnectionSettings::Vpn) { d->vpnConnections.insert(conSet->uuid(), conSet->id()); } } if (settings) { loadConfig(settings); } } ConnectionSettings::~ConnectionSettings() { delete d_ptr; } void ConnectionSettings::loadConfig(const NetworkManager::ConnectionSettings::Ptr &settings) { Q_D(ConnectionSettings); d->secretsLoaded = false; d->connectionSettings = settings; // In case of new connection id will be empty if (d->connectionSettings->id().isEmpty()) { d->connectionSettings->addToPermissions(KUser().loginName(), QString()); } // TODO add rest setting types // // Add the rest of widgets // QString serviceType; // if (type == NetworkManager::ConnectionSettings::Wired) { // WiredConnectionWidget *wiredWidget = new WiredConnectionWidget(m_connection->setting(NetworkManager::Setting::Wired), this); // addSettingWidget(wiredWidget, i18n("Wired")); // WiredSecurity *wiredSecurity = new WiredSecurity(m_connection->setting(NetworkManager::Setting::Security8021x).staticCast(), this); // addSettingWidget(wiredSecurity, i18n("802.1x Security")); // } else if (settings->connectionType() == NetworkManager::ConnectionSettings::Wireless) { addSetting(NetworkManager::Setting::Wireless, new WirelessSetting(d->connectionSettings->setting(NetworkManager::Setting::Wireless))); // WifiConnectionWidget *wifiWidget = new WifiConnectionWidget(m_connection->setting(NetworkManager::Setting::Wireless), this); // addSettingWidget(wifiWidget, i18n("Wi-Fi")); // WifiSecurity *wifiSecurity = new WifiSecurity(m_connection->setting(NetworkManager::Setting::WirelessSecurity), // m_connection->setting(NetworkManager::Setting::Security8021x).staticCast(), // this); // addSettingWidget(wifiSecurity, i18n("Wi-Fi Security")); // connect(wifiWidget, static_cast(&WifiConnectionWidget::ssidChanged), wifiSecurity, &WifiSecurity::onSsidChanged); } // else if (type == NetworkManager::ConnectionSettings::Pppoe) { // DSL // PppoeWidget *pppoeWidget = new PppoeWidget(m_connection->setting(NetworkManager::Setting::Pppoe), this); // addSettingWidget(pppoeWidget, i18n("DSL")); // WiredConnectionWidget *wiredWidget = new WiredConnectionWidget(m_connection->setting(NetworkManager::Setting::Wired), this); // addSettingWidget(wiredWidget, i18n("Wired")); // } else if (type == NetworkManager::ConnectionSettings::Gsm) { // GSM // GsmWidget *gsmWidget = new GsmWidget(m_connection->setting(NetworkManager::Setting::Gsm), this); // addSettingWidget(gsmWidget, i18n("Mobile Broadband (%1)", m_connection->typeAsString(m_connection->connectionType()))); // } else if (type == NetworkManager::ConnectionSettings::Cdma) { // CDMA // CdmaWidget *cdmaWidget = new CdmaWidget(m_connection->setting(NetworkManager::Setting::Cdma), this); // addSettingWidget(cdmaWidget, i18n("Mobile Broadband (%1)", m_connection->typeAsString(m_connection->connectionType()))); // } else if (type == NetworkManager::ConnectionSettings::Bluetooth) { // Bluetooth // BtWidget *btWidget = new BtWidget(m_connection->setting(NetworkManager::Setting::Bluetooth), this); // addSettingWidget(btWidget, i18n("Bluetooth")); // NetworkManager::BluetoothSetting::Ptr btSetting = m_connection->setting(NetworkManager::Setting::Bluetooth).staticCast(); // if (btSetting->profileType() == NetworkManager::BluetoothSetting::Dun) { // GsmWidget *gsmWidget = new GsmWidget(m_connection->setting(NetworkManager::Setting::Gsm), this); // addSettingWidget(gsmWidget, i18n("GSM")); // PPPWidget *pppWidget = new PPPWidget(m_connection->setting(NetworkManager::Setting::Ppp), this); // addSettingWidget(pppWidget, i18n("PPP")); // } // } else if (type == NetworkManager::ConnectionSettings::Infiniband) { // Infiniband // InfinibandWidget *infinibandWidget = new InfinibandWidget(m_connection->setting(NetworkManager::Setting::Infiniband), this); // addSettingWidget(infinibandWidget, i18n("Infiniband")); // } else if (type == NetworkManager::ConnectionSettings::Bond) { // Bond // BondWidget *bondWidget = new BondWidget(m_connection->uuid(), m_connection->setting(NetworkManager::Setting::Bond), this); // addSettingWidget(bondWidget, i18n("Bond")); // } else if (type == NetworkManager::ConnectionSettings::Bridge) { // Bridge // BridgeWidget *bridgeWidget = new BridgeWidget(m_connection->uuid(), m_connection->setting(NetworkManager::Setting::Bridge), this); // addSettingWidget(bridgeWidget, i18n("Bridge")); // } else if (type == NetworkManager::ConnectionSettings::Vlan) { // Vlan // VlanWidget *vlanWidget = new VlanWidget(m_connection->setting(NetworkManager::Setting::Vlan), this); // addSettingWidget(vlanWidget, i18n("Vlan")); // } else if (type == NetworkManager::ConnectionSettings::Team) { // Team // TeamWidget *teamWidget = new TeamWidget(m_connection->uuid(), m_connection->setting(NetworkManager::Setting::Team), this); // addSettingWidget(teamWidget, i18n("Team")); // } else if (type == NetworkManager::ConnectionSettings::Vpn) { // VPN // QString error; // VpnUiPlugin *vpnPlugin = 0; // NetworkManager::VpnSetting::Ptr vpnSetting = // m_connection->setting(NetworkManager::Setting::Vpn).staticCast(); // if (!vpnSetting) { // qCWarning(PLASMA_NM) << "Missing VPN setting!"; // } else { // serviceType = vpnSetting->serviceType(); // vpnPlugin = KServiceTypeTrader::createInstanceFromQuery(QString::fromLatin1("PlasmaNetworkManagement/VpnUiPlugin"), // QString::fromLatin1("[X-NetworkManager-Services]=='%1'").arg(serviceType), // this, QVariantList(), &error); // if (vpnPlugin && error.isEmpty()) { // const QString shortName = serviceType.section('.', -1); // SettingWidget *vpnWidget = vpnPlugin->widget(vpnSetting, this); // addSettingWidget(vpnWidget, i18n("VPN (%1)", shortName)); // } else { // qCWarning(PLASMA_NM) << error << ", serviceType == " << serviceType; // } // } // } // // // PPP widget // if (type == NetworkManager::ConnectionSettings::Pppoe || type == NetworkManager::ConnectionSettings::Cdma || type == NetworkManager::ConnectionSettings::Gsm) { // PPPWidget *pppWidget = new PPPWidget(m_connection->setting(NetworkManager::Setting::Ppp), this); // addSettingWidget(pppWidget, i18n("PPP")); // } // // // IPv4 widget // if (!m_connection->isSlave()) { // IPv4Widget *ipv4Widget = new IPv4Widget(m_connection->setting(NetworkManager::Setting::Ipv4), this); // addSettingWidget(ipv4Widget, i18n("IPv4")); // } // // // IPv6 widget // if ((type == NetworkManager::ConnectionSettings::Wired // || type == NetworkManager::ConnectionSettings::Wireless // || type == NetworkManager::ConnectionSettings::Infiniband // #if NM_CHECK_VERSION(0, 9, 10) // || type == NetworkManager::ConnectionSettings::Team // #endif // // #if NM_CHECK_VERSION(1, 0, 0) // || type == NetworkManager::ConnectionSettings::Cdma // || type == NetworkManager::ConnectionSettings::Gsm // #endif // || type == NetworkManager::ConnectionSettings::Bond // || type == NetworkManager::ConnectionSettings::Bridge // || type == NetworkManager::ConnectionSettings::Vlan // || (type == NetworkManager::ConnectionSettings::Vpn && serviceType == QLatin1String("org.freedesktop.NetworkManager.openvpn"))) && !m_connection->isSlave()) { // IPv6Widget *ipv6Widget = new IPv6Widget(m_connection->setting(NetworkManager::Setting::Ipv6), this); // addSettingWidget(ipv6Widget, i18n("IPv6")); // } bool valid = true; foreach (NetworkManager::Setting::SettingType settingType, d->settings.keys()) { valid = valid && d->settings.value(settingType)->isValid(); connect(d->settings.value(settingType), &Setting::validityChanged, this, &ConnectionSettings::onValidityChanged); } d->valid = valid; Q_EMIT validityChanged(valid); // // If the connection is not empty (not new) we want to load its secrets // if (!emptyConnection) { // NetworkManager::Connection::Ptr connection = NetworkManager::findConnectionByUuid(m_connectionSetting->uuid()); // if (connection) { // QStringList requiredSecrets; // QString settingName; // QVariantMap setting; // QDBusPendingReply reply; // // if (m_connection->connectionType() == NetworkManager::ConnectionSettings::Adsl) { // NetworkManager::AdslSetting::Ptr adslSetting = connection->settings()->setting(NetworkManager::Setting::Adsl).staticCast(); // if (adslSetting && !adslSetting->needSecrets().isEmpty()) { // requiredSecrets = adslSetting->needSecrets(); // setting = adslSetting->toMap(); // settingName = QLatin1String("adsl"); // } // } else if (m_connection->connectionType() == NetworkManager::ConnectionSettings::Bluetooth) { // NetworkManager::GsmSetting::Ptr gsmSetting = connection->settings()->setting(NetworkManager::Setting::Gsm).staticCast(); // if (gsmSetting && !gsmSetting->needSecrets().isEmpty()) { // requiredSecrets = gsmSetting->needSecrets(); // setting = gsmSetting->toMap(); // settingName = QLatin1String("gsm"); // } // } else if (m_connection->connectionType() == NetworkManager::ConnectionSettings::Cdma) { // NetworkManager::CdmaSetting::Ptr cdmaSetting = connection->settings()->setting(NetworkManager::Setting::Cdma).staticCast(); // if (cdmaSetting && !cdmaSetting->needSecrets().isEmpty()) { // requiredSecrets = cdmaSetting->needSecrets(); // setting = cdmaSetting->toMap(); // settingName = QLatin1String("cdma"); // } // } else if (m_connection->connectionType() == NetworkManager::ConnectionSettings::Gsm) { // NetworkManager::GsmSetting::Ptr gsmSetting = connection->settings()->setting(NetworkManager::Setting::Gsm).staticCast(); // if (gsmSetting && !gsmSetting->needSecrets().isEmpty()) { // requiredSecrets = gsmSetting->needSecrets(); // setting = gsmSetting->toMap(); // settingName = QLatin1String("gsm"); // } // } else if (m_connection->connectionType() == NetworkManager::ConnectionSettings::Pppoe) { // NetworkManager::PppoeSetting::Ptr pppoeSetting = connection->settings()->setting(NetworkManager::Setting::Pppoe).staticCast(); // if (pppoeSetting && !pppoeSetting->needSecrets().isEmpty()) { // requiredSecrets = pppoeSetting->needSecrets(); // setting = pppoeSetting->toMap(); // settingName = QLatin1String("pppoe"); // } // } else if (m_connection->connectionType() == NetworkManager::ConnectionSettings::Wired) { // NetworkManager::Security8021xSetting::Ptr securitySetting = connection->settings()->setting(NetworkManager::Setting::Security8021x).staticCast(); // if (securitySetting && !securitySetting->needSecrets().isEmpty()) { // requiredSecrets = securitySetting->needSecrets(); // setting = securitySetting->toMap(); // settingName = QLatin1String("802-1x"); // } // } else if (m_connection->connectionType() == NetworkManager::ConnectionSettings::Wireless) { // NetworkManager::WirelessSecuritySetting::Ptr wifiSecuritySetting = connection->settings()->setting(NetworkManager::Setting::WirelessSecurity).staticCast(); // if (wifiSecuritySetting && // (wifiSecuritySetting->keyMgmt() == NetworkManager::WirelessSecuritySetting::WpaEap || // (wifiSecuritySetting->keyMgmt() == NetworkManager::WirelessSecuritySetting::WirelessSecuritySetting::Ieee8021x && // wifiSecuritySetting->authAlg() != NetworkManager::WirelessSecuritySetting::Leap))) { // NetworkManager::Security8021xSetting::Ptr securitySetting = connection->settings()->setting(NetworkManager::Setting::Security8021x).staticCast(); // if (securitySetting && !securitySetting->needSecrets().isEmpty()) { // requiredSecrets = securitySetting->needSecrets(); // setting = securitySetting->toMap(); // settingName = QLatin1String("802-1x"); // // if (requiredSecrets.contains(NM_SETTING_802_1X_PASSWORD_RAW)) { // requiredSecrets.removeAll(NM_SETTING_802_1X_PASSWORD_RAW); // } // } // } else { // if (!wifiSecuritySetting->needSecrets().isEmpty()) { // requiredSecrets = wifiSecuritySetting->needSecrets(); // setting = wifiSecuritySetting->toMap(); // settingName = QLatin1String("802-11-wireless-security"); // } // } // } else if (m_connection->connectionType() == NetworkManager::ConnectionSettings::Vpn) { // settingName = QLatin1String("vpn"); // } // // if (!requiredSecrets.isEmpty() || m_connection->connectionType() == NetworkManager::ConnectionSettings::Vpn) { // bool requestSecrets = false; // if (m_connection->connectionType() == NetworkManager::ConnectionSettings::Vpn) { // requestSecrets = true; // } else { // Q_FOREACH (const QString &secret, requiredSecrets) { // if (setting.contains(secret + QLatin1String("-flags"))) { // NetworkManager::Setting::SecretFlagType secretFlag = (NetworkManager::Setting::SecretFlagType)setting.value(secret + QLatin1String("-flags")).toInt(); // if (secretFlag == NetworkManager::Setting::None || secretFlag == NetworkManager::Setting::AgentOwned) { // requestSecrets = true; // } // } else { // requestSecrets = true; // } // } // } // // if (requestSecrets) { // m_pendingReplies++; // reply = connection->secrets(settingName); // QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(reply, this); // watcher->setProperty("connection", connection->name()); // watcher->setProperty("settingName", settingName); // connect(watcher, &QDBusPendingCallWatcher::finished, this, &ConnectionEditorBase::replyFinished); // m_valid = false; // Q_EMIT validityChanged(false); // return; // } // } // } // } // // We should be now fully initialized as we don't wait for secrets if (d->pendingReplies == 0) { d->secretsLoaded = true; } } NMVariantMapMap ConnectionSettings::settingMap() const { return NMVariantMapMap(); } QString ConnectionSettings::id() const { Q_D(const ConnectionSettings); return d->connectionSettings->id(); } void ConnectionSettings::setId(const QString &id) { Q_D(ConnectionSettings); d->connectionSettings->setId(id); } QString ConnectionSettings::uuid() const { Q_D(const ConnectionSettings); return d->connectionSettings->uuid(); } void ConnectionSettings::setUuid(const QString &uuid) { Q_D(ConnectionSettings); d->connectionSettings->setUuid(uuid); } uint ConnectionSettings::connectionType() const { Q_D(const ConnectionSettings); return (uint)d->connectionSettings->connectionType(); } bool ConnectionSettings::autoconnect() const { Q_D(const ConnectionSettings); return d->connectionSettings->autoconnect(); } void ConnectionSettings::setAutoconnect(bool autoconnect) { Q_D(ConnectionSettings); d->connectionSettings->setAutoconnect(autoconnect); } QStringList ConnectionSettings::permissions() const { Q_D(const ConnectionSettings); return d->connectionSettings->permissions().keys(); } void ConnectionSettings::setPermissions(const QStringList &permissions) { Q_D(ConnectionSettings); foreach (const QString &user, permissions) { d->connectionSettings->addToPermissions(user, QString()); } } QString ConnectionSettings::secondaryConnection() const { Q_D(const ConnectionSettings); if (!d->connectionSettings->secondaries().isEmpty()) { return d->vpnConnections.value(d->connectionSettings->secondaries().first()); } return nullptr; } void ConnectionSettings::setSecondaryConnection(const QString &secondaryConnection) { Q_D(ConnectionSettings); d->connectionSettings->setSecondaries({secondaryConnection}); } QString ConnectionSettings::zone() const { Q_D(const ConnectionSettings); return d->connectionSettings->zone(); } void ConnectionSettings::setZone(const QString &zone) { Q_D(ConnectionSettings); d->connectionSettings->setZone(zone); } int ConnectionSettings::priority() const { Q_D(const ConnectionSettings); return d->connectionSettings->autoconnectPriority(); } void ConnectionSettings::setPriority(int priority) { Q_D(ConnectionSettings); d->connectionSettings->setAutoconnectPriority(priority); } +int ConnectionSettings::metered() const +{ + Q_D(const ConnectionSettings); + + return d->connectionSettings->metered(); +} + +void ConnectionSettings::setMetered(int metered) +{ + Q_D(ConnectionSettings); + + d->connectionSettings->setMetered(static_cast(metered)); +} + QObject * ConnectionSettings::setting(uint type) const { Q_D(const ConnectionSettings); return d->settings.value((NetworkManager::Setting::SettingType) type); } QList ConnectionSettings::settingTypes() const { Q_D(const ConnectionSettings); return d->settings.keys(); } void ConnectionSettings::addSetting(NetworkManager::Setting::SettingType type, Setting *setting) { Q_D(ConnectionSettings); d->settings.insert(type, setting); } bool ConnectionSettings::isInitialized() const { Q_D(const ConnectionSettings); return d->secretsLoaded; } bool ConnectionSettings::isValid() const { Q_D(const ConnectionSettings); return d->valid; } void ConnectionSettings::onReplyFinished(QDBusPendingCallWatcher *watcher) { } void ConnectionSettings::onValidityChanged(bool valid) { Q_D(ConnectionSettings); if (!valid) { d->valid = false; Q_EMIT validityChanged(false); return; } else { foreach (NetworkManager::Setting::SettingType settingType, d->settings.keys()) { if (!d->settings.value(settingType)->isValid()) { d->valid = false; Q_EMIT validityChanged(false); return; } } } d->valid = true; Q_EMIT validityChanged(true); } diff --git a/libs/editor/settings/connectionsettings.h b/libs/editor/settings/connectionsettings.h index 39a6580b..c4ecee33 100644 --- a/libs/editor/settings/connectionsettings.h +++ b/libs/editor/settings/connectionsettings.h @@ -1,101 +1,105 @@ /* Copyright 2018 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_SETTING_H #define PLASMA_NM_CONNECTION_SETTING_H class QObject; class QDBusPendingCallWatcher; class ConnectionSettingsPrivate; #include class Setting; class Q_DECL_EXPORT ConnectionSettings : public QObject { Q_OBJECT Q_PROPERTY(QString id READ id WRITE setId) Q_PROPERTY(QString uuid READ uuid WRITE setUuid) Q_PROPERTY(uint connectionType READ connectionType) Q_PROPERTY(bool autoconnect READ autoconnect WRITE setAutoconnect) Q_PROPERTY(QStringList permissions READ permissions WRITE setPermissions) Q_PROPERTY(QString secondaryConnection READ secondaryConnection WRITE setSecondaryConnection) Q_PROPERTY(QString zone READ zone WRITE setZone) Q_PROPERTY(int priority READ priority WRITE setPriority) + Q_PROPERTY(int metered READ metered WRITE setMetered) public: explicit ConnectionSettings(QObject *parent = nullptr); ConnectionSettings(const NetworkManager::ConnectionSettings::Ptr &settings = NetworkManager::ConnectionSettings::Ptr(), QObject *parent = nullptr); virtual ~ConnectionSettings(); void loadConfig(const NetworkManager::ConnectionSettings::Ptr &settings); NMVariantMapMap settingMap() const; QString id() const; void setId(const QString &id); QString uuid() const; void setUuid(const QString &uuid); uint connectionType() const; bool autoconnect() const; void setAutoconnect(bool autoconnect); QStringList permissions() const; void setPermissions(const QStringList &permissions); QString secondaryConnection() const; void setSecondaryConnection(const QString &secondaryConnection); QString zone() const; void setZone(const QString &zone); int priority() const; void setPriority(int priority); + int metered() const; + void setMetered(int metered); + Q_INVOKABLE QObject * setting(uint type) const; QList settingTypes() const; void addSetting(NetworkManager::Setting::SettingType type, Setting *setting); bool isInitialized() const; bool isValid() const; Q_SIGNALS: // The default value is supposed to be false, watch this property for validity change after // proper initialization with secrets void validityChanged(bool valid); private Q_SLOTS: void onValidityChanged(bool valid); void onReplyFinished(QDBusPendingCallWatcher *watcher); protected: ConnectionSettingsPrivate *d_ptr; private: Q_DECLARE_PRIVATE(ConnectionSettings) }; #endif // PLASMA_NM_CONNECTION_SETTING_H