// Copyright 2017 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

/* DO NOT EDIT. Generated from components/cronet/native/generated/cronet.idl */

#ifndef COMPONENTS_CRONET_NATIVE_GENERATED_CRONET_IDL_IMPL_STRUCT_H_
#define COMPONENTS_CRONET_NATIVE_GENERATED_CRONET_IDL_IMPL_STRUCT_H_

#include "components/cronet/native/generated/cronet.idl_c.h"

#include <memory>
#include <string>
#include <vector>

#include "third_party/abseil-cpp/absl/types/optional.h"

// Struct Cronet_Error.
struct Cronet_Error {
 public:
  Cronet_Error();
  explicit Cronet_Error(const Cronet_Error& from);

  Cronet_Error& operator=(const Cronet_Error&) = delete;

  explicit Cronet_Error(Cronet_Error&& from);

  ~Cronet_Error();

  Cronet_Error_ERROR_CODE error_code = Cronet_Error_ERROR_CODE_ERROR_CALLBACK;
  std::string message;
  int32_t internal_error_code = 0;
  bool immediately_retryable = false;
  int32_t quic_detailed_error_code = 0;
};

// Struct Cronet_QuicHint.
struct Cronet_QuicHint {
 public:
  Cronet_QuicHint();
  explicit Cronet_QuicHint(const Cronet_QuicHint& from);

  Cronet_QuicHint& operator=(const Cronet_QuicHint&) = delete;

  explicit Cronet_QuicHint(Cronet_QuicHint&& from);

  ~Cronet_QuicHint();

  std::string host;
  int32_t port = 0;
  int32_t alternate_port = 0;
};

// Struct Cronet_PublicKeyPins.
struct Cronet_PublicKeyPins {
 public:
  Cronet_PublicKeyPins();
  explicit Cronet_PublicKeyPins(const Cronet_PublicKeyPins& from);

  Cronet_PublicKeyPins& operator=(const Cronet_PublicKeyPins&) = delete;

  explicit Cronet_PublicKeyPins(Cronet_PublicKeyPins&& from);

  ~Cronet_PublicKeyPins();

  std::string host;
  std::vector<std::string> pins_sha256;
  bool include_subdomains = false;
  int64_t expiration_date = 0;
};

// Struct Cronet_EngineParams.
struct Cronet_EngineParams {
 public:
  Cronet_EngineParams();
  explicit Cronet_EngineParams(const Cronet_EngineParams& from);

  Cronet_EngineParams& operator=(const Cronet_EngineParams&) = delete;

  explicit Cronet_EngineParams(Cronet_EngineParams&& from);

  ~Cronet_EngineParams();

  bool enable_check_result = true;
  std::string user_agent;
  std::string accept_language;
  std::string storage_path;
  bool enable_quic = true;
  bool enable_http2 = true;
  bool enable_brotli = true;
  Cronet_EngineParams_HTTP_CACHE_MODE http_cache_mode =
      Cronet_EngineParams_HTTP_CACHE_MODE_DISABLED;
  int64_t http_cache_max_size = 0;
  std::vector<Cronet_QuicHint> quic_hints;
  std::vector<Cronet_PublicKeyPins> public_key_pins;
  bool enable_public_key_pinning_bypass_for_local_trust_anchors = true;
  double network_thread_priority = std::numeric_limits<double>::quiet_NaN();
  std::string experimental_options;
};

// Struct Cronet_HttpHeader.
struct Cronet_HttpHeader {
 public:
  Cronet_HttpHeader();
  explicit Cronet_HttpHeader(const Cronet_HttpHeader& from);

  Cronet_HttpHeader& operator=(const Cronet_HttpHeader&) = delete;

  explicit Cronet_HttpHeader(Cronet_HttpHeader&& from);

  ~Cronet_HttpHeader();

  std::string name;
  std::string value;
};

// Struct Cronet_UrlResponseInfo.
struct Cronet_UrlResponseInfo {
 public:
  Cronet_UrlResponseInfo();
  explicit Cronet_UrlResponseInfo(const Cronet_UrlResponseInfo& from);

  Cronet_UrlResponseInfo& operator=(const Cronet_UrlResponseInfo&) = delete;

  explicit Cronet_UrlResponseInfo(Cronet_UrlResponseInfo&& from);

  ~Cronet_UrlResponseInfo();

