/** @file
  If a GUID-defined section is encountered when doing section extraction,
  the PEI Foundation or the EFI_PEI_FILE_LOADER_PPI instance
  calls the appropriate instance of the GUIDed Section Extraction PPI
  to extract the section stream contained therein.

  Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
  SPDX-License-Identifier: BSD-2-Clause-Patent

  @par Revision Reference:
  This PPI is introduced in PI Version 1.0.

**/

#pragma once

//
// Typically, protocol interface structures are identified
// by associating them with a GUID. Each instance of
// a protocol with a given GUID must have
// the same interface structure. While all instances of
// the GUIDed Section Extraction PPI must have
// the same interface structure, they do not all have
// te same GUID. The GUID that is associated with
// an instance of the GUIDed Section Extraction Protocol
// is used to correlate it with the GUIDed section type
// that it is intended to process.
//

typedef struct _EFI_PEI_GUIDED_SECTION_EXTRACTION_PPI EFI_PEI_GUIDED_SECTION_EXTRACTION_PPI;

/**
  Processes the input section and returns the data contained therein
  along with the authentication status.

  The ExtractSection() function processes the input section and
  returns a pointer to the section contents. If the section being
  extracted does not require processing (if the section
  GuidedSectionHeader.Attributes has the
  EFI_GUIDED_SECTION_PROCESSING_REQUIRED field cleared), then
  OutputBuffer is just updated to point to the start of the
  section's contents. Otherwise, *Buffer must be allocated
  from PEI permanent memory.

  @param This                   Indicates the EFI_PEI_GUIDED_SECTION_EXTRACTION_PPI
                                instance.
  @param InputSection           Buffer containing the input GUIDed section to be
                                processed.
  @param OutputBuffer           *OutputBuffer is allocated from PEI permanent memory
                                and contains the new section stream.
  @param OutputSize             A pointer to a caller-allocated UINTN in which
                                the size of *OutputBuffer allocation is stored.
                                If the function returns anything other than
                                EFI_SUCCESS, the value of *OutputSize is undefined.
  @param AuthenticationStatus   A pointer to a caller-allocated UINT32 that indicates
                                the authentication status of the output buffer.
                                If the input section's
                                GuidedSectionHeader.Attributes field has the
                                EFI_GUIDED_SECTION_AUTH_STATUS_VALID bit as clear,
                                *AuthenticationStatus must return zero. These bits
                                reflect the status of the extraction operation.
                                If the function returns anything other than EFI_SUCCESS,
                                the value of *AuthenticationStatus is undefined.

  @retval EFI_SUCCESS           The InputSection was successfully processed and the
                                section contents were returned.
  @retval EFI_OUT_OF_RESOURCES  The system has insufficient resources to process the request.
  @retval EFI_INVALID_PARAMETER The GUID in InputSection does not match this instance of the
                                GUIDed Section Extraction PPI.
**/
typedef
EFI_STATUS
(EFIAPI *EFI_PEI_EXTRACT_GUIDED_SECTION)(
  IN  CONST  EFI_PEI_GUIDED_SECTION_EXTRACTION_PPI *This,
  IN  CONST  VOID                                  *InputSection,
  OUT VOID                                         **OutputBuffer,
  OUT UINTN                                        *OutputSize,
  OUT UINT32                                       *AuthenticationStatus
  );

///
/// If a GUID-defined section is encountered when doing section extraction,
/// the PEI Foundation or the EFI_PEI_FILE_LOADER_PPI instance
/// calls the appropriate instance of the GUIDed Section
/// Extraction PPI to extract the section stream contained
/// therein.
///
struct _EFI_PEI_GUIDED_SECTION_EXTRACTION_PPI {
  EFI_PEI_EXTRACT_GUIDED_SECTION    ExtractSection;
};
