wpa_gui-qt4: Add scan results into the peer window
In addition, add a peer entry type for each peer entry. Currently, this is only stored as an integer and visible in the context menu. Eventually, different icons should be used based on this type.
This commit is contained in:
parent
acd8ba74c0
commit
b1078a4bfb
2 changed files with 115 additions and 8 deletions
|
@ -22,6 +22,7 @@
|
|||
|
||||
|
||||
static const int peer_role_address = Qt::UserRole + 1;
|
||||
static const int peer_role_type = Qt::UserRole + 2;
|
||||
|
||||
/*
|
||||
* TODO:
|
||||
|
@ -30,6 +31,13 @@ static const int peer_role_address = Qt::UserRole + 1;
|
|||
* - different icons to indicate peer type
|
||||
*/
|
||||
|
||||
enum peer_type {
|
||||
PEER_TYPE_ASSOCIATED_STATION,
|
||||
PEER_TYPE_AP,
|
||||
PEER_TYPE_AP_WPS,
|
||||
};
|
||||
|
||||
|
||||
Peers::Peers(QWidget *parent, const char *, bool, Qt::WFlags)
|
||||
: QDialog(parent)
|
||||
{
|
||||
|
@ -79,9 +87,29 @@ void Peers::context_menu(const QPoint &pos)
|
|||
QModelIndex idx = peers->indexAt(pos);
|
||||
if (idx.isValid()) {
|
||||
ctx_item = model.itemFromIndex(idx);
|
||||
/* TODO: only for peers that are requesting WPS PIN method */
|
||||
int type = ctx_item->data(peer_role_type).toInt();
|
||||
QString title;
|
||||
switch (type) {
|
||||
case PEER_TYPE_ASSOCIATED_STATION:
|
||||
title = tr("Associated station");
|
||||
break;
|
||||
case PEER_TYPE_AP:
|
||||
title = tr("AP");
|
||||
break;
|
||||
case PEER_TYPE_AP_WPS:
|
||||
title = tr("WPS AP");
|
||||
break;
|
||||
}
|
||||
menu->addAction(title)->setEnabled(false);
|
||||
menu->addSeparator();
|
||||
|
||||
if (type == PEER_TYPE_ASSOCIATED_STATION ||
|
||||
type == PEER_TYPE_AP_WPS) {
|
||||
/* TODO: only for peers that are requesting WPS PIN
|
||||
* method */
|
||||
menu->addAction(QString("Enter WPS PIN"), this,
|
||||
SLOT(enter_pin()));
|
||||
}
|
||||
} else {
|
||||
ctx_item = NULL;
|
||||
menu->addAction(QString("Refresh"), this, SLOT(ctx_refresh()));
|
||||
|
@ -123,17 +151,13 @@ void Peers::ctx_refresh()
|
|||
}
|
||||
|
||||
|
||||
void Peers::update_peers()
|
||||
void Peers::add_stations()
|
||||
{
|
||||
char reply[2048];
|
||||
size_t reply_len;
|
||||
char cmd[20];
|
||||
int res;
|
||||
|
||||
model.clear();
|
||||
if (wpagui == NULL)
|
||||
return;
|
||||
|
||||
reply_len = sizeof(reply) - 1;
|
||||
if (wpagui->ctrlRequest("STA-FIRST", reply, &reply_len) < 0)
|
||||
return;
|
||||
|
@ -168,6 +192,8 @@ void Peers::update_peers()
|
|||
QStandardItem *item = new QStandardItem(*default_icon, name);
|
||||
if (item) {
|
||||
item->setData(QString(reply), peer_role_address);
|
||||
item->setData(PEER_TYPE_ASSOCIATED_STATION,
|
||||
peer_role_type);
|
||||
item->setToolTip(info);
|
||||
model.appendRow(item);
|
||||
}
|
||||
|
@ -177,3 +203,82 @@ void Peers::update_peers()
|
|||
res = wpagui->ctrlRequest(cmd, reply, &reply_len);
|
||||
} while (res >= 0);
|
||||
}
|
||||
|
||||
|
||||
void Peers::add_scan_results()
|
||||
{
|
||||
char reply[2048];
|
||||
size_t reply_len;
|
||||
int index;
|
||||
char cmd[20];
|
||||
|
||||
index = 0;
|
||||
while (wpagui) {
|
||||
snprintf(cmd, sizeof(cmd), "BSS %d", index++);
|
||||
if (index > 1000)
|
||||
break;
|
||||
|
||||
reply_len = sizeof(reply) - 1;
|
||||
if (wpagui->ctrlRequest(cmd, reply, &reply_len) < 0)
|
||||
break;
|
||||
reply[reply_len] = '\0';
|
||||
|
||||
QString bss(reply);
|
||||
if (bss.isEmpty() || bss.startsWith("FAIL"))
|
||||
break;
|
||||
|
||||
QString ssid, bssid, flags, wps_name;
|
||||
|
||||
QStringList lines = bss.split(QRegExp("\\n"));
|
||||
for (QStringList::Iterator it = lines.begin();
|
||||
it != lines.end(); it++) {
|
||||
int pos = (*it).indexOf('=') + 1;
|
||||
if (pos < 1)
|
||||
continue;
|
||||
|
||||
if ((*it).startsWith("bssid="))
|
||||
bssid = (*it).mid(pos);
|
||||
else if ((*it).startsWith("flags="))
|
||||
flags = (*it).mid(pos);
|
||||
else if ((*it).startsWith("ssid="))
|
||||
ssid = (*it).mid(pos);
|
||||
else if ((*it).startsWith("wps_device_name="))
|
||||
wps_name = (*it).mid(pos);
|
||||
}
|
||||
|
||||
QString name = wps_name;
|
||||
if (name.isEmpty())
|
||||
name = ssid + "\n" + bssid;
|
||||
|
||||
QStandardItem *item = new QStandardItem(*default_icon, name);
|
||||
if (item) {
|
||||
item->setData(QString(reply), peer_role_address);
|
||||
if (flags.contains("[WPS]"))
|
||||
item->setData(PEER_TYPE_AP_WPS,
|
||||
peer_role_type);
|
||||
else
|
||||
item->setData(PEER_TYPE_AP, peer_role_type);
|
||||
|
||||
for (int i = 0; i < lines.size(); i++) {
|
||||
if (lines[i].length() > 60) {
|
||||
lines[i].remove(
|
||||
60, lines[i].length());
|
||||
lines[i] += "..";
|
||||
}
|
||||
}
|
||||
item->setToolTip(lines.join("\n"));
|
||||
model.appendRow(item);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void Peers::update_peers()
|
||||
{
|
||||
model.clear();
|
||||
if (wpagui == NULL)
|
||||
return;
|
||||
|
||||
add_stations();
|
||||
add_scan_results();
|
||||
}
|
||||
|
|
|
@ -40,6 +40,8 @@ protected slots:
|
|||
virtual void languageChange();
|
||||
|
||||
private:
|
||||
void add_stations();
|
||||
void add_scan_results();
|
||||
void update_peers();
|
||||
|
||||
WpaGui *wpagui;
|
||||
|
|
Loading…
Reference in a new issue