#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?)
{
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
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;
}
}
-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();
}
QStandardItem *item = new QStandardItem(*default_icon, name);
if (item) {
+ item->setData(QString(reply), peer_role_address);
item->setToolTip(info);
model.appendRow(item);
}
--- /dev/null
+/*
+ * wpa_gui - StringQuery class
+ * Copyright (c) 2009, Atheros Communications
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * Alternatively, this software may be distributed under the terms of BSD
+ * license.
+ *
+ * See README and COPYING for more details.
+ */
+
+#include <cstdio>
+#include <QLabel>
+
+#include "stringquery.h"
+
+
+StringQuery::StringQuery(QString label)
+{
+ edit = new QLineEdit;
+ edit->setFocus();
+ QGridLayout *layout = new QGridLayout;
+ layout->addWidget(new QLabel(label), 0, 0);
+ layout->addWidget(edit, 0, 1);
+ setLayout(layout);
+
+ connect(edit, SIGNAL(returnPressed()), this, SLOT(accept()));
+}
+
+
+QString StringQuery::get_string()
+{
+ return edit->text();
+}
--- /dev/null
+/*
+ * wpa_gui - StringQuery class
+ * Copyright (c) 2009, Atheros Communications
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * Alternatively, this software may be distributed under the terms of BSD
+ * license.
+ *
+ * See README and COPYING for more details.
+ */
+
+#ifndef STRINGQUERY_H
+#define STRINGQUERY_H
+
+#include <QDialog>
+#include <QLineEdit>
+#include <QGridLayout>
+
+class StringQuery : public QDialog
+{
+ Q_OBJECT
+
+public:
+ StringQuery(QString label);
+ QString get_string();
+
+private:
+ QLineEdit *edit;
+};
+
+#endif /* STRINGQUERY_H */