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