Use standard C99 (and Qt) types for 64-bit integers
[novacoin.git] / src / qt / walletmodel.h
1 #ifndef WALLETMODEL_H
2 #define WALLETMODEL_H
3
4 #include <QtGlobal>
5 #include <QObject>
6
7 #include "util.h"
8
9 class OptionsModel;
10 class AddressTableModel;
11 class TransactionTableModel;
12 class CWallet;
13
14 struct SendCoinsRecipient
15 {
16     QString address;
17     QString label;
18     qint64 amount;
19 };
20
21 /** Interface to Bitcoin wallet from Qt view code. */
22 class WalletModel : public QObject
23 {
24     Q_OBJECT
25 public:
26     explicit WalletModel(CWallet *wallet, OptionsModel *optionsModel, QObject *parent = 0);
27
28     enum StatusCode // Returned by sendCoins
29     {
30         OK,
31         InvalidAmount,
32         InvalidAddress,
33         AmountExceedsBalance,
34         AmountWithFeeExceedsBalance,
35         DuplicateAddress,
36         TransactionCreationFailed, // Error returned when wallet is still locked
37         TransactionCommitFailed,
38         Aborted,
39         MiscError
40     };
41
42     enum EncryptionStatus
43     {
44         Unencrypted,  // !wallet->IsCrypted()
45         Locked,       // wallet->IsCrypted() && wallet->IsLocked()
46         Unlocked      // wallet->IsCrypted() && !wallet->IsLocked()
47     };
48
49     OptionsModel *getOptionsModel();
50     AddressTableModel *getAddressTableModel();
51     TransactionTableModel *getTransactionTableModel();
52
53     qint64 getBalance() const;
54     qint64 getUnconfirmedBalance() const;
55     int getNumTransactions() const;
56     EncryptionStatus getEncryptionStatus() const;
57
58     // Check address for validity
59     bool validateAddress(const QString &address);
60
61     // Return status record for SendCoins, contains error id + information
62     struct SendCoinsReturn
63     {
64         SendCoinsReturn(StatusCode status,
65                          qint64 fee=0,
66                          QString hex=QString()):
67             status(status), fee(fee), hex(hex) {}
68         StatusCode status;
69         qint64 fee; // is used in case status is "AmountWithFeeExceedsBalance"
70         QString hex; // is filled with the transaction hash if status is "OK"
71     };
72
73     // Send coins to a list of recipients
74     SendCoinsReturn sendCoins(const QList<SendCoinsRecipient> &recipients);
75
76     // Wallet encryption
77     bool setWalletEncrypted(bool encrypted, const SecureString &passphrase);
78     // Passphrase only needed when unlocking
79     bool setWalletLocked(bool locked, const SecureString &passPhrase=SecureString());
80     bool changePassphrase(const SecureString &oldPass, const SecureString &newPass);
81
82     // RAI object for unlocking wallet, returned by requestUnlock()
83     class UnlockContext
84     {
85     public:
86         UnlockContext(WalletModel *wallet, bool valid, bool relock);
87         ~UnlockContext();
88
89         bool isValid() const { return valid; }
90
91         // Copy operator and constructor transfer the context
92         UnlockContext(const UnlockContext& obj) { CopyFrom(obj); }
93         UnlockContext& operator=(const UnlockContext& rhs) { CopyFrom(rhs); return *this; }
94     private:
95         WalletModel *wallet;
96         bool valid;
97         mutable bool relock; // mutable, as it can be set to false by copying
98
99         void CopyFrom(const UnlockContext& rhs);
100     };
101
102     UnlockContext requestUnlock();
103
104 private:
105     CWallet *wallet;
106
107     // Wallet has an options model for wallet-specific options
108     // (transaction fee, for example)
109     OptionsModel *optionsModel;
110
111     AddressTableModel *addressTableModel;
112     TransactionTableModel *transactionTableModel;
113
114     // Cache some values to be able to detect changes
115     qint64 cachedBalance;
116     qint64 cachedUnconfirmedBalance;
117     qint64 cachedNumTransactions;
118     EncryptionStatus cachedEncryptionStatus;
119
120 signals:
121     // Signal that balance in wallet changed
122     void balanceChanged(qint64 balance, qint64 unconfirmedBalance);
123
124     // Number of transactions in wallet changed
125     void numTransactionsChanged(int count);
126
127     // Encryption status of wallet changed
128     void encryptionStatusChanged(int status);
129
130     // Signal emitted when wallet needs to be unlocked
131     // It is valid behaviour for listeners to keep the wallet locked after this signal;
132     // this means that the unlocking failed or was cancelled.
133     void requireUnlock();
134
135     // Asynchronous error notification
136     void error(const QString &title, const QString &message);
137
138 public slots:
139
140 private slots:
141     void update();
142 };
143
144
145 #endif // WALLETMODEL_H