source/azure_iot_json_reader.c (211 lines of code) (raw):
/* Copyright (c) Microsoft Corporation.
* Licensed under the MIT License. */
/**
* @file azure_iot_json_reader.c
* @brief Implementation of the Azure IoT JSON reader.
*/
#include "azure_iot_json_reader.h"
#include <stdbool.h>
#include <stdint.h>
#include "azure_iot.h"
#include "azure_iot_private.h"
AzureIoTResult_t AzureIoTJSONReader_Init( AzureIoTJSONReader_t * pxReader,
const uint8_t * pucBuffer,
uint32_t ulBufferSize )
{
AzureIoTResult_t xResult;
az_result xCoreResult;
az_span xJSONSpan;
if( ( pxReader == NULL ) || ( pucBuffer == NULL ) || ( ulBufferSize == 0 ) )
{
AZLogError( ( "AzureIoTJSONReader_Init failed: invalid argument" ) );
xResult = eAzureIoTErrorInvalidArgument;
}
else
{
xJSONSpan = az_span_create( ( uint8_t * ) pucBuffer, ( int32_t ) ulBufferSize );
if( az_result_failed( xCoreResult = az_json_reader_init( &pxReader->_internal.xCoreReader, xJSONSpan, NULL ) ) )
{
AZLogError( ( "Could not initialize the JSON reader: core error=0x%08x", ( uint16_t ) xCoreResult ) );
xResult = AzureIoT_TranslateCoreError( xCoreResult );
}
else
{
xResult = eAzureIoTSuccess;
}
}
return xResult;
}
AzureIoTResult_t AzureIoTJSONReader_NextToken( AzureIoTJSONReader_t * pxReader )
{
AzureIoTResult_t xResult;
az_result xCoreResult;
if( pxReader == NULL )
{
AZLogError( ( "AzureIoTJSONReader_NextToken failed: invalid argument" ) );
xResult = eAzureIoTErrorInvalidArgument;
}
else
{
if( az_result_failed( xCoreResult = az_json_reader_next_token( &pxReader->_internal.xCoreReader ) ) )
{
AZLogError( ( "Could not get next JSON token: core error=0x%08x", ( uint16_t ) xCoreResult ) );
xResult = AzureIoT_TranslateCoreError( xCoreResult );
}
else
{
xResult = eAzureIoTSuccess;
}
}
return xResult;
}
AzureIoTResult_t AzureIoTJSONReader_SkipChildren( AzureIoTJSONReader_t * pxReader )
{
AzureIoTResult_t xResult;
az_result xCoreResult;
if( pxReader == NULL )
{
AZLogError( ( "AzureIoTJSONReader_SkipChildren failed: invalid argument" ) );
xResult = eAzureIoTErrorInvalidArgument;
}
else
{
if( az_result_failed( xCoreResult = az_json_reader_skip_children( &pxReader->_internal.xCoreReader ) ) )
{
AZLogError( ( "Could not skip children in JSON: core error=0x%08x", ( uint16_t ) xCoreResult ) );
xResult = AzureIoT_TranslateCoreError( xCoreResult );
}
else
{
xResult = eAzureIoTSuccess;
}
}
return xResult;
}
AzureIoTResult_t AzureIoTJSONReader_GetTokenBool( AzureIoTJSONReader_t * pxReader,
bool * pxValue )
{
AzureIoTResult_t xResult;
az_result xCoreResult;
if( ( pxReader == NULL ) || ( pxValue == NULL ) )
{
AZLogError( ( "AzureIoTJSONReader_GetTokenBool failed: invalid argument" ) );
xResult = eAzureIoTErrorInvalidArgument;
}
else
{
if( az_result_failed( xCoreResult = az_json_token_get_boolean( &pxReader->_internal.xCoreReader.token, pxValue ) ) )
{
AZLogError( ( "Could not get boolean in JSON: core error=0x%08x", ( uint16_t ) xCoreResult ) );
xResult = AzureIoT_TranslateCoreError( xCoreResult );
}
else
{
xResult = eAzureIoTSuccess;
}
}
return xResult;
}
AzureIoTResult_t AzureIoTJSONReader_GetTokenInt32( AzureIoTJSONReader_t * pxReader,
int32_t * plValue )
{
AzureIoTResult_t xResult;
az_result xCoreResult;
if( ( pxReader == NULL ) || ( plValue == NULL ) )
{
AZLogError( ( "AzureIoTJSONReader_GetTokenInt32 failed: invalid argument" ) );
xResult = eAzureIoTErrorInvalidArgument;
}
else
{
if( az_result_failed( xCoreResult = az_json_token_get_int32( &pxReader->_internal.xCoreReader.token, plValue ) ) )
{
AZLogError( ( "Could not get int32_t in JSON: core error=0x%08x", ( uint16_t ) xCoreResult ) );
xResult = AzureIoT_TranslateCoreError( xCoreResult );
}
else
{
xResult = eAzureIoTSuccess;
}
}
return xResult;
}
AzureIoTResult_t AzureIoTJSONReader_GetTokenDouble( AzureIoTJSONReader_t * pxReader,
double * pxValue )
{
AzureIoTResult_t xResult;
az_result xCoreResult;
if( ( pxReader == NULL ) || ( pxValue == NULL ) )
{
AZLogError( ( "AzureIoTJSONReader_GetTokenDouble failed: invalid argument" ) );
xResult = eAzureIoTErrorInvalidArgument;
}
else
{
if( az_result_failed( xCoreResult = az_json_token_get_double( &pxReader->_internal.xCoreReader.token, pxValue ) ) )
{
AZLogError( ( "Could not get double in JSON: core error=0x%08x", ( uint16_t ) xCoreResult ) );
xResult = AzureIoT_TranslateCoreError( xCoreResult );
}
else
{
xResult = eAzureIoTSuccess;
}
}
return xResult;
}
AzureIoTResult_t AzureIoTJSONReader_GetTokenString( AzureIoTJSONReader_t * pxReader,
uint8_t * pucBuffer,
uint32_t ulBufferSize,
uint32_t * pusBytesCopied )
{
AzureIoTResult_t xResult;
az_result xCoreResult;
if( ( pxReader == NULL ) || ( pucBuffer == NULL ) || ( ulBufferSize == 0 ) || ( pusBytesCopied == NULL ) )
{
AZLogError( ( "AzureIoTJSONReader_TokenType failed: invalid argument" ) );
xResult = eAzureIoTErrorInvalidArgument;
}
else
{
if( az_result_failed( xCoreResult = az_json_token_get_string( &pxReader->_internal.xCoreReader.token,
( char * ) pucBuffer, ( int32_t ) ulBufferSize, ( int32_t * ) pusBytesCopied ) ) )
{
AZLogError( ( "Could not get string in JSON: core error=0x%08x", ( uint16_t ) xCoreResult ) );
xResult = AzureIoT_TranslateCoreError( xCoreResult );
}
else
{
xResult = eAzureIoTSuccess;
}
}
return xResult;
}
bool AzureIoTJSONReader_TokenIsTextEqual( AzureIoTJSONReader_t * pxReader,
const uint8_t * pucExpectedText,
uint32_t ulExpectedTextLength )
{
bool xResult;
az_span xExpectedTextSpan;
if( ( pxReader == NULL ) || ( pucExpectedText == NULL ) || ( ulExpectedTextLength == 0 ) )
{
AZLogError( ( "AzureIoTJSONReader_TokenType failed: invalid argument" ) );
xResult = false;
}
else
{
xExpectedTextSpan = az_span_create( ( uint8_t * ) pucExpectedText, ( int32_t ) ulExpectedTextLength );
xResult = az_json_token_is_text_equal( &pxReader->_internal.xCoreReader.token, xExpectedTextSpan );
}
return xResult;
}
AzureIoTResult_t AzureIoTJSONReader_TokenType( AzureIoTJSONReader_t * pxReader,
AzureIoTJSONTokenType_t * pxTokenType )
{
AzureIoTResult_t xResult;
if( ( pxReader == NULL ) || ( pxTokenType == NULL ) )
{
AZLogError( ( "AzureIoTJSONReader_TokenType failed: invalid argument" ) );
xResult = eAzureIoTErrorInvalidArgument;
}
else
{
*pxTokenType = ( AzureIoTJSONTokenType_t ) pxReader->_internal.xCoreReader.token.kind;
xResult = eAzureIoTSuccess;
}
return xResult;
}