/** @file
  Definitinos of RedfishContentCodingLib.

  (C) Copyright 2021 Hewlett Packard Enterprise Development LP<BR>

  SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#pragma once

/**
  This is the function to encode the content use the
  algorithm indicated in ContentEncodedValue. The naming of
  ContentEncodedValue is follow HTTP spec or could be a
  platform-specific value.

  @param[in]   ContentEncodedValue   HTTP conent encoded value.
                                     The value could be one of below
                                     or any which is platform-specific.
                                       - HTTP_CONTENT_ENCODING_IDENTITY "identity"
                                       - HTTP_CONTENT_ENCODING_GZIP     "gzip"
                                       - HTTP_CONTENT_ENCODING_COMPRESS "compress"
                                       - HTTP_CONTENT_ENCODING_DEFLATE  "deflate"
                                       - HTTP_CONTENT_ENCODING_BROTLI   "br"
  @param[in]   OriginalContent       Original content.
  @param[in]   OriginalContentLength The length of original content.
  @param[out]  EncodedContentPointer Pointer to receive the encoded content pointer.
  @param[out]  EncodedContentLength  Length of encoded content.

  @retval EFI_SUCCESS              Content is encoded successfully.
  @retval EFI_UNSUPPORTED          No supported encoding funciton,
  @retval EFI_INVALID_PARAMETER    One of the given parameter is invalid.

**/

EFI_STATUS
RedfishContentEncode  (
  IN CHAR8   *ContentEncodedValue,
  IN CHAR8   *OriginalContent,
  IN UINTN   OriginalContentLength,
  OUT VOID   **EncodedContentPointer,
  OUT UINTN  *EncodedLength
  );

/**
  This is the function to decode the content use the
  algorithm indicated in ContentEncodedValue. The naming of
  ContentEncodedValue is follow HTTP spec or could be a
  platform-specific value.

  @param[in]   ContentDecodedValue   HTTP conent decoded value.
                                     The value could be one of below
                                     or any which is platform-specific.
                                       - HTTP_CONTENT_ENCODING_IDENTITY "identity"
                                       - HTTP_CONTENT_ENCODING_GZIP     "gzip"
                                       - HTTP_CONTENT_ENCODING_COMPRESS "compress"
                                       - HTTP_CONTENT_ENCODING_DEFLATE  "deflate"
                                       - HTTP_CONTENT_ENCODING_BROTLI   "br"
  @param[in]   ContentPointer        Original content.
  @param[in]   ContentLength         The length of original content.
  @param[out]  DecodedContentPointer Pointer to receive decoded content pointer.
  @param[out]  DecodedContentLength  Length of decoded content.

  @retval EFI_SUCCESS              Content is decoded successfully.
  @retval EFI_UNSUPPORTED          No supported decoding funciton,
  @retval EFI_INVALID_PARAMETER    One of the given parameter is invalid.

**/
EFI_STATUS
RedfishContentDecode (
  IN CHAR8   *ContentEncodedValue,
  IN VOID    *ContentPointer,
  IN UINTN   ContentLength,
  OUT VOID   **DecodedContentPointer,
  OUT UINTN  *DecodedLength
  );
