From 5aa568daae23daa7ac190e56df469e9566075257 Mon Sep 17 00:00:00 2001 From: Niklas Date: Mon, 10 Oct 2011 17:08:35 +0200 Subject: new veriosn of the fbgui src (same as in fbgui-ng) combined with my networkDiscovery in front. --- src/ndgui.cpp | 370 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 370 insertions(+) create mode 100644 src/ndgui.cpp (limited to 'src/ndgui.cpp') diff --git a/src/ndgui.cpp b/src/ndgui.cpp new file mode 100644 index 0000000..80a64bc --- /dev/null +++ b/src/ndgui.cpp @@ -0,0 +1,370 @@ +#include "ndgui.h" + +ndgui::ndgui(QMainWindow *parent) : + QMainWindow(parent) { + + _tag = "[nd:ndgui]"; + + _started = false; + _userChoice = false; + + 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(updateStatusLabel(QString,QString)), this, SLOT(updateIfStatus(const QString &, const QString &))); + connect(&networkDiscovery, SIGNAL(allProcessesFinished()), this, SLOT(handleAllProcessesFinished())); + connect(&networkDiscovery, SIGNAL(continueBoot(QString, int)), this, SLOT(continueBoot(QString, int))); + + _webView = new QWebView(this); + connect(_webView->page()->mainFrame(), SIGNAL( + javaScriptWindowObjectCleared()), this, SLOT(attachToDOM())); + setCentralWidget(_webView); + setWindowTitle(tr("NetD")); + setAttribute(Qt::WA_QuitOnClose, true); + setWindowFlags(Qt::FramelessWindowHint); + + _webView->load(QUrl("qrc:html/networkdiscovery_userchoice.html")); + _webView->show(); + + QTimer::singleShot(2000, this, SLOT(prepareNetworkDiscover())); + +} + + + +ndgui::~ndgui() { + +} + + + +/** + * 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::prepareNetworkDiscover() { + connect(_webView, SIGNAL(loadFinished(bool)), this, + SLOT(startNetworkDiscovery())); + this->removeAction(_allowUserChoice); + + _webView->load(QUrl("qrc:html/networkdiscovery.html")); + _webView->show(); +} + + + +/** + * 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(startNetworkDiscovery())); + if(!_started) { + _started = true; + networkDiscovery.initAndRun("209.85.148.105", _userChoice, true, "/var/tmp/logfile","/var/tmp/qt_c_socket_custom"); + } + else { + qDebug() << _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() { + qDebug() << _tag << "all Processes finished"; + if(_ifNameList.size() > 0) { + QString jsonArr = "["; + for(int i = 0; i < _ifNameList.size()-1; i++) { + jsonArr += "\"" + _ifNameList.value(i) + "\","; + } + jsonArr += "\"" + _ifNameList.last() + "\"]"; + chooseInterfaceDialog(jsonArr); + } else { + abortBoot("No usable interfaces found!"); + } +} + + + +/** + * 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) { + if (!userChoice) { + QString text = "continue with interface: " + ifName; + qDebug() << _tag << text << "no user choice"; + } else { + QString text = "continue with interface: " + ifName; + qDebug() << _tag << text << "with user choice"; + QString gateway = networkDiscovery.getGatewayForInterface(ifName); + networkDiscovery.ip4_replaceDefaultRoute(ifName,gateway,0); + } + //_webView->load(QUrl("qrc:html/continueBoot.html")); + emit initFbgui(); + this->hide(); +} + + + +/** + * read the log file. Log File will be presented inside of a dialog. + */ +QString ndgui::readLogFile() { + qDebug() << _tag << "show log"; + return networkDiscovery.readLogFile(); +} + + + +/*test html gui version*/ + +/** + * fills the drop down box of the manual interface configuration + * dialog. + */ +QVariantList ndgui::getManualConfInterfaces() { + qDebug() << _tag << "call getManualConfInterfaces"; + QVariantList jsonArr; + foreach (QString s, _manConfList) { + QVariant e(s); + jsonArr << e; + } + qDebug() << _tag << "value of jsonArr:" << jsonArr; + return jsonArr; +} + + + +/** + * 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") { + //qDebug()<< 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){ + qDebug() << _tag << "------ called:" << msg; +} -- cgit v1.2.3-55-g7522