/** @file
  This file defines the EFI REST Protocol interface.

  Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
  This program and the accompanying materials
  are licensed and made available under the terms and conditions of the BSD License
  which accompanies this distribution. The full text of the license may be found at
  http://opensource.org/licenses/bsd-license.php

  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.

  @par Revision Reference:
  This Protocol is introduced in UEFI Specification 2.5

**/

#ifndef __EFI_REST_PROTOCOL_H__
#define __EFI_REST_PROTOCOL_H__

#include <Protocol/Http.h>

#define EFI_REST_PROTOCOL_GUID \
  { \
    0x0db48a36, 0x4e54, 0xea9c, {0x9b, 0x09, 0x1e, 0xa5, 0xbe, 0x3a, 0x66, 0x0b } \
  }

typedef struct _EFI_REST_PROTOCOL EFI_REST_PROTOCOL;

/**
  Provides a simple HTTP-like interface to send and receive resources from a REST
  service.

  The SendReceive() function sends an HTTP request to this REST service, and returns a
  response when the data is retrieved from the service. RequestMessage contains the HTTP
  request to the REST resource identified by RequestMessage.Request.Url. The
  ResponseMessage is the returned HTTP response for that request, including any HTTP
  status.

  @param[in]  This                Pointer to EFI_REST_PROTOCOL instance for a particular
                                  REST service.
  @param[in]  RequestMessage      Pointer to the HTTP request data for this resource.
  @param[out] ResponseMessage     Pointer to the HTTP response data obtained for this
                                  requested.

  @retval EFI_SUCCESS             Operation succeeded.
  @retval EFI_INVALID_PARAMETER   This, RequestMessage, or ResponseMessage are NULL.
  @retval EFI_DEVICE_ERROR        An unexpected system or network error occurred.
**/
typedef
EFI_STATUS
(EFIAPI *EFI_REST_SEND_RECEIVE) (
  IN  EFI_REST_PROTOCOL         *This,
  IN  EFI_HTTP_MESSAGE          *RequestMessage,
  OUT EFI_HTTP_MESSAGE          *ResponseMessage
  );

/**
  The GetServiceTime() function is an optional interface to obtain the current time from
  this REST service instance. If this REST service does not support retrieving the time,
  this function returns EFI_UNSUPPORTED.

  @param[in]  This                Pointer to EFI_REST_PROTOCOL instance.
  @param[out] Time                A pointer to storage to receive a snapshot of the
                                  current time of the REST service.

  @retval EFI_SUCCESS             Operation succeeded
  @retval EFI_INVALID_PARAMETER   This or Time are NULL.
  @retval EFI_UNSUPPORTED         The RESTful service does not support returning the
                                  time.
  @retval EFI_DEVICE_ERROR        An unexpected system or network error occurred.
**/
typedef
EFI_STATUS
(EFIAPI *EFI_REST_GET_TIME) (
  IN  EFI_REST_PROTOCOL         *This,
  OUT EFI_TIME                  *Time
  );

///
/// The EFI REST protocol is designed to be used by EFI drivers and applications to send
/// and receive resources from a RESTful service. This protocol abstracts REST
/// (Representational State Transfer) client functionality. This EFI protocol could be
/// implemented to use an underlying EFI HTTP protocol, or it could rely on other
/// interfaces that abstract HTTP access to the resources.
///
struct _EFI_REST_PROTOCOL {
  EFI_REST_SEND_RECEIVE         SendReceive;
  EFI_REST_GET_TIME             GetServiceTime;
};

extern EFI_GUID gEfiRestProtocolGuid;

#endif
