AZ_NODISCARD az_result az_iot_adu_client_get_agent_state_payload()

in sdk/src/azure/iot/az_iot_adu_client.c [151:347]


AZ_NODISCARD az_result az_iot_adu_client_get_agent_state_payload(
    az_iot_adu_client* client,
    az_iot_adu_client_device_properties* device_properties,
    az_iot_adu_client_agent_state agent_state,
    az_iot_adu_client_workflow* workflow,
    az_iot_adu_client_install_result* last_install_result,
    az_json_writer* ref_json_writer)
{
  _az_PRECONDITION_NOT_NULL(client);
  _az_PRECONDITION_NOT_NULL(device_properties);
  _az_PRECONDITION_VALID_SPAN(device_properties->manufacturer, 1, false);
  _az_PRECONDITION_VALID_SPAN(device_properties->model, 1, false);
  _az_PRECONDITION_VALID_SPAN(device_properties->update_id, 1, false);
  _az_PRECONDITION_VALID_SPAN(device_properties->adu_version, 1, false);
  _az_PRECONDITION_NOT_NULL(ref_json_writer);

  uint8_t step_id_scratch_buffer[7];

  /* Update reported property */
  _az_RETURN_IF_FAILED(az_json_writer_append_begin_object(ref_json_writer));

  /* Fill the ADU agent component name.  */
  _az_RETURN_IF_FAILED(az_iot_hub_client_properties_writer_begin_component(
      NULL, ref_json_writer, AZ_SPAN_FROM_STR(AZ_IOT_ADU_CLIENT_AGENT_COMPONENT_NAME)));

  /* Fill the agent property name.  */
  _az_RETURN_IF_FAILED(az_json_writer_append_property_name(
      ref_json_writer, AZ_SPAN_FROM_STR(AZ_IOT_ADU_CLIENT_AGENT_PROPERTY_NAME_AGENT)));
  _az_RETURN_IF_FAILED(az_json_writer_append_begin_object(ref_json_writer));

  /* Fill the deviceProperties.  */
  _az_RETURN_IF_FAILED(az_json_writer_append_property_name(
      ref_json_writer, AZ_SPAN_FROM_STR(AZ_IOT_ADU_CLIENT_AGENT_PROPERTY_NAME_DEVICEPROPERTIES)));
  _az_RETURN_IF_FAILED(az_json_writer_append_begin_object(ref_json_writer));

  _az_RETURN_IF_FAILED(az_json_writer_append_property_name(
      ref_json_writer, AZ_SPAN_FROM_STR(AZ_IOT_ADU_CLIENT_AGENT_PROPERTY_NAME_MANUFACTURER)));
  _az_RETURN_IF_FAILED(
      az_json_writer_append_string(ref_json_writer, device_properties->manufacturer));

  _az_RETURN_IF_FAILED(az_json_writer_append_property_name(
      ref_json_writer, AZ_SPAN_FROM_STR(AZ_IOT_ADU_CLIENT_AGENT_PROPERTY_NAME_MODEL)));
  _az_RETURN_IF_FAILED(az_json_writer_append_string(ref_json_writer, device_properties->model));

  if (device_properties->custom_properties != NULL)
  {
    for (int32_t custom_property_index = 0;
         custom_property_index < device_properties->custom_properties->count;
         custom_property_index++)
    {
      _az_RETURN_IF_FAILED(az_json_writer_append_property_name(
          ref_json_writer, device_properties->custom_properties->names[custom_property_index]));
      _az_RETURN_IF_FAILED(az_json_writer_append_string(
          ref_json_writer, device_properties->custom_properties->values[custom_property_index]));
    }
  }

  _az_RETURN_IF_FAILED(az_json_writer_append_property_name(
      ref_json_writer, AZ_SPAN_FROM_STR(AZ_IOT_ADU_CLIENT_AGENT_PROPERTY_NAME_CONTRACT_MODEL_ID)));
  _az_RETURN_IF_FAILED(az_json_writer_append_string(
      ref_json_writer, AZ_SPAN_FROM_STR(AZ_IOT_ADU_CLIENT_AGENT_CONTRACT_MODEL_ID)));

  _az_RETURN_IF_FAILED(az_json_writer_append_property_name(
      ref_json_writer, AZ_SPAN_FROM_STR(AZ_IOT_ADU_CLIENT_AGENT_PROPERTY_NAME_ADU_VERSION)));
  _az_RETURN_IF_FAILED(
      az_json_writer_append_string(ref_json_writer, device_properties->adu_version));

  if (!az_span_is_content_equal(
          device_properties->delivery_optimization_agent_version, AZ_SPAN_EMPTY))
  {
    _az_RETURN_IF_FAILED(az_json_writer_append_property_name(
        ref_json_writer, AZ_SPAN_FROM_STR(AZ_IOT_ADU_CLIENT_AGENT_PROPERTY_NAME_DO_VERSION)));
    _az_RETURN_IF_FAILED(az_json_writer_append_string(
        ref_json_writer, device_properties->delivery_optimization_agent_version));
  }

  _az_RETURN_IF_FAILED(az_json_writer_append_end_object(ref_json_writer));

  /* Fill the compatibility property names. */
  _az_RETURN_IF_FAILED(az_json_writer_append_property_name(
      ref_json_writer,
      AZ_SPAN_FROM_STR(AZ_IOT_ADU_CLIENT_AGENT_PROPERTY_NAME_COMPAT_PROPERTY_NAMES)));
  _az_RETURN_IF_FAILED(az_json_writer_append_string(
      ref_json_writer, client->_internal.options.device_compatibility_properties));

  /* Add last installed update information */
  if (last_install_result != NULL)
  {
    _az_RETURN_IF_FAILED(az_json_writer_append_property_name(
        ref_json_writer,
        AZ_SPAN_FROM_STR(AZ_IOT_ADU_CLIENT_AGENT_PROPERTY_NAME_LAST_INSTALL_RESULT)));
    _az_RETURN_IF_FAILED(az_json_writer_append_begin_object(ref_json_writer));

    _az_RETURN_IF_FAILED(az_json_writer_append_property_name(
        ref_json_writer, AZ_SPAN_FROM_STR(AZ_IOT_ADU_CLIENT_AGENT_PROPERTY_NAME_RESULT_CODE)));
    _az_RETURN_IF_FAILED(
        az_json_writer_append_int32(ref_json_writer, last_install_result->result_code));

    _az_RETURN_IF_FAILED(az_json_writer_append_property_name(
        ref_json_writer,
        AZ_SPAN_FROM_STR(AZ_IOT_ADU_CLIENT_AGENT_PROPERTY_NAME_EXTENDED_RESULT_CODE)));
    _az_RETURN_IF_FAILED(
        az_json_writer_append_int32(ref_json_writer, last_install_result->extended_result_code));

    if (!az_span_is_content_equal(last_install_result->result_details, AZ_SPAN_EMPTY))
    {
      _az_RETURN_IF_FAILED(az_json_writer_append_property_name(
          ref_json_writer, AZ_SPAN_FROM_STR(AZ_IOT_ADU_CLIENT_AGENT_PROPERTY_NAME_RESULT_DETAILS)));
      _az_RETURN_IF_FAILED(
          az_json_writer_append_string(ref_json_writer, last_install_result->result_details));
    }

    _az_RETURN_IF_FAILED(az_json_writer_append_property_name(
        ref_json_writer, AZ_SPAN_FROM_STR(AZ_IOT_ADU_CLIENT_AGENT_PROPERTY_NAME_STEP_RESULTS)));
    _az_RETURN_IF_FAILED(az_json_writer_append_begin_object(ref_json_writer));

    for (int32_t i = 0; i < last_install_result->step_results_count; i++)
    {
      az_span step_id = AZ_SPAN_FROM_BUFFER(step_id_scratch_buffer);
      _az_RETURN_IF_FAILED(_generate_step_id(step_id, (uint32_t)i, &step_id));

      _az_RETURN_IF_FAILED(az_json_writer_append_property_name(ref_json_writer, step_id));
      _az_RETURN_IF_FAILED(az_json_writer_append_begin_object(ref_json_writer));

      _az_RETURN_IF_FAILED(az_json_writer_append_property_name(
          ref_json_writer, AZ_SPAN_FROM_STR(AZ_IOT_ADU_CLIENT_AGENT_PROPERTY_NAME_RESULT_CODE)));
      _az_RETURN_IF_FAILED(az_json_writer_append_int32(
          ref_json_writer, last_install_result->step_results[i].result_code));

      _az_RETURN_IF_FAILED(az_json_writer_append_property_name(
          ref_json_writer,
          AZ_SPAN_FROM_STR(AZ_IOT_ADU_CLIENT_AGENT_PROPERTY_NAME_EXTENDED_RESULT_CODE)));
      _az_RETURN_IF_FAILED(az_json_writer_append_int32(
          ref_json_writer, last_install_result->step_results[i].extended_result_code));

      if (!az_span_is_content_equal(
              last_install_result->step_results[i].result_details, AZ_SPAN_EMPTY))
      {
        _az_RETURN_IF_FAILED(az_json_writer_append_property_name(
            ref_json_writer,
            AZ_SPAN_FROM_STR(AZ_IOT_ADU_CLIENT_AGENT_PROPERTY_NAME_RESULT_DETAILS)));
        _az_RETURN_IF_FAILED(az_json_writer_append_string(
            ref_json_writer, last_install_result->step_results[i].result_details));
      }

      _az_RETURN_IF_FAILED(az_json_writer_append_end_object(ref_json_writer));
    }

    _az_RETURN_IF_FAILED(az_json_writer_append_end_object(ref_json_writer));
    _az_RETURN_IF_FAILED(az_json_writer_append_end_object(ref_json_writer));
  }

  /* Fill the agent state.   */
  _az_RETURN_IF_FAILED(az_json_writer_append_property_name(
      ref_json_writer, AZ_SPAN_FROM_STR(AZ_IOT_ADU_CLIENT_AGENT_PROPERTY_NAME_STATE)));
  _az_RETURN_IF_FAILED(az_json_writer_append_int32(ref_json_writer, (int32_t)agent_state));

  /* Fill the workflow.  */
  if (workflow != NULL && (az_span_ptr(workflow->id) != NULL && az_span_size(workflow->id) > 0))
  {
    _az_RETURN_IF_FAILED(az_json_writer_append_property_name(
        ref_json_writer, AZ_SPAN_FROM_STR(AZ_IOT_ADU_CLIENT_AGENT_PROPERTY_NAME_WORKFLOW)));
    _az_RETURN_IF_FAILED(az_json_writer_append_begin_object(ref_json_writer));

    _az_RETURN_IF_FAILED(az_json_writer_append_property_name(
        ref_json_writer, AZ_SPAN_FROM_STR(AZ_IOT_ADU_CLIENT_AGENT_PROPERTY_NAME_ACTION)));
    _az_RETURN_IF_FAILED(az_json_writer_append_int32(ref_json_writer, (int32_t)workflow->action));

    _az_RETURN_IF_FAILED(az_json_writer_append_property_name(
        ref_json_writer, AZ_SPAN_FROM_STR(AZ_IOT_ADU_CLIENT_AGENT_PROPERTY_NAME_ID)));
    _az_RETURN_IF_FAILED(az_json_writer_append_string(ref_json_writer, workflow->id));

    /* Append retry timestamp in workflow if existed.  */
    if (!az_span_is_content_equal(workflow->retry_timestamp, AZ_SPAN_EMPTY))
    {
      _az_RETURN_IF_FAILED(az_json_writer_append_property_name(
          ref_json_writer,
          AZ_SPAN_FROM_STR(AZ_IOT_ADU_CLIENT_AGENT_PROPERTY_NAME_RETRY_TIMESTAMP)));
      _az_RETURN_IF_FAILED(
          az_json_writer_append_string(ref_json_writer, workflow->retry_timestamp));
    }
    _az_RETURN_IF_FAILED(az_json_writer_append_end_object(ref_json_writer));
  }

  /* Fill installed update id. */
  _az_RETURN_IF_FAILED(az_json_writer_append_property_name(
      ref_json_writer,
      AZ_SPAN_FROM_STR(AZ_IOT_ADU_CLIENT_AGENT_PROPERTY_NAME_INSTALLED_UPDATE_ID)));
  _az_RETURN_IF_FAILED(az_json_writer_append_string(ref_json_writer, device_properties->update_id));

  _az_RETURN_IF_FAILED(az_json_writer_append_end_object(ref_json_writer));

  _az_RETURN_IF_FAILED(az_iot_hub_client_properties_writer_end_component(NULL, ref_json_writer));
  _az_RETURN_IF_FAILED(az_json_writer_append_end_object(ref_json_writer));

  return AZ_OK;
}