in source/core_mqtt_serializer.c [1977:2056]
MQTTStatus_t MQTT_SerializePublishHeader( const MQTTPublishInfo_t * pPublishInfo,
uint16_t packetId,
size_t remainingLength,
const MQTTFixedBuffer_t * pFixedBuffer,
size_t * pHeaderSize )
{
MQTTStatus_t status = MQTTSuccess;
size_t packetSize = 0;
if( ( pFixedBuffer == NULL ) || ( pPublishInfo == NULL ) ||
( pHeaderSize == NULL ) )
{
LogError( ( "Argument cannot be NULL: pFixedBuffer=%p, "
"pPublishInfo=%p, pHeaderSize=%p.",
( void * ) pFixedBuffer,
( void * ) pPublishInfo,
( void * ) pHeaderSize ) );
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;
}
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=%hu.",
( unsigned short ) 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
* - Payload Length.
*/
packetSize = 1U + remainingLengthEncodedSize( remainingLength )
+ remainingLength
- pPublishInfo->payloadLength;
}
if( ( status == MQTTSuccess ) && ( packetSize > pFixedBuffer->size ) )
{
LogError( ( "Buffer size of %lu is not sufficient to hold "
"serialized PUBLISH header packet of size of %lu.",
( unsigned long ) pFixedBuffer->size,
( unsigned long ) ( packetSize - pPublishInfo->payloadLength ) ) );
status = MQTTNoMemory;
}
if( status == MQTTSuccess )
{
/* Serialize publish without copying the payload. */
serializePublishCommon( pPublishInfo,
remainingLength,
packetId,
pFixedBuffer,
false );
/* Header size is the same as calculated packet size. */
*pHeaderSize = packetSize;
}
return status;
}