summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRami Potinkara <rami.potinkara@qt.io>2020-05-25 18:52:09 +0300
committerRami Potinkara <rami.potinkara@qt.io>2020-07-15 13:29:12 +0000
commit714e5dadf2d6064aaddd7d4e0abd55af332b9448 (patch)
tree0eb645a417ff8987849d094090c3cf5b4a47727f
parentbdbef030c3f81bd06fa1f69b4981d6b60634f913 (diff)
new menu item for usb ethernet protocol selection5.15
Task-number: QTBUG-83011 Change-Id: I8098ef26c9fa42cdf301145937eca011365d6f19 Pick-to: 5.15 Reviewed-by: Teemu Holappa <teemu.holappa@qt.io>
-rw-r--r--src/networksettings/connman/qnetworksettingsmanager_p.cpp86
-rw-r--r--src/networksettings/connman/qnetworksettingsmanager_p.h11
-rw-r--r--src/networksettings/qnetworksettingsmanager.cpp37
-rw-r--r--src/networksettings/qnetworksettingsmanager.h10
-rw-r--r--src/settingsui/ViewSettings.qml1
-rw-r--r--src/settingsui/network/NetworkSettings.qml293
6 files changed, 357 insertions, 81 deletions
diff --git a/src/networksettings/connman/qnetworksettingsmanager_p.cpp b/src/networksettings/connman/qnetworksettingsmanager_p.cpp
index 5bea9e2..a56edca 100644
--- a/src/networksettings/connman/qnetworksettingsmanager_p.cpp
+++ b/src/networksettings/connman/qnetworksettingsmanager_p.cpp
@@ -33,10 +33,14 @@
#include "qnetworksettingsinterface_p.h"
#include "qnetworksettingsservicemodel.h"
#include "qnetworksettingsuseragent.h"
+#include <QFile>
+#include <QNetworkInterface>
QT_BEGIN_NAMESPACE
const QString ConnManServiceName(QStringLiteral("net.connman"));
+const QString QdbdFileName(QStringLiteral("/etc/default/qdbd"));
+const char* SearchKeyword("USB_ETHERNET_PROTOCOL=");
QNetworkSettingsManagerPrivate::QNetworkSettingsManagerPrivate(QNetworkSettingsManager *parent)
:QObject(parent)
@@ -254,6 +258,7 @@ void QNetworkSettingsManagerPrivate::onServicesChanged(ConnmanMapStructList chan
foreach (QString newService, newServices) {
handleNewService(newService);
}
+
}
void QNetworkSettingsManagerPrivate::handleNewService(const QString &servicePath)
@@ -316,7 +321,88 @@ void QNetworkSettingsManagerPrivate::serviceReady()
technology->setState(technology->state());
}
}
+ }
+}
+
+QString QNetworkSettingsManagerPrivate::usbEthernetInternetProtocolAddress()
+{
+ QString usbEthernetIp = QLatin1String("Not connected");
+ QNetworkInterface interface = QNetworkInterface::interfaceFromName(QLatin1String("usb0"));
+ if (interface.flags().testFlag(QNetworkInterface::IsUp)) {
+ for (QNetworkAddressEntry &entry:interface.addressEntries()) {
+ if (entry.ip().protocol() == QAbstractSocket::IPv4Protocol){
+ usbEthernetIp = entry.ip().toString();
+ break;
+ }
+ }
+ }
+ return usbEthernetIp;
+}
+
+QString QNetworkSettingsManagerPrivate::usbVirtualEthernetLinkProtocol()
+{
+ QByteArray line(QNetworkSettingsManagerPrivate::readUsbEthernetProtocolLine());
+ QString protocol;
+ if (line.size()) {
+ int keywordStartIndex(line.indexOf("="));
+ line = line.trimmed();
+ protocol = QString::fromLatin1( line.mid(keywordStartIndex + 1, (line.length() - 1)).toUpper() );
+ }
+ return protocol;
+}
+bool QNetworkSettingsManagerPrivate::hasUsbEthernetProtocolConfiguration()
+{
+ return !(QNetworkSettingsManagerPrivate::readUsbEthernetProtocolLine().isEmpty());
+}
+
+void QNetworkSettingsManagerPrivate::setUsbVirtualEthernetLinkProtocol(const QString &protocol)
+{
+ if (QLatin1String("RNDIS") == protocol || QLatin1String("CDCECM") == protocol) {
+ QByteArray fileContent(QNetworkSettingsManagerPrivate::readQdbdFileContent());
+ writeUsbEthernetProtocolToFileContent(fileContent, protocol);
+ } else{
+ qWarning("Unsupported USB Ethernet protocol");
+ }
+}
+
+QByteArray QNetworkSettingsManagerPrivate::readQdbdFileContent()
+{
+ QFile qdbdFile(QdbdFileName);
+ QByteArray fileContent;
+ if (qdbdFile.open(QIODevice::ReadOnly | QIODevice::Text))
+ fileContent = qdbdFile.readAll();
+
+ return fileContent;
+}
+
+QByteArray QNetworkSettingsManagerPrivate::readUsbEthernetProtocolLine()
+{
+ QByteArray fileContent(QNetworkSettingsManagerPrivate::readQdbdFileContent());
+ int keywordStartIndex(fileContent.indexOf(SearchKeyword, 0));
+ int keywordLineEndIndex(fileContent.indexOf("\n", keywordStartIndex));
+ QByteArray keywordLine = fileContent.mid(keywordStartIndex, keywordLineEndIndex);
+ return keywordLine;
+}
+
+void QNetworkSettingsManagerPrivate::writeUsbEthernetProtocolToFileContent(QByteArray &fileContent, const QString &protocol)
+{
+ int keywordStartIndex(fileContent.indexOf(SearchKeyword));
+ QByteArray previousLines = fileContent.mid(0, keywordStartIndex);
+ int keywordLineEndIndex(fileContent.indexOf("\n", keywordStartIndex));
+ QByteArray keywordLine = fileContent.mid(keywordStartIndex, keywordLineEndIndex);
+ QByteArray followingLines = fileContent.mid((keywordLineEndIndex), (fileContent.length() - 1));
+ QByteArray updatedLines = previousLines.append(SearchKeyword);
+ updatedLines.append(protocol.toLatin1().toLower());
+ updatedLines.append(followingLines);
+ QFile qdbdFile(QdbdFileName);
+ if (qdbdFile.open(QIODevice::WriteOnly | QIODevice::Text)) {
+ int result = qdbdFile.write(updatedLines);
+ if (-1 == result)
+ qDebug("USB Ethernet protocol write to file failed");
+
+ } else {
+ qDebug("USB Ethernet protocol file open failed");
}
}
diff --git a/src/networksettings/connman/qnetworksettingsmanager_p.h b/src/networksettings/connman/qnetworksettingsmanager_p.h
index 8b5d1a7..c6f31e6 100644
--- a/src/networksettings/connman/qnetworksettingsmanager_p.h
+++ b/src/networksettings/connman/qnetworksettingsmanager_p.h
@@ -74,6 +74,10 @@ public:
QNetworkSettingsService* currentWifiConnection() const {return m_currentWifiConnection;}
void setCurrentWiredConnection(QNetworkSettingsService *connection) {m_currentWiredConnection = connection;}
QNetworkSettingsService* currentWiredConnection() const {return m_currentWiredConnection;}
+ QString usbEthernetInternetProtocolAddress();
+ QString usbVirtualEthernetLinkProtocol();
+ bool hasUsbEthernetProtocolConfiguration();
+ void setUsbVirtualEthernetLinkProtocol(const QString &protocol);
public slots:
void getServicesFinished(QDBusPendingCallWatcher *watcher);
@@ -84,9 +88,14 @@ public slots:
void onConnmanServiceRegistered(const QString &serviceName);
void onTechnologyAdded(const QDBusObjectPath &technology, const QVariantMap &properties);
void onTechnologyRemoved(const QDBusObjectPath &technology);
+
private:
bool initialize();
- void handleNewService(const QString& servicePath);
+ void handleNewService(const QString &servicePath);
+ void writeUsbEthernetProtocolToFileContent(QByteArray &fileContent, const QString &protocol);
+ static QByteArray readQdbdFileContent();
+ static QByteArray readUsbEthernetProtocolLine();
+
protected:
QNetworkSettingsInterfaceModel m_interfaceModel;
QNetworkSettingsServiceModel *m_serviceModel;
diff --git a/src/networksettings/qnetworksettingsmanager.cpp b/src/networksettings/qnetworksettingsmanager.cpp
index 667004f..a128049 100644
--- a/src/networksettings/qnetworksettingsmanager.cpp
+++ b/src/networksettings/qnetworksettingsmanager.cpp
@@ -330,4 +330,41 @@ QNetworkSettingsUserAgent* QNetworkSettingsManager::userAgent()
return d->userAgent();
}
+/*!
+ Returns the ip address of usb ethernet network.
+*/
+QString QNetworkSettingsManager::usbEthernetInternetProtocolAddress()
+{
+ Q_D(QNetworkSettingsManager);
+ return d->usbEthernetInternetProtocolAddress();
+}
+
+/*!
+ Returns the usb ethernet protocol
+*/
+QString QNetworkSettingsManager::usbVirtualEthernetLinkProtocol()
+{
+ Q_D(QNetworkSettingsManager);
+ return d->usbVirtualEthernetLinkProtocol();
+}
+
+
+/*!
+ Returns true if usb ethernet protocol is configured by file and configuration file exists.
+*/
+bool QNetworkSettingsManager::hasUsbEthernetProtocolConfiguration()
+{
+ Q_D(QNetworkSettingsManager);
+ return d->hasUsbEthernetProtocolConfiguration();
+}
+
+/*!
+ Set the usb ethernet protocol according to parameter.
+*/
+void QNetworkSettingsManager::setUsbVirtualEthernetLinkProtocol(const QString &protocol)
+{
+ Q_D(QNetworkSettingsManager);
+ d->setUsbVirtualEthernetLinkProtocol(protocol);
+}
+
QT_END_NAMESPACE
diff --git a/src/networksettings/qnetworksettingsmanager.h b/src/networksettings/qnetworksettingsmanager.h
index 17a3082..16ed539 100644
--- a/src/networksettings/qnetworksettingsmanager.h
+++ b/src/networksettings/qnetworksettingsmanager.h
@@ -52,6 +52,8 @@ class Q_DECL_EXPORT QNetworkSettingsManager : public QObject
Q_PROPERTY(QNetworkSettingsUserAgent* userAgent READ userAgent CONSTANT)
Q_PROPERTY(QNetworkSettingsService* currentWifiConnection READ currentWifiConnection NOTIFY currentWifiConnectionChanged)
Q_PROPERTY(QNetworkSettingsService* currentWiredConnection READ currentWiredConnection NOTIFY currentWiredConnectionChanged)
+ Q_PROPERTY(QString usbEthernetIpAddress READ usbEthernetInternetProtocolAddress NOTIFY usbEthernetInternetProtocolAddressChanged)
+ Q_PROPERTY(QString usbEthernetProtocol READ usbVirtualEthernetLinkProtocol NOTIFY usbVirtualEthernetLinkProtocolChanged)
public:
explicit QNetworkSettingsManager(QObject* parent = Q_NULLPTR);
@@ -69,18 +71,26 @@ public:
QNetworkSettingsService* currentWifiConnection();
QNetworkSettingsService* currentWiredConnection();
Q_INVOKABLE QNetworkSettingsInterface* interface(int type, int instance);
+ Q_INVOKABLE QString usbEthernetInternetProtocolAddress();
+ Q_INVOKABLE QString usbVirtualEthernetLinkProtocol();
+ Q_INVOKABLE bool hasUsbEthernetProtocolConfiguration();
+ Q_INVOKABLE void setUsbVirtualEthernetLinkProtocol(const QString &protocol);
Q_SIGNALS:
void servicesChanged();
void interfacesChanged();
void currentWifiConnectionChanged();
void currentWiredConnectionChanged();
+ void usbEthernetInternetProtocolAddressChanged(const QString &newusbEthernetIpAddress);
+ void usbVirtualEthernetLinkProtocolChanged(const QString &newUsbEthernetProtocol);
+
protected:
QNetworkSettingsManagerPrivate *d_ptr;
private:
Q_DISABLE_COPY(QNetworkSettingsManager)
Q_DECLARE_PRIVATE(QNetworkSettingsManager)
+
};
QT_END_NAMESPACE
diff --git a/src/settingsui/ViewSettings.qml b/src/settingsui/ViewSettings.qml
index 9bbbc10..e9a1c74 100644
--- a/src/settingsui/ViewSettings.qml
+++ b/src/settingsui/ViewSettings.qml
@@ -40,4 +40,5 @@ Item {
property string buttonGrayColor: "#9d9faa"
property string buttonActiveColor: "#216729"
property string scrollBarColor: "#41cd52"
+ property bool usbEthernetSettingVisible: false
}
diff --git a/src/settingsui/network/NetworkSettings.qml b/src/settingsui/network/NetworkSettings.qml
index 982a858..f18173e 100644
--- a/src/settingsui/network/NetworkSettings.qml
+++ b/src/settingsui/network/NetworkSettings.qml
@@ -31,104 +31,237 @@ import QtQuick.Layouts 1.3
import QtQuick.Controls 2.2
import QtDeviceUtilities.NetworkSettings 1.0
import QtDeviceUtilities.QtButtonImageProvider 1.0
+import QtDeviceUtilities.LocalDeviceSettings 1.0
import "../common"
+import "../timedate"
Item {
- id: root
+ id: networkSettingsRoot
property string title: qsTr("Network Settings")
-
- Column {
- id: networkSettingsColumn
- spacing: pluginMain.spacing
- anchors.margins: viewSettings.pageMargin
-
- Row {
- spacing: root.width * 0.025
- leftPadding: pluginMain.margin
- Text {
- text: qsTr("Wi-Fi")
- anchors.verticalCenter: parent.verticalCenter
- font.pixelSize: pluginMain.subTitleFontSize
+ property bool usbEthernetSettingVisibility: ( viewSettings.usbEthernetSettingVisible && NetworkSettingsManager.hasUsbEthernetProtocolConfiguration() ) ? true : false
+ anchors.fill: parent
+ Text {
+ id: usbEthernetTitleText
+ visible: usbEthernetSettingVisibility
+ text: qsTr("USB Ethernet")
+ font.pixelSize: pluginMain.subTitleFontSize
+ font.family: appFont
+ font.styleName: "SemiBold"
+ color: "white"
+ anchors.left: parent.left
+ }
+ TextArea {
+ id: ipAddressTextArea
+ visible: usbEthernetSettingVisibility
+ text: qsTr("IP Address:") + NetworkSettingsManager.usbEthernetIpAddress
+ color: viewSettings.buttonGreenColor
+ font.family: appFont
+ font.styleName: "SemiBold"
+ font.pixelSize: pluginMain.subTitleFontSize - 2
+ opacity: 1.0
+ readOnly: true
+ anchors.left: usbEthernetTitleText.left
+ anchors.verticalCenter: usbEthernetCustomComboBox.verticalCenter
+ anchors.leftMargin: 15
+ }
+ CustomComboBox {
+ id: usbEthernetCustomComboBox
+ visible: usbEthernetSettingVisibility
+ width: root.width * 0.15
+ height: pluginMain.buttonHeight
+ anchors.top: usbEthernetTitleText.bottom
+ anchors.left: ipAddressTextArea.right
+ anchors.right: setUsbEthernetButton.left
+ anchors.rightMargin: 15
+ anchors.leftMargin: 15
+ model: ["RNDIS", "CDCECM" ]
+ currentIndex: 0
+ delegate: ItemDelegate {
+ id: usbEthernetDelegate
+ contentItem: Text {
+ anchors.left: usbEthernetDelegate.left
+ anchors.leftMargin: pluginMain.margin
+ text: modelData
+ color: usbEthernetCustomComboBox.currentIndex == index ? viewSettings.buttonGreenColor : "white"
+ elide: Text.ElideRight
+ verticalAlignment: Text.AlignVCenter
+ font.pixelSize: pluginMain.valueFontSize
font.family: appFont
- color: "white"
+ font.styleName: "Regular"
}
+ }
+ Component.onCompleted: {
+ usbEthernetCustomComboBox.currentIndex = "RNDIS" === NetworkSettingsManager.usbEthernetProtocol ? 0 : 1
+ }
+ }
+ QtButton {
+ id: setUsbEthernetButton
+ visible: usbEthernetSettingVisibility
+ height: pluginMain.buttonHeight
+ text: qsTr("SAVE & REBOOT")
+ anchors.right: parent.right
+ anchors.verticalCenter: usbEthernetCustomComboBox.verticalCenter
+ onClicked: {
+ showRebootAcceptPopup();
+ }
+ }
- CustomSwitch {
- id: wifiSwitch
- indicatorWidth: root.width * 0.15
- indicatorHeight: root.height * 0.06
- property bool wiFiAvailable: NetworkSettingsManager.interface(NetworkSettingsType.Wifi, 0) !== null
- enabled: wiFiAvailable && !wifiSwitchTimer.running
- onCheckedChanged: {
- // Power on/off all WiFi interfaces
- for (var i = 0; NetworkSettingsManager.interface(NetworkSettingsType.Wifi, i) !== null; i++) {
- NetworkSettingsManager.interface(NetworkSettingsType.Wifi, i).powered = checked
- wifiSwitchTimer.start()
- }
+ function showRebootAcceptPopup() {
+ messageDialog.visible = true
+ }
+
+ Dialog {
+ function rebootAccepted() {
+ NetworkSettingsManager.setUsbVirtualEthernetLinkProtocol(usbEthernetCustomComboBox.currentText)
+ LocalDevice.reboot()
+ }
+ id: messageDialog
+ anchors.centerIn: parent
+ width: parent.width
+ height: parent.height
+ opacity: 0.9
+ background: Rectangle{
+ id: messageDialogMainRectangle
+ width: parent.width
+ height: parent.height
+ color: viewSettings.backgroundColor
+ }
+ Rectangle {
+ id: messageDialogPopupRectangle
+ color: viewSettings.backgroundColor
+ border.color: viewSettings.borderColor
+ border.width: 3
+ anchors.centerIn: parent
+ width: parent.width * 0.75
+ height: parent.height * 0.75
+ Column {
+ anchors.centerIn: parent
+ spacing: viewSettings.pageMargin
+ Text {
+ id: shutDownConfirmText
+ width: messageDialogPopupRectangle.width * 0.75
+ height: messageDialogPopupRectangle.height * 0.25
+ horizontalAlignment: Text.AlignHCenter
+ anchors.horizontalCenter: parent.horizontalCenter
+ fontSizeMode: Text.Fit
+ minimumPixelSize: 1
+ font.pixelSize: messageDialogPopupRectangle.width * 0.3
+ color: "white"
+ font.family: viewSettings.appFont
+ font.styleName: "SemiBold"
+ text: "Save and reboot the system?"
}
- Component.onCompleted: {
- // If any of the WiFi interfaces is powered on, switch is checked
- var checkedStatus = false;
- for (var i = 0; NetworkSettingsManager.interface(NetworkSettingsType.Wifi, i) !== null; i++) {
- if (NetworkSettingsManager.interface(NetworkSettingsType.Wifi, i).powered) {
- checkedStatus = true;
- break;
- }
- }
- checked = checkedStatus;
+ QtButton {
+ id: saveRebootConfirm
+ height: pluginMain.buttonHeight
+ anchors.horizontalCenter: parent.horizontalCenter
+ text: "OK"
+ onClicked: messageDialog.rebootAccepted();
}
-
- // At least 1s between switching on/off
- Timer {
- id: wifiSwitchTimer
- interval: 1000
- running: false
+ QtButton {
+ id: saveRebootCancel
+ height: pluginMain.buttonHeight
+ anchors.horizontalCenter: parent.horizontalCenter
+ borderColor: "transparent"
+ fillColor: viewSettings.buttonGrayColor
+ text: qsTr("CANCEL")
+ onClicked: {
+ messageDialog.visible = false
+ }
}
}
- QtButton {
- id: manualConnect
- visible: true
- enabled: wifiSwitch.checked
- fillColor: enabled ? viewSettings.buttonGreenColor : viewSettings.buttonGrayColor
- borderColor: "transparent"
- height: pluginMain.buttonHeight
- text: qsTr("Connect manually")
- onClicked: {
- networkList.connectBySsid()
- }
+ }
+ }
+ Text {
+ id: wlanText
+ text: qsTr("WLAN")
+ font.pixelSize: pluginMain.subTitleFontSize
+ font.family: appFont
+ font.styleName: "SemiBold"
+ color: "white"
+ anchors.top: usbEthernetSettingVisibility ? usbEthernetCustomComboBox.bottom : networkSettingsRoot.top
+ anchors.left: parent.left
+ }
+ CustomSwitch {
+ id: wifiSwitch
+ anchors.top: wlanText.bottom
+ anchors.left: wlanText.left
+ height: pluginMain.buttonHeight
+ indicatorWidth: pluginMain.buttonWidth
+ indicatorHeight: pluginMain.buttonHeight
+ property bool wiFiAvailable: NetworkSettingsManager.interface(NetworkSettingsType.Wifi, 0) !== null
+ enabled: wiFiAvailable && !wifiSwitchTimer.running
+ onCheckedChanged: {
+ // Power on/off all WiFi interfaces
+ for (var i = 0; NetworkSettingsManager.interface(NetworkSettingsType.Wifi, i) !== null; i++) {
+ NetworkSettingsManager.interface(NetworkSettingsType.Wifi, i).powered = checked
+ wifiSwitchTimer.start()
}
- QtButton {
- id: manualDisconnect
- visible: true
- enabled: NetworkSettingsManager.currentWifiConnection
- fillColor: enabled ? viewSettings.buttonGreenColor : viewSettings.buttonGrayColor
- borderColor: "transparent"
- height: pluginMain.buttonHeight
- text: qsTr("Disconnect wireless")
- onClicked: {
- if (NetworkSettingsManager.currentWifiConnection) {
- NetworkSettingsManager.currentWifiConnection.disconnectService();
- }
+ }
+ Component.onCompleted: {
+ // If any of the WiFi interfaces is powered on, switch is checked
+ var checkedStatus = false;
+ for (var i = 0; NetworkSettingsManager.interface(NetworkSettingsType.Wifi, i) !== null; i++) {
+ if (NetworkSettingsManager.interface(NetworkSettingsType.Wifi, i).powered) {
+ checkedStatus = true;
+ break;
}
}
+ checked = checkedStatus;
}
- Text {
- text: qsTr("Network list:")
- font.pixelSize: pluginMain.subTitleFontSize
- font.family: appFont
- font.styleName: "SemiBold"
- color: "white"
+ // At least 1s between switching on/off
+ Timer {
+ id: wifiSwitchTimer
+ interval: 1000
+ running: false
}
-
- Row {
- id: listViewRow
- leftPadding: pluginMain.margin
- NetworkListView {
- id: networkList
- width: root.width - listViewRow.leftPadding
- height: root.height - listViewRow.y - networkSettingsColumn.anchors.margins
+ }
+ QtButton {
+ id: manualConnect
+ anchors.top: wlanText.bottom
+ anchors.left: wifiSwitch.right
+ anchors.right: manualDisconnect.left
+ anchors.rightMargin: 15
+ enabled: wifiSwitch.checked
+ fillColor: enabled ? viewSettings.buttonGreenColor : viewSettings.buttonGrayColor
+ borderColor: "transparent"
+ height: pluginMain.buttonHeight
+ text: qsTr("MANUAL CONNECT")
+ onClicked: {
+ networkList.connectBySsid()
+ }
+ }
+ QtButton {
+ id: manualDisconnect
+ anchors.top: wlanText.bottom
+ anchors.right: parent.right
+ enabled: NetworkSettingsManager.currentWifiConnection
+ fillColor: enabled ? viewSettings.buttonGreenColor : viewSettings.buttonGrayColor
+ borderColor: "transparent"
+ height: pluginMain.buttonHeight
+ text: qsTr("DISCONNECT")
+ onClicked: {
+ if (NetworkSettingsManager.currentWifiConnection) {
+ NetworkSettingsManager.currentWifiConnection.disconnectService();
}
}
}
+ Text {
+ id: networkListTextItem
+ text: qsTr("Network list")
+ font.pixelSize: pluginMain.subTitleFontSize
+ font.family: appFont
+ font.styleName: "SemiBold"
+ color: "white"
+ anchors.top: wifiSwitch.bottom
+ }
+ NetworkListView {
+ id: networkList
+ anchors.top: networkListTextItem.bottom
+ anchors.left: networkListTextItem.left
+ width: networkSettingsRoot.width
+ height: networkSettingsRoot.height
+ }
}
+