/*************************************************************************** * 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 "mainwindow.h" #include "ui_mainwindow.h" #include #include #include #include #include #include #include #include "aboutwindow.h" #include "bridgewidget.h" #include "errorwindow.h" #include "ethernetwidget.h" #include "generalwidget.h" #include "ipwidget.h" #include "macvlanwidget.h" #include "mobilewidget.h" #include "netctlautowindow.h" #include "passwdwidget.h" #include "pppoewidget.h" #include "settingswindow.h" #include "tunnelwidget.h" #include "tuntapwidget.h" #include "vlanwidget.h" #include "wirelesswidget.h" MainWindow::MainWindow(QWidget *parent, const bool showAbout, const bool showNetctlAuto, const bool showSettings, const QString selectEssid, const QString openProfile, const QString selectProfile, const QString configPath, const bool debugCmd, const bool defaultSettings, const QString options, const int tabNum) : QMainWindow(parent), ui(new Ui::MainWindow), debug(debugCmd) { if (debug) qDebug() << "[MainWindow]" << "[MainWindow]" << ":" << "showAbout" << showAbout; if (debug) qDebug() << "[MainWindow]" << "[MainWindow]" << ":" << "showNetctlAuto" << showNetctlAuto; if (debug) qDebug() << "[MainWindow]" << "[MainWindow]" << ":" << "showSettings" << showSettings; if (debug) qDebug() << "[MainWindow]" << "[MainWindow]" << ":" << "selectEssid" << selectEssid; if (debug) qDebug() << "[MainWindow]" << "[MainWindow]" << ":" << "openProfile" << openProfile; if (debug) qDebug() << "[MainWindow]" << "[MainWindow]" << ":" << "selectProfile" << selectProfile; if (debug) qDebug() << "[MainWindow]" << "[MainWindow]" << ":" << "configPath" << configPath; if (debug) qDebug() << "[MainWindow]" << "[MainWindow]" << ":" << "debug" << debug; if (debug) qDebug() << "[MainWindow]" << "[MainWindow]" << ":" << "defaultSettings" << defaultSettings; if (debug) qDebug() << "[MainWindow]" << "[MainWindow]" << ":" << "options" << options; if (debug) qDebug() << "[MainWindow]" << "[MainWindow]" << ":" << "tabNum" << tabNum; // reading configuration settingsWin = new SettingsWindow(this, debug, configPath); if (defaultSettings) settingsWin->setDefault(); configuration = settingsWin->getSettings(); QMap optionsDict = parseOptions(options); for (int i=0; isetupUi(this); ui->tabWidget->setCurrentIndex(tabNum-1); aboutWin = new AboutWindow(this, debug); errorWin = new ErrorWindow(this, debug); netctlAutoWin = new NetctlAutoWindow(this, debug, configuration); // profile widgets generalWid = new GeneralWidget(this, configuration); ui->scrollAreaWidgetContents->layout()->addWidget(generalWid); ipWid = new IpWidget(this); ui->scrollAreaWidgetContents->layout()->addWidget(ipWid); bridgeWid = new BridgeWidget(this); ui->scrollAreaWidgetContents->layout()->addWidget(bridgeWid); ethernetWid = new EthernetWidget(this); ui->scrollAreaWidgetContents->layout()->addWidget(ethernetWid); macvlanWid = new MacvlanWidget(this); ui->scrollAreaWidgetContents->layout()->addWidget(macvlanWid); mobileWid = new MobileWidget(this); ui->scrollAreaWidgetContents->layout()->addWidget(mobileWid); pppoeWid = new PppoeWidget(this); ui->scrollAreaWidgetContents->layout()->addWidget(pppoeWid); tunnelWid = new TunnelWidget(this); ui->scrollAreaWidgetContents->layout()->addWidget(tunnelWid); tuntapWid = new TuntapWidget(this); ui->scrollAreaWidgetContents->layout()->addWidget(tuntapWid); vlanWid = new VlanWidget(this); ui->scrollAreaWidgetContents->layout()->addWidget(vlanWid); wirelessWid = new WirelessWidget(this, configuration); ui->scrollAreaWidgetContents->layout()->addWidget(wirelessWid); createActions(); setIconsToButtons(); updateTabs(ui->tabWidget->currentIndex()); if (showAbout) aboutWin->show(); if (showNetctlAuto) netctlAutoWin->showWindow(); if (showSettings) settingsWin->showWindow(); if (selectEssid != QString("ESSID")) { for (int i=0; itableWidget_wifi->rowCount(); i++) if (ui->tableWidget_wifi->item(i, 0)->text() == selectEssid) ui->tableWidget_wifi->setCurrentCell(i, 0); if (ui->tableWidget_wifi->currentItem() == 0) errorWin->showWindow(18, QString("[MainWindow] : [MainWindow]")); } else if (openProfile != QString("PROFILE")) { ui->comboBox_profile->addItem(openProfile); ui->comboBox_profile->setCurrentIndex(ui->comboBox_profile->count()-1); } else if (selectProfile != QString("PROFILE")) { for (int i=0; itableWidget_main->rowCount(); i++) if (ui->tableWidget_main->item(i, 0)->text() == selectProfile) ui->tableWidget_main->setCurrentCell(i, 0); if (ui->tableWidget_main->currentItem() == 0) errorWin->showWindow(17, QString("[MainWindow] : [MainWindow]")); } ui->statusBar->showMessage(QApplication::translate("MainWindow", "Ready")); } MainWindow::~MainWindow() { if (debug) qDebug() << "[MainWindow]" << "[~MainWindow]"; delete netctlCommand; delete netctlProfile; delete wpaCommand; delete bridgeWid; delete ethernetWid; delete generalWid; delete ipWid; delete macvlanWid; delete mobileWid; delete pppoeWid; delete tunnelWid; delete tuntapWid; delete vlanWid; delete wirelessWid; delete aboutWin; delete errorWin; delete netctlAutoWin; delete settingsWin; delete ui; } bool MainWindow::checkExternalApps(const QString apps = QString("all")) { if (debug) qDebug() << "[MainWindow]" << "[checkExternalApps]"; QStringList commandLine; commandLine.append("which"); commandLine.append(configuration[QString("SUDO_PATH")]); if ((apps == QString("netctl")) || (apps == QString("all"))) { commandLine.append(configuration[QString("NETCTL_PATH")]); commandLine.append(configuration[QString("NETCTLAUTO_PATH")]); } if ((apps == QString("systemctl")) || (apps == QString("all"))) { commandLine.append(configuration[QString("SYSTEMCTL_PATH")]); } if ((apps == QString("wpasup")) || (apps == QString("all"))) { commandLine.append(configuration[QString("WPACLI_PATH")]); commandLine.append(configuration[QString("WPASUP_PATH")]); } QProcess command; if (debug) qDebug() << "[MainWindow]" << "[checkExternalApps]" << ":" << "Run cmd" << commandLine.join(QChar(' ')); command.start(commandLine.join(QChar(' '))); command.waitForFinished(-1); if (debug) qDebug() << "[MainWindow]" << "[checkExternalApps]" << ":" << "Cmd returns" << command.exitCode(); if (command.exitCode() != 0) return false; else return true; } bool MainWindow::checkState(const QString state, const QString item) { if (debug) qDebug() << "[MainWindow]" << "[checkState]"; if (debug) qDebug() << "[MainWindow]" << "[checkState]" << ":" << "Text" << item; if (debug) qDebug() << "[MainWindow]" << "[checkState]" << ":" << "State" << state; if (item.contains(state)) return true; else return false; } // window signals void MainWindow::createActions() { if (debug) qDebug() << "[MainWindow]" << "[createActions]"; connect(ui->tabWidget, SIGNAL(currentChanged(int)), this, SLOT(updateTabs(int))); connect(ui->actionAbout, SIGNAL(triggered(bool)), aboutWin, SLOT(show())); connect(ui->actionNetctlAuto, SIGNAL(triggered(bool)), netctlAutoWin, SLOT(showWindow())); connect(ui->actionSettings, SIGNAL(triggered(bool)), settingsWin, SLOT(showWindow())); connect(ui->actionQuit, SIGNAL(triggered(bool)), this, SLOT(close())); // actions menu connect(ui->menuActions, SIGNAL(aboutToShow()), this, SLOT(updateMenu())); connect(ui->actionMainEdit, SIGNAL(triggered(bool)), this, SLOT(mainTabEditProfile())); connect(ui->actionMainEnable, SIGNAL(triggered(bool)), this, SLOT(mainTabEnableProfile())); connect(ui->actionMainRefresh, SIGNAL(triggered(bool)), this, SLOT(updateMainTab())); connect(ui->actionMainRemove, SIGNAL(triggered(bool)), this, SLOT(mainTabRemoveProfile())); connect(ui->actionMainRestart, SIGNAL(triggered(bool)), this, SLOT(mainTabRestartProfile())); connect(ui->actionMainStart, SIGNAL(triggered(bool)), this, SLOT(mainTabStartProfile())); connect(ui->actionProfileClear, SIGNAL(triggered(bool)), this, SLOT(profileTabClear())); connect(ui->actionProfileLoad, SIGNAL(triggered(bool)), this, SLOT(profileTabLoadProfile())); connect(ui->actionProfileRemove, SIGNAL(triggered(bool)), this, SLOT(profileTabRemoveProfile())); connect(ui->actionProfileSave, SIGNAL(triggered(bool)), this, SLOT(profileTabCreateProfile())); connect(ui->actionWifiRefresh, SIGNAL(triggered(bool)), this, SLOT(updateWifiTab())); connect(ui->actionWifiStart, SIGNAL(triggered(bool)), this, SLOT(wifiTabStart())); // main tab events connect(ui->pushButton_mainRefresh, SIGNAL(clicked(bool)), this, SLOT(updateMainTab())); connect(ui->pushButton_mainRestart, SIGNAL(clicked(bool)), this, SLOT(mainTabRestartProfile())); connect(ui->pushButton_mainStart, SIGNAL(clicked(bool)), this, SLOT(mainTabStartProfile())); connect(ui->pushButton_netctlAuto, SIGNAL(clicked(bool)), netctlAutoWin, SLOT(showWindow())); connect(ui->tableWidget_main, SIGNAL(itemActivated(QTableWidgetItem *)), this, SLOT(mainTabStartProfile())); connect(ui->tableWidget_main, SIGNAL(currentItemChanged(QTableWidgetItem *, QTableWidgetItem *)), this, SLOT(mainTabRefreshButtons(QTableWidgetItem *, QTableWidgetItem *))); connect(ui->tableWidget_main, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(mainTabContextualMenu(QPoint))); // profile tab events connect(ui->comboBox_profile, SIGNAL(currentIndexChanged(QString)), this, SLOT(profileTabLoadProfile())); connect(ui->pushButton_profileClear, SIGNAL(clicked(bool)), this, SLOT(profileTabClear())); connect(ui->pushButton_profileSave, SIGNAL(clicked(bool)), this, SLOT(profileTabCreateProfile())); connect(generalWid->connectionType, SIGNAL(currentIndexChanged(QString)), this, SLOT(profileTabChangeState(QString))); // wifi tab events connect(ui->pushButton_wifiRefresh, SIGNAL(clicked(bool)), this, SLOT(updateWifiTab())); connect(ui->pushButton_wifiStart, SIGNAL(clicked(bool)), this, SLOT(wifiTabStart())); connect(ui->tableWidget_wifi, SIGNAL(itemActivated(QTableWidgetItem *)), this, SLOT(wifiTabStart())); connect(ui->tableWidget_wifi, SIGNAL(currentItemChanged(QTableWidgetItem *, QTableWidgetItem *)), this, SLOT(wifiTabRefreshButtons(QTableWidgetItem *, QTableWidgetItem *))); connect(ui->tableWidget_wifi, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(wifiTabContextualMenu(QPoint))); } void MainWindow::keyPressEvent(QKeyEvent *pressedKey) { if (debug) qDebug() << "[MainWindow]" << "[keyPressEvent]"; if (pressedKey->key() == Qt::Key_Return) if (ui->comboBox_profile->hasFocus()) profileTabLoadProfile(); } void MainWindow::setIconsToButtons() { if (debug) qDebug() << "[MainWindow]" << "[setIconsToButtons]"; // tab widget ui->tabWidget->setTabIcon(0, QIcon(":icon")); ui->tabWidget->setTabIcon(1, QIcon::fromTheme("document-new")); ui->tabWidget->setTabIcon(2, QIcon(":wifi")); // main tab ui->pushButton_mainRefresh->setIcon(QIcon::fromTheme("stock-refresh")); ui->pushButton_mainRestart->setIcon(QIcon::fromTheme("stock-refresh")); // profile tab ui->pushButton_profileClear->setIcon(QIcon::fromTheme("edit-clear")); ui->pushButton_profileSave->setIcon(QIcon::fromTheme("document-save")); // wifi tab ui->pushButton_wifiRefresh->setIcon(QIcon::fromTheme("stock-refresh")); } QMap MainWindow::parseOptions(const QString options) { if (debug) qDebug() << "[MainWindow]" << "[parseOptions]"; QMap settings; for (int i=0; igetInterfaceList()[0]; settings[QString("Connection")] = QString("wireless"); QString security = ui->tableWidget_wifi->item(ui->tableWidget_wifi->currentItem()->row(), 3)->text(); if (checkState(QString("WPA"), security)) settings[QString("Security")] = QString("wpa"); else if (checkState(QString("wep"), security)) settings[QString("Security")] = QString("wep"); else settings[QString("Security")] = QString("none"); settings[QString("ESSID")] = QString("'") + ui->tableWidget_wifi->item(ui->tableWidget_wifi->currentItem()->row(), 0)->text() + QString("'"); if (!passwd.isEmpty()) settings[QString("Key")] = QString("'") + passwd + QString("'"); settings[QString("IP")] = QString("dhcp"); if (hiddenNetwork) settings[QString("Hidden")] = QString("yes"); QString profile = QString("netctl-gui-") + settings[QString("ESSID")]; profile.remove(QChar('"')).remove(QChar('\'')); QString profileTempName = netctlProfile->createProfile(profile, settings); if (netctlProfile->copyProfile(profileTempName)) netctlCommand->startProfile(profile); if (netctlCommand->isProfileActive(profile)) ui->statusBar->showMessage(QApplication::translate("MainWindow", "Done")); else ui->statusBar->showMessage(QApplication::translate("MainWindow", "Error")); updateWifiTab(); } void MainWindow::setHiddenName(const QString name) { if (debug) qDebug() << "[MainWindow]" << "[setHiddenName]"; if (debug) qDebug() << "[MainWindow]" << "[setHiddenName]" << ":" << "Set name" << name; ui->tableWidget_wifi->item(ui->tableWidget_wifi->currentItem()->row(), 0)->setText(name); wifiTabStart(); } void MainWindow::wifiTabStart() { if (debug) qDebug() << "[MainWindow]" << "[wifiTabStart]"; if (!checkExternalApps(QString("wpasup"))) return errorWin->showWindow(1, QString("[MainWindow] : [wifiTabStart]")); if (ui->tableWidget_wifi->currentItem() == 0) return; // name is hidden if (ui->tableWidget_wifi->item(ui->tableWidget_wifi->currentItem()->row(), 0)->text() == QString("")) { hiddenNetwork = true; passwdWid = new PasswdWidget(this); passwdWid->setPassword(false); int widgetWidth = 270; int widgetHeight = 86; int x = (width() - widgetWidth) / 2; int y = (height() - widgetHeight) / 2; passwdWid->setGeometry(x, y, widgetWidth, widgetHeight); passwdWid->show(); passwdWid->setFocusToLineEdit(); return; } // name isn't hidden ui->tabWidget->setDisabled(true); hiddenNetwork = false; QString profile = ui->tableWidget_wifi->item(ui->tableWidget_wifi->currentItem()->row(), 0)->text(); QString item = ui->tableWidget_wifi->item(ui->tableWidget_wifi->currentItem()->row(), 1)->text(); if (checkState(QString("exists"), item)) { QString profileName = wpaCommand->existentProfile(profile); netctlCommand->startProfile(profileName); item = ui->tableWidget_wifi->item(ui->tableWidget_wifi->currentItem()->row(), 1)->text(); if (checkState(QString("inactive"), item)) { if (netctlCommand->isProfileActive(profileName)) ui->statusBar->showMessage(QApplication::translate("MainWindow", "Error")); else ui->statusBar->showMessage(QApplication::translate("MainWindow", "Done")); } else { if (netctlCommand->isProfileActive(profileName)) ui->statusBar->showMessage(QApplication::translate("MainWindow", "Done")); else ui->statusBar->showMessage(QApplication::translate("MainWindow", "Error")); } } else { QString security = ui->tableWidget_wifi->item(ui->tableWidget_wifi->currentItem()->row(), 3)->text(); if (checkState(QString("none"), security)) return connectToUnknownEssid(QString("")); else { passwdWid = new PasswdWidget(this); passwdWid->setPassword(true); int widgetWidth = 270; int widgetHeight = 86; int x = (width() - widgetWidth) / 2; int y = (height() - widgetHeight) / 2; passwdWid->setGeometry(x, y, widgetWidth, widgetHeight); passwdWid->show(); passwdWid->setFocusToLineEdit(); return; } } updateWifiTab(); } void MainWindow::wifiTabRefreshButtons(QTableWidgetItem *current, QTableWidgetItem *previous) { Q_UNUSED(previous); if (debug) qDebug() << "[MainWindow]" << "[wifiTabRefreshButtons]"; if (!checkExternalApps(QString("wpasup"))) return errorWin->showWindow(1, QString("[MainWindow] : [wifiTabRefreshButtons]")); if (current == 0) { ui->pushButton_wifiStart->setDisabled(true); return; } if (ui->tableWidget_wifi->item(current->row(), 0)->text() == QString("")) { ui->pushButton_wifiStart->setDisabled(true); return; } ui->pushButton_wifiStart->setEnabled(true); QString item = ui->tableWidget_wifi->item(current->row(), 1)->text(); if (checkState(QString("exists"), item)) { if (!checkState(QString("inactive"), item)) { ui->pushButton_wifiStart->setText(QApplication::translate("MainWindow", "Stop")); ui->pushButton_wifiStart->setIcon(QIcon::fromTheme("dialog-close")); } else { ui->pushButton_wifiStart->setText(QApplication::translate("MainWindow", "Start")); ui->pushButton_wifiStart->setIcon(QIcon::fromTheme("dialog-apply")); } } else { ui->pushButton_wifiStart->setText(QApplication::translate("MainWindow", "Start")); ui->pushButton_wifiStart->setIcon(QIcon::fromTheme("dialog-apply")); } }