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