Index: sources/wifi/WifiInterface.cpp =================================================================== diff -u -r66506a15ac0234c0a2fcf78d3262fdb91c51cbca -r87ca1f6fca153e2ac05425d2dc5937d5a46ba206 --- sources/wifi/WifiInterface.cpp (.../WifiInterface.cpp) (revision 66506a15ac0234c0a2fcf78d3262fdb91c51cbca) +++ sources/wifi/WifiInterface.cpp (.../WifiInterface.cpp) (revision 87ca1f6fca153e2ac05425d2dc5937d5a46ba206) @@ -40,6 +40,7 @@ _processSetStaticGateway .setParent(this); _processSetStaticSubnetMask .setParent(this); _processSetDNS .setParent(this); + _processTestInternet .setParent(this); } @@ -71,7 +72,10 @@ 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(); + _useStaticIP = WifiSettings.value(WifiSettings_UseStaticIP).toBool(); + _useStaticGateway = WifiSettings.value(WifiSettings_UseStaticGateway).toBool(); + _useStaticSubnetMask = WifiSettings.value(WifiSettings_UseStaticSubnetMask).toBool(); + _useStaticDNS = WifiSettings.value(WifiSettings_UseStaticDNS).toBool(); return WifiNetworkData(macAddress, ssid, variantListToSecurityTypes(securityTypesVar), status, signalLevel); } @@ -142,6 +146,9 @@ 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(this, SIGNAL(didRequestAutoAssignedIP()), this, SLOT( onRequestAutoAssignedIP())); @@ -244,9 +251,48 @@ { if (hasConnectedToWifi()) rejoinLastWifiNetwork(); + + startTimer(_internetCheckTimerInterval); } /*! + * \brief MainTimer::timerEvent + * Called on each timer event + * Checks for internet connectivity + */ +void WifiInterface::timerEvent(QTimerEvent *) +{ + 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(); + QString err = _processTestInternet.readAllStandardError(); + if (vExitCode != 0) + { + 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)); + emit didInternetConnectionChange(hasInternet); +} + +/*! * \brief WifiInterface::doScan * Scans for WiFi Access Points */ @@ -273,10 +319,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 +436,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 +485,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,9 +512,8 @@ * \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."); @@ -499,9 +547,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 +590,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 +614,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,31 +631,27 @@ /*! * \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); - } + + 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); + emit didConnectToNetwork(_network); } @@ -642,9 +681,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 +764,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,8 +774,8 @@ } 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); } @@ -749,15 +786,14 @@ * \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(); + emit didSetStaticIPAddress(WifiSettings.value(WifiSettings_IPAddress).toString()); } /*! @@ -779,8 +815,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 +827,14 @@ * \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(); + emit didSetGateway(WifiSettings.value(WifiSettings_Gateway).toString()); } /*! @@ -809,7 +844,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 +854,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 +866,14 @@ * \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(); + emit didSetSubnetMask(WifiSettings.value(WifiSettings_SubnetMask).toString()); } /*! @@ -860,6 +893,8 @@ } QString script; if ( ! checkScript(script, Wifi_Set_DNS ) ) return; WifiSettings.setValue(WifiSettings_DNS, vDNS); + _useStaticDNS = true; + WifiSettings.setValue(WifiSettings_UseStaticSubnetMask, _useStaticDNS); _processSetDNS.start(script, QStringList() << vDNS); } @@ -870,15 +905,14 @@ * \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(); + emit didSetDNS(WifiSettings.value(WifiSettings_DNS).toString()); } /*!