Index: sources/wifi/WifiInterface.cpp =================================================================== diff -u -r091bc0425b84f094cbd863865a5edac2477208eb -r54f11a67ea7b62c64e797d3947d0858530394467 --- sources/wifi/WifiInterface.cpp (.../WifiInterface.cpp) (revision 091bc0425b84f094cbd863865a5edac2477208eb) +++ sources/wifi/WifiInterface.cpp (.../WifiInterface.cpp) (revision 54f11a67ea7b62c64e797d3947d0858530394467) @@ -27,8 +27,63 @@ _processSetStaticGateway.setParent(this); _processSetStaticSubnetMask.setParent(this); _processSetDNS.setParent(this); + + if (hasConnectedToWifi()) + rejoinLastWifiNetwork(); } + +/*! + * \brief WifiInterface::hasConnectedToWifi + * Checks whether we have previously connected to a wifi network + * \return (bool) true if we have, false otherwise + */ +bool WifiInterface::hasConnectedToWifi() +{ + if (WifiSettings.value(WifiSettings_MacAddress).toString().isEmpty()) + return false; + + if (!QFile(_wpaSupplicantConfPath).exists()) + return false; + + return true; +} + +/*! + * \brief WifiInterface::getLastWifiNetworkConnectedTo + * Gets the last network we connected to from settings + * \return (Network) the network we last connected to + */ +Network WifiInterface::getLastWifiNetworkConnectedTo() +{ + QString macAddress = WifiSettings.value(WifiSettings_MacAddress).toString(); + QString ssid = WifiSettings.value(WifiSettings_SSID).toString(); + QList securityTypesVar = WifiSettings.value(WifiSettings_Security_Types).toList(); + Network::STATUS status = Network::STATUS::NOT_CONNECTED; + Network::SIGNAL_LEVEL signalLevel = Network::SIGNAL_LEVEL::NO_SIGNAL; + _useDHCP = WifiSettings.value(WifiSettings_UseDHCP).toBool(); + return Network(macAddress, ssid, variantListToSecurityTypes(securityTypesVar), status, signalLevel); +} + +/*! + * \brief WifiInterface::rejoinLastWifiNetwork + * Attemps to rejoin the network we last connected to + */ +void WifiInterface::rejoinLastWifiNetwork() +{ + _network = getLastWifiNetworkConnectedTo(); + if (_processStartWPASupplicant.state() != QProcess::NotRunning) + { + LOG_DEBUG(QString("Rejecting request for %1. %2 is already running.") + .arg(__FUNCTION__) + .arg(_processStartWPASupplicant.objectName())); + return; + } + _processStartWPASupplicant.start(Wifi_Start_WPA_Supplicant, + QStringList() << _iface + << _wpaSupplicantConfPath); +} + void WifiInterface::initConnections() { connect(this, SIGNAL(didStatusChanged(const QString)), @@ -334,6 +389,8 @@ { LOG_DEBUG(QString("WifiInterface::%1 %2").arg(__FUNCTION__).arg(QThread::currentThread()->objectName())); _network = vNetwork; + _useDHCP = true; + WifiSettings.setValue(WifiSettings_UseDHCP, _useDHCP); LOG_DEBUG(QString("Joining Network %1").arg(vNetwork.ssid())); if (_processGenerateWPASupplicant.state() != QProcess::NotRunning) { @@ -357,6 +414,10 @@ emit didError(QString("Network %1 has an unsupported security type.").arg(vNetwork.ssid())); } + WifiSettings.setValue(WifiSettings_SSID, vNetwork.ssid()); + WifiSettings.setValue(WifiSettings_MacAddress, vNetwork.macAddress()); + WifiSettings.setValue(WifiSettings_ConfPath, _wpaSupplicantConfPath); + WifiSettings.setValue(WifiSettings_Security_Types, securityTypesToStringList(vNetwork.securityTypes())); _processGenerateWPASupplicant.start(Wifi_Generate_WPA_Supplicant, QStringList() << vNetwork.ssid() << vPassword @@ -463,7 +524,6 @@ void WifiInterface::doRequestIPSettings() { LOG_DEBUG(QString("WifiInterface::%1 %2").arg(__FUNCTION__).arg(QThread::currentThread()->objectName())); - QString result = ""; if (_processReadIPSettings.state() != QProcess::NotRunning) { LOG_DEBUG(QString("Rejecting request for %1. %2 is already running.") @@ -535,6 +595,22 @@ Q_UNUSED(vExitCode); Q_UNUSED(vExitStatus); _network.mIPSettings.mDNS = parseDNS(_processReadDNS.readAllStandardOutput()); + if (!_useDHCP) + { + // Use current static IP settings + QString ipAddress = WifiSettings.value(WifiSettings_IPAddress).toString().trimmed(); + QString gateway = WifiSettings.value(WifiSettings_Gateway).toString().trimmed(); + QString subnetMask = WifiSettings.value(WifiSettings_SubnetMask).toString().trimmed(); + QString dns = WifiSettings.value(WifiSettings_DNS).toString().trimmed(); + if (!ipAddress.isEmpty()) + doRequestSetIPAddress(_network.mIPSettings.mIPAddress); + if (!gateway.isEmpty()) + doRequestSetGateway(_network.mIPSettings.mGateway); + if (!subnetMask.isEmpty()) + doRequestSetSubnetMask(_network.mIPSettings.mSubnetMask); + if (!dns.isEmpty()) + doRequestSetDNS(_network.mIPSettings.mDNS); + } emit didConnectToNetwork(_network); } @@ -658,8 +734,11 @@ .arg(_processSetStaticIPAddress.objectName())); return; } + WifiSettings.setValue(WifiSettings_IPAddress, vIPAddress); + _useDHCP = false; + WifiSettings.setValue(WifiSettings_UseDHCP, _useDHCP); _processSetStaticIPAddress.start(Wifi_Set_Static_IP, - QStringList() << _iface); + QStringList() << _iface << vIPAddress); } /*! @@ -673,7 +752,7 @@ Q_UNUSED(vExitStatus) if (vExitCode != 0) { - emit didError(tr("Failed to set static IP Address for %1").arg(_network.ssid())); + emit didError(tr("Failed to set static IP Address")); return; } emit didSetStaticIPAddress(); @@ -689,14 +768,18 @@ Q_UNUSED(vGateway) LOG_DEBUG(QString("WifiInterface::%1 %2").arg(__FUNCTION__).arg(QThread::currentThread()->objectName())); LOG_DEBUG(QString("Handling request to set static gateway: %1").arg(vGateway)); + if (_processSetStaticGateway.state() != QProcess::NotRunning) { LOG_DEBUG(QString("Rejecting request for %1. %2 is already running.") .arg(__FUNCTION__) .arg(_processSetStaticGateway.objectName())); return; } - _processSetStaticGateway.start(Wifi_Set_Static_IP, + WifiSettings.setValue(WifiSettings_Gateway, vGateway); + _useDHCP = false; + WifiSettings.setValue(WifiSettings_UseDHCP, _useDHCP); + _processSetStaticGateway.start(Wifi_Set_Gateway, QStringList() << vGateway); } @@ -711,7 +794,7 @@ Q_UNUSED(vExitStatus) if (vExitCode != 0) { - emit didError(tr("Failed to set gateway for %1").arg(_network.ssid())); + emit didError(tr("Failed to set gateway.")); return; } emit didSetGateway(); @@ -734,8 +817,11 @@ .arg(_processSetStaticSubnetMask.objectName())); return; } + WifiSettings.setValue(WifiSettings_SubnetMask, vSubnetMask); + _useDHCP = false; + WifiSettings.setValue(WifiSettings_UseDHCP, _useDHCP); _processSetStaticSubnetMask.start(Wifi_Set_SubnetMask, - QStringList() << vSubnetMask); + QStringList() << _iface << vSubnetMask); } /*! @@ -749,7 +835,7 @@ Q_UNUSED(vExitStatus) if (vExitCode != 0) { - emit didError(tr("Failed to set subnet mask for %1. Has the IP been set?").arg(_network.ssid())); + emit didError(tr("Failed to set subnet mask.")); return; } emit didSetSubnetMask(); @@ -771,6 +857,7 @@ .arg(_processSetDNS.objectName())); return; } + WifiSettings.setValue(WifiSettings_DNS, vDNS); _processSetDNS.start(Wifi_Set_DNS, QStringList() << vDNS); } @@ -786,8 +873,43 @@ Q_UNUSED(vExitStatus) if (vExitCode != 0) { - emit didError(tr("Failed to set DNS.").arg(_network.ssid())); + emit didError(tr("Failed to set DNS.")); return; } emit didSetDNS(); } + +/*! + * \brief WifiInterface::securityTypesToStringList + * Converts a QList of network security types to a QStringList + * \param securityTypes (QList) the list of security type + * \return (QStringList) the security types as a string list + */ +QStringList WifiInterface::securityTypesToStringList(const QList &securityTypes) +{ + QStringList securityTypesStrList; + for (const Network::SECURITY_TYPE &type : securityTypes) + { + securityTypesStrList.append(QString("%1").arg(type)); + } + return securityTypesStrList; +} + +/*! + * \brief variantListToSecurityTypes + * Converts a QVariantList of security types to a QList + * \param securityTypesVar (QVariantList) security types + * \return (QList) the list of network security types + */ +QList WifiInterface::variantListToSecurityTypes(const QList &securityTypesVar) +{ + QList securityTypes; + for (const QVariant &type : securityTypesVar) + { + bool ok = false; + Network::SECURITY_TYPE val = Network::SECURITY_TYPE(type.toInt(&ok)); + if (ok) + securityTypes.append(val); + } + return securityTypes; +}