/*************************************************************************** * This file is part of netctl-gui * * * * netctl-gui is free software: you can redistribute it and/or * * modify it under the terms of the GNU General Public License as * * published by the Free Software Foundation, either version 3 of the * * License, or (at your option) any later version. * * * * netctl-gui is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with netctl-gui. If not, see http://www.gnu.org/licenses/ * ***************************************************************************/ #include "wirelesswidget.h" #include "ui_wirelesswidget.h" #include #include #include WirelessWidget::WirelessWidget(QWidget *parent, const QMap settings) : QWidget(parent), ui(new Ui::WirelessWidget) { ui->setupUi(this); rfkillDirectory = new QDir(settings[QString("RFKILL_DIR")]); createActions(); clear(); } WirelessWidget::~WirelessWidget() { delete rfkillDirectory; delete ui; } void WirelessWidget::clear() { ui->comboBox_security->setCurrentIndex(0); changeSecurity(ui->comboBox_security->currentText()); ui->lineEdit_essid->clear(); ui->lineEdit_wpaConfigSection->clear(); ui->listWidget_wpaConfigSection->setCurrentRow(-1); ui->listWidget_wpaConfigSection->clear(); ui->lineEdit_wpaConfig->setText(QString("/etc/wpa_supplicant.conf")); ui->lineEdit_key->clear(); ui->checkBox_hidden->setCheckState(Qt::Unchecked); ui->checkBox_adhoc->setCheckState(Qt::Unchecked); ui->spinBox_freq->setValue(2412); ui->listWidget_freq->setCurrentRow(-1); ui->listWidget_freq->clear(); ui->spinBox_frequency->setValue(2000); ui->spinBox_priority->setValue(0); ui->lineEdit_country->clear(); ui->lineEdit_wpaGroup->setText(QString("wheel")); ui->comboBox_drivers->setCurrentIndex(0); ui->listWidget_drivers->setCurrentRow(-1); ui->listWidget_drivers->clear(); ui->comboBox_rfkill->clear(); ui->comboBox_rfkill->addItem(QString("auto")); if (rfkillDirectory->exists()) { QStringList rfkillDevices = rfkillDirectory->entryList(QDir::Dirs | QDir::NoDotAndDotDot); for (int i=0; iabsolutePath() + QDir::separator() + rfkillDevices[i] + QDir::separator() + QString("name")); QString deviceName; if (device.open(QIODevice::ReadOnly)) deviceName = QString(device.readLine()).trimmed(); ui->comboBox_rfkill->addItem(deviceName); } } ui->comboBox_rfkill->setCurrentIndex(0); ui->spinBox_timeoutWpa->setValue(15); ui->checkBox_exclude->setCheckState(Qt::Unchecked); ui->pushButton_wirelessAdvanced->setChecked(false); showAdvanced(); } void WirelessWidget::setShown(const bool state) { if (state) show(); else hide(); } void WirelessWidget::createActions() { connect(ui->pushButton_wirelessAdvanced, SIGNAL(clicked(bool)), this, SLOT(showAdvanced())); connect(ui->pushButton_drivers, SIGNAL(clicked(bool)), this, SLOT(addDriver())); connect(ui->pushButton_freq, SIGNAL(clicked(bool)), this, SLOT(addFreq())); connect(ui->pushButton_wpaConfigSection, SIGNAL(clicked(bool)), this, SLOT(addOption())); connect(ui->pushButton_wpaConfig, SIGNAL(clicked(bool)), this, SLOT(selectWpaConfig())); connect(ui->comboBox_security, SIGNAL(currentIndexChanged(QString)), this, SLOT(changeSecurity(QString))); } void WirelessWidget::keyPressEvent(QKeyEvent *pressedKey) { if (pressedKey->key() == Qt::Key_Delete) { if (ui->listWidget_wpaConfigSection->hasFocus() && (ui->listWidget_wpaConfigSection->currentItem() != 0)) delete ui->listWidget_wpaConfigSection->currentItem(); else if (ui->listWidget_freq->hasFocus() && (ui->listWidget_freq->currentItem() != 0)) delete ui->listWidget_freq->currentItem(); else if (ui->listWidget_drivers->hasFocus() && (ui->listWidget_drivers->currentItem() != 0)) delete ui->listWidget_drivers->currentItem(); } } void WirelessWidget::addDriver() { QString driver = ui->comboBox_drivers->currentText(); bool exists = false; for (int i=0; ilistWidget_drivers->count(); i++) if (ui->listWidget_drivers->item(i)->text() == driver) exists = true; if (!exists) ui->listWidget_drivers->addItem(driver); } void WirelessWidget::addFreq() { QString freq = QString::number(ui->spinBox_freq->value()); bool exists = false; for (int i=0; ilistWidget_freq->count(); i++) if (ui->listWidget_freq->item(i)->text() == freq) exists = true; if (!exists) ui->listWidget_freq->addItem(freq); } void WirelessWidget::addOption() { if (!ui->lineEdit_wpaConfigSection->text().isEmpty()) ui->listWidget_wpaConfigSection->addItem(ui->lineEdit_wpaConfigSection->text()); } void WirelessWidget::changeSecurity(const QString currentText) { if (currentText == QString("none")) { ui->widget_essid->setHidden(false); ui->widget_wpaConfigSection->setHidden(true); ui->widget_wpaConfig->setHidden(true); ui->widget_key->setHidden(true); } else if ((currentText == QString("wep")) || (currentText == QString("wpa"))) { ui->widget_essid->setHidden(false); ui->widget_wpaConfigSection->setHidden(true); ui->widget_wpaConfig->setHidden(true); ui->widget_key->setHidden(false); } else if (currentText == QString("wpa-configsection")) { ui->widget_essid->setHidden(true); ui->widget_wpaConfigSection->setHidden(false); ui->widget_wpaConfig->setHidden(true); ui->widget_key->setHidden(true); } else if (currentText == QString("wpa-config")) { ui->widget_essid->setHidden(true); ui->widget_wpaConfigSection->setHidden(true); ui->widget_wpaConfig->setHidden(false); ui->widget_key->setHidden(true); } } void WirelessWidget::selectWpaConfig() { QString filename = QFileDialog::getOpenFileName( this, QApplication::translate("EthernetWidget", "Select wpa configuration file"), QDir::currentPath(), QApplication::translate("EthernetWidget", "Configuration files (*.conf)")); if (!filename.isEmpty()) ui->lineEdit_wpaConfig->setText(filename); } void WirelessWidget::showAdvanced() { if (ui->pushButton_wirelessAdvanced->isChecked()) { ui->widget_wirelessAdvanced->setHidden(false); ui->pushButton_wirelessAdvanced->setText(QApplication::translate("WirelessWidget", "Hide advanced")); } else { ui->widget_wirelessAdvanced->setHidden(true); ui->pushButton_wirelessAdvanced->setText(QApplication::translate("WirelessWidget", "Show advanced")); } } QMap WirelessWidget::getSettings() { QMap wirelessSettings; if (isOk() != 0) return wirelessSettings; wirelessSettings[QString("Security")] = ui->comboBox_security->currentText(); wirelessSettings[QString("ESSID")] = QString("'") + ui->lineEdit_essid->text() + QString("'"); if (ui->comboBox_security->currentText() == QString("wep")) { if (ui->lineEdit_key->text().indexOf(QString("\\\"")) == 0) wirelessSettings[QString("Key")] = ui->lineEdit_key->text(); else wirelessSettings[QString("Key")] = QString("'") + ui->lineEdit_key->text() + QString("'"); } else if (ui->comboBox_security->currentText() == QString("wpa")) wirelessSettings[QString("Key")] = QString("'") + ui->lineEdit_key->text() + QString("'"); if (ui->comboBox_security->currentText() == QString("wpa-configsection")) { QStringList section; for (int i=0; ilistWidget_wpaConfigSection->count(); i++) section.append(QString("'") + ui->listWidget_wpaConfigSection->item(i)->text() + QString("'")); wirelessSettings[QString("WPAConfigSection")] = QString("\n") + section.join(QChar('\n')) + QString("\n"); } if (ui->comboBox_security->currentText() == QString("wpa-config")) wirelessSettings[QString("WPAConfigFile")] = QString("'") + ui->lineEdit_wpaConfig->text() + QString("'"); if (ui->checkBox_hidden->checkState() == Qt::Checked) wirelessSettings[QString("Hidden")] = QString("yes"); if (ui->checkBox_adhoc->checkState() == Qt::Checked) wirelessSettings[QString("AdHoc")] = QString("yes"); if (ui->listWidget_freq->count() != 0) { QStringList freqs; for (int i=0; ilistWidget_freq->count(); i++) freqs.append(ui->listWidget_freq->item(i)->text()); wirelessSettings[QString("ScanFrequencies")] = freqs.join(QChar(' ')); } if (ui->spinBox_frequency->value() != 2000) wirelessSettings[QString("Frequency")] = QString::number(ui->spinBox_frequency->value()); if (ui->spinBox_priority->value() != 0) wirelessSettings[QString("Priority")] = QString::number(ui->spinBox_priority->value()); if (!ui->lineEdit_country->text().isEmpty()) wirelessSettings[QString("Country")] = QString("'") + ui->lineEdit_country->text() + QString("'"); if (ui->lineEdit_wpaGroup->text() != QString("wheel")) wirelessSettings[QString("WPAGroup")] = QString("'") + ui->lineEdit_wpaGroup->text() + QString("'"); if (ui->listWidget_drivers->count() != 0) { QStringList drivers; for (int i=0; ilistWidget_drivers->count(); i++) drivers.append(ui->listWidget_drivers->item(i)->text()); wirelessSettings[QString("WPADriver")] = QString("'") + drivers.join(QChar(',')) + QString("'"); } if (ui->comboBox_rfkill->currentText() != QString("auto")) wirelessSettings[QString("RFKill")] = ui->comboBox_rfkill->currentText(); if (ui->spinBox_timeoutWpa->value() != 15) wirelessSettings[QString("TimeoutWPA")] = QString::number(ui->spinBox_timeoutWpa->value()); if (ui->checkBox_exclude->checkState() == Qt::Checked) wirelessSettings[QString("ExcludeAuto")] = QString("yes"); return wirelessSettings; } int WirelessWidget::isOk() { // empty key if ((ui->comboBox_security->currentText() == QString("wep")) || (ui->comboBox_security->currentText() == QString("wpa"))) if (ui->lineEdit_key->text().isEmpty()) return 1; // empty settings if (ui->comboBox_security->currentText() == QString("wpa-configsection")) if (ui->listWidget_wpaConfigSection->count() == 0) return 2; // file is not set if (ui->comboBox_security->currentText() == QString("wpa-config")) if (ui->lineEdit_wpaConfig->text().isEmpty()) return 3; // file wpa_supplicant doesn't exists if (ui->comboBox_security->currentText() == QString("wpa-config")) if (!QFile(ui->lineEdit_wpaConfig->text()).exists()) return 4; // essid is not set if ((ui->comboBox_security->currentText() == QString("none")) || (ui->comboBox_security->currentText() == QString("wep")) || (ui->comboBox_security->currentText() == QString("wpa"))) if (ui->lineEdit_essid->text().isEmpty()) return 5; // all fine return 0; } void WirelessWidget::setSettings(const QMap settings) { clear(); QMap wirelessSettings = settings; if (wirelessSettings.contains(QString("Security"))) for (int i=0; icomboBox_security->count(); i++) if (wirelessSettings[QString("Security")] == ui->comboBox_security->itemText(i)) ui->comboBox_security->setCurrentIndex(i); if (wirelessSettings.contains(QString("ESSID"))) ui->lineEdit_essid->setText(wirelessSettings[QString("ESSID")]); if (wirelessSettings.contains(QString("Key"))) { // workaround for wireless-wep example if (wirelessSettings.contains(QString("Security"))) if ((wirelessSettings[QString("Security")] == QString("wep")) && (wirelessSettings[QString("Key")][0] == QChar('"'))) wirelessSettings[QString("Key")] = QChar('\\') + wirelessSettings[QString("Key")]; ui->lineEdit_key->setText(wirelessSettings[QString("Key")]); } if (wirelessSettings.contains(QString("WPAConfigSection"))) ui->listWidget_wpaConfigSection->addItems(wirelessSettings[QString("WPAConfigSection")].split(QChar('\n'))); if (wirelessSettings.contains(QString("WPAConfigFile"))) ui->lineEdit_wpaConfig->setText(wirelessSettings[QString("WPAConfigFile")]); if (wirelessSettings.contains(QString("Hidden"))) if (wirelessSettings[QString("Hidden")] == QString("yes")) ui->checkBox_hidden->setCheckState(Qt::Checked); if (wirelessSettings.contains(QString("AdHoc"))) if (wirelessSettings[QString("AdHoc")] == QString("yes")) ui->checkBox_adhoc->setCheckState(Qt::Checked); if (wirelessSettings.contains(QString("ScanFrequencies"))) ui->listWidget_freq->addItems(wirelessSettings[QString("ScanFrequencies")].split(QChar('\n'))); if (wirelessSettings.contains(QString("Frequency"))) ui->spinBox_frequency->setValue(wirelessSettings[QString("Frequency")].toInt()); if (wirelessSettings.contains(QString("Priority"))) ui->spinBox_priority->setValue(wirelessSettings[QString("Priority")].toInt()); if (wirelessSettings.contains(QString("Country"))) ui->lineEdit_country->setText(wirelessSettings[QString("Country")]); if (wirelessSettings.contains(QString("WPAGroup"))) ui->lineEdit_wpaGroup->setText(wirelessSettings[QString("WPAGroup")]); if (wirelessSettings.contains(QString("WPADriver"))) ui->listWidget_drivers->addItems(wirelessSettings[QString("WPADriver")].split(QChar(','))); if (wirelessSettings.contains(QString("RFKill"))) for (int i=0; icomboBox_rfkill->count(); i++) if (wirelessSettings[QString("RFKill")] == ui->comboBox_rfkill->itemText(i)) ui->comboBox_rfkill->setCurrentIndex(i); if (wirelessSettings.contains(QString("TimeoutWPA"))) ui->spinBox_timeoutWpa->setValue(wirelessSettings[QString("TimeoutWPA")].toInt()); if (wirelessSettings.contains(QString("ExcludeAuto"))) if (wirelessSettings[QString("ExcludeAuto")] == QString("yes")) ui->checkBox_exclude->setCheckState(Qt::Checked); changeSecurity(ui->comboBox_security->currentText()); }