Merge branch 'setaccountbug' of https://github.com/gavinandresen/bitcoin-git into integration

This commit is contained in:
Gavin Andresen 2011-01-18 14:33:18 -05:00
commit 1aefe491fb
1 changed files with 30 additions and 10 deletions

40
rpc.cpp
View File

@ -315,15 +315,9 @@ Value getnewaddress(const Array& params, bool fHelp)
}
Value getaccountaddress(const Array& params, bool fHelp)
string GetAccountAddress(string strAccount, bool bForceNew=false)
{
if (fHelp || params.size() != 1)
throw runtime_error(
"getaccountaddress <account>\n"
"Returns the current bitcoin address for receiving payments to this account.");
// Parse the account first so we don't generate a key if there's an error
string strAccount = AccountFromValue(params[0]);
string strAddress;
CRITICAL_BLOCK(cs_mapWallet)
{
@ -350,7 +344,7 @@ Value getaccountaddress(const Array& params, bool fHelp)
}
// Generate a new key
if (account.vchPubKey.empty())
if (account.vchPubKey.empty() || bForceNew)
{
account.vchPubKey = GetKeyFromKeyPool();
string strAddress = PubKeyToAddress(account.vchPubKey);
@ -359,10 +353,25 @@ Value getaccountaddress(const Array& params, bool fHelp)
}
walletdb.TxnCommit();
return PubKeyToAddress(account.vchPubKey);
strAddress = PubKeyToAddress(account.vchPubKey);
}
return strAddress;
}
Value getaccountaddress(const Array& params, bool fHelp)
{
if (fHelp || params.size() != 1)
throw runtime_error(
"getaccountaddress <account>\n"
"Returns the current bitcoin address for receiving payments to this account.");
// Parse the account first so we don't generate a key if there's an error
string strAccount = AccountFromValue(params[0]);
return GetAccountAddress(strAccount);
}
Value setaccount(const Array& params, bool fHelp)
{
@ -376,6 +385,17 @@ Value setaccount(const Array& params, bool fHelp)
if (params.size() > 1)
strAccount = AccountFromValue(params[1]);
// Detect when changing the account of an address that is the 'unused current key' of another account:
CRITICAL_BLOCK(cs_mapAddressBook)
{
if (mapAddressBook.count(strAddress))
{
string strOldAccount = mapAddressBook[strAddress];
if (strAddress == GetAccountAddress(strOldAccount))
GetAccountAddress(strOldAccount, true);
}
}
SetAddressBookName(strAddress, strAccount);
return Value::null;
}