18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* 28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpa_gui - WpaGui class 38d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Copyright (c) 2005-2011, Jouni Malinen <j@w1.fi> 48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 5c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * This software may be distributed under the terms of the BSD license. 6c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * See README for more details. 78d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 88d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_NATIVE_WINDOWS 108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include <windows.h> 118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_NATIVE_WINDOWS */ 128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include <cstdio> 1404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#include <unistd.h> 158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include <QMessageBox> 168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include <QCloseEvent> 178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include <QImageReader> 188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include <QSettings> 198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "wpagui.h" 218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "dirent.h" 228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "common/wpa_ctrl.h" 238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "userdatarequest.h" 248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "networkconfig.h" 258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 267f65602d49069f96a7bb44da8bd79ffe8d4c6a98Dmitry Shmidt 277f65602d49069f96a7bb44da8bd79ffe8d4c6a98Dmitry Shmidt#ifndef QT_NO_DEBUG 287f65602d49069f96a7bb44da8bd79ffe8d4c6a98Dmitry Shmidt#define debug(M, ...) qDebug("DEBUG %d: " M, __LINE__, ##__VA_ARGS__) 297f65602d49069f96a7bb44da8bd79ffe8d4c6a98Dmitry Shmidt#else 307f65602d49069f96a7bb44da8bd79ffe8d4c6a98Dmitry Shmidt#define debug(M, ...) do {} while (0) 318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif 328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 337f65602d49069f96a7bb44da8bd79ffe8d4c6a98Dmitry Shmidt 347a53dbb56693ee9f55c0cab1a8297436511e8613Dmitry ShmidtWpaGui::WpaGui(QApplication *_app, QWidget *parent, const char *, 357a53dbb56693ee9f55c0cab1a8297436511e8613Dmitry Shmidt Qt::WindowFlags) 368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt : QMainWindow(parent), app(_app) 378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt setupUi(this); 396c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt this->setWindowFlags(Qt::Dialog); 408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_NATIVE_WINDOWS 428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fileStopServiceAction = new QAction(this); 438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fileStopServiceAction->setObjectName("Stop Service"); 448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fileStopServiceAction->setIconText(tr("Stop Service")); 458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fileMenu->insertAction(actionWPS, fileStopServiceAction); 468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fileStartServiceAction = new QAction(this); 488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fileStartServiceAction->setObjectName("Start Service"); 498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fileStartServiceAction->setIconText(tr("Start Service")); 508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fileMenu->insertAction(fileStopServiceAction, fileStartServiceAction); 518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt connect(fileStartServiceAction, SIGNAL(triggered()), this, 538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SLOT(startService())); 548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt connect(fileStopServiceAction, SIGNAL(triggered()), this, 558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SLOT(stopService())); 568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt addInterfaceAction = new QAction(this); 588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt addInterfaceAction->setIconText(tr("Add Interface")); 598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fileMenu->insertAction(fileStartServiceAction, addInterfaceAction); 608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt connect(addInterfaceAction, SIGNAL(triggered()), this, 628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SLOT(addInterface())); 638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_NATIVE_WINDOWS */ 648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (void) statusBar(); 668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* 688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Disable WPS tab by default; it will be enabled if wpa_supplicant is 698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * built with WPS support. 708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpsTab->setEnabled(false); 728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpaguiTab->setTabEnabled(wpaguiTab->indexOf(wpsTab), false); 738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt connect(fileEventHistoryAction, SIGNAL(triggered()), this, 758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SLOT(eventHistory())); 768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt connect(fileSaveConfigAction, SIGNAL(triggered()), this, 778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SLOT(saveConfig())); 788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt connect(actionWPS, SIGNAL(triggered()), this, SLOT(wpsDialog())); 798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt connect(actionPeers, SIGNAL(triggered()), this, SLOT(peersDialog())); 808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt connect(fileExitAction, SIGNAL(triggered()), qApp, SLOT(quit())); 818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt connect(networkAddAction, SIGNAL(triggered()), this, 828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SLOT(addNetwork())); 838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt connect(networkEditAction, SIGNAL(triggered()), this, 848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SLOT(editSelectedNetwork())); 858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt connect(networkRemoveAction, SIGNAL(triggered()), this, 868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SLOT(removeSelectedNetwork())); 878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt connect(networkEnableAllAction, SIGNAL(triggered()), this, 888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SLOT(enableAllNetworks())); 898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt connect(networkDisableAllAction, SIGNAL(triggered()), this, 908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SLOT(disableAllNetworks())); 918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt connect(networkRemoveAllAction, SIGNAL(triggered()), this, 928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SLOT(removeAllNetworks())); 938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt connect(helpIndexAction, SIGNAL(triggered()), this, SLOT(helpIndex())); 948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt connect(helpContentsAction, SIGNAL(triggered()), this, 958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SLOT(helpContents())); 968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt connect(helpAboutAction, SIGNAL(triggered()), this, SLOT(helpAbout())); 978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt connect(disconnectButton, SIGNAL(clicked()), this, SLOT(disconnect())); 988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt connect(scanButton, SIGNAL(clicked()), this, SLOT(scan())); 998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt connect(connectButton, SIGNAL(clicked()), this, SLOT(connectB())); 1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt connect(adapterSelect, SIGNAL(activated(const QString&)), this, 1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SLOT(selectAdapter(const QString&))); 1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt connect(networkSelect, SIGNAL(activated(const QString&)), this, 1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SLOT(selectNetwork(const QString&))); 1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt connect(addNetworkButton, SIGNAL(clicked()), this, SLOT(addNetwork())); 1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt connect(editNetworkButton, SIGNAL(clicked()), this, 1068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SLOT(editListedNetwork())); 1078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt connect(removeNetworkButton, SIGNAL(clicked()), this, 1088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SLOT(removeListedNetwork())); 1098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt connect(networkList, SIGNAL(itemSelectionChanged()), this, 1108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SLOT(updateNetworkDisabledStatus())); 1118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt connect(enableRadioButton, SIGNAL(toggled(bool)), this, 1128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SLOT(enableListedNetwork(bool))); 1138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt connect(disableRadioButton, SIGNAL(toggled(bool)), this, 1148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SLOT(disableListedNetwork(bool))); 1158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt connect(scanNetworkButton, SIGNAL(clicked()), this, SLOT(scan())); 1168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt connect(networkList, SIGNAL(itemDoubleClicked(QListWidgetItem *)), 1178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt this, SLOT(editListedNetwork())); 1188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt connect(wpaguiTab, SIGNAL(currentChanged(int)), this, 1198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SLOT(tabChanged(int))); 1208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt connect(wpsPbcButton, SIGNAL(clicked()), this, SLOT(wpsPbc())); 1218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt connect(wpsPinButton, SIGNAL(clicked()), this, SLOT(wpsGeneratePin())); 1228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt connect(wpsApPinEdit, SIGNAL(textChanged(const QString &)), this, 1238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SLOT(wpsApPinChanged(const QString &))); 1248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt connect(wpsApPinButton, SIGNAL(clicked()), this, SLOT(wpsApPin())); 1258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eh = NULL; 1278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt scanres = NULL; 1288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt peers = NULL; 1298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt add_iface = NULL; 1308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt udr = NULL; 1318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tray_icon = NULL; 1328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt startInTray = false; 1336c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt quietMode = false; 1348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctrl_iface = NULL; 1358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctrl_conn = NULL; 1368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt monitor_conn = NULL; 1378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt msgNotifier = NULL; 1388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctrl_iface_dir = strdup("/var/run/wpa_supplicant"); 139912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt signalMeterInterval = 0; 1408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt parse_argv(); 1428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef QT_NO_SESSIONMANAGER 1448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (app->isSessionRestored()) { 1458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt QSettings settings("wpa_supplicant", "wpa_gui"); 1468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt settings.beginGroup("state"); 1478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (app->sessionId().compare(settings.value("session_id"). 1488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt toString()) == 0) 1498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt startInTray = settings.value("in_tray").toBool(); 1508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt settings.endGroup(); 1518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif 1538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (QSystemTrayIcon::isSystemTrayAvailable()) 1558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt createTrayIcon(startInTray); 1568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 1578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt show(); 1588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt connectedToService = false; 1608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt textStatus->setText(tr("connecting to wpa_supplicant")); 1618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt timer = new QTimer(this); 1628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt connect(timer, SIGNAL(timeout()), SLOT(ping())); 1637a53dbb56693ee9f55c0cab1a8297436511e8613Dmitry Shmidt timer->setSingleShot(false); 1648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt timer->start(1000); 1658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 166912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt signalMeterTimer = new QTimer(this); 167912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt signalMeterTimer->setInterval(signalMeterInterval); 168912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt connect(signalMeterTimer, SIGNAL(timeout()), SLOT(signalMeterUpdate())); 169912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt 1708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (openCtrlConnection(ctrl_iface) < 0) { 1717f65602d49069f96a7bb44da8bd79ffe8d4c6a98Dmitry Shmidt debug("Failed to open control connection to " 1727f65602d49069f96a7bb44da8bd79ffe8d4c6a98Dmitry Shmidt "wpa_supplicant."); 1738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt updateStatus(); 1768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt networkMayHaveChanged = true; 1778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt updateNetworks(); 1788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1818d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtWpaGui::~WpaGui() 1828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt delete msgNotifier; 1848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (monitor_conn) { 1868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_ctrl_detach(monitor_conn); 1878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_ctrl_close(monitor_conn); 1888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt monitor_conn = NULL; 1898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ctrl_conn) { 1918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_ctrl_close(ctrl_conn); 1928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctrl_conn = NULL; 1938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (eh) { 1968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eh->close(); 1978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt delete eh; 1988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eh = NULL; 1998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (scanres) { 2028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt scanres->close(); 2038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt delete scanres; 2048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt scanres = NULL; 2058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (peers) { 2088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt peers->close(); 2098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt delete peers; 2108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt peers = NULL; 2118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (add_iface) { 2148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt add_iface->close(); 2158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt delete add_iface; 2168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt add_iface = NULL; 2178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (udr) { 2208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt udr->close(); 2218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt delete udr; 2228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt udr = NULL; 2238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt free(ctrl_iface); 2268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctrl_iface = NULL; 2278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt free(ctrl_iface_dir); 2298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctrl_iface_dir = NULL; 2308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 2318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid WpaGui::languageChange() 2348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 2358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt retranslateUi(this); 2368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 2378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid WpaGui::parse_argv() 2408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 2418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int c; 2427a53dbb56693ee9f55c0cab1a8297436511e8613Dmitry Shmidt WpaGuiApp *app = qobject_cast<WpaGuiApp*>(qApp); 2438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (;;) { 2447a53dbb56693ee9f55c0cab1a8297436511e8613Dmitry Shmidt c = getopt(app->argc, app->argv, "i:m:p:tq"); 2458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (c < 0) 2468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 2478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt switch (c) { 2488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case 'i': 2498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt free(ctrl_iface); 2508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctrl_iface = strdup(optarg); 2518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 252912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt case 'm': 253912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt signalMeterInterval = atoi(optarg) * 1000; 254912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt break; 2558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case 'p': 2568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt free(ctrl_iface_dir); 2578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctrl_iface_dir = strdup(optarg); 2588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 2598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case 't': 2608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt startInTray = true; 2618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 2626c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt case 'q': 2636c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt quietMode = true; 2646c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt break; 2658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 2688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint WpaGui::openCtrlConnection(const char *ifname) 2718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 2728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *cfile; 2738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int flen; 2748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char buf[2048], *pos, *pos2; 2758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t len; 2768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ifname) { 2788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ifname != ctrl_iface) { 2798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt free(ctrl_iface); 2808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctrl_iface = strdup(ifname); 2818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 2838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_CTRL_IFACE_UDP 2848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt free(ctrl_iface); 2858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctrl_iface = strdup("udp"); 2868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_CTRL_IFACE_UDP */ 2878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_CTRL_IFACE_UNIX 2888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct dirent *dent; 2898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DIR *dir = opendir(ctrl_iface_dir); 2908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt free(ctrl_iface); 2918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctrl_iface = NULL; 2928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dir) { 2938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while ((dent = readdir(dir))) { 2948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef _DIRENT_HAVE_D_TYPE 2958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Skip the file if it is not a socket. 2968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Also accept DT_UNKNOWN (0) in case 2978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * the C library or underlying file 2988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * system does not support d_type. */ 2998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dent->d_type != DT_SOCK && 3008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dent->d_type != DT_UNKNOWN) 3018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 3028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* _DIRENT_HAVE_D_TYPE */ 3038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (strcmp(dent->d_name, ".") == 0 || 3058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt strcmp(dent->d_name, "..") == 0) 3068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 3077f65602d49069f96a7bb44da8bd79ffe8d4c6a98Dmitry Shmidt debug("Selected interface '%s'", 3087f65602d49069f96a7bb44da8bd79ffe8d4c6a98Dmitry Shmidt dent->d_name); 3098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctrl_iface = strdup(dent->d_name); 3108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 3118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt closedir(dir); 3138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_CTRL_IFACE_UNIX */ 3158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_CTRL_IFACE_NAMED_PIPE 3168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ctrl *ctrl; 3178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int ret; 3188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt free(ctrl_iface); 3208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctrl_iface = NULL; 3218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctrl = wpa_ctrl_open(NULL); 3238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ctrl) { 3248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt len = sizeof(buf) - 1; 3258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = wpa_ctrl_request(ctrl, "INTERFACES", 10, buf, 3268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &len, NULL); 3278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret >= 0) { 3288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt connectedToService = true; 3298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt buf[len] = '\0'; 3308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = strchr(buf, '\n'); 3318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (pos) 3328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *pos = '\0'; 3338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctrl_iface = strdup(buf); 3348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_ctrl_close(ctrl); 3368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_CTRL_IFACE_NAMED_PIPE */ 3388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ctrl_iface == NULL) { 3418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_NATIVE_WINDOWS 3428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt static bool first = true; 3438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (first && !serviceRunning()) { 3448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt first = false; 3458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (QMessageBox::warning( 3468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt this, qAppName(), 3478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tr("wpa_supplicant service is not " 3488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "running.\n" 3498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Do you want to start it?"), 3508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt QMessageBox::Yes | QMessageBox::No) == 3518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt QMessageBox::Yes) 3528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt startService(); 3538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_NATIVE_WINDOWS */ 3558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 3568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_CTRL_IFACE_UNIX 3598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt flen = strlen(ctrl_iface_dir) + strlen(ctrl_iface) + 2; 3608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cfile = (char *) malloc(flen); 3618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (cfile == NULL) 3628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 3638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt snprintf(cfile, flen, "%s/%s", ctrl_iface_dir, ctrl_iface); 3648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#else /* CONFIG_CTRL_IFACE_UNIX */ 3658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt flen = strlen(ctrl_iface) + 1; 3668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cfile = (char *) malloc(flen); 3678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (cfile == NULL) 3688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 3698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt snprintf(cfile, flen, "%s", ctrl_iface); 3708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_CTRL_IFACE_UNIX */ 3718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ctrl_conn) { 3738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_ctrl_close(ctrl_conn); 3748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctrl_conn = NULL; 3758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (monitor_conn) { 3788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt delete msgNotifier; 3798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt msgNotifier = NULL; 3808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_ctrl_detach(monitor_conn); 3818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_ctrl_close(monitor_conn); 3828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt monitor_conn = NULL; 3838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3857f65602d49069f96a7bb44da8bd79ffe8d4c6a98Dmitry Shmidt debug("Trying to connect to '%s'", cfile); 3868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctrl_conn = wpa_ctrl_open(cfile); 3878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ctrl_conn == NULL) { 3888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt free(cfile); 3898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 3908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt monitor_conn = wpa_ctrl_open(cfile); 3928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt free(cfile); 3938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (monitor_conn == NULL) { 3948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_ctrl_close(ctrl_conn); 3958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 3968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_ctrl_attach(monitor_conn)) { 3987f65602d49069f96a7bb44da8bd79ffe8d4c6a98Dmitry Shmidt debug("Failed to attach to wpa_supplicant"); 3998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_ctrl_close(monitor_conn); 4008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt monitor_conn = NULL; 4018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_ctrl_close(ctrl_conn); 4028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctrl_conn = NULL; 4038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 4048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#if defined(CONFIG_CTRL_IFACE_UNIX) || defined(CONFIG_CTRL_IFACE_UDP) 4078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt msgNotifier = new QSocketNotifier(wpa_ctrl_get_fd(monitor_conn), 4088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt QSocketNotifier::Read, this); 4098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt connect(msgNotifier, SIGNAL(activated(int)), SLOT(receiveMsgs())); 4108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif 4118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt adapterSelect->clear(); 4138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt adapterSelect->addItem(ctrl_iface); 4148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt adapterSelect->setCurrentIndex(0); 4158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt len = sizeof(buf) - 1; 4178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_ctrl_request(ctrl_conn, "INTERFACES", 10, buf, &len, NULL) >= 4188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 0) { 4198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt buf[len] = '\0'; 4208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = buf; 4218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*pos) { 4228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos2 = strchr(pos, '\n'); 4238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (pos2) 4248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *pos2 = '\0'; 4258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (strcmp(pos, ctrl_iface) != 0) 4268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt adapterSelect->addItem(pos); 4278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (pos2) 4288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = pos2 + 1; 4298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 4308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 4318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt len = sizeof(buf) - 1; 4358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_ctrl_request(ctrl_conn, "GET_CAPABILITY eap", 18, buf, &len, 4368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL) >= 0) { 4378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt buf[len] = '\0'; 4388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt QString res(buf); 4408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt QStringList types = res.split(QChar(' ')); 4418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool wps = types.contains("WSC"); 4428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt actionWPS->setEnabled(wps); 4438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpsTab->setEnabled(wps); 4448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpaguiTab->setTabEnabled(wpaguiTab->indexOf(wpsTab), wps); 4458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 4488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 4498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint WpaGui::ctrlRequest(const char *cmd, char *buf, size_t *buflen) 4528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 4538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int ret; 4548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ctrl_conn == NULL) 4568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -3; 4578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = wpa_ctrl_request(ctrl_conn, cmd, strlen(cmd), buf, buflen, NULL); 4588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret == -2) 4597f65602d49069f96a7bb44da8bd79ffe8d4c6a98Dmitry Shmidt debug("'%s' command timed out.", cmd); 4608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if (ret < 0) 4617f65602d49069f96a7bb44da8bd79ffe8d4c6a98Dmitry Shmidt debug("'%s' command failed.", cmd); 4628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return ret; 4648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 4658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4678d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtQString WpaGui::wpaStateTranslate(char *state) 4688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 4698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!strcmp(state, "DISCONNECTED")) 4708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return tr("Disconnected"); 4718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if (!strcmp(state, "INACTIVE")) 4728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return tr("Inactive"); 4738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if (!strcmp(state, "SCANNING")) 4748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return tr("Scanning"); 4758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if (!strcmp(state, "AUTHENTICATING")) 4768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return tr("Authenticating"); 4778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if (!strcmp(state, "ASSOCIATING")) 4788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return tr("Associating"); 4798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if (!strcmp(state, "ASSOCIATED")) 4808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return tr("Associated"); 4818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if (!strcmp(state, "4WAY_HANDSHAKE")) 4828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return tr("4-Way Handshake"); 4838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if (!strcmp(state, "GROUP_HANDSHAKE")) 4848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return tr("Group Handshake"); 4858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if (!strcmp(state, "COMPLETED")) 4868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return tr("Completed"); 4878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 4888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return tr("Unknown"); 4898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 4908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid WpaGui::updateStatus() 4938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 4948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char buf[2048], *start, *end, *pos; 4958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t len; 4968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pingsToStatusUpdate = 10; 4988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt len = sizeof(buf) - 1; 5008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ctrl_conn == NULL || ctrlRequest("STATUS", buf, &len) < 0) { 5018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt textStatus->setText(tr("Could not get status from " 5028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wpa_supplicant")); 5038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt textAuthentication->clear(); 5048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt textEncryption->clear(); 5058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt textSsid->clear(); 5068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt textBssid->clear(); 5078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt textIpAddress->clear(); 5086c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt updateTrayToolTip(tr("no status information")); 509912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt updateTrayIcon(TrayIconOffline); 510912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt signalMeterTimer->stop(); 5118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_NATIVE_WINDOWS 5138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt static bool first = true; 5148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (first && connectedToService && 5158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (ctrl_iface == NULL || *ctrl_iface == '\0')) { 5168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt first = false; 5178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (QMessageBox::information( 5188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt this, qAppName(), 5198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tr("No network interfaces in use.\n" 5208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Would you like to add one?"), 5218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt QMessageBox::Yes | QMessageBox::No) == 5228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt QMessageBox::Yes) 5238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt addInterface(); 5248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 5258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_NATIVE_WINDOWS */ 5268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 5278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 5288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt buf[len] = '\0'; 5308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool auth_updated = false, ssid_updated = false; 5328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool bssid_updated = false, ipaddr_updated = false; 5338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool status_updated = false; 5348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *pairwise_cipher = NULL, *group_cipher = NULL; 5358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *mode = NULL; 5368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt start = buf; 5388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*start) { 5398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool last = false; 5408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt end = strchr(start, '\n'); 5418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (end == NULL) { 5428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt last = true; 5438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt end = start; 5448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (end[0] && end[1]) 5458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt end++; 5468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 5478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *end = '\0'; 5488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = strchr(start, '='); 5508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (pos) { 5518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *pos++ = '\0'; 5528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (strcmp(start, "bssid") == 0) { 5538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bssid_updated = true; 5548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt textBssid->setText(pos); 5558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (strcmp(start, "ssid") == 0) { 5568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid_updated = true; 5578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt textSsid->setText(pos); 5586c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt updateTrayToolTip(pos + tr(" (associated)")); 559912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt if (!signalMeterInterval) { 560912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt /* if signal meter is not enabled show 561912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt * full signal strength */ 562912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt updateTrayIcon(TrayIconSignalExcellent); 563912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt } 5648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (strcmp(start, "ip_address") == 0) { 5658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ipaddr_updated = true; 5668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt textIpAddress->setText(pos); 5678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (strcmp(start, "wpa_state") == 0) { 5688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt status_updated = true; 5698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt textStatus->setText(wpaStateTranslate(pos)); 5708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (strcmp(start, "key_mgmt") == 0) { 5718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt auth_updated = true; 5728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt textAuthentication->setText(pos); 5738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* TODO: could add EAP status to this */ 5748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (strcmp(start, "pairwise_cipher") == 0) { 5758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pairwise_cipher = pos; 5768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (strcmp(start, "group_cipher") == 0) { 5778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt group_cipher = pos; 5788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (strcmp(start, "mode") == 0) { 5798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt mode = pos; 5808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 5818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 5828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (last) 5848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 5858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt start = end + 1; 5868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 5878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (status_updated && mode) 5888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt textStatus->setText(textStatus->text() + " (" + mode + ")"); 5898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (pairwise_cipher || group_cipher) { 5918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt QString encr; 5928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (pairwise_cipher && group_cipher && 5938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt strcmp(pairwise_cipher, group_cipher) != 0) { 5948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt encr.append(pairwise_cipher); 5958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt encr.append(" + "); 5968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt encr.append(group_cipher); 5978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (pairwise_cipher) { 5988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt encr.append(pairwise_cipher); 5998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 6008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt encr.append(group_cipher); 6018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt encr.append(" [group key only]"); 6028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt textEncryption->setText(encr); 6048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else 6058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt textEncryption->clear(); 6068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 607912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt if (signalMeterInterval) { 608912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt /* 609912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt * Handle signal meter service. When network is not associated, 610912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt * deactivate timer, otherwise keep it going. Tray icon has to 611912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt * be initialized here, because of the initial delay of the 612912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt * timer. 613912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt */ 614912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt if (ssid_updated) { 615912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt if (!signalMeterTimer->isActive()) { 616912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt updateTrayIcon(TrayIconConnected); 617912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt signalMeterTimer->start(); 618912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt } 619912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt } else { 620912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt signalMeterTimer->stop(); 621912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt } 622912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt } 623912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt 6248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!status_updated) 6258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt textStatus->clear(); 6268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!auth_updated) 6278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt textAuthentication->clear(); 6286c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (!ssid_updated) { 6298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt textSsid->clear(); 6306c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt updateTrayToolTip(tr("(not-associated)")); 631912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt updateTrayIcon(TrayIconOffline); 6326c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt } 6338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!bssid_updated) 6348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt textBssid->clear(); 6358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!ipaddr_updated) 6368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt textIpAddress->clear(); 6378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 6388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid WpaGui::updateNetworks() 6418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 642d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt char buf[4096], *start, *end, *id, *ssid, *bssid, *flags; 6438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t len; 6448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int first_active = -1; 6458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int was_selected = -1; 6468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool current = false; 6478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!networkMayHaveChanged) 6498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 6508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (networkList->currentRow() >= 0) 6528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt was_selected = networkList->currentRow(); 6538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt networkSelect->clear(); 6558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt networkList->clear(); 6568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ctrl_conn == NULL) 6588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 6598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt len = sizeof(buf) - 1; 6618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ctrlRequest("LIST_NETWORKS", buf, &len) < 0) 6628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 6638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt buf[len] = '\0'; 6658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt start = strchr(buf, '\n'); 6668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (start == NULL) 6678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 6688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt start++; 6698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*start) { 6718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool last = false; 6728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt end = strchr(start, '\n'); 6738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (end == NULL) { 6748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt last = true; 6758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt end = start; 6768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (end[0] && end[1]) 6778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt end++; 6788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *end = '\0'; 6808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt id = start; 6828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid = strchr(id, '\t'); 6838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ssid == NULL) 6848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 6858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *ssid++ = '\0'; 6868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bssid = strchr(ssid, '\t'); 6878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (bssid == NULL) 6888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 6898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *bssid++ = '\0'; 6908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt flags = strchr(bssid, '\t'); 6918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (flags == NULL) 6928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 6938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *flags++ = '\0'; 6948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (strstr(flags, "[DISABLED][P2P-PERSISTENT]")) { 6968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (last) 6978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 6988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt start = end + 1; 6998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 7008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 7018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt QString network(id); 7038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt network.append(": "); 7048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt network.append(ssid); 7058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt networkSelect->addItem(network); 7068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt networkList->addItem(network); 7078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (strstr(flags, "[CURRENT]")) { 7098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt networkSelect->setCurrentIndex(networkSelect->count() - 7108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1); 7118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt current = true; 7128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (first_active < 0 && 7138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt strstr(flags, "[DISABLED]") == NULL) 7148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt first_active = networkSelect->count() - 1; 7158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (last) 7178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 7188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt start = end + 1; 7198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 7208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (networkSelect->count() > 1) 7228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt networkSelect->addItem(tr("Select any network")); 7238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!current && first_active >= 0) 7258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt networkSelect->setCurrentIndex(first_active); 7268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (was_selected >= 0 && networkList->count() > 0) { 7288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (was_selected < networkList->count()) 7298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt networkList->setCurrentRow(was_selected); 7308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 7318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt networkList->setCurrentRow(networkList->count() - 1); 7328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 7338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 7348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt networkList->setCurrentRow(networkSelect->currentIndex()); 7358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt networkMayHaveChanged = false; 7378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid WpaGui::helpIndex() 7418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 7427f65602d49069f96a7bb44da8bd79ffe8d4c6a98Dmitry Shmidt debug("helpIndex"); 7438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid WpaGui::helpContents() 7478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 7487f65602d49069f96a7bb44da8bd79ffe8d4c6a98Dmitry Shmidt debug("helpContents"); 7498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid WpaGui::helpAbout() 7538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 7548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt QMessageBox::about(this, "wpa_gui for wpa_supplicant", 7557a53dbb56693ee9f55c0cab1a8297436511e8613Dmitry Shmidt "Copyright (c) 2003-2015,\n" 7568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Jouni Malinen <j@w1.fi>\n" 7578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "and contributors.\n" 7588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "\n" 75904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "This software may be distributed under\n" 76004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "the terms of the BSD license.\n" 76104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "See README for more details.\n" 7628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "\n" 7638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "This product includes software developed\n" 7648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "by the OpenSSL Project for use in the\n" 7658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "OpenSSL Toolkit (http://www.openssl.org/)\n"); 7668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid WpaGui::disconnect() 7708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 7718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char reply[10]; 7728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t reply_len = sizeof(reply); 7738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctrlRequest("DISCONNECT", reply, &reply_len); 7748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt stopWpsRun(false); 7758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid WpaGui::scan() 7798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 7808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (scanres) { 7818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt scanres->close(); 7828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt delete scanres; 7838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 7848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt scanres = new ScanResults(); 7868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (scanres == NULL) 7878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 7888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt scanres->setWpaGui(this); 7898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt scanres->show(); 7908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt scanres->exec(); 7918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid WpaGui::eventHistory() 7958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 7968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (eh) { 7978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eh->close(); 7988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt delete eh; 7998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 8008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eh = new EventHistory(); 8028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (eh == NULL) 8038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 8048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eh->addEvents(msgs); 8058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eh->show(); 8068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eh->exec(); 8078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 8088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid WpaGui::ping() 8118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 8128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char buf[10]; 8138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t len; 8148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_CTRL_IFACE_NAMED_PIPE 8168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* 8178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * QSocketNotifier cannot be used with Windows named pipes, so use a 8188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * timer to check for received messages for now. This could be 8198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * optimized be doing something specific to named pipes or Windows 8208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * events, but it is not clear what would be the best way of doing that 8218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * in Qt. 8228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 8238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt receiveMsgs(); 8248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_CTRL_IFACE_NAMED_PIPE */ 8258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (scanres && !scanres->isVisible()) { 8278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt delete scanres; 8288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt scanres = NULL; 8298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 8308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (eh && !eh->isVisible()) { 8328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt delete eh; 8338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eh = NULL; 8348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 8358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (udr && !udr->isVisible()) { 8378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt delete udr; 8388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt udr = NULL; 8398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 8408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt len = sizeof(buf) - 1; 8428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ctrlRequest("PING", buf, &len) < 0) { 8437f65602d49069f96a7bb44da8bd79ffe8d4c6a98Dmitry Shmidt debug("PING failed - trying to reconnect"); 8448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (openCtrlConnection(ctrl_iface) >= 0) { 8457f65602d49069f96a7bb44da8bd79ffe8d4c6a98Dmitry Shmidt debug("Reconnected successfully"); 8468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pingsToStatusUpdate = 0; 8478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 8488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 8498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pingsToStatusUpdate--; 8518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (pingsToStatusUpdate <= 0) { 8528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt updateStatus(); 8538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt updateNetworks(); 8548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 8558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef CONFIG_CTRL_IFACE_NAMED_PIPE 8578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Use less frequent pings and status updates when the main window is 8588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * hidden (running in taskbar). */ 8598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int interval = isHidden() ? 5000 : 1000; 8608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (timer->interval() != interval) 8618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt timer->setInterval(interval); 8628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_CTRL_IFACE_NAMED_PIPE */ 8638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 8648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 866912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidtvoid WpaGui::signalMeterUpdate() 867912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt{ 868912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt char reply[128]; 869912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt size_t reply_len = sizeof(reply); 870912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt char *rssi; 871912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt int rssi_value; 872912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt 873912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt ctrlRequest("SIGNAL_POLL", reply, &reply_len); 874912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt 875912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt /* In order to eliminate signal strength fluctuations, try 876912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt * to obtain averaged RSSI value in the first place. */ 877912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt if ((rssi = strstr(reply, "AVG_RSSI=")) != NULL) 878912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt rssi_value = atoi(&rssi[sizeof("AVG_RSSI")]); 879912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt else if ((rssi = strstr(reply, "RSSI=")) != NULL) 880912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt rssi_value = atoi(&rssi[sizeof("RSSI")]); 881912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt else { 882912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt debug("Failed to get RSSI value"); 883912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt updateTrayIcon(TrayIconSignalNone); 884912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt return; 885912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt } 886912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt 887912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt debug("RSSI value: %d", rssi_value); 888912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt 889912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt /* 890912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt * NOTE: The code below assumes, that the unit of the value returned 891912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt * by the SIGNAL POLL request is dBm. It might not be true for all 892912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt * wpa_supplicant drivers. 893912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt */ 894912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt 895912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt /* 896912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt * Calibration is based on "various Internet sources". Nonetheless, 897912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt * it seems to be compatible with the Windows 8.1 strength meter - 898912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt * tested on Intel Centrino Advanced-N 6235. 899912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt */ 900912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt if (rssi_value >= -60) 901912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt updateTrayIcon(TrayIconSignalExcellent); 902912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt else if (rssi_value >= -68) 903912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt updateTrayIcon(TrayIconSignalGood); 904912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt else if (rssi_value >= -76) 905912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt updateTrayIcon(TrayIconSignalOk); 906912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt else if (rssi_value >= -84) 907912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt updateTrayIcon(TrayIconSignalWeak); 908912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt else 909912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt updateTrayIcon(TrayIconSignalNone); 910912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt} 911912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt 912912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt 9138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int str_match(const char *a, const char *b) 9148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 9158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return strncmp(a, b, strlen(b)) == 0; 9168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 9178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid WpaGui::processMsg(char *msg) 9208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 9218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *pos = msg, *pos2; 9228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int priority = 2; 9238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (*pos == '<') { 9258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* skip priority */ 9268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos++; 9278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt priority = atoi(pos); 9288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = strchr(pos, '>'); 9298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (pos) 9308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos++; 9318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 9328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = msg; 9338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 9348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WpaMsg wm(pos, priority); 9368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (eh) 9378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eh->addEvent(wm); 9388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (peers) 9398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt peers->event_notify(wm); 9408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt msgs.append(wm); 9418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (msgs.count() > 100) 9428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt msgs.pop_front(); 9438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Update last message with truncated version of the event */ 9458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (strncmp(pos, "CTRL-", 5) == 0) { 9468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos2 = strchr(pos, str_match(pos, WPA_CTRL_REQ) ? ':' : ' '); 9478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (pos2) 9488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos2++; 9498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 9508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos2 = pos; 9518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else 9528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos2 = pos; 9538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt QString lastmsg = pos2; 9548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt lastmsg.truncate(40); 9558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt textLastMessage->setText(lastmsg); 9568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pingsToStatusUpdate = 0; 9588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt networkMayHaveChanged = true; 9598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (str_match(pos, WPA_CTRL_REQ)) 9618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt processCtrlReq(pos + strlen(WPA_CTRL_REQ)); 9628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if (str_match(pos, WPA_EVENT_SCAN_RESULTS) && scanres) 9638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt scanres->updateResults(); 9648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if (str_match(pos, WPA_EVENT_DISCONNECTED)) 9658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt showTrayMessage(QSystemTrayIcon::Information, 3, 9668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tr("Disconnected from network.")); 9678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if (str_match(pos, WPA_EVENT_CONNECTED)) { 9688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt showTrayMessage(QSystemTrayIcon::Information, 3, 9698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tr("Connection to network established.")); 9708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt QTimer::singleShot(5 * 1000, this, SLOT(showTrayStatus())); 9718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt stopWpsRun(true); 9728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (str_match(pos, WPS_EVENT_AP_AVAILABLE_PBC)) { 9738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpsStatusText->setText(tr("WPS AP in active PBC mode found")); 9748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (textStatus->text() == "INACTIVE" || 9758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt textStatus->text() == "DISCONNECTED") 9768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpaguiTab->setCurrentWidget(wpsTab); 9778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpsInstructions->setText(tr("Press the PBC button on the " 9788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "screen to start registration")); 9798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (str_match(pos, WPS_EVENT_AP_AVAILABLE_PIN)) { 9808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpsStatusText->setText(tr("WPS AP with recently selected " 9818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "registrar")); 9828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (textStatus->text() == "INACTIVE" || 9838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt textStatus->text() == "DISCONNECTED") 9848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpaguiTab->setCurrentWidget(wpsTab); 9858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (str_match(pos, WPS_EVENT_AP_AVAILABLE_AUTH)) { 9868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt showTrayMessage(QSystemTrayIcon::Information, 3, 9878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Wi-Fi Protected Setup (WPS) AP\n" 9888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "indicating this client is authorized."); 9898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpsStatusText->setText("WPS AP indicating this client is " 9908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "authorized"); 9918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (textStatus->text() == "INACTIVE" || 9928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt textStatus->text() == "DISCONNECTED") 9938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpaguiTab->setCurrentWidget(wpsTab); 9948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (str_match(pos, WPS_EVENT_AP_AVAILABLE)) { 9958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpsStatusText->setText(tr("WPS AP detected")); 9968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (str_match(pos, WPS_EVENT_OVERLAP)) { 9978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpsStatusText->setText(tr("PBC mode overlap detected")); 9988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpsInstructions->setText(tr("More than one AP is currently in " 9998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "active WPS PBC mode. Wait couple " 10008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "of minutes and try again")); 10018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpaguiTab->setCurrentWidget(wpsTab); 10028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (str_match(pos, WPS_EVENT_CRED_RECEIVED)) { 10038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpsStatusText->setText(tr("Network configuration received")); 10048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpaguiTab->setCurrentWidget(wpsTab); 10058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (str_match(pos, WPA_EVENT_EAP_METHOD)) { 10068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (strstr(pos, "(WSC)")) 10078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpsStatusText->setText(tr("Registration started")); 10088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (str_match(pos, WPS_EVENT_M2D)) { 10098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpsStatusText->setText(tr("Registrar does not yet know PIN")); 10108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (str_match(pos, WPS_EVENT_FAIL)) { 10118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpsStatusText->setText(tr("Registration failed")); 10128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (str_match(pos, WPS_EVENT_SUCCESS)) { 10138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpsStatusText->setText(tr("Registration succeeded")); 10148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 10168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid WpaGui::processCtrlReq(const char *req) 10198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 10208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (udr) { 10218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt udr->close(); 10228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt delete udr; 10238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt udr = new UserDataRequest(); 10258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (udr == NULL) 10268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 10278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (udr->setParams(this, req) < 0) { 10288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt delete udr; 10298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt udr = NULL; 10308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 10318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt udr->show(); 10338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt udr->exec(); 10348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 10358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid WpaGui::receiveMsgs() 10388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 10398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char buf[256]; 10408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t len; 10418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (monitor_conn && wpa_ctrl_pending(monitor_conn) > 0) { 10438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt len = sizeof(buf) - 1; 10448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_ctrl_recv(monitor_conn, buf, &len) == 0) { 10458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt buf[len] = '\0'; 10468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt processMsg(buf); 10478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 10508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid WpaGui::connectB() 10538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 10548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char reply[10]; 10558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t reply_len = sizeof(reply); 10568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctrlRequest("REASSOCIATE", reply, &reply_len); 10578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 10588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid WpaGui::selectNetwork( const QString &sel ) 10618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 10628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt QString cmd(sel); 10638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char reply[10]; 10648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t reply_len = sizeof(reply); 10658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (cmd.contains(QRegExp("^\\d+:"))) 10678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cmd.truncate(cmd.indexOf(':')); 10688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 10698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cmd = "any"; 10708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cmd.prepend("SELECT_NETWORK "); 10717a53dbb56693ee9f55c0cab1a8297436511e8613Dmitry Shmidt ctrlRequest(cmd.toLocal8Bit().constData(), reply, &reply_len); 10728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt triggerUpdate(); 10738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt stopWpsRun(false); 10748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 10758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid WpaGui::enableNetwork(const QString &sel) 10788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 10798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt QString cmd(sel); 10808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char reply[10]; 10818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t reply_len = sizeof(reply); 10828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (cmd.contains(QRegExp("^\\d+:"))) 10848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cmd.truncate(cmd.indexOf(':')); 10858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if (!cmd.startsWith("all")) { 10867f65602d49069f96a7bb44da8bd79ffe8d4c6a98Dmitry Shmidt debug("Invalid editNetwork '%s'", 10877a53dbb56693ee9f55c0cab1a8297436511e8613Dmitry Shmidt cmd.toLocal8Bit().constData()); 10888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 10898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cmd.prepend("ENABLE_NETWORK "); 10917a53dbb56693ee9f55c0cab1a8297436511e8613Dmitry Shmidt ctrlRequest(cmd.toLocal8Bit().constData(), reply, &reply_len); 10928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt triggerUpdate(); 10938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 10948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid WpaGui::disableNetwork(const QString &sel) 10978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 10988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt QString cmd(sel); 10998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char reply[10]; 11008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t reply_len = sizeof(reply); 11018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (cmd.contains(QRegExp("^\\d+:"))) 11038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cmd.truncate(cmd.indexOf(':')); 11048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if (!cmd.startsWith("all")) { 11057f65602d49069f96a7bb44da8bd79ffe8d4c6a98Dmitry Shmidt debug("Invalid editNetwork '%s'", 11067a53dbb56693ee9f55c0cab1a8297436511e8613Dmitry Shmidt cmd.toLocal8Bit().constData()); 11078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 11088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cmd.prepend("DISABLE_NETWORK "); 11107a53dbb56693ee9f55c0cab1a8297436511e8613Dmitry Shmidt ctrlRequest(cmd.toLocal8Bit().constData(), reply, &reply_len); 11118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt triggerUpdate(); 11128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 11138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid WpaGui::editNetwork(const QString &sel) 11168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 11178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt QString cmd(sel); 11188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int id = -1; 11198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (cmd.contains(QRegExp("^\\d+:"))) { 11218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cmd.truncate(cmd.indexOf(':')); 11228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt id = cmd.toInt(); 11238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NetworkConfig *nc = new NetworkConfig(); 11268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (nc == NULL) 11278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 11288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt nc->setWpaGui(this); 11298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (id >= 0) 11318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt nc->paramsFromConfig(id); 11328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 11338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt nc->newNetwork(); 11348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt nc->show(); 11368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt nc->exec(); 11378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 11388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid WpaGui::editSelectedNetwork() 11418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 11428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (networkSelect->count() < 1) { 11438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt QMessageBox::information( 11448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt this, tr("No Networks"), 11458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tr("There are no networks to edit.\n")); 11468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 11478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt QString sel(networkSelect->currentText()); 11498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt editNetwork(sel); 11508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 11518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid WpaGui::editListedNetwork() 11548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 11558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (networkList->currentRow() < 0) { 11568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt QMessageBox::information(this, tr("Select A Network"), 11578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tr("Select a network from the list to" 11588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt " edit it.\n")); 11598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 11608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt QString sel(networkList->currentItem()->text()); 11628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt editNetwork(sel); 11638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 11648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid WpaGui::triggerUpdate() 11678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 11688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt updateStatus(); 11698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt networkMayHaveChanged = true; 11708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt updateNetworks(); 11718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 11728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid WpaGui::addNetwork() 11758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 11768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NetworkConfig *nc = new NetworkConfig(); 11778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (nc == NULL) 11788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 11798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt nc->setWpaGui(this); 11808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt nc->newNetwork(); 11818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt nc->show(); 11828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt nc->exec(); 11838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 11848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid WpaGui::removeNetwork(const QString &sel) 11878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 11888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt QString cmd(sel); 11898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char reply[10]; 11908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t reply_len = sizeof(reply); 11918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (cmd.contains(QRegExp("^\\d+:"))) 11938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cmd.truncate(cmd.indexOf(':')); 11948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if (!cmd.startsWith("all")) { 11957f65602d49069f96a7bb44da8bd79ffe8d4c6a98Dmitry Shmidt debug("Invalid editNetwork '%s'", 11967a53dbb56693ee9f55c0cab1a8297436511e8613Dmitry Shmidt cmd.toLocal8Bit().constData()); 11978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 11988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cmd.prepend("REMOVE_NETWORK "); 12007a53dbb56693ee9f55c0cab1a8297436511e8613Dmitry Shmidt ctrlRequest(cmd.toLocal8Bit().constData(), reply, &reply_len); 12018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt triggerUpdate(); 12028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 12038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid WpaGui::removeSelectedNetwork() 12068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 12078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (networkSelect->count() < 1) { 12088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt QMessageBox::information(this, tr("No Networks"), 12098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tr("There are no networks to remove." 12108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "\n")); 12118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 12128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt QString sel(networkSelect->currentText()); 12148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt removeNetwork(sel); 12158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 12168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid WpaGui::removeListedNetwork() 12198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 12208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (networkList->currentRow() < 0) { 12218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt QMessageBox::information(this, tr("Select A Network"), 12228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tr("Select a network from the list " 12238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "to remove it.\n")); 12248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 12258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt QString sel(networkList->currentItem()->text()); 12278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt removeNetwork(sel); 12288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 12298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid WpaGui::enableAllNetworks() 12328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 12338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt QString sel("all"); 12348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt enableNetwork(sel); 12358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 12368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid WpaGui::disableAllNetworks() 12398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 12408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt QString sel("all"); 12418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt disableNetwork(sel); 12428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 12438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid WpaGui::removeAllNetworks() 12468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 12478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt QString sel("all"); 12488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt removeNetwork(sel); 12498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 12508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint WpaGui::getNetworkDisabled(const QString &sel) 12538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 12548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt QString cmd(sel); 12558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char reply[10]; 12568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t reply_len = sizeof(reply) - 1; 12578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int pos = cmd.indexOf(':'); 12588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (pos < 0) { 12597f65602d49069f96a7bb44da8bd79ffe8d4c6a98Dmitry Shmidt debug("Invalid getNetworkDisabled '%s'", 12607a53dbb56693ee9f55c0cab1a8297436511e8613Dmitry Shmidt cmd.toLocal8Bit().constData()); 12618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 12628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cmd.truncate(pos); 12648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cmd.prepend("GET_NETWORK "); 12658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cmd.append(" disabled"); 12668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12677a53dbb56693ee9f55c0cab1a8297436511e8613Dmitry Shmidt if (ctrlRequest(cmd.toLocal8Bit().constData(), reply, &reply_len) >= 0 12688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt && reply_len >= 1) { 12698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply[reply_len] = '\0'; 12708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!str_match(reply, "FAIL")) 12718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return atoi(reply); 12728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 12758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 12768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid WpaGui::updateNetworkDisabledStatus() 12798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 12808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (networkList->currentRow() < 0) 12818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 12828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt QString sel(networkList->currentItem()->text()); 12848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt switch (getNetworkDisabled(sel)) { 12868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case 0: 12878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!enableRadioButton->isChecked()) 12888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt enableRadioButton->setChecked(true); 12898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 12908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case 1: 12918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!disableRadioButton->isChecked()) 12928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt disableRadioButton->setChecked(true); 12938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 12948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 12968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid WpaGui::enableListedNetwork(bool enabled) 12998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 13008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (networkList->currentRow() < 0 || !enabled) 13018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 13028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt QString sel(networkList->currentItem()->text()); 13048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (getNetworkDisabled(sel) == 1) 13068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt enableNetwork(sel); 13078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 13088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid WpaGui::disableListedNetwork(bool disabled) 13118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 13128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (networkList->currentRow() < 0 || !disabled) 13138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 13148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt QString sel(networkList->currentItem()->text()); 13168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (getNetworkDisabled(sel) == 0) 13188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt disableNetwork(sel); 13198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 13208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid WpaGui::saveConfig() 13238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 13248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char buf[10]; 13258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t len; 13268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt len = sizeof(buf) - 1; 13288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctrlRequest("SAVE_CONFIG", buf, &len); 13298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt buf[len] = '\0'; 13318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (str_match(buf, "FAIL")) 13338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt QMessageBox::warning( 13348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt this, tr("Failed to save configuration"), 13358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tr("The configuration could not be saved.\n" 13368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "\n" 13378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "The update_config=1 configuration option\n" 13388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "must be used for configuration saving to\n" 13398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "be permitted.\n")); 13408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 13418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt QMessageBox::information( 13428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt this, tr("Saved configuration"), 13438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tr("The current configuration was saved." 13448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "\n")); 13458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 13468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid WpaGui::selectAdapter( const QString & sel ) 13498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 13507a53dbb56693ee9f55c0cab1a8297436511e8613Dmitry Shmidt if (openCtrlConnection(sel.toLocal8Bit().constData()) < 0) 13517f65602d49069f96a7bb44da8bd79ffe8d4c6a98Dmitry Shmidt debug("Failed to open control connection to " 13527f65602d49069f96a7bb44da8bd79ffe8d4c6a98Dmitry Shmidt "wpa_supplicant."); 13538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt updateStatus(); 13548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt updateNetworks(); 13558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 13568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid WpaGui::createTrayIcon(bool trayOnly) 13598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 13608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt QApplication::setQuitOnLastWindowClosed(false); 13618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tray_icon = new QSystemTrayIcon(this); 1363912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt updateTrayIcon(TrayIconOffline); 13648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt connect(tray_icon, 13668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SIGNAL(activated(QSystemTrayIcon::ActivationReason)), 13678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt this, SLOT(trayActivated(QSystemTrayIcon::ActivationReason))); 13688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ackTrayIcon = false; 13708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tray_menu = new QMenu(this); 13728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt disconnectAction = new QAction(tr("&Disconnect"), this); 13748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reconnectAction = new QAction(tr("Re&connect"), this); 13758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt connect(disconnectAction, SIGNAL(triggered()), this, 13768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SLOT(disconnect())); 13778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt connect(reconnectAction, SIGNAL(triggered()), this, 13788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SLOT(connectB())); 13798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tray_menu->addAction(disconnectAction); 13808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tray_menu->addAction(reconnectAction); 13818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tray_menu->addSeparator(); 13828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eventAction = new QAction(tr("&Event History"), this); 13848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt scanAction = new QAction(tr("Scan &Results"), this); 13858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt statAction = new QAction(tr("S&tatus"), this); 13868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt connect(eventAction, SIGNAL(triggered()), this, SLOT(eventHistory())); 13878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt connect(scanAction, SIGNAL(triggered()), this, SLOT(scan())); 13888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt connect(statAction, SIGNAL(triggered()), this, SLOT(showTrayStatus())); 13898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tray_menu->addAction(eventAction); 13908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tray_menu->addAction(scanAction); 13918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tray_menu->addAction(statAction); 13928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tray_menu->addSeparator(); 13938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt showAction = new QAction(tr("&Show Window"), this); 13958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hideAction = new QAction(tr("&Hide Window"), this); 13968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt quitAction = new QAction(tr("&Quit"), this); 13978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt connect(showAction, SIGNAL(triggered()), this, SLOT(show())); 13988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt connect(hideAction, SIGNAL(triggered()), this, SLOT(hide())); 13998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt connect(quitAction, SIGNAL(triggered()), qApp, SLOT(quit())); 14008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tray_menu->addAction(showAction); 14018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tray_menu->addAction(hideAction); 14028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tray_menu->addSeparator(); 14038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tray_menu->addAction(quitAction); 14048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tray_icon->setContextMenu(tray_menu); 14068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tray_icon->show(); 14088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!trayOnly) 14108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt show(); 14118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt inTray = trayOnly; 14128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 14138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid WpaGui::showTrayMessage(QSystemTrayIcon::MessageIcon type, int sec, 14168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const QString & msg) 14178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 14188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!QSystemTrayIcon::supportsMessages()) 14198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 14208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14216c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (isVisible() || !tray_icon || !tray_icon->isVisible() || quietMode) 14228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 14238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tray_icon->showMessage(qAppName(), msg, type, sec * 1000); 14258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 14268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid WpaGui::trayActivated(QSystemTrayIcon::ActivationReason how) 14298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { 14308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt switch (how) { 14318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* use close() here instead of hide() and allow the 14328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * custom closeEvent handler take care of children */ 14338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case QSystemTrayIcon::Trigger: 14348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ackTrayIcon = true; 14358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (isVisible()) { 14368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt close(); 14378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt inTray = true; 14388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 14398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt show(); 14408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt inTray = false; 14418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 14428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 14438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case QSystemTrayIcon::MiddleClick: 14448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt showTrayStatus(); 14458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 14468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt default: 14478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 14488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 14498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 14508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid WpaGui::showTrayStatus() 14538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 14548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char buf[2048]; 14558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t len; 14568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt len = sizeof(buf) - 1; 14588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ctrlRequest("STATUS", buf, &len) < 0) 14598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 14608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt buf[len] = '\0'; 14618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt QString msg, status(buf); 14638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt QStringList lines = status.split(QRegExp("\\n")); 14658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (QStringList::Iterator it = lines.begin(); 14668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt it != lines.end(); it++) { 14678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int pos = (*it).indexOf('=') + 1; 14688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (pos < 1) 14698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 14708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if ((*it).startsWith("bssid=")) 14728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt msg.append("BSSID:\t" + (*it).mid(pos) + "\n"); 14738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if ((*it).startsWith("ssid=")) 14748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt msg.append("SSID: \t" + (*it).mid(pos) + "\n"); 14758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if ((*it).startsWith("pairwise_cipher=")) 14768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt msg.append("PAIR: \t" + (*it).mid(pos) + "\n"); 14778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if ((*it).startsWith("group_cipher=")) 14788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt msg.append("GROUP:\t" + (*it).mid(pos) + "\n"); 14798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if ((*it).startsWith("key_mgmt=")) 14808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt msg.append("AUTH: \t" + (*it).mid(pos) + "\n"); 14818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if ((*it).startsWith("wpa_state=")) 14828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt msg.append("STATE:\t" + (*it).mid(pos) + "\n"); 14838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if ((*it).startsWith("ip_address=")) 14848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt msg.append("IP: \t" + (*it).mid(pos) + "\n"); 14858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if ((*it).startsWith("Supplicant PAE state=")) 14868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt msg.append("PAE: \t" + (*it).mid(pos) + "\n"); 14878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if ((*it).startsWith("EAP state=")) 14888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt msg.append("EAP: \t" + (*it).mid(pos) + "\n"); 14898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 14908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!msg.isEmpty()) 14928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt showTrayMessage(QSystemTrayIcon::Information, 10, msg); 14938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 14948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14966c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidtvoid WpaGui::updateTrayToolTip(const QString &msg) 14976c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt{ 14986c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (tray_icon) 14996c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt tray_icon->setToolTip(msg); 15006c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt} 15016c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 15026c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 1503912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidtvoid WpaGui::updateTrayIcon(TrayIconType type) 1504912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt{ 1505912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt if (!tray_icon || currentIconType == type) 1506912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt return; 1507912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt 1508912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt QIcon fallback_icon; 15091d755d025b206e22b06aeb322e25a79f98ca7777Dmitry Shmidt QStringList names; 1510912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt 1511912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt if (QImageReader::supportedImageFormats().contains(QByteArray("svg"))) 1512912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt fallback_icon = QIcon(":/icons/wpa_gui.svg"); 1513912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt else 1514912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt fallback_icon = QIcon(":/icons/wpa_gui.png"); 1515912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt 1516912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt switch (type) { 1517912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt case TrayIconOffline: 15181d755d025b206e22b06aeb322e25a79f98ca7777Dmitry Shmidt names << "network-wireless-offline-symbolic" 15191d755d025b206e22b06aeb322e25a79f98ca7777Dmitry Shmidt << "network-wireless-offline" 15201d755d025b206e22b06aeb322e25a79f98ca7777Dmitry Shmidt << "network-wireless-signal-none-symbolic" 15211d755d025b206e22b06aeb322e25a79f98ca7777Dmitry Shmidt << "network-wireless-signal-none"; 1522912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt break; 1523912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt case TrayIconAcquiring: 15241d755d025b206e22b06aeb322e25a79f98ca7777Dmitry Shmidt names << "network-wireless-acquiring-symbolic" 15251d755d025b206e22b06aeb322e25a79f98ca7777Dmitry Shmidt << "network-wireless-acquiring"; 1526912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt break; 1527912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt case TrayIconConnected: 15281d755d025b206e22b06aeb322e25a79f98ca7777Dmitry Shmidt names << "network-wireless-connected-symbolic" 15291d755d025b206e22b06aeb322e25a79f98ca7777Dmitry Shmidt << "network-wireless-connected"; 1530912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt break; 1531912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt case TrayIconSignalNone: 15321d755d025b206e22b06aeb322e25a79f98ca7777Dmitry Shmidt names << "network-wireless-signal-none-symbolic" 15331d755d025b206e22b06aeb322e25a79f98ca7777Dmitry Shmidt << "network-wireless-signal-none"; 1534912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt break; 1535912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt case TrayIconSignalWeak: 15361d755d025b206e22b06aeb322e25a79f98ca7777Dmitry Shmidt names << "network-wireless-signal-weak-symbolic" 15371d755d025b206e22b06aeb322e25a79f98ca7777Dmitry Shmidt << "network-wireless-signal-weak"; 1538912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt break; 1539912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt case TrayIconSignalOk: 15401d755d025b206e22b06aeb322e25a79f98ca7777Dmitry Shmidt names << "network-wireless-signal-ok-symbolic" 15411d755d025b206e22b06aeb322e25a79f98ca7777Dmitry Shmidt << "network-wireless-signal-ok"; 1542912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt break; 1543912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt case TrayIconSignalGood: 15441d755d025b206e22b06aeb322e25a79f98ca7777Dmitry Shmidt names << "network-wireless-signal-good-symbolic" 15451d755d025b206e22b06aeb322e25a79f98ca7777Dmitry Shmidt << "network-wireless-signal-good"; 1546912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt break; 1547912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt case TrayIconSignalExcellent: 15481d755d025b206e22b06aeb322e25a79f98ca7777Dmitry Shmidt names << "network-wireless-signal-excellent-symbolic" 15491d755d025b206e22b06aeb322e25a79f98ca7777Dmitry Shmidt << "network-wireless-signal-excellent"; 1550912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt break; 1551912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt } 1552912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt 1553912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt currentIconType = type; 15541d755d025b206e22b06aeb322e25a79f98ca7777Dmitry Shmidt tray_icon->setIcon(loadThemedIcon(names, fallback_icon)); 15551d755d025b206e22b06aeb322e25a79f98ca7777Dmitry Shmidt} 15561d755d025b206e22b06aeb322e25a79f98ca7777Dmitry Shmidt 15571d755d025b206e22b06aeb322e25a79f98ca7777Dmitry Shmidt 15581d755d025b206e22b06aeb322e25a79f98ca7777Dmitry ShmidtQIcon WpaGui::loadThemedIcon(const QStringList &names, 15591d755d025b206e22b06aeb322e25a79f98ca7777Dmitry Shmidt const QIcon &fallback) 15601d755d025b206e22b06aeb322e25a79f98ca7777Dmitry Shmidt{ 15611d755d025b206e22b06aeb322e25a79f98ca7777Dmitry Shmidt QIcon icon; 15621d755d025b206e22b06aeb322e25a79f98ca7777Dmitry Shmidt 15631d755d025b206e22b06aeb322e25a79f98ca7777Dmitry Shmidt for (QStringList::ConstIterator it = names.begin(); 15641d755d025b206e22b06aeb322e25a79f98ca7777Dmitry Shmidt it != names.end(); it++) { 15651d755d025b206e22b06aeb322e25a79f98ca7777Dmitry Shmidt icon = QIcon::fromTheme(*it); 15661d755d025b206e22b06aeb322e25a79f98ca7777Dmitry Shmidt if (!icon.isNull()) 15671d755d025b206e22b06aeb322e25a79f98ca7777Dmitry Shmidt return icon; 15681d755d025b206e22b06aeb322e25a79f98ca7777Dmitry Shmidt } 15691d755d025b206e22b06aeb322e25a79f98ca7777Dmitry Shmidt 15701d755d025b206e22b06aeb322e25a79f98ca7777Dmitry Shmidt return fallback; 1571912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt} 1572912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt 1573912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt 15748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid WpaGui::closeEvent(QCloseEvent *event) 15758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 15768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (eh) { 15778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eh->close(); 15788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt delete eh; 15798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eh = NULL; 15808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 15818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (scanres) { 15838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt scanres->close(); 15848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt delete scanres; 15858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt scanres = NULL; 15868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 15878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (peers) { 15898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt peers->close(); 15908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt delete peers; 15918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt peers = NULL; 15928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 15938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (udr) { 15958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt udr->close(); 15968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt delete udr; 15978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt udr = NULL; 15988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 15998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (tray_icon && !ackTrayIcon) { 16018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* give user a visual hint that the tray icon exists */ 16028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (QSystemTrayIcon::supportsMessages()) { 16038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hide(); 16048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt showTrayMessage(QSystemTrayIcon::Information, 3, 16058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt qAppName() + 16068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tr(" will keep running in " 16078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "the system tray.")); 16088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 16098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt QMessageBox::information(this, qAppName() + 16108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tr(" systray"), 16118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tr("The program will keep " 16128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "running in the system " 16138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "tray.")); 16148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 16158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ackTrayIcon = true; 16168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 16178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt event->accept(); 16198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 16208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid WpaGui::wpsDialog() 16238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 16248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpaguiTab->setCurrentWidget(wpsTab); 16258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 16268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid WpaGui::peersDialog() 16298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 16308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (peers) { 16318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt peers->close(); 16328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt delete peers; 16338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 16348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt peers = new Peers(); 16368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (peers == NULL) 16378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 16388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt peers->setWpaGui(this); 16398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt peers->show(); 16408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt peers->exec(); 16418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 16428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid WpaGui::tabChanged(int index) 16458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 16468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (index != 2) 16478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 16488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpsRunning) 16508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 16518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpsApPinEdit->setEnabled(!bssFromScan.isEmpty()); 16538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (bssFromScan.isEmpty()) 16548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpsApPinButton->setEnabled(false); 16558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 16568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid WpaGui::wpsPbc() 16598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 16608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char reply[20]; 16618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t reply_len = sizeof(reply); 16628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ctrlRequest("WPS_PBC", reply, &reply_len) < 0) 16648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 16658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpsPinEdit->setEnabled(false); 16678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpsStatusText->text().compare(tr("WPS AP in active PBC mode found"))) { 16688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpsInstructions->setText(tr("Press the push button on the AP to " 16698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "start the PBC mode.")); 16708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 16718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpsInstructions->setText(tr("If you have not yet done so, press " 16728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "the push button on the AP to start " 16738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "the PBC mode.")); 16748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 16758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpsStatusText->setText(tr("Waiting for Registrar")); 16768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpsRunning = true; 16778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 16788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid WpaGui::wpsGeneratePin() 16818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 16828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char reply[20]; 16838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t reply_len = sizeof(reply) - 1; 16848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ctrlRequest("WPS_PIN any", reply, &reply_len) < 0) 16868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 16878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reply[reply_len] = '\0'; 16898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpsPinEdit->setText(reply); 16918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpsPinEdit->setEnabled(true); 16928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpsInstructions->setText(tr("Enter the generated PIN into the Registrar " 16938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "(either the internal one in the AP or an " 16948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "external one).")); 16958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpsStatusText->setText(tr("Waiting for Registrar")); 16968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpsRunning = true; 16978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 16988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid WpaGui::setBssFromScan(const QString &bssid) 17018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 17028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bssFromScan = bssid; 17038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpsApPinEdit->setEnabled(!bssFromScan.isEmpty()); 17048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpsApPinButton->setEnabled(wpsApPinEdit->text().length() == 8); 17058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpsStatusText->setText(tr("WPS AP selected from scan results")); 17068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpsInstructions->setText(tr("If you want to use an AP device PIN, e.g., " 17078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "from a label in the device, enter the eight " 17088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "digit AP PIN and click Use AP PIN button.")); 17098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 17108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid WpaGui::wpsApPinChanged(const QString &text) 17138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 17148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpsApPinButton->setEnabled(text.length() == 8); 17158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 17168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid WpaGui::wpsApPin() 17198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 17208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char reply[20]; 17218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t reply_len = sizeof(reply); 17228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt QString cmd("WPS_REG " + bssFromScan + " " + wpsApPinEdit->text()); 17247a53dbb56693ee9f55c0cab1a8297436511e8613Dmitry Shmidt if (ctrlRequest(cmd.toLocal8Bit().constData(), reply, &reply_len) < 0) 17258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 17268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpsStatusText->setText(tr("Waiting for AP/Enrollee")); 17288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpsRunning = true; 17298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 17308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid WpaGui::stopWpsRun(bool success) 17338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 17348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpsRunning) 17358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpsStatusText->setText(success ? tr("Connected to the network") : 17368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tr("Stopped")); 17378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 17388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpsStatusText->setText(""); 17398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpsPinEdit->setEnabled(false); 17408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpsInstructions->setText(""); 17418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpsRunning = false; 17428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bssFromScan = ""; 17438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpsApPinEdit->setEnabled(false); 17448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpsApPinButton->setEnabled(false); 17458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 17468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_NATIVE_WINDOWS 17498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef WPASVC_NAME 17518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define WPASVC_NAME TEXT("wpasvc") 17528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif 17538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtclass ErrorMsg : public QMessageBox { 17558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtpublic: 17568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ErrorMsg(QWidget *parent, DWORD last_err = GetLastError()); 17578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void showMsg(QString msg); 17588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtprivate: 17598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DWORD err; 17608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}; 17618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17628d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtErrorMsg::ErrorMsg(QWidget *parent, DWORD last_err) : 17638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt QMessageBox(parent), err(last_err) 17648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 17658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt setWindowTitle(tr("wpa_gui error")); 17668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt setIcon(QMessageBox::Warning); 17678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 17688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid ErrorMsg::showMsg(QString msg) 17708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 17718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt LPTSTR buf; 17728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt setText(msg); 17748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | 17758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt FORMAT_MESSAGE_FROM_SYSTEM, 17768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL, err, 0, (LPTSTR) (void *) &buf, 17778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 0, NULL) > 0) { 17788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt QString msg = QString::fromWCharArray(buf); 17798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt setInformativeText(QString("[%1] %2").arg(err).arg(msg)); 17808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt LocalFree(buf); 17818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 17828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt setInformativeText(QString("[%1]").arg(err)); 17838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 17848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt exec(); 17868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 17878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid WpaGui::startService() 17908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 17918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SC_HANDLE svc, scm; 17928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt scm = OpenSCManager(0, 0, SC_MANAGER_CONNECT); 17948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!scm) { 17958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ErrorMsg(this).showMsg(tr("OpenSCManager failed")); 17968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 17978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 17988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt svc = OpenService(scm, WPASVC_NAME, SERVICE_START); 18008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!svc) { 18018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ErrorMsg(this).showMsg(tr("OpenService failed")); 18028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt CloseServiceHandle(scm); 18038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 18048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 18058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!StartService(svc, 0, NULL)) { 18078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ErrorMsg(this).showMsg(tr("Failed to start wpa_supplicant " 18088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "service")); 18098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 18108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt CloseServiceHandle(svc); 18128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt CloseServiceHandle(scm); 18138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 18148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid WpaGui::stopService() 18178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 18188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SC_HANDLE svc, scm; 18198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SERVICE_STATUS status; 18208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt scm = OpenSCManager(0, 0, SC_MANAGER_CONNECT); 18228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!scm) { 18238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ErrorMsg(this).showMsg(tr("OpenSCManager failed")); 18248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 18258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 18268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt svc = OpenService(scm, WPASVC_NAME, SERVICE_STOP); 18288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!svc) { 18298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ErrorMsg(this).showMsg(tr("OpenService failed")); 18308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt CloseServiceHandle(scm); 18318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 18328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 18338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!ControlService(svc, SERVICE_CONTROL_STOP, &status)) { 18358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ErrorMsg(this).showMsg(tr("Failed to stop wpa_supplicant " 18368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "service")); 18378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 18388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt CloseServiceHandle(svc); 18408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt CloseServiceHandle(scm); 18418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 18428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtbool WpaGui::serviceRunning() 18458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 18468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SC_HANDLE svc, scm; 18478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SERVICE_STATUS status; 18488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool running = false; 18498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt scm = OpenSCManager(0, 0, SC_MANAGER_CONNECT); 18518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!scm) { 18527f65602d49069f96a7bb44da8bd79ffe8d4c6a98Dmitry Shmidt debug("OpenSCManager failed: %d", (int) GetLastError()); 18538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return false; 18548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 18558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt svc = OpenService(scm, WPASVC_NAME, SERVICE_QUERY_STATUS); 18578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!svc) { 18587f65602d49069f96a7bb44da8bd79ffe8d4c6a98Dmitry Shmidt debug("OpenService failed: %d", (int) GetLastError()); 18598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt CloseServiceHandle(scm); 18608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return false; 18618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 18628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (QueryServiceStatus(svc, &status)) { 18648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (status.dwCurrentState != SERVICE_STOPPED) 18658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt running = true; 18668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 18678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt CloseServiceHandle(svc); 18698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt CloseServiceHandle(scm); 18708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return running; 18728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 18738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_NATIVE_WINDOWS */ 18758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid WpaGui::addInterface() 18788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 18798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (add_iface) { 18808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt add_iface->close(); 18818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt delete add_iface; 18828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 18838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt add_iface = new AddInterface(this, this); 18848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt add_iface->show(); 18858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt add_iface->exec(); 18868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 18878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef QT_NO_SESSIONMANAGER 18908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid WpaGui::saveState() 18918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 18928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt QSettings settings("wpa_supplicant", "wpa_gui"); 18938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt settings.beginGroup("state"); 18948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt settings.setValue("session_id", app->sessionId()); 18958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt settings.setValue("in_tray", inTray); 18968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt settings.endGroup(); 18978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 18988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif 1899