in sdk/src/azure/iot/az_iot_adu_client.c [349:488]
AZ_NODISCARD az_result az_iot_adu_client_parse_service_properties(
az_iot_adu_client* client,
az_json_reader* ref_json_reader,
az_iot_adu_client_update_request* update_request)
{
_az_PRECONDITION_NOT_NULL(client);
_az_PRECONDITION_NOT_NULL(ref_json_reader);
_az_PRECONDITION_NOT_NULL(update_request);
(void)client;
RETURN_IF_JSON_TOKEN_NOT_TYPE(ref_json_reader, AZ_JSON_TOKEN_PROPERTY_NAME);
RETURN_IF_JSON_TOKEN_NOT_TEXT(ref_json_reader, AZ_IOT_ADU_CLIENT_AGENT_PROPERTY_NAME_SERVICE);
_az_RETURN_IF_FAILED(az_json_reader_next_token(ref_json_reader));
RETURN_IF_JSON_TOKEN_NOT_TYPE(ref_json_reader, AZ_JSON_TOKEN_BEGIN_OBJECT);
_az_RETURN_IF_FAILED(az_json_reader_next_token(ref_json_reader));
update_request->workflow.action = 0;
update_request->workflow.id = AZ_SPAN_EMPTY;
update_request->workflow.retry_timestamp = AZ_SPAN_EMPTY;
update_request->update_manifest = AZ_SPAN_EMPTY;
update_request->update_manifest_signature = AZ_SPAN_EMPTY;
update_request->file_urls_count = 0;
while (ref_json_reader->token.kind != AZ_JSON_TOKEN_END_OBJECT)
{
RETURN_IF_JSON_TOKEN_NOT_TYPE(ref_json_reader, AZ_JSON_TOKEN_PROPERTY_NAME);
if (az_json_token_is_text_equal(
&ref_json_reader->token,
AZ_SPAN_FROM_STR(AZ_IOT_ADU_CLIENT_AGENT_PROPERTY_NAME_WORKFLOW)))
{
_az_RETURN_IF_FAILED(az_json_reader_next_token(ref_json_reader));
RETURN_IF_JSON_TOKEN_NOT_TYPE(ref_json_reader, AZ_JSON_TOKEN_BEGIN_OBJECT);
_az_RETURN_IF_FAILED(az_json_reader_next_token(ref_json_reader));
while (ref_json_reader->token.kind != AZ_JSON_TOKEN_END_OBJECT)
{
RETURN_IF_JSON_TOKEN_NOT_TYPE(ref_json_reader, AZ_JSON_TOKEN_PROPERTY_NAME);
if (az_json_token_is_text_equal(
&ref_json_reader->token,
AZ_SPAN_FROM_STR(AZ_IOT_ADU_CLIENT_AGENT_PROPERTY_NAME_ACTION)))
{
_az_RETURN_IF_FAILED(az_json_reader_next_token(ref_json_reader));
_az_RETURN_IF_FAILED(az_json_token_get_int32(
&ref_json_reader->token, (int32_t*)&update_request->workflow.action));
}
else if (az_json_token_is_text_equal(
&ref_json_reader->token,
AZ_SPAN_FROM_STR(AZ_IOT_ADU_CLIENT_AGENT_PROPERTY_NAME_ID)))
{
_az_RETURN_IF_FAILED(az_json_reader_next_token(ref_json_reader));
update_request->workflow.id = ref_json_reader->token.slice;
}
else if (az_json_token_is_text_equal(
&ref_json_reader->token,
AZ_SPAN_FROM_STR(AZ_IOT_ADU_CLIENT_AGENT_PROPERTY_NAME_RETRY_TIMESTAMP)))
{
_az_RETURN_IF_FAILED(az_json_reader_next_token(ref_json_reader));
update_request->workflow.retry_timestamp = ref_json_reader->token.slice;
}
else
{
_az_LOG_WRITE(
AZ_LOG_IOT_ADU,
AZ_SPAN_FROM_STR("Unexpected property found in ADU manifest workflow:"));
_az_LOG_WRITE(AZ_LOG_IOT_ADU, ref_json_reader->token.slice);
return AZ_ERROR_JSON_INVALID_STATE;
}
_az_RETURN_IF_FAILED(az_json_reader_next_token(ref_json_reader));
}
}
else if (az_json_token_is_text_equal(
&ref_json_reader->token,
AZ_SPAN_FROM_STR(AZ_IOT_ADU_CLIENT_AGENT_PROPERTY_NAME_UPDATE_MANIFEST)))
{
_az_RETURN_IF_FAILED(az_json_reader_next_token(ref_json_reader));
if (ref_json_reader->token.kind != AZ_JSON_TOKEN_NULL)
{
update_request->update_manifest = ref_json_reader->token.slice;
}
}
else if (az_json_token_is_text_equal(
&ref_json_reader->token,
AZ_SPAN_FROM_STR(AZ_IOT_ADU_CLIENT_AGENT_PROPERTY_NAME_UPDATE_MANIFEST_SIGNATURE)))
{
_az_RETURN_IF_FAILED(az_json_reader_next_token(ref_json_reader));
if (ref_json_reader->token.kind != AZ_JSON_TOKEN_NULL)
{
update_request->update_manifest_signature = ref_json_reader->token.slice;
}
}
else if (az_json_token_is_text_equal(
&ref_json_reader->token,
AZ_SPAN_FROM_STR(AZ_IOT_ADU_CLIENT_AGENT_PROPERTY_NAME_FILEURLS)))
{
_az_RETURN_IF_FAILED(az_json_reader_next_token(ref_json_reader));
if (ref_json_reader->token.kind != AZ_JSON_TOKEN_NULL)
{
RETURN_IF_JSON_TOKEN_NOT_TYPE(ref_json_reader, AZ_JSON_TOKEN_BEGIN_OBJECT);
_az_RETURN_IF_FAILED(az_json_reader_next_token(ref_json_reader));
while (ref_json_reader->token.kind != AZ_JSON_TOKEN_END_OBJECT)
{
RETURN_IF_JSON_TOKEN_NOT_TYPE(ref_json_reader, AZ_JSON_TOKEN_PROPERTY_NAME);
// If object isn't ended and we have reached max files allowed, next would overflow.
if (update_request->file_urls_count == _az_IOT_ADU_CLIENT_MAX_TOTAL_FILE_COUNT)
{
return AZ_ERROR_NOT_ENOUGH_SPACE;
}
update_request->file_urls[update_request->file_urls_count].id
= ref_json_reader->token.slice;
_az_RETURN_IF_FAILED(az_json_reader_next_token(ref_json_reader));
if (ref_json_reader->token.kind != AZ_JSON_TOKEN_NULL)
{
update_request->file_urls[update_request->file_urls_count].url
= ref_json_reader->token.slice;
update_request->file_urls_count++;
}
_az_RETURN_IF_FAILED(az_json_reader_next_token(ref_json_reader));
}
}
}
_az_RETURN_IF_FAILED(az_json_reader_next_token(ref_json_reader));
}
return AZ_OK;
}