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