static int constructFixedHeader()

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;
}