I am using grpc in a C++ application. On the client side, I need to reflectively query a boolean value from a message using reflection.
The response message is shown below. Unfortunately I cannot see field descriptors for the bool mAP field - I can however see the FieldDescriptors for the string fields, What am I doing wrong?
John
message Response {
// OTP Connection Status
enum OTPConnStatus {
Disconnected = 0;
Connected = 1;
InvalidCS = 2;
DiscRequest = 3;
}
// define the fields
RXMessageType mMessageType = 1;
bool mAP = 2;
OTPConnStatus mCS1 = 3;
OTPConnStatus mCS2 = 4;
OTPConnStatus mCS3 = 5;
OTPConnStatus mCS4 = 6;
string mOTP1 = 7;
string mOTP2 = 8;
string mOTP3 = 9;
string mOTP4 = 10;
}
const auto reflection = pMessage->GetReflection();
std::vector<const FieldDescriptor*> fields;
pMessage->GetReflection()->ListFields(*pMessage, &fields);
const auto fieldIter = std::find_if(fields.cbegin(), fields.cend(),
[&lcFieldName](const FieldDescriptor* next) {
return boost::iequals(next->name(), lcFieldName);
});
if (fieldIter != fields.cend()) {
std::string result;
auto fieldDescriptor = *fieldIter;
if (!fieldDescriptor->is_repeated()) {
switch (fieldDescriptor->cpp_type()) {
case FieldDescriptor::CPPTYPE_INT32:
result = std::to_string(reflection->GetInt32 (
*pMessage, fieldDescriptor));
break;
case FieldDescriptor::CPPTYPE_INT64:
result = std::to_string(reflection->GetInt64 (
*pMessage, fieldDescriptor));
break;
case FieldDescriptor::CPPTYPE_UINT32:
result = std::to_string(reflection->GetUInt32 (
*pMessage, fieldDescriptor));
break;
case FieldDescriptor::CPPTYPE_UINT64:
result = std::to_string(reflection->GetUInt64 (
*pMessage, fieldDescriptor));
break;
case FieldDescriptor::CPPTYPE_DOUBLE:
result = std::to_string(reflection->GetDouble (
*pMessage, fieldDescriptor));
break;
case FieldDescriptor::CPPTYPE_FLOAT:
result = std::to_string(reflection->GetFloat (
*pMessage, fieldDescriptor));
break;
case FieldDescriptor::CPPTYPE_BOOL:
result = reflection->GetBool(
*pMessage, fieldDescriptor) ?
"true" : "false";
break;
case FieldDescriptor::CPPTYPE_ENUM:
result = reflection->GetEnum(
*pMessage, fieldDescriptor)->
full_name();
break;
case FieldDescriptor::CPPTYPE_STRING:
result = reflection->GetString(
*pMessage, fieldDescriptor);
break;
case FieldDescriptor::CPPTYPE_MESSAGE:
//result = reflection->GetMessage(
// *pMessage, fieldDescriptor);
break;
}
}
std::cout << result << std::endl;
exit(0);
} else {
Aucun commentaire:
Enregistrer un commentaire