From 9d80672f62c2d84db047b1457c55830f4f13feee Mon Sep 17 00:00:00 2001 From: FireMartZ Date: Tue, 18 Jun 2019 10:49:59 -0400 Subject: [PATCH] Fix a few issues related to starting and stopping hushd. --- src/connection.cpp | 27 +++++++++++++++++---------- src/connection.h | 2 +- src/rpc.cpp | 5 +++-- src/rpc.h | 6 +++--- 4 files changed, 24 insertions(+), 16 deletions(-) diff --git a/src/connection.cpp b/src/connection.cpp index b0b8aeb..8d49045 100644 --- a/src/connection.cpp +++ b/src/connection.cpp @@ -178,6 +178,9 @@ void ConnectionLoader::createZcashConf() { QFile file(confLocation); if (!file.open(QIODevice::ReadWrite | QIODevice::Truncate)) { main->logger->write("Could not create HUSH3.conf, returning"); + + QString explanation = QString() % QObject::tr("Could not create HUSH3.conf."); + this->showError(explanation); return; } @@ -342,6 +345,8 @@ bool ConnectionLoader::startEmbeddedZcashd() { } #elif defined(Q_OS_DARWIN) auto zcashdProgram = appPath.absoluteFilePath("hushd"); +#elif defined(Q_OS_WIN64) + auto zcashdProgram = appPath.absoluteFilePath("hushd.bat"); #else //TODO: Not Linux + not darwin DOES NOT EQUAL windows!!! auto zcashdProgram = appPath.absoluteFilePath("hushd"); @@ -353,23 +358,25 @@ bool ConnectionLoader::startEmbeddedZcashd() { return false; } - ezcashd = new QProcess(main); - QObject::connect(ezcashd, &QProcess::started, [=] () { + ezcashd = std::shared_ptr(new QProcess(main)); + QObject::connect(ezcashd.get(), &QProcess::started, [=] () { qDebug() << "Embedded hushd started"; }); - QObject::connect(ezcashd, QOverload::of(&QProcess::finished), - [=](int, QProcess::ExitStatus) { - //qDebug() << "hushd finished with code " << exitCode << "," << exitStatus; + QObject::connect(ezcashd.get(), QOverload::of(&QProcess::finished), + [=](int exitCode, QProcess::ExitStatus exitStatus) { + qDebug() << "hushd finished with code " << exitCode << "," << exitStatus; }); - QObject::connect(ezcashd, &QProcess::errorOccurred, [&] (auto) { - //qDebug() << "Couldn't start hushd: " << error; + QObject::connect(ezcashd.get(), &QProcess::errorOccurred, [&] (QProcess::ProcessError error) { + qDebug() << "Couldn't start hushd: " << error; }); - QObject::connect(ezcashd, &QProcess::readyReadStandardError, [=]() { - auto output = ezcashd->readAllStandardError(); - main->logger->write("hushd stderr:" + output); + std::weak_ptr weak_obj(ezcashd); + auto ptr_main(main); + QObject::connect(ezcashd.get(), &QProcess::readyReadStandardError, [weak_obj, ptr_main]() { + auto output = weak_obj.lock()->readAllStandardError(); + ptr_main->logger->write("hushd stderr:" + output); processStdErrOutput.append(output); }); diff --git a/src/connection.h b/src/connection.h index 9e140be..e192d49 100644 --- a/src/connection.h +++ b/src/connection.h @@ -64,7 +64,7 @@ private: void doRPCSetConnection(Connection* conn); - QProcess* ezcashd = nullptr; + std::shared_ptr ezcashd; QDialog* d; Ui_ConnectionDialog* connD; diff --git a/src/rpc.cpp b/src/rpc.cpp index 56401b6..f921b7b 100644 --- a/src/rpc.cpp +++ b/src/rpc.cpp @@ -73,7 +73,7 @@ RPC::~RPC() { delete conn; } -void RPC::setEZcashd(QProcess* p) { +void RPC::setEZcashd(std::shared_ptr p) { ezcashd = p; if (ezcashd && ui->tabWidget->widget(4) == nullptr) { @@ -1140,7 +1140,8 @@ void RPC::shutdownZcashd() { waitCount++; if ((ezcashd->atEnd() && ezcashd->processId() == 0) || - waitCount > 30 || + ezcashd->state() == QProcess::NotRunning || + waitCount > 30 || conn->config->zcashDaemon) { // If zcashd is daemon, then we don't have to do anything else qDebug() << "Ended"; waiter.stop(); diff --git a/src/rpc.h b/src/rpc.h index 7cc6610..3b95a71 100644 --- a/src/rpc.h +++ b/src/rpc.h @@ -38,8 +38,8 @@ public: ~RPC(); void setConnection(Connection* c); - void setEZcashd(QProcess* p); - const QProcess* getEZcashD() { return ezcashd; } + void setEZcashd(std::shared_ptr p); + const QProcess* getEZcashD() { return ezcashd.get(); } void refresh(bool force = false); @@ -109,7 +109,7 @@ private: void getTAddresses (const std::function& cb); Connection* conn = nullptr; - QProcess* ezcashd = nullptr; + std::shared_ptr ezcashd = nullptr; QList* utxos = nullptr; QMap* allBalances = nullptr;