  std::string url;
  std::vector<std::string> url_chain;
  int32_t http_status_code = 0;
  std::string http_status_text;
  std::vector<Cronet_HttpHeader> all_headers_list;
  bool was_cached = false;
  std::string negotiated_protocol;
  std::string proxy_server;
  int64_t received_byte_count = 0;
};

// Struct Cronet_UrlRequestParams.
struct Cronet_UrlRequestParams {
 public:
  Cronet_UrlRequestParams();
  explicit Cronet_UrlRequestParams(const Cronet_UrlRequestParams& from);

  Cronet_UrlRequestParams& operator=(const Cronet_UrlRequestParams&) = delete;

  explicit Cronet_UrlRequestParams(Cronet_UrlRequestParams&& from);

  ~Cronet_UrlRequestParams();

  std::string http_method;
  std::vector<Cronet_HttpHeader> request_headers;
  bool disable_cache = false;
  Cronet_UrlRequestParams_REQUEST_PRIORITY priority =
      Cronet_UrlRequestParams_REQUEST_PRIORITY_REQUEST_PRIORITY_MEDIUM;
  Cronet_UploadDataProviderPtr upload_data_provider = nullptr;
  Cronet_ExecutorPtr upload_data_provider_executor = nullptr;
  bool allow_direct_executor = false;
  std::vector<Cronet_RawDataPtr> annotations;
  Cronet_RequestFinishedInfoListenerPtr request_finished_listener = nullptr;
  Cronet_ExecutorPtr request_finished_executor = nullptr;
  Cronet_UrlRequestParams_IDEMPOTENCY idempotency =
      Cronet_UrlRequestParams_IDEMPOTENCY_DEFAULT_IDEMPOTENCY;
};

// Struct Cronet_DateTime.
struct Cronet_DateTime {
 public:
  Cronet_DateTime();
  explicit Cronet_DateTime(const Cronet_DateTime& from);

  Cronet_DateTime& operator=(const Cronet_DateTime&) = delete;

  explicit Cronet_DateTime(Cronet_DateTime&& from);

  ~Cronet_DateTime();

  int64_t value = 0;
};

// Struct Cronet_Metrics.
struct Cronet_Metrics {
 public:
  Cronet_Metrics();
  explicit Cronet_Metrics(const Cronet_Metrics& from);

  Cronet_Metrics& operator=(const Cronet_Metrics&) = delete;

  explicit Cronet_Metrics(Cronet_Metrics&& from);

  ~Cronet_Metrics();

  absl::optional<Cronet_DateTime> request_start;
  absl::optional<Cronet_DateTime> dns_start;
  absl::optional<Cronet_DateTime> dns_end;
  absl::optional<Cronet_DateTime> connect_start;
  absl::optional<Cronet_DateTime> connect_end;
  absl::optional<Cronet_DateTime> ssl_start;
  absl::optional<Cronet_DateTime> ssl_end;
  absl::optional<Cronet_DateTime> sending_start;
  absl::optional<Cronet_DateTime> sending_end;
  absl::optional<Cronet_DateTime> push_start;
  absl::optional<Cronet_DateTime> push_end;
  absl::optional<Cronet_DateTime> response_start;
  absl::optional<Cronet_DateTime> request_end;
  bool socket_reused = false;
  int64_t sent_byte_count = -1;
  int64_t received_byte_count = -1;
};

// Struct Cronet_RequestFinishedInfo.
struct Cronet_RequestFinishedInfo {
 public:
  Cronet_RequestFinishedInfo();
  explicit Cronet_RequestFinishedInfo(const Cronet_RequestFinishedInfo& from);

  Cronet_RequestFinishedInfo& operator=(const Cronet_RequestFinishedInfo&) =
      delete;

  explicit Cronet_RequestFinishedInfo(Cronet_RequestFinishedInfo&& from);

  ~Cronet_RequestFinishedInfo();

  absl::optional<Cronet_Metrics> metrics;
  std::vector<Cronet_RawDataPtr> annotations;
  Cronet_RequestFinishedInfo_FINISHED_REASON finished_reason =
      Cronet_RequestFinishedInfo_FINISHED_REASON_SUCCEEDED;
};

#endif  // COMPONENTS_CRONET_NATIVE_GENERATED_CRONET_IDL_IMPL_STRUCT_H_
