noui.cpp raw
1 // Copyright (c) 2010 Satoshi Nakamoto
2 // Copyright (c) 2009-present The Bitcoin Core developers
3 // Distributed under the MIT software license, see the accompanying
4 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
5
6 #include <noui.h>
7
8 #include <node/interface_ui.h>
9 #include <util/btcsignals.h>
10 #include <util/log.h>
11 #include <util/translation.h>
12
13 #include <string>
14
15 /** Store connections so we can disconnect them when suppressing output */
16 btcsignals::connection noui_ThreadSafeMessageBoxConn;
17 btcsignals::connection noui_ThreadSafeQuestionConn;
18 btcsignals::connection noui_InitMessageConn;
19
20 void noui_ThreadSafeMessageBox(const bilingual_str& message, unsigned int style)
21 {
22 bool fSecure = style & CClientUIInterface::SECURE;
23 style &= ~CClientUIInterface::SECURE;
24
25 std::string strCaption;
26 switch (style) {
27 case CClientUIInterface::MSG_ERROR:
28 strCaption = "Error: ";
29 if (!fSecure) LogError("%s\n", message.original);
30 break;
31 case CClientUIInterface::MSG_WARNING:
32 strCaption = "Warning: ";
33 if (!fSecure) LogWarning("%s\n", message.original);
34 break;
35 case CClientUIInterface::MSG_INFORMATION:
36 strCaption = "Information: ";
37 if (!fSecure) LogInfo("%s\n", message.original);
38 break;
39 default:
40 if (!fSecure) LogInfo("%s%s\n", strCaption, message.original);
41 }
42
43 tfm::format(std::cerr, "%s%s\n", strCaption, message.original);
44 }
45
46 bool noui_ThreadSafeQuestion(const bilingual_str& /* ignored interactive message */, const std::string& message, unsigned int style)
47 {
48 noui_ThreadSafeMessageBox(Untranslated(message), style);
49 return false; // Answer the question with false in the noui context
50 }
51
52 void noui_InitMessage(const std::string& message)
53 {
54 LogInfo("init message: %s", message);
55 }
56
57 void noui_connect()
58 {
59 noui_ThreadSafeMessageBoxConn = uiInterface.ThreadSafeMessageBox.connect(noui_ThreadSafeMessageBox);
60 noui_ThreadSafeQuestionConn = uiInterface.ThreadSafeQuestion.connect(noui_ThreadSafeQuestion);
61 noui_InitMessageConn = uiInterface.InitMessage.connect(noui_InitMessage);
62 }
63
64 void noui_ThreadSafeMessageBoxRedirect(const bilingual_str& message, unsigned int style)
65 {
66 LogInfo("%s", message.original);
67 }
68
69 bool noui_ThreadSafeQuestionRedirect(const bilingual_str& /* ignored interactive message */, const std::string& message, unsigned int style)
70 {
71 LogInfo("%s", message);
72 return false;
73 }
74
75 void noui_InitMessageRedirect(const std::string& message)
76 {
77 LogInfo("init message: %s", message);
78 }
79
80 void noui_test_redirect()
81 {
82 noui_ThreadSafeMessageBoxConn.disconnect();
83 noui_ThreadSafeQuestionConn.disconnect();
84 noui_InitMessageConn.disconnect();
85 noui_ThreadSafeMessageBoxConn = uiInterface.ThreadSafeMessageBox.connect(noui_ThreadSafeMessageBoxRedirect);
86 noui_ThreadSafeQuestionConn = uiInterface.ThreadSafeQuestion.connect(noui_ThreadSafeQuestionRedirect);
87 noui_InitMessageConn = uiInterface.InitMessage.connect(noui_InitMessageRedirect);
88 }
89
90 void noui_reconnect()
91 {
92 noui_ThreadSafeMessageBoxConn.disconnect();
93 noui_ThreadSafeQuestionConn.disconnect();
94 noui_InitMessageConn.disconnect();
95 noui_connect();
96 }
97