/** * @class ndgui * * @brief the GUI. * * This class is responsible for creating and displaying the user interface. * It also connects the webView via QWebBridge to javascript functions inside the html files. */ #include "ndgui.h" #include #include "qlog4cxx.h" using namespace log4cxx; using namespace log4cxx::helpers; LoggerPtr ndLogger(Logger::getLogger("fbgui.nd")); QString gServerIp(""); bool gAutoUp = true; QString gSocketServerPath(""); QString gPathToDhcpExe(""); QString interfaceName(""); /** * constructor */ ndgui::ndgui() : agui() { } /** * destructor */ ndgui::~ndgui() { //delete _debugConsole; //delete _toggleDebugConsole; delete _allowUserChoice; delete _tryAgain; //delete _webView; delete _networkDiscovery; } /** * @brief initialize all variables and prepare everything for a successful run */ void ndgui::init() { LOG4CXX_DEBUG(ndLogger, "Initializing ndgui..."); _started = false; _userChoice = false; _ifNameList.clear(); _manConfList.clear(); addActions(); _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())); if (debugMode > -1) { _webView->load(QUrl("qrc:html/networkdiscovery_debug.html")); } else { _webView->load(QUrl("qrc:html/networkdiscovery.html")); } setWindowTitle(tr("NetD")); showFullScreen(); } /** * @brief Add actions * * Add actions which you can trigger with the F5 and F9 Button. */ void ndgui::addActions() { _allowUserChoice = new QAction(tr("&userChoice"), this); _allowUserChoice->setShortcut(QKeySequence(Qt::Key_F5)); connect(_allowUserChoice, SIGNAL(triggered()), this, SLOT(setUserChoiceTrue())); this->addAction(_allowUserChoice); _tryAgain = new QAction(tr("&tryAgain"), this); _tryAgain->setShortcut(QKeySequence(Qt::Key_F9)); connect(_tryAgain, SIGNAL(triggered()), this, SLOT(tryAgain())); this->addAction(_tryAgain); } /** * @brief set userChoice true * * is the connected to the triggered action pressing the F5 button. * set the _userChoice member true */ void ndgui::setUserChoiceTrue() { _userChoice = true; } /** * @brief starts a singleshot event. * * 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() { LOG4CXX_DEBUG(ndLogger, "start single shot"); QTimer::singleShot(3000, this, SLOT(startNetworkDiscovery())); } /** * @brief start the network discovery * * 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) { _started = true; _networkDiscovery->initAndRun(gServerIp, _userChoice, gAutoUp, logFilePath, gSocketServerPath, gPathToDhcpExe); } else { LOG4CXX_DEBUG(ndLogger, "NetworkDiscovery already started"); } } /** * @brief handle if a interface is able to connect * * 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); } /** * @brief determines if we continue the boot sequence or if we show the chooseInterface or abortBoot dialog * * 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() { LOG4CXX_DEBUG(ndLogger, "all Processes finished"); _allowUserChoice->setEnabled(false); 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)) { continueBootWithoutCheck(i); break; } } } } else { LOG4CXX_DEBUG(ndLogger, " No usable interfaces found!: " << _networkDiscovery->GetErrorStr()); LOG4CXX_DEBUG(ndLogger, " list is empty"); abortBoot("No usable interfaces found!" + _networkDiscovery->GetErrorStr()); } } /** * @brief continue the boot sequence * * 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)) { LOG4CXX_DEBUG(ndLogger, " continue with interface: " << ifName); interfaceName = ifName; emit initFbgui(); this->close(); } else { abortBoot( "Interface was suddenly made unusable. Please check the log and try again."); } } /** * @brief continue the boot sequence without further checking if the connection is still possible. */ void ndgui::continueBootWithoutCheck(QString ifName) { LOG4CXX_DEBUG(ndLogger, " continue with interface: " << ifName); interfaceName = ifName; emit initFbgui(); this->close(); } /** * @brief read the log file. Log File will be presented inside of a dialog. */ QString ndgui::readLogFile() { LOG4CXX_DEBUG(ndLogger, "show log"); return _networkDiscovery->readLogFile(); } /** * @brief starts the whole application again. */ void ndgui::tryAgain() { LOG4CXX_DEBUG(ndLogger, " try again "); _networkDiscovery->prepareTryAgain(); if(debugMode > -1) { //delete _splitter; //delete _debugConsole; //delete _toggleDebugConsole; } delete _allowUserChoice; delete _tryAgain; //delete _webView; delete _networkDiscovery; init(); } /*test html gui version*/ /** * @brief fills the drop down box of the manual interface configuration * dialog. */ QVariantList ndgui::getManualConfInterfaces() { LOG4CXX_DEBUG(ndLogger, "call getManualConfInterfaces"); QVariantList jsonArr; QString debugOut; foreach (QString s, _manConfList) { QVariant e(s); jsonArr << e; debugOut += s + "; "; } LOG4CXX_DEBUG(ndLogger, "value of jsonArr:" << debugOut); return jsonArr; } /** * @brief return a json formated interface configuration * * @param ifName * the name of the interface */ QVariantMap ndgui::getInterfaceConf(QString ifName) { return _networkDiscovery->getInterfaceConfig(ifName); } /** * @brief takes the entered manual configuration dates and delivers it * to the networkDiscovery for further actions. * * @param jsonArr * a jsonArr which contains the manual entered interface configuration */ int ndgui::ip4_setManualConfiguration(QVariantMap jsonArr) { return _networkDiscovery->ip4_setManualConfiguration(jsonArr); } /* slots */ /************************************************/ ////////////////////////////////////////////////// /************************************************/ /** * @brief stellt ein ndgui/fbgui Objekt zur verwendung durch die html bereit. */ void ndgui::attachToDOM(){ _webView->page()->mainFrame()->addToJavaScriptWindowObject(QString("fbgui"), this); loadJQuery(); } /** * @brief load jQuery and js scripts into the page so that all javascript functions will work. */ 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") { //LOG4CXX_DEBUG(ndLogger, fi.fileName()); //LOG4CXX_DEBUG(ndLogger, 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); //LOG4CXX_DEBUG(ndLogger, "evaluated " + fi.fileName()); //} } } } /** * @brief show abortBoot dialog * * @param msg * the message, displayed in the dialog. */ void ndgui::abortBoot(const QString msg) { QString code = QString("abortBootDialog('\%1')").arg(msg); _webView->page()->mainFrame()->evaluateJavaScript(code); } /** * @brief opens ths chooseInterfaceDialog * * @param msg * the interfaces as json formated string. will be displayed in a select box. */ void ndgui::chooseInterfaceDialog(const QString msg) { QString code = QString("chooseInterfaceDialog(\%1)").arg(msg); _webView->page()->mainFrame()->evaluateJavaScript(code); } /** * @brief updates the over all status * * @param status * the new status message */ void ndgui::updateStatus(const QString &status) { if (status == "") return; QString code = QString("updateStatus('\%1')").arg(status); _webView->page()->mainFrame()->evaluateJavaScript(code); } /** * @brief 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); } /** * @brief 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); } /** * @brief 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); } /** * @brief just for debugging. */ void ndgui::notifyCall(QString msg){ LOG4CXX_DEBUG(ndLogger, "------ called:" << msg); }