Build identification strings
[novacoin.git] / src / qt / clientmodel.cpp
index 10cafaf..284bee0 100644 (file)
 #include "clientmodel.h"
-#include "main.h"
 #include "guiconstants.h"
 #include "optionsmodel.h"
 #include "addresstablemodel.h"
 #include "transactiontablemodel.h"
 
-#include <QTimer>
+#include "headers.h"
 
-ClientModel::ClientModel(QObject *parent) :
-    QObject(parent), optionsModel(0), addressTableModel(0),
-    transactionTableModel(0)
+#include <QDateTime>
+
+ClientModel::ClientModel(OptionsModel *optionsModel, QObject *parent) :
+    QObject(parent), optionsModel(optionsModel),
+    cachedNumConnections(0), cachedNumBlocks(0)
 {
-    // Until signal notifications is built into the bitcoin core,
-    //  simply update everything after polling using a timer.
-    QTimer *timer = new QTimer(this);
-    connect(timer, SIGNAL(timeout()), this, SLOT(update()));
-    timer->start(MODEL_UPDATE_DELAY);
-
-    optionsModel = new OptionsModel(this);
-    addressTableModel = new AddressTableModel(this);
-    transactionTableModel = new TransactionTableModel(this);
+    numBlocksAtStartup = -1;
 }
 
-qint64 ClientModel::getBalance()
+int ClientModel::getNumConnections() const
 {
-    return GetBalance();
+    return vNodes.size();
 }
 
-QString ClientModel::getAddress()
+int ClientModel::getNumBlocks() const
 {
-    std::vector<unsigned char> vchPubKey;
-    if (CWalletDB("r").ReadDefaultKey(vchPubKey))
-    {
-        return QString::fromStdString(PubKeyToAddress(vchPubKey));
-    }
-    else
-    {
-        return QString();
-    }
+    return nBestHeight;
 }
 
-int ClientModel::getNumConnections()
+int ClientModel::getNumBlocksAtStartup()
 {
-    return vNodes.size();
+    if (numBlocksAtStartup == -1) numBlocksAtStartup = getNumBlocks();
+    return numBlocksAtStartup;
 }
 
-int ClientModel::getNumBlocks()
+QDateTime ClientModel::getLastBlockDate() const
 {
-    return nBestHeight;
+    return QDateTime::fromTime_t(pindexBest->GetBlockTime());
 }
 
-int ClientModel::getNumTransactions()
+void ClientModel::update()
 {
-    int numTransactions = 0;
-    CRITICAL_BLOCK(cs_mapWallet)
+    int newNumConnections = getNumConnections();
+    int newNumBlocks = getNumBlocks();
+    QString newStatusBar = getStatusBarWarnings();
+
+    if(cachedNumConnections != newNumConnections)
+        emit numConnectionsChanged(newNumConnections);
+    if(cachedNumBlocks != newNumBlocks || cachedStatusBar != newStatusBar)
     {
-        numTransactions = mapWallet.size();
+        // Simply emit a numBlocksChanged for now in case the status message changes,
+        // so that the view updates the status bar.
+        // TODO: It should send a notification.
+        //    (However, this might generate looped notifications and needs to be thought through and tested carefully)
+        //    error(tr("Network Alert"), newStatusBar);
+        emit numBlocksChanged(newNumBlocks);
     }
-    return numTransactions;
+
+    cachedNumConnections = newNumConnections;
+    cachedNumBlocks = newNumBlocks;
+    cachedStatusBar = newStatusBar;
 }
 
-void ClientModel::update()
+bool ClientModel::isTestNet() const
 {
-    // Plainly emit all signals for now. To be more efficient this should check
-    //   whether the values actually changed first.
-    emit balanceChanged(getBalance());
-    emit addressChanged(getAddress());
-    emit numConnectionsChanged(getNumConnections());
-    emit numBlocksChanged(getNumBlocks());
-    emit numTransactionsChanged(getNumTransactions());
+    return fTestNet;
 }
 
-void ClientModel::setAddress(const QString &defaultAddress)
+bool ClientModel::inInitialBlockDownload() const
 {
-    uint160 hash160;
-    std::string strAddress = defaultAddress.toStdString();
-    if (!AddressToHash160(strAddress, hash160))
-        return;
-    if (!mapPubKeys.count(hash160))
-        return;
-    CWalletDB().WriteDefaultKey(mapPubKeys[hash160]);
+    return IsInitialBlockDownload();
 }
 
-ClientModel::StatusCode ClientModel::sendCoins(const QString &payTo, qint64 payAmount)
+int ClientModel::getNumBlocksOfPeers() const
 {
-    uint160 hash160 = 0;
-    bool valid = false;
-
-    if(!AddressToHash160(payTo.toUtf8().constData(), hash160))
-    {
-        return InvalidAddress;
-    }
-
-    if(payAmount <= 0)
-    {
-        return InvalidAmount;
-    }
-
-    if(payAmount > getBalance())
-    {
-        return AmountExceedsBalance;
-    }
-
-    if((payAmount + nTransactionFee) > getBalance())
-    {
-        return AmountWithFeeExceedsBalance;
-    }
-
-    CRITICAL_BLOCK(cs_main)
-    {
-        // Send to bitcoin address
-        CWalletTx wtx;
-        CScript scriptPubKey;
-        scriptPubKey << OP_DUP << OP_HASH160 << hash160 << OP_EQUALVERIFY << OP_CHECKSIG;
-
-        std::string strError = SendMoney(scriptPubKey, payAmount, wtx, true);
-        if (strError == "")
-        {
-            return OK;
-        }
-        else if (strError == "ABORTED")
-        {
-            return Aborted;
-        }
-        else
-        {
-            emit error(tr("Sending..."), QString::fromStdString(strError));
-            return MiscError;
-        }
-    }
-    // Add addresses that we've sent to to the address book
-    std::string strAddress = payTo.toStdString();
-    CRITICAL_BLOCK(cs_mapAddressBook)
-        if (!mapAddressBook.count(strAddress))
-            SetAddressBookName(strAddress, "");
+    return GetNumBlocksOfPeers();
+}
 
-    return OK;
+QString ClientModel::getStatusBarWarnings() const
+{
+    return QString::fromStdString(GetWarnings("statusbar"));
 }
 
 OptionsModel *ClientModel::getOptionsModel()
@@ -143,12 +84,12 @@ OptionsModel *ClientModel::getOptionsModel()
     return optionsModel;
 }
 
-AddressTableModel *ClientModel::getAddressTableModel()
+QString ClientModel::formatFullVersion() const
 {
-    return addressTableModel;
+    return QString::fromStdString(FormatFullVersion());
 }
 
-TransactionTableModel *ClientModel::getTransactionTableModel()
+QString ClientModel::formatBuildDate() const
 {
-    return transactionTableModel;
+    return QString::fromStdString(CLIENT_DATE);
 }