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