in src/mqtt_codec.c [336:377]
static int constructFixedHeader(BUFFER_HANDLE ctrlPacket, CONTROL_PACKET_TYPE packetType, uint8_t flags)
{
int result;
size_t packetLen = BUFFER_length(ctrlPacket);
uint8_t remainSize[4] ={ 0 };
size_t index = 0;
// Calculate the length of packet
do
{
uint8_t encode = packetLen % 128;
packetLen /= 128;
// if there are more data to encode, set the top bit of this byte
if (packetLen > 0)
{
encode |= NEXT_128_CHUNK;
}
remainSize[index++] = encode;
} while (packetLen > 0);
BUFFER_HANDLE fixedHeader = BUFFER_new();
if (fixedHeader == NULL)
{
result = MU_FAILURE;
}
else if (BUFFER_pre_build(fixedHeader, index + 1) != 0)
{
BUFFER_delete(fixedHeader);
result = MU_FAILURE;
}
else
{
uint8_t* iterator = BUFFER_u_char(fixedHeader);
*iterator = (uint8_t)packetType | flags;
iterator++;
(void)memcpy(iterator, remainSize, index);
result = BUFFER_prepend(ctrlPacket, fixedHeader);
BUFFER_delete(fixedHeader);
}
return result;
}