Skip to content

Commit 8ad5f1c

Browse files
committed
Merge #19106: util: simplify the interface of serviceFlagToStr()
189ae0c util: dedup code in callers of serviceFlagToStr() (Vasil Dimov) fbacad1 util: simplify the interface of serviceFlagToStr() (Vasil Dimov) Pull request description: Don't take two redundant arguments in `serviceFlagToStr()`. Introduce `serviceFlagsToStr()` which takes a mask (with more than one bit set) and returns a vector of strings. As a side effect this fixes an issue introduced in bitcoin/bitcoin#18165 due to which the GUI could print something like `UNKNOWN[1033] & UNKNOWN[1033] & UNKNOWN[2^10]` instead of `NETWORK & WITNESS`. ACKs for top commit: MarcoFalke: ACK 189ae0c jonasschnelli: Tested ACK 189ae0c Tree-SHA512: 000c490f16ebbba04458c62ca4ce743abffd344d375d95f5bbd5008742012032787655db2874b168df0270743266261dccf1693761906567502dcbac902bda50
2 parents c19fd96 + 189ae0c commit 8ad5f1c

File tree

4 files changed

+32
-16
lines changed

4 files changed

+32
-16
lines changed

src/protocol.cpp

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -195,9 +195,15 @@ const std::vector<std::string> &getAllNetMessageTypes()
195195
return allNetMessageTypesVec;
196196
}
197197

198-
std::string serviceFlagToStr(const uint64_t mask, const int bit)
198+
/**
199+
* Convert a service flag (NODE_*) to a human readable string.
200+
* It supports unknown service flags which will be returned as "UNKNOWN[...]".
201+
* @param[in] bit the service flag is calculated as (1 << bit)
202+
*/
203+
static std::string serviceFlagToStr(size_t bit)
199204
{
200-
switch (ServiceFlags(mask)) {
205+
const uint64_t service_flag = 1ULL << bit;
206+
switch ((ServiceFlags)service_flag) {
201207
case NODE_NONE: abort(); // impossible
202208
case NODE_NETWORK: return "NETWORK";
203209
case NODE_GETUTXO: return "GETUTXO";
@@ -211,10 +217,23 @@ std::string serviceFlagToStr(const uint64_t mask, const int bit)
211217
stream.imbue(std::locale::classic());
212218
stream << "UNKNOWN[";
213219
if (bit < 8) {
214-
stream << mask;
220+
stream << service_flag;
215221
} else {
216222
stream << "2^" << bit;
217223
}
218224
stream << "]";
219225
return stream.str();
220226
}
227+
228+
std::vector<std::string> serviceFlagsToStr(uint64_t flags)
229+
{
230+
std::vector<std::string> str_flags;
231+
232+
for (size_t i = 0; i < sizeof(flags) * 8; ++i) {
233+
if (flags & (1ULL << i)) {
234+
str_flags.emplace_back(serviceFlagToStr(i));
235+
}
236+
}
237+
238+
return str_flags;
239+
}

src/protocol.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,12 @@ enum ServiceFlags : uint64_t {
288288
// BIP process.
289289
};
290290

291-
std::string serviceFlagToStr(uint64_t mask, int bit);
291+
/**
292+
* Convert service flags (a bitmask of NODE_*) to human readable strings.
293+
* It supports unknown service flags which will be returned as "UNKNOWN[...]".
294+
* @param[in] flags multiple NODE_* bitwise-OR-ed together
295+
*/
296+
std::vector<std::string> serviceFlagsToStr(uint64_t flags);
292297

293298
/**
294299
* Gets the set of service flags which are "desirable" for a given peer.

src/qt/guiutil.cpp

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -755,12 +755,8 @@ QString formatServicesStr(quint64 mask)
755755
{
756756
QStringList strList;
757757

758-
for (int i = 0; i < 64; i++) {
759-
uint64_t check = 1ull << i;
760-
if (mask & check)
761-
{
762-
strList.append(QString::fromStdString(serviceFlagToStr(mask, i)));
763-
}
758+
for (const auto& flag : serviceFlagsToStr(mask)) {
759+
strList.append(QString::fromStdString(flag));
764760
}
765761

766762
if (strList.size())

src/rpc/util.cpp

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -841,14 +841,10 @@ std::vector<CScript> EvalDescriptorStringOrObject(const UniValue& scanobject, Fl
841841

842842
UniValue GetServicesNames(ServiceFlags services)
843843
{
844-
const uint64_t services_n = services;
845844
UniValue servicesNames(UniValue::VARR);
846845

847-
for (int i = 0; i < 64; ++i) {
848-
const uint64_t mask = 1ull << i;
849-
if (services_n & mask) {
850-
servicesNames.push_back(serviceFlagToStr(mask, i));
851-
}
846+
for (const auto& flag : serviceFlagsToStr(services)) {
847+
servicesNames.push_back(flag);
852848
}
853849

854850
return servicesNames;

0 commit comments

Comments
 (0)