in src/mqtt_codec.c [990:1052]
BUFFER_HANDLE mqtt_codec_unsubscribe(uint16_t packetId, const char** unsubscribeList, size_t count, STRING_HANDLE trace_log)
{
BUFFER_HANDLE result;
/* Codes_SRS_MQTT_CODEC_07_027: [If the parameters unsubscribeList is NULL or if count is 0 then mqtt_codec_unsubscribe shall return NULL.] */
if (unsubscribeList == NULL || count == 0)
{
result = NULL;
}
else
{
/* Codes_SRS_MQTT_CODEC_07_030: [mqtt_codec_unsubscribe shall return a BUFFER_HANDLE that represents a MQTT SUBSCRIBE message.] */
result = BUFFER_new();
if (result != NULL)
{
if (constructSubscibeTypeVariableHeader(result, packetId) != 0)
{
/* Codes_SRS_MQTT_CODEC_07_029: [If any error is encountered then mqtt_codec_unsubscribe shall return NULL.] */
BUFFER_delete(result);
result = NULL;
}
else
{
STRING_HANDLE unsub_trace = NULL;
if (trace_log != NULL)
{
unsub_trace = STRING_construct_sprintf(" | PACKET_ID: %"PRIu16, packetId);
}
/* Codes_SRS_MQTT_CODEC_07_028: [mqtt_codec_unsubscribe shall iterate through count items in the unsubscribeList.] */
if (addListItemsToUnsubscribePacket(result, unsubscribeList, count, unsub_trace) != 0)
{
/* Codes_SRS_MQTT_CODEC_07_029: [If any error is encountered then mqtt_codec_unsubscribe shall return NULL.] */
BUFFER_delete(result);
result = NULL;
}
else
{
if (trace_log != NULL)
{
(void)STRING_copy(trace_log, "UNSUBSCRIBE");
}
if (constructFixedHeader(result, UNSUBSCRIBE_TYPE, UNSUBSCRIBE_FIXED_HEADER_FLAG) != 0)
{
/* Codes_SRS_MQTT_CODEC_07_029: [If any error is encountered then mqtt_codec_unsubscribe shall return NULL.] */
BUFFER_delete(result);
result = NULL;
}
else
{
if (trace_log != NULL)
{
(void)STRING_concat_with_STRING(trace_log, unsub_trace);
}
}
}
if (unsub_trace != NULL)
{
STRING_delete(unsub_trace);
}
}
}
}
return result;
}