diff --git a/src/libwalletqt/Wallet.cpp b/src/libwalletqt/Wallet.cpp index dc4481ba..508f105e 100644 --- a/src/libwalletqt/Wallet.cpp +++ b/src/libwalletqt/Wallet.cpp @@ -144,6 +144,29 @@ void Wallet::setConnectionStatus(ConnectionStatus value) } } +QString Wallet::getProxyAddress() const +{ + QMutexLocker locker(&m_proxyMutex); + return m_proxyAddress; +} + +void Wallet::setProxyAddress(QString address) +{ + m_scheduler.run([this, address] { + { + QMutexLocker locker(&m_proxyMutex); + + if (!m_walletImpl->setProxy(address.toStdString())) + { + qCritical() << "failed to set proxy" << address; + } + + m_proxyAddress = address; + } + emit proxyAddressChanged(); + }); +} + bool Wallet::synchronized() const { return m_walletImpl->synchronized(); @@ -184,7 +207,7 @@ void Wallet::storeAsync(const QJSValue &callback, const QString &path /* = "" */ } } -bool Wallet::init(const QString &daemonAddress, bool trustedDaemon, quint64 upperTransactionLimit, bool isRecovering, bool isRecoveringFromDevice, quint64 restoreHeight) +bool Wallet::init(const QString &daemonAddress, bool trustedDaemon, quint64 upperTransactionLimit, bool isRecovering, bool isRecoveringFromDevice, quint64 restoreHeight, const QString& proxyAddress) { qDebug() << "init non async"; if (isRecovering){ @@ -198,7 +221,20 @@ bool Wallet::init(const QString &daemonAddress, bool trustedDaemon, quint64 uppe if (isRecovering || isRecoveringFromDevice) { m_walletImpl->setRefreshFromBlockHeight(restoreHeight); } - m_walletImpl->init(daemonAddress.toStdString(), upperTransactionLimit, m_daemonUsername.toStdString(), m_daemonPassword.toStdString()); + + { + QMutexLocker locker(&m_proxyMutex); + + if (!m_walletImpl->init(daemonAddress.toStdString(), upperTransactionLimit, m_daemonUsername.toStdString(), m_daemonPassword.toStdString(), false, false, proxyAddress.toStdString())) + { + return false; + } + + + m_proxyAddress = proxyAddress; + } + emit proxyAddressChanged(); + setTrustedDaemon(trustedDaemon); return true; } @@ -210,11 +246,18 @@ void Wallet::setDaemonLogin(const QString &daemonUsername, const QString &daemon m_daemonPassword = daemonPassword; } -void Wallet::initAsync(const QString &daemonAddress, bool trustedDaemon, quint64 upperTransactionLimit, bool isRecovering, bool isRecoveringFromDevice, quint64 restoreHeight) +void Wallet::initAsync( + const QString &daemonAddress, + bool trustedDaemon /* = false */, + quint64 upperTransactionLimit /* = 0 */, + bool isRecovering /* = false */, + bool isRecoveringFromDevice /* = false */, + quint64 restoreHeight /* = 0 */, + const QString &proxyAddress /* = "" */) { qDebug() << "initAsync: " + daemonAddress; - const auto future = m_scheduler.run([this, daemonAddress, trustedDaemon, upperTransactionLimit, isRecovering, isRecoveringFromDevice, restoreHeight] { - bool success = init(daemonAddress, trustedDaemon, upperTransactionLimit, isRecovering, isRecoveringFromDevice, restoreHeight); + const auto future = m_scheduler.run([this, daemonAddress, trustedDaemon, upperTransactionLimit, isRecovering, isRecoveringFromDevice, restoreHeight, proxyAddress] { + bool success = init(daemonAddress, trustedDaemon, upperTransactionLimit, isRecovering, isRecoveringFromDevice, restoreHeight, proxyAddress); if (success) { emit walletCreationHeightChanged(); diff --git a/src/libwalletqt/Wallet.h b/src/libwalletqt/Wallet.h index 31b051ad..b099a011 100644 --- a/src/libwalletqt/Wallet.h +++ b/src/libwalletqt/Wallet.h @@ -87,6 +87,7 @@ class Wallet : public QObject, public PassprasePrompter Q_PROPERTY(QString secretSpendKey READ getSecretSpendKey) Q_PROPERTY(QString publicSpendKey READ getPublicSpendKey) Q_PROPERTY(QString daemonLogPath READ getDaemonLogPath CONSTANT) + Q_PROPERTY(QString proxyAddress READ getProxyAddress WRITE setProxyAddress NOTIFY proxyAddressChanged) Q_PROPERTY(quint64 walletCreationHeight READ getWalletCreationHeight WRITE setWalletCreationHeight NOTIFY walletCreationHeightChanged) public: @@ -149,7 +150,14 @@ public: Q_INVOKABLE void storeAsync(const QJSValue &callback, const QString &path = ""); //! initializes wallet asynchronously - Q_INVOKABLE void initAsync(const QString &daemonAddress, bool trustedDaemon = false, quint64 upperTransactionLimit = 0, bool isRecovering = false, bool isRecoveringFromDevice = false, quint64 restoreHeight = 0); + Q_INVOKABLE void initAsync( + const QString &daemonAddress, + bool trustedDaemon = false, + quint64 upperTransactionLimit = 0, + bool isRecovering = false, + bool isRecoveringFromDevice = false, + quint64 restoreHeight = 0, + const QString &proxyAddress = ""); // Set daemon rpc user/pass Q_INVOKABLE void setDaemonLogin(const QString &daemonUsername = "", const QString &daemonPassword = ""); @@ -385,6 +393,7 @@ signals: void connectionStatusChanged(int status) const; void currentSubaddressAccountChanged() const; void disconnectedChanged() const; + void proxyAddressChanged() const; private: Wallet(QObject * parent = nullptr); @@ -402,10 +411,19 @@ private: quint64 daemonBlockChainTargetHeight() const; //! initializes wallet - bool init(const QString &daemonAddress, bool trustedDaemon, quint64 upperTransactionLimit, bool isRecovering, bool isRecoveringFromDevice, quint64 restoreHeight); + bool init( + const QString &daemonAddress, + bool trustedDaemon, + quint64 upperTransactionLimit, + bool isRecovering, + bool isRecoveringFromDevice, + quint64 restoreHeight, + const QString& proxyAddress); bool disconnected() const; void setConnectionStatus(ConnectionStatus value); + QString getProxyAddress() const; + void setProxyAddress(QString address); private: friend class WalletManager; @@ -440,6 +458,8 @@ private: bool m_connectionStatusRunning; QString m_daemonUsername; QString m_daemonPassword; + QString m_proxyAddress; + mutable QMutex m_proxyMutex; WalletListenerImpl *m_walletListener; FutureScheduler m_scheduler; QMutex m_storeMutex; diff --git a/src/libwalletqt/WalletManager.cpp b/src/libwalletqt/WalletManager.cpp index 6ce771ae..ecccef66 100644 --- a/src/libwalletqt/WalletManager.cpp +++ b/src/libwalletqt/WalletManager.cpp @@ -561,3 +561,26 @@ void WalletManager::onPassphraseEntered(const QString &passphrase, bool enter_on m_passphraseReceiver->onPassphraseEntered(passphrase, enter_on_device, entry_abort); } } + +QString WalletManager::proxyAddress() const +{ + QMutexLocker locker(&m_proxyMutex); + return m_proxyAddress; +} + +void WalletManager::setProxyAddress(QString address) +{ + m_scheduler.run([this, address] { + { + QMutexLocker locker(&m_proxyMutex); + + if (!m_pimpl->setProxy(address.toStdString())) + { + qCritical() << "Failed to set proxy address" << address; + } + + m_proxyAddress = std::move(address); + } + emit proxyAddressChanged(); + }); +} diff --git a/src/libwalletqt/WalletManager.h b/src/libwalletqt/WalletManager.h index 5a901ba3..a45995af 100644 --- a/src/libwalletqt/WalletManager.h +++ b/src/libwalletqt/WalletManager.h @@ -49,6 +49,7 @@ class WalletManager : public QObject, public PassprasePrompter { Q_OBJECT Q_PROPERTY(bool connected READ connected) + Q_PROPERTY(QString proxyAddress READ proxyAddress WRITE setProxyAddress NOTIFY proxyAddressChanged) public: explicit WalletManager(QObject *parent = 0); @@ -191,6 +192,9 @@ public: Q_INVOKABLE void onPassphraseEntered(const QString &passphrase, bool enter_on_device, bool entry_abort=false); virtual void onWalletPassphraseNeeded(bool on_device) override; + QString proxyAddress() const; + void setProxyAddress(QString address); + signals: void walletOpened(Wallet * wallet); @@ -205,6 +209,7 @@ signals: const QString &firstSigner, const QString &secondSigner) const; void miningStatus(bool isMining) const; + void proxyAddressChanged() const; public slots: private: @@ -218,6 +223,8 @@ private: QPointer m_currentWallet; PassphraseReceiver * m_passphraseReceiver; QMutex m_mutex_passphraseReceiver; + QString m_proxyAddress; + mutable QMutex m_proxyMutex; FutureScheduler m_scheduler; };