1 // Copyright (c) 2010 Satoshi Nakamoto
2 // Copyright (c) 2009-2020 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 <logging.h>
9 #include <node/ui_interface.h>
10 #include <util/translation.h>
11
12 #include <string>
13
14 #include <boost/signals2/connection.hpp>
15 #include <boost/signals2/signal.hpp>
16
17 /** Store connections so we can disconnect them when suppressing output */
18 boost::signals2::connection noui_ThreadSafeMessageBoxConn;
19 boost::signals2::connection noui_ThreadSafeQuestionConn;
20 boost::signals2::connection noui_InitMessageConn;
21
noui_ThreadSafeMessageBox(const bilingual_str & message,const std::string & caption,unsigned int style)22 bool noui_ThreadSafeMessageBox(const bilingual_str& message, const std::string& caption, unsigned int style)
23 {
24 bool fSecure = style & CClientUIInterface::SECURE;
25 style &= ~CClientUIInterface::SECURE;
26
27 std::string strCaption;
28 switch (style) {
29 case CClientUIInterface::MSG_ERROR:
30 strCaption = "Error: ";
31 break;
32 case CClientUIInterface::MSG_WARNING:
33 strCaption = "Warning: ";
34 break;
35 case CClientUIInterface::MSG_INFORMATION:
36 strCaption = "Information: ";
37 break;
38 default:
39 strCaption = caption + ": "; // Use supplied caption (can be empty)
40 }
41
42 if (!fSecure) {
43 LogPrintf("%s%s\n", strCaption, message.original);
44 }
45 tfm::format(std::cerr, "%s%s\n", strCaption, message.original);
46 return false;
47 }
48
noui_ThreadSafeQuestion(const bilingual_str &,const std::string & message,const std::string & caption,unsigned int style)49 bool noui_ThreadSafeQuestion(const bilingual_str& /* ignored interactive message */, const std::string& message, const std::string& caption, unsigned int style)
50 {
51 return noui_ThreadSafeMessageBox(Untranslated(message), caption, style);
52 }
53
noui_InitMessage(const std::string & message)54 void noui_InitMessage(const std::string& message)
55 {
56 LogPrintf("init message: %s\n", message);
57 }
58
noui_connect()59 void noui_connect()
60 {
61 noui_ThreadSafeMessageBoxConn = uiInterface.ThreadSafeMessageBox_connect(noui_ThreadSafeMessageBox);
62 noui_ThreadSafeQuestionConn = uiInterface.ThreadSafeQuestion_connect(noui_ThreadSafeQuestion);
63 noui_InitMessageConn = uiInterface.InitMessage_connect(noui_InitMessage);
64 }
65
noui_ThreadSafeMessageBoxRedirect(const bilingual_str & message,const std::string & caption,unsigned int style)66 bool noui_ThreadSafeMessageBoxRedirect(const bilingual_str& message, const std::string& caption, unsigned int style)
67 {
68 LogPrintf("%s: %s\n", caption, message.original);
69 return false;
70 }
71
noui_ThreadSafeQuestionRedirect(const bilingual_str &,const std::string & message,const std::string & caption,unsigned int style)72 bool noui_ThreadSafeQuestionRedirect(const bilingual_str& /* ignored interactive message */, const std::string& message, const std::string& caption, unsigned int style)
73 {
74 LogPrintf("%s: %s\n", caption, message);
75 return false;
76 }
77
noui_InitMessageRedirect(const std::string & message)78 void noui_InitMessageRedirect(const std::string& message)
79 {
80 LogPrintf("init message: %s\n", message);
81 }
82
noui_test_redirect()83 void noui_test_redirect()
84 {
85 noui_ThreadSafeMessageBoxConn.disconnect();
86 noui_ThreadSafeQuestionConn.disconnect();
87 noui_InitMessageConn.disconnect();
88 noui_ThreadSafeMessageBoxConn = uiInterface.ThreadSafeMessageBox_connect(noui_ThreadSafeMessageBoxRedirect);
89 noui_ThreadSafeQuestionConn = uiInterface.ThreadSafeQuestion_connect(noui_ThreadSafeQuestionRedirect);
90 noui_InitMessageConn = uiInterface.InitMessage_connect(noui_InitMessageRedirect);
91 }
92
noui_reconnect()93 void noui_reconnect()
94 {
95 noui_ThreadSafeMessageBoxConn.disconnect();
96 noui_ThreadSafeQuestionConn.disconnect();
97 noui_InitMessageConn.disconnect();
98 noui_connect();
99 }
100