FleetProvisioningStatus_t FleetProvisioning_GetRegisterThingTopic()

in source/fleet_provisioning.c [638:726]


FleetProvisioningStatus_t FleetProvisioning_GetRegisterThingTopic( char * pTopicBuffer,
                                                                   uint16_t bufferLength,
                                                                   FleetProvisioningFormat_t format,
                                                                   FleetProvisioningApiTopics_t topic,
                                                                   const char * pTemplateName,
                                                                   uint16_t templateNameLength,
                                                                   uint16_t * pOutLength )
{
    FleetProvisioningStatus_t status = FleetProvisioningError;
    uint16_t topicLength = 0U;
    char * pBufferCursor = pTopicBuffer;

    status = GetRegisterThingTopicCheckParams( pTopicBuffer,
                                               format,
                                               topic,
                                               pTemplateName,
                                               templateNameLength,
                                               pOutLength );

    if( status == FleetProvisioningSuccess )
    {
        topicLength = getRegisterThingTopicLength( templateNameLength, format, topic );

        if( bufferLength < topicLength )
        {
            status = FleetProvisioningBufferTooSmall;

            LogError( ( "The buffer is too small to hold the topic string. "
                        "Provided buffer size: %u, Required buffer size: %u.",
                        ( unsigned int ) bufferLength,
                        ( unsigned int ) topicLength ) );
        }
    }

    if( status == FleetProvisioningSuccess )
    {
        /* At this point, it is certain that we have a large enough buffer to
         * write the topic string into. */

        /* Write prefix first. */
        writeTopicFragmentAndAdvance( &pBufferCursor,
                                      FP_REGISTER_API_PREFIX,
                                      FP_REGISTER_API_LENGTH_PREFIX );

        /* Write template name next. */
        writeTopicFragmentAndAdvance( &pBufferCursor,
                                      pTemplateName,
                                      templateNameLength );

        /* Write bridge next. */
        writeTopicFragmentAndAdvance( &pBufferCursor,
                                      FP_REGISTER_API_BRIDGE,
                                      FP_REGISTER_API_LENGTH_BRIDGE );

        /* Write report format. */
        if( format == FleetProvisioningJson )
        {
            writeTopicFragmentAndAdvance( &pBufferCursor,
                                          FP_API_JSON_FORMAT,
                                          FP_API_LENGTH_JSON_FORMAT );
        }

        if( format == FleetProvisioningCbor )
        {
            writeTopicFragmentAndAdvance( &pBufferCursor,
                                          FP_API_CBOR_FORMAT,
                                          FP_API_LENGTH_CBOR_FORMAT );
        }

        /* Write report suffix. */
        if( topic == FleetProvisioningAccepted )
        {
            writeTopicFragmentAndAdvance( &pBufferCursor,
                                          FP_API_ACCEPTED_SUFFIX,
                                          FP_API_LENGTH_ACCEPTED_SUFFIX );
        }

        if( topic == FleetProvisioningRejected )
        {
            writeTopicFragmentAndAdvance( &pBufferCursor,
                                          FP_API_REJECTED_SUFFIX,
                                          FP_API_LENGTH_REJECTED_SUFFIX );
        }

        *pOutLength = topicLength;
    }

    return status;
}