/** @file
  Include file for platform variable cleanup.

Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#ifndef _PLAT_VAR_CLEANUP_
#define _PLAT_VAR_CLEANUP_

#include <Library/UefiBootServicesTableLib.h>
#include <Library/UefiRuntimeServicesTableLib.h>
#include <Library/BaseLib.h>
#include <Library/DebugLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/PrintLib.h>
#include <Library/MemoryAllocationLib.h>
#include <Library/HiiLib.h>
#include <Library/PlatformVarCleanupLib.h>

#include <Protocol/Variable.h>
#include <Protocol/VarCheck.h>
#include <Protocol/FormBrowser2.h>
#include <Protocol/HiiConfigAccess.h>
#include <Protocol/HiiConfigRouting.h>
#include <Protocol/DevicePath.h>

#include <Guid/EventGroup.h>
#include <Guid/MdeModuleHii.h>
#include <Guid/ImageAuthentication.h>
#include <Guid/VarErrorFlag.h>

#include "PlatVarCleanupHii.h"

//
// This is the generated IFR binary data for each formset defined in VFR.
// This data array is ready to be used as input of HiiAddPackages() to
// create a packagelist (which contains Form packages, String packages, etc).
//
extern UINT8  PlatVarCleanupBin[];

//
// This is the generated String package data for all .UNI files.
// This data array is ready to be used as input of HiiAddPackages() to
// create a packagelist (which contains Form packages, String packages, etc).
//
extern UINT8  PlatformVarCleanupLibStrings[];

#define USER_VARIABLE_NODE_SIGNATURE  SIGNATURE_32 ('U', 'V', 'N', 'S')

typedef struct {
  UINTN         Signature;
  LIST_ENTRY    Link;
  EFI_GUID      Guid;
  CHAR16        *PromptString;
  LIST_ENTRY    NameLink;
} USER_VARIABLE_NODE;

#define USER_VARIABLE_FROM_LINK(a)  CR (a, USER_VARIABLE_NODE, Link, USER_VARIABLE_NODE_SIGNATURE)

#define USER_VARIABLE_NAME_NODE_SIGNATURE  SIGNATURE_32 ('U', 'V', 'N', 'N')

typedef struct {
  UINTN              Signature;
  LIST_ENTRY         Link;
  CHAR16             *Name;
  UINTN              DataSize;
  UINT32             Attributes;
  UINT16             Index;
  EFI_QUESTION_ID    QuestionId;
  CHAR16             *PromptString;
  CHAR16             *HelpString;
  BOOLEAN            Deleted;
} USER_VARIABLE_NAME_NODE;

#define USER_VARIABLE_NAME_FROM_LINK(a)  CR (a, USER_VARIABLE_NAME_NODE, Link, USER_VARIABLE_NAME_NODE_SIGNATURE)

#pragma pack(1)
//
// HII specific Vendor Device Path definition.
//
typedef struct {
  VENDOR_DEVICE_PATH          VendorDevicePath;
  EFI_DEVICE_PATH_PROTOCOL    End;
} HII_VENDOR_DEVICE_PATH;
#pragma pack()

#define VARIABLE_CLEANUP_HII_PRIVATE_SIGNATURE  SIGNATURE_32 ('V', 'C', 'H', 'P')

typedef struct {
  UINTN                              Signature;
  EFI_HANDLE                         DriverHandle;
  EFI_HII_HANDLE                     HiiHandle;
  EFI_HII_CONFIG_ACCESS_PROTOCOL     ConfigAccess;
  EFI_HII_CONFIG_ROUTING_PROTOCOL    *ConfigRouting;
  VARIABLE_CLEANUP_DATA              VariableCleanupData;
} VARIABLE_CLEANUP_HII_PRIVATE_DATA;

#define VARIABLE_CLEANUP_HII_PRIVATE_FROM_THIS(a)  CR (a, VARIABLE_CLEANUP_HII_PRIVATE_DATA, ConfigAccess, VARIABLE_CLEANUP_HII_PRIVATE_SIGNATURE)

#endif
