diff options
-rw-r--r-- | src/protocol.cpp | 24 | ||||
-rw-r--r-- | src/protocol.h | 4 | ||||
-rw-r--r-- | src/qt/guiutil.cpp | 22 | ||||
-rw-r--r-- | src/rpc/util.cpp | 17 |
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; } |