summaryrefslogtreecommitdiffstats
path: root/src/networksettings
diff options
context:
space:
mode:
Diffstat (limited to 'src/networksettings')
-rw-r--r--src/networksettings/connman/qnetworksettingsmanager_p.cpp175
-rw-r--r--src/networksettings/connman/qnetworksettingsmanager_p.h25
-rw-r--r--src/networksettings/qnetworksettings.cpp7
-rw-r--r--src/networksettings/qnetworksettingsinterfacemodel.cpp9
-rw-r--r--src/networksettings/qnetworksettingsmanager.cpp37
-rw-r--r--src/networksettings/qnetworksettingsmanager.h10
6 files changed, 231 insertions, 32 deletions
diff --git a/src/networksettings/connman/qnetworksettingsmanager_p.cpp b/src/networksettings/connman/qnetworksettingsmanager_p.cpp
index 5bea9e2..36dddfe 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)
@@ -137,8 +141,7 @@ void QNetworkSettingsManagerPrivate::tryNextConnection()
}
if (!service) {
if (!m_unnamedServicesForSsidConnection.isEmpty()) {
- service = *m_unnamedServicesForSsidConnection.begin();
- m_unnamedServicesForSsidConnection.erase(m_unnamedServicesForSsidConnection.begin());
+ service = m_unnamedServicesForSsidConnection.take(m_unnamedServicesForSsidConnection.firstKey());
} else {
q->clearConnectionState();
}
@@ -148,6 +151,26 @@ void QNetworkSettingsManagerPrivate::tryNextConnection()
}
}
+void QNetworkSettingsManagerPrivate::setCurrentWifiConnection(QNetworkSettingsService *connection)
+{
+ m_currentWifiConnection = connection;
+}
+
+QNetworkSettingsService *QNetworkSettingsManagerPrivate::currentWifiConnection() const
+{
+ return m_currentWifiConnection.data();
+}
+
+void QNetworkSettingsManagerPrivate::setCurrentWiredConnection(QNetworkSettingsService *connection)
+{
+ m_currentWiredConnection = connection;
+}
+
+QNetworkSettingsService *QNetworkSettingsManagerPrivate::currentWiredConnection() const
+{
+ return m_currentWiredConnection.data();
+}
+
void QNetworkSettingsManagerPrivate::onConnmanServiceRegistered(const QString &serviceName)
{
if (serviceName == ConnManServiceName) {
@@ -184,7 +207,7 @@ void QNetworkSettingsManagerPrivate::onTechnologyRemoved(const QDBusObjectPath &
foreach (QNetworkSettingsInterface* item, m_interfaceModel.getModel()) {
ConnmanSettingsInterface* tech = qobject_cast<ConnmanSettingsInterface*>(item);
if (tech->path() == technology.path()) {
- m_interfaceModel.removeInterface(technology.path());
+ m_interfaceModel.removeInterface(tech->name());
emit q->interfacesChanged();
}
}
@@ -229,21 +252,43 @@ void QNetworkSettingsManagerPrivate::getTechnologiesFinished(QDBusPendingCallWat
void QNetworkSettingsManagerPrivate::onServicesChanged(ConnmanMapStructList changed, const QList<QDBusObjectPath> &removed)
{
- foreach (QDBusObjectPath path, removed) {
- m_serviceModel->removeService(path.path());
- auto serviceIter = m_unnamedServices.find(path.path());
- if (serviceIter != m_unnamedServices.end()) {
- serviceIter.value()->deleteLater();
- m_unnamedServices.erase(serviceIter);
- }
+ Q_Q(QNetworkSettingsManager);
+ foreach (const QDBusObjectPath &dpath, removed) {
+ QString path = dpath.path();
+
+ if (m_serviceModel->removeService(path))
+ emit q->servicesChanged();
+
+ if (auto service = m_unnamedServices.take(path))
+ if (!service->placeholderState()) {
+ disconnect(service, &QNetworkSettingsService::nameChanged,
+ this, &QNetworkSettingsManagerPrivate::serviceReady);
+ disconnect(service, &QNetworkSettingsService::typeChanged,
+ this, &QNetworkSettingsManagerPrivate::serviceReady);
+ service->deleteLater();
+ }
+ if (auto service = m_unknownServices.take(path))
+ if (!service->placeholderState()) {
+ disconnect(service, &QNetworkSettingsService::nameChanged,
+ this, &QNetworkSettingsManagerPrivate::serviceReady);
+ disconnect(service, &QNetworkSettingsService::typeChanged,
+ this, &QNetworkSettingsManagerPrivate::serviceReady);
+ service->deleteLater();
+ }
+ m_unnamedServicesForSsidConnection.remove(path); // do not delete here
}
QStringList newServices;
- foreach (ConnmanMapStruct map, changed) {
+ foreach (const ConnmanMapStruct &map, changed) {
+ QString path = map.objectPath.path();
+
+ if (m_unknownServices.contains(path) || m_unnamedServices.contains(path))
+ continue;
+
bool found = false;
foreach (QNetworkSettingsService* service, m_serviceModel->getModel()) {
- if (service->id() == map.objectPath.path() && service->placeholderState() == false) {
- found =true;
+ if (service->id() == path && service->placeholderState() == false) {
+ found = true;
break;
}
}
@@ -254,6 +299,7 @@ void QNetworkSettingsManagerPrivate::onServicesChanged(ConnmanMapStructList chan
foreach (QString newService, newServices) {
handleNewService(newService);
}
+
}
void QNetworkSettingsManagerPrivate::handleNewService(const QString &servicePath)
@@ -278,9 +324,20 @@ void QNetworkSettingsManagerPrivate::handleNewService(const QString &servicePath
}
}
else {
+ bool isUnnamedWifi = false;
+
//Service name or type not set, wait for update
- connect(service, &QNetworkSettingsService::nameChanged, this, &QNetworkSettingsManagerPrivate::serviceReady);
- connect(service, &QNetworkSettingsService::typeChanged, this, &QNetworkSettingsManagerPrivate::serviceReady);
+ if (service->name().isEmpty()) {
+ connect(service, &QNetworkSettingsService::nameChanged, this, &QNetworkSettingsManagerPrivate::serviceReady);
+ isUnnamedWifi = (service->type() == QNetworkSettingsType::Wifi);
+ }
+ if (service->type() == QNetworkSettingsType::Unknown)
+ connect(service, &QNetworkSettingsService::typeChanged, this, &QNetworkSettingsManagerPrivate::serviceReady);
+
+ if (isUnnamedWifi)
+ m_unnamedServices.insert(service->id(), service);
+ else
+ m_unknownServices.insert(service->id(), service);
}
}
@@ -295,11 +352,14 @@ void QNetworkSettingsManagerPrivate::serviceReady()
QNetworkSettingsService* service = qobject_cast<QNetworkSettingsService*>(sender());
- if (service->type() != QNetworkSettingsType::Unknown
- && service->type() == QNetworkSettingsType::Wifi) {
+ // the type changed from Unknown to Wifi
+ if ((service->type() == QNetworkSettingsType::Wifi)
+ && m_unknownServices.contains(service->id())) {
+ m_unknownServices.remove(service->id());
m_unnamedServices.insert(service->id(), service);
}
+ // we have a name and a length now
if (service->name().length() > 0 && service->type() != QNetworkSettingsType::Unknown) {
service->disconnect(this);
m_unnamedServices.remove(service->id());
@@ -316,7 +376,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..16cb899 100644
--- a/src/networksettings/connman/qnetworksettingsmanager_p.h
+++ b/src/networksettings/connman/qnetworksettingsmanager_p.h
@@ -43,6 +43,7 @@
#include <QObject>
#include <QtDBus>
#include <QMap>
+#include <QPointer>
#include "connmancommon.h"
#include "qnetworksettingsmanager.h"
#include "qnetworksettingsinterfacemodel.h"
@@ -70,10 +71,14 @@ public:
void connectBySsid(const QString &name);
void clearConnectionState();
void tryNextConnection();
- void setCurrentWifiConnection(QNetworkSettingsService *connection) {m_currentWifiConnection = connection;}
- QNetworkSettingsService* currentWifiConnection() const {return m_currentWifiConnection;}
- void setCurrentWiredConnection(QNetworkSettingsService *connection) {m_currentWiredConnection = connection;}
- QNetworkSettingsService* currentWiredConnection() const {return m_currentWiredConnection;}
+ void setCurrentWifiConnection(QNetworkSettingsService *connection);
+ QNetworkSettingsService* currentWifiConnection() const;
+ void setCurrentWiredConnection(QNetworkSettingsService *connection);
+ QNetworkSettingsService* currentWiredConnection() const;
+ QString usbEthernetInternetProtocolAddress();
+ QString usbVirtualEthernetLinkProtocol();
+ bool hasUsbEthernetProtocolConfiguration();
+ void setUsbVirtualEthernetLinkProtocol(const QString &protocol);
public slots:
void getServicesFinished(QDBusPendingCallWatcher *watcher);
@@ -84,12 +89,18 @@ 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;
+ QMap<QString, QNetworkSettingsService*> m_unknownServices;
QMap<QString, QNetworkSettingsService*> m_unnamedServices;
QMap<QString, QNetworkSettingsService*> m_unnamedServicesForSsidConnection;
QNetworkSettingsServiceFilter *m_serviceFilter;
@@ -98,8 +109,8 @@ private:
QNetworkSettingsUserAgent *m_agent;
QDBusServiceWatcher *m_serviceWatcher;
QString m_currentSsid;
- QNetworkSettingsService *m_currentWifiConnection;
- QNetworkSettingsService *m_currentWiredConnection;
+ QPointer<QNetworkSettingsService> m_currentWifiConnection;
+ QPointer<QNetworkSettingsService> m_currentWiredConnection;
bool m_initialized;
};
diff --git a/src/networksettings/qnetworksettings.cpp b/src/networksettings/qnetworksettings.cpp
index e4ddbad..be477e5 100644
--- a/src/networksettings/qnetworksettings.cpp
+++ b/src/networksettings/qnetworksettings.cpp
@@ -587,7 +587,12 @@ void QNetworkSettingsProxy::setMethod(const MethodType& method) {
Creates a new Wifi network configuration with the parent \a parent.
*/
QNetworkSettingsWireless::QNetworkSettingsWireless(QObject* parent)
- : QObject(parent) {
+ : QObject(parent)
+ , m_securityFlags(None)
+ , m_hidden(false)
+ , m_signalStrength(0)
+ , m_isOutOfRange(false)
+{
}
/*!
diff --git a/src/networksettings/qnetworksettingsinterfacemodel.cpp b/src/networksettings/qnetworksettingsinterfacemodel.cpp
index 045d3ff..8d6ca60 100644
--- a/src/networksettings/qnetworksettingsinterfacemodel.cpp
+++ b/src/networksettings/qnetworksettingsinterfacemodel.cpp
@@ -122,12 +122,7 @@ QVariant QNetworkSettingsInterfaceModel::data(const QModelIndex & index, int rol
*/
void QNetworkSettingsInterfaceModel::append(QNetworkSettingsInterface* item)
{
- item->setParent(this);
- connectStateChanges(item);
-
- beginInsertRows(QModelIndex(), rowCount(), rowCount());
- m_items.append(item);
- endInsertRows();
+ insert(rowCount(), item);
}
/*!
@@ -155,7 +150,7 @@ void QNetworkSettingsInterfaceModel::connectStateChanges(QNetworkSettingsInterfa
void QNetworkSettingsInterfaceModel::remove(int row)
{
beginRemoveRows(QModelIndex(), row, row);
- m_items.removeFirst();
+ m_items.takeAt(row)->deleteLater();
endRemoveRows();
}
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