noui.cpp raw
1 // Copyright (c) 2010 Satoshi Nakamoto
2 // Copyright (c) 2009-2022 The Limenka 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/interface_ui.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
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 if (!fSecure) LogError("%s\n", message.original);
32 break;
33 case CClientUIInterface::MSG_WARNING:
34 strCaption = "Warning: ";
35 if (!fSecure) LogWarning("%s\n", message.original);
36 break;
37 case CClientUIInterface::MSG_INFORMATION:
38 strCaption = "Information: ";
39 if (!fSecure) LogInfo("%s\n", message.original);
40 break;
41 default:
42 strCaption = caption + ": "; // Use supplied caption (can be empty)
43 if (!fSecure) LogInfo("%s%s\n", strCaption, message.original);
44 }
45
46 tfm::format(std::cerr, "%s%s\n", strCaption, message.original);
47 return false;
48 }
49
50 bool noui_ThreadSafeQuestion(const bilingual_str& /* ignored interactive message */, const std::string& message, const std::string& caption, unsigned int style)
51 {
52 return noui_ThreadSafeMessageBox(Untranslated(message), caption, style);
53 }
54
55 void noui_InitMessage(const std::string& message)
56 {
57 LogPrintf("init message: %s\n", message);
58 }
59
60 void noui_connect()
61 {
62 noui_ThreadSafeMessageBoxConn = uiInterface.ThreadSafeMessageBox_connect(noui_ThreadSafeMessageBox);
63 noui_ThreadSafeQuestionConn = uiInterface.ThreadSafeQuestion_connect(noui_ThreadSafeQuestion);
64 noui_InitMessageConn = uiInterface.InitMessage_connect(noui_InitMessage);
65 }
66
67 bool noui_ThreadSafeMessageBoxRedirect(const bilingual_str& message, const std::string& caption, unsigned int style)
68 {
69 LogPrintf("%s: %s\n", caption, message.original);
70 return false;
71 }
72
73 bool noui_ThreadSafeQuestionRedirect(const bilingual_str& /* ignored interactive message */, const std::string& message, const std::string& caption, unsigned int style)
74 {
75 LogPrintf("%s: %s\n", caption, message);
76 return false;
77 }
78
79 void noui_InitMessageRedirect(const std::string& message)
80 {
81 LogPrintf("init message: %s\n", message);
82 }
83
84 void noui_test_redirect()
85 {
86 noui_ThreadSafeMessageBoxConn.disconnect();
87 noui_ThreadSafeQuestionConn.disconnect();
88 noui_InitMessageConn.disconnect();
89 noui_ThreadSafeMessageBoxConn = uiInterface.ThreadSafeMessageBox_connect(noui_ThreadSafeMessageBoxRedirect);
90 noui_ThreadSafeQuestionConn = uiInterface.ThreadSafeQuestion_connect(noui_ThreadSafeQuestionRedirect);
91 noui_InitMessageConn = uiInterface.InitMessage_connect(noui_InitMessageRedirect);
92 }
93
94 void noui_reconnect()
95 {
96 noui_ThreadSafeMessageBoxConn.disconnect();
97 noui_ThreadSafeQuestionConn.disconnect();
98 noui_InitMessageConn.disconnect();
99 noui_connect();
100 }
101