aboutsummaryrefslogtreecommitdiff
path: root/src/daemon/DaemonManager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/daemon/DaemonManager.cpp')
-rw-r--r--src/daemon/DaemonManager.cpp142
1 files changed, 142 insertions, 0 deletions
diff --git a/src/daemon/DaemonManager.cpp b/src/daemon/DaemonManager.cpp
new file mode 100644
index 00000000..185cde1e
--- /dev/null
+++ b/src/daemon/DaemonManager.cpp
@@ -0,0 +1,142 @@
+#include "DaemonManager.h"
+#include <QFile>
+#include <QFileInfo>
+#include <QDir>
+#include <QDebug>
+#include <QUrl>
+#include <QtConcurrent/QtConcurrent>
+#include <QApplication>
+#include <QProcess>
+
+DaemonManager * DaemonManager::m_instance = nullptr;
+QStringList DaemonManager::m_clArgs;
+
+DaemonManager *DaemonManager::instance(const QStringList *args)
+{
+ if (!m_instance) {
+ m_instance = new DaemonManager;
+ // store command line arguments for later use
+ m_clArgs = *args;
+ m_clArgs.removeFirst();
+ }
+
+ return m_instance;
+}
+
+bool DaemonManager::start()
+{
+ //
+ QString process;
+#ifdef Q_OS_WIN
+ process = QApplication::applicationDirPath() + "/monerod.exe";
+#elif defined(Q_OS_UNIX)
+ process = QApplication::applicationDirPath() + "/monerod";
+#endif
+
+ if (process.length() == 0) {
+ qDebug() << "no daemon binary defined for current platform";
+ return false;
+ }
+
+
+ // prepare command line arguments and pass to monerod
+ QStringList arguments;
+ foreach (const QString &str, m_clArgs) {
+ qDebug() << QString(" [%1] ").arg(str);
+ arguments << str;
+ }
+
+ qDebug() << "starting monerod " + process;
+ qDebug() << "With command line arguments " << arguments;
+
+ m_daemon = new QProcess();
+ initialized = true;
+
+ // Connect output slots
+ connect (m_daemon, SIGNAL(readyReadStandardOutput()), this, SLOT(printOutput()));
+ connect (m_daemon, SIGNAL(readyReadStandardError()), this, SLOT(printError()));
+
+ // Start monerod
+ m_daemon->start(process,arguments);
+ bool started = m_daemon->waitForStarted();
+
+ // add state changed listener
+ connect(m_daemon,SIGNAL(stateChanged(QProcess::ProcessState)),this,SLOT(stateChanged(QProcess::ProcessState)));
+
+ if (!started) {
+ qDebug() << "Daemon start error: " + m_daemon->errorString();
+ } else {
+ emit daemonStarted();
+ }
+
+ return started;
+}
+
+bool DaemonManager::stop()
+{
+ if (initialized) {
+ qDebug() << "stopping daemon";
+ // we can't use QProcess::terminate() on windows console process
+ // write exit command to stdin
+ m_daemon->write("exit\n");
+ }
+
+ return true;
+}
+
+void DaemonManager::stateChanged(QProcess::ProcessState state)
+{
+ qDebug() << "STATE CHANGED: " << state;
+ if (state == QProcess::NotRunning) {
+ emit daemonStopped();
+ }
+}
+
+void DaemonManager::printOutput()
+{
+ QByteArray byteArray = m_daemon->readAllStandardOutput();
+ QStringList strLines = QString(byteArray).split("\n");
+
+ foreach (QString line, strLines) {
+ emit daemonConsoleUpdated(line);
+ qDebug() << "Daemon: " + line;
+ }
+}
+
+void DaemonManager::printError()
+{
+ QByteArray byteArray = m_daemon->readAllStandardError();
+ QStringList strLines = QString(byteArray).split("\n");
+
+ foreach (QString line, strLines) {
+ emit daemonConsoleUpdated(line);
+ qDebug() << "Daemon ERROR: " + line;
+ }
+}
+
+bool DaemonManager::running() const
+{
+ if (initialized) {
+ qDebug() << m_daemon->state();
+ qDebug() << QProcess::NotRunning;
+ // m_daemon->write("status\n");
+ return m_daemon->state() > QProcess::NotRunning;
+ }
+ return false;
+}
+
+DaemonManager::DaemonManager(QObject *parent)
+ : QObject(parent)
+{
+
+}
+
+void DaemonManager::closing()
+{
+ qDebug() << __FUNCTION__;
+ stop();
+ // Wait for daemon to stop before exiting (max 10 secs)
+ if (initialized) {
+ m_daemon->waitForFinished(10000);
+ }
+}