1 // Copyright (c) 2011-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_BITCOIN_H
6 #define BITCOIN_QT_BITCOIN_H
7 
8 #if defined(HAVE_CONFIG_H)
9 #include <config/bitcoin-config.h>
10 #endif
11 
12 #include <QApplication>
13 #include <assert.h>
14 #include <memory>
15 
16 #include <interfaces/node.h>
17 
18 class BitcoinGUI;
19 class ClientModel;
20 class NetworkStyle;
21 class OptionsModel;
22 class PaymentServer;
23 class PlatformStyle;
24 class SplashScreen;
25 class WalletController;
26 class WalletModel;
27 
28 
29 /** Class encapsulating Bitcoin Core startup and shutdown.
30  * Allows running startup and shutdown in a different thread from the UI thread.
31  */
32 class BitcoinCore: public QObject
33 {
34     Q_OBJECT
35 public:
36     explicit BitcoinCore(interfaces::Node& node);
37 
38 public Q_SLOTS:
39     void initialize();
40     void shutdown();
41 
42 Q_SIGNALS:
43     void initializeResult(bool success, interfaces::BlockAndHeaderTipInfo tip_info);
44     void shutdownResult();
45     void runawayException(const QString &message);
46 
47 private:
48     /// Pass fatal exception message to UI thread
49     void handleRunawayException(const std::exception *e);
50 
51     interfaces::Node& m_node;
52 };
53 
54 /** Main Bitcoin application object */
55 class BitcoinApplication: public QApplication
56 {
57     Q_OBJECT
58 public:
59     explicit BitcoinApplication();
60     ~BitcoinApplication();
61 
62 #ifdef ENABLE_WALLET
63     /// Create payment server
64     void createPaymentServer();
65 #endif
66     /// parameter interaction/setup based on rules
67     void parameterSetup();
68     /// Create options model
69     void createOptionsModel(bool resetSettings);
70     /// Initialize prune setting
71     void InitializePruneSetting(bool prune);
72     /// Create main window
73     void createWindow(const NetworkStyle *networkStyle);
74     /// Create splash screen
75     void createSplashScreen(const NetworkStyle *networkStyle);
76     /// Basic initialization, before starting initialization/shutdown thread. Return true on success.
77     bool baseInitialize();
78 
79     /// Request core initialization
80     void requestInitialize();
81     /// Request core shutdown
82     void requestShutdown();
83 
84     /// Get process return value
getReturnValue()85     int getReturnValue() const { return returnValue; }
86 
87     /// Get window identifier of QMainWindow (BitcoinGUI)
88     WId getMainWinId() const;
89 
90     /// Setup platform style
91     void setupPlatformStyle();
92 
node()93     interfaces::Node& node() const { assert(m_node); return *m_node; }
94     void setNode(interfaces::Node& node);
95 
96 public Q_SLOTS:
97     void initializeResult(bool success, interfaces::BlockAndHeaderTipInfo tip_info);
98     void shutdownResult();
99     /// Handle runaway exceptions. Shows a message box with the problem and quits the program.
100     void handleRunawayException(const QString &message);
101 
102 Q_SIGNALS:
103     void requestedInitialize();
104     void requestedShutdown();
105     void splashFinished();
106     void windowShown(BitcoinGUI* window);
107 
108 private:
109     QThread *coreThread;
110     OptionsModel *optionsModel;
111     ClientModel *clientModel;
112     BitcoinGUI *window;
113     QTimer *pollShutdownTimer;
114 #ifdef ENABLE_WALLET
115     PaymentServer* paymentServer{nullptr};
116     WalletController* m_wallet_controller{nullptr};
117 #endif
118     int returnValue;
119     const PlatformStyle *platformStyle;
120     std::unique_ptr<QWidget> shutdownWindow;
121     SplashScreen* m_splash = nullptr;
122     interfaces::Node* m_node = nullptr;
123 
124     void startThread();
125 };
126 
127 int GuiMain(int argc, char* argv[]);
128 
129 #endif // BITCOIN_QT_BITCOIN_H
130