in source/azure_iot_provisioning_client.c [754:846]
AzureIoTResult_t AzureIoTProvisioningClient_Init( AzureIoTProvisioningClient_t * pxAzureProvClient,
const uint8_t * pucEndpoint,
uint32_t ulEndpointLength,
const uint8_t * pucIDScope,
uint32_t ulIDScopeLength,
const uint8_t * pucRegistrationID,
uint32_t ulRegistrationIDLength,
AzureIoTProvisioningClientOptions_t * pxProvisioningClientOptions,
uint8_t * pucBuffer,
uint32_t ulBufferLength,
AzureIoTGetCurrentTimeFunc_t xGetTimeFunction,
const AzureIoTTransportInterface_t * pxTransportInterface )
{
AzureIoTResult_t xResult;
az_span xEndpoint = az_span_create( ( uint8_t * ) pucEndpoint, ( int32_t ) ulEndpointLength );
az_span xIDScope = az_span_create( ( uint8_t * ) pucIDScope, ( int32_t ) ulIDScopeLength );
az_span xRegistrationID = az_span_create( ( uint8_t * ) pucRegistrationID, ( int32_t ) ulRegistrationIDLength );
az_result xCoreResult;
AzureIoTMQTTResult_t xMQTTResult;
az_iot_provisioning_client_options xOptions = az_iot_provisioning_client_options_default();
uint8_t * pucNetworkBuffer;
uint32_t ulNetworkBufferLength;
if( ( pxAzureProvClient == NULL ) ||
( pucEndpoint == NULL ) || ( ulEndpointLength == 0 ) ||
( pucIDScope == NULL ) || ( ulIDScopeLength == 0 ) ||
( pucRegistrationID == NULL ) || ( ulRegistrationIDLength == 0 ) ||
( pucBuffer == NULL ) || ( ulBufferLength == 0 ) ||
( xGetTimeFunction == NULL ) || ( pxTransportInterface == NULL ) )
{
AZLogError( ( "AzureIoTProvisioningClient_Init failed: invalid argument" ) );
xResult = eAzureIoTErrorInvalidArgument;
}
else if( ( ulBufferLength < ( azureiotconfigTOPIC_MAX + azureiotconfigPROVISIONING_REQUEST_PAYLOAD_MAX ) ) ||
( ulBufferLength < ( azureiotconfigUSERNAME_MAX + azureiotconfigPASSWORD_MAX ) ) )
{
AZLogError( ( "AzureIoTProvisioningClient_Init failed: insufficient buffer size" ) );
xResult = eAzureIoTErrorOutOfMemory;
}
else
{
memset( pxAzureProvClient, 0, sizeof( AzureIoTProvisioningClient_t ) );
/* Setup scratch buffer to be used by middleware */
pxAzureProvClient->_internal.ulScratchBufferLength =
azureiotPrvGetMaxInt( ( azureiotconfigUSERNAME_MAX + azureiotconfigPASSWORD_MAX ),
( azureiotconfigTOPIC_MAX + azureiotconfigPROVISIONING_REQUEST_PAYLOAD_MAX ) );
pxAzureProvClient->_internal.pucScratchBuffer = pucBuffer;
pucNetworkBuffer = pucBuffer + pxAzureProvClient->_internal.ulScratchBufferLength;
ulNetworkBufferLength = ulBufferLength - pxAzureProvClient->_internal.ulScratchBufferLength;
pxAzureProvClient->_internal.pucEndpoint = pucEndpoint;
pxAzureProvClient->_internal.ulEndpointLength = ulEndpointLength;
pxAzureProvClient->_internal.pucIDScope = pucIDScope;
pxAzureProvClient->_internal.ulIDScopeLength = ulIDScopeLength;
pxAzureProvClient->_internal.pucRegistrationID = pucRegistrationID;
pxAzureProvClient->_internal.ulRegistrationIDLength = ulRegistrationIDLength;
pxAzureProvClient->_internal.xGetTimeFunction = xGetTimeFunction;
if( pxProvisioningClientOptions )
{
xOptions.user_agent = az_span_create( ( uint8_t * ) pxProvisioningClientOptions->pucUserAgent,
( int32_t ) pxProvisioningClientOptions->ulUserAgentLength );
}
else
{
xOptions.user_agent = az_span_create( ( uint8_t * ) azureiotprovisioningUSER_AGENT,
sizeof( azureiotprovisioningUSER_AGENT ) - 1 );
}
xCoreResult = az_iot_provisioning_client_init( &( pxAzureProvClient->_internal.xProvisioningClientCore ),
xEndpoint, xIDScope, xRegistrationID, &xOptions );
if( az_result_failed( xCoreResult ) )
{
AZLogError( ( "AzureIoTProvisioning initialization failed: core error=0x%08x", ( uint16_t ) xCoreResult ) );
xResult = AzureIoT_TranslateCoreError( xCoreResult );
}
else if( ( xMQTTResult = AzureIoTMQTT_Init( &( pxAzureProvClient->_internal.xMQTTContext ),
pxTransportInterface, prvProvClientGetTimeMillseconds,
prvProvClientEventCallback, pucNetworkBuffer,
ulNetworkBufferLength ) ) != eAzureIoTMQTTSuccess )
{
AZLogError( ( "AzureIoTProvisioning initialization failed: MQTT error=0x%08x", ( uint16_t ) xMQTTResult ) );
xResult = eAzureIoTErrorInitFailed;
}
else
{
xResult = eAzureIoTSuccess;
}
}
return xResult;
}