summaryrefslogtreecommitdiff
path: root/ui/qt5/netsimplewifipage.cc
diff options
context:
space:
mode:
authorA. Wilcox <AWilcox@Wilcox-Tech.com>2019-11-15 20:35:06 -0600
committerA. Wilcox <AWilcox@Wilcox-Tech.com>2019-11-15 20:35:06 -0600
commit394668483428fa2c370fd27fa4e7ee2c1328ea24 (patch)
tree0accdcb60a10fcca1ceaa229b085c4aafe66e043 /ui/qt5/netsimplewifipage.cc
parenta59d3c853f2a6d287e39091dd2f1a2df2df95825 (diff)
downloadhorizon-394668483428fa2c370fd27fa4e7ee2c1328ea24.tar.gz
horizon-394668483428fa2c370fd27fa4e7ee2c1328ea24.tar.bz2
horizon-394668483428fa2c370fd27fa4e7ee2c1328ea24.tar.xz
horizon-394668483428fa2c370fd27fa4e7ee2c1328ea24.zip
Qt UI: Wi-Fi
Diffstat (limited to 'ui/qt5/netsimplewifipage.cc')
-rw-r--r--ui/qt5/netsimplewifipage.cc113
1 files changed, 111 insertions, 2 deletions
diff --git a/ui/qt5/netsimplewifipage.cc b/ui/qt5/netsimplewifipage.cc
index 3aef02f..b1286fa 100644
--- a/ui/qt5/netsimplewifipage.cc
+++ b/ui/qt5/netsimplewifipage.cc
@@ -11,10 +11,18 @@
*/
#include "netsimplewifipage.hh"
+#include "netdhcppage.hh"
-#include <bcnm/wpactrl.h>
+#include <assert.h>
#include <QVBoxLayout>
+#ifdef HAS_INSTALL_ENV
+int scanResults(wpactrl_t *control, char const *s, size_t len, void *page, tain_t *) {
+ NetworkSimpleWirelessPage *our_page = reinterpret_cast<NetworkSimpleWirelessPage *>(page);
+ return our_page->processScan(control, s, len);
+}
+#endif /* HAS_INSTALL_ENV */
+
NetworkSimpleWirelessPage::NetworkSimpleWirelessPage(QWidget *parent)
: HorizonWizardPage(parent) {
QVBoxLayout *layout;
@@ -25,11 +33,24 @@ NetworkSimpleWirelessPage::NetworkSimpleWirelessPage(QWidget *parent)
statusLabel = new QLabel(tr("Scanning for networks..."));
rescanButton = new QPushButton(tr("&Rescan Networks"));
- rescanButton->setEnabled(false);
connect(rescanButton, &QPushButton::clicked, [=](void) { doScan(); });
+#ifdef HAS_INSTALL_ENV
+ tain_now_g();
+ if(!wpactrl_start_g(&control, "/var/run/wpa_supplicant", 2000)) {
+ rescanButton->setEnabled(false);
+ statusLabel->setText(tr("Couldn't communicate with wireless subsystem."));
+ }
+ notify = nullptr;
+#endif /* HAS_INSTALL_ENV */
+
ssidListView = new QListWidget;
+ exchange_item = {
+ .filter = "CTRL-EVENT-SCAN-RESULTS",
+ .cb = &scanResults
+ };
+
passphrase = new QLineEdit(this);
passphrase->setEchoMode(QLineEdit::Password);
passphrase->setPlaceholderText(tr("Passphrase"));
@@ -45,15 +66,103 @@ NetworkSimpleWirelessPage::NetworkSimpleWirelessPage(QWidget *parent)
setLayout(layout);
}
+NetworkSimpleWirelessPage::~NetworkSimpleWirelessPage() {
+#ifdef HAS_INSTALL_ENV
+ wpactrl_end(&control);
+#endif /* HAS_INSTALL_ENV */
+}
+
+void NetworkSimpleWirelessPage::scanDone(QString message) {
+ rescanButton->setEnabled(true);
+ statusLabel->setText(message);
+}
+
void NetworkSimpleWirelessPage::doScan() {
+#ifdef HAS_INSTALL_ENV
ssidListView->clear();
rescanButton->setEnabled(false);
+ statusLabel->setText(tr("Scanning for networks..."));
+
+ tain_t deadline;
+ wparesponse_t response;
+
+ response = wpactrl_command_g(&control, "SCAN");
+ if(response != WPA_OK && response != WPA_FAILBUSY) {
+ scanDone(tr("Couldn't scan for wireless networks."));
+ return;
+ }
+
+ tain_from_millisecs(&deadline, 15000);
+ tain_add_g(&deadline, &deadline);
+ wpactrl_xchg_init(&exchange, &exchange_item, 1, &deadline, this);
+ if(!wpactrl_xchg_start(&control, &exchange)) {
+ scanDone(tr("Failed to scan for wireless networks."));
+ return;
+ }
+
+ if(notify != nullptr) {
+ notify->deleteLater();
+ notify = nullptr;
+ }
+
+ notify = new QSocketNotifier(wpactrl_fd(&control), QSocketNotifier::Read, this);
+ connect(notify, &QSocketNotifier::activated, [=](int) {
+ QString status;
+
+ if(wpactrl_xchg_timeout_g(&control, &exchange)) {
+ status = tr("Network scan timed out.");
+ } else {
+ if(wpactrl_update(&control) < 0) {
+ status = tr("Issue communicating with wireless subsystem.");
+ } else {
+ int code = wpactrl_xchg_event_g(&control, &exchange);
+ if(code < 0) {
+ status = tr("Issue processing scanned networks.");
+ } else if(code == 0) {
+ /* Not finished yet, so don't do anything. */
+ return;
+ } else {
+ status = tr("Scan successful.");
+ }
+ }
+ }
+ notify->setEnabled(false);
+ notify->deleteLater();
+ notify = nullptr;
+ statusLabel->setText(status);
+ return;
+ });
+ notify->setEnabled(true);
+#endif /* HAS_INSTALL_ENV */
}
void NetworkSimpleWirelessPage::initializePage() {
doScan();
}
+bool NetworkSimpleWirelessPage::isComplete() const {
+ return (ssidListView->currentRow() != -1);
+}
+
int NetworkSimpleWirelessPage::nextId() const {
return HorizonWizard::Page_Network_DHCP;
}
+
+#ifdef HAS_INSTALL_ENV
+int NetworkSimpleWirelessPage::processScan(wpactrl_t *c, const char *s, size_t len) {
+ assert(c == &control);
+ QString network(s);
+ ssidListView->addItem(network);
+ return 0;
+}
+#endif /* HAS_INSTALL_ENV */
+
+bool NetworkSimpleWirelessPage::validatePage() {
+ /* What a hack!
+ *
+ * Independent Pages means the DHCP page is never cleaned, even when Back
+ * is chosen. So, we have to do it from here. */
+ horizonWizard()->removePage(HorizonWizard::Page_Network_DHCP);
+ horizonWizard()->setPage(HorizonWizard::Page_Network_DHCP, new NetDHCPPage);
+ return true;
+}