mirror of
				https://git.wownero.com/wowlet/wowlet.git
				synced 2024-08-15 01:03:14 +00:00 
			
		
		
		
	Bugfix: fix wallet closing issues by partially reverting #63
This commit is contained in:
		
							parent
							
								
									103965ef40
								
							
						
					
					
						commit
						15c51e2e2b
					
				
					 3 changed files with 21 additions and 91 deletions
				
			
		| 
						 | 
					@ -3,10 +3,6 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "Wallet.h"
 | 
					#include "Wallet.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <chrono>
 | 
					 | 
				
			||||||
#include <stdexcept>
 | 
					 | 
				
			||||||
#include <thread>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include "PendingTransaction.h"
 | 
					#include "PendingTransaction.h"
 | 
				
			||||||
#include "UnsignedTransaction.h"
 | 
					#include "UnsignedTransaction.h"
 | 
				
			||||||
#include "TransactionHistory.h"
 | 
					#include "TransactionHistory.h"
 | 
				
			||||||
| 
						 | 
					@ -32,8 +28,6 @@
 | 
				
			||||||
#include <QVector>
 | 
					#include <QVector>
 | 
				
			||||||
#include <QMutexLocker>
 | 
					#include <QMutexLocker>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "utils/ScopeGuard.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace {
 | 
					namespace {
 | 
				
			||||||
    static const int DAEMON_BLOCKCHAIN_HEIGHT_CACHE_TTL_SECONDS = 5;
 | 
					    static const int DAEMON_BLOCKCHAIN_HEIGHT_CACHE_TTL_SECONDS = 5;
 | 
				
			||||||
    static const int DAEMON_BLOCKCHAIN_TARGET_HEIGHT_CACHE_TTL_SECONDS = 30;
 | 
					    static const int DAEMON_BLOCKCHAIN_TARGET_HEIGHT_CACHE_TTL_SECONDS = 30;
 | 
				
			||||||
| 
						 | 
					@ -107,19 +101,6 @@ bool Wallet::disconnected() const
 | 
				
			||||||
    return m_disconnected;
 | 
					    return m_disconnected;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool Wallet::refreshing() const
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    return m_refreshing;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void Wallet::refreshingSet(bool value)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    if (m_refreshing.exchange(value) != value)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        emit refreshingChanged();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void Wallet::setConnectionStatus(ConnectionStatus value)
 | 
					void Wallet::setConnectionStatus(ConnectionStatus value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    if (m_connectionStatus == value)
 | 
					    if (m_connectionStatus == value)
 | 
				
			||||||
| 
						 | 
					@ -264,7 +245,7 @@ void Wallet::initAsync(
 | 
				
			||||||
            emit walletCreationHeightChanged();
 | 
					            emit walletCreationHeightChanged();
 | 
				
			||||||
            qDebug() << "init async finished - starting refresh";
 | 
					            qDebug() << "init async finished - starting refresh";
 | 
				
			||||||
            connected(true);
 | 
					            connected(true);
 | 
				
			||||||
            startRefresh();
 | 
					            m_walletImpl->startRefresh();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
    if (future.first)
 | 
					    if (future.first)
 | 
				
			||||||
| 
						 | 
					@ -475,36 +456,20 @@ bool Wallet::importOutputs(const QString& path) {
 | 
				
			||||||
    return m_walletImpl->importOutputs(path.toStdString());
 | 
					    return m_walletImpl->importOutputs(path.toStdString());
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool Wallet::refresh(bool historyAndSubaddresses /* = true */)
 | 
					bool Wallet::refresh()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    refreshingSet(true);
 | 
					    qDebug() << "refresh async";
 | 
				
			||||||
    const auto cleanup = sg::make_scope_guard([this]() noexcept {
 | 
					    m_walletImpl->refreshAsync();
 | 
				
			||||||
        refreshingSet(false);
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        QMutexLocker locker(&m_asyncMutex);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        bool result = m_walletImpl->refresh();
 | 
					 | 
				
			||||||
        if (historyAndSubaddresses)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            m_history->refresh(currentSubaddressAccount());
 | 
					 | 
				
			||||||
            m_subaddress->refresh(currentSubaddressAccount());
 | 
					 | 
				
			||||||
            m_subaddressAccount->getAll();
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        return result;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Wallet::startRefresh()
 | 
					void Wallet::startRefresh() const
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    m_refreshEnabled = true;
 | 
					    m_walletImpl->startRefresh();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Wallet::pauseRefresh()
 | 
					void Wallet::pauseRefresh() const
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    m_refreshEnabled = false;
 | 
					    m_walletImpl->pauseRefresh();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
PendingTransaction *Wallet::createTransaction(const QString &dst_addr, const QString &payment_id,
 | 
					PendingTransaction *Wallet::createTransaction(const QString &dst_addr, const QString &payment_id,
 | 
				
			||||||
| 
						 | 
					@ -1083,8 +1048,6 @@ Wallet::Wallet(Monero::Wallet *w, QObject *parent)
 | 
				
			||||||
        , m_subaddressAccount(nullptr)
 | 
					        , m_subaddressAccount(nullptr)
 | 
				
			||||||
        , m_subaddressAccountModel(nullptr)
 | 
					        , m_subaddressAccountModel(nullptr)
 | 
				
			||||||
        , m_coinsModel(nullptr)
 | 
					        , m_coinsModel(nullptr)
 | 
				
			||||||
        , m_refreshEnabled(false)
 | 
					 | 
				
			||||||
        , m_refreshing(false)
 | 
					 | 
				
			||||||
        , m_scheduler(this)
 | 
					        , m_scheduler(this)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    m_history = new TransactionHistory(m_walletImpl->history(), this);
 | 
					    m_history = new TransactionHistory(m_walletImpl->history(), this);
 | 
				
			||||||
| 
						 | 
					@ -1103,8 +1066,6 @@ Wallet::Wallet(Monero::Wallet *w, QObject *parent)
 | 
				
			||||||
    m_connectionStatusRunning = false;
 | 
					    m_connectionStatusRunning = false;
 | 
				
			||||||
    m_daemonUsername = "";
 | 
					    m_daemonUsername = "";
 | 
				
			||||||
    m_daemonPassword = "";
 | 
					    m_daemonPassword = "";
 | 
				
			||||||
 | 
					 | 
				
			||||||
    startRefreshThread();
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Wallet::~Wallet()
 | 
					Wallet::~Wallet()
 | 
				
			||||||
| 
						 | 
					@ -1129,42 +1090,14 @@ Wallet::~Wallet()
 | 
				
			||||||
    //Monero::WalletManagerFactory::getWalletManager()->closeWallet(m_walletImpl);
 | 
					    //Monero::WalletManagerFactory::getWalletManager()->closeWallet(m_walletImpl);
 | 
				
			||||||
    if(status() == Status_Critical)
 | 
					    if(status() == Status_Critical)
 | 
				
			||||||
        qDebug("Not storing wallet cache");
 | 
					        qDebug("Not storing wallet cache");
 | 
				
			||||||
    else if( m_walletImpl->store(""))
 | 
					    // Don't store on wallet close for now
 | 
				
			||||||
        qDebug("Wallet cache stored successfully");
 | 
					//    else if( m_walletImpl->store(""))
 | 
				
			||||||
    else
 | 
					//        qDebug("Wallet cache stored successfully");
 | 
				
			||||||
        qDebug("Error storing wallet cache");
 | 
					//    else
 | 
				
			||||||
 | 
					//        qDebug("Error storing wallet cache");
 | 
				
			||||||
    delete m_walletImpl;
 | 
					    delete m_walletImpl;
 | 
				
			||||||
    m_walletImpl = NULL;
 | 
					    m_walletImpl = NULL;
 | 
				
			||||||
    delete m_walletListener;
 | 
					    delete m_walletListener;
 | 
				
			||||||
    m_walletListener = NULL;
 | 
					    m_walletListener = NULL;
 | 
				
			||||||
    qDebug("m_walletImpl deleted");
 | 
					    qDebug("m_walletImpl deleted");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
void Wallet::startRefreshThread()
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    const auto future = m_scheduler.run([this] {
 | 
					 | 
				
			||||||
        static constexpr const size_t refreshIntervalSec = 10;
 | 
					 | 
				
			||||||
        static constexpr const size_t intervalResolutionMs = 100;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        auto last = std::chrono::steady_clock::now();
 | 
					 | 
				
			||||||
        while (!m_scheduler.stopping())
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            if (m_refreshEnabled)
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                const auto now = std::chrono::steady_clock::now();
 | 
					 | 
				
			||||||
                const auto elapsed = std::chrono::duration_cast<std::chrono::seconds>(now - last).count();
 | 
					 | 
				
			||||||
                if (elapsed >= refreshIntervalSec)
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    refresh(false);
 | 
					 | 
				
			||||||
                    last = std::chrono::steady_clock::now();
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            std::this_thread::sleep_for(std::chrono::milliseconds(intervalResolutionMs));
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
    if (!future.first)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        throw std::runtime_error("failed to start auto refresh thread");
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -50,7 +50,6 @@ class Wallet : public QObject, public PassprasePrompter
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
Q_OBJECT
 | 
					Q_OBJECT
 | 
				
			||||||
    Q_PROPERTY(bool disconnected READ disconnected NOTIFY disconnectedChanged)
 | 
					    Q_PROPERTY(bool disconnected READ disconnected NOTIFY disconnectedChanged)
 | 
				
			||||||
    Q_PROPERTY(bool refreshing READ refreshing NOTIFY refreshingChanged)
 | 
					 | 
				
			||||||
    Q_PROPERTY(QString seed READ getSeed)
 | 
					    Q_PROPERTY(QString seed READ getSeed)
 | 
				
			||||||
    Q_PROPERTY(QString seedLanguage READ getSeedLanguage)
 | 
					    Q_PROPERTY(QString seedLanguage READ getSeedLanguage)
 | 
				
			||||||
    Q_PROPERTY(Status status READ status)
 | 
					    Q_PROPERTY(Status status READ status)
 | 
				
			||||||
| 
						 | 
					@ -200,11 +199,11 @@ public:
 | 
				
			||||||
    Q_INVOKABLE bool importOutputs(const QString& path);
 | 
					    Q_INVOKABLE bool importOutputs(const QString& path);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    //! refreshes the wallet
 | 
					    //! refreshes the wallet
 | 
				
			||||||
    Q_INVOKABLE bool refresh(bool historyAndSubaddresses = true);
 | 
					    Q_INVOKABLE bool refresh();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // pause/resume refresh
 | 
					    // pause/resume refresh
 | 
				
			||||||
    Q_INVOKABLE void startRefresh();
 | 
					    Q_INVOKABLE void startRefresh() const;
 | 
				
			||||||
    Q_INVOKABLE void pauseRefresh();
 | 
					    Q_INVOKABLE void pauseRefresh() const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    //! returns current wallet's block height
 | 
					    //! returns current wallet's block height
 | 
				
			||||||
    //! (can be less than daemon's blockchain height when wallet sync in progress)
 | 
					    //! (can be less than daemon's blockchain height when wallet sync in progress)
 | 
				
			||||||
| 
						 | 
					@ -406,7 +405,6 @@ signals:
 | 
				
			||||||
    void currentSubaddressAccountChanged() const;
 | 
					    void currentSubaddressAccountChanged() const;
 | 
				
			||||||
    void disconnectedChanged() const;
 | 
					    void disconnectedChanged() const;
 | 
				
			||||||
    void proxyAddressChanged() const;
 | 
					    void proxyAddressChanged() const;
 | 
				
			||||||
    void refreshingChanged() const;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
private:
 | 
					private:
 | 
				
			||||||
    Wallet(QObject * parent = nullptr);
 | 
					    Wallet(QObject * parent = nullptr);
 | 
				
			||||||
| 
						 | 
					@ -424,12 +422,9 @@ private:
 | 
				
			||||||
            const QString& proxyAddress);
 | 
					            const QString& proxyAddress);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bool disconnected() const;
 | 
					    bool disconnected() const;
 | 
				
			||||||
    bool refreshing() const;
 | 
					 | 
				
			||||||
    void refreshingSet(bool value);
 | 
					 | 
				
			||||||
    void setConnectionStatus(ConnectionStatus value);
 | 
					    void setConnectionStatus(ConnectionStatus value);
 | 
				
			||||||
    QString getProxyAddress() const;
 | 
					    QString getProxyAddress() const;
 | 
				
			||||||
    void setProxyAddress(QString address);
 | 
					    void setProxyAddress(QString address);
 | 
				
			||||||
    void startRefreshThread();
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
private:
 | 
					private:
 | 
				
			||||||
    friend class WalletManager;
 | 
					    friend class WalletManager;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -505,7 +505,11 @@ WalletWizard *MainWindow::createWizard(WalletWizard::Page startPage){
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void MainWindow::showWizard(WalletWizard::Page startPage) {
 | 
					void MainWindow::showWizard(WalletWizard::Page startPage) {
 | 
				
			||||||
    this->setEnabled(false);
 | 
					    this->setEnabled(false);
 | 
				
			||||||
 | 
					    if (m_wizard == nullptr)
 | 
				
			||||||
        m_wizard = this->createWizard(startPage);
 | 
					        m_wizard = this->createWizard(startPage);
 | 
				
			||||||
 | 
					    m_wizard->setStartId(startPage);
 | 
				
			||||||
 | 
					    m_wizard->restart();
 | 
				
			||||||
 | 
					    m_wizard->setEnabled(true);
 | 
				
			||||||
    m_wizard->show();
 | 
					    m_wizard->show();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -558,8 +562,6 @@ void MainWindow::onWalletOpened() {
 | 
				
			||||||
    qDebug() << Q_FUNC_INFO;
 | 
					    qDebug() << Q_FUNC_INFO;
 | 
				
			||||||
    if(m_wizard != nullptr) {
 | 
					    if(m_wizard != nullptr) {
 | 
				
			||||||
        m_wizard->hide();
 | 
					        m_wizard->hide();
 | 
				
			||||||
        m_wizard->disconnect();
 | 
					 | 
				
			||||||
        m_wizard->deleteLater();
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    this->raise();
 | 
					    this->raise();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue