AZ_NODISCARD az_result az_iot_provisioning_client_get_user_name()

in sdk/src/azure/iot/az_iot_provisioning_client.c [77:127]


AZ_NODISCARD az_result az_iot_provisioning_client_get_user_name(
    az_iot_provisioning_client const* client,
    char* mqtt_user_name,
    size_t mqtt_user_name_size,
    size_t* out_mqtt_user_name_length)
{
  _az_PRECONDITION_NOT_NULL(client);
  _az_PRECONDITION_NOT_NULL(mqtt_user_name);
  _az_PRECONDITION(mqtt_user_name_size > 0);

  az_span provisioning_service_api_version
      = AZ_SPAN_LITERAL_FROM_STR("/api-version=" AZ_IOT_PROVISIONING_SERVICE_VERSION);
  az_span user_agent_version_prefix = AZ_SPAN_LITERAL_FROM_STR("&ClientVersion=");

  az_span mqtt_user_name_span
      = az_span_create((uint8_t*)mqtt_user_name, (int32_t)mqtt_user_name_size);

  const az_span* const user_agent = &(client->_internal.options.user_agent);
  az_span str_registrations = _az_iot_provisioning_get_str_registrations();

  int32_t required_length = az_span_size(client->_internal.id_scope)
      + az_span_size(str_registrations) + az_span_size(client->_internal.registration_id)
      + az_span_size(provisioning_service_api_version);
  if (az_span_size(*user_agent) > 0)
  {
    required_length += az_span_size(user_agent_version_prefix) + az_span_size(*user_agent);
  }

  _az_RETURN_IF_NOT_ENOUGH_SIZE(
      mqtt_user_name_span, required_length + (int32_t)sizeof((uint8_t)'\0'));

  az_span remainder = az_span_copy(mqtt_user_name_span, client->_internal.id_scope);
  remainder = az_span_copy(remainder, str_registrations);
  remainder = az_span_copy(remainder, client->_internal.registration_id);
  remainder = az_span_copy(remainder, provisioning_service_api_version);

  if (az_span_size(*user_agent) > 0)
  {
    remainder = az_span_copy(remainder, user_agent_version_prefix);
    remainder = az_span_copy(remainder, *user_agent);
  }

  az_span_copy_u8(remainder, '\0');

  if (out_mqtt_user_name_length)
  {
    *out_mqtt_user_name_length = (size_t)required_length;
  }

  return AZ_OK;
}