/ src / noui.cpp
noui.cpp
  1  // Copyright (c) 2010 Satoshi Nakamoto
  2  // Copyright (c) 2009-2022 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/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  }