summaryrefslogtreecommitdiffstats
path: root/src/ndgui.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ndgui.cpp')
-rw-r--r--src/ndgui.cpp370
1 files changed, 370 insertions, 0 deletions
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;
+}