aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRussell Yanofsky <russ@yanofsky.org>2017-04-18 13:01:23 -0400
committerJohn Newbery <john@johnnewbery.com>2018-04-04 16:52:40 -0400
commit3ec2ebcd9b4beb4277f1f4791c6acbc538784f70 (patch)
treec86c3c7b5d346e6f2460426de31f753b949dd3e3 /src
parent827de038ab6fa58aa3d46151eb2f8dc6add7743e (diff)
Remove direct bitcoin calls from qt/addresstablemodel.cpp
Diffstat (limited to 'src')
-rw-r--r--src/interface/wallet.cpp18
-rw-r--r--src/interface/wallet.h29
-rw-r--r--src/qt/addresstablemodel.cpp59
-rw-r--r--src/qt/addresstablemodel.h7
-rw-r--r--src/qt/walletmodel.cpp2
5 files changed, 78 insertions, 37 deletions
diff --git a/src/interface/wallet.cpp b/src/interface/wallet.cpp
index cbf30f49bc..efc9946fb6 100644
--- a/src/interface/wallet.cpp
+++ b/src/interface/wallet.cpp
@@ -85,6 +85,10 @@ public:
}
bool backupWallet(const std::string& filename) override { return m_wallet.BackupWallet(filename); }
std::string getWalletName() override { return m_wallet.GetName(); }
+ bool getKeyFromPool(bool internal, CPubKey& pub_key) override
+ {
+ return m_wallet.GetKeyFromPool(pub_key, internal);
+ }
bool getPubKey(const CKeyID& address, CPubKey& pub_key) override { return m_wallet.GetPubKey(address, pub_key); }
bool getPrivKey(const CKeyID& address, CKey& key) override { return m_wallet.GetKey(address, key); }
bool isSpendable(const CTxDestination& dest) override { return IsMine(m_wallet, dest) & ISMINE_SPENDABLE; }
@@ -93,6 +97,10 @@ public:
{
return m_wallet.SetAddressBook(dest, name, purpose);
}
+ bool delAddressBook(const CTxDestination& dest) override
+ {
+ return m_wallet.DelAddressBook(dest);
+ }
bool getAddress(const CTxDestination& dest, std::string* name, isminetype* is_mine) override
{
LOCK(m_wallet.cs_wallet);
@@ -108,6 +116,16 @@ public:
}
return true;
}
+ std::vector<WalletAddress> getAddresses() override
+ {
+ LOCK(m_wallet.cs_wallet);
+ std::vector<WalletAddress> result;
+ for (const auto& item : m_wallet.mapAddressBook) {
+ result.emplace_back(item.first, IsMine(m_wallet, item.first), item.second.name, item.second.purpose);
+ }
+ return result;
+ }
+ void learnRelatedScripts(const CPubKey& key, OutputType type) override { m_wallet.LearnRelatedScripts(key, type); }
bool addDestData(const CTxDestination& dest, const std::string& key, const std::string& value) override
{
LOCK(m_wallet.cs_wallet);
diff --git a/src/interface/wallet.h b/src/interface/wallet.h
index 6cc196fd94..4510276446 100644
--- a/src/interface/wallet.h
+++ b/src/interface/wallet.h
@@ -6,6 +6,7 @@
#define BITCOIN_INTERFACE_WALLET_H
#include <amount.h> // For CAmount
+#include <pubkey.h> // For CTxDestination (CKeyID and CScriptID)
#include <script/ismine.h> // For isminefilter, isminetype
#include <script/standard.h> // For CTxDestination
#include <support/allocators/secure.h> // For SecureString
@@ -30,6 +31,7 @@ namespace interface {
class Handler;
class PendingWalletTx;
+struct WalletAddress;
struct WalletBalances;
struct WalletTxOut;
@@ -67,6 +69,9 @@ public:
//! Get wallet name.
virtual std::string getWalletName() = 0;
+ // Get key from pool.
+ virtual bool getKeyFromPool(bool internal, CPubKey& pub_key) = 0;
+
//! Get public key.
virtual bool getPubKey(const CKeyID& address, CPubKey& pub_key) = 0;
@@ -82,11 +87,21 @@ public:
//! Add or update address.
virtual bool setAddressBook(const CTxDestination& dest, const std::string& name, const std::string& purpose) = 0;
+ // Remove address.
+ virtual bool delAddressBook(const CTxDestination& dest) = 0;
+
//! Look up address in wallet, return whether exists.
virtual bool getAddress(const CTxDestination& dest,
std::string* name = nullptr,
isminetype* is_mine = nullptr) = 0;
+ //! Get wallet address list.
+ virtual std::vector<WalletAddress> getAddresses() = 0;
+
+ //! Add scripts to key store so old so software versions opening the wallet
+ //! database can detect payments to newer address types.
+ virtual void learnRelatedScripts(const CPubKey& key, OutputType type) = 0;
+
//! Add dest data.
virtual bool addDestData(const CTxDestination& dest, const std::string& key, const std::string& value) = 0;
@@ -216,6 +231,20 @@ public:
std::string& reject_reason) = 0;
};
+//! Information about one wallet address.
+struct WalletAddress
+{
+ CTxDestination dest;
+ isminetype is_mine;
+ std::string name;
+ std::string purpose;
+
+ WalletAddress(CTxDestination dest, isminetype is_mine, std::string name, std::string purpose)
+ : dest(std::move(dest)), is_mine(is_mine), name(std::move(name)), purpose(std::move(purpose))
+ {
+ }
+};
+
//! Collection of wallet balances.
struct WalletBalances
{
diff --git a/src/qt/addresstablemodel.cpp b/src/qt/addresstablemodel.cpp
index 801334483a..a9408895d9 100644
--- a/src/qt/addresstablemodel.cpp
+++ b/src/qt/addresstablemodel.cpp
@@ -7,6 +7,7 @@
#include <qt/guiutil.h>
#include <qt/walletmodel.h>
+#include <interface/node.h>
#include <key_io.h>
#include <wallet/wallet.h>
@@ -67,28 +68,23 @@ static AddressTableEntry::Type translateTransactionType(const QString &strPurpos
class AddressTablePriv
{
public:
- CWallet *wallet;
QList<AddressTableEntry> cachedAddressTable;
AddressTableModel *parent;
- AddressTablePriv(CWallet *_wallet, AddressTableModel *_parent):
- wallet(_wallet), parent(_parent) {}
+ AddressTablePriv(AddressTableModel *_parent):
+ parent(_parent) {}
- void refreshAddressTable()
+ void refreshAddressTable(interface::Wallet& wallet)
{
cachedAddressTable.clear();
{
- LOCK(wallet->cs_wallet);
- for (const std::pair<CTxDestination, CAddressBookData>& item : wallet->mapAddressBook)
+ for (const auto& address : wallet.getAddresses())
{
- const CTxDestination& address = item.first;
- bool fMine = IsMine(*wallet, address);
AddressTableEntry::Type addressType = translateTransactionType(
- QString::fromStdString(item.second.purpose), fMine);
- const std::string& strName = item.second.name;
+ QString::fromStdString(address.purpose), address.is_mine);
cachedAddressTable.append(AddressTableEntry(addressType,
- QString::fromStdString(strName),
- QString::fromStdString(EncodeDestination(address))));
+ QString::fromStdString(address.name),
+ QString::fromStdString(EncodeDestination(address.dest))));
}
}
// qLowerBound() and qUpperBound() require our cachedAddressTable list to be sorted in asc order
@@ -162,12 +158,12 @@ public:
}
};
-AddressTableModel::AddressTableModel(CWallet *_wallet, WalletModel *parent) :
- QAbstractTableModel(parent),walletModel(parent),wallet(_wallet),priv(0)
+AddressTableModel::AddressTableModel(WalletModel *parent) :
+ QAbstractTableModel(parent),walletModel(parent),priv(0)
{
columns << tr("Label") << tr("Address");
- priv = new AddressTablePriv(wallet, this);
- priv->refreshAddressTable();
+ priv = new AddressTablePriv(this);
+ priv->refreshAddressTable(parent->wallet());
}
AddressTableModel::~AddressTableModel()
@@ -244,7 +240,6 @@ bool AddressTableModel::setData(const QModelIndex &index, const QVariant &value,
if(role == Qt::EditRole)
{
- LOCK(wallet->cs_wallet); /* For SetAddressBook / DelAddressBook */
CTxDestination curAddress = DecodeDestination(rec->address.toStdString());
if(index.column() == Label)
{
@@ -254,7 +249,7 @@ bool AddressTableModel::setData(const QModelIndex &index, const QVariant &value,
editStatus = NO_CHANGES;
return false;
}
- wallet->SetAddressBook(curAddress, value.toString().toStdString(), strPurpose);
+ walletModel->wallet().setAddressBook(curAddress, value.toString().toStdString(), strPurpose);
} else if(index.column() == Address) {
CTxDestination newAddress = DecodeDestination(value.toString().toStdString());
// Refuse to set invalid address, set error status and return false
@@ -271,7 +266,7 @@ bool AddressTableModel::setData(const QModelIndex &index, const QVariant &value,
}
// Check for duplicate addresses to prevent accidental deletion of addresses, if you try
// to paste an existing address over another address (with a different label)
- else if(wallet->mapAddressBook.count(newAddress))
+ if (walletModel->wallet().getAddress(newAddress))
{
editStatus = DUPLICATE_ADDRESS;
return false;
@@ -280,9 +275,9 @@ bool AddressTableModel::setData(const QModelIndex &index, const QVariant &value,
else if(rec->type == AddressTableEntry::Sending)
{
// Remove old entry
- wallet->DelAddressBook(curAddress);
+ walletModel->wallet().delAddressBook(curAddress);
// Add new entry with new address
- wallet->SetAddressBook(newAddress, rec->label.toStdString(), strPurpose);
+ walletModel->wallet().setAddressBook(newAddress, value.toString().toStdString(), strPurpose);
}
}
return true;
@@ -356,8 +351,7 @@ QString AddressTableModel::addRow(const QString &type, const QString &label, con
}
// Check for duplicate addresses
{
- LOCK(wallet->cs_wallet);
- if(wallet->mapAddressBook.count(DecodeDestination(strAddress)))
+ if(walletModel->wallet().getAddress(DecodeDestination(strAddress)))
{
editStatus = DUPLICATE_ADDRESS;
return QString();
@@ -368,7 +362,7 @@ QString AddressTableModel::addRow(const QString &type, const QString &label, con
{
// Generate a new address to associate with given label
CPubKey newKey;
- if(!wallet->GetKeyFromPool(newKey))
+ if(!walletModel->wallet().getKeyFromPool(false /* internal */, newKey))
{
WalletModel::UnlockContext ctx(walletModel->requestUnlock());
if(!ctx.isValid())
@@ -377,13 +371,13 @@ QString AddressTableModel::addRow(const QString &type, const QString &label, con
editStatus = WALLET_UNLOCK_FAILURE;
return QString();
}
- if(!wallet->GetKeyFromPool(newKey))
+ if(!walletModel->wallet().getKeyFromPool(false /* internal */, newKey))
{
editStatus = KEY_GENERATION_FAILURE;
return QString();
}
}
- wallet->LearnRelatedScripts(newKey, address_type);
+ walletModel->wallet().learnRelatedScripts(newKey, address_type);
strAddress = EncodeDestination(GetDestinationForKey(newKey, address_type));
}
else
@@ -392,7 +386,7 @@ QString AddressTableModel::addRow(const QString &type, const QString &label, con
}
// Add entry
- wallet->SetAddressBook(DecodeDestination(strAddress), strLabel,
+ walletModel->wallet().setAddressBook(DecodeDestination(strAddress), strLabel,
(type == Send ? "send" : "receive"));
return QString::fromStdString(strAddress);
}
@@ -407,7 +401,7 @@ bool AddressTableModel::removeRows(int row, int count, const QModelIndex &parent
// Also refuse to remove receiving addresses.
return false;
}
- wallet->DelAddressBook(DecodeDestination(rec->address.toStdString()));
+ walletModel->wallet().delAddressBook(DecodeDestination(rec->address.toStdString()));
return true;
}
@@ -416,12 +410,11 @@ bool AddressTableModel::removeRows(int row, int count, const QModelIndex &parent
QString AddressTableModel::labelForAddress(const QString &address) const
{
{
- LOCK(wallet->cs_wallet);
CTxDestination destination = DecodeDestination(address.toStdString());
- std::map<CTxDestination, CAddressBookData>::iterator mi = wallet->mapAddressBook.find(destination);
- if (mi != wallet->mapAddressBook.end())
+ std::string name;
+ if (walletModel->wallet().getAddress(destination, &name))
{
- return QString::fromStdString(mi->second.name);
+ return QString::fromStdString(name);
}
}
return QString();
@@ -441,7 +434,7 @@ int AddressTableModel::lookupAddress(const QString &address) const
}
}
-OutputType AddressTableModel::GetDefaultAddressType() const { return wallet->m_default_address_type; };
+OutputType AddressTableModel::GetDefaultAddressType() const { return walletModel->wallet().getDefaultAddressType(); };
void AddressTableModel::emitDataChanged(int idx)
{
diff --git a/src/qt/addresstablemodel.h b/src/qt/addresstablemodel.h
index ed7a4e6f43..954f0f593e 100644
--- a/src/qt/addresstablemodel.h
+++ b/src/qt/addresstablemodel.h
@@ -13,7 +13,9 @@ enum class OutputType;
class AddressTablePriv;
class WalletModel;
-class CWallet;
+namespace interface {
+class Wallet;
+}
/**
Qt model of the address book in the core. This allows views to access and modify the address book.
@@ -23,7 +25,7 @@ class AddressTableModel : public QAbstractTableModel
Q_OBJECT
public:
- explicit AddressTableModel(CWallet *wallet, WalletModel *parent = 0);
+ explicit AddressTableModel(WalletModel *parent = 0);
~AddressTableModel();
enum ColumnIndex {
@@ -80,7 +82,6 @@ public:
private:
WalletModel *walletModel;
- CWallet *wallet;
AddressTablePriv *priv;
QStringList columns;
EditStatus editStatus;
diff --git a/src/qt/walletmodel.cpp b/src/qt/walletmodel.cpp
index 8010b6097e..06409ca29f 100644
--- a/src/qt/walletmodel.cpp
+++ b/src/qt/walletmodel.cpp
@@ -49,7 +49,7 @@ WalletModel::WalletModel(std::unique_ptr<interface::Wallet> wallet, interface::N
fHaveWatchOnly = m_wallet->haveWatchOnly();
fForceCheckBalanceChanged = false;
- addressTableModel = new AddressTableModel(cwallet, this);
+ addressTableModel = new AddressTableModel(this);
transactionTableModel = new TransactionTableModel(platformStyle, cwallet, this);
recentRequestsTableModel = new RecentRequestsTableModel(cwallet, this);