X-Git-Url: https://git.novaco.in/?a=blobdiff_plain;f=src%2Fqt%2Fwalletmodel.h;h=a129808f6168b2c6f2c528b800c610bed00785d9;hb=e73b792b1af9d9d747bac81a27d16020ed393905;hp=c989e7fbbee8ceda57143ee8ddd52c2e82f1c251;hpb=ee014e5b10f5f65820ff056311051ff49813b294;p=novacoin.git diff --git a/src/qt/walletmodel.h b/src/qt/walletmodel.h index c989e7f..a129808 100644 --- a/src/qt/walletmodel.h +++ b/src/qt/walletmodel.h @@ -3,6 +3,8 @@ #include +#include "util.h" + class OptionsModel; class AddressTableModel; class TransactionTableModel; @@ -15,14 +17,14 @@ struct SendCoinsRecipient qint64 amount; }; -// Interface to a Bitcoin wallet +/** Interface to Bitcoin wallet from Qt view code. */ class WalletModel : public QObject { Q_OBJECT public: explicit WalletModel(CWallet *wallet, OptionsModel *optionsModel, QObject *parent = 0); - enum StatusCode + enum StatusCode // Returned by sendCoins { OK, InvalidAmount, @@ -30,10 +32,16 @@ public: AmountExceedsBalance, AmountWithFeeExceedsBalance, DuplicateAddress, - TransactionCreationFailed, + TransactionCreationFailed, // Error returned when wallet is still locked TransactionCommitFailed, - Aborted, - MiscError + Aborted + }; + + enum EncryptionStatus + { + Unencrypted, // !wallet->IsCrypted() + Locked, // wallet->IsCrypted() && wallet->IsLocked() + Unlocked // wallet->IsCrypted() && !wallet->IsLocked() }; OptionsModel *getOptionsModel(); @@ -43,13 +51,12 @@ public: qint64 getBalance() const; qint64 getUnconfirmedBalance() const; int getNumTransactions() const; + EncryptionStatus getEncryptionStatus() const; // Check address for validity bool validateAddress(const QString &address); - // Return status record for SendCoins - // fee is used in case status is "AmountWithFeeExceedsBalance" - // hex is filled with the transaction hash if status is "OK" + // Return status record for SendCoins, contains error id + information struct SendCoinsReturn { SendCoinsReturn(StatusCode status, @@ -57,12 +64,41 @@ public: QString hex=QString()): status(status), fee(fee), hex(hex) {} StatusCode status; - qint64 fee; - QString hex; + qint64 fee; // is used in case status is "AmountWithFeeExceedsBalance" + QString hex; // is filled with the transaction hash if status is "OK" }; - // Send coins to list of recipients + // Send coins to a list of recipients SendCoinsReturn sendCoins(const QList &recipients); + + // Wallet encryption + bool setWalletEncrypted(bool encrypted, const SecureString &passphrase); + // Passphrase only needed when unlocking + bool setWalletLocked(bool locked, const SecureString &passPhrase=SecureString()); + bool changePassphrase(const SecureString &oldPass, const SecureString &newPass); + + // RAI object for unlocking wallet, returned by requestUnlock() + class UnlockContext + { + public: + UnlockContext(WalletModel *wallet, bool valid, bool relock); + ~UnlockContext(); + + bool isValid() const { return valid; } + + // Copy operator and constructor transfer the context + UnlockContext(const UnlockContext& obj) { CopyFrom(obj); } + UnlockContext& operator=(const UnlockContext& rhs) { CopyFrom(rhs); return *this; } + private: + WalletModel *wallet; + bool valid; + mutable bool relock; // mutable, as it can be set to false by copying + + void CopyFrom(const UnlockContext& rhs); + }; + + UnlockContext requestUnlock(); + private: CWallet *wallet; @@ -73,14 +109,27 @@ private: AddressTableModel *addressTableModel; TransactionTableModel *transactionTableModel; + // Cache some values to be able to detect changes qint64 cachedBalance; qint64 cachedUnconfirmedBalance; qint64 cachedNumTransactions; + EncryptionStatus cachedEncryptionStatus; signals: + // Signal that balance in wallet changed void balanceChanged(qint64 balance, qint64 unconfirmedBalance); + + // Number of transactions in wallet changed void numTransactionsChanged(int count); + // Encryption status of wallet changed + void encryptionStatusChanged(int status); + + // Signal emitted when wallet needs to be unlocked + // It is valid behaviour for listeners to keep the wallet locked after this signal; + // this means that the unlocking failed or was cancelled. + void requireUnlock(); + // Asynchronous error notification void error(const QString &title, const QString &message);