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