diff --git a/components/NetworkStatusItem.qml b/components/NetworkStatusItem.qml index 48eeccc2..46e9fbd6 100644 --- a/components/NetworkStatusItem.qml +++ b/components/NetworkStatusItem.qml @@ -201,6 +201,7 @@ Rectangle { daemonManager.sendCommandAsync( ["set_bootstrap_daemon", "auto"], appWindow.currentWallet.nettype, + persistentSettings.blockchainDataDir, callback); refreshMouseArea.visible = false; diff --git a/main.qml b/main.qml index abf08edb..8e7c90ef 100644 --- a/main.qml +++ b/main.qml @@ -469,7 +469,7 @@ ApplicationWindow { // If wallet isnt connected, advanced wallet mode and no daemon is running - Ask if (appWindow.walletMode >= 2 && !persistentSettings.useRemoteNode && !walletInitialized && disconnected) { - daemonManager.runningAsync(persistentSettings.nettype, function(running) { + daemonManager.runningAsync(persistentSettings.nettype, persistentSettings.blockchainDataDir, function(running) { if (!running) { daemonManagerDialog.open(); } @@ -714,7 +714,7 @@ ApplicationWindow { appWindow.showProcessingSplash(qsTr("Waiting for daemon to stop...")); } p2poolManager.exit() - daemonManager.stopAsync(persistentSettings.nettype, function(result) { + daemonManager.stopAsync(persistentSettings.nettype, persistentSettings.blockchainDataDir, function(result) { daemonStartStopInProgress = 0; if (splash) { hideProcessingSplash(); @@ -2141,7 +2141,7 @@ ApplicationWindow { if (currentWallet) { handler(!currentWallet.disconnected); } else { - daemonManager.runningAsync(persistentSettings.nettype, handler); + daemonManager.runningAsync(persistentSettings.nettype, persistentSettings.blockchainDataDir, handler); } } } diff --git a/pages/Mining.qml b/pages/Mining.qml index 8d5a2522..e9ab1d07 100644 --- a/pages/Mining.qml +++ b/pages/Mining.qml @@ -297,7 +297,7 @@ Rectangle { startP2Pool() } else { - daemonManager.stopAsync(persistentSettings.nettype, startP2PoolLocal) + daemonManager.stopAsync(persistentSettings.nettype, persistentSettings.blockchainDataDir, startP2PoolLocal) } } else { diff --git a/pages/settings/SettingsLog.qml b/pages/settings/SettingsLog.qml index 4c393ee9..d11201b0 100644 --- a/pages/settings/SettingsLog.qml +++ b/pages/settings/SettingsLog.qml @@ -254,7 +254,7 @@ Rectangle { onAccepted: { if(text.length > 0) { consoleArea.logCommand(">>> " + text) - daemonManager.sendCommandAsync(text.split(" "), currentWallet.nettype, function(result) { + daemonManager.sendCommandAsync(text.split(" "), currentWallet.nettype, persistentSettings.blockchainDataDir, function(result) { if (!result) { appWindow.showStatusMessage(qsTr("Failed to send command"), 3); } diff --git a/src/daemon/DaemonManager.cpp b/src/daemon/DaemonManager.cpp index ad8bab16..6a5a8233 100644 --- a/src/daemon/DaemonManager.cpp +++ b/src/daemon/DaemonManager.cpp @@ -130,8 +130,8 @@ bool DaemonManager::start(const QString &flags, NetworkType::Type nettype, const } // Start start watcher - m_scheduler.run([this, nettype, noSync] { - if (startWatcher(nettype)) { + m_scheduler.run([this, nettype, dataDir, noSync] { + if (startWatcher(nettype, dataDir)) { emit daemonStarted(); m_noSync = noSync; } else { @@ -142,13 +142,13 @@ bool DaemonManager::start(const QString &flags, NetworkType::Type nettype, const return true; } -void DaemonManager::stopAsync(NetworkType::Type nettype, const QJSValue& callback) +void DaemonManager::stopAsync(NetworkType::Type nettype, const QString &dataDir, const QJSValue& callback) { - const auto feature = m_scheduler.run([this, nettype] { + const auto feature = m_scheduler.run([this, nettype, dataDir] { QString message; - sendCommand({"exit"}, nettype, message); + sendCommand({"exit"}, nettype, dataDir, message); - return QJSValueList({stopWatcher(nettype)}); + return QJSValueList({stopWatcher(nettype, dataDir)}); }, callback); if (!feature.first) @@ -157,14 +157,14 @@ void DaemonManager::stopAsync(NetworkType::Type nettype, const QJSValue& callbac } } -bool DaemonManager::startWatcher(NetworkType::Type nettype) const +bool DaemonManager::startWatcher(NetworkType::Type nettype, const QString &dataDir) const { // Check if daemon is started every 2 seconds QElapsedTimer timer; timer.start(); while(true && !m_app_exit && timer.elapsed() / 1000 < DAEMON_START_TIMEOUT_SECONDS ) { QThread::sleep(2); - if(!running(nettype)) { + if(!running(nettype, dataDir)) { qDebug() << "daemon not running. checking again in 2 seconds."; } else { qDebug() << "daemon is started. Waiting 5 seconds to let daemon catch up"; @@ -175,14 +175,14 @@ bool DaemonManager::startWatcher(NetworkType::Type nettype) const return false; } -bool DaemonManager::stopWatcher(NetworkType::Type nettype) const +bool DaemonManager::stopWatcher(NetworkType::Type nettype, const QString &dataDir) const { // Check if daemon is running every 2 seconds. Kill if still running after 10 seconds int counter = 0; while(true && !m_app_exit) { QThread::sleep(2); counter++; - if(running(nettype)) { + if(running(nettype, dataDir)) { qDebug() << "Daemon still running. " << counter; if(counter >= 5) { qDebug() << "Killing it! "; @@ -236,10 +236,10 @@ void DaemonManager::printError() } } -bool DaemonManager::running(NetworkType::Type nettype) const +bool DaemonManager::running(NetworkType::Type nettype, const QString &dataDir) const { QString status; - sendCommand({"sync_info"}, nettype, status); + sendCommand({"sync_info"}, nettype, dataDir, status); qDebug() << status; return status.contains("Height:"); } @@ -249,14 +249,14 @@ bool DaemonManager::noSync() const noexcept return m_noSync; } -void DaemonManager::runningAsync(NetworkType::Type nettype, const QJSValue& callback) const +void DaemonManager::runningAsync(NetworkType::Type nettype, const QString &dataDir, const QJSValue& callback) const { - m_scheduler.run([this, nettype] { - return QJSValueList({running(nettype)}); + m_scheduler.run([this, nettype, dataDir] { + return QJSValueList({running(nettype, dataDir)}); }, callback); } -bool DaemonManager::sendCommand(const QStringList &cmd, NetworkType::Type nettype, QString &message) const +bool DaemonManager::sendCommand(const QStringList &cmd, NetworkType::Type nettype, const QString &dataDir, QString &message) const { QProcess p; QStringList external_cmd(cmd); @@ -267,6 +267,11 @@ bool DaemonManager::sendCommand(const QStringList &cmd, NetworkType::Type nettyp else if (nettype == NetworkType::STAGENET) external_cmd << "--stagenet"; + // Custom data-dir + if (!dataDir.isEmpty()) { + external_cmd << "--data-dir" << dataDir; + } + qDebug() << "sending external cmd: " << external_cmd; @@ -278,11 +283,11 @@ bool DaemonManager::sendCommand(const QStringList &cmd, NetworkType::Type nettyp return started; } -void DaemonManager::sendCommandAsync(const QStringList &cmd, NetworkType::Type nettype, const QJSValue& callback) const +void DaemonManager::sendCommandAsync(const QStringList &cmd, NetworkType::Type nettype, const QString &dataDir, const QJSValue& callback) const { - m_scheduler.run([this, cmd, nettype] { + m_scheduler.run([this, cmd, nettype, dataDir] { QString message; - return QJSValueList({sendCommand(cmd, nettype, message)}); + return QJSValueList({sendCommand(cmd, nettype, dataDir, message)}); }, callback); } diff --git a/src/daemon/DaemonManager.h b/src/daemon/DaemonManager.h index 2f884665..5a48a489 100644 --- a/src/daemon/DaemonManager.h +++ b/src/daemon/DaemonManager.h @@ -48,23 +48,23 @@ public: ~DaemonManager(); Q_INVOKABLE bool start(const QString &flags, NetworkType::Type nettype, const QString &dataDir = "", const QString &bootstrapNodeAddress = "", bool noSync = false, bool pruneBlockchain = false); - Q_INVOKABLE void stopAsync(NetworkType::Type nettype, const QJSValue& callback); + Q_INVOKABLE void stopAsync(NetworkType::Type nettype, const QString &dataDir, const QJSValue& callback); Q_INVOKABLE bool noSync() const noexcept; // return true if daemon process is started - Q_INVOKABLE void runningAsync(NetworkType::Type nettype, const QJSValue& callback) const; + Q_INVOKABLE void runningAsync(NetworkType::Type nettype, const QString &dataDir, const QJSValue& callback) const; // Send daemon command from qml and prints output in console window. - Q_INVOKABLE void sendCommandAsync(const QStringList &cmd, NetworkType::Type nettype, const QJSValue& callback) const; + Q_INVOKABLE void sendCommandAsync(const QStringList &cmd, NetworkType::Type nettype, const QString &dataDir, const QJSValue& callback) const; Q_INVOKABLE void exit(); Q_INVOKABLE QVariantMap validateDataDir(const QString &dataDir) const; Q_INVOKABLE bool checkLmdbExists(QString datadir); private: - bool running(NetworkType::Type nettype) const; - bool sendCommand(const QStringList &cmd, NetworkType::Type nettype, QString &message) const; - bool startWatcher(NetworkType::Type nettype) const; - bool stopWatcher(NetworkType::Type nettype) const; + bool running(NetworkType::Type nettype, const QString &dataDir) const; + bool sendCommand(const QStringList &cmd, NetworkType::Type nettype, const QString &dataDir, QString &message) const; + bool startWatcher(NetworkType::Type nettype, const QString &dataDir) const; + bool stopWatcher(NetworkType::Type nettype, const QString &dataDir) const; signals: void daemonStarted() const; void daemonStopped() const;