Index: sources/wifi/WifiInterface.cpp =================================================================== diff -u -r66506a15ac0234c0a2fcf78d3262fdb91c51cbca -r76c58ab0a150b968bc4885abc315b0ca250de2b8 --- sources/wifi/WifiInterface.cpp (.../WifiInterface.cpp) (revision 66506a15ac0234c0a2fcf78d3262fdb91c51cbca) +++ sources/wifi/WifiInterface.cpp (.../WifiInterface.cpp) (revision 76c58ab0a150b968bc4885abc315b0ca250de2b8) @@ -40,6 +40,8 @@ _processSetStaticGateway .setParent(this); _processSetStaticSubnetMask .setParent(this); _processSetDNS .setParent(this); + _processTestNetwork .setParent(this); + _processTestInternet .setParent(this); } @@ -71,8 +73,20 @@ QList securityTypesVar = WifiSettings.value(WifiSettings_Security_Types).toList(); MWifiNetwork::STATUS status = MWifiNetwork::STATUS::NOT_CONNECTED; MWifiNetwork::SIGNAL_LEVEL signalLevel = MWifiNetwork::SIGNAL_LEVEL::NO_SIGNAL; - _useDHCP = WifiSettings.value(WifiSettings_UseDHCP).toBool(); - return WifiNetworkData(macAddress, ssid, variantListToSecurityTypes(securityTypesVar), status, signalLevel); + _useStaticIP = WifiSettings.value(WifiSettings_UseStaticIP).toBool(); + _useStaticGateway = WifiSettings.value(WifiSettings_UseStaticGateway).toBool(); + _useStaticSubnetMask = WifiSettings.value(WifiSettings_UseStaticSubnetMask).toBool(); + _useStaticDNS = WifiSettings.value(WifiSettings_UseStaticDNS).toBool(); + WifiNetworkData data = WifiNetworkData(macAddress, ssid, variantListToSecurityTypes(securityTypesVar), status, signalLevel); + if (_useStaticIP) + data.mIPSettings.mIPAddress = WifiSettings.value(WifiSettings_IPAddress).toString(); + if (_useStaticGateway) + data.mIPSettings.mGateway = WifiSettings.value(WifiSettings_Gateway).toString(); + if (_useStaticSubnetMask) + data.mIPSettings.mSubnetMask = WifiSettings.value(WifiSettings_SubnetMask).toString(); + if (_useStaticDNS) + data.mIPSettings.mDNS = WifiSettings.value(WifiSettings_DNS).toString(); + return data; } /*! @@ -142,6 +156,12 @@ connect(&_processSetDNS , SIGNAL( finished(int, QProcess::ExitStatus)), this , SLOT( onProcessFinishedSetDNS(int, QProcess::ExitStatus))); + connect(&_processTestInternet , SIGNAL( finished(int, QProcess::ExitStatus)), + this , SLOT( onProcessFinishedTestInternet(int, QProcess::ExitStatus))); + + connect(&_processTestNetwork , SIGNAL( finished(int, QProcess::ExitStatus)), + this , SLOT( onProcessFinishedTestLocalNetwork(int, QProcess::ExitStatus))); + connect(this, SIGNAL(didRequestAutoAssignedIP()), this, SLOT( onRequestAutoAssignedIP())); @@ -244,9 +264,79 @@ { if (hasConnectedToWifi()) rejoinLastWifiNetwork(); + + startTimer(_internetCheckTimerInterval); } /*! + * \brief MainTimer::timerEvent + * Called on each timer event + * Checks for internet connectivity + */ +void WifiInterface::timerEvent(QTimerEvent *) +{ + if (_processTestNetwork.state() != QProcess::NotRunning) { + LOG_DEBUG("The network test is already running."); + return; + } + + QString script_network; if ( ! checkScript(script_network, Wifi_Test_Network) ) return; + _processTestNetwork.start(script_network, QStringList() << _iface << _network.mIPSettings.mGateway); + + if (_processTestInternet.state() != QProcess::NotRunning) { + LOG_DEBUG("The internet test is already running."); + return; + } + + QString script; if ( ! checkScript(script, Wifi_Test_Internet) ) return; + _processTestInternet.start(script, QStringList() << _iface); +} + +/*! + * \brief WifiInterface::onProcessFinishedTestInternet + * Called when the internet connectivity test has finished + * \param vExitCode - (int) the exit code + * \param vExitStatus - (QProcess::ExitStatus) the exit status + */ +void WifiInterface::onProcessFinishedTestInternet(int vExitCode, QProcess::ExitStatus) +{ + QString out = _processTestInternet.readAllStandardOutput(); + if (vExitCode != 0) + { + emit didInternetConnectionChange(false); + return; + } + + bool hasInternet = QRegularExpression("4 packets transmitted, 4 packets received, 0% packet loss").match(out).hasMatch(); + LOG_DEBUG(QString("Connected to internet? %1").arg(hasInternet)); + if (hasInternet) + emit didLocalNetworkConnectionChange(true); + emit didInternetConnectionChange(hasInternet); +} + +/*! + * \brief WifiInterface::onProcessFinishedTestLocalNetwork + * Called when the local network connectivity test has finished + * \param vExitCode - (int) the exit code + * \param vExitStatus - (QProcess::ExitStatus) the exit status + */ +void WifiInterface::onProcessFinishedTestLocalNetwork(int vExitCode, QProcess::ExitStatus) +{ + QString out = _processTestNetwork.readAllStandardOutput(); + if (vExitCode != 0) + { + emit didLocalNetworkConnectionChange(false); + return; + } + + bool hasNetwork = QRegularExpression("4 packets transmitted, 4 packets received, 0% packet loss").match(out).hasMatch(); + LOG_DEBUG(QString("Connected to Wi-Fi network? %1").arg(hasNetwork)); + if (!hasNetwork) + emit didInternetConnectionChange(false); + emit didLocalNetworkConnectionChange(hasNetwork); +} + +/*! * \brief WifiInterface::doScan * Scans for WiFi Access Points */ @@ -273,10 +363,8 @@ * \param vExitCode - (int) the exit code * \param vExitStatus - (QProcess::ExitStatus) the exit status */ -void WifiInterface::onProcessFinishedScan(int vExitCode, QProcess::ExitStatus vExitStatus) +void WifiInterface::onProcessFinishedScan(int, QProcess::ExitStatus) { - Q_UNUSED(vExitCode) - Q_UNUSED(vExitStatus) QString out = _processScan.readAllStandardOutput(); QString err = _processScan.readAllStandardError(); LOG_DEBUG(QString("stdout: %1").arg(out)); @@ -392,8 +480,14 @@ void WifiInterface::doJoinNetwork(const WifiNetworkData &vNetwork, const QString &vPassword) { _network = vNetwork; - _useDHCP = true; - WifiSettings.setValue(WifiSettings_UseDHCP, _useDHCP); + _useStaticIP = false; + WifiSettings.setValue(WifiSettings_UseStaticIP, _useStaticIP); + _useStaticGateway = false; + WifiSettings.setValue(WifiSettings_UseStaticGateway, _useStaticGateway); + _useStaticSubnetMask = false; + WifiSettings.setValue(WifiSettings_UseStaticSubnetMask, _useStaticSubnetMask); + _useStaticDNS = false; + WifiSettings.setValue(WifiSettings_UseStaticDNS, _useStaticDNS); LOG_DEBUG(QString("Joining Network %1").arg(vNetwork.ssid())); if (_processGenerateWPASupplicant.state() != QProcess::NotRunning) { @@ -435,9 +529,8 @@ * \param vExitCode - (int) the exit code * \param vExitStatus - (QProcess::ExitStatus) the exit status */ -void WifiInterface::onProcessFinishedGenerateWPASupplicant(int vExitCode, QProcess::ExitStatus vExitStatus) +void WifiInterface::onProcessFinishedGenerateWPASupplicant(int vExitCode, QProcess::ExitStatus) { - Q_UNUSED(vExitStatus) if (vExitCode != 0) { emit didError("Could not configure network."); @@ -463,14 +556,14 @@ * \param vExitCode - (int) the exit code * \param vExitStatus - (QProcess::ExitStatus) the exit status */ -void WifiInterface::onProcessFinishedStartWPASupplicant(int vExitCode, QProcess::ExitStatus vExitStatus) +void WifiInterface::onProcessFinishedStartWPASupplicant(int vExitCode, QProcess::ExitStatus) { - Q_UNUSED(vExitStatus) if (vExitCode != 0) { emit didError("Could not configure network."); return; } + emit didRequestAutoAssignedIP(); } @@ -499,9 +592,8 @@ * \param vExitCode - (int) the exit code * \param vExitStatus - (QProcess::ExitStatus) the exit status */ -void WifiInterface::onProcessFinishedRequestAutoAssignedIP(int vExitCode, QProcess::ExitStatus vExitStatus) +void WifiInterface::onProcessFinishedRequestAutoAssignedIP(int vExitCode, QProcess::ExitStatus) { - Q_UNUSED(vExitStatus) if (vExitCode != 0) { if (_dhcpAttemptsLeft > 0) @@ -543,10 +635,8 @@ * \param vExitCode - (int) the exit code * \param vExitStatus - (QProcess::ExitStatus) the exit status */ -void WifiInterface::onProcessFinishedReadIP(int vExitCode, QProcess::ExitStatus vExitStatus) +void WifiInterface::onProcessFinishedReadIP(int, QProcess::ExitStatus) { - Q_UNUSED(vExitCode); - Q_UNUSED(vExitStatus); QString output = _processReadIPSettings.readAllStandardOutput(); _network.mIPSettings.mIPAddress = parseIP(output); _network.mIPSettings.mBroadcast = parseBroadcast(output); @@ -569,10 +659,8 @@ * \param vExitCode - (int) the exit code * \param vExitStatus - (QProcess::ExitStatus) the exit status */ -void WifiInterface::onProcessFinishedReadGateway(int vExitCode, QProcess::ExitStatus vExitStatus) +void WifiInterface::onProcessFinishedReadGateway(int, QProcess::ExitStatus) { - Q_UNUSED(vExitCode); - Q_UNUSED(vExitStatus); _network.mIPSettings.mGateway = parseGateway(_processReadGateway.readAllStandardOutput()); if (_processReadDNS.state() != QProcess::NotRunning) { @@ -588,35 +676,40 @@ /*! * \brief WifiInterface::onProcessFinishedReadDNS * Parses the DNS of the device when the process has finished then - * emits the newtwork with all the ip address information filled + * emits the network with all the ip address information filled * \param vExitCode - (int) the exit code * \param vExitStatus - (QProcess::ExitStatus) the exit status */ -void WifiInterface::onProcessFinishedReadDNS(int vExitCode, QProcess::ExitStatus vExitStatus) +void WifiInterface::onProcessFinishedReadDNS(int, QProcess::ExitStatus) { - 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); + + applyStaticSettings(); + + emit didSetupNetworkConnection(_network); } /*! + * \brief WifiInterface::applyStaticSettings + * If any settings are static, apply them. + */ +void WifiInterface::applyStaticSettings() +{ + 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 (_useStaticIP && !ipAddress.isEmpty()) + doRequestSetIPAddress(ipAddress); + if (_useStaticGateway && !gateway.isEmpty()) + doRequestSetGateway(gateway); + if (_useStaticSubnetMask && !subnetMask.isEmpty()) + doRequestSetSubnetMask(subnetMask); + if (_useStaticDNS && !dns.isEmpty()) + doRequestSetDNS(dns); +} + +/*! * \brief WifiInterface::doDisconnectNetwork * Disconnects from the specified network * \param vNetwork - (Network) the network to disconnect from @@ -642,9 +735,8 @@ * \param vExitCode - (int) the exit code * \param vExitStatus - (QProcess::ExitStatus) the exit status */ -void WifiInterface::onProcessFinishedDisconnectNetwork(int vExitCode, QProcess::ExitStatus vExitStatus) +void WifiInterface::onProcessFinishedDisconnectNetwork(int vExitCode, QProcess::ExitStatus) { - Q_UNUSED(vExitStatus) if (vExitCode != 0) { emit didError(tr("Failed to disconnect from %1").arg(_network.ssid())); @@ -726,7 +818,6 @@ */ void WifiInterface::doRequestSetIPAddress(const QString &vIPAddress) { - Q_UNUSED(vIPAddress) LOG_DEBUG(QString("Handling request to set static IP address: %1").arg(vIPAddress)); if (_processSetStaticIPAddress.state() != QProcess::NotRunning) { @@ -737,10 +828,13 @@ } QString script; if ( ! checkScript(script, Wifi_Set_Static_IP) ) return; WifiSettings.setValue(WifiSettings_IPAddress, vIPAddress); - _useDHCP = false; - WifiSettings.setValue(WifiSettings_UseDHCP, _useDHCP); + _useStaticIP = true; + WifiSettings.setValue(WifiSettings_UseStaticIP, _useStaticIP); _processSetStaticIPAddress.start(script, QStringList() << _iface << vIPAddress); + + // DEN-8351: Set the default gateway + doRequestSetGateway(_network.mIPSettings.mGateway); } /*! @@ -749,15 +843,15 @@ * \param vExitCode - (int) the exit code * \param vExitStatus - (QProcess::ExitStatus) the exit status */ -void WifiInterface::onProcessFinishedSetIPAddress(int vExitCode, QProcess::ExitStatus vExitStatus) +void WifiInterface::onProcessFinishedSetIPAddress(int vExitCode, QProcess::ExitStatus) { - Q_UNUSED(vExitStatus) if (vExitCode != 0) { emit didError(tr("Failed to set static IP Address")); return; } - emit didSetStaticIPAddress(); + _network.mIPSettings.mIPAddress = WifiSettings.value(WifiSettings_IPAddress).toString().trimmed(); + emit didSetStaticIPAddress(_network.mIPSettings.mIPAddress); } /*! @@ -779,8 +873,8 @@ } QString script; if ( ! checkScript(script, Wifi_Set_Gateway) ) return; WifiSettings.setValue(WifiSettings_Gateway, vGateway); - _useDHCP = false; - WifiSettings.setValue(WifiSettings_UseDHCP, _useDHCP); + _useStaticGateway = true; + WifiSettings.setValue(WifiSettings_UseStaticGateway, _useStaticGateway); _processSetStaticGateway.start(script, QStringList() << vGateway); } @@ -791,15 +885,15 @@ * \param vExitCode - (int) the exit code * \param vExitStatus - (QProcess::ExitStatus) the exit status */ -void WifiInterface::onProcessFinishedSetGateway(int vExitCode, QProcess::ExitStatus vExitStatus) +void WifiInterface::onProcessFinishedSetGateway(int vExitCode, QProcess::ExitStatus) { - Q_UNUSED(vExitStatus) if (vExitCode != 0) { emit didError(tr("Failed to set gateway.")); return; } - emit didSetGateway(); + _network.mIPSettings.mGateway = WifiSettings.value(WifiSettings_Gateway).toString().trimmed(); + emit didSetGateway(_network.mIPSettings.mGateway); } /*! @@ -809,7 +903,6 @@ */ void WifiInterface::doRequestSetSubnetMask(const QString &vSubnetMask) { - Q_UNUSED(vSubnetMask) LOG_DEBUG(QString("Handling request to set static subnet mask: %1").arg(vSubnetMask)); if (_processSetStaticSubnetMask.state() != QProcess::NotRunning) { @@ -820,8 +913,8 @@ } QString script; if ( ! checkScript(script, Wifi_Set_SubnetMask) ) return; WifiSettings.setValue(WifiSettings_SubnetMask, vSubnetMask); - _useDHCP = false; - WifiSettings.setValue(WifiSettings_UseDHCP, _useDHCP); + _useStaticSubnetMask = true; + WifiSettings.setValue(WifiSettings_UseStaticSubnetMask, _useStaticSubnetMask); _processSetStaticSubnetMask.start(script, QStringList() << _iface << vSubnetMask); } @@ -832,15 +925,15 @@ * \param vExitCode - (int) the exit code * \param vExitStatus - (QProcess::ExitStatus) the exit status */ -void WifiInterface::onProcessFinishedSetSubnetMask(int vExitCode, QProcess::ExitStatus vExitStatus) +void WifiInterface::onProcessFinishedSetSubnetMask(int vExitCode, QProcess::ExitStatus) { - Q_UNUSED(vExitStatus) if (vExitCode != 0) { emit didError(tr("Failed to set subnet mask.")); return; } - emit didSetSubnetMask(); + _network.mIPSettings.mSubnetMask = WifiSettings.value(WifiSettings_SubnetMask).toString().trimmed(); + emit didSetSubnetMask(_network.mIPSettings.mSubnetMask); } /*! @@ -860,6 +953,8 @@ } QString script; if ( ! checkScript(script, Wifi_Set_DNS ) ) return; WifiSettings.setValue(WifiSettings_DNS, vDNS); + _useStaticDNS = true; + WifiSettings.setValue(WifiSettings_UseStaticDNS, _useStaticDNS); _processSetDNS.start(script, QStringList() << vDNS); } @@ -870,15 +965,15 @@ * \param vExitCode - (int) the exit code * \param vExitStatus - (QProcess::ExitStatus) the exit status */ -void WifiInterface::onProcessFinishedSetDNS(int vExitCode, QProcess::ExitStatus vExitStatus) +void WifiInterface::onProcessFinishedSetDNS(int vExitCode, QProcess::ExitStatus) { - Q_UNUSED(vExitStatus) if (vExitCode != 0) { emit didError(tr("Failed to set DNS.")); return; } - emit didSetDNS(); + _network.mIPSettings.mDNS = WifiSettings.value(WifiSettings_DNS).toString().trimmed(); + emit didSetDNS(_network.mIPSettings.mDNS); } /*!