aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/protocol.cpp24
-rw-r--r--src/protocol.h4
-rw-r--r--src/qt/guiutil.cpp22
-rw-r--r--src/rpc/util.cpp17
4 files changed, 36 insertions, 31 deletions
diff --git a/src/protocol.cpp b/src/protocol.cpp
index 243111c449..737baff36b 100644
--- a/src/protocol.cpp
+++ b/src/protocol.cpp
@@ -194,3 +194,27 @@ const std::vector<std::string> &getAllNetMessageTypes()
{
return allNetMessageTypesVec;
}
+
+std::string serviceFlagToStr(const uint64_t mask, const int bit)
+{
+ switch (ServiceFlags(mask)) {
+ case NODE_NONE: abort(); // impossible
+ case NODE_NETWORK: return "NETWORK";
+ case NODE_GETUTXO: return "GETUTXO";
+ case NODE_BLOOM: return "BLOOM";
+ case NODE_WITNESS: return "WITNESS";
+ case NODE_NETWORK_LIMITED: return "NETWORK_LIMITED";
+ // Not using default, so we get warned when a case is missing
+ }
+
+ std::ostringstream stream;
+ stream.imbue(std::locale::classic());
+ stream << "UNKNOWN[";
+ if (bit < 8) {
+ stream << mask;
+ } else {
+ stream << "2^" << bit;
+ }
+ stream << "]";
+ return stream.str();
+}
diff --git a/src/protocol.h b/src/protocol.h
index 9527dce960..c12bec9bf3 100644
--- a/src/protocol.h
+++ b/src/protocol.h
@@ -257,7 +257,7 @@ const std::vector<std::string>& getAllNetMessageTypes();
/** nServices flags */
enum ServiceFlags : uint64_t {
- // NOTE: When adding here, be sure to update qt/guiutil.cpp's formatServicesStr too
+ // NOTE: When adding here, be sure to update serviceFlagToStr too
// Nothing
NODE_NONE = 0,
// NODE_NETWORK means that the node is capable of serving the complete block chain. It is currently
@@ -288,6 +288,8 @@ enum ServiceFlags : uint64_t {
// BIP process.
};
+std::string serviceFlagToStr(uint64_t mask, int bit);
+
/**
* Gets the set of service flags which are "desirable" for a given peer.
*
diff --git a/src/qt/guiutil.cpp b/src/qt/guiutil.cpp
index 4afec1b474..e78e400f07 100644
--- a/src/qt/guiutil.cpp
+++ b/src/qt/guiutil.cpp
@@ -751,33 +751,15 @@ QString formatDurationStr(int secs)
return strList.join(" ");
}
-QString serviceFlagToStr(const quint64 mask, const int bit)
-{
- switch (ServiceFlags(mask)) {
- case NODE_NONE: abort(); // impossible
- case NODE_NETWORK: return "NETWORK";
- case NODE_GETUTXO: return "GETUTXO";
- case NODE_BLOOM: return "BLOOM";
- case NODE_WITNESS: return "WITNESS";
- case NODE_NETWORK_LIMITED: return "NETWORK_LIMITED";
- // Not using default, so we get warned when a case is missing
- }
- if (bit < 8) {
- return QString("%1[%2]").arg("UNKNOWN").arg(mask);
- } else {
- return QString("%1[2^%2]").arg("UNKNOWN").arg(bit);
- }
-}
-
QString formatServicesStr(quint64 mask)
{
QStringList strList;
for (int i = 0; i < 64; i++) {
- uint64_t check = 1LL << i;
+ uint64_t check = 1ull << i;
if (mask & check)
{
- strList.append(serviceFlagToStr(check, i));
+ strList.append(QString::fromStdString(serviceFlagToStr(mask, i)));
}
}
diff --git a/src/rpc/util.cpp b/src/rpc/util.cpp
index 860fa198d5..0e13d8dfce 100644
--- a/src/rpc/util.cpp
+++ b/src/rpc/util.cpp
@@ -841,18 +841,15 @@ std::vector<CScript> EvalDescriptorStringOrObject(const UniValue& scanobject, Fl
UniValue GetServicesNames(ServiceFlags services)
{
+ const uint64_t services_n = services;
UniValue servicesNames(UniValue::VARR);
- if (services & NODE_NETWORK)
- servicesNames.push_back("NETWORK");
- if (services & NODE_GETUTXO)
- servicesNames.push_back("GETUTXO");
- if (services & NODE_BLOOM)
- servicesNames.push_back("BLOOM");
- if (services & NODE_WITNESS)
- servicesNames.push_back("WITNESS");
- if (services & NODE_NETWORK_LIMITED)
- servicesNames.push_back("NETWORK_LIMITED");
+ for (int i = 0; i < 64; ++i) {
+ const uint64_t mask = 1ull << i;
+ if (services_n & mask) {
+ servicesNames.push_back(serviceFlagToStr(mask, i));
+ }
+ }
return servicesNames;
}