diff options
author | A. Wilcox <AWilcox@Wilcox-Tech.com> | 2019-11-10 03:54:10 -0600 |
---|---|---|
committer | A. Wilcox <AWilcox@Wilcox-Tech.com> | 2019-11-10 03:54:10 -0600 |
commit | 7fe9e61230de11feb2698443105ecb57f4709c23 (patch) | |
tree | d9df0036e8e0e409ed044592ba514e4bc8a1e702 /ui/qt5/networkifacepage.cc | |
parent | d295d6ebbb87bdfe57eb9d398f6758eaf6bc0715 (diff) | |
download | horizon-7fe9e61230de11feb2698443105ecb57f4709c23.tar.gz horizon-7fe9e61230de11feb2698443105ecb57f4709c23.tar.bz2 horizon-7fe9e61230de11feb2698443105ecb57f4709c23.tar.xz horizon-7fe9e61230de11feb2698443105ecb57f4709c23.zip |
Qt UI: Finish implementing UI.Network.ChooseIface and add help doc
Diffstat (limited to 'ui/qt5/networkifacepage.cc')
-rw-r--r-- | ui/qt5/networkifacepage.cc | 70 |
1 files changed, 63 insertions, 7 deletions
diff --git a/ui/qt5/networkifacepage.cc b/ui/qt5/networkifacepage.cc index d8a9655..323bbe2 100644 --- a/ui/qt5/networkifacepage.cc +++ b/ui/qt5/networkifacepage.cc @@ -13,27 +13,45 @@ #include "networkifacepage.hh" #include "horizonwizard.hh" +#ifdef HAS_INSTALL_ENV +# include <net/if.h> /* ifreq */ +# include <sys/ioctl.h> /* ioctl */ +# include <unistd.h> /* close */ +#endif + +#include <algorithm> +#include <QDebug> #include <QLabel> #include <QListView> -#include <QListWidget> #include <QVBoxLayout> NetworkIfacePage::NetworkIfacePage(QWidget *parent) : HorizonWizardPage(parent) { loadWatermark("network"); setTitle(tr("Multiple Network Interfaces Detected")); + + ifaceList = new QListWidget(this); + connect(ifaceList, &QListWidget::currentRowChanged, [=](int row) { + emit completeChanged(); + if(row == -1) return; + auto iterator = horizonWizard()->interfaces.begin(); + std::advance(iterator, row); + horizonWizard()->chosen_auto_iface = iterator->first; + }); + + ifaceList->setGridSize(QSize(160, 128)); + ifaceList->setIconSize(QSize(96, 96)); + ifaceList->setViewMode(QListView::IconMode); } void NetworkIfacePage::initializePage() { QLabel *descLabel; - QListWidget *ifaceList; QVBoxLayout *layout; descLabel = new QLabel(tr( "Your computer has more than one network interface device. Select the one you wish to use during installation.")); descLabel->setWordWrap(true); - ifaceList = new QListWidget(this); for(auto &iface : horizonWizard()->interfaces) { QIcon ifaceIcon; QString ifaceDevName = QString::fromStdString(iface.first); @@ -58,14 +76,52 @@ void NetworkIfacePage::initializePage() { break; } - new QListWidgetItem(ifaceIcon, ifaceName, ifaceList); + QListWidgetItem *item = new QListWidgetItem(ifaceIcon, ifaceName, + ifaceList); + /* Retrieving the index is always valid, and is not even privileged. */ + struct ifreq request; + int my_sock = ::socket(AF_INET, SOCK_STREAM, 0); + if(my_sock == -1) { + continue; + } + memset(&request, 0, sizeof(request)); + memcpy(&request.ifr_name, iface.first.c_str(), iface.first.size()); + errno = 0; + if(ioctl(my_sock, SIOCGIFHWADDR, &request) != -1) { + char *buf; + asprintf(&buf, "%02X:%02X:%02X:%02X:%02X:%02X", + request.ifr_ifru.ifru_hwaddr.sa_data[0], + request.ifr_ifru.ifru_hwaddr.sa_data[1], + request.ifr_ifru.ifru_hwaddr.sa_data[2], + request.ifr_ifru.ifru_hwaddr.sa_data[3], + request.ifr_ifru.ifru_hwaddr.sa_data[4], + request.ifr_ifru.ifru_hwaddr.sa_data[5]); + item->setToolTip(QString(buf)); + free(buf); + } + ::close(my_sock); } - ifaceList->setGridSize(QSize(160, 128)); - ifaceList->setIconSize(QSize(96, 96)); - ifaceList->setViewMode(QListView::IconMode); layout = new QVBoxLayout; layout->addWidget(descLabel); layout->addWidget(ifaceList); setLayout(layout); } + +bool NetworkIfacePage::isComplete() const { + return ifaceList->currentRow() != -1; +} + +int NetworkIfacePage::nextId() const { + if(ifaceList->currentRow() < 0) return HorizonWizard::Page_Network_Iface; + + auto iterator = horizonWizard()->interfaces.begin(); + std::advance(iterator, ifaceList->currentRow()); + + switch(iterator->second) { + case HorizonWizard::Wireless: + return HorizonWizard::Page_Network_Wireless; + default: + return HorizonWizard::Page_Network_DHCP; + } +} |