summaryrefslogtreecommitdiffstats
path: root/src/networksettings/connman/qnetworksettingsmanager_p.cpp
diff options
context:
space:
mode:
authorVille Voutilainen <ville.voutilainen@qt.io>2018-04-26 11:57:16 +0300
committerVille Voutilainen <ville.voutilainen@qt.io>2018-04-27 09:51:53 +0000
commit2215248c450b6bd3f728e813f289f099d4301523 (patch)
treee68b66fa839ce3695b45fca3254e84076185ec1a /src/networksettings/connman/qnetworksettingsmanager_p.cpp
parent518749701642b9d93773b5599e9a64ecbc640b9a (diff)
Add support for wi-fi networks with hidden SSID
Task-number: QTBUG-62661 Change-Id: I894f37d2ac397ca2a10db92b1daec9997a9733bb Reviewed-by: Teemu Holappa <teemu.holappa@qt.io>
Diffstat (limited to 'src/networksettings/connman/qnetworksettingsmanager_p.cpp')
-rw-r--r--src/networksettings/connman/qnetworksettingsmanager_p.cpp55
1 files changed, 55 insertions, 0 deletions
diff --git a/src/networksettings/connman/qnetworksettingsmanager_p.cpp b/src/networksettings/connman/qnetworksettingsmanager_p.cpp
index b3373ee..ea9e682 100644
--- a/src/networksettings/connman/qnetworksettingsmanager_p.cpp
+++ b/src/networksettings/connman/qnetworksettingsmanager_p.cpp
@@ -44,6 +44,7 @@ QNetworkSettingsManagerPrivate::QNetworkSettingsManagerPrivate(QNetworkSettingsM
, m_serviceFilter(Q_NULLPTR)
, m_manager(Q_NULLPTR)
, m_agent(Q_NULLPTR)
+ , m_currentWifiConnection(Q_NULLPTR)
{
qDBusRegisterMetaType<ConnmanMapStruct>();
qDBusRegisterMetaType<ConnmanMapStructList>();
@@ -86,6 +87,40 @@ void QNetworkSettingsManagerPrivate::requestInput(const QString& service, const
emit m_agent->showUserCredentialsInput();
}
+void QNetworkSettingsManagerPrivate::connectBySsid(const QString &name)
+{
+ m_unnamedServicesForSsidConnection = m_unnamedServices;
+ tryNextConnection();
+ m_currentSsid = name;
+}
+
+void QNetworkSettingsManagerPrivate::clearConnectionState()
+{
+ m_unnamedServicesForSsidConnection.clear();
+ m_currentSsid.clear();
+}
+
+void QNetworkSettingsManagerPrivate::tryNextConnection()
+{
+ Q_Q(QNetworkSettingsManager);
+ QNetworkSettingsService* service = nullptr;
+ if (!m_currentSsid.isEmpty()) {
+ service = m_serviceModel->getByName(m_currentSsid);
+ m_currentSsid.clear();
+ }
+ if (!service) {
+ if (!m_unnamedServicesForSsidConnection.isEmpty()) {
+ service = *m_unnamedServicesForSsidConnection.begin();
+ m_unnamedServicesForSsidConnection.erase(m_unnamedServicesForSsidConnection.begin());
+ } else {
+ q->clearConnectionState();
+ }
+ }
+ if (service) {
+ service->doConnectService();
+ }
+}
+
void QNetworkSettingsManagerPrivate::getServicesFinished(QDBusPendingCallWatcher *watcher)
{
Q_Q(QNetworkSettingsManager);
@@ -129,6 +164,11 @@ void QNetworkSettingsManagerPrivate::onServicesChanged(ConnmanMapStructList chan
{
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);
+ }
}
QStringList newServices;
@@ -155,6 +195,14 @@ void QNetworkSettingsManagerPrivate::handleNewService(const QString &servicePath
QNetworkSettingsService *service = new QNetworkSettingsService(servicePath, this);
+ connect(service, &QNetworkSettingsService::connectionStateCleared,
+ q, &QNetworkSettingsManager::clearConnectionState);
+
+ connect(service, &QNetworkSettingsService::serviceConnected,
+ q, &QNetworkSettingsManager::setCurrentWifiConnection);
+ connect(service, &QNetworkSettingsService::serviceDisconnected,
+ q, &QNetworkSettingsManager::clearCurrentWifiConnection);
+
if (service->name().length() > 0 && service->type() != QNetworkSettingsType::Unknown) {
m_serviceModel->append(service);
emit q->servicesChanged();
@@ -179,8 +227,15 @@ void QNetworkSettingsManagerPrivate::serviceReady()
Q_Q(QNetworkSettingsManager);
QNetworkSettingsService* service = qobject_cast<QNetworkSettingsService*>(sender());
+
+ if (service->type() != QNetworkSettingsType::Unknown
+ && service->type() == QNetworkSettingsType::Wifi) {
+ m_unnamedServices.insert(service->id(), service);
+ }
+
if (service->name().length() > 0 && service->type() != QNetworkSettingsType::Unknown) {
service->disconnect(this);
+ m_unnamedServices.remove(service->id());
m_serviceModel->append(service);
emit q->servicesChanged();
if (service->type() == QNetworkSettingsType::Wired) {