Index: sources/wifi/WifiInterface.cpp =================================================================== diff -u -re5a802bc26647388cfea4f1d46ae22570ec2dba3 -rea52cee2614f319804690a9b1d5091bed9676753 --- sources/wifi/WifiInterface.cpp (.../WifiInterface.cpp) (revision e5a802bc26647388cfea4f1d46ae22570ec2dba3) +++ sources/wifi/WifiInterface.cpp (.../WifiInterface.cpp) (revision ea52cee2614f319804690a9b1d5091bed9676753) @@ -80,17 +80,17 @@ */ void WifiInterface::doScan() { - // if scan is already running, return + if (_scanRunning) { LOG_DEBUG("Wifi network scan is already running."); return; } - // otherwise, start the detached process + LOG_DEBUG("Scanning for Wifi Access Points..."); _scanProcess.setWorkingDirectory(Wifi_Scripts_Dir); _scanRunning = true; - // TODO: emit scan running to view so scan button is disabled + emit didScanStatusChanged(_scanRunning); _scanProcess.start(Wifi_Scripts_Scan_For_Networks); } @@ -109,5 +109,50 @@ LOG_DEBUG(out); LOG_DEBUG(err); _scanRunning = false; - // TODO: emit scan finished to view so scan button is re-enabled. + emit didScanStatusChanged(_scanRunning); + onParseWifiScan(out); } + +/*! + * \brief Network::onParseWifiScan + * Extract desired information from the wifi scan output. Sorts by signal stength + * + * \param output - (QString) output collected from QProcess execution + */ +void WifiInterface::onParseWifiScan(const QString &output) +{ + QList networks; + QStringList temp = output.split("Cell"); + const QString signalLevelSearchTerm = "Signal level="; + const QString macAddressSearchTerm = "Address:"; + const QString ssidSearchTerm = "ESSID:"; + const QString groupCipherSearchTerm = "Group Cipher"; + const QString authSuitesSearchTerm = "Authentication Suites"; + + for (const QString &line : temp) + { + if (line.contains(ssidSearchTerm) && line.contains(macAddressSearchTerm) && line.contains(signalLevelSearchTerm)) + { + QString ssid = line.split(ssidSearchTerm)[1].split("\n")[0].replace("\"", "").trimmed(); + if (ssid == "") + continue; + QString macAddress = line.split(macAddressSearchTerm)[1].split("\n")[0].trimmed(); + int signalLevel = line.split(signalLevelSearchTerm)[1].split("dBm")[0].trimmed().toInt(); + + bool isCCMP = line.split(groupCipherSearchTerm)[1].split("\n")[0].contains("CCMP"); + bool isEnterprise = line.split(authSuitesSearchTerm)[1].split("\n")[0].contains("802.1x"); + bool isPersonal = line.split(authSuitesSearchTerm)[1].split("\n")[0].contains("PSK"); + + Network::SECURITY_LEVEL securityLevel = Network::SECURITY_LEVEL::UNSUPPORTED; + + if (isPersonal && isCCMP) + securityLevel = Network::SECURITY_LEVEL::WPA2_AES_PERSONAL; + else if (isEnterprise && isCCMP) + securityLevel = Network::SECURITY_LEVEL::WPA2_AES_ENTERPRISE; + // TODO: Add support for the other security levels + + Network network(macAddress,ssid, securityLevel, Network::STATUS::NOT_CONNECTED, signalLevel); + emit didAddNetwork(network); + } + } +}