update to work with new lock system, add protocol.* to build system
authorWladimir J. van der Laan <laanwj@gmail.com>
Fri, 2 Sep 2011 16:02:22 +0000 (18:02 +0200)
committerWladimir J. van der Laan <laanwj@gmail.com>
Fri, 2 Sep 2011 16:02:22 +0000 (18:02 +0200)
bitcoin-qt.pro
src/main.cpp
src/main.h
src/qt/addresstablemodel.cpp
src/qt/addresstablemodel.h
src/qt/clientmodel.cpp
src/qt/editaddressdialog.cpp
src/qt/transactiondesc.cpp
src/qt/transactiontablemodel.cpp
src/qt/walletmodel.cpp
src/wallet.cpp

index 28c5a33..84712e3 100644 (file)
@@ -91,7 +91,9 @@ HEADERS += src/qt/bitcoingui.h \
     src/qt/qvalidatedlineedit.h \
     src/qt/bitcoinunits.h \
     src/qt/qvaluecombobox.h \
-    src/qt/askpassphrasedialog.h
+    src/qt/askpassphrasedialog.h \
+    src/protocol.h
+
 SOURCES += src/qt/bitcoin.cpp src/qt/bitcoingui.cpp \
     src/qt/transactiontablemodel.cpp \
     src/qt/addresstablemodel.cpp \
@@ -136,7 +138,8 @@ SOURCES += src/qt/bitcoin.cpp src/qt/bitcoingui.cpp \
     src/qt/qvalidatedlineedit.cpp \
     src/qt/bitcoinunits.cpp \
     src/qt/qvaluecombobox.cpp \
-    src/qt/askpassphrasedialog.cpp
+    src/qt/askpassphrasedialog.cpp \
+    src/protocol.cpp
 
 RESOURCES += \
     src/qt/bitcoin.qrc
index 5d29492..59a6984 100644 (file)
@@ -31,6 +31,7 @@ map<uint256, CBlockIndex*> mapBlockIndex;
 uint256 hashGenesisBlock("0x000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f");
 static CBigNum bnProofOfWorkLimit(~uint256(0) >> 32);
 const int nTotalBlocksEstimate = 140700; // Conservative estimate of total nr of blocks on main chain
+int nMaxBlocksOfOtherNodes = 0; // Maximum amount of blocks that other nodes claim to have
 const int nInitialBlockThreshold = 120; // Regard blocks up until N-threshold as "initial download"
 CBlockIndex* pindexGenesisBlock = NULL;
 int nBestHeight = -1;
@@ -726,6 +727,12 @@ int GetTotalBlocksEstimate()
     }
 }
 
+// Return maximum amount of blocks that other nodes claim to have
+int GetMaxBlocksOfOtherNodes()
+{
+    return nMaxBlocksOfOtherNodes;
+}
+
 bool IsInitialBlockDownload()
 {
     if (pindexBest == NULL || nBestHeight < (GetTotalBlocksEstimate()-nInitialBlockThreshold))
@@ -1837,9 +1844,9 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
         pfrom->fSuccessfullyConnected = true;
 
         printf("version message: version %d, blocks=%d\n", pfrom->nVersion, pfrom->nStartingHeight);
-        if(pfrom->nStartingHeight > nTotalBlocksEstimate)
+        if(pfrom->nStartingHeight > nMaxBlocksOfOtherNodes)
         {
-            nTotalBlocksEstimate = pfrom->nStartingHeight;
+            nMaxBlocksOfOtherNodes = pfrom->nStartingHeight;
         }
     }
 
