I am using Solace c client api (CCSMP), to subscribe to a Solace topic where messages contain a map. A value for the same key in a map can be a string or null. Is there a way to check if a value for a key is null? If I try to retrieve a value for a key and it’s null, Solace API logs “Field Type Null could not be converted to string”.
Sample code:
solClient_rxMsgCallback_returnCode_t
messageReceivedCallback(solClient_opaqueSession_pt opaqueSession_p, solClient_opaqueMsg_pt msg_p, void *user_p)
{
solClient_returnCode_t rc = SOLCLIENT_OK;
solClient_opaqueContainer_pt map_p;
if ((rc = solClient_msg_getBinaryAttachmentMap(msg_p, &map_p))!= SOLCLIENT_OK)
{
//log error
return SOLCLIENT_CALLBACK_OK;
}
char buffer[128];
//if(map_p has field "some_field" and it its value is not null) <-- how to do this?
//{
solClient_container_getString(map_p, buffer, 128, "some_field");
//}
}
solClient_rxMsgCallback_returnCode_t
messageReceivedCallback(solClient_opaqueSession_pt opaqueSession_p, solClient_opaqueMsg_pt msg_p, void *user_p)
{
solClient_returnCode_t rc = SOLCLIENT_OK;
solClient_opaqueContainer_pt map_p;
if ((rc = solClient_msg_getBinaryAttachmentMap(msg_p, &map_p))!= SOLCLIENT_OK)
{
//log error
return SOLCLIENT_CALLBACK_OK;
}
char buffer[128];
solClient_field_t mapEntry;
//if(map_p has field "some_field" and it its value is not null) <-- how to do this?
//{
solClient_container_getField(map_p, &mapEntry, sizeof(mapEntry), "some_field");
switch (mapEntry.type)
{
case SOLCLIENT_NULL:
// handle null field
break;
case SOLCLIENT_STRING:
strncpy (mapEntry.value.string, buffer, sizeof(buffer));
break;
default:
// handle unexpected field
break;
}
//}
return SOLCLIENT_CALLBACK_OK;
}
I’ve left out the error checking necessary on ‘getField’ and strncpy but you get the idea.
Note also that where solClient_container_getString does a copy-out into your buffer, solClient_container_getField returns a pointer to the string (when it’s a string) and you must perform the copy-out operation yourself (i.e strncpy). That pointer returned may not be valid outside the scope of the callback and should not be saved or used later.