1 // Copyright (c) 2019-2020 The Bitcoin Core developers 2 // Distributed under the MIT software license, see the accompanying 3 // file COPYING or http://www.opensource.org/licenses/mit-license.php. 4 5 #ifndef BITCOIN_QT_WALLETCONTROLLER_H 6 #define BITCOIN_QT_WALLETCONTROLLER_H 7 8 #include <qt/sendcoinsrecipient.h> 9 #include <support/allocators/secure.h> 10 #include <sync.h> 11 #include <util/translation.h> 12 13 #include <map> 14 #include <memory> 15 #include <string> 16 #include <vector> 17 18 #include <QMessageBox> 19 #include <QMutex> 20 #include <QProgressDialog> 21 #include <QThread> 22 #include <QTimer> 23 #include <QString> 24 25 class ClientModel; 26 class OptionsModel; 27 class PlatformStyle; 28 class WalletModel; 29 30 namespace interfaces { 31 class Handler; 32 class Node; 33 class Wallet; 34 } // namespace interfaces 35 36 class AskPassphraseDialog; 37 class CreateWalletActivity; 38 class CreateWalletDialog; 39 class OpenWalletActivity; 40 class WalletControllerActivity; 41 42 /** 43 * Controller between interfaces::Node, WalletModel instances and the GUI. 44 */ 45 class WalletController : public QObject 46 { 47 Q_OBJECT 48 49 void removeAndDeleteWallet(WalletModel* wallet_model); 50 51 public: 52 WalletController(ClientModel& client_model, const PlatformStyle* platform_style, QObject* parent); 53 ~WalletController(); 54 55 //! Returns wallet models currently open. 56 std::vector<WalletModel*> getOpenWallets() const; 57 58 WalletModel* getOrCreateWallet(std::unique_ptr<interfaces::Wallet> wallet); 59 60 //! Returns all wallet names in the wallet dir mapped to whether the wallet 61 //! is loaded. 62 std::map<std::string, bool> listWalletDir() const; 63 64 void closeWallet(WalletModel* wallet_model, QWidget* parent = nullptr); 65 void closeAllWallets(QWidget* parent = nullptr); 66 67 Q_SIGNALS: 68 void walletAdded(WalletModel* wallet_model); 69 void walletRemoved(WalletModel* wallet_model); 70 71 void coinsSent(WalletModel* wallet_model, SendCoinsRecipient recipient, QByteArray transaction); 72 73 private: 74 QThread* const m_activity_thread; 75 QObject* const m_activity_worker; 76 ClientModel& m_client_model; 77 interfaces::Node& m_node; 78 const PlatformStyle* const m_platform_style; 79 OptionsModel* const m_options_model; 80 mutable QMutex m_mutex; 81 std::vector<WalletModel*> m_wallets; 82 std::unique_ptr<interfaces::Handler> m_handler_load_wallet; 83 84 friend class WalletControllerActivity; 85 }; 86 87 class WalletControllerActivity : public QObject 88 { 89 Q_OBJECT 90 91 public: 92 WalletControllerActivity(WalletController* wallet_controller, QWidget* parent_widget); 93 virtual ~WalletControllerActivity(); 94 95 Q_SIGNALS: 96 void finished(); 97 98 protected: node()99 interfaces::Node& node() const { return m_wallet_controller->m_node; } worker()100 QObject* worker() const { return m_wallet_controller->m_activity_worker; } 101 102 void showProgressDialog(const QString& label_text); 103 void destroyProgressDialog(); 104 105 WalletController* const m_wallet_controller; 106 QWidget* const m_parent_widget; 107 QProgressDialog* m_progress_dialog{nullptr}; 108 WalletModel* m_wallet_model{nullptr}; 109 bilingual_str m_error_message; 110 std::vector<bilingual_str> m_warning_message; 111 }; 112 113 114 class CreateWalletActivity : public WalletControllerActivity 115 { 116 Q_OBJECT 117 118 public: 119 CreateWalletActivity(WalletController* wallet_controller, QWidget* parent_widget); 120 virtual ~CreateWalletActivity(); 121 122 void create(); 123 124 Q_SIGNALS: 125 void created(WalletModel* wallet_model); 126 127 private: 128 void askPassphrase(); 129 void createWallet(); 130 void finish(); 131 132 SecureString m_passphrase; 133 CreateWalletDialog* m_create_wallet_dialog{nullptr}; 134 AskPassphraseDialog* m_passphrase_dialog{nullptr}; 135 }; 136 137 class OpenWalletActivity : public WalletControllerActivity 138 { 139 Q_OBJECT 140 141 public: 142 OpenWalletActivity(WalletController* wallet_controller, QWidget* parent_widget); 143 144 void open(const std::string& path); 145 146 Q_SIGNALS: 147 void opened(WalletModel* wallet_model); 148 149 private: 150 void finish(); 151 }; 152 153 #endif // BITCOIN_QT_WALLETCONTROLLER_H 154