/ src / node / warnings.cpp
warnings.cpp
 1  // Copyright (c) 2009-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 <bitcoin-build-config.h> // IWYU pragma: keep
 7  
 8  #include <node/warnings.h>
 9  
10  #include <common/system.h>
11  #include <node/interface_ui.h>
12  #include <sync.h>
13  #include <univalue.h>
14  #include <util/translation.h>
15  
16  #include <utility>
17  #include <vector>
18  
19  namespace node {
20  Warnings::Warnings()
21  {
22      // Pre-release build warning
23      if (!CLIENT_VERSION_IS_RELEASE) {
24          m_warnings.insert(
25              {Warning::PRE_RELEASE_TEST_BUILD,
26               _("This is a pre-release test build - use at your own risk - do not use for mining or merchant applications")});
27      }
28  }
29  bool Warnings::Set(warning_type id, bilingual_str message)
30  {
31      const auto& [_, inserted]{WITH_LOCK(m_mutex, return m_warnings.insert({id, std::move(message)}))};
32      if (inserted) uiInterface.NotifyAlertChanged();
33      return inserted;
34  }
35  
36  bool Warnings::Unset(warning_type id)
37  {
38      auto success{WITH_LOCK(m_mutex, return m_warnings.erase(id))};
39      if (success) uiInterface.NotifyAlertChanged();
40      return success;
41  }
42  
43  std::vector<bilingual_str> Warnings::GetMessages() const
44  {
45      LOCK(m_mutex);
46      std::vector<bilingual_str> messages;
47      messages.reserve(m_warnings.size());
48      for (const auto& [id, msg] : m_warnings) {
49          messages.push_back(msg);
50      }
51      return messages;
52  }
53  
54  UniValue GetWarningsForRpc(const Warnings& warnings, bool use_deprecated)
55  {
56      if (use_deprecated) {
57          const auto all_messages{warnings.GetMessages()};
58          return all_messages.empty() ? "" : all_messages.back().original;
59      }
60  
61      UniValue messages{UniValue::VARR};
62      for (auto&& message : warnings.GetMessages()) {
63          messages.push_back(std::move(message.original));
64      }
65      return messages;
66  }
67  } // namespace node