From fc6805a93cd2d66d5b6c0e5718d6e428a34ea823 Mon Sep 17 00:00:00 2001 From: woodser Date: Wed, 3 Jul 2019 14:36:38 -0400 Subject: [PATCH] implement MoneroTxWallet::merge() and placeholder for transfer merges --- src/wallet/MoneroWalletModel.cpp | 49 ++++++++++++++++++++++++++++++++ src/wallet/MoneroWalletModel.h | 4 +++ 2 files changed, 53 insertions(+) diff --git a/src/wallet/MoneroWalletModel.cpp b/src/wallet/MoneroWalletModel.cpp index 1045c58..b7ffc6c 100644 --- a/src/wallet/MoneroWalletModel.cpp +++ b/src/wallet/MoneroWalletModel.cpp @@ -15,6 +15,15 @@ namespace monero { // ----------------------- UNDECLARED PRIVATE HELPERS ----------------------- + void mergeIncomingTransfer(const vector> transfers, const shared_ptr& transfer) { + for (const shared_ptr& aTransfer : transfers) { + if (aTransfer->accountIndex.get() == transfer->accountIndex.get() && aTransfer->subaddressIndex.get() == transfer->subaddressIndex.get()) { + aTransfer->merge(aTransfer, transfer); + return; + } + } + } + // ---------------------------- MONERO ACCOUNT ------------------------------ // TODO: ensure return object is not being unecessarily copied @@ -65,6 +74,31 @@ namespace monero { return !incomingTransfers.empty(); } + void MoneroTxWallet::merge(const shared_ptr& self, const shared_ptr& other) { + cout << "MoneroTxWallet::merge()" << endl; + if (this != self.get()) throw runtime_error("this != self"); + if (self == other) return; + MoneroTx::merge(self, other); + + // merge wallet extensions + note = MoneroUtils::reconcile(note, other->note); + + // merge incoming transfers + if (!other->incomingTransfers.empty()) { + for (const shared_ptr& transfer : other->incomingTransfers) { + transfer->tx = self; + mergeIncomingTransfer(self->incomingTransfers, transfer); + } + } + + // merge outgoing transfer + if (other->outgoingTransfer != boost::none) { + other->outgoingTransfer.get()->tx = self; + if (self->outgoingTransfer == boost::none) self->outgoingTransfer = other->outgoingTransfer; + else self->outgoingTransfer.get()->merge(self->outgoingTransfer.get(), other->outgoingTransfer.get()); + } + } + //boost::property_tree::ptree MoneroUtils::txWalletToPropertyTree(const MoneroTxWallet& tx) { // cout << "txWalletToPropertyTree(tx)" << endl; // boost::property_tree::ptree txNode = txToPropertyTree(tx); @@ -197,6 +231,11 @@ namespace monero { return node; } + void MoneroTransfer::merge(const shared_ptr& self, const shared_ptr& other) { + cout << "MoneroTransfer::merge" << endl; + throw runtime_error("Not implemented"); + } + // ----------------------- MONERO INCOMING TRANSFER ------------------------- boost::optional MoneroIncomingTransfer::getIsIncoming() const { return true; } @@ -209,6 +248,11 @@ namespace monero { return node; } + void MoneroIncomingTransfer::merge(const shared_ptr& self, const shared_ptr& other) { + cout << "MoneroIncomingTransfer::merge" << endl; + throw runtime_error("Not implemented"); + } + // ----------------------- MONERO OUTGOING TRANSFER ------------------------- boost::optional MoneroOutgoingTransfer::getIsIncoming() const { return false; } @@ -222,6 +266,11 @@ namespace monero { return node; } + void MoneroOutgoingTransfer::merge(const shared_ptr& self, const shared_ptr& other) { + cout << "MoneroIncomingTransfer::merge" << endl; + throw runtime_error("Not implemented"); + } + // ----------------------- MONERO TRANSFER REQUEST -------------------------- boost::optional MoneroTransferRequest::getIsIncoming() const { return isIncoming; } diff --git a/src/wallet/MoneroWalletModel.h b/src/wallet/MoneroWalletModel.h index da5f9a4..c32d849 100644 --- a/src/wallet/MoneroWalletModel.h +++ b/src/wallet/MoneroWalletModel.h @@ -102,6 +102,7 @@ namespace monero { return !(*getIsIncoming()); } boost::property_tree::ptree toPropertyTree() const; + void merge(const shared_ptr& self, const shared_ptr& other); }; /** @@ -113,6 +114,7 @@ namespace monero { boost::optional getIsIncoming() const; boost::property_tree::ptree toPropertyTree() const; + void merge(const shared_ptr& self, const shared_ptr& other); }; /** @@ -125,6 +127,7 @@ namespace monero { boost::optional getIsIncoming() const; boost::property_tree::ptree toPropertyTree() const; + void merge(const shared_ptr& self, const shared_ptr& other); }; /** @@ -185,6 +188,7 @@ namespace monero { bool getIsIncoming() const; bool getIsOutgoing() const; boost::property_tree::ptree toPropertyTree() const; + void merge(const shared_ptr& self, const shared_ptr& other); }; /**