Skip to content

Commit c31bc5b

Browse files
committed
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.
1 parent cea91a1 commit c31bc5b

File tree

4 files changed

+35
-30
lines changed

4 files changed

+35
-30
lines changed

src/protocol.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,3 +199,27 @@ const std::vector<std::string> &getAllNetMessageTypes()
199199
{
200200
return allNetMessageTypesVec;
201201
}
202+
203+
std::string serviceFlagToStr(const uint64_t mask, const int bit)
204+
{
205+
switch (ServiceFlags(mask)) {
206+
case NODE_NONE: abort(); // impossible
207+
case NODE_NETWORK: return "NETWORK";
208+
case NODE_GETUTXO: return "GETUTXO";
209+
case NODE_BLOOM: return "BLOOM";
210+
case NODE_WITNESS: return "WITNESS";
211+
case NODE_NETWORK_LIMITED: return "NETWORK_LIMITED";
212+
// Not using default, so we get warned when a case is missing
213+
}
214+
215+
std::ostringstream stream;
216+
stream.imbue(std::locale::classic());
217+
stream << "UNKNOWN[";
218+
if (bit < 8) {
219+
stream << mask;
220+
} else {
221+
stream << "2^" << bit;
222+
}
223+
stream << "]";
224+
return stream.str();
225+
}

src/protocol.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,7 @@ const std::vector<std::string> &getAllNetMessageTypes();
237237

238238
/** nServices flags */
239239
enum ServiceFlags : uint64_t {
240-
// NOTE: When adding here, be sure to update qt/guiutil.cpp's formatServicesStr too
240+
// NOTE: When adding here, be sure to update serviceFlagToStr too
241241
// Nothing
242242
NODE_NONE = 0,
243243
// 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 {
268268
// BIP process.
269269
};
270270

271+
std::string serviceFlagToStr(uint64_t mask, int bit);
272+
271273
/**
272274
* Gets the set of service flags which are "desirable" for a given peer.
273275
*

src/qt/guiutil.cpp

Lines changed: 1 addition & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -737,24 +737,6 @@ QString formatDurationStr(int secs)
737737
return strList.join(" ");
738738
}
739739

740-
QString serviceFlagToStr(const quint64 mask, const int bit)
741-
{
742-
switch (ServiceFlags(mask)) {
743-
case NODE_NONE: abort(); // impossible
744-
case NODE_NETWORK: return "NETWORK";
745-
case NODE_GETUTXO: return "GETUTXO";
746-
case NODE_BLOOM: return "BLOOM";
747-
case NODE_WITNESS: return "WITNESS";
748-
case NODE_NETWORK_LIMITED: return "NETWORK_LIMITED";
749-
// Not using default, so we get warned when a case is missing
750-
}
751-
if (bit < 8) {
752-
return QString("%1[%2]").arg("UNKNOWN").arg(mask);
753-
} else {
754-
return QString("%1[2^%2]").arg("UNKNOWN").arg(bit);
755-
}
756-
}
757-
758740
QString formatServicesStr(quint64 mask)
759741
{
760742
QStringList strList;
@@ -763,7 +745,7 @@ QString formatServicesStr(quint64 mask)
763745
uint64_t check = 1ull << i;
764746
if (mask & check)
765747
{
766-
strList.append(serviceFlagToStr(check, i));
748+
strList.append(QString::fromStdString(serviceFlagToStr(mask, i)));
767749
}
768750
}
769751

src/rpc/util.cpp

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -736,18 +736,15 @@ std::vector<CScript> EvalDescriptorStringOrObject(const UniValue& scanobject, Fl
736736

737737
UniValue GetServicesNames(ServiceFlags services)
738738
{
739+
const uint64_t services_n = services;
739740
UniValue servicesNames(UniValue::VARR);
740741

741-
if (services & NODE_NETWORK)
742-
servicesNames.push_back("NETWORK");
743-
if (services & NODE_GETUTXO)
744-
servicesNames.push_back("GETUTXO");
745-
if (services & NODE_BLOOM)
746-
servicesNames.push_back("BLOOM");
747-
if (services & NODE_WITNESS)
748-
servicesNames.push_back("WITNESS");
749-
if (services & NODE_NETWORK_LIMITED)
750-
servicesNames.push_back("NETWORK_LIMITED");
742+
for (int i = 0; i < 64; ++i) {
743+
const uint64_t mask = 1ull << i;
744+
if (services_n & mask) {
745+
servicesNames.push_back(serviceFlagToStr(mask, i));
746+
}
747+
}
751748

752749
return servicesNames;
753750
}

0 commit comments

Comments
 (0)