|
@@ -14,10 +14,15 @@
|
|
|
|
|
|
#include <cstdio>
|
|
|
#include <QImageReader>
|
|
|
+#include <QMessageBox>
|
|
|
|
|
|
#include "wpagui.h"
|
|
|
+#include "stringquery.h"
|
|
|
#include "peers.h"
|
|
|
|
|
|
+
|
|
|
+static const int peer_role_address = Qt::UserRole + 1;
|
|
|
+
|
|
|
/*
|
|
|
* TODO:
|
|
|
* - add pending WPS queries (from M1/PIN, PBC?)
|
|
@@ -30,9 +35,6 @@ Peers::Peers(QWidget *parent, const char *, bool, Qt::WFlags)
|
|
|
{
|
|
|
setupUi(this);
|
|
|
|
|
|
- connect(peers, SIGNAL(clicked(QModelIndex)), this,
|
|
|
- SLOT(clicked(QModelIndex)));
|
|
|
-
|
|
|
if (QImageReader::supportedImageFormats().contains(QByteArray("svg")))
|
|
|
default_icon = new QIcon(":/icons/wpa_gui.svg");
|
|
|
else
|
|
@@ -41,6 +43,10 @@ Peers::Peers(QWidget *parent, const char *, bool, Qt::WFlags)
|
|
|
peers->setModel(&model);
|
|
|
peers->setResizeMode(QListView::Adjust);
|
|
|
|
|
|
+ peers->setContextMenuPolicy(Qt::CustomContextMenu);
|
|
|
+ connect(peers, SIGNAL(customContextMenuRequested(const QPoint &)),
|
|
|
+ this, SLOT(context_menu(const QPoint &)));
|
|
|
+
|
|
|
wpagui = NULL;
|
|
|
}
|
|
|
|
|
@@ -64,11 +70,56 @@ void Peers::languageChange()
|
|
|
}
|
|
|
|
|
|
|
|
|
-void Peers::clicked(const QModelIndex & /*index*/)
|
|
|
+void Peers::context_menu(const QPoint &pos)
|
|
|
+{
|
|
|
+ QMenu *menu = new QMenu;
|
|
|
+ if (menu == NULL)
|
|
|
+ return;
|
|
|
+
|
|
|
+ QModelIndex idx = peers->indexAt(pos);
|
|
|
+ if (idx.isValid()) {
|
|
|
+ ctx_item = model.itemFromIndex(idx);
|
|
|
+ /* 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()));
|
|
|
+ }
|
|
|
+
|
|
|
+ menu->exec(peers->mapToGlobal(pos));
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+void Peers::enter_pin()
|
|
|
{
|
|
|
- /* QStandardItem *item = model.itemFromIndex(index); */
|
|
|
- /* TODO: give an option to provide PIN for WPS, etc. */
|
|
|
- /* printf("Clicked: %s\n", item->text().toAscii().constData()); */
|
|
|
+ if (ctx_item == NULL)
|
|
|
+ return;
|
|
|
+ QString addr = ctx_item->data(peer_role_address).toString();
|
|
|
+ StringQuery input(tr("PIN:"));
|
|
|
+ input.setWindowTitle(tr("PIN for ") + ctx_item->text());
|
|
|
+ if (input.exec() != QDialog::Accepted)
|
|
|
+ return;
|
|
|
+
|
|
|
+ char cmd[100];
|
|
|
+ char reply[100];
|
|
|
+ size_t reply_len;
|
|
|
+ snprintf(cmd, sizeof(cmd), "WPS_PIN %s %s",
|
|
|
+ addr.toAscii().constData(),
|
|
|
+ input.get_string().toAscii().constData());
|
|
|
+ reply_len = sizeof(reply) - 1;
|
|
|
+ if (wpagui->ctrlRequest(cmd, reply, &reply_len) < 0) {
|
|
|
+ QMessageBox msg;
|
|
|
+ msg.setIcon(QMessageBox::Warning);
|
|
|
+ msg.setText("Failed to set the WPS PIN.");
|
|
|
+ msg.exec();
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+void Peers::ctx_refresh()
|
|
|
+{
|
|
|
+ update_peers();
|
|
|
}
|
|
|
|
|
|
|
|
@@ -115,6 +166,7 @@ void Peers::update_peers()
|
|
|
|
|
|
QStandardItem *item = new QStandardItem(*default_icon, name);
|
|
|
if (item) {
|
|
|
+ item->setData(QString(reply), peer_role_address);
|
|
|
item->setToolTip(info);
|
|
|
model.appendRow(item);
|
|
|
}
|