index 427067b..238cb5d 100644 (file)
@@ -99,6 +99,7 @@ void FormatHashBuffers(CBlock* pblock, char* pmidstate, char* pdata, char* phash
 bool CheckWork(CBlock* pblock, CWallet& wallet, CReserveKey& reservekey);
 bool CheckProofOfWork(uint256 hash, unsigned int nBits);
 int GetTotalBlocksEstimate();
+int GetMaxBlocksOfOtherNodes();
 bool IsInitialBlockDownload();
 std::string GetWarnings(std::string strFor);
 
index 6bda1e7..8fd6d52 100644 (file)
@@ -39,8 +39,7 @@ struct AddressTablePriv
     {
         cachedAddressTable.clear();
 
-        CRITICAL_BLOCK(wallet->cs_KeyStore)
-        CRITICAL_BLOCK(wallet->cs_mapAddressBook)
+        CRITICAL_BLOCK(wallet->cs_wallet)
         {
             BOOST_FOREACH(const PAIRTYPE(CBitcoinAddress, std::string)& item, wallet->mapAddressBook)
             {
@@ -170,7 +169,7 @@ bool AddressTableModel::setData(const QModelIndex & index, const QVariant & valu
             // Double-check that we're not overwriting a receiving address
             if(rec->type == AddressTableEntry::Sending)
             {
-                CRITICAL_BLOCK(wallet->cs_mapAddressBook)
+                CRITICAL_BLOCK(wallet->cs_wallet)
                 {
                     // Remove old entry
                     wallet->DelAddressBookName(rec->address.toStdString());
@@ -255,7 +254,7 @@ QString AddressTableModel::addRow(const QString &type, const QString &label, con
             return QString();
         }
         // Check for duplicate addresses
-        CRITICAL_BLOCK(wallet->cs_mapAddressBook)
+        CRITICAL_BLOCK(wallet->cs_wallet)
         {
             if(wallet->mapAddressBook.count(strAddress))
             {
@@ -274,15 +273,20 @@ QString AddressTableModel::addRow(const QString &type, const QString &label, con
             editStatus = WALLET_UNLOCK_FAILURE;
             return QString();
         }
-
-        strAddress = CBitcoinAddress(wallet->GetOrReuseKeyFromPool()).ToString();
+        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)
+    CRITICAL_BLOCK(wallet->cs_wallet)
         wallet->SetAddressBookName(strAddress, strLabel);
     updateList();
     return QString::fromStdString(strAddress);
@@ -298,7 +302,7 @@ bool AddressTableModel::removeRows(int row, int count, const QModelIndex & paren
         // Also refuse to remove receiving addresses.
         return false;
     }
-    CRITICAL_BLOCK(wallet->cs_mapAddressBook)
+    CRITICAL_BLOCK(wallet->cs_wallet)
     {
         wallet->DelAddressBookName(rec->address.toStdString());
     }
@@ -315,7 +319,7 @@ void AddressTableModel::update()
  */
 QString AddressTableModel::labelForAddress(const QString &address) const
 {
-    CRITICAL_BLOCK(wallet->cs_mapAddressBook)
+    CRITICAL_BLOCK(wallet->cs_wallet)
     {
         CBitcoinAddress address_parsed(address.toStdString());
         std::map<CBitcoinAddress, std::string>::iterator mi = wallet->mapAddressBook.find(address_parsed);
index bc505c4..f4a8dad 100644 (file)
@@ -29,7 +29,8 @@ public:
         OK,
         INVALID_ADDRESS,
         DUPLICATE_ADDRESS,
-        WALLET_UNLOCK_FAILURE
+        WALLET_UNLOCK_FAILURE,
+        KEY_GENERATION_FAILURE
     };
 
     static const QString Send; /* Send addres */
index 5cf02ea..d307473 100644 (file)
@@ -61,7 +61,7 @@ bool ClientModel::inInitialBlockDownload() const
 
 int ClientModel::getTotalBlocksEstimate() const
 {
-    return GetTotalBlocksEstimate();
+    return GetMaxBlocksOfOtherNodes();
 }
 
 OptionsModel *ClientModel::getOptionsModel()
index 06e74db..b8e6fe4 100644 (file)
@@ -97,6 +97,11 @@ void EditAddressDialog::accept()
                 tr("Could not unlock wallet."),
                 QMessageBox::Ok, QMessageBox::Ok);
             return;
+        case AddressTableModel::KEY_GENERATION_FAILURE:
+            QMessageBox::critical(this, windowTitle(),
+                tr("New key generation failed."),
+                QMessageBox::Ok, QMessageBox::Ok);
+            return;
         }
 
         return;
index 612b5d8..6ca3ac8 100644 (file)
@@ -50,7 +50,7 @@ QString TransactionDesc::FormatTxStatus(const CWalletTx& wtx)
 QString TransactionDesc::toHTML(CWallet *wallet, CWalletTx &wtx)
 {
     QString strHTML;
-    CRITICAL_BLOCK(wallet->cs_mapAddressBook)
+    CRITICAL_BLOCK(wallet->cs_wallet)
     {
         strHTML.reserve(4000);
         strHTML += "<html><font face='verdana, arial, helvetica, sans-serif'>";
@@ -257,7 +257,7 @@ QString TransactionDesc::toHTML(CWallet *wallet, CWalletTx &wtx)
 
             strHTML += "<br><b>Inputs:</b>";
             strHTML += "<ul>";
-            CRITICAL_BLOCK(wallet->cs_mapWallet)
+            CRITICAL_BLOCK(wallet->cs_wallet)
             {
                 BOOST_FOREACH(const CTxIn& txin, wtx.vin)
                 {
index 353cd79..0e1733f 100644 (file)
@@ -69,7 +69,7 @@ struct TransactionTablePriv
         qDebug() << "refreshWallet";
 #endif
         cachedWallet.clear();
-        CRITICAL_BLOCK(wallet->cs_mapWallet)
+        CRITICAL_BLOCK(wallet->cs_wallet)
         {
             for(std::map<uint256, CWalletTx>::iterator it = wallet->mapWallet.begin(); it != wallet->mapWallet.end(); ++it)
             {
@@ -95,7 +95,7 @@ struct TransactionTablePriv
         QList<uint256> updated_sorted = updated;
         qSort(updated_sorted);
 
-        CRITICAL_BLOCK(wallet->cs_mapWallet)
+        CRITICAL_BLOCK(wallet->cs_wallet)
         {
             for(int update_idx = updated_sorted.size()-1; update_idx >= 0; --update_idx)
             {
@@ -171,7 +171,7 @@ struct TransactionTablePriv
             // simply re-use the cached status.
             if(rec->statusUpdateNeeded())
             {
-                CRITICAL_BLOCK(wallet->cs_mapWallet)
+                CRITICAL_BLOCK(wallet->cs_wallet)
                 {
                     std::map<uint256, CWalletTx>::iterator mi = wallet->mapWallet.find(rec->hash);
 
@@ -191,7 +191,7 @@ struct TransactionTablePriv
 
     QString describe(TransactionRecord *rec)
     {
-        CRITICAL_BLOCK(wallet->cs_mapWallet)
+        CRITICAL_BLOCK(wallet->cs_wallet)
         {
             std::map<uint256, CWalletTx>::iterator mi = wallet->mapWallet.find(rec->hash);
             if(mi != wallet->mapWallet.end())
@@ -229,7 +229,7 @@ void TransactionTableModel::update()
     QList<uint256> updated;
 
     // Check if there are changes to wallet map
-    TRY_CRITICAL_BLOCK(wallet->cs_mapWallet)
+    TRY_CRITICAL_BLOCK(wallet->cs_wallet)
     {
         if(!wallet->vWalletUpdated.empty())
         {
index dfededc..2f98966 100644 (file)
@@ -38,7 +38,7 @@ qint64 WalletModel::getUnconfirmedBalance() const
 int WalletModel::getNumTransactions() const
 {
     int numTransactions = 0;
-    CRITICAL_BLOCK(wallet->cs_mapWallet)
+    CRITICAL_BLOCK(wallet->cs_wallet)
     {
         numTransactions = wallet->mapWallet.size();
     }
@@ -117,7 +117,7 @@ WalletModel::SendCoinsReturn WalletModel::sendCoins(const QList<SendCoinsRecipie
     }
 
     CRITICAL_BLOCK(cs_main)
-    CRITICAL_BLOCK(wallet->cs_mapWallet)
+    CRITICAL_BLOCK(wallet->cs_wallet)
     {
         // Sendmany
         std::vector<std::pair<CScript, int64> > vecSend;
@@ -156,7 +156,7 @@ WalletModel::SendCoinsReturn WalletModel::sendCoins(const QList<SendCoinsRecipie
     foreach(const SendCoinsRecipient &rcp, recipients)
     {
         std::string strAddress = rcp.address.toStdString();
-        CRITICAL_BLOCK(wallet->cs_mapAddressBook)
+        CRITICAL_BLOCK(wallet->cs_wallet)
         {
             if (!wallet->mapAddressBook.count(strAddress))
                 wallet->SetAddressBookName(strAddress, rcp.label.toStdString());
@@ -231,7 +231,7 @@ bool WalletModel::setWalletLocked(bool locked, const std::string &passPhrase)
 bool WalletModel::changePassphrase(const std::string &oldPass, const std::string &newPass)
 {
     bool retval;
-    CRITICAL_BLOCK(wallet->cs_vMasterKey)
+    CRITICAL_BLOCK(wallet->cs_wallet)
     {
         wallet->Lock(); // Make sure wallet is locked before attempting pass change
         retval = wallet->ChangeWalletPassphrase(oldPass, newPass);
index 9c04e37..d78e470 100644 (file)
@@ -731,7 +731,7 @@ int64 CWallet::GetBalance() const
 int64 CWallet::GetUnconfirmedBalance() const
 {
     int64 nTotal = 0;
-    CRITICAL_BLOCK(cs_mapWallet)
+    CRITICAL_BLOCK(cs_wallet)
     {
         for (map<uint256, CWalletTx>::const_iterator it = mapWallet.begin(); it != mapWallet.end(); ++it)
         {