/** @file
  This file defines the EDKII HTTP Callback Protocol interface.

  Copyright (c) 2021, Intel Corporation. All rights reserved.<BR>
  Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR>
  SPDX-License-Identifier: BSD-2-Clause-Patent
**/

#pragma once

#define EDKII_HTTP_CALLBACK_PROTOCOL_GUID \
  { \
    0x611114f1, 0xa37b, 0x4468, {0xa4, 0x36, 0x5b, 0xdd, 0xa1, 0x6a, 0xa2, 0x40} \
  }

typedef struct _EDKII_HTTP_CALLBACK_PROTOCOL EDKII_HTTP_CALLBACK_PROTOCOL;

///
/// EDKII_HTTP_CALLBACK_EVENT
///
typedef enum {
  ///
  /// The Status of DNS Event to retrieve the host address.
  /// EventStatus:
  /// EFI_SUCCESS             Operation succeeded.
  /// EFI_OUT_OF_RESOURCES    Failed to allocate needed resources.
  /// EFI_DEVICE_ERROR        An unexpected network error occurred.
  /// Others                  Other errors as indicated.
  ///
  HttpEventDns,

  ///
  /// The Status of Event to initiate a nonblocking TCP connection request.
  /// EventStatus:
  /// EFI_SUCCESS            The connection request is successfully initiated.
  /// EFI_NOT_STARTED        This EFI TCP Protocol instance has not been configured.
  /// EFI_DEVICE_ERROR       An unexpected system or network error occurred.
  /// Others                 Other errors as indicated.
  ///
  HttpEventConnectTcp,

  ///
  /// The Status of Event to connect one TLS session by finishing the TLS handshake process.
  /// EventStatus:
  /// EFI_SUCCESS            The TLS session is established.
  /// EFI_OUT_OF_RESOURCES   Can't allocate memory resources.
  /// EFI_ABORTED            TLS session state is incorrect.
  /// Others                 Other error as indicated.
  ///
  HttpEventTlsConnectSession,

  ///
  /// The Status of Event to initialize Http session
  /// EventStatus:
  /// EFI_SUCCESS            The initialization of session is done.
  /// Others                 Other error as indicated.
  ///
  HttpEventInitSession,

  ///
  /// The Status of Event to configure TLS configuration data.
  /// EventStatus:
  /// EFI_SUCCESS            The TLS is configured successfully with the default value.
  /// EFI_INVALID_PARAMETER  One or more input parameters to SetSessionData() is invalid.
  /// EFI_NOT_READY          Current TLS session state is NOT EfiTlsSessionStateNotStarted.
  /// EFI_NOT_FOUND          Fail to get 'HttpTlsCipherList' variable.
  /// Others                 Other error as indicated.
  ///
  HttpEventTlsConfigured
} EDKII_HTTP_CALLBACK_EVENT;

/**
  Callback function that is invoked when HTTP event occurs.

  @param[in]  This                Pointer to the EDKII_HTTP_CALLBACK_PROTOCOL instance.
  @param[in]  Event               The event that occurs in the current state.
  @param[in]  EventStatus         The Status of Event, EFI_SUCCESS or other errors.
**/
typedef
VOID
(EFIAPI *EDKII_HTTP_CALLBACK)(
  IN EDKII_HTTP_CALLBACK_PROTOCOL     *This,
  IN EDKII_HTTP_CALLBACK_EVENT        Event,
  IN EFI_STATUS                       EventStatus
  );

///
/// EFI HTTP Callback Protocol is invoked when HTTP event occurs.
///
struct _EDKII_HTTP_CALLBACK_PROTOCOL {
  EDKII_HTTP_CALLBACK    Callback;
};

extern EFI_GUID  gEdkiiHttpCallbackProtocolGuid;
