18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/*
28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpa_gui - Peers class
38d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Copyright (c) 2009-2010, Atheros Communications
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#include <cstdio>
108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include <QImageReader>
118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include <QMessageBox>
128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "common/wpa_ctrl.h"
148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "wpagui.h"
158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "stringquery.h"
168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "peers.h"
178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtenum {
208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	peer_role_address = Qt::UserRole + 1,
218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	peer_role_type,
228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	peer_role_uuid,
238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	peer_role_details,
248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	peer_role_ifname,
258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	peer_role_pri_dev_type,
268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	peer_role_ssid,
278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	peer_role_config_methods,
288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	peer_role_dev_passwd_id,
298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	peer_role_bss_id,
308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	peer_role_selected_method,
318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	peer_role_selected_pin,
328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	peer_role_requested_method,
338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	peer_role_network_id
348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtenum selected_method {
378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	SEL_METHOD_NONE,
388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	SEL_METHOD_PIN_PEER_DISPLAY,
398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	SEL_METHOD_PIN_LOCAL_DISPLAY
408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/*
438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * TODO:
448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * - add current AP info (e.g., from WPS) in station mode
458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtenum peer_type {
488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	PEER_TYPE_ASSOCIATED_STATION,
498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	PEER_TYPE_AP,
508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	PEER_TYPE_AP_WPS,
518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	PEER_TYPE_WPS_PIN_NEEDED,
528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	PEER_TYPE_P2P,
538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	PEER_TYPE_P2P_CLIENT,
548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	PEER_TYPE_P2P_GROUP,
558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	PEER_TYPE_P2P_PERSISTENT_GROUP_GO,
568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	PEER_TYPE_P2P_PERSISTENT_GROUP_CLIENT,
578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	PEER_TYPE_P2P_INVITATION,
588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	PEER_TYPE_WPS_ER_AP,
598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	PEER_TYPE_WPS_ER_AP_UNCONFIGURED,
608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	PEER_TYPE_WPS_ER_ENROLLEE,
618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	PEER_TYPE_WPS_ENROLLEE
628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
657a53dbb56693ee9f55c0cab1a8297436511e8613Dmitry ShmidtPeers::Peers(QWidget *parent, const char *, bool, Qt::WindowFlags)
668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	: QDialog(parent)
678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	setupUi(this);
698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (QImageReader::supportedImageFormats().contains(QByteArray("svg")))
718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{
728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		default_icon = new QIcon(":/icons/wpa_gui.svg");
738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ap_icon = new QIcon(":/icons/ap.svg");
748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		laptop_icon = new QIcon(":/icons/laptop.svg");
758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		group_icon = new QIcon(":/icons/group.svg");
768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		invitation_icon = new QIcon(":/icons/invitation.svg");
778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		default_icon = new QIcon(":/icons/wpa_gui.png");
798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ap_icon = new QIcon(":/icons/ap.png");
808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		laptop_icon = new QIcon(":/icons/laptop.png");
818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		group_icon = new QIcon(":/icons/group.png");
828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		invitation_icon = new QIcon(":/icons/invitation.png");
838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	peers->setModel(&model);
868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	peers->setResizeMode(QListView::Adjust);
878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	peers->setDragEnabled(false);
888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	peers->setSelectionMode(QAbstractItemView::NoSelection);
898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	peers->setContextMenuPolicy(Qt::CustomContextMenu);
918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	connect(peers, SIGNAL(customContextMenuRequested(const QPoint &)),
928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		this, SLOT(context_menu(const QPoint &)));
938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpagui = NULL;
958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	hide_ap = false;
968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid Peers::setWpaGui(WpaGui *_wpagui)
1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpagui = _wpagui;
1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	update_peers();
1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1068d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtPeers::~Peers()
1078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	delete default_icon;
1098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	delete ap_icon;
1108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	delete laptop_icon;
1118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	delete group_icon;
1128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	delete invitation_icon;
1138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid Peers::languageChange()
1178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	retranslateUi(this);
1198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1228d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtQString Peers::ItemType(int type)
1238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	QString title;
1258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	switch (type) {
1268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case PEER_TYPE_ASSOCIATED_STATION:
1278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		title = tr("Associated station");
1288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
1298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case PEER_TYPE_AP:
1308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		title = tr("AP");
1318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
1328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case PEER_TYPE_AP_WPS:
1338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		title = tr("WPS AP");
1348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
1358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case PEER_TYPE_WPS_PIN_NEEDED:
1368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		title = tr("WPS PIN needed");
1378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
1388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case PEER_TYPE_P2P:
1398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		title = tr("P2P Device");
1408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
1418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case PEER_TYPE_P2P_CLIENT:
1428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		title = tr("P2P Device (group client)");
1438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
1448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case PEER_TYPE_P2P_GROUP:
1458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		title = tr("P2P Group");
1468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
1478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case PEER_TYPE_P2P_PERSISTENT_GROUP_GO:
1488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		title = tr("P2P Persistent Group (GO)");
1498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
1508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case PEER_TYPE_P2P_PERSISTENT_GROUP_CLIENT:
1518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		title = tr("P2P Persistent Group (client)");
1528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
1538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case PEER_TYPE_P2P_INVITATION:
1548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		title = tr("P2P Invitation");
1558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
1568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case PEER_TYPE_WPS_ER_AP:
1578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		title = tr("ER: WPS AP");
1588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
1598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case PEER_TYPE_WPS_ER_AP_UNCONFIGURED:
1608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		title = tr("ER: WPS AP (Unconfigured)");
1618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
1628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case PEER_TYPE_WPS_ER_ENROLLEE:
1638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		title = tr("ER: WPS Enrollee");
1648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
1658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	case PEER_TYPE_WPS_ENROLLEE:
1668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		title = tr("WPS Enrollee");
1678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
1688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
1698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return title;
1708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid Peers::context_menu(const QPoint &pos)
1748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	QMenu *menu = new QMenu;
1768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (menu == NULL)
1778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
1788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	QModelIndex idx = peers->indexAt(pos);
1808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (idx.isValid()) {
1818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ctx_item = model.itemFromIndex(idx);
1828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		int type = ctx_item->data(peer_role_type).toInt();
1838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		menu->addAction(Peers::ItemType(type))->setEnabled(false);
1848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		menu->addSeparator();
1858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		int config_methods = -1;
1878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QVariant var = ctx_item->data(peer_role_config_methods);
1888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (var.isValid())
1898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			config_methods = var.toInt();
1908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		enum selected_method method = SEL_METHOD_NONE;
1928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		var = ctx_item->data(peer_role_selected_method);
1938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (var.isValid())
1948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			method = (enum selected_method) var.toInt();
1958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if ((type == PEER_TYPE_ASSOCIATED_STATION ||
1978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		     type == PEER_TYPE_AP_WPS ||
1988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		     type == PEER_TYPE_WPS_PIN_NEEDED ||
1998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		     type == PEER_TYPE_WPS_ER_ENROLLEE ||
2008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		     type == PEER_TYPE_WPS_ENROLLEE) &&
2018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    (config_methods == -1 || (config_methods & 0x010c))) {
2028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			menu->addAction(tr("Enter WPS PIN"), this,
2038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					SLOT(enter_pin()));
2048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
2058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (type == PEER_TYPE_P2P || type == PEER_TYPE_P2P_CLIENT) {
2078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			menu->addAction(tr("P2P Connect"), this,
2088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					SLOT(ctx_p2p_connect()));
2098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (method == SEL_METHOD_NONE &&
2108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    config_methods > -1 &&
2118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    config_methods & 0x0080 /* PBC */ &&
2128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    config_methods != 0x0080)
2138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				menu->addAction(tr("P2P Connect (PBC)"), this,
2148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						SLOT(connect_pbc()));
2158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (method == SEL_METHOD_NONE) {
2168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				menu->addAction(tr("P2P Request PIN"), this,
2178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						SLOT(ctx_p2p_req_pin()));
2188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				menu->addAction(tr("P2P Show PIN"), this,
2198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						SLOT(ctx_p2p_show_pin()));
2208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
2218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (config_methods > -1 && (config_methods & 0x0100)) {
2238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				/* Peer has Keypad */
2248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				menu->addAction(tr("P2P Display PIN"), this,
2258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						SLOT(ctx_p2p_display_pin()));
2268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
2278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (config_methods > -1 && (config_methods & 0x000c)) {
2298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				/* Peer has Label or Display */
2308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				menu->addAction(tr("P2P Enter PIN"), this,
2318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						SLOT(ctx_p2p_enter_pin()));
2328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
2338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
2348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (type == PEER_TYPE_P2P_GROUP) {
2368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			menu->addAction(tr("Show passphrase"), this,
2378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					SLOT(ctx_p2p_show_passphrase()));
2388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			menu->addAction(tr("Remove P2P Group"), this,
2398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					SLOT(ctx_p2p_remove_group()));
2408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
2418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (type == PEER_TYPE_P2P_PERSISTENT_GROUP_GO ||
2438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    type == PEER_TYPE_P2P_PERSISTENT_GROUP_CLIENT ||
2448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    type == PEER_TYPE_P2P_INVITATION) {
2458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			menu->addAction(tr("Start group"), this,
2468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					SLOT(ctx_p2p_start_persistent()));
2478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
2488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (type == PEER_TYPE_P2P_PERSISTENT_GROUP_GO ||
2508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    type == PEER_TYPE_P2P_PERSISTENT_GROUP_CLIENT) {
2518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			menu->addAction(tr("Invite"), this,
2528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					SLOT(ctx_p2p_invite()));
2538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
2548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (type == PEER_TYPE_P2P_INVITATION) {
2568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			menu->addAction(tr("Ignore"), this,
2578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					SLOT(ctx_p2p_delete()));
2588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
2598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (type == PEER_TYPE_AP_WPS) {
2618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			menu->addAction(tr("Connect (PBC)"), this,
2628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					SLOT(connect_pbc()));
2638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
2648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if ((type == PEER_TYPE_ASSOCIATED_STATION ||
2668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		     type == PEER_TYPE_WPS_ER_ENROLLEE ||
2678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		     type == PEER_TYPE_WPS_ENROLLEE) &&
2688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    config_methods >= 0 && (config_methods & 0x0080)) {
2698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			menu->addAction(tr("Enroll (PBC)"), this,
2708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					SLOT(connect_pbc()));
2718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
2728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (type == PEER_TYPE_WPS_ER_AP) {
2748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			menu->addAction(tr("Learn Configuration"), this,
2758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					SLOT(learn_ap_config()));
2768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
2778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		menu->addAction(tr("Properties"), this, SLOT(properties()));
2798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
2808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ctx_item = NULL;
2818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		menu->addAction(QString(tr("Refresh")), this,
2828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				SLOT(ctx_refresh()));
2838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		menu->addAction(tr("Start P2P discovery"), this,
2848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				SLOT(ctx_p2p_start()));
2858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		menu->addAction(tr("Stop P2P discovery"), this,
2868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				SLOT(ctx_p2p_stop()));
2878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		menu->addAction(tr("P2P listen only"), this,
2888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				SLOT(ctx_p2p_listen()));
2898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		menu->addAction(tr("Start P2P group"), this,
2908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				SLOT(ctx_p2p_start_group()));
2918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (hide_ap)
2928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			menu->addAction(tr("Show AP entries"), this,
2938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					SLOT(ctx_show_ap()));
2948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		else
2958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			menu->addAction(tr("Hide AP entries"), this,
2968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					SLOT(ctx_hide_ap()));
2978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
2988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	menu->exec(peers->mapToGlobal(pos));
3008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid Peers::enter_pin()
3048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ctx_item == NULL)
3068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
3078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int peer_type = ctx_item->data(peer_role_type).toInt();
3098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	QString uuid;
3108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	QString addr;
3118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	addr = ctx_item->data(peer_role_address).toString();
3128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (peer_type == PEER_TYPE_WPS_ER_ENROLLEE)
3138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		uuid = ctx_item->data(peer_role_uuid).toString();
3148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	StringQuery input(tr("PIN:"));
3168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	input.setWindowTitle(tr("PIN for ") + ctx_item->text());
3178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (input.exec() != QDialog::Accepted)
3188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
3198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[100];
3218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char reply[100];
3228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t reply_len;
3238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (peer_type == PEER_TYPE_WPS_ER_ENROLLEE) {
3258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		snprintf(cmd, sizeof(cmd), "WPS_ER_PIN %s %s %s",
3267a53dbb56693ee9f55c0cab1a8297436511e8613Dmitry Shmidt			 uuid.toLocal8Bit().constData(),
3277a53dbb56693ee9f55c0cab1a8297436511e8613Dmitry Shmidt			 input.get_string().toLocal8Bit().constData(),
3287a53dbb56693ee9f55c0cab1a8297436511e8613Dmitry Shmidt			 addr.toLocal8Bit().constData());
3298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
3308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		snprintf(cmd, sizeof(cmd), "WPS_PIN %s %s",
3317a53dbb56693ee9f55c0cab1a8297436511e8613Dmitry Shmidt			 addr.toLocal8Bit().constData(),
3327a53dbb56693ee9f55c0cab1a8297436511e8613Dmitry Shmidt			 input.get_string().toLocal8Bit().constData());
3338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
3348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply_len = sizeof(reply) - 1;
3358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpagui->ctrlRequest(cmd, reply, &reply_len) < 0) {
3368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QMessageBox msg;
3378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		msg.setIcon(QMessageBox::Warning);
3388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		msg.setText(tr("Failed to set the WPS PIN."));
3398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		msg.exec();
3408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
3418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid Peers::ctx_refresh()
3458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	update_peers();
3478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid Peers::ctx_p2p_start()
3518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char reply[20];
3538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t reply_len;
3548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply_len = sizeof(reply) - 1;
3558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpagui->ctrlRequest("P2P_FIND", reply, &reply_len) < 0 ||
3568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	    memcmp(reply, "FAIL", 4) == 0) {
3578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QMessageBox msg;
3588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		msg.setIcon(QMessageBox::Warning);
3598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		msg.setText("Failed to start P2P discovery.");
3608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		msg.exec();
3618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
3628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid Peers::ctx_p2p_stop()
3668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char reply[20];
3688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t reply_len;
3698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply_len = sizeof(reply) - 1;
3708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpagui->ctrlRequest("P2P_STOP_FIND", reply, &reply_len);
3718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid Peers::ctx_p2p_listen()
3758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char reply[20];
3778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t reply_len;
3788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply_len = sizeof(reply) - 1;
3798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpagui->ctrlRequest("P2P_LISTEN 3600", reply, &reply_len) < 0 ||
3808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	    memcmp(reply, "FAIL", 4) == 0) {
3818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QMessageBox msg;
3828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		msg.setIcon(QMessageBox::Warning);
3838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		msg.setText("Failed to start P2P listen.");
3848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		msg.exec();
3858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
3868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid Peers::ctx_p2p_start_group()
3908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char reply[20];
3928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t reply_len;
3938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply_len = sizeof(reply) - 1;
3948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpagui->ctrlRequest("P2P_GROUP_ADD", reply, &reply_len) < 0 ||
3958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	    memcmp(reply, "FAIL", 4) == 0) {
3968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QMessageBox msg;
3978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		msg.setIcon(QMessageBox::Warning);
3988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		msg.setText("Failed to start P2P group.");
3998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		msg.exec();
4008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
4018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid Peers::add_station(QString info)
4058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
4068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	QStringList lines = info.split(QRegExp("\\n"));
4078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	QString name;
4088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (QStringList::Iterator it = lines.begin();
4108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	     it != lines.end(); it++) {
4118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		int pos = (*it).indexOf('=') + 1;
4128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (pos < 1)
4138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			continue;
4148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if ((*it).startsWith("wpsDeviceName="))
4168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			name = (*it).mid(pos);
4178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		else if ((*it).startsWith("p2p_device_name="))
4188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			name = (*it).mid(pos);
4198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
4208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (name.isEmpty())
4228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		name = lines[0];
4238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	QStandardItem *item = new QStandardItem(*laptop_icon, name);
4258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (item) {
4268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		/* Remove WPS enrollee entry if one is still pending */
4278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (model.rowCount() > 0) {
4288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			QModelIndexList lst = model.match(model.index(0, 0),
4298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							  peer_role_address,
4308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							  lines[0]);
4318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			for (int i = 0; i < lst.size(); i++) {
4328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				QStandardItem *item;
4338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				item = model.itemFromIndex(lst[i]);
4348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				if (item == NULL)
4358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					continue;
4368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				int type = item->data(peer_role_type).toInt();
4378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				if (type == PEER_TYPE_WPS_ENROLLEE) {
4388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					model.removeRow(lst[i].row());
4398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					break;
4408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				}
4418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
4428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
4438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		item->setData(lines[0], peer_role_address);
4458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		item->setData(PEER_TYPE_ASSOCIATED_STATION,
4468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			      peer_role_type);
4478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		item->setData(info, peer_role_details);
4488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		item->setToolTip(ItemType(PEER_TYPE_ASSOCIATED_STATION));
4498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		model.appendRow(item);
4508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
4518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid Peers::add_stations()
4558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
4568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char reply[2048];
4578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t reply_len;
4588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[30];
4598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
4608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply_len = sizeof(reply) - 1;
4628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpagui->ctrlRequest("STA-FIRST", reply, &reply_len) < 0)
4638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
4648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	do {
4668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply[reply_len] = '\0';
4678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QString info(reply);
4688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		char *txt = reply;
4698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		while (*txt != '\0' && *txt != '\n')
4708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			txt++;
4718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*txt++ = '\0';
4728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (strncmp(reply, "FAIL", 4) == 0 ||
4738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    strncmp(reply, "UNKNOWN", 7) == 0)
4748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
4758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		add_station(info);
4778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply_len = sizeof(reply) - 1;
4798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		snprintf(cmd, sizeof(cmd), "STA-NEXT %s", reply);
4808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = wpagui->ctrlRequest(cmd, reply, &reply_len);
4818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} while (res >= 0);
4828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid Peers::add_single_station(const char *addr)
4868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
4878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char reply[2048];
4888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t reply_len;
4898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[30];
4908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply_len = sizeof(reply) - 1;
4928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	snprintf(cmd, sizeof(cmd), "STA %s", addr);
4938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpagui->ctrlRequest(cmd, reply, &reply_len) < 0)
4948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
4958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply[reply_len] = '\0';
4978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	QString info(reply);
4988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *txt = reply;
4998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (*txt != '\0' && *txt != '\n')
5008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		txt++;
5018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	*txt++ = '\0';
5028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (strncmp(reply, "FAIL", 4) == 0 ||
5038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	    strncmp(reply, "UNKNOWN", 7) == 0)
5048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
5058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	add_station(info);
5078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid Peers::add_p2p_group_client(QStandardItem * /*parent*/, QString params)
5118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/*
5138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 * dev=02:b5:64:63:30:63 iface=02:b5:64:63:30:63 dev_capab=0x0
5148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 * dev_type=1-0050f204-1 dev_name='Wireless Client'
5158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 * config_methods=0x8c
5168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 */
5178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	QStringList items =
5198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		params.split(QRegExp(" (?=[^']*('[^']*'[^']*)*$)"));
5208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	QString addr = "";
5218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	QString name = "";
5228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int config_methods = 0;
5238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	QString dev_type;
5248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (int i = 0; i < items.size(); i++) {
5268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QString str = items.at(i);
5278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		int pos = str.indexOf('=') + 1;
5288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (str.startsWith("dev_name='"))
5298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			name = str.section('\'', 1, -2);
5308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		else if (str.startsWith("config_methods="))
5318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			config_methods =
5328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				str.section('=', 1).toInt(0, 0);
5338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		else if (str.startsWith("dev="))
5348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			addr = str.mid(pos);
5358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		else if (str.startsWith("dev_type=") && dev_type.isEmpty())
5368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			dev_type = str.mid(pos);
5378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
5388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	QStandardItem *item = find_addr(addr);
5408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (item)
5418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
5428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	item = new QStandardItem(*default_icon, name);
5448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (item) {
5458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		/* TODO: indicate somehow the relationship to the group owner
5468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		 * (parent) */
5478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		item->setData(addr, peer_role_address);
5488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		item->setData(config_methods, peer_role_config_methods);
5498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		item->setData(PEER_TYPE_P2P_CLIENT, peer_role_type);
5508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!dev_type.isEmpty())
5518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			item->setData(dev_type, peer_role_pri_dev_type);
5528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		item->setData(items.join(QString("\n")), peer_role_details);
5538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		item->setToolTip(ItemType(PEER_TYPE_P2P_CLIENT));
5548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		model.appendRow(item);
5558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
5568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid Peers::remove_bss(int id)
5608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (model.rowCount() == 0)
5628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
5638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	QModelIndexList lst = model.match(model.index(0, 0), peer_role_bss_id,
5658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  id);
5668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (lst.size() == 0)
5678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
5688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	model.removeRow(lst[0].row());
5698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtbool Peers::add_bss(const char *cmd)
5738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char reply[2048];
5758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t reply_len;
5768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (hide_ap)
5788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return false;
5798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply_len = sizeof(reply) - 1;
5818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpagui->ctrlRequest(cmd, reply, &reply_len) < 0)
5828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return false;
5838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply[reply_len] = '\0';
5848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	QString bss(reply);
5868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (bss.isEmpty() || bss.startsWith("FAIL"))
5878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return false;
5888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	QString ssid, bssid, flags, wps_name, pri_dev_type;
5908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int id = -1;
5918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	QStringList lines = bss.split(QRegExp("\\n"));
5938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (QStringList::Iterator it = lines.begin();
5948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	     it != lines.end(); it++) {
5958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		int pos = (*it).indexOf('=') + 1;
5968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (pos < 1)
5978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			continue;
5988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if ((*it).startsWith("bssid="))
6008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			bssid = (*it).mid(pos);
6018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		else if ((*it).startsWith("id="))
6028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			id = (*it).mid(pos).toInt();
6038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		else if ((*it).startsWith("flags="))
6048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			flags = (*it).mid(pos);
6058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		else if ((*it).startsWith("ssid="))
6068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ssid = (*it).mid(pos);
6078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		else if ((*it).startsWith("wps_device_name="))
6088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wps_name = (*it).mid(pos);
6098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		else if ((*it).startsWith("wps_primary_device_type="))
6108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			pri_dev_type = (*it).mid(pos);
6118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
6128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	QString name = wps_name;
6148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (name.isEmpty())
6158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		name = ssid + "\n" + bssid;
6168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	QStandardItem *item = new QStandardItem(*ap_icon, name);
6188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (item) {
6198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		item->setData(bssid, peer_role_address);
6208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (id >= 0)
6218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			item->setData(id, peer_role_bss_id);
6228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		int type;
6238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (flags.contains("[WPS"))
6248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			type = PEER_TYPE_AP_WPS;
6258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		else
6268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			type = PEER_TYPE_AP;
6278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		item->setData(type, peer_role_type);
6288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		for (int i = 0; i < lines.size(); i++) {
6308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (lines[i].length() > 60) {
6318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				lines[i].remove(60, lines[i].length());
6328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				lines[i] += "..";
6338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
6348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
6358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		item->setToolTip(ItemType(type));
6368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		item->setData(lines.join("\n"), peer_role_details);
6378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!pri_dev_type.isEmpty())
6388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			item->setData(pri_dev_type,
6398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      peer_role_pri_dev_type);
6408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!ssid.isEmpty())
6418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			item->setData(ssid, peer_role_ssid);
6428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		model.appendRow(item);
6438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		lines = bss.split(QRegExp("\\n"));
6458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		for (QStringList::Iterator it = lines.begin();
6468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		     it != lines.end(); it++) {
6478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if ((*it).startsWith("p2p_group_client:"))
6488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				add_p2p_group_client(item,
6498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						     (*it).mid(18));
6508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
6518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
6528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return true;
6548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid Peers::add_scan_results()
6588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
6598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int index;
6608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[20];
6618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	index = 0;
6638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (wpagui) {
6648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		snprintf(cmd, sizeof(cmd), "BSS %d", index++);
6658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (index > 1000)
6668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
6678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!add_bss(cmd))
6698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
6708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
6718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid Peers::add_persistent(int id, const char *ssid, const char *bssid)
6758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
6768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[100];
6778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char reply[100];
6788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t reply_len;
6798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int mode;
6808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	snprintf(cmd, sizeof(cmd), "GET_NETWORK %d mode", id);
6828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpagui->ctrlRequest(cmd, reply, &reply_len) < 0)
6838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
6848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply[reply_len] = '\0';
6858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	mode = atoi(reply);
6868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	QString name = ssid;
6888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	name = '[' + name + ']';
6898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	QStandardItem *item = new QStandardItem(*group_icon, name);
6918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!item)
6928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
6938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int type;
6958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (mode == 3)
6968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		type = PEER_TYPE_P2P_PERSISTENT_GROUP_GO;
6978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
6988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		type = PEER_TYPE_P2P_PERSISTENT_GROUP_CLIENT;
6998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	item->setData(type, peer_role_type);
7008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	item->setToolTip(ItemType(type));
7018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	item->setData(ssid, peer_role_ssid);
7028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (bssid && strcmp(bssid, "any") == 0)
7038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		bssid = NULL;
7048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (bssid)
7058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		item->setData(bssid, peer_role_address);
7068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	item->setData(id, peer_role_network_id);
7078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	item->setBackground(Qt::BDiagPattern);
7088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	model.appendRow(item);
7108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid Peers::add_persistent_groups()
7148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
7158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char buf[2048], *start, *end, *id, *ssid, *bssid, *flags;
7168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t len;
7178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	len = sizeof(buf) - 1;
7198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpagui->ctrlRequest("LIST_NETWORKS", buf, &len) < 0)
7208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
7218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	buf[len] = '\0';
7238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	start = strchr(buf, '\n');
7248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (start == NULL)
7258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
7268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	start++;
7278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (*start) {
7298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		bool last = false;
7308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		end = strchr(start, '\n');
7318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (end == NULL) {
7328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			last = true;
7338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			end = start;
7348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			while (end[0] && end[1])
7358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				end++;
7368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
7378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*end = '\0';
7388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		id = start;
7408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ssid = strchr(id, '\t');
7418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (ssid == NULL)
7428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
7438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*ssid++ = '\0';
7448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		bssid = strchr(ssid, '\t');
7458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (bssid == NULL)
7468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
7478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*bssid++ = '\0';
7488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		flags = strchr(bssid, '\t');
7498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (flags == NULL)
7508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
7518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		*flags++ = '\0';
7528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (strstr(flags, "[DISABLED][P2P-PERSISTENT]"))
7548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			add_persistent(atoi(id), ssid, bssid);
7558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (last)
7578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
7588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		start = end + 1;
7598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
7608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid Peers::update_peers()
7648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
7658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	model.clear();
7668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpagui == NULL)
7678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
7688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char reply[20];
7708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t replylen = sizeof(reply) - 1;
7718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpagui->ctrlRequest("WPS_ER_START", reply, &replylen);
7728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	add_stations();
7748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	add_scan_results();
7758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	add_persistent_groups();
7768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7798d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtQStandardItem * Peers::find_addr(QString addr)
7808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
7818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (model.rowCount() == 0)
7828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return NULL;
7838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	QModelIndexList lst = model.match(model.index(0, 0), peer_role_address,
7858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  addr);
7868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (lst.size() == 0)
7878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return NULL;
7888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return model.itemFromIndex(lst[0]);
7898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7928d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtQStandardItem * Peers::find_addr_type(QString addr, int type)
7938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
7948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (model.rowCount() == 0)
7958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return NULL;
7968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	QModelIndexList lst = model.match(model.index(0, 0), peer_role_address,
7988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  addr);
7998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (int i = 0; i < lst.size(); i++) {
8008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QStandardItem *item = model.itemFromIndex(lst[i]);
8018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (item->data(peer_role_type).toInt() == type)
8028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return item;
8038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
8048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return NULL;
8058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
8068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8088d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtQStandardItem * Peers::find_uuid(QString uuid)
8098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
8108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (model.rowCount() == 0)
8118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return NULL;
8128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	QModelIndexList lst = model.match(model.index(0, 0), peer_role_uuid,
8148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  uuid);
8158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (lst.size() == 0)
8168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return NULL;
8178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return model.itemFromIndex(lst[0]);
8188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
8198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid Peers::event_notify(WpaMsg msg)
8228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
8238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	QString text = msg.getMsg();
8248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (text.startsWith(WPS_EVENT_PIN_NEEDED)) {
8268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		/*
8278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		 * WPS-PIN-NEEDED 5a02a5fa-9199-5e7c-bc46-e183d3cb32f7
8288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		 * 02:2a:c4:18:5b:f3
8298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		 * [Wireless Client|Company|cmodel|123|12345|1-0050F204-1]
8308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		 */
8318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QStringList items = text.split(' ');
8328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QString uuid = items[1];
8338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QString addr = items[2];
8348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QString name = "";
8358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QStandardItem *item = find_addr(addr);
8378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (item)
8388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return;
8398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		int pos = text.indexOf('[');
8418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (pos >= 0) {
8428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			int pos2 = text.lastIndexOf(']');
8438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (pos2 >= pos) {
8448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				items = text.mid(pos + 1, pos2 - pos - 1).
8458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					split('|');
8468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				name = items[0];
8478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				items.append(addr);
8488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
8498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
8508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		item = new QStandardItem(*laptop_icon, name);
8528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (item) {
8538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			item->setData(addr, peer_role_address);
8548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			item->setData(PEER_TYPE_WPS_PIN_NEEDED,
8558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      peer_role_type);
8568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			item->setToolTip(ItemType(PEER_TYPE_WPS_PIN_NEEDED));
8578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			item->setData(items.join("\n"), peer_role_details);
8588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			item->setData(items[5], peer_role_pri_dev_type);
8598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			model.appendRow(item);
8608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
8618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
8628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
8638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (text.startsWith(AP_STA_CONNECTED)) {
8658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		/* AP-STA-CONNECTED 02:2a:c4:18:5b:f3 */
8668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QStringList items = text.split(' ');
8678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QString addr = items[1];
8688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QStandardItem *item = find_addr(addr);
8698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (item == NULL || item->data(peer_role_type).toInt() !=
8708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    PEER_TYPE_ASSOCIATED_STATION)
8717a53dbb56693ee9f55c0cab1a8297436511e8613Dmitry Shmidt			add_single_station(addr.toLocal8Bit().constData());
8728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
8738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
8748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (text.startsWith(AP_STA_DISCONNECTED)) {
8768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		/* AP-STA-DISCONNECTED 02:2a:c4:18:5b:f3 */
8778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QStringList items = text.split(' ');
8788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QString addr = items[1];
8798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (model.rowCount() == 0)
8818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return;
8828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QModelIndexList lst = model.match(model.index(0, 0),
8848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						  peer_role_address, addr, -1);
8858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		for (int i = 0; i < lst.size(); i++) {
8868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			QStandardItem *item = model.itemFromIndex(lst[i]);
8878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (item && item->data(peer_role_type).toInt() ==
8888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    PEER_TYPE_ASSOCIATED_STATION) {
8898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				model.removeRow(lst[i].row());
8908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				break;
8918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
8928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
8938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
8948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
8958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (text.startsWith(P2P_EVENT_DEVICE_FOUND)) {
8978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		/*
8988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		 * P2P-DEVICE-FOUND 02:b5:64:63:30:63
8998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		 * p2p_dev_addr=02:b5:64:63:30:63 pri_dev_type=1-0050f204-1
9008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		 * name='Wireless Client' config_methods=0x84 dev_capab=0x21
9018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		 * group_capab=0x0
9028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		 */
9038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QStringList items =
9048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			text.split(QRegExp(" (?=[^']*('[^']*'[^']*)*$)"));
9058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QString addr = items[1];
9068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QString name = "";
9078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QString pri_dev_type;
9088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		int config_methods = 0;
9098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		for (int i = 0; i < items.size(); i++) {
9108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			QString str = items.at(i);
9118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (str.startsWith("name='"))
9128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				name = str.section('\'', 1, -2);
9138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			else if (str.startsWith("config_methods="))
9148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				config_methods =
9158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					str.section('=', 1).toInt(0, 0);
9168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			else if (str.startsWith("pri_dev_type="))
9178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				pri_dev_type = str.section('=', 1);
9188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
9198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QStandardItem *item = find_addr(addr);
9218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (item) {
9228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			int type = item->data(peer_role_type).toInt();
9238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (type == PEER_TYPE_P2P)
9248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				return;
9258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
9268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		item = new QStandardItem(*default_icon, name);
9288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (item) {
9298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			item->setData(addr, peer_role_address);
9308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			item->setData(config_methods,
9318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      peer_role_config_methods);
9328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			item->setData(PEER_TYPE_P2P, peer_role_type);
9338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!pri_dev_type.isEmpty())
9348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				item->setData(pri_dev_type,
9358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      peer_role_pri_dev_type);
9368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			item->setData(items.join(QString("\n")),
9378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      peer_role_details);
9388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			item->setToolTip(ItemType(PEER_TYPE_P2P));
9398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			model.appendRow(item);
9408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
9418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		item = find_addr_type(addr,
9438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      PEER_TYPE_P2P_PERSISTENT_GROUP_CLIENT);
9448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (item)
9458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			item->setBackground(Qt::NoBrush);
9468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
9478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (text.startsWith(P2P_EVENT_GROUP_STARTED)) {
9498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		/* P2P-GROUP-STARTED wlan0-p2p-0 GO ssid="DIRECT-3F"
9508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		 * passphrase="YOyTkxID" go_dev_addr=02:40:61:c2:f3:b7
9518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		 * [PERSISTENT] */
9528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QStringList items = text.split(' ');
9538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (items.size() < 4)
9548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return;
9558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		int pos = text.indexOf(" ssid=\"");
9578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (pos < 0)
9588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return;
9598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QString ssid = text.mid(pos + 7);
9608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pos = ssid.indexOf(" passphrase=\"");
9618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (pos < 0)
9628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			pos = ssid.indexOf(" psk=");
9638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (pos >= 0)
9648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ssid.truncate(pos);
9658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pos = ssid.lastIndexOf('"');
9668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (pos >= 0)
9678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ssid.truncate(pos);
9688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QStandardItem *item = new QStandardItem(*group_icon, ssid);
9708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (item) {
9718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			item->setData(PEER_TYPE_P2P_GROUP, peer_role_type);
9728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			item->setData(items[1], peer_role_ifname);
9738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			QString details;
9748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (items[2] == "GO") {
9758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				details = tr("P2P GO for interface ") +
9768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					items[1];
9778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			} else {
9788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				details = tr("P2P client for interface ") +
9798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					items[1];
9808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
9818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (text.contains(" [PERSISTENT]"))
9828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				details += "\nPersistent group";
9838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			item->setData(details, peer_role_details);
9848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			item->setToolTip(ItemType(PEER_TYPE_P2P_GROUP));
9858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			model.appendRow(item);
9868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
9878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
9888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (text.startsWith(P2P_EVENT_GROUP_REMOVED)) {
9908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		/* P2P-GROUP-REMOVED wlan0-p2p-0 GO */
9918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QStringList items = text.split(' ');
9928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (items.size() < 2)
9938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return;
9948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (model.rowCount() == 0)
9968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return;
9978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QModelIndexList lst = model.match(model.index(0, 0),
9998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						  peer_role_ifname, items[1]);
10008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		for (int i = 0; i < lst.size(); i++)
10018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			model.removeRow(lst[i].row());
10028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
10038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
10048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (text.startsWith(P2P_EVENT_PROV_DISC_SHOW_PIN)) {
10068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		/* P2P-PROV-DISC-SHOW-PIN 02:40:61:c2:f3:b7 12345670 */
10078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QStringList items = text.split(' ');
10088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (items.size() < 3)
10098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return;
10108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QString addr = items[1];
10118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QString pin = items[2];
10128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QStandardItem *item = find_addr_type(addr, PEER_TYPE_P2P);
10148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (item == NULL)
10158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return;
10168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		item->setData(SEL_METHOD_PIN_LOCAL_DISPLAY,
10178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			      peer_role_selected_method);
10188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		item->setData(pin, peer_role_selected_pin);
10198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QVariant var = item->data(peer_role_requested_method);
10208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (var.isValid() &&
10218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    var.toInt() == SEL_METHOD_PIN_LOCAL_DISPLAY) {
10228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ctx_item = item;
10238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ctx_p2p_display_pin_pd();
10248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
10258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
10268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
10278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (text.startsWith(P2P_EVENT_PROV_DISC_ENTER_PIN)) {
10298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		/* P2P-PROV-DISC-ENTER-PIN 02:40:61:c2:f3:b7 */
10308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QStringList items = text.split(' ');
10318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (items.size() < 2)
10328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return;
10338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QString addr = items[1];
10348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QStandardItem *item = find_addr_type(addr, PEER_TYPE_P2P);
10368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (item == NULL)
10378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return;
10388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		item->setData(SEL_METHOD_PIN_PEER_DISPLAY,
10398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			      peer_role_selected_method);
10408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QVariant var = item->data(peer_role_requested_method);
10418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (var.isValid() &&
10428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    var.toInt() == SEL_METHOD_PIN_PEER_DISPLAY) {
10438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ctx_item = item;
10448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ctx_p2p_connect();
10458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
10468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
10478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
10488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (text.startsWith(P2P_EVENT_INVITATION_RECEIVED)) {
10508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		/* P2P-INVITATION-RECEIVED sa=02:f0:bc:44:87:62 persistent=4 */
10518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QStringList items = text.split(' ');
10528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (items.size() < 3)
10538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return;
10548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!items[1].startsWith("sa=") ||
10558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    !items[2].startsWith("persistent="))
10568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return;
10578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QString addr = items[1].mid(3);
10588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		int id = items[2].mid(11).toInt();
10598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		char cmd[100];
10618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		char reply[100];
10628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		size_t reply_len;
10638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		snprintf(cmd, sizeof(cmd), "GET_NETWORK %d ssid", id);
10658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply_len = sizeof(reply) - 1;
10668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (wpagui->ctrlRequest(cmd, reply, &reply_len) < 0)
10678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return;
10688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply[reply_len] = '\0';
10698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QString name;
10708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		char *pos = strrchr(reply, '"');
10718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (pos && reply[0] == '"') {
10728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			*pos = '\0';
10738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			name = reply + 1;
10748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else
10758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			name = reply;
10768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QStandardItem *item;
10788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		item = find_addr_type(addr, PEER_TYPE_P2P_INVITATION);
10798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (item)
10808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			model.removeRow(item->row());
10818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		item = new QStandardItem(*invitation_icon, name);
10838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!item)
10848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return;
10858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		item->setData(PEER_TYPE_P2P_INVITATION, peer_role_type);
10868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		item->setToolTip(ItemType(PEER_TYPE_P2P_INVITATION));
10878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		item->setData(addr, peer_role_address);
10888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		item->setData(id, peer_role_network_id);
10898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		model.appendRow(item);
10918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		enable_persistent(id);
10938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
10958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
10968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (text.startsWith(P2P_EVENT_INVITATION_RESULT)) {
10988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		/* P2P-INVITATION-RESULT status=1 */
10998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		/* TODO */
11008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
11018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (text.startsWith(WPS_EVENT_ER_AP_ADD)) {
11048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		/*
11058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		 * WPS-ER-AP-ADD 87654321-9abc-def0-1234-56789abc0002
11068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		 * 02:11:22:33:44:55 pri_dev_type=6-0050F204-1 wps_state=1
11078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		 * |Very friendly name|Company|Long description of the model|
11088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		 * WAP|http://w1.fi/|http://w1.fi/hostapd/
11098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		 */
11108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QStringList items = text.split(' ');
11118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (items.size() < 5)
11128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return;
11138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QString uuid = items[1];
11148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QString addr = items[2];
11158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QString pri_dev_type = items[3].mid(13);
11168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		int wps_state = items[4].mid(10).toInt();
11178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		int pos = text.indexOf('|');
11198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (pos < 0)
11208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return;
11218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		items = text.mid(pos + 1).split('|');
11228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (items.size() < 1)
11238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return;
11248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QStandardItem *item = find_uuid(uuid);
11268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (item)
11278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return;
11288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		item = new QStandardItem(*ap_icon, items[0]);
11308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (item) {
11318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			item->setData(uuid, peer_role_uuid);
11328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			item->setData(addr, peer_role_address);
11338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			int type = wps_state == 2 ? PEER_TYPE_WPS_ER_AP:
11348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				PEER_TYPE_WPS_ER_AP_UNCONFIGURED;
11358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			item->setData(type, peer_role_type);
11368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			item->setToolTip(ItemType(type));
11378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			item->setData(pri_dev_type, peer_role_pri_dev_type);
11388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			item->setData(items.join(QString("\n")),
11398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      peer_role_details);
11408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			model.appendRow(item);
11418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
11428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
11448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (text.startsWith(WPS_EVENT_ER_AP_REMOVE)) {
11478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		/* WPS-ER-AP-REMOVE 87654321-9abc-def0-1234-56789abc0002 */
11488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QStringList items = text.split(' ');
11498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (items.size() < 2)
11508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return;
11518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (model.rowCount() == 0)
11528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return;
11538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QModelIndexList lst = model.match(model.index(0, 0),
11558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						  peer_role_uuid, items[1]);
11568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		for (int i = 0; i < lst.size(); i++) {
11578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			QStandardItem *item = model.itemFromIndex(lst[i]);
11588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (item &&
11598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    (item->data(peer_role_type).toInt() ==
11608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			     PEER_TYPE_WPS_ER_AP ||
11618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			     item->data(peer_role_type).toInt() ==
11628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			     PEER_TYPE_WPS_ER_AP_UNCONFIGURED))
11638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				model.removeRow(lst[i].row());
11648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
11658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
11668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (text.startsWith(WPS_EVENT_ER_ENROLLEE_ADD)) {
11698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		/*
11708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		 * WPS-ER-ENROLLEE-ADD 2b7093f1-d6fb-5108-adbb-bea66bb87333
11718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		 * 02:66:a0:ee:17:27 M1=1 config_methods=0x14d dev_passwd_id=0
11728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		 * pri_dev_type=1-0050F204-1
11738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		 * |Wireless Client|Company|cmodel|123|12345|
11748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		 */
11758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QStringList items = text.split(' ');
11768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (items.size() < 3)
11778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return;
11788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QString uuid = items[1];
11798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QString addr = items[2];
11808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QString pri_dev_type = items[6].mid(13);
11818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		int config_methods = -1;
11828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		int dev_passwd_id = -1;
11838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		for (int i = 3; i < items.size(); i++) {
11858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			int pos = items[i].indexOf('=') + 1;
11868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (pos < 1)
11878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				continue;
11888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			QString val = items[i].mid(pos);
11898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (items[i].startsWith("config_methods=")) {
11908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				config_methods = val.toInt(0, 0);
11918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			} else if (items[i].startsWith("dev_passwd_id=")) {
11928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				dev_passwd_id = val.toInt();
11938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
11948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
11958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		int pos = text.indexOf('|');
11978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (pos < 0)
11988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return;
11998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		items = text.mid(pos + 1).split('|');
12008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (items.size() < 1)
12018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return;
12028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QString name = items[0];
12038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (name.length() == 0)
12048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			name = addr;
12058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		remove_enrollee_uuid(uuid);
12078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QStandardItem *item;
12098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		item = new QStandardItem(*laptop_icon, name);
12108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (item) {
12118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			item->setData(uuid, peer_role_uuid);
12128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			item->setData(addr, peer_role_address);
12138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			item->setData(PEER_TYPE_WPS_ER_ENROLLEE,
12148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      peer_role_type);
12158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			item->setToolTip(ItemType(PEER_TYPE_WPS_ER_ENROLLEE));
12168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			item->setData(items.join(QString("\n")),
12178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      peer_role_details);
12188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			item->setData(pri_dev_type, peer_role_pri_dev_type);
12198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (config_methods >= 0)
12208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				item->setData(config_methods,
12218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      peer_role_config_methods);
12228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (dev_passwd_id >= 0)
12238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				item->setData(dev_passwd_id,
12248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      peer_role_dev_passwd_id);
12258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			model.appendRow(item);
12268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
12278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
12298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
12308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (text.startsWith(WPS_EVENT_ER_ENROLLEE_REMOVE)) {
12328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		/*
12338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		 * WPS-ER-ENROLLEE-REMOVE 2b7093f1-d6fb-5108-adbb-bea66bb87333
12348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		 * 02:66:a0:ee:17:27
12358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		 */
12368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QStringList items = text.split(' ');
12378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (items.size() < 2)
12388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return;
12398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		remove_enrollee_uuid(items[1]);
12408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
12418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
12428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (text.startsWith(WPS_EVENT_ENROLLEE_SEEN)) {
12448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		/* TODO: need to time out this somehow or remove on successful
12458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		 * WPS run, etc. */
12468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		/*
12478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		 * WPS-ENROLLEE-SEEN 02:00:00:00:01:00
12488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		 * 572cf82f-c957-5653-9b16-b5cfb298abf1 1-0050F204-1 0x80 4 1
12498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		 * [Wireless Client]
12508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		 * (MAC addr, UUID-E, pri dev type, config methods,
12518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		 * dev passwd id, request type, [dev name])
12528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		 */
12538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QStringList items = text.split(' ');
12548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (items.size() < 7)
12558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return;
12568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QString addr = items[1];
12578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QString uuid = items[2];
12588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QString pri_dev_type = items[3];
12598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		int config_methods = items[4].toInt(0, 0);
12608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		int dev_passwd_id = items[5].toInt();
12618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QString name;
12628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QStandardItem *item = find_addr(addr);
12648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (item) {
12658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			int type = item->data(peer_role_type).toInt();
12668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (type == PEER_TYPE_ASSOCIATED_STATION)
12678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				return; /* already associated */
12688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
12698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		int pos = text.indexOf('[');
12718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (pos >= 0) {
12728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			int pos2 = text.lastIndexOf(']');
12738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (pos2 >= pos) {
12748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				QStringList items2 =
12758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					text.mid(pos + 1, pos2 - pos - 1).
12768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					split('|');
12778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				name = items2[0];
12788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
12798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
12808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (name.isEmpty())
12818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			name = addr;
12828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		item = find_uuid(uuid);
12848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (item) {
12858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			QVariant var = item->data(peer_role_config_methods);
12868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			QVariant var2 = item->data(peer_role_dev_passwd_id);
12878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if ((var.isValid() && config_methods != var.toInt()) ||
12888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    (var2.isValid() && dev_passwd_id != var2.toInt()))
12898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				remove_enrollee_uuid(uuid);
12908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			else
12918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				return;
12928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
12938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		item = new QStandardItem(*laptop_icon, name);
12958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (item) {
12968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			item->setData(uuid, peer_role_uuid);
12978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			item->setData(addr, peer_role_address);
12988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			item->setData(PEER_TYPE_WPS_ENROLLEE,
12998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      peer_role_type);
13008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			item->setToolTip(ItemType(PEER_TYPE_WPS_ENROLLEE));
13018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			item->setData(items.join(QString("\n")),
13028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      peer_role_details);
13038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			item->setData(pri_dev_type, peer_role_pri_dev_type);
13048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			item->setData(config_methods,
13058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      peer_role_config_methods);
13068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			item->setData(dev_passwd_id, peer_role_dev_passwd_id);
13078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			model.appendRow(item);
13088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
13098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
13118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
13128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (text.startsWith(WPA_EVENT_BSS_ADDED)) {
13148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		/* CTRL-EVENT-BSS-ADDED 34 00:11:22:33:44:55 */
13158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QStringList items = text.split(' ');
13168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (items.size() < 2)
13178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return;
13188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		char cmd[20];
13198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		snprintf(cmd, sizeof(cmd), "BSS ID-%d", items[1].toInt());
13208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		add_bss(cmd);
13218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
13228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
13238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (text.startsWith(WPA_EVENT_BSS_REMOVED)) {
13258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		/* CTRL-EVENT-BSS-REMOVED 34 00:11:22:33:44:55 */
13268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QStringList items = text.split(' ');
13278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (items.size() < 2)
13288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return;
13298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		remove_bss(items[1].toInt());
13308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
13318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
13328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
13338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid Peers::ctx_p2p_connect()
13368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
13378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ctx_item == NULL)
13388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
13398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	QString addr = ctx_item->data(peer_role_address).toString();
13408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	QString arg;
13418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int config_methods =
13428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ctx_item->data(peer_role_config_methods).toInt();
13438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	enum selected_method method = SEL_METHOD_NONE;
13448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	QVariant var = ctx_item->data(peer_role_selected_method);
13458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (var.isValid())
13468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		method = (enum selected_method) var.toInt();
13478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (method == SEL_METHOD_PIN_LOCAL_DISPLAY) {
13488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		arg = ctx_item->data(peer_role_selected_pin).toString();
13498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		char cmd[100];
13508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		char reply[100];
13518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		size_t reply_len;
13528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		snprintf(cmd, sizeof(cmd), "P2P_CONNECT %s %s display",
13537a53dbb56693ee9f55c0cab1a8297436511e8613Dmitry Shmidt			 addr.toLocal8Bit().constData(),
13547a53dbb56693ee9f55c0cab1a8297436511e8613Dmitry Shmidt			 arg.toLocal8Bit().constData());
13558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply_len = sizeof(reply) - 1;
13568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (wpagui->ctrlRequest(cmd, reply, &reply_len) < 0) {
13578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			QMessageBox msg;
13588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			msg.setIcon(QMessageBox::Warning);
13598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			msg.setText("Failed to initiate P2P connect.");
13608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			msg.exec();
13618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return;
13628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
13638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QMessageBox::information(this,
13648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 tr("PIN for ") + ctx_item->text(),
13658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 tr("Enter the following PIN on the\n"
13668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    "peer device: ") + arg);
13678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (method == SEL_METHOD_PIN_PEER_DISPLAY) {
13688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		StringQuery input(tr("PIN from peer display:"));
13698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		input.setWindowTitle(tr("PIN for ") + ctx_item->text());
13708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (input.exec() != QDialog::Accepted)
13718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return;
13728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		arg = input.get_string();
13738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (config_methods == 0x0080 /* PBC */) {
13748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		arg = "pbc";
13758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
13768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		StringQuery input(tr("PIN:"));
13778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		input.setWindowTitle(tr("PIN for ") + ctx_item->text());
13788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (input.exec() != QDialog::Accepted)
13798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return;
13808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		arg = input.get_string();
13818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
13828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[100];
13848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char reply[100];
13858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t reply_len;
13868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	snprintf(cmd, sizeof(cmd), "P2P_CONNECT %s %s",
13877a53dbb56693ee9f55c0cab1a8297436511e8613Dmitry Shmidt		 addr.toLocal8Bit().constData(),
13887a53dbb56693ee9f55c0cab1a8297436511e8613Dmitry Shmidt		 arg.toLocal8Bit().constData());
13898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply_len = sizeof(reply) - 1;
13908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpagui->ctrlRequest(cmd, reply, &reply_len) < 0) {
13918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QMessageBox msg;
13928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		msg.setIcon(QMessageBox::Warning);
13938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		msg.setText("Failed to initiate P2P connect.");
13948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		msg.exec();
13958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
13968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
13978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid Peers::ctx_p2p_req_pin()
14008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
14018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ctx_item == NULL)
14028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
14038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	QString addr = ctx_item->data(peer_role_address).toString();
14048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ctx_item->setData(SEL_METHOD_PIN_PEER_DISPLAY,
14058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  peer_role_requested_method);
14068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[100];
14088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char reply[100];
14098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t reply_len;
14108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	snprintf(cmd, sizeof(cmd), "P2P_PROV_DISC %s display",
14117a53dbb56693ee9f55c0cab1a8297436511e8613Dmitry Shmidt		 addr.toLocal8Bit().constData());
14128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply_len = sizeof(reply) - 1;
14138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpagui->ctrlRequest(cmd, reply, &reply_len) < 0) {
14148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QMessageBox msg;
14158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		msg.setIcon(QMessageBox::Warning);
14168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		msg.setText(tr("Failed to request PIN from peer."));
14178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		msg.exec();
14188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
14198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
14208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid Peers::ctx_p2p_show_pin()
14238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
14248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ctx_item == NULL)
14258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
14268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	QString addr = ctx_item->data(peer_role_address).toString();
14278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ctx_item->setData(SEL_METHOD_PIN_LOCAL_DISPLAY,
14288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  peer_role_requested_method);
14298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[100];
14318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char reply[100];
14328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t reply_len;
14338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	snprintf(cmd, sizeof(cmd), "P2P_PROV_DISC %s keypad",
14347a53dbb56693ee9f55c0cab1a8297436511e8613Dmitry Shmidt		 addr.toLocal8Bit().constData());
14358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply_len = sizeof(reply) - 1;
14368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpagui->ctrlRequest(cmd, reply, &reply_len) < 0) {
14378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QMessageBox msg;
14388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		msg.setIcon(QMessageBox::Warning);
14398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		msg.setText(tr("Failed to request peer to enter PIN."));
14408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		msg.exec();
14418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
14428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
14438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid Peers::ctx_p2p_display_pin()
14468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
14478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ctx_item == NULL)
14488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
14498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	QString addr = ctx_item->data(peer_role_address).toString();
14508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[100];
14528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char reply[100];
14538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t reply_len;
14548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	snprintf(cmd, sizeof(cmd), "P2P_CONNECT %s pin",
14557a53dbb56693ee9f55c0cab1a8297436511e8613Dmitry Shmidt		 addr.toLocal8Bit().constData());
14568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply_len = sizeof(reply) - 1;
14578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpagui->ctrlRequest(cmd, reply, &reply_len) < 0) {
14588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QMessageBox msg;
14598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		msg.setIcon(QMessageBox::Warning);
14608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		msg.setText("Failed to initiate P2P connect.");
14618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		msg.exec();
14628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
14638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
14648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply[reply_len] = '\0';
14658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	QMessageBox::information(this,
14668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				 tr("PIN for ") + ctx_item->text(),
14678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				 tr("Enter the following PIN on the\n"
14688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    "peer device: ") + reply);
14698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
14708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid Peers::ctx_p2p_display_pin_pd()
14738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
14748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ctx_item == NULL)
14758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
14768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	QString addr = ctx_item->data(peer_role_address).toString();
14778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	QString arg = ctx_item->data(peer_role_selected_pin).toString();
14788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[100];
14808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char reply[100];
14818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t reply_len;
14828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	snprintf(cmd, sizeof(cmd), "P2P_CONNECT %s %s display",
14837a53dbb56693ee9f55c0cab1a8297436511e8613Dmitry Shmidt		 addr.toLocal8Bit().constData(),
14847a53dbb56693ee9f55c0cab1a8297436511e8613Dmitry Shmidt		 arg.toLocal8Bit().constData());
14858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply_len = sizeof(reply) - 1;
14868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpagui->ctrlRequest(cmd, reply, &reply_len) < 0) {
14878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QMessageBox msg;
14888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		msg.setIcon(QMessageBox::Warning);
14898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		msg.setText("Failed to initiate P2P connect.");
14908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		msg.exec();
14918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
14928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
14938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply[reply_len] = '\0';
14948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	QMessageBox::information(this,
14958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				 tr("PIN for ") + ctx_item->text(),
14968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				 tr("Enter the following PIN on the\n"
14978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    "peer device: ") + arg);
14988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
14998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid Peers::ctx_p2p_enter_pin()
15028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
15038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ctx_item == NULL)
15048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
15058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	QString addr = ctx_item->data(peer_role_address).toString();
15068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	QString arg;
15078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	StringQuery input(tr("PIN from peer:"));
15098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	input.setWindowTitle(tr("PIN for ") + ctx_item->text());
15108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (input.exec() != QDialog::Accepted)
15118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
15128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	arg = input.get_string();
15138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[100];
15158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char reply[100];
15168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t reply_len;
15178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	snprintf(cmd, sizeof(cmd), "P2P_CONNECT %s %s keypad",
15187a53dbb56693ee9f55c0cab1a8297436511e8613Dmitry Shmidt		 addr.toLocal8Bit().constData(),
15197a53dbb56693ee9f55c0cab1a8297436511e8613Dmitry Shmidt		 arg.toLocal8Bit().constData());
15208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply_len = sizeof(reply) - 1;
15218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpagui->ctrlRequest(cmd, reply, &reply_len) < 0) {
15228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QMessageBox msg;
15238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		msg.setIcon(QMessageBox::Warning);
15248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		msg.setText("Failed to initiate P2P connect.");
15258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		msg.exec();
15268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
15278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
15288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid Peers::ctx_p2p_remove_group()
15318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
15328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ctx_item == NULL)
15338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
15348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[100];
15358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char reply[100];
15368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t reply_len;
15378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	snprintf(cmd, sizeof(cmd), "P2P_GROUP_REMOVE %s",
15387a53dbb56693ee9f55c0cab1a8297436511e8613Dmitry Shmidt		 ctx_item->data(peer_role_ifname).toString().toLocal8Bit().
15398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		 constData());
15408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply_len = sizeof(reply) - 1;
15418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpagui->ctrlRequest(cmd, reply, &reply_len) < 0) {
15428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QMessageBox msg;
15438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		msg.setIcon(QMessageBox::Warning);
15448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		msg.setText("Failed to remove P2P Group.");
15458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		msg.exec();
15468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
15478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
15488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid Peers::closeEvent(QCloseEvent *)
15518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
15528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpagui) {
15538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		char reply[20];
15548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		size_t replylen = sizeof(reply) - 1;
15558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpagui->ctrlRequest("WPS_ER_STOP", reply, &replylen);
15568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
15578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
15588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid Peers::done(int r)
15618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
15628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	QDialog::done(r);
15638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	close();
15648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
15658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid Peers::remove_enrollee_uuid(QString uuid)
15688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
15698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (model.rowCount() == 0)
15708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
15718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	QModelIndexList lst = model.match(model.index(0, 0),
15738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  peer_role_uuid, uuid);
15748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (int i = 0; i < lst.size(); i++) {
15758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QStandardItem *item = model.itemFromIndex(lst[i]);
15768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (item == NULL)
15778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			continue;
15788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		int type = item->data(peer_role_type).toInt();
15798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (type == PEER_TYPE_WPS_ER_ENROLLEE ||
15808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    type == PEER_TYPE_WPS_ENROLLEE)
15818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			model.removeRow(lst[i].row());
15828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
15838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
15848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid Peers::properties()
15878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
15888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ctx_item == NULL)
15898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
15908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	QMessageBox msg(this);
15928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	msg.setStandardButtons(QMessageBox::Ok);
15938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	msg.setDefaultButton(QMessageBox::Ok);
15948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	msg.setEscapeButton(QMessageBox::Ok);
15958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	msg.setWindowTitle(tr("Peer Properties"));
15968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int type = ctx_item->data(peer_role_type).toInt();
15988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	QString title = Peers::ItemType(type);
15998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	msg.setText(title + QString("\n") + tr("Name: ") + ctx_item->text());
16018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	QVariant var;
16038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	QString info;
16048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	var = ctx_item->data(peer_role_address);
16068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (var.isValid())
16078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		info += tr("Address: ") + var.toString() + QString("\n");
16088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	var = ctx_item->data(peer_role_uuid);
16108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (var.isValid())
16118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		info += tr("UUID: ") + var.toString() + QString("\n");
16128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	var = ctx_item->data(peer_role_pri_dev_type);
16148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (var.isValid())
16158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		info += tr("Primary Device Type: ") + var.toString() +
16168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			QString("\n");
16178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	var = ctx_item->data(peer_role_ssid);
16198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (var.isValid())
16208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		info += tr("SSID: ") + var.toString() + QString("\n");
16218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	var = ctx_item->data(peer_role_config_methods);
16238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (var.isValid()) {
16248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		int methods = var.toInt();
16258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		info += tr("Configuration Methods: ");
16268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (methods & 0x0001)
16278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			info += tr("[USBA]");
16288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (methods & 0x0002)
16298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			info += tr("[Ethernet]");
16308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (methods & 0x0004)
16318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			info += tr("[Label]");
16328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (methods & 0x0008)
16338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			info += tr("[Display]");
16348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (methods & 0x0010)
16358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			info += tr("[Ext. NFC Token]");
16368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (methods & 0x0020)
16378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			info += tr("[Int. NFC Token]");
16388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (methods & 0x0040)
16398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			info += tr("[NFC Interface]");
16408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (methods & 0x0080)
16418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			info += tr("[Push Button]");
16428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (methods & 0x0100)
16438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			info += tr("[Keypad]");
16448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		info += "\n";
16458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
16468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	var = ctx_item->data(peer_role_selected_method);
16488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (var.isValid()) {
16498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		enum selected_method method =
16508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			(enum selected_method) var.toInt();
16518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		switch (method) {
16528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		case SEL_METHOD_NONE:
16538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
16548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		case SEL_METHOD_PIN_PEER_DISPLAY:
16558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			info += tr("Selected Method: PIN on peer display\n");
16568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
16578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		case SEL_METHOD_PIN_LOCAL_DISPLAY:
16588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			info += tr("Selected Method: PIN on local display\n");
16598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
16608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
16618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
16628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	var = ctx_item->data(peer_role_selected_pin);
16648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (var.isValid()) {
16658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		info += tr("PIN to enter on peer: ") + var.toString() + "\n";
16668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
16678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	var = ctx_item->data(peer_role_dev_passwd_id);
16698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (var.isValid()) {
16708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		info += tr("Device Password ID: ") + var.toString();
16718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		switch (var.toInt()) {
16728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		case 0:
16738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			info += tr(" (Default PIN)");
16748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
16758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		case 1:
16768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			info += tr(" (User-specified PIN)");
16778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
16788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		case 2:
16798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			info += tr(" (Machine-specified PIN)");
16808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
16818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		case 3:
16828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			info += tr(" (Rekey)");
16838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
16848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		case 4:
16858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			info += tr(" (Push Button)");
16868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
16878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		case 5:
16888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			info += tr(" (Registrar-specified)");
16898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
16908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
16918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		info += "\n";
16928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
16938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	msg.setInformativeText(info);
16958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	var = ctx_item->data(peer_role_details);
16978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (var.isValid())
16988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		msg.setDetailedText(var.toString());
16998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	msg.exec();
17018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
17028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid Peers::connect_pbc()
17058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
17068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ctx_item == NULL)
17078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
17088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[100];
17108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char reply[100];
17118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t reply_len;
17128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int peer_type = ctx_item->data(peer_role_type).toInt();
17148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (peer_type == PEER_TYPE_WPS_ER_ENROLLEE) {
17158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		snprintf(cmd, sizeof(cmd), "WPS_ER_PBC %s",
17167a53dbb56693ee9f55c0cab1a8297436511e8613Dmitry Shmidt			 ctx_item->data(peer_role_uuid).toString().toLocal8Bit().
17178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			 constData());
17188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (peer_type == PEER_TYPE_P2P ||
17198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		   peer_type == PEER_TYPE_P2P_CLIENT) {
17208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		snprintf(cmd, sizeof(cmd), "P2P_CONNECT %s pbc",
17218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			 ctx_item->data(peer_role_address).toString().
17227a53dbb56693ee9f55c0cab1a8297436511e8613Dmitry Shmidt			 toLocal8Bit().constData());
17238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
17248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		snprintf(cmd, sizeof(cmd), "WPS_PBC");
17258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
17268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply_len = sizeof(reply) - 1;
17278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpagui->ctrlRequest(cmd, reply, &reply_len) < 0) {
17288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QMessageBox msg;
17298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		msg.setIcon(QMessageBox::Warning);
17308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		msg.setText(tr("Failed to start WPS PBC."));
17318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		msg.exec();
17328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
17338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
17348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid Peers::learn_ap_config()
17378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
17388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ctx_item == NULL)
17398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
17408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	QString uuid = ctx_item->data(peer_role_uuid).toString();
17428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	StringQuery input(tr("AP PIN:"));
17448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	input.setWindowTitle(tr("AP PIN for ") + ctx_item->text());
17458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (input.exec() != QDialog::Accepted)
17468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
17478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[100];
17498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char reply[100];
17508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t reply_len;
17518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	snprintf(cmd, sizeof(cmd), "WPS_ER_LEARN %s %s",
17537a53dbb56693ee9f55c0cab1a8297436511e8613Dmitry Shmidt		 uuid.toLocal8Bit().constData(),
17547a53dbb56693ee9f55c0cab1a8297436511e8613Dmitry Shmidt		 input.get_string().toLocal8Bit().constData());
17558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply_len = sizeof(reply) - 1;
17568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpagui->ctrlRequest(cmd, reply, &reply_len) < 0) {
17578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QMessageBox msg;
17588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		msg.setIcon(QMessageBox::Warning);
17598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		msg.setText(tr("Failed to start learning AP configuration."));
17608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		msg.exec();
17618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
17628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
17638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid Peers::ctx_hide_ap()
17668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
17678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	hide_ap = true;
17688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (model.rowCount() == 0)
17708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
17718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	do {
17738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QModelIndexList lst;
17748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		lst = model.match(model.index(0, 0),
17758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  peer_role_type, PEER_TYPE_AP);
17768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (lst.size() == 0) {
17778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			lst = model.match(model.index(0, 0),
17788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  peer_role_type, PEER_TYPE_AP_WPS);
17798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (lst.size() == 0)
17808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				break;
17818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
17828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		model.removeRow(lst[0].row());
17848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} while (1);
17858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
17868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid Peers::ctx_show_ap()
17898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
17908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	hide_ap = false;
17918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	add_scan_results();
17928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
17938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid Peers::ctx_p2p_show_passphrase()
17968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
17978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char reply[64];
17988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t reply_len;
17998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	reply_len = sizeof(reply) - 1;
18018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpagui->ctrlRequest("P2P_GET_PASSPHRASE", reply, &reply_len) < 0 ||
18028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	    memcmp(reply, "FAIL", 4) == 0) {
18038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QMessageBox msg;
18048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		msg.setIcon(QMessageBox::Warning);
18058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		msg.setText("Failed to get P2P group passphrase.");
18068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		msg.exec();
18078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
18088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		reply[reply_len] = '\0';
18098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QMessageBox::information(this, tr("Passphrase"),
18108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 tr("P2P group passphrase:\n") +
18118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 reply);
18128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
18138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
18148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid Peers::ctx_p2p_start_persistent()
18178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
18188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ctx_item == NULL)
18198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
18208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[100];
18228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char reply[100];
18238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t reply_len;
18248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	snprintf(cmd, sizeof(cmd), "P2P_GROUP_ADD persistent=%d",
18268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		 ctx_item->data(peer_role_network_id).toInt());
18278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpagui->ctrlRequest(cmd, reply, &reply_len) < 0 ||
18288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	    memcmp(reply, "FAIL", 4) == 0) {
18298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QMessageBox msg;
18308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		msg.setIcon(QMessageBox::Warning);
18318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		msg.setText(tr("Failed to start persistent P2P Group."));
18328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		msg.exec();
18338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (ctx_item->data(peer_role_type).toInt() ==
18348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		   PEER_TYPE_P2P_INVITATION)
18358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		model.removeRow(ctx_item->row());
18368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
18378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid Peers::ctx_p2p_invite()
18408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
18418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ctx_item == NULL)
18428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
18438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[100];
18458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char reply[100];
18468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t reply_len;
18478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	snprintf(cmd, sizeof(cmd), "P2P_INVITE persistent=%d",
18498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		 ctx_item->data(peer_role_network_id).toInt());
18508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpagui->ctrlRequest(cmd, reply, &reply_len) < 0 ||
18518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	    memcmp(reply, "FAIL", 4) == 0) {
18528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QMessageBox msg;
18538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		msg.setIcon(QMessageBox::Warning);
18548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		msg.setText(tr("Failed to invite peer to start persistent "
18558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			       "P2P Group."));
18568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		msg.exec();
18578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
18588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
18598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid Peers::ctx_p2p_delete()
18628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
18638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ctx_item == NULL)
18648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
18658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	model.removeRow(ctx_item->row());
18668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
18678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid Peers::enable_persistent(int id)
18708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
18718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (model.rowCount() == 0)
18728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
18738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	QModelIndexList lst = model.match(model.index(0, 0),
18758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  peer_role_network_id, id);
18768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (int i = 0; i < lst.size(); i++) {
18778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		QStandardItem *item = model.itemFromIndex(lst[i]);
18788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		int type = item->data(peer_role_type).toInt();
18798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (type == PEER_TYPE_P2P_PERSISTENT_GROUP_GO ||
18808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    type == PEER_TYPE_P2P_PERSISTENT_GROUP_CLIENT)
18818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			item->setBackground(Qt::NoBrush);
18828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
18838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1884