in source/ota_cbor.c [74:216]
bool OTA_CBOR_Decode_GetStreamResponseMessage( const uint8_t * pMessageBuffer,
size_t messageSize,
int32_t * pFileId,
int32_t * pBlockId,
int32_t * pBlockSize,
uint8_t ** pPayload,
size_t * pPayloadSize )
{
CborError cborResult = CborNoError;
CborParser cborParser;
CborValue cborValue, cborMap;
size_t payloadSizeReceived = 0;
if( ( pFileId == NULL ) ||
( pBlockId == NULL ) ||
( pBlockSize == NULL ) ||
( pPayload == NULL ) ||
( pPayloadSize == NULL ) ||
( pMessageBuffer == NULL ) )
{
cborResult = CborUnknownError;
}
/* Initialize the parser. */
if( CborNoError == cborResult )
{
cborResult = cbor_parser_init( pMessageBuffer,
messageSize,
0,
&cborParser,
&cborMap );
}
/* Get the outer element and confirm that it's a "map," i.e., a set of
* CBOR key/value pairs. */
if( CborNoError == cborResult )
{
if( false == cbor_value_is_map( &cborMap ) )
{
cborResult = CborErrorIllegalType;
}
}
/* Find the file ID. */
if( CborNoError == cborResult )
{
cborResult = cbor_value_map_find_value( &cborMap,
OTA_CBOR_FILEID_KEY,
&cborValue );
}
if( CborNoError == cborResult )
{
cborResult = checkDataType( CborIntegerType, &cborValue );
}
if( CborNoError == cborResult )
{
cborResult = cbor_value_get_int( &cborValue,
( int * ) pFileId );
}
/* Find the block ID. */
if( CborNoError == cborResult )
{
cborResult = cbor_value_map_find_value( &cborMap,
OTA_CBOR_BLOCKID_KEY,
&cborValue );
}
if( CborNoError == cborResult )
{
cborResult = checkDataType( CborIntegerType, &cborValue );
}
if( CborNoError == cborResult )
{
cborResult = cbor_value_get_int( &cborValue,
( int * ) pBlockId );
}
/* Find the block size. */
if( CborNoError == cborResult )
{
cborResult = cbor_value_map_find_value( &cborMap,
OTA_CBOR_BLOCKSIZE_KEY,
&cborValue );
}
if( CborNoError == cborResult )
{
cborResult = checkDataType( CborIntegerType, &cborValue );
}
if( CborNoError == cborResult )
{
cborResult = cbor_value_get_int( &cborValue,
( int * ) pBlockSize );
}
/* Find the payload bytes. */
if( CborNoError == cborResult )
{
cborResult = cbor_value_map_find_value( &cborMap,
OTA_CBOR_BLOCKPAYLOAD_KEY,
&cborValue );
}
if( CborNoError == cborResult )
{
cborResult = checkDataType( CborByteStringType, &cborValue );
}
/* Calculate the size we need to malloc for the payload. */
if( CborNoError == cborResult )
{
cborResult = cbor_value_calculate_string_length( &cborValue,
&payloadSizeReceived );
}
if( CborNoError == cborResult )
{
/* Check if the received payload size is less than or equal to buffer size. */
if( payloadSizeReceived <= ( *pPayloadSize ) )
{
*pPayloadSize = payloadSizeReceived;
}
else
{
cborResult = CborErrorOutOfMemory;
}
}
if( CborNoError == cborResult )
{
cborResult = cbor_value_copy_byte_string( &cborValue,
*pPayload,
pPayloadSize,
NULL );
}
return CborNoError == cborResult;
}