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