#include "ndgui.h" QString gServerIp(""); bool gAutoUp = true; QString gSocketServerPath(""); QString gPathToDhcpExe(""); /*constructor*/ ndgui::ndgui(QMainWindow *parent) : QMainWindow(parent) { // _tag = "[nd:ndgui]"; // // _started = false; // _userChoice = false; // _tryAgain = false; // // setupLayout(); // createAction(); // // connect(&networkDiscovery, SIGNAL(addInterface(const QString &)), this, SLOT(addInterface( const QString &))); // connect(&networkDiscovery, SIGNAL(changeProgressBarValue(const QString & , const int& )), this, SLOT(updateIfProgressBar(const QString & , const int&))); // connect(&networkDiscovery, SIGNAL(connectionEstablished(QString)), this, SLOT(handleConnectionEstablished(QString))); // connect(&networkDiscovery, SIGNAL(abortBoot(QString)), this, SLOT(abortBoot(const QString))); // connect(&networkDiscovery, SIGNAL(updateIfStatus(QString,QString)), this, SLOT(updateIfStatus(const QString &, const QString &))); // connect(&networkDiscovery, SIGNAL(updateStatus(QString)), this, SLOT(updateStatus(const QString&))); // connect(&networkDiscovery, SIGNAL(allProcessesFinished()), this, SLOT(handleAllProcessesFinished())); // connect(&networkDiscovery, SIGNAL(continueBoot(QString)), this, SLOT(continueBoot(QString))); // // // connect(_webView->page()->mainFrame(), SIGNAL( // javaScriptWindowObjectCleared()), this, SLOT(attachToDOM())); // connect(_webView, SIGNAL(loadFinished(bool)), this, // SLOT(startSingleShot())); // // setWindowTitle(tr("NetD")); // setAttribute(Qt::WA_QuitOnClose, true); // setWindowFlags(Qt::FramelessWindowHint); // showFullScreen(); // // if (debugMode > -1) { // _webView->load(QUrl("qrc:html/networkdiscovery_debug.html")); // } // else { // _webView->load(QUrl("qrc:html/networkdiscovery.html")); // // } // // _webView->show(); init(); } /*destructor*/ ndgui::~ndgui() { delete _debugConsole; delete _toggleDebugConsole; delete _allowUserChoice; delete _webView; delete _networkDiscovery; } /**/ void ndgui::init () { _tag = "[nd:ndgui]"; _started = false; _userChoice = false; _tryAgain = false; _ifNameList.clear(); _manConfList.clear(); setupLayout(); createAction(); _networkDiscovery = new NetworkDiscovery(); connect(_networkDiscovery, SIGNAL(addInterface(const QString &)), this, SLOT(addInterface( const QString &))); connect(_networkDiscovery, SIGNAL(changeProgressBarValue(const QString & , const int& )), this, SLOT(updateIfProgressBar(const QString & , const int&))); connect(_networkDiscovery, SIGNAL(connectionEstablished(QString)), this, SLOT(handleConnectionEstablished(QString))); connect(_networkDiscovery, SIGNAL(abortBoot(QString)), this, SLOT(abortBoot(const QString))); connect(_networkDiscovery, SIGNAL(updateIfStatus(QString,QString)), this, SLOT(updateIfStatus(const QString &, const QString &))); connect(_networkDiscovery, SIGNAL(updateStatus(QString)), this, SLOT(updateStatus(const QString&))); connect(_networkDiscovery, SIGNAL(allProcessesFinished()), this, SLOT(handleAllProcessesFinished())); connect(_networkDiscovery, SIGNAL(continueBoot(QString)), this, SLOT(continueBoot(QString))); connect(_networkDiscovery, SIGNAL(continueBootWithoutCheck(QString )), this, SLOT(continueBootWithoutCheck(QString))); connect(_webView->page()->mainFrame(), SIGNAL( javaScriptWindowObjectCleared()), this, SLOT(attachToDOM())); connect(_webView, SIGNAL(loadFinished(bool)), this, SLOT(startSingleShot())); setWindowTitle(tr("NetD")); setAttribute(Qt::WA_QuitOnClose, true); setWindowFlags(Qt::FramelessWindowHint); showFullScreen(); if (debugMode > -1) { _webView->load(QUrl("qrc:html/networkdiscovery_debug.html")); } else { _webView->load(QUrl("qrc:html/networkdiscovery.html")); } _webView->show(); } /** * This method sets the used Layout. * * This method sets the used Layout. Possible layout are: * - browser mode: only the browser is visible * - debug mode: the screen is divided into the browser and a debug * out console */ void ndgui::setupLayout() { // setup layout of the gui: debug split or browser _webView = new QWebView(this); _webView->setContextMenuPolicy(Qt::NoContextMenu); // if this does not work try Qt::CustomContextMenu if (debugMode == 1) { // split main window in browser & debug console createDebugConsole(); _splitter = new QSplitter(Qt::Vertical, this); _splitter->addWidget(_webView); _splitter->addWidget(_debugConsole); setCentralWidget(_splitter); } else { _webView->page()->mainFrame()->setScrollBarPolicy(Qt::Vertical, Qt::ScrollBarAlwaysOff); setCentralWidget(_webView); } } /** * This method creates a debug console as a widget. * * It is basicly a QTextEdit widget as provided by QT's Framework. * An action to toggle this widget is implemented (CTRL + D). * * @see fbgui::toggleDebugConsole() */ void ndgui::createDebugConsole() { // create the debug console widget _debugConsole = new QTextEdit(this); _debugConsole->setWindowFlags(Qt::FramelessWindowHint); // fanciness QPalette pal; pal.setColor(QPalette::Base, Qt::black); _debugConsole->setPalette(pal); _debugConsole->setTextColor(Qt::white); // enable custom logger engine qxtLog->addLoggerEngine("fb_logger", new LoggerEngine_fb(_debugConsole)); //qxtLog->initLoggerEngine("fb_logger"); qxtLog->setMinimumLevel("fb_logger", QxtLogger::DebugLevel); // CTRL + D toggles debug window _toggleDebugConsole = new QAction(tr("&toggleDebug"), this); _toggleDebugConsole->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_D)); addAction(_toggleDebugConsole); connect(_toggleDebugConsole, SIGNAL(triggered()), this, SLOT( toggleDebugConsole())); } /** * This method toggles the debug console. * * Toggle the visibility of the debug console if the action _toggleDebugConsole is triggered. * * @see fbgui::createDebugConsole() */ void ndgui::toggleDebugConsole() { (_debugConsole->isVisible()) ? _debugConsole->hide() : _debugConsole->show(); } /** * creates an action which you can trigger with the F5 Button during the first * seconds. */ void ndgui::createAction() { _allowUserChoice = new QAction(tr("&quit"), this); _allowUserChoice->setShortcut(QKeySequence(Qt::Key_F5)); connect(_allowUserChoice, SIGNAL(triggered()), this, SLOT(setUserChoiceTrue())); this->addAction(_allowUserChoice); } /** * is the connected to the triggered action pressing the F5 button. * set the _userChoice member true */ void ndgui::setUserChoiceTrue() { _userChoice = true; } /** * is connected to the singleShot event. Triggering this method means * that we go on with the main NetworkDiscovery screen. * connects the loadFinished signal of the _webView with the * startNetworkDiscovery slot and removes the * action. */ void ndgui::startSingleShot() { qxtLog->debug() << _tag << "start singel shot"; QTimer::singleShot(3000, this, SLOT(startNetworkDiscovery())); } /** * main starting point of the whole procedure. * disconnect the loadFinished signal with the startNetworkDiscovery * and starts the networkDiscovery. */ void ndgui::startNetworkDiscovery(){ disconnect(_webView,SIGNAL(loadFinished(bool)), this, SLOT(startSingleShot())); if(!_started) { if (!_tryAgain) { _started = true; QStringList l; l << "-d"; _networkDiscovery->initAndRun(gServerIp, _userChoice, gAutoUp, logFilePath,"/var/tmp/qt_c_socket_custom", DEFAULT_PATHTODHCPCDEXE, &l); } else { _tryAgain = false; _networkDiscovery->tryAgain(); } } else { qxtLog->debug() << _tag << "NetworkDiscovery already started"; } } /** * if we have a user choice (_userChoice = true) than networkDiscovery will * emit connectionEstablished signals. * Add the interface name to a _ifNameList. This list holds all interfaces * the user can choose out of. */ void ndgui::handleConnectionEstablished(QString ifName) { _ifNameList.append(ifName); } /** * if we have a user choice (_userChoice = true) than networkDiscovery will * emit a allProcessesFinished signal if all processes are done. * This method determines if user will see an abort boot dialog (no interface names in * the ifNameList list) or an * choose interface dialog (one or more interface names in the list (add with * handleConnectionEstablished)). */ void ndgui::handleAllProcessesFinished() { qxtLog->debug() << _tag << "all Processes finished"; if (_ifNameList.size() > 0) { if (_userChoice) { QString jsonArr = "["; for (int i = 0; i < _ifNameList.size() - 1; i++) { jsonArr += "\"" + _ifNameList.value(i) + "\","; } jsonArr += "\"" + _ifNameList.last() + "\"]"; chooseInterfaceDialog(jsonArr); } else { foreach(QString i, _ifNameList) { if (_networkDiscovery->checkConnectivity(i)) { continueBoot(i); break; } } } } else { abortBoot("No usable interfaces found!" + _networkDiscovery->GetErrorStr()); } } /** * this method will restart the system. * triggered through a button click in the gui. */ void ndgui::restartSystem() { QFile file("/proc/sysrq-trigger"); if (file.open(QIODevice::WriteOnly)) { file.write("b"); file.close(); } else { qxtLog->debug() << _tag << "Could not open /proc/sysrq-trigger"; } } /** * this method will restart the system. * triggered through a button click in the gui. */ void ndgui::shutDownSystem() { QFile file("/proc/sysrq-trigger"); if (file.open(QIODevice::WriteOnly)) { file.write("o"); file.close(); } else { qxtLog->debug() << _tag << "Could not open /proc/sysrq-trigger"; } } /** * represents the end of the NetworkDiscovery life time. * will start the fbgui screen. All networkDiscovery signals * will be ignored after this point. */ //void ndgui::continueBoot(QString ifName, int userChoice) { void ndgui::continueBoot(QString ifName) { if (_networkDiscovery->checkConnectivity(ifName)) { qxtLog->debug() << _tag << " continue with interface: " << ifName; emit initFbgui(); this->close(); } else { abortBoot( "Interface was suddenly made unusable. Please check the log and try again."); } } /**/ void ndgui::continueBootWithoutCheck(QString ifName) { qxtLog->debug() << _tag << " continue with interface: " << ifName; emit initFbgui(); this->close(); } //void ndgui::continueBoot(QString ifName) { // if (!_userChoice) { // foreach(QString i, _ifNameList) // { // if (_networkDiscovery->checkConnectivity(i)) { // QString text = "continue with interface: " + i; // qxtLog->debug() << _tag << " " << text << "no user choice"; // emit // initFbgui(); // this->close(); // } // } // abortBoot( // "Interface was suddenly made unusable. Please check the log and try again."); // } else { // int ret = 0; // QString text = "continue with interface: " + ifName; // qxtLog->debug() << _tag << " " << text << " with user choice"; // QString gateway = _networkDiscovery->getGatewayForInterface(ifName); // if (!gateway.isEmpty()) { // qxtLog->debug() << _tag // << " gateway is empty. this will produce errors"; // } // ret = _networkDiscovery->ip4_replaceDefaultRoute(ifName, gateway, 0); // if (0 != ret) { // qxtLog->debug() << _tag // << " set default route failed. returned with: " << ret // << " : " << strerror(-ret); // } // if (_networkDiscovery->checkConnectivityViaTcp()) { // emit initFbgui(); // this->close(); // } else { // abortBoot( // "Interface was suddenly made unusable. Please check the log and try again."); // } // } // //} /** * read the log file. Log File will be presented inside of a dialog. */ QString ndgui::readLogFile() { qxtLog->debug() << _tag << "show log"; return _networkDiscovery->readLogFile(); } /**/ void ndgui::tryAgain() { qxtLog->debug()<< _tag << " try again "; if(debugMode > -1) { delete _splitter; delete _debugConsole; delete _toggleDebugConsole; } delete _allowUserChoice; delete _webView; delete _networkDiscovery; init(); } ///**/ //void ndgui::tryAgain() { // qxtLog->debug()<< _tag << " try again "; // _tryAgain = true; // _started = false; // _ifNameList.clear(); // _manConfList.clear(); // createAction(); // if (debugMode > -1) { // _webView->load(QUrl("qrc:html/networkdiscovery_userchoice_debug.html")); // } // else { // _webView->load(QUrl("qrc:html/networkdiscovery_userchoice.html")); // } // _webView->show(); // // QTimer::singleShot(2000, this, SLOT(prepareNetworkDiscover())); //} /*test html gui version*/ /** * fills the drop down box of the manual interface configuration * dialog. */ QVariantList ndgui::getManualConfInterfaces() { qxtLog->debug() << _tag << "call getManualConfInterfaces"; QVariantList jsonArr; foreach (QString s, _manConfList) { QVariant e(s); jsonArr << e; } qxtLog->debug() << _tag << "value of jsonArr:" << jsonArr; return jsonArr; } /**/ QVariantMap ndgui::getInterfaceConf(QString ifName) { return _networkDiscovery->getInterfaceConfig(ifName); } /** * takes the entered manual configuration dates and delivers it * to the networkDiscovery for further actions. */ int ndgui::ip4_setManualConfiguration(QVariantMap jsonArr) { return _networkDiscovery->ip4_setManualConfiguration(jsonArr); } /* slots */ /************************************************/ ////////////////////////////////////////////////// /************************************************/ /** * stellt ein ndgui/fbgui Objekt zur verwendung durch die html bereit. */ void ndgui::attachToDOM(){ _webView->page()->mainFrame()->addToJavaScriptWindowObject(QString("fbgui"), this); loadJQuery(); } void ndgui::loadJQuery() { QString js; QString pathToJsDir(":/html"); pathToJsDir.append("/js"); QDir qrcJSDir(pathToJsDir); QFileInfoList fiList = qrcJSDir.entryInfoList(); QFileInfo fi; foreach(fi, fiList) { if (fi.suffix() == "js") { //qxtLog->debug()<< fi.fileName(); //qxtLog->debug() << fi.fileName(); //if (fi.fileName() != "test.js" && fi.fileName() != "nd-functions.js") { QFile file; file.setFileName(pathToJsDir + "/" + fi.fileName()); file.open(QIODevice::ReadOnly); js = file.readAll(); file.close(); _webView->page()->mainFrame()->evaluateJavaScript(js); //qxtLog->debug() << "evaluated " + fi.fileName(); //} } } } //diese methoden müssen später in die javascriptInterface Klasse eingefügt werden. // dieser code muss später in die javascriptInterface klasse der fbgui eingefügt werden // tausche dazu ndgui zu javascriptinterface // und _webView->page()->mainFrame() zu _parent void ndgui::abortBoot(const QString msg) { QString code = QString("abortBootDialog('\%1')").arg(msg); _webView->page()->mainFrame()->evaluateJavaScript(code); } /** * opens ths chooseInterfaceDialog */ void ndgui::chooseInterfaceDialog(const QString msg) { QString code = QString("chooseInterfaceDialog(\%1)").arg(msg); _webView->page()->mainFrame()->evaluateJavaScript(code); } /** * updates the over all status */ void ndgui::updateStatus(const QString &status) { if (status == "") return; QString code = QString("updateStatus('\%1')").arg(status); _webView->page()->mainFrame()->evaluateJavaScript(code); } /** * updates the progress bar for each interface. * * @param ifname * the name ot the interface to update * * @param percent * the progress in percent */ void ndgui::updateIfProgressBar(const QString &ifName, const int& percent) { if (percent == 0) return; QString code = QString("updateIfProgressBar('\%1',\%2)").arg(ifName).arg(percent); _webView->page()->mainFrame()->evaluateJavaScript(code); } /** * update the status for each interface * * @param ifName * the name ot the interface to update * * @param status * the new status of the interface. */ void ndgui::updateIfStatus(const QString &ifName, const QString &status) { if (ifName == "") return; QString code = QString("updateIfStatus('\%1','\%2')").arg(ifName).arg(status); _webView->page()->mainFrame()->evaluateJavaScript(code); } /** * adds an interface to the DOM tree. Creates its progress bar and it's status label. * * @param ifName * name of the new interface. */ void ndgui::addInterface(const QString &ifName) { if (ifName == "") return; _manConfList.append(ifName); QString code = QString("addInterface('\%1')").arg(ifName); _webView->page()->mainFrame()->evaluateJavaScript(code); } /** * just for debugging. */ void ndgui::notifyCall(QString msg){ qxtLog->debug() << _tag << "------ called:" << msg; }