in source/core_mqtt_serializer.c [1892:1973]
MQTTStatus_t MQTT_SerializePublish( const MQTTPublishInfo_t * pPublishInfo,
uint16_t packetId,
size_t remainingLength,
const MQTTFixedBuffer_t * pFixedBuffer )
{
MQTTStatus_t status = MQTTSuccess;
size_t packetSize = 0;
if( ( pFixedBuffer == NULL ) || ( pPublishInfo == NULL ) )
{
LogError( ( "Argument cannot be NULL: pFixedBuffer=%p, "
"pPublishInfo=%p.",
( void * ) pFixedBuffer,
( void * ) pPublishInfo ) );
status = MQTTBadParameter;
}
/* A buffer must be configured for serialization. */
else if( pFixedBuffer->pBuffer == NULL )
{
LogError( ( "Argument cannot be NULL: pFixedBuffer->pBuffer is NULL." ) );
status = MQTTBadParameter;
}
/* For serializing a publish, if there exists a payload, then the buffer
* cannot be NULL. */
else if( ( pPublishInfo->payloadLength > 0U ) && ( pPublishInfo->pPayload == NULL ) )
{
LogError( ( "A nonzero payload length requires a non-NULL payload: "
"payloadLength=%lu, pPayload=%p.",
( unsigned long ) pPublishInfo->payloadLength,
pPublishInfo->pPayload ) );
status = MQTTBadParameter;
}
else if( ( pPublishInfo->pTopicName == NULL ) || ( pPublishInfo->topicNameLength == 0U ) )
{
LogError( ( "Invalid topic name for PUBLISH: pTopicName=%p, "
"topicNameLength=%hu.",
( void * ) pPublishInfo->pTopicName,
( unsigned short ) pPublishInfo->topicNameLength ) );
status = MQTTBadParameter;
}
else if( ( pPublishInfo->qos != MQTTQoS0 ) && ( packetId == 0U ) )
{
LogError( ( "Packet ID is 0 for PUBLISH with QoS=%u.",
( unsigned int ) pPublishInfo->qos ) );
status = MQTTBadParameter;
}
else if( ( pPublishInfo->dup == true ) && ( pPublishInfo->qos == MQTTQoS0 ) )
{
LogError( ( "Duplicate flag is set for PUBLISH with Qos 0." ) );
status = MQTTBadParameter;
}
else
{
/* Length of serialized packet = First byte
* + Length of encoded remaining length
* + Remaining length. */
packetSize = 1U + remainingLengthEncodedSize( remainingLength )
+ remainingLength;
}
if( ( status == MQTTSuccess ) && ( packetSize > pFixedBuffer->size ) )
{
LogError( ( "Buffer size of %lu is not sufficient to hold "
"serialized PUBLISH packet of size of %lu.",
( unsigned long ) pFixedBuffer->size,
( unsigned long ) packetSize ) );
status = MQTTNoMemory;
}
if( status == MQTTSuccess )
{
/* Serialize publish with header and payload. */
serializePublishCommon( pPublishInfo,
remainingLength,
packetId,
pFixedBuffer,
true );
}
return status;
}