Skip to content

Commit

Permalink
wallet: implement ForEachAddrBookEntry method
Browse files Browse the repository at this point in the history
  • Loading branch information
furszy committed Jun 21, 2022
1 parent 09649bc commit 032842a
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 6 deletions.
23 changes: 17 additions & 6 deletions src/wallet/wallet.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2348,17 +2348,28 @@ void CWallet::MarkDestinationsDirty(const std::set<CTxDestination>& destinations
}
}

void CWallet::ForEachAddrBookEntry(const ListAddrBookFunc& func) const
{
AssertLockHeld(cs_wallet);
for (const std::pair<const CTxDestination, CAddressBookData>& item : m_address_book) {
const auto& entry = item.second;
func(item.first, entry.GetLabel(), entry.purpose, entry.IsChange());
}
}

std::vector<CTxDestination> CWallet::ListAddrBookAddresses(const std::optional<AddrBookFilter>& _filter) const
{
AssertLockHeld(cs_wallet);
std::vector<CTxDestination> result;
AddrBookFilter filter = _filter ? *_filter : AddrBookFilter();
for (const std::pair<const CTxDestination, CAddressBookData>& item : m_address_book) {
if (filter.ignore_change && item.second.IsChange()) continue;
const std::string& strName = item.second.GetLabel();
if (filter.m_op_label && *filter.m_op_label != strName) continue;
result.emplace_back(item.first);
}
ForEachAddrBookEntry([&result, &filter](const CTxDestination& dest, const std::string& label, const std::string& purpose, bool is_change) {
// Filter by change
if (filter.ignore_change && is_change) return;
// Filter by label
if (filter.m_op_label && *filter.m_op_label != label) return;
// All good
result.emplace_back(dest);
});
return result;
}

Expand Down
7 changes: 7 additions & 0 deletions src/wallet/wallet.h
Original file line number Diff line number Diff line change
Expand Up @@ -648,6 +648,13 @@ class CWallet final : public WalletStorage, public interfaces::Chain::Notificati
*/
std::vector<CTxDestination> ListAddrBookAddresses(const std::optional<AddrBookFilter>& filter) const EXCLUSIVE_LOCKS_REQUIRED(cs_wallet);

/**
* Walk-through the address book entries.
* Stops when the provided 'ListAddrBookFunc' returns false.
*/
using ListAddrBookFunc = std::function<void(const CTxDestination& dest, const std::string& label, const std::string& purpose, bool is_change)>;
void ForEachAddrBookEntry(const ListAddrBookFunc& func) const EXCLUSIVE_LOCKS_REQUIRED(cs_wallet);

/**
* Marks all outputs in each one of the destinations dirty, so their cache is
* reset and does not return outdated information.
Expand Down

0 comments on commit 032842a

Please sign in to comment.