/** @file
  The internal header file includes the common header files, defines
  internal structure and functions used by DeferImageLoadLib.

Copyright (c) 2009 - 2013, 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.

**/

#ifndef __DEFER_IMAGE_LOAD_LIB_H__
#define __DEFER_IMAGE_LOAD_LIB_H__

#include <PiDxe.h>
#include <Library/UefiRuntimeServicesTableLib.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Library/SecurityManagementLib.h>
#include <Library/MemoryAllocationLib.h>
#include <Library/DevicePathLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/PrintLib.h>
#include <Library/DebugLib.h>
#include <Library/UefiLib.h>
#include <Library/PcdLib.h>

#include <Protocol/FirmwareVolume2.h>
#include <Protocol/BlockIo.h>
#include <Protocol/SimpleFileSystem.h>
#include <Protocol/DeferredImageLoad.h>
#include <Protocol/UserCredential.h>
#include <Protocol/UserManager.h>

#include <Guid/GlobalVariable.h>

//
// Image type definitions.
//
#define IMAGE_UNKNOWN                         0x00000001
#define IMAGE_FROM_FV                         0x00000002
#define IMAGE_FROM_OPTION_ROM                 0x00000004
#define IMAGE_FROM_REMOVABLE_MEDIA            0x00000008
#define IMAGE_FROM_FIXED_MEDIA                0x00000010

//
// The struct to save the deferred image information.
//
typedef struct {
  EFI_DEVICE_PATH_PROTOCOL          *ImageDevicePath;
  VOID                              *Image;
  UINTN                             ImageSize;
  BOOLEAN                           BootOption;
} DEFERRED_IMAGE_INFO;

//
// The table to save the deferred image item.
//
typedef struct {
  UINTN                             Count;         ///< deferred image count
  DEFERRED_IMAGE_INFO               *ImageInfo;    ///< deferred image item
} DEFERRED_IMAGE_TABLE;

/**
  Returns information about a deferred image.

  This function returns information about a single deferred image. The deferred images are 
  numbered consecutively, starting with 0.  If there is no image which corresponds to 
  ImageIndex, then EFI_NOT_FOUND is returned. All deferred images may be returned by 
  iteratively calling this function until EFI_NOT_FOUND is returned.
  Image may be NULL and ImageSize set to 0 if the decision to defer execution was made 
  because of the location of the executable image, rather than its actual contents.  

  @param[in]  This              Points to this instance of the EFI_DEFERRED_IMAGE_LOAD_PROTOCOL.
  @param[in]  ImageIndex        Zero-based index of the deferred index.
  @param[out] ImageDevicePath   On return, points to a pointer to the device path of the image. 
                                The device path should not be freed by the caller. 
  @param[out] Image             On return, points to the first byte of the image or NULL if the 
                                image is not available. The image should not be freed by the caller
                                unless LoadImage() has been called successfully.  
  @param[out] ImageSize         On return, the size of the image, or 0 if the image is not available.
  @param[out] BootOption        On return, points to TRUE if the image was intended as a boot option 
                                or FALSE if it was not intended as a boot option. 
 
  @retval EFI_SUCCESS           Image information returned successfully.
  @retval EFI_NOT_FOUND         ImageIndex does not refer to a valid image.
  @retval EFI_INVALID_PARAMETER ImageDevicePath is NULL or Image is NULL or ImageSize is NULL or 
                                BootOption is NULL.
  
**/
EFI_STATUS
EFIAPI
GetDefferedImageInfo (
  IN     EFI_DEFERRED_IMAGE_LOAD_PROTOCOL  *This,
  IN     UINTN                             ImageIndex,
     OUT EFI_DEVICE_PATH_PROTOCOL          **ImageDevicePath,
     OUT VOID                              **Image,
     OUT UINTN                             *ImageSize,
     OUT BOOLEAN                           *BootOption
  );
  
#endif
