#include "addresstablemodel.h"
#include "guiutil.h"
+#include "walletmodel.h"
-#include "headers.h"
+#include "wallet.h"
#include <QFont>
#include <QColor>
};
// Private implementation
-struct AddressTablePriv
+class AddressTablePriv
{
+public:
CWallet *wallet;
QList<AddressTableEntry> cachedAddressTable;
{
cachedAddressTable.clear();
- CRITICAL_BLOCK(cs_mapPubKeys)
- CRITICAL_BLOCK(wallet->cs_mapAddressBook)
{
- BOOST_FOREACH(const PAIRTYPE(std::string, std::string)& item, wallet->mapAddressBook)
+ LOCK(wallet->cs_wallet);
+ BOOST_FOREACH(const PAIRTYPE(CBitcoinAddress, std::string)& item, wallet->mapAddressBook)
{
- std::string strAddress = item.first;
- std::string strName = item.second;
- uint160 hash160;
- bool fMine = (AddressToHash160(strAddress, hash160) && mapPubKeys.count(hash160));
+ const CBitcoinAddress& address = item.first;
+ const std::string& strName = item.second;
+ bool fMine = wallet->HaveKey(address);
cachedAddressTable.append(AddressTableEntry(fMine ? AddressTableEntry::Receiving : AddressTableEntry::Sending,
QString::fromStdString(strName),
- QString::fromStdString(strAddress)));
+ QString::fromStdString(address.ToString())));
}
}
}
}
};
-AddressTableModel::AddressTableModel(CWallet *wallet, QObject *parent) :
- QAbstractTableModel(parent),wallet(wallet),priv(0)
+AddressTableModel::AddressTableModel(CWallet *wallet, WalletModel *parent) :
+ QAbstractTableModel(parent),walletModel(parent),wallet(wallet),priv(0)
{
columns << tr("Label") << tr("Address");
priv = new AddressTablePriv(wallet);
return false;
AddressTableEntry *rec = static_cast<AddressTableEntry*>(index.internalPointer());
+ editStatus = OK;
+
if(role == Qt::EditRole)
{
switch(index.column())
rec->label = value.toString();
break;
case Address:
- // Refuse to set invalid address
- if(!validateAddress(value.toString()))
+ // Refuse to set invalid address, set error status and return false
+ if(!walletModel->validateAddress(value.toString()))
+ {
+ editStatus = INVALID_ADDRESS;
return false;
- // Double-check that we're not overwriting receiving address
+ }
+ // Double-check that we're not overwriting a receiving address
if(rec->type == AddressTableEntry::Sending)
{
- CRITICAL_BLOCK(wallet->cs_mapAddressBook)
{
+ LOCK(wallet->cs_wallet);
// Remove old entry
wallet->DelAddressBookName(rec->address.toStdString());
// Add new entry with new address
}
}
-void AddressTableModel::updateList()
+void AddressTableModel::update()
{
- // Update internal model from Bitcoin core
+ // Update address book model from Bitcoin core
beginResetModel();
priv->refreshAddressTable();
endResetModel();
std::string strLabel = label.toStdString();
std::string strAddress = address.toStdString();
+ editStatus = OK;
+
if(type == Send)
{
- // Check for duplicate
- CRITICAL_BLOCK(wallet->cs_mapAddressBook)
+ if(!walletModel->validateAddress(address))
{
+ editStatus = INVALID_ADDRESS;
+ return QString();
+ }
+ // Check for duplicate addresses
+ {
+ LOCK(wallet->cs_wallet);
if(wallet->mapAddressBook.count(strAddress))
{
+ editStatus = DUPLICATE_ADDRESS;
return QString();
}
}
}
else if(type == Receive)
{
- // Generate a new address to associate with given label, optionally
- // set as default receiving address.
- strAddress = PubKeyToAddress(wallet->GetOrReuseKeyFromPool());
+ // Generate a new address to associate with given label
+ WalletModel::UnlockContext ctx(walletModel->requestUnlock());
+ if(!ctx.isValid())
+ {
+ // Unlock wallet failed or was cancelled
+ editStatus = WALLET_UNLOCK_FAILURE;
+ return QString();
+ }
+ std::vector<unsigned char> newKey;
+ if(!wallet->GetKeyFromPool(newKey, true))
+ {
+ editStatus = KEY_GENERATION_FAILURE;
+ return QString();
+ }
+ strAddress = CBitcoinAddress(newKey).ToString();
}
else
{
return QString();
}
- // Add entry and update list
- CRITICAL_BLOCK(wallet->cs_mapAddressBook)
+ // Add entry
+ {
+ LOCK(wallet->cs_wallet);
wallet->SetAddressBookName(strAddress, strLabel);
- updateList();
+ }
return QString::fromStdString(strAddress);
}
// Also refuse to remove receiving addresses.
return false;
}
- CRITICAL_BLOCK(wallet->cs_mapAddressBook)
{
+ LOCK(wallet->cs_wallet);
wallet->DelAddressBookName(rec->address.toStdString());
}
- updateList();
return true;
}
-void AddressTableModel::update()
-{
-
-}
-
-bool AddressTableModel::validateAddress(const QString &address)
-{
- uint160 hash160 = 0;
-
- return AddressToHash160(address.toStdString(), hash160);
-}
-
/* Look up label for address in address book, if not found return empty string.
*/
QString AddressTableModel::labelForAddress(const QString &address) const
{
- CRITICAL_BLOCK(wallet->cs_mapAddressBook)
{
- std::map<std::string, std::string>::iterator mi = wallet->mapAddressBook.find(address.toStdString());
+ LOCK(wallet->cs_wallet);
+ CBitcoinAddress address_parsed(address.toStdString());
+ std::map<CBitcoinAddress, std::string>::iterator mi = wallet->mapAddressBook.find(address_parsed);
if (mi != wallet->mapAddressBook.end())
{
return QString::fromStdString(mi->second);