Index: sources/wifi/WifiInterface.cpp =================================================================== diff -u -rf35b360054e1e2fa81bf107427fe2d50d78e9e8a -r3403122944ec8f31dfd33b387e21204783579f60 --- sources/wifi/WifiInterface.cpp (.../WifiInterface.cpp) (revision f35b360054e1e2fa81bf107427fe2d50d78e9e8a) +++ sources/wifi/WifiInterface.cpp (.../WifiInterface.cpp) (revision 3403122944ec8f31dfd33b387e21204783579f60) @@ -12,23 +12,42 @@ using namespace Storage; -WifiInterface::WifiInterface(QObject *parent) : QObject(parent) {} +WifiInterface::WifiInterface(QObject *parent) : QObject(parent) +{ + _processScan.setParent(this); + _processReadIPSettings.setParent(this); + _processReadGateway.setParent(this); + _processReadDNS.setParent(this); + _processGenerateWPASupplicant.setParent(this); + _processStartWPASupplicant.setParent(this); + _processRequestAutoAssignedIP.setParent(this); +} void WifiInterface::onInitConnections() { - connect(this, SIGNAL(didError(const QString)), this, SLOT(onLogFailure(const QString))); connect(&_processScan, SIGNAL(finished(int, QProcess::ExitStatus)), - this, SLOT(onScanFinished(int,QProcess::ExitStatus))); + this, SLOT(onProcessFinishedScan(int,QProcess::ExitStatus))); -// connect(&_scanWatcher, SIGNAL(finished()), -// this , SLOT(onFinishedScan())); + connect(&_processReadIPSettings, SIGNAL(finished(int, QProcess::ExitStatus)), + this, SLOT(onProcessFinishedReadIP(int,QProcess::ExitStatus))); - connect(this, SIGNAL(didScan()), - this, SLOT(onScan())); + connect(&_processReadGateway, SIGNAL(finished(int, QProcess::ExitStatus)), + this, SLOT(onProcessFinishedReadGateway(int,QProcess::ExitStatus))); + connect(&_processReadDNS, SIGNAL(finished(int, QProcess::ExitStatus)), + this, SLOT(onProcessFinishedReadDNS(int,QProcess::ExitStatus))); + + connect(&_processGenerateWPASupplicant, SIGNAL(finished(int, QProcess::ExitStatus)), + this, SLOT(onProcessFinishedGenerateWPASupplicant(int,QProcess::ExitStatus))); + + connect(&_processStartWPASupplicant, SIGNAL(finished(int, QProcess::ExitStatus)), + this, SLOT(onProcessFinishedStartWPASupplicant(int,QProcess::ExitStatus))); + + connect(&_processRequestAutoAssignedIP, SIGNAL(finished(int, QProcess::ExitStatus)), + this, SLOT(onProcessFinishedRequestAutoAssignedIP(int,QProcess::ExitStatus))); } /*! @@ -151,12 +170,6 @@ void WifiInterface::doScan() { qDebug() << __FUNCTION__ << QThread::currentThread()->objectName(); - emit didScan(); -} - -void WifiInterface::onScan() -{ - qDebug() << __FUNCTION__ << QThread::currentThread()->objectName(); if (_scanRunning) { LOG_DEBUG("Wifi network scan is already running."); @@ -175,17 +188,17 @@ * \param vExitCode - (int) the exit code * \param vExitStatus - (QProcess::ExitStatus) the exit status */ -void WifiInterface::onScanFinished(int vExitCode, QProcess::ExitStatus vExitStatus) +void WifiInterface::onProcessFinishedScan(int vExitCode, QProcess::ExitStatus vExitStatus) { Q_UNUSED(vExitCode) Q_UNUSED(vExitStatus) -// QString out = _processScan.readAllStandardOutput(); -// QString err = _processScan.readAllStandardError(); -// LOG_DEBUG(out); -// LOG_DEBUG(err); -// _scanRunning = false; -// emit didScanStatusChanged(_scanRunning); -// onParseWifiScan(out); + QString out = _processScan.readAllStandardOutput(); + QString err = _processScan.readAllStandardError(); + LOG_DEBUG(QString("stdout: %1").arg(out)); + LOG_DEBUG(QString("stderr: %1").arg(err)); + _scanRunning = false; + emit didScanStatusChanged(_scanRunning); + onParseWifiScan(out); } /*! @@ -250,49 +263,67 @@ */ void WifiInterface::doJoinNetwork(const Network &vNetwork, const QString &vPassword) { + _network = vNetwork; LOG_DEBUG(QString("Joining Network %1").arg(vNetwork.ssid())); - if (!generateWPASupplicant(vNetwork, vPassword)) + _processGenerateWPASupplicant.start(Wifi_Generate_WPA_Supplicant, + QStringList() << vNetwork.ssid() + << vPassword + << _wpaSupplicantConfPath); +} + +/*! + * \brief WifiInterface::onProcessFinishedGenerateWPASupplicant + * Called when the process that generates the WPA supplicant file has finished + * \param vExitCode - (int) the exit code + * \param vExitStatus - (QProcess::ExitStatus) the exit status + */ +void WifiInterface::onProcessFinishedGenerateWPASupplicant(int vExitCode, QProcess::ExitStatus vExitStatus) +{ + Q_UNUSED(vExitStatus) + if (vExitCode != 0) { emit didError("Could not configure network."); return; } - if (!startWPASupplicant()) + _processStartWPASupplicant.start(Wifi_Start_WPA_Supplicant, + QStringList() << _iface + << _wpaSupplicantConfPath); +} + +/*! + * \brief WifiInterface::onProcessFinishedStartWPASupplicant + * Called when the process that starts the WPA supplicant has finished + * \param vExitCode - (int) the exit code + * \param vExitStatus - (QProcess::ExitStatus) the exit status + */ +void WifiInterface::onProcessFinishedStartWPASupplicant(int vExitCode, QProcess::ExitStatus vExitStatus) +{ + Q_UNUSED(vExitStatus) + if (vExitCode != 0) { emit didError("Could not configure network."); 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); + _processRequestAutoAssignedIP.start(Wifi_Get_Auto_Assigned_IP, + QStringList() << _iface); } /*! - * \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. + * \brief WifiInterface::onProcessFinishedRequestAutoAssignedIP + * Called when the process that requests an auto-assigned IP has finished + * \param vExitCode - (int) the exit code + * \param vExitStatus - (QProcess::ExitStatus) the exit status */ -Network::IPSettings WifiInterface::getIPSettings() +void WifiInterface::onProcessFinishedRequestAutoAssignedIP(int vExitCode, QProcess::ExitStatus vExitStatus) { - Network::IPSettings ipSettings; - QString output = readIPSettings(); - ipSettings.mIPAddress = parseIP(output); - if (ipSettings.mIPAddress == "") { - return ipSettings; + Q_UNUSED(vExitStatus) + if (vExitCode != 0) + { + emit didError(QString("Could not connect to %1").arg(_network.ssid())); + return; } - ipSettings.mBroadcast = parseBroadcast(output); - ipSettings.mSubnetMask = parseSubnetMask(output); - ipSettings.mGateway = readGateway(); - ipSettings.mDns = readDNS(); - return ipSettings; + doRequestIPSettings(); } /*! @@ -301,107 +332,91 @@ */ void WifiInterface::doRequestIPSettings() { - emit didGetIPSettings(getIPSettings()); + QString result = ""; + _processReadIPSettings.start(Wifi_Read_IP_Settings, + QStringList() << _iface); } /*! - * \brief WifiInterface::doDisconnectNetwork - * Disconnects from the specified network - * \param vNetwork - (Network) the network to disconnect from + * \brief WifiInterface::onProcessFinishedReadIP + * Parses the IP settings of the device when the process has finished + * \param vExitCode - (int) the exit code + * \param vExitStatus - (QProcess::ExitStatus) the exit status */ -void WifiInterface::doDisconnectNetwork(const Network &vNetwork) +void WifiInterface::onProcessFinishedReadIP(int vExitCode, QProcess::ExitStatus vExitStatus) { - 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())); + Q_UNUSED(vExitCode); + Q_UNUSED(vExitStatus); + QString output = _processReadIPSettings.readAllStandardOutput(); + _network.mIPSettings.mIPAddress = parseIP(output); + _network.mIPSettings.mBroadcast = parseBroadcast(output); + _network.mIPSettings.mSubnetMask = parseSubnetMask(output); + _processReadGateway.start(Wifi_Read_Gateway); } - /*! - * \brief WifiInterface::generateWPASupplicant - * Generates the WPA Supplicant configuration file - * \param vNetwork (Network) the network w/ ssid we want to connect to - * \param vPassword (QString) the password the user entered for this network - * \return (bool) true if writing the file completed, false otherwise + * \brief WifiInterface::onProcessFinishedReadGateway + * Parses the gateway of the device when the process has finished then + * initiates reading the DNS + * \param vExitCode - (int) the exit code + * \param vExitStatus - (QProcess::ExitStatus) the exit status */ -bool WifiInterface::generateWPASupplicant(const Network &vNetwork, const QString &vPassword) +void WifiInterface::onProcessFinishedReadGateway(int vExitCode, QProcess::ExitStatus vExitStatus) { - LOG_DEBUG("Generating WPA Supplicant..."); - QProcess process; - process.start(Wifi_Generate_WPA_Supplicant, - QStringList() << vNetwork.ssid() - << vPassword - << _wpaSupplicantConfPath); - if (!process.waitForFinished(_defaultTimeout)) - { - process.kill(); - return false; - } - return true; + Q_UNUSED(vExitCode); + Q_UNUSED(vExitStatus); + _network.mIPSettings.mGateway = parseGateway(_processReadGateway.readAllStandardOutput()); + _processReadDNS.start(Wifi_Read_DNS); } /*! - * \brief WifiInterface::startWPASupplicant - * Starts WPA supplicant in the background. Assumes the conf file has already been written - * \return true if successful, false on timeout + * \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 + * \param vExitCode - (int) the exit code + * \param vExitStatus - (QProcess::ExitStatus) the exit status */ -bool WifiInterface::startWPASupplicant() +void WifiInterface::onProcessFinishedReadDNS(int vExitCode, QProcess::ExitStatus vExitStatus) { - LOG_DEBUG("Starting wpa supplicant..."); - QProcess process; - process.start(Wifi_Start_WPA_Supplicant, - QStringList() << _iface - << _wpaSupplicantConfPath); - if (!process.waitForFinished(_defaultTimeout)) - { - process.kill(); - return false; - } - return true; + Q_UNUSED(vExitCode); + Q_UNUSED(vExitStatus); + _network.mIPSettings.mDNS = parseDNS(_processReadDNS.readAllStandardOutput()); + emit didConnectToNetwork(_network); } /*! - * \brief WifiInterface::requestAutoAssignedIP - * Requests an auto-assigned IP addressed - * \return true if successful, false on timeout + * \brief WifiInterface::doDisconnectNetwork + * Disconnects from the specified network + * \param vNetwork - (Network) the network to disconnect from */ -bool WifiInterface::requestAutoAssignedIP(int vTries) +void WifiInterface::doDisconnectNetwork(const Network &vNetwork) { - LOG_DEBUG(QString("Requesting auto-assigned IP address...")); + LOG_DEBUG(QString("Disconnecting from Network %1").arg(vNetwork.ssid())); QProcess process; - process.start(Wifi_Get_Auto_Assigned_IP, - QStringList() << _iface); - if (!process.waitForFinished(_dhcpTimeout)) - { - if (vTries > 0) - return requestAutoAssignedIP(--vTries); - return false; - } - return true; + 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::readIPSettings - * Reads the IP settings of the device - * \return (QString) the unparsed standard output + * \brief WifiInterface::onProcessFinishedDisconnectNetwork + * Called when we disconnect from the wifi network + * \param vExitCode - (int) the exit code + * \param vExitStatus - (QProcess::ExitStatus) the exit status */ -QString WifiInterface::readIPSettings() +void WifiInterface::onProcessFinishedDisconnectNetwork(int vExitCode, QProcess::ExitStatus vExitStatus) { - QString result = ""; - QProcess process; - process.start(Wifi_Read_IP_Settings, - QStringList() << _iface); - if (process.waitForFinished(_defaultTimeout)) - result = process.readAllStandardOutput(); - else - process.kill(); - LOG_DEBUG(QString("Output with IP address information: %1").arg(result)); - return result; + Q_UNUSED(vExitStatus) + if (vExitCode != 0) + { + emit didError(tr("Failed to disconnect from %1").arg(_network.ssid())); + return; + } + emit didDisconnectNetwork(_network); + _network.clearSettings(); } /*! @@ -468,33 +483,3 @@ return vOutput.split("nameserver")[1].split("\n")[0].trimmed(); return ""; } - -/*! - * \brief WifiInterface::readGateway - * Reads the current gateway - * \return (QString) the gateway if found, "" otherwise - */ -QString WifiInterface::readGateway() -{ - QProcess process; - process.start(Wifi_Read_Gateway); - if (process.waitForFinished(_defaultTimeout)) - return parseGateway(process.readAllStandardOutput()); - process.kill(); - return ""; -} - -/*! - * \brief WifiInterface::readDNS - * Reads the DNS setting - * \return (QString) the first dns found, "" otherwise - */ -QString WifiInterface::readDNS() -{ - QProcess process; - process.start(Wifi_Read_DNS); - if (process.waitForFinished(_defaultTimeout)) - return parseDNS(process.readAllStandardOutput()); - process.kill(); - return ""; -}