Index: sources/wifi/WifiInterface.cpp =================================================================== diff -u -r2085962f7bd0a2239ee5c857928a11d5e38fe0a2 -rc77365fa76422bc2150e58d483c446325b50f4b8 --- sources/wifi/WifiInterface.cpp (.../WifiInterface.cpp) (revision 2085962f7bd0a2239ee5c857928a11d5e38fe0a2) +++ sources/wifi/WifiInterface.cpp (.../WifiInterface.cpp) (revision c77365fa76422bc2150e58d483c446325b50f4b8) @@ -3,6 +3,7 @@ // Qt #include #include +#include // Project #include "main.h" @@ -17,10 +18,8 @@ void WifiInterface::onInitConnections() { - connect(&_processScan, SIGNAL(finished(int, QProcess::ExitStatus)), - this, SLOT(onScanFinished(int, QProcess::ExitStatus))); - connect(this, SIGNAL(didFailToConnect(const QString)), + connect(this, SIGNAL(didError(const QString)), this, SLOT(onLogFailure(const QString))); } @@ -83,40 +82,31 @@ */ void WifiInterface::doScan() { + QtConcurrent::run([=]() { + if (_scanRunning) + { + LOG_DEBUG("Wifi network scan is already running."); + return; + } + LOG_DEBUG("Scanning for Wifi Access Points..."); + QProcess process; + process.setWorkingDirectory(Wifi_Scripts_Dir); + _scanRunning = true; + emit didScanStatusChanged(_scanRunning); + process.start(Wifi_Scan_For_Networks); + process.waitForFinished(_scanTimeout); + QString out = process.readAllStandardOutput(); + QString err = process.readAllStandardError(); + LOG_DEBUG(out); + LOG_DEBUG(err); + _scanRunning = false; + emit didScanStatusChanged(_scanRunning); + onParseWifiScan(out); + }); - if (_scanRunning) - { - LOG_DEBUG("Wifi network scan is already running."); - return; - } - - LOG_DEBUG("Scanning for Wifi Access Points..."); - _processScan.setWorkingDirectory(Wifi_Scripts_Dir); - _scanRunning = true; - emit didScanStatusChanged(_scanRunning); - _processScan.start(Wifi_Scan_For_Networks); - } /*! - * \brief WifiInterface::onScanFinished - * Called when finished scanning for networks (success or error) - * \param vPid - pid of the scan for networks process - * \param vExitStatus - the status upon exit - */ -void WifiInterface::onScanFinished(int vPid, QProcess::ExitStatus vExitStatus) -{ - LOG_DEBUG(QString("%1: %2,%3").arg(__FUNCTION__).arg(vPid).arg(vExitStatus)); - QString out = _processScan.readAllStandardOutput(); - QString err = _processScan.readAllStandardError(); - LOG_DEBUG(out); - LOG_DEBUG(err); - _scanRunning = false; - emit didScanStatusChanged(_scanRunning); - onParseWifiScan(out); -} - -/*! * \brief Network::onParseWifiScan * Extract desired information from the wifi scan output. Sorts by signal stength * @@ -178,39 +168,81 @@ */ void WifiInterface::doJoinNetwork(const Network &vNetwork, const QString &vPassword) { - LOG_DEBUG(QString("Joining Network %1").arg(vNetwork.ssid())); - _network = vNetwork; - if (!generateWPASupplicant(_network, vPassword)) - { - emit didFailToConnect("Could not configure network."); - return; - } + QtConcurrent::run([=]() { + LOG_DEBUG(QString("Joining Network %1").arg(vNetwork.ssid())); + if (!generateWPASupplicant(vNetwork, vPassword)) + { + emit didError("Could not configure network."); + return; + } - if (!startWPASupplicant()) - { - emit didFailToConnect("Could not configure network."); - return; - } + if (!startWPASupplicant()) + { + emit didError("Could not configure network."); + return; + } - // TODO: Add option to setup with static IP settings instead - if (!requestAutoAssignedIP()) - { - emit didFailToConnect("Could not obtain IP Address."); - return; - } + // TODO: Add option to setup with static IP settings instead + if (!requestAutoAssignedIP()) + { + emit didError(QString("Could not connect to %1").arg(vNetwork.ssid())); + return; + } + Network network = vNetwork; + network.ipSettings(getIPSettings()); + emit didConnectToNetwork(network); + }); +} + +/*! + * \brief WifiInterface::getIPSettings + * Gets the IP settings from the device. If an IP address + * is not found, all other IP settings are left blank as well. + */ +Network::IPSettings WifiInterface::getIPSettings() +{ Network::IPSettings ipSettings; QString output = readIPSettings(); ipSettings.mIPAddress = parseIP(output); + if (ipSettings.mIPAddress == "") { + return ipSettings; + } ipSettings.mBroadcast = parseBroadcast(output); ipSettings.mSubnetMask = parseSubnetMask(output); ipSettings.mGateway = readGateway(); ipSettings.mDns = readDNS(); - _network.ipSettings(ipSettings); - emit didConnectToNetwork(_network); + return ipSettings; } /*! + * \brief WifiInterface::doRequestIPSettings + * Handles a request to read the IP settings of the device. + */ +void WifiInterface::doRequestIPSettings() +{ + emit didGetIPSettings(getIPSettings()); +} + +/*! + * \brief WifiInterface::doDisconnectNetwork + * Disconnects from the specified network + * \param vNetwork - (Network) the network to disconnect from + */ +void WifiInterface::doDisconnectNetwork(const Network &vNetwork) +{ + LOG_DEBUG(QString("Disconnecting from Network %1").arg(vNetwork.ssid())); + QProcess process; + process.start(Wifi_Disconnect_Network, + QStringList() << _iface); + if (process.waitForFinished(_defaultTimeout)) + emit didDisconnectNetwork(vNetwork); + process.kill(); + emit didError(tr("Failed to disconnect from %1").arg(vNetwork.ssid())); +} + + +/*! * \brief WifiInterface::generateWPASupplicant * Generates the WPA Supplicant configuration file * \param vNetwork (Network) the network w/ ssid we want to connect to @@ -220,11 +252,17 @@ bool WifiInterface::generateWPASupplicant(const Network &vNetwork, const QString &vPassword) { LOG_DEBUG("Generating WPA Supplicant..."); - _processJoinNetwork.start(Wifi_Generate_WPA_Supplicant, + QProcess process; + process.start(Wifi_Generate_WPA_Supplicant, QStringList() << vNetwork.ssid() << vPassword << _wpaSupplicantConfPath); - return _processJoinNetwork.waitForFinished(_defaultTimeout); + if (!process.waitForFinished(_defaultTimeout)) + { + process.kill(); + return false; + } + return true; } /*! @@ -235,23 +273,36 @@ bool WifiInterface::startWPASupplicant() { LOG_DEBUG("Starting wpa supplicant..."); - _processJoinNetwork.start(Wifi_Start_WPA_Supplicant, + QProcess process; + process.start(Wifi_Start_WPA_Supplicant, QStringList() << _iface << _wpaSupplicantConfPath); - return _processJoinNetwork.waitForFinished(_defaultTimeout); + if (!process.waitForFinished(_defaultTimeout)) + { + process.kill(); + return false; + } + return true; } /*! * \brief WifiInterface::requestAutoAssignedIP * Requests an auto-assigned IP addressed * \return true if successful, false on timeout */ -bool WifiInterface::requestAutoAssignedIP() +bool WifiInterface::requestAutoAssignedIP(int vTries) { - LOG_DEBUG("Requesting auto-assigned IP address..."); - _processJoinNetwork.start(Wifi_Get_Auto_Assigned_IP, + LOG_DEBUG(QString("Requesting auto-assigned IP address...")); + QProcess process; + process.start(Wifi_Get_Auto_Assigned_IP, QStringList() << _iface); - return _processJoinNetwork.waitForFinished(_dhcpTimeout); + if (!process.waitForFinished(_dhcpTimeout)) + { + if (vTries > 0) + return requestAutoAssignedIP(--vTries); + return false; + } + return true; } /*! @@ -262,10 +313,13 @@ QString WifiInterface::readIPSettings() { QString result = ""; - _processGetIPAddress.start(Wifi_Read_IP_Settings, + QProcess process; + process.start(Wifi_Read_IP_Settings, QStringList() << _iface); - if (_processGetIPAddress.waitForFinished(_defaultTimeout)) - result = _processGetIPAddress.readAllStandardOutput(); + if (process.waitForFinished(_defaultTimeout)) + result = process.readAllStandardOutput(); + else + process.kill(); LOG_DEBUG(QString("Output with IP address information: %1").arg(result)); return result; } @@ -342,9 +396,11 @@ */ QString WifiInterface::readGateway() { - _processGetIPAddress.start(Wifi_Read_Gateway); - if (_processGetIPAddress.waitForFinished(_defaultTimeout)) - return parseGateway(_processGetIPAddress.readAllStandardOutput()); + QProcess process; + process.start(Wifi_Read_Gateway); + if (process.waitForFinished(_defaultTimeout)) + return parseGateway(process.readAllStandardOutput()); + process.kill(); return ""; } @@ -355,8 +411,10 @@ */ QString WifiInterface::readDNS() { - _processGetIPAddress.start(Wifi_Read_DNS); - if (_processGetIPAddress.waitForFinished(_defaultTimeout)) - return parseDNS(_processGetIPAddress.readAllStandardOutput()); + QProcess process; + process.start(Wifi_Read_DNS); + if (process.waitForFinished(_defaultTimeout)) + return parseDNS(process.readAllStandardOutput()); + process.kill(); return ""; }