source/otaJobParser/ota_job_handler.c (71 lines of code) (raw):
/*
* AWS IoT Jobs v2.0.0
* Copyright (C) 2023 Amazon.com, Inc. and its affiliates. All Rights Reserved.
* SPDX-License-Identifier: MIT
*
* Licensed under the MIT License. See the LICENSE accompanying this file
* for the specific language governing permissions and limitations under
* the License.
*/
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
#include "core_json.h"
#include "job_parser.h"
#include "ota_job_processor.h"
static bool isFreeRTOSOtaJob( const char * jobDoc,
const size_t jobDocLength );
static bool isJobFileIndexValid( const char * jobDoc,
const size_t jobDocLength,
const uint8_t fileIndex );
/**
* @brief Signals if the job document provided is a FreeRTOS OTA update document
*
* @param jobDoc The job document contained in the AWS IoT Job
* @param jobDocLength The length of the job document
* @param fields A pointer to an job document fields structure populated by call
* @return int8_t The next file index in the job. Returns 0 if no additional files are available. Returns -1 if error.
*/
int8_t otaParser_parseJobDocFile( const char * jobDoc,
const size_t jobDocLength,
const uint8_t fileIndex,
AfrOtaJobDocumentFields_t * fields )
{
bool fieldsPopulated = false;
int8_t nextFileIndex = -1;
if( ( jobDoc != NULL ) && ( jobDocLength > 0U ) )
{
if( isFreeRTOSOtaJob( jobDoc, jobDocLength ) && isJobFileIndexValid( jobDoc, jobDocLength, fileIndex ) )
{
fieldsPopulated = populateJobDocFields( jobDoc,
jobDocLength,
( int32_t ) fileIndex,
fields );
}
if( fieldsPopulated )
{
nextFileIndex = ( isJobFileIndexValid( jobDoc, jobDocLength, fileIndex + 1U ) ) ? ( int8_t ) ( ( int8_t ) fileIndex + 1 ) : ( int8_t ) 0;
}
}
return nextFileIndex;
}
static bool isFreeRTOSOtaJob( const char * jobDoc,
const size_t jobDocLength )
{
JSONStatus_t isFreeRTOSOta = JSONIllegalDocument;
const char * afrOtaDocHeader;
size_t afrOtaDocHeaderLength = 0U;
/* FreeRTOS OTA updates have a top level "afr_ota" job document key.
* Check for this to ensure the document is an FreeRTOS OTA update */
isFreeRTOSOta = JSON_SearchConst( jobDoc,
jobDocLength,
"afr_ota",
7U,
&afrOtaDocHeader,
&afrOtaDocHeaderLength,
NULL );
return( JSONSuccess == isFreeRTOSOta );
}
static bool isJobFileIndexValid( const char * jobDoc,
const size_t jobDocLength,
const uint8_t fileIndex )
{
JSONStatus_t isFreeRTOSOta = JSONIllegalDocument;
const char * fileValue;
size_t fileValueLength = 0U;
char file[ 17U ] = "afr_ota.files[i]";
if( fileIndex <= 9U )
{
int32_t index = ( ( int32_t ) '0' + ( int32_t ) fileIndex );
file[ 14U ] = ( char ) index;
isFreeRTOSOta = JSON_SearchConst( jobDoc,
jobDocLength,
file,
16U,
&fileValue,
&fileValueLength,
NULL );
}
return( JSONSuccess == isFreeRTOSOta );
}