/*************************************************************************** * 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 #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 "netctlguiadaptor.h" #include "passwdwidget.h" #include "pppoewidget.h" #include "settingswindow.h" #include "trayicon.h" #include "tunnelwidget.h" #include "tuntapwidget.h" #include "version.h" #include "vlanwidget.h" #include "wirelesswidget.h" MainWindow::MainWindow(QWidget *parent, const int startMinimized, 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]" << ":" << "startMinimized" << startMinimized; 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->tableWidget_main->setColumnHidden(2, true); ui->tableWidget_main->setColumnHidden(3, true); ui->tableWidget_wifi->setColumnHidden(3, true); ui->tableWidget_wifi->setColumnHidden(4, true); 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(); setIconsToTabs(); 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")); // tray trayIcon = new TrayIcon(this, debug); if ((QSystemTrayIcon::isSystemTrayAvailable()) && (configuration[QString("SYSTRAY")] == QString("true"))) trayIcon->setVisible(true); else trayIcon->setVisible(false); if (trayIcon->isVisible()) { if (configuration[QString("STARTTOTRAY")] == QString("true")) hide(); else show(); if (startMinimized == 1) show(); else if (startMinimized == 2) hide(); } else show(); } 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; delete trayIcon; } QString MainWindow::getInformation() { if (debug) qDebug() << "[MainWindow]" << "[getInformation]"; QString profile; QString status; if (netctlCommand->isNetctlAutoRunning()) { profile = netctlCommand->autoGetActiveProfile(); status = QString("netctl-auto"); } else { profile = netctlCommand->getActiveProfile(); status = netctlCommand->getProfileStatus(profile); } QString output = QString("%1: %2\n").arg(QApplication::translate("MainWindow", "Profile")).arg(profile); output += QString("%1: %2\n").arg(QApplication::translate("MainWindow", "Status")).arg(status); return output; } bool MainWindow::isNetctlAutoWindowHidden() { if (debug) qDebug() << "[MainWindow]" << "[isNetctlAutoWindowHidden]"; return netctlAutoWin->isHidden(); } void MainWindow::closeEvent(QCloseEvent *event) { if (debug) qDebug() << "[MainWindow]" << "[closeEvent]"; if (configuration[QString("CLOSETOTRAY")] == QString("true")) if (trayIcon->isVisible()) { hide(); event->ignore(); } } 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; } QString MainWindow::checkStatus(const bool statusBool, const bool nullFalse) { if (debug) qDebug() << "[MainWindow]" << "[checkStatus]"; if (debug) qDebug() << "[MainWindow]" << "[checkStatus]" << ":" << "Status" << statusBool; if (debug) qDebug() << "[MainWindow]" << "[checkStatus]" << ":" << "Return null false" << nullFalse; if (statusBool) return QApplication::translate("MainWindow", "yes"); if (nullFalse) return QString(""); else return QApplication::translate("MainWindow", "no"); } // 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->actionReport, SIGNAL(triggered(bool)), this, SLOT(reportABug())); connect(ui->actionQuit, SIGNAL(triggered(bool)), this, SLOT(closeMainWindow())); // 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::createDBusSession() { if (debug) qDebug() << "[MainWindow]" << "[createDBusSession]"; new NetctlGuiAdaptor(this, debug); QDBusConnection bus = QDBusConnection::sessionBus(); if (!bus.registerService(QString(DBUS_SERVICE))) if (debug) qDebug() << "[MainWindow]" << "[createDBusSession]" << ":" << "Could not register service"; if (!bus.registerObject(QString(DBUS_OBJECT_PATH), this)) if (debug) qDebug() << "[MainWindow]" << "[createDBusSession]" << ":" << "Could not register object"; } void MainWindow::keyPressEvent(QKeyEvent *pressedKey) { if (debug) qDebug() << "[MainWindow]" << "[keyPressEvent]"; if (pressedKey->key() == Qt::Key_Return) if (ui->comboBox_profile->hasFocus()) profileTabLoadProfile(); } void MainWindow::setIconsToTabs() { if (debug) qDebug() << "[MainWindow]" << "[setIconsToTabs]"; // tab widget ui->tabWidget->setTabIcon(0, QIcon(":icon")); ui->tabWidget->setTabIcon(1, QIcon::fromTheme("document-new")); ui->tabWidget->setTabIcon(2, QIcon(":wifi")); } QMap MainWindow::parseOptions(const QString options) { if (debug) qDebug() << "[MainWindow]" << "[parseOptions]"; QMap settings; for (int i=0; igetWirelessInterfaceList()[0]; settings[QString("Connection")] = QString("wireless"); QString security = ui->tableWidget_wifi->item(ui->tableWidget_wifi->currentItem()->row(), 2)->text(); if (security.contains(QString("WPA"))) settings[QString("Security")] = QString("wpa"); else if (security.contains(QString("WEP"))) 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(); if (!ui->tableWidget_wifi->item(ui->tableWidget_wifi->currentItem()->row(), 4)->text().isEmpty()) { QString profileName = wpaCommand->existentProfile(profile); netctlCommand->startProfile(profileName); if (!ui->tableWidget_wifi->item(ui->tableWidget_wifi->currentItem()->row(), 3)->text().isEmpty()) { 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(), 1)->text(); if (security.contains(QString("none"))) 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); if (!ui->tableWidget_wifi->item(current->row(), 4)->text().isEmpty()) { if (!ui->tableWidget_wifi->item(current->row(), 3)->text().isEmpty()) { ui->pushButton_wifiStart->setText(QApplication::translate("MainWindow", "Stop")); ui->pushButton_wifiStart->setIcon(QIcon::fromTheme("process-stop")); } else { ui->pushButton_wifiStart->setText(QApplication::translate("MainWindow", "Start")); ui->pushButton_wifiStart->setIcon(QIcon::fromTheme("system-run")); } } else { ui->pushButton_wifiStart->setText(QApplication::translate("MainWindow", "Start")); ui->pushButton_wifiStart->setIcon(QIcon::fromTheme("system-run")); } }