diff --git a/src/protocol.h b/src/protocol.h --- a/src/protocol.h +++ b/src/protocol.h @@ -314,8 +314,7 @@ * 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 @@ -359,6 +358,8 @@ NODE_AVALANCHE = (1 << 24), }; +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/protocol.cpp b/src/protocol.cpp --- a/src/protocol.cpp +++ b/src/protocol.cpp @@ -254,3 +254,34 @@ const std::vector &getAllNetMessageTypes() { return allNetMessageTypesVec; } + +std::string serviceFlagToStr(const uint64_t mask, const int bit) { + switch (ServiceFlags(mask)) { + case NODE_NONE: + // impossible + abort(); + case NODE_NETWORK: + return "NETWORK"; + case NODE_GETUTXO: + return "GETUTXO"; + case NODE_BLOOM: + return "BLOOM"; + case NODE_XTHIN: + return "XTHIN"; + case NODE_NETWORK_LIMITED: + return "NETWORK_LIMITED"; + case NODE_AVALANCHE: + return "AVALANCHE"; + default: + 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/qt/guiutil.cpp b/src/qt/guiutil.cpp --- a/src/qt/guiutil.cpp +++ b/src/qt/guiutil.cpp @@ -751,30 +751,6 @@ return strList.join(" "); } -QString serviceFlagToStr(const quint64 mask, const int bit) { - switch (ServiceFlags(mask)) { - case NODE_NONE: - // impossible - abort(); - case NODE_NETWORK: - return "NETWORK"; - case NODE_GETUTXO: - return "GETUTXO"; - case NODE_BLOOM: - return "BLOOM"; - case NODE_XTHIN: - return "XTHIN"; - case NODE_NETWORK_LIMITED: - return "NETWORK_LIMITED"; - default: - 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; @@ -785,7 +761,7 @@ break; } if (mask & check) { - strList.append(serviceFlagToStr(check, i)); + strList.append(QString::fromStdString(serviceFlagToStr(check, i))); } } diff --git a/src/rpc/util.cpp b/src/rpc/util.cpp --- a/src/rpc/util.cpp +++ b/src/rpc/util.cpp @@ -866,25 +866,14 @@ } 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_XTHIN) { - servicesNames.push_back("XTHIN"); - } - if (services & NODE_NETWORK_LIMITED) { - servicesNames.push_back("NETWORK_LIMITED"); - } - if (services & NODE_AVALANCHE) { - servicesNames.push_back("AVALANCHE"); + 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;