From 4cdc258b152e54766bdb8c26ceee4b5ddf4bb9b6 Mon Sep 17 00:00:00 2001 From: Jacob Brydolf Date: Sat, 5 Nov 2016 10:47:17 +0100 Subject: WalletManager: basic functionality --- src/daemon/DaemonManager.cpp | 87 ++++++++++++++++++++++++++++++++++++++++++++ src/daemon/DaemonManager.h | 41 +++++++++++++++++++++ 2 files changed, 128 insertions(+) create mode 100644 src/daemon/DaemonManager.cpp create mode 100644 src/daemon/DaemonManager.h (limited to 'src') diff --git a/src/daemon/DaemonManager.cpp b/src/daemon/DaemonManager.cpp new file mode 100644 index 00000000..30ae06cd --- /dev/null +++ b/src/daemon/DaemonManager.cpp @@ -0,0 +1,87 @@ +#include "DaemonManager.h" +#include +#include +#include +#include +#include +#include +#include +#include + +DaemonManager * DaemonManager::m_instance = nullptr; + +DaemonManager *DaemonManager::instance() +{ + if (!m_instance) { + m_instance = new DaemonManager; + } + + return m_instance; +} + +bool DaemonManager::start() +{ + QString program = QApplication::applicationDirPath() + "/monerod"; + qDebug() << "starting monerod " + program; + QStringList arguments; + + m_daemon = new QProcess(); + + connect (m_daemon, SIGNAL(readyReadStandardOutput()), this, SLOT(printOutput())); + connect (m_daemon, SIGNAL(readyReadStandardError()), this, SLOT(printError())); + + + m_daemon->start(program); + bool started = m_daemon->waitForStarted(); + + if(!started){ + qDebug() << "Daemon start error: " + m_daemon->errorString(); + } + + return started; +} + +bool DaemonManager::stop() +{ + return true; +} + +void DaemonManager::printOutput() +{ + QByteArray byteArray = m_daemon->readAllStandardOutput(); + QStringList strLines = QString(byteArray).split("\n"); + + foreach (QString line, strLines){ + // dConsole.append(line+"\n"); + qDebug() << "Daemon: " + line; + } +} + +void DaemonManager::printError() +{ + QByteArray byteArray = m_daemon->readAllStandardError(); + QStringList strLines = QString(byteArray).split("\n"); + + foreach (QString line, strLines){ + // dConsole.append(line+"\n"); + qDebug() << "Daemon ERROR: " + line; + } +} + +bool DaemonManager::running() const +{ + return m_daemon && m_daemon->state() > QProcess::NotRunning; +} + +QString DaemonManager::console() const +{ + return dConsole; +} + + +DaemonManager::DaemonManager(QObject *parent) + : QObject(parent) +{ + +} + diff --git a/src/daemon/DaemonManager.h b/src/daemon/DaemonManager.h new file mode 100644 index 00000000..669f9119 --- /dev/null +++ b/src/daemon/DaemonManager.h @@ -0,0 +1,41 @@ +#ifndef DAEMONMANAGER_H +#define DAEMONMANAGER_H + +#include +#include +#include + +class DaemonManager : public QObject +{ + Q_OBJECT + +public: + + static DaemonManager * instance(); + + Q_INVOKABLE bool start(); + Q_INVOKABLE bool stop(); + Q_INVOKABLE QString console() const; + + // return true if daemon process is started + Q_INVOKABLE bool running() const; + +signals: + + void daemonStarted(const QProcess &d); + void daemonStopped(); + +public slots: + void printOutput(); + void printError(); + +private: + + explicit DaemonManager(QObject *parent = 0); + static DaemonManager * m_instance; + QProcess *m_daemon; + QString dConsole; + +}; + +#endif // DAEMONMANAGER_H -- cgit v1.2.3 From 48471f3407b8263f66254a39d693604de8894a38 Mon Sep 17 00:00:00 2001 From: Jaquee Date: Fri, 25 Nov 2016 21:09:32 +0100 Subject: onDaemonStarted/stopped signals/slots --- main.qml | 31 ++++++++++++++++++------------- src/daemon/DaemonManager.cpp | 11 +++++++++++ src/daemon/DaemonManager.h | 3 +-- 3 files changed, 30 insertions(+), 15 deletions(-) (limited to 'src') diff --git a/main.qml b/main.qml index af027f5e..e9a36684 100644 --- a/main.qml +++ b/main.qml @@ -59,6 +59,7 @@ ApplicationWindow { property int restoreHeight:0 property bool daemonSynced: false property int maxWindowHeight: (Screen.height < 900)? 720 : 800; + property bool daemonRunning: false // true if wallet ever synchronized property bool walletInitialized : false @@ -292,6 +293,10 @@ ApplicationWindow { // TODO: implement onDaemonSynced or similar in wallet API and don't start refresh thread before daemon is synced daemonSynced = (currentWallet.connected != Wallet.ConnectionStatus_Disconnected && dCurrentBlock >= dTargetBlock) + // If wallet isnt connected and no daemon is running - Ask + if(!currentWallet.connected && !daemonManager.running() && !walletInitialized){ + daemonManagerDialog.open(); + } // Refresh is succesfull if blockchain height > 1 if (currentWallet.blockChainHeight() > 1){ @@ -317,22 +322,19 @@ ApplicationWindow { walletInitialized = true } - - - - // daemonManager.daemonConsole(); - // console.log("Daemon runnnig: ",daemonManager.running()); - - if(!daemonManager.running()){ - daemonManagerDialog.open(); - } - - - - onWalletUpdate(); } + function onDaemonStarted(){ + console.log("daemon started"); + daemonRunning = true; + } + function onDaemonStopped(){ + console.log("daemon stopped"); + daemonRunning = false; + } + + function onWalletNewBlock(blockHeight) { if (splash.visible) { var currHeight = blockHeight @@ -645,6 +647,9 @@ ApplicationWindow { walletManager.walletOpened.connect(onWalletOpened); walletManager.walletClosed.connect(onWalletClosed); + daemonManager.daemonStarted.connect(onDaemonStarted); + daemonManager.daemonStopped.connect(onDaemonStopped); + if(!walletsFound()) { rootItem.state = "wizard" } else { diff --git a/src/daemon/DaemonManager.cpp b/src/daemon/DaemonManager.cpp index 30ae06cd..a637d281 100644 --- a/src/daemon/DaemonManager.cpp +++ b/src/daemon/DaemonManager.cpp @@ -36,6 +36,8 @@ bool DaemonManager::start() if(!started){ qDebug() << "Daemon start error: " + m_daemon->errorString(); + } else { + emit daemonStarted(); } return started; @@ -43,6 +45,15 @@ bool DaemonManager::start() bool DaemonManager::stop() { + if(m_daemon){ + qDebug() << "stopping daemon"; + m_daemon->terminate(); + // Wait until stopped. Max 30 seconds + bool stopped = m_daemon->waitForFinished(30000); + if(stopped) emit daemonStopped(); + return stopped; + } + return true; } diff --git a/src/daemon/DaemonManager.h b/src/daemon/DaemonManager.h index 669f9119..b4170047 100644 --- a/src/daemon/DaemonManager.h +++ b/src/daemon/DaemonManager.h @@ -21,8 +21,7 @@ public: Q_INVOKABLE bool running() const; signals: - - void daemonStarted(const QProcess &d); + void daemonStarted(); void daemonStopped(); public slots: -- cgit v1.2.3 From 3df9e44849cfd0e086d33b79d4dacd03b99a5583 Mon Sep 17 00:00:00 2001 From: Jacob Brydolf Date: Mon, 7 Nov 2016 11:55:11 +0100 Subject: DaemonManager: windows support --- src/daemon/DaemonManager.cpp | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/daemon/DaemonManager.cpp b/src/daemon/DaemonManager.cpp index a637d281..80d7c8a4 100644 --- a/src/daemon/DaemonManager.cpp +++ b/src/daemon/DaemonManager.cpp @@ -21,17 +21,33 @@ DaemonManager *DaemonManager::instance() bool DaemonManager::start() { - QString program = QApplication::applicationDirPath() + "/monerod"; - qDebug() << "starting monerod " + program; + + // + 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; + } + + qDebug() << "starting monerod " + process; + + // TODO: forward CLI arguments QStringList arguments; m_daemon = new QProcess(); + // Connect output slots connect (m_daemon, SIGNAL(readyReadStandardOutput()), this, SLOT(printOutput())); connect (m_daemon, SIGNAL(readyReadStandardError()), this, SLOT(printError())); - m_daemon->start(program); + m_daemon->start(process); bool started = m_daemon->waitForStarted(); if(!started){ @@ -48,8 +64,8 @@ bool DaemonManager::stop() if(m_daemon){ qDebug() << "stopping daemon"; m_daemon->terminate(); - // Wait until stopped. Max 30 seconds - bool stopped = m_daemon->waitForFinished(30000); + // Wait until stopped. Max 10 seconds + bool stopped = m_daemon->waitForFinished(10000); if(stopped) emit daemonStopped(); return stopped; } -- cgit v1.2.3 From 3a431543fab567d42f5981d82687c1c9a9244f68 Mon Sep 17 00:00:00 2001 From: Jacob Brydolf Date: Mon, 7 Nov 2016 13:10:10 +0100 Subject: DaemonManager: added console updated signals --- src/daemon/DaemonManager.cpp | 17 +++++++++++++---- src/daemon/DaemonManager.h | 2 ++ 2 files changed, 15 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/daemon/DaemonManager.cpp b/src/daemon/DaemonManager.cpp index 80d7c8a4..1fdfcd52 100644 --- a/src/daemon/DaemonManager.cpp +++ b/src/daemon/DaemonManager.cpp @@ -41,6 +41,7 @@ bool DaemonManager::start() QStringList arguments; m_daemon = new QProcess(); + initialized = true; // Connect output slots connect (m_daemon, SIGNAL(readyReadStandardOutput()), this, SLOT(printOutput())); @@ -61,7 +62,7 @@ bool DaemonManager::start() bool DaemonManager::stop() { - if(m_daemon){ + if(initialized){ qDebug() << "stopping daemon"; m_daemon->terminate(); // Wait until stopped. Max 10 seconds @@ -80,7 +81,8 @@ void DaemonManager::printOutput() foreach (QString line, strLines){ // dConsole.append(line+"\n"); - qDebug() << "Daemon: " + line; + emit daemonConsoleUpdated(line); + // qDebug() << "Daemon: " + line; } } @@ -91,13 +93,20 @@ void DaemonManager::printError() foreach (QString line, strLines){ // dConsole.append(line+"\n"); - qDebug() << "Daemon ERROR: " + line; + emit daemonConsoleUpdated(line); + // qDebug() << "Daemon ERROR: " + line; } } bool DaemonManager::running() const { - return m_daemon && m_daemon->state() > QProcess::NotRunning; + if(initialized){ + qDebug() << m_daemon->state(); + qDebug() << QProcess::NotRunning; + + return m_daemon->state() > QProcess::NotRunning; + } + return false; } QString DaemonManager::console() const diff --git a/src/daemon/DaemonManager.h b/src/daemon/DaemonManager.h index b4170047..4dfc77a1 100644 --- a/src/daemon/DaemonManager.h +++ b/src/daemon/DaemonManager.h @@ -23,6 +23,7 @@ public: signals: void daemonStarted(); void daemonStopped(); + void daemonConsoleUpdated(QString message); public slots: void printOutput(); @@ -34,6 +35,7 @@ private: static DaemonManager * m_instance; QProcess *m_daemon; QString dConsole; + bool initialized = false; }; -- cgit v1.2.3 From 7840dab9cc03730ceaf7bfdc0b93674bc6489de6 Mon Sep 17 00:00:00 2001 From: Jacob Brydolf Date: Mon, 7 Nov 2016 15:00:14 +0100 Subject: DaemonManager: console debug output --- src/daemon/DaemonManager.cpp | 12 ++---------- src/daemon/DaemonManager.h | 2 -- 2 files changed, 2 insertions(+), 12 deletions(-) (limited to 'src') diff --git a/src/daemon/DaemonManager.cpp b/src/daemon/DaemonManager.cpp index 1fdfcd52..aa87f1c6 100644 --- a/src/daemon/DaemonManager.cpp +++ b/src/daemon/DaemonManager.cpp @@ -80,9 +80,8 @@ void DaemonManager::printOutput() QStringList strLines = QString(byteArray).split("\n"); foreach (QString line, strLines){ - // dConsole.append(line+"\n"); emit daemonConsoleUpdated(line); - // qDebug() << "Daemon: " + line; + qDebug() << "Daemon: " + line; } } @@ -92,9 +91,8 @@ void DaemonManager::printError() QStringList strLines = QString(byteArray).split("\n"); foreach (QString line, strLines){ - // dConsole.append(line+"\n"); emit daemonConsoleUpdated(line); - // qDebug() << "Daemon ERROR: " + line; + qDebug() << "Daemon ERROR: " + line; } } @@ -109,12 +107,6 @@ bool DaemonManager::running() const return false; } -QString DaemonManager::console() const -{ - return dConsole; -} - - DaemonManager::DaemonManager(QObject *parent) : QObject(parent) { diff --git a/src/daemon/DaemonManager.h b/src/daemon/DaemonManager.h index 4dfc77a1..4ee5214e 100644 --- a/src/daemon/DaemonManager.h +++ b/src/daemon/DaemonManager.h @@ -15,7 +15,6 @@ public: Q_INVOKABLE bool start(); Q_INVOKABLE bool stop(); - Q_INVOKABLE QString console() const; // return true if daemon process is started Q_INVOKABLE bool running() const; @@ -34,7 +33,6 @@ private: explicit DaemonManager(QObject *parent = 0); static DaemonManager * m_instance; QProcess *m_daemon; - QString dConsole; bool initialized = false; }; -- cgit v1.2.3 From b4eb489b001fb23382fe2725f747b1d94abacd76 Mon Sep 17 00:00:00 2001 From: Jacob Brydolf Date: Mon, 7 Nov 2016 18:08:09 +0100 Subject: DaemonManager: forward command line arguments to monerod --- src/daemon/DaemonManager.cpp | 20 +++++++++++++++----- src/daemon/DaemonManager.h | 3 ++- 2 files changed, 17 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/daemon/DaemonManager.cpp b/src/daemon/DaemonManager.cpp index aa87f1c6..122aec5e 100644 --- a/src/daemon/DaemonManager.cpp +++ b/src/daemon/DaemonManager.cpp @@ -9,11 +9,15 @@ #include DaemonManager * DaemonManager::m_instance = nullptr; +QStringList DaemonManager::clArgs; -DaemonManager *DaemonManager::instance() +DaemonManager *DaemonManager::instance(QStringList args) { if (!m_instance) { m_instance = new DaemonManager; + // store command line arguments for later use + clArgs = args; + clArgs.removeFirst(); } return m_instance; @@ -35,10 +39,16 @@ bool DaemonManager::start() return false; } - qDebug() << "starting monerod " + process; - // TODO: forward CLI arguments + // prepare command line arguments and pass to monerod QStringList arguments; + foreach (const QString &str, clArgs) { + qDebug() << QString(" [%1] ").arg(str); + arguments << str; + } + + qDebug() << "starting monerod " + process; + qDebug() << "With command line arguments " << arguments; m_daemon = new QProcess(); initialized = true; @@ -47,8 +57,8 @@ bool DaemonManager::start() connect (m_daemon, SIGNAL(readyReadStandardOutput()), this, SLOT(printOutput())); connect (m_daemon, SIGNAL(readyReadStandardError()), this, SLOT(printError())); - - m_daemon->start(process); + // Start monerod + m_daemon->start(process,arguments); bool started = m_daemon->waitForStarted(); if(!started){ diff --git a/src/daemon/DaemonManager.h b/src/daemon/DaemonManager.h index 4ee5214e..6beb14ed 100644 --- a/src/daemon/DaemonManager.h +++ b/src/daemon/DaemonManager.h @@ -11,7 +11,7 @@ class DaemonManager : public QObject public: - static DaemonManager * instance(); + static DaemonManager * instance(QStringList args); Q_INVOKABLE bool start(); Q_INVOKABLE bool stop(); @@ -32,6 +32,7 @@ private: explicit DaemonManager(QObject *parent = 0); static DaemonManager * m_instance; + static QStringList clArgs; QProcess *m_daemon; bool initialized = false; -- cgit v1.2.3 From 7876957b484580fcf3d3d9224e6b7f3b165025f4 Mon Sep 17 00:00:00 2001 From: Jacob Brydolf Date: Mon, 7 Nov 2016 23:06:18 +0100 Subject: DaemonManager::closing() --- src/daemon/DaemonManager.cpp | 5 +++++ src/daemon/DaemonManager.h | 1 + 2 files changed, 6 insertions(+) (limited to 'src') diff --git a/src/daemon/DaemonManager.cpp b/src/daemon/DaemonManager.cpp index 122aec5e..293c600b 100644 --- a/src/daemon/DaemonManager.cpp +++ b/src/daemon/DaemonManager.cpp @@ -123,3 +123,8 @@ DaemonManager::DaemonManager(QObject *parent) } +void DaemonManager::closing() +{ + qDebug() << __FUNCTION__; + stop(); +} diff --git a/src/daemon/DaemonManager.h b/src/daemon/DaemonManager.h index 6beb14ed..5c1234d6 100644 --- a/src/daemon/DaemonManager.h +++ b/src/daemon/DaemonManager.h @@ -27,6 +27,7 @@ signals: public slots: void printOutput(); void printError(); + void closing(); private: -- cgit v1.2.3 From 8d19a03b6801272552e2157623c320d51f6aaad5 Mon Sep 17 00:00:00 2001 From: Jaquee Date: Sat, 26 Nov 2016 11:54:06 +0100 Subject: DaemonManager: add stateChanged() --- src/daemon/DaemonManager.cpp | 21 +++++++++++++++------ src/daemon/DaemonManager.h | 1 + 2 files changed, 16 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/daemon/DaemonManager.cpp b/src/daemon/DaemonManager.cpp index 293c600b..3769302a 100644 --- a/src/daemon/DaemonManager.cpp +++ b/src/daemon/DaemonManager.cpp @@ -61,6 +61,9 @@ bool DaemonManager::start() 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 { @@ -74,16 +77,22 @@ bool DaemonManager::stop() { if(initialized){ qDebug() << "stopping daemon"; - m_daemon->terminate(); - // Wait until stopped. Max 10 seconds - bool stopped = m_daemon->waitForFinished(10000); - if(stopped) emit daemonStopped(); - return stopped; + // 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(); @@ -111,7 +120,7 @@ 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; diff --git a/src/daemon/DaemonManager.h b/src/daemon/DaemonManager.h index 5c1234d6..1c4ae8ad 100644 --- a/src/daemon/DaemonManager.h +++ b/src/daemon/DaemonManager.h @@ -28,6 +28,7 @@ public slots: void printOutput(); void printError(); void closing(); + void stateChanged(QProcess::ProcessState state); private: -- cgit v1.2.3 From d9f4ab45e2bfba2baf3d454d659f1776b5ea69a9 Mon Sep 17 00:00:00 2001 From: Jaquee Date: Sat, 26 Nov 2016 13:41:34 +0100 Subject: daemonManager: wait for daemon stop on app close --- src/daemon/DaemonManager.cpp | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'src') diff --git a/src/daemon/DaemonManager.cpp b/src/daemon/DaemonManager.cpp index 3769302a..b84a0fa2 100644 --- a/src/daemon/DaemonManager.cpp +++ b/src/daemon/DaemonManager.cpp @@ -136,4 +136,8 @@ void DaemonManager::closing() { qDebug() << __FUNCTION__; stop(); + // Wait for daemon to stop before exiting (max 10 secs) + if(initialized){ + m_daemon->waitForFinished(10000); + } } -- cgit v1.2.3 From 18b7a6788659bd39c0241b29be5cedc2762037b2 Mon Sep 17 00:00:00 2001 From: Jaquee Date: Sat, 26 Nov 2016 15:34:56 +0100 Subject: Wallet: add connectionStatusChanged signal --- src/libwalletqt/Wallet.cpp | 11 +++++++++-- src/libwalletqt/Wallet.h | 5 ++++- 2 files changed, 13 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/libwalletqt/Wallet.cpp b/src/libwalletqt/Wallet.cpp index 9170073d..608bbd0f 100644 --- a/src/libwalletqt/Wallet.cpp +++ b/src/libwalletqt/Wallet.cpp @@ -87,9 +87,15 @@ Wallet::Status Wallet::status() const return static_cast(m_walletImpl->status()); } -Wallet::ConnectionStatus Wallet::connected() const +Wallet::ConnectionStatus Wallet::connected() { - return static_cast(m_walletImpl->connected()); + qDebug("Checking wallet connection status"); + ConnectionStatus newStatus = static_cast(m_walletImpl->connected()); + if(newStatus != m_connectionStatus) { + m_connectionStatus = newStatus; + emit connectionStatusChanged(); + } + return newStatus; } bool Wallet::synchronized() const @@ -422,6 +428,7 @@ Wallet::Wallet(Bitmonero::Wallet *w, QObject *parent) { m_history = new TransactionHistory(m_walletImpl->history(), this); m_walletImpl->setListener(new WalletListenerImpl(this)); + m_connectionStatus = Wallet::ConnectionStatus_Disconnected; } Wallet::~Wallet() diff --git a/src/libwalletqt/Wallet.h b/src/libwalletqt/Wallet.h index 14308ce5..f9cf8792 100644 --- a/src/libwalletqt/Wallet.h +++ b/src/libwalletqt/Wallet.h @@ -63,7 +63,7 @@ public: Status status() const; //! returns whether the wallet is connected, and version status - ConnectionStatus connected() const; + ConnectionStatus connected(); //! returns true if wallet was ever synchronized bool synchronized() const; @@ -196,6 +196,8 @@ signals: // emitted when transaction is created async void transactionCreated(PendingTransaction * transaction, QString address, QString paymentId, quint32 mixinCount); + void connectionStatusChanged(); + private: Wallet(QObject * parent = nullptr); Wallet(Bitmonero::Wallet *w, QObject * parent = 0); @@ -217,6 +219,7 @@ private: mutable QTime m_daemonBlockChainTargetHeightTime; mutable quint64 m_daemonBlockChainTargetHeight; int m_daemonBlockChainTargetHeightTtl; + ConnectionStatus m_connectionStatus; }; -- cgit v1.2.3 From 3f8e05d7a4891623bd34c62d82959eab80d079db Mon Sep 17 00:00:00 2001 From: Jaquee Date: Sat, 26 Nov 2016 16:31:27 +0100 Subject: Wallet: Cache connection status query --- src/libwalletqt/Wallet.cpp | 23 ++++++++++++++++++----- src/libwalletqt/Wallet.h | 2 ++ 2 files changed, 20 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/libwalletqt/Wallet.cpp b/src/libwalletqt/Wallet.cpp index 608bbd0f..201d5293 100644 --- a/src/libwalletqt/Wallet.cpp +++ b/src/libwalletqt/Wallet.cpp @@ -15,6 +15,7 @@ namespace { static const int DAEMON_BLOCKCHAIN_HEIGHT_CACHE_TTL_SECONDS = 10; static const int DAEMON_BLOCKCHAIN_TARGET_HEIGHT_CACHE_TTL_SECONDS = 60; + static const int WALLET_CONNECTION_STATUS_CACHE_TTL_SECONDS = 5; } class WalletListenerImpl : public Bitmonero::WalletListener @@ -90,12 +91,19 @@ Wallet::Status Wallet::status() const Wallet::ConnectionStatus Wallet::connected() { qDebug("Checking wallet connection status"); - ConnectionStatus newStatus = static_cast(m_walletImpl->connected()); - if(newStatus != m_connectionStatus) { - m_connectionStatus = newStatus; - emit connectionStatusChanged(); + + // cache connection status + if(m_connectionStatusTime.elapsed() / 1000 > m_connectionStatusTtl){ + qDebug("connectionStatus query"); + ConnectionStatus newStatus = static_cast(m_walletImpl->connected()); + if(newStatus != m_connectionStatus) { + m_connectionStatus = newStatus; + emit connectionStatusChanged(); + } + m_connectionStatusTime.restart(); } - return newStatus; + + return m_connectionStatus; } bool Wallet::synchronized() const @@ -425,10 +433,15 @@ Wallet::Wallet(Bitmonero::Wallet *w, QObject *parent) , m_daemonBlockChainHeightTtl(DAEMON_BLOCKCHAIN_HEIGHT_CACHE_TTL_SECONDS) , m_daemonBlockChainTargetHeight(0) , m_daemonBlockChainTargetHeightTtl(DAEMON_BLOCKCHAIN_TARGET_HEIGHT_CACHE_TTL_SECONDS) + , m_connectionStatusTtl(WALLET_CONNECTION_STATUS_CACHE_TTL_SECONDS) { m_history = new TransactionHistory(m_walletImpl->history(), this); m_walletImpl->setListener(new WalletListenerImpl(this)); m_connectionStatus = Wallet::ConnectionStatus_Disconnected; + // start cache timers + m_connectionStatusTime.restart(); + m_daemonBlockChainHeightTime.restart(); + m_daemonBlockChainTargetHeightTime.restart(); } Wallet::~Wallet() diff --git a/src/libwalletqt/Wallet.h b/src/libwalletqt/Wallet.h index f9cf8792..6eddd8bd 100644 --- a/src/libwalletqt/Wallet.h +++ b/src/libwalletqt/Wallet.h @@ -220,6 +220,8 @@ private: mutable quint64 m_daemonBlockChainTargetHeight; int m_daemonBlockChainTargetHeightTtl; ConnectionStatus m_connectionStatus; + int m_connectionStatusTtl; + mutable QTime m_connectionStatusTime; }; -- cgit v1.2.3 From 0e8cd146dbc425579e48e04629803dfa7d02d3c6 Mon Sep 17 00:00:00 2001 From: Jaquee Date: Sat, 26 Nov 2016 17:01:59 +0100 Subject: Wallet: add m_initialized --- src/libwalletqt/Wallet.cpp | 7 +++---- src/libwalletqt/Wallet.h | 1 + 2 files changed, 4 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/libwalletqt/Wallet.cpp b/src/libwalletqt/Wallet.cpp index 201d5293..c1c1b8e8 100644 --- a/src/libwalletqt/Wallet.cpp +++ b/src/libwalletqt/Wallet.cpp @@ -90,11 +90,9 @@ Wallet::Status Wallet::status() const Wallet::ConnectionStatus Wallet::connected() { - qDebug("Checking wallet connection status"); - // cache connection status - if(m_connectionStatusTime.elapsed() / 1000 > m_connectionStatusTtl){ - qDebug("connectionStatus query"); + if(!m_initialized || m_connectionStatusTime.elapsed() / 1000 > m_connectionStatusTtl){ + m_initialized = true; ConnectionStatus newStatus = static_cast(m_walletImpl->connected()); if(newStatus != m_connectionStatus) { m_connectionStatus = newStatus; @@ -442,6 +440,7 @@ Wallet::Wallet(Bitmonero::Wallet *w, QObject *parent) m_connectionStatusTime.restart(); m_daemonBlockChainHeightTime.restart(); m_daemonBlockChainTargetHeightTime.restart(); + m_initialized = false; } Wallet::~Wallet() diff --git a/src/libwalletqt/Wallet.h b/src/libwalletqt/Wallet.h index 6eddd8bd..8b1d7525 100644 --- a/src/libwalletqt/Wallet.h +++ b/src/libwalletqt/Wallet.h @@ -222,6 +222,7 @@ private: ConnectionStatus m_connectionStatus; int m_connectionStatusTtl; mutable QTime m_connectionStatusTime; + bool m_initialized; }; -- cgit v1.2.3 From 01549a3040da4c4e6931654ab91017283f0552a7 Mon Sep 17 00:00:00 2001 From: Jaquee Date: Sun, 27 Nov 2016 00:16:09 +0100 Subject: walletManager: coding conventions Signed-off-by: Jaquee --- main.cpp | 6 ++---- src/daemon/DaemonManager.cpp | 27 +++++++++++++-------------- src/daemon/DaemonManager.h | 4 ++-- src/libwalletqt/Wallet.cpp | 6 +++--- src/libwalletqt/Wallet.h | 8 ++++---- 5 files changed, 24 insertions(+), 27 deletions(-) (limited to 'src') diff --git a/main.cpp b/main.cpp index 4bc71a53..e9ea5a56 100644 --- a/main.cpp +++ b/main.cpp @@ -108,10 +108,8 @@ int main(int argc, char *argv[]) engine.rootContext()->setContextProperty("translationManager", TranslationManager::instance()); engine.addImageProvider(QLatin1String("qrcode"), new QRCodeImageProvider()); - - engine.rootContext()->setContextProperty("daemonManager", DaemonManager::instance(QCoreApplication::arguments())); - - DaemonManager * daemonManager = DaemonManager::instance(QCoreApplication::arguments()); + const QStringList arguments = QCoreApplication::arguments(); + DaemonManager * daemonManager = DaemonManager::instance(&arguments); QObject::connect(&app, SIGNAL(aboutToQuit()), daemonManager, SLOT(closing())); engine.rootContext()->setContextProperty("daemonManager", daemonManager); diff --git a/src/daemon/DaemonManager.cpp b/src/daemon/DaemonManager.cpp index b84a0fa2..185cde1e 100644 --- a/src/daemon/DaemonManager.cpp +++ b/src/daemon/DaemonManager.cpp @@ -9,15 +9,15 @@ #include DaemonManager * DaemonManager::m_instance = nullptr; -QStringList DaemonManager::clArgs; +QStringList DaemonManager::m_clArgs; -DaemonManager *DaemonManager::instance(QStringList args) +DaemonManager *DaemonManager::instance(const QStringList *args) { if (!m_instance) { m_instance = new DaemonManager; // store command line arguments for later use - clArgs = args; - clArgs.removeFirst(); + m_clArgs = *args; + m_clArgs.removeFirst(); } return m_instance; @@ -25,7 +25,6 @@ DaemonManager *DaemonManager::instance(QStringList args) bool DaemonManager::start() { - // QString process; #ifdef Q_OS_WIN @@ -34,7 +33,7 @@ bool DaemonManager::start() process = QApplication::applicationDirPath() + "/monerod"; #endif - if(process.length() == 0) { + if (process.length() == 0) { qDebug() << "no daemon binary defined for current platform"; return false; } @@ -42,7 +41,7 @@ bool DaemonManager::start() // prepare command line arguments and pass to monerod QStringList arguments; - foreach (const QString &str, clArgs) { + foreach (const QString &str, m_clArgs) { qDebug() << QString(" [%1] ").arg(str); arguments << str; } @@ -64,7 +63,7 @@ bool DaemonManager::start() // add state changed listener connect(m_daemon,SIGNAL(stateChanged(QProcess::ProcessState)),this,SLOT(stateChanged(QProcess::ProcessState))); - if(!started){ + if (!started) { qDebug() << "Daemon start error: " + m_daemon->errorString(); } else { emit daemonStarted(); @@ -75,7 +74,7 @@ bool DaemonManager::start() bool DaemonManager::stop() { - if(initialized){ + if (initialized) { qDebug() << "stopping daemon"; // we can't use QProcess::terminate() on windows console process // write exit command to stdin @@ -88,7 +87,7 @@ bool DaemonManager::stop() void DaemonManager::stateChanged(QProcess::ProcessState state) { qDebug() << "STATE CHANGED: " << state; - if(state == QProcess::NotRunning) { + if (state == QProcess::NotRunning) { emit daemonStopped(); } } @@ -98,7 +97,7 @@ void DaemonManager::printOutput() QByteArray byteArray = m_daemon->readAllStandardOutput(); QStringList strLines = QString(byteArray).split("\n"); - foreach (QString line, strLines){ + foreach (QString line, strLines) { emit daemonConsoleUpdated(line); qDebug() << "Daemon: " + line; } @@ -109,7 +108,7 @@ void DaemonManager::printError() QByteArray byteArray = m_daemon->readAllStandardError(); QStringList strLines = QString(byteArray).split("\n"); - foreach (QString line, strLines){ + foreach (QString line, strLines) { emit daemonConsoleUpdated(line); qDebug() << "Daemon ERROR: " + line; } @@ -117,7 +116,7 @@ void DaemonManager::printError() bool DaemonManager::running() const { - if(initialized){ + if (initialized) { qDebug() << m_daemon->state(); qDebug() << QProcess::NotRunning; // m_daemon->write("status\n"); @@ -137,7 +136,7 @@ void DaemonManager::closing() qDebug() << __FUNCTION__; stop(); // Wait for daemon to stop before exiting (max 10 secs) - if(initialized){ + if (initialized) { m_daemon->waitForFinished(10000); } } diff --git a/src/daemon/DaemonManager.h b/src/daemon/DaemonManager.h index 1c4ae8ad..8f425fd5 100644 --- a/src/daemon/DaemonManager.h +++ b/src/daemon/DaemonManager.h @@ -11,7 +11,7 @@ class DaemonManager : public QObject public: - static DaemonManager * instance(QStringList args); + static DaemonManager * instance(const QStringList *args); Q_INVOKABLE bool start(); Q_INVOKABLE bool stop(); @@ -34,7 +34,7 @@ private: explicit DaemonManager(QObject *parent = 0); static DaemonManager * m_instance; - static QStringList clArgs; + static QStringList m_clArgs; QProcess *m_daemon; bool initialized = false; diff --git a/src/libwalletqt/Wallet.cpp b/src/libwalletqt/Wallet.cpp index c1c1b8e8..bc72cc1a 100644 --- a/src/libwalletqt/Wallet.cpp +++ b/src/libwalletqt/Wallet.cpp @@ -88,13 +88,13 @@ Wallet::Status Wallet::status() const return static_cast(m_walletImpl->status()); } -Wallet::ConnectionStatus Wallet::connected() +Wallet::ConnectionStatus Wallet::connected() const { // cache connection status - if(!m_initialized || m_connectionStatusTime.elapsed() / 1000 > m_connectionStatusTtl){ + if (!m_initialized || m_connectionStatusTime.elapsed() / 1000 > m_connectionStatusTtl) { m_initialized = true; ConnectionStatus newStatus = static_cast(m_walletImpl->connected()); - if(newStatus != m_connectionStatus) { + if (newStatus != m_connectionStatus) { m_connectionStatus = newStatus; emit connectionStatusChanged(); } diff --git a/src/libwalletqt/Wallet.h b/src/libwalletqt/Wallet.h index 8b1d7525..3289bb37 100644 --- a/src/libwalletqt/Wallet.h +++ b/src/libwalletqt/Wallet.h @@ -63,7 +63,7 @@ public: Status status() const; //! returns whether the wallet is connected, and version status - ConnectionStatus connected(); + ConnectionStatus connected() const; //! returns true if wallet was ever synchronized bool synchronized() const; @@ -196,7 +196,7 @@ signals: // emitted when transaction is created async void transactionCreated(PendingTransaction * transaction, QString address, QString paymentId, quint32 mixinCount); - void connectionStatusChanged(); + void connectionStatusChanged() const; private: Wallet(QObject * parent = nullptr); @@ -219,10 +219,10 @@ private: mutable QTime m_daemonBlockChainTargetHeightTime; mutable quint64 m_daemonBlockChainTargetHeight; int m_daemonBlockChainTargetHeightTtl; - ConnectionStatus m_connectionStatus; + mutable ConnectionStatus m_connectionStatus; int m_connectionStatusTtl; mutable QTime m_connectionStatusTime; - bool m_initialized; + mutable bool m_initialized; }; -- cgit v1.2.3