From 00ea5d6be958159ba3cecb058b56bc4e23fc571d Mon Sep 17 00:00:00 2001 From: Jacob Brydolf Date: Tue, 8 Nov 2016 16:33:36 +0100 Subject: [PATCH 1/4] added Wallet::createTransactionAsync() --- src/libwalletqt/Wallet.cpp | 23 ++++++++++++++++++++++- src/libwalletqt/Wallet.h | 7 +++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/libwalletqt/Wallet.cpp b/src/libwalletqt/Wallet.cpp index d281c03a..8ec8c663 100644 --- a/src/libwalletqt/Wallet.cpp +++ b/src/libwalletqt/Wallet.cpp @@ -10,6 +10,7 @@ #include #include #include +#include namespace { static const int DAEMON_BLOCKCHAIN_HEIGHT_CACHE_TTL_SECONDS = 10; @@ -211,10 +212,29 @@ PendingTransaction *Wallet::createTransaction(const QString &dst_addr, const QSt Bitmonero::PendingTransaction * ptImpl = m_walletImpl->createTransaction( dst_addr.toStdString(), payment_id.toStdString(), amount, mixin_count, static_cast(priority)); - PendingTransaction * result = new PendingTransaction(ptImpl, this); + PendingTransaction * result = new PendingTransaction(ptImpl, m_walletManager); return result; } + +void Wallet::createTransactionAsync(const QString &dst_addr, const QString &payment_id, + quint64 amount, quint32 mixin_count, + PendingTransaction::Priority priority) +{ + QFuture future = QtConcurrent::run(this, &Wallet::createTransaction, + dst_addr, payment_id,amount, mixin_count, priority); + QFutureWatcher * watcher = new QFutureWatcher(); + watcher->setFuture(future); + connect(watcher, &QFutureWatcher::finished, + this, [this, watcher]() { + QFuture future = watcher->future(); + watcher->deleteLater(); + emit transactionCreated(future.result()); + }); +} + + + void Wallet::disposeTransaction(PendingTransaction *t) { m_walletImpl->disposeTransaction(t->m_pimpl); @@ -287,6 +307,7 @@ Wallet::Wallet(Bitmonero::Wallet *w, QObject *parent) { m_history = new TransactionHistory(m_walletImpl->history(), this); m_walletImpl->setListener(new WalletListenerImpl(this)); + m_walletManager = parent; } Wallet::~Wallet() diff --git a/src/libwalletqt/Wallet.h b/src/libwalletqt/Wallet.h index 458dea90..a50a895f 100644 --- a/src/libwalletqt/Wallet.h +++ b/src/libwalletqt/Wallet.h @@ -125,6 +125,10 @@ public: Q_INVOKABLE PendingTransaction * createTransaction(const QString &dst_addr, const QString &payment_id, quint64 amount, quint32 mixin_count, PendingTransaction::Priority priority); + //! creates async transaction + Q_INVOKABLE void createTransactionAsync(const QString &dst_addr, const QString &payment_id, + quint64 amount, quint32 mixin_count, + PendingTransaction::Priority priority); //! deletes transaction and frees memory Q_INVOKABLE void disposeTransaction(PendingTransaction * t); @@ -166,6 +170,8 @@ signals: void newBlock(quint64 height); void historyModelChanged() const; + // emitted when transaction is created async + void transactionCreated(PendingTransaction * transaction); private: Wallet(QObject * parent = nullptr); @@ -188,6 +194,7 @@ private: mutable QTime m_daemonBlockChainTargetHeightTime; mutable quint64 m_daemonBlockChainTargetHeight; int m_daemonBlockChainTargetHeightTtl; + QObject * m_walletManager; }; From 62060e183c634ab557a028a6e083d15f6f5a06d2 Mon Sep 17 00:00:00 2001 From: Jacob Brydolf Date: Tue, 8 Nov 2016 18:02:07 +0100 Subject: [PATCH 2/4] wallet::createTransactionAsync pass variables to listener --- src/libwalletqt/Wallet.cpp | 4 ++-- src/libwalletqt/Wallet.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/libwalletqt/Wallet.cpp b/src/libwalletqt/Wallet.cpp index 8ec8c663..9eb1aae1 100644 --- a/src/libwalletqt/Wallet.cpp +++ b/src/libwalletqt/Wallet.cpp @@ -226,10 +226,10 @@ void Wallet::createTransactionAsync(const QString &dst_addr, const QString &paym QFutureWatcher * watcher = new QFutureWatcher(); watcher->setFuture(future); connect(watcher, &QFutureWatcher::finished, - this, [this, watcher]() { + this, [this, watcher,dst_addr,payment_id,mixin_count]() { QFuture future = watcher->future(); watcher->deleteLater(); - emit transactionCreated(future.result()); + emit transactionCreated(future.result(),dst_addr,payment_id,mixin_count); }); } diff --git a/src/libwalletqt/Wallet.h b/src/libwalletqt/Wallet.h index a50a895f..e9eb71d7 100644 --- a/src/libwalletqt/Wallet.h +++ b/src/libwalletqt/Wallet.h @@ -171,7 +171,7 @@ signals: void historyModelChanged() const; // emitted when transaction is created async - void transactionCreated(PendingTransaction * transaction); + void transactionCreated(PendingTransaction * transaction, QString address, QString paymentId, quint32 mixinCount); private: Wallet(QObject * parent = nullptr); From f8e2e5da3ca499e472c10c861af5e654b6cdfd61 Mon Sep 17 00:00:00 2001 From: Jacob Brydolf Date: Tue, 8 Nov 2016 18:05:33 +0100 Subject: [PATCH 3/4] asynchronous transaction + show splash --- main.qml | 84 +++++++++++++++++++++++++++++++------------------------- 1 file changed, 46 insertions(+), 38 deletions(-) diff --git a/main.qml b/main.qml index 6f5bdde4..781131df 100644 --- a/main.qml +++ b/main.qml @@ -207,12 +207,14 @@ ApplicationWindow { currentWallet.newBlock.disconnect(onWalletNewBlock) currentWallet.moneySpent.disconnect(onWalletMoneySent) currentWallet.moneyReceived.disconnect(onWalletMoneyReceived) + currentWallet.transactionCreated.disconnect(onTransactionCreated) currentWallet.refreshed.connect(onWalletRefresh) currentWallet.updated.connect(onWalletUpdate) currentWallet.newBlock.connect(onWalletNewBlock) currentWallet.moneySpent.connect(onWalletMoneySent) currentWallet.moneyReceived.connect(onWalletMoneyReceived) + currentWallet.transactionCreated.connect(onTransactionCreated) console.log("initializing with daemon address: ", persistentSettings.daemon_address) @@ -363,6 +365,43 @@ ApplicationWindow { } + function onTransactionCreated(pendingTransaction,address,paymentId,mixinCount){ + console.log("Transaction created"); + hideProcessingSplash(); + transaction = pendingTransaction; + // validate address; + if (transaction.status !== PendingTransaction.Status_Ok) { + console.error("Can't create transaction: ", transaction.errorString); + informationPopup.title = qsTr("Error") + translationManager.emptyString; + if (currentWallet.connected == Wallet.ConnectionStatus_WrongVersion) + informationPopup.text = qsTr("Can't create transaction: Wrong daemon version: ") + transaction.errorString + else + informationPopup.text = qsTr("Can't create transaction: ") + transaction.errorString + informationPopup.icon = StandardIcon.Critical + informationPopup.onCloseCallback = null + informationPopup.open(); + // deleting transaction object, we don't want memleaks + currentWallet.disposeTransaction(transaction); + + } else { + console.log("Transaction created, amount: " + walletManager.displayAmount(transaction.amount) + + ", fee: " + walletManager.displayAmount(transaction.fee)); + + // here we show confirmation popup; + + transactionConfirmationPopup.title = qsTr("Confirmation") + translationManager.emptyString + transactionConfirmationPopup.text = qsTr("Please confirm transaction:\n") + + qsTr("\nAddress: ") + address + + qsTr("\nPayment ID: ") + paymentId + + qsTr("\n\nAmount: ") + walletManager.displayAmount(transaction.amount) + + qsTr("\nFee: ") + walletManager.displayAmount(transaction.fee) + + qsTr("\n\nMixin: ") + mixinCount + + qsTr("\n\nDescription: ") + transactionDescription; + + translationManager.emptyString + transactionConfirmationPopup.icon = StandardIcon.Question + transactionConfirmationPopup.open() + } + } // called on "transfer" @@ -375,7 +414,10 @@ ApplicationWindow { ", priority: ", priority, ", description: ", description); - + showProcessingSplash("Creating transaction"); + + transactionDescription = description; + // validate amount; var amountxmr = walletManager.amountFromString(amount); console.log("integer amount: ", amountxmr); @@ -403,42 +445,7 @@ ApplicationWindow { return; } - // validate address; - transaction = currentWallet.createTransaction(address, paymentId, amountxmr, mixinCount, priority); - if (transaction.status !== PendingTransaction.Status_Ok) { - console.error("Can't create transaction: ", transaction.errorString); - informationPopup.title = qsTr("Error") + translationManager.emptyString; - if (currentWallet.connected == Wallet.ConnectionStatus_WrongVersion) - informationPopup.text = qsTr("Can't create transaction: Wrong daemon version: ") + transaction.errorString - else - informationPopup.text = qsTr("Can't create transaction: ") + transaction.errorString - informationPopup.icon = StandardIcon.Critical - informationPopup.onCloseCallback = null - informationPopup.open(); - // deleting transaction object, we don't want memleaks - currentWallet.disposeTransaction(transaction); - - } else { - console.log("Transaction created, amount: " + walletManager.displayAmount(transaction.amount) - + ", fee: " + walletManager.displayAmount(transaction.fee)); - - transactionDescription = description; - - // here we show confirmation popup; - - transactionConfirmationPopup.title = qsTr("Confirmation") + translationManager.emptyString - transactionConfirmationPopup.text = qsTr("Please confirm transaction:\n") - + qsTr("\nAddress: ") + address - + qsTr("\nPayment ID: ") + paymentId - + qsTr("\n\nAmount: ") + walletManager.displayAmount(transaction.amount) - + qsTr("\nFee: ") + walletManager.displayAmount(transaction.fee) - + qsTr("\n\nMixin: ") + mixinCount - + qsTr("\n\nDescription: ") + description - + translationManager.emptyString - transactionConfirmationPopup.icon = StandardIcon.Question - transactionConfirmationPopup.open() - // committing transaction - } + currentWallet.createTransactionAsync(address, paymentId, amountxmr, mixinCount, priority); } // called after user confirms transaction @@ -536,7 +543,8 @@ ApplicationWindow { function showProcessingSplash(message) { console.log("Displaying processing splash") if (typeof message != 'undefined') { - splash.message = message + splash.messageText = message + splash.heightProgressText = "" } splash.show() } From 66692be7cf048a89c0c36af2c36de09be6fa3698 Mon Sep 17 00:00:00 2001 From: Jacob Brydolf Date: Tue, 8 Nov 2016 19:48:41 +0100 Subject: [PATCH 4/4] createTransactionAsync(): removed reference to WalletManager --- src/libwalletqt/Wallet.cpp | 3 +-- src/libwalletqt/Wallet.h | 1 - 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/libwalletqt/Wallet.cpp b/src/libwalletqt/Wallet.cpp index 9eb1aae1..552b3b8d 100644 --- a/src/libwalletqt/Wallet.cpp +++ b/src/libwalletqt/Wallet.cpp @@ -212,7 +212,7 @@ PendingTransaction *Wallet::createTransaction(const QString &dst_addr, const QSt Bitmonero::PendingTransaction * ptImpl = m_walletImpl->createTransaction( dst_addr.toStdString(), payment_id.toStdString(), amount, mixin_count, static_cast(priority)); - PendingTransaction * result = new PendingTransaction(ptImpl, m_walletManager); + PendingTransaction * result = new PendingTransaction(ptImpl,0); return result; } @@ -307,7 +307,6 @@ Wallet::Wallet(Bitmonero::Wallet *w, QObject *parent) { m_history = new TransactionHistory(m_walletImpl->history(), this); m_walletImpl->setListener(new WalletListenerImpl(this)); - m_walletManager = parent; } Wallet::~Wallet() diff --git a/src/libwalletqt/Wallet.h b/src/libwalletqt/Wallet.h index e9eb71d7..02cd80bb 100644 --- a/src/libwalletqt/Wallet.h +++ b/src/libwalletqt/Wallet.h @@ -194,7 +194,6 @@ private: mutable QTime m_daemonBlockChainTargetHeightTime; mutable quint64 m_daemonBlockChainTargetHeight; int m_daemonBlockChainTargetHeightTtl; - QObject * m_walletManager; };