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