Consolidate service flag bit-to-name conversion to a shared serviceFlagToStr function

Side effect: this results in the RPC showing unknown service bits as "UNKNOWN[n]" like the GUI.

Note that there is no common mask-to-vector<string> function because both GUI and RPC would need to iterate through it to convert to their desired target formats.
This commit is contained in:
Luke Dashjr 2020-02-17 01:53:13 +00:00
parent cea91a1e40
commit c31bc5bcfd
4 changed files with 35 additions and 30 deletions

View File

@ -199,3 +199,27 @@ const std::vector<std::string> &getAllNetMessageTypes()
{ {
return allNetMessageTypesVec; 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();
}

View File

@ -237,7 +237,7 @@ const std::vector<std::string> &getAllNetMessageTypes();
/** nServices flags */ /** nServices flags */
enum ServiceFlags : uint64_t { 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 // Nothing
NODE_NONE = 0, NODE_NONE = 0,
// NODE_NETWORK means that the node is capable of serving the complete block chain. It is currently // NODE_NETWORK means that the node is capable of serving the complete block chain. It is currently
@ -268,6 +268,8 @@ enum ServiceFlags : uint64_t {
// BIP process. // BIP process.
}; };
std::string serviceFlagToStr(uint64_t mask, int bit);
/** /**
* Gets the set of service flags which are "desirable" for a given peer. * Gets the set of service flags which are "desirable" for a given peer.
* *

View File

@ -737,24 +737,6 @@ QString formatDurationStr(int secs)
return strList.join(" "); 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) QString formatServicesStr(quint64 mask)
{ {
QStringList strList; QStringList strList;
@ -763,7 +745,7 @@ QString formatServicesStr(quint64 mask)
uint64_t check = 1ull << i; uint64_t check = 1ull << i;
if (mask & check) if (mask & check)
{ {
strList.append(serviceFlagToStr(check, i)); strList.append(QString::fromStdString(serviceFlagToStr(mask, i)));
} }
} }

View File

@ -736,18 +736,15 @@ std::vector<CScript> EvalDescriptorStringOrObject(const UniValue& scanobject, Fl
UniValue GetServicesNames(ServiceFlags services) UniValue GetServicesNames(ServiceFlags services)
{ {
const uint64_t services_n = services;
UniValue servicesNames(UniValue::VARR); UniValue servicesNames(UniValue::VARR);
if (services & NODE_NETWORK) for (int i = 0; i < 64; ++i) {
servicesNames.push_back("NETWORK"); const uint64_t mask = 1ull << i;
if (services & NODE_GETUTXO) if (services_n & mask) {
servicesNames.push_back("GETUTXO"); servicesNames.push_back(serviceFlagToStr(mask, i));
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");
return servicesNames; return servicesNames;
} }