/** @file
  Definitions of RedfishPlatformConfigLib.

  Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
  (C) Copyright 2021 Hewlett Packard Enterprise Development LP<BR>
  Copyright (c) 2022-2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.

  SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#pragma once

#include <Protocol/DisplayProtocol.h>
#include <Protocol/HiiConfigAccess.h>

//
// IFR relative definition
//
#define EFI_HII_EXPRESSION_INCONSISTENT_IF  0
#define EFI_HII_EXPRESSION_NO_SUBMIT_IF     1
#define EFI_HII_EXPRESSION_GRAY_OUT_IF      2
#define EFI_HII_EXPRESSION_SUPPRESS_IF      3
#define EFI_HII_EXPRESSION_DISABLE_IF       4
#define EFI_HII_EXPRESSION_VALUE            5
#define EFI_HII_EXPRESSION_RULE             6
#define EFI_HII_EXPRESSION_READ             7
#define EFI_HII_EXPRESSION_WRITE            8
#define EFI_HII_EXPRESSION_WARNING_IF       9

#define EFI_HII_VARSTORE_BUFFER               0
#define EFI_HII_VARSTORE_NAME_VALUE           1
#define EFI_HII_VARSTORE_EFI_VARIABLE         2   // EFI Varstore type follow UEFI spec before 2.3.1.
#define EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER  3   // EFI varstore type follow UEFI spec 2.3.1 and later.

///
/// HII_NAME_VALUE_NODE for name/value storage
///
typedef struct {
  UINTN         Signature;
  LIST_ENTRY    Link;
  CHAR16        *Name;
  CHAR16        *Value;
} HII_NAME_VALUE_NODE;

#define HII_NAME_VALUE_NODE_SIGNATURE  SIGNATURE_32 ('N', 'V', 'S', 'T')
#define HII_NAME_VALUE_NODE_FROM_LINK(a)  CR (a, HII_NAME_VALUE_NODE, Link, HII_NAME_VALUE_NODE_SIGNATURE)

///
/// Storage info
///
typedef union {
  EFI_STRING_ID    VarName;
  UINT16           VarOffset;
} HII_VAR_STORE_INFO;

///
/// FormSet storage
///
typedef struct {
  UINTN             Signature;
  LIST_ENTRY        Link;

  UINT8             Type;          ///< Storage type
  EFI_HII_HANDLE    HiiHandle;     ///< HiiHandle for this varstore.

  ///
  /// For all type of storages.
  ///
  UINT16            VarStoreId;    ///< VarStore ID.
  EFI_GUID          Guid;          ///< VarStore Guid.

  ///
  /// For EFI_IFR_VARSTORE, EFI_IFR_VARSTORE_EFI
  ///
  CHAR16            *Name;         ///< VarStore name
  UINT16            Size;          ///< VarStore size.
  UINT8             *Buffer;       ///< Buffer storage.
  UINT8             *EditBuffer;   ///< Edit copy for Buffer Storage

  ///
  /// For EFI_IFR_VARSTORE_EFI: EFI Variable.
  ///
  UINT32            Attributes;

  ///
  /// For EFI_IFR_VARSTORE_NAME_VALUE.
  ///
  LIST_ENTRY        NameValueList;  ///< List of NAME_VALUE_NODE

  CHAR16            *ConfigHdr;     ///< <ConfigHdr>
  CHAR16            *ConfigRequest; ///< <ConfigRequest> = <ConfigHdr> + <RequestElement>
  UINTN             ElementCount;   ///< Number of <RequestElement> in the <ConfigRequest>
  UINTN             SpareStrLen;    ///< Spare length of ConfigRequest string buffer
} HII_FORMSET_STORAGE;

#define HII_STORAGE_SIGNATURE  SIGNATURE_32 ('B', 'S', 'T', 'G')
#define HII_STORAGE_FROM_LINK(a)  CR (a, HII_FORMSET_STORAGE, Link, HII_STORAGE_SIGNATURE)

///
/// Definition of EXPRESS_RESULT
///
typedef enum {
  ExpressFalse = 0,
  ExpressGrayOut,
  ExpressSuppress,
  ExpressDisable
} EXPRESS_RESULT;

///
/// Definition of EXPRESS_LEVEL
///
typedef enum {
  ExpressNone = 0,
  ExpressForm,
  ExpressStatement,
  ExpressOption
} EXPRESS_LEVEL;

///
/// Definition of HII_EXPRESSION_OPCODE_EXTRA
///
typedef union {
  EFI_HII_VALUE    Value;         ///< EFI_IFR_UINT64, EFI_IFR_UINT32, EFI_IFR_UINT16, EFI_IFR_UINT8, EFI_IFR_STRING_REF1
  UINT8            Format;        ///< For EFI_IFR_TO_STRING, EFI_IFR_FIND
  UINT8            Flags;         ///< For EFI_IFR_SPAN
  UINT8            RuleId;        ///< For EFI_IFR_RULE_REF
  EFI_GUID         Guid;          ///< For EFI_IFR_SECURITY, EFI_IFR_MATCH2

  struct {
    EFI_QUESTION_ID    QuestionId;
    EFI_HII_VALUE      Value;
  } EqIdValData;

  struct {
    EFI_QUESTION_ID    QuestionId1;
    EFI_QUESTION_ID    QuestionId2;
  } EqIdIdData;

  struct {
    EFI_QUESTION_ID    QuestionId; ///< For EFI_IFR_EQ_ID_VAL_LIST
    UINT16             ListLength;
    UINT16             *ValueList;
  } EqIdListData;

  struct {
    EFI_QUESTION_ID    QuestionId;
  } QuestionRef1Data;

  struct {
    EFI_STRING_ID    DevicePath;  ///< For EFI_IFR_QUESTION_REF3_3
    EFI_GUID         Guid;
  } QuestionRef3Data;

  struct {
    HII_FORMSET_STORAGE    *VarStorage;
    HII_VAR_STORE_INFO     VarStoreInfo;
    UINT8                  ValueType;
    UINT8                  ValueWidth;
    CHAR16                 *ValueName;
  } GetSetData;
} HII_EXPRESSION_OPCODE_EXTRA;

typedef union _HII_DEPENDENCY_EXPRESSION HII_DEPENDENCY_EXPRESSION;

///
/// Definition of HII_EXPRESSION_CONSTANT
///
/// Operand:
///
/// EFI_IFR_TRUE
/// EFI_IFR_FALSE
/// EFI_IFR_ONE
/// EFI_IFR_ONES
/// EFI_IFR_ZERO
/// EFI_IFR_UNDEFINED
/// EFI_IFR_VERSION
/// EFI_IFR_UINT8
/// EFI_IFR_UINT16
/// EFI_IFR_UINT32
/// EFI_IFR_UINT64
///
typedef struct {
  UINT8            Operand;
  EFI_HII_VALUE    Value;
} HII_EXPRESSION_CONSTANT;

///
/// Definition of HII_DEPENDENCY_DUP
///
typedef struct {
  UINT8    Operand;
} HII_DEPENDENCY_DUP;

///
/// Definition of HII_DEPENDENCY_EQ_ID_VAL
///
typedef struct {
  UINT8              Operand;
  EFI_QUESTION_ID    QuestionId;
  EFI_HII_VALUE      Value;
} HII_DEPENDENCY_EQ_ID_VAL;

///
/// Definition of HII_DEPENDENCY_EQ_ID_VAL
///
typedef struct {
  UINT8              Operand;
  EFI_QUESTION_ID    QuestionId1;
  EFI_QUESTION_ID    QuestionId2;
} HII_DEPENDENCY_EQ_ID_ID;

///
/// Definition of HII_DEPENDENCY_EQ_ID_VAL_LIST
///
typedef struct {
  UINT8              Operand;
  EFI_QUESTION_ID    QuestionId;
  UINT16             ListLength;
  UINT16             *ValueList;
} HII_DEPENDENCY_EQ_ID_VAL_LIST;

///
/// Definition of HII_DEPENDENCY_QUESTION_REF1
///
typedef struct {
  UINT8              Operand;
  EFI_QUESTION_ID    QuestionId;
} HII_DEPENDENCY_QUESTION_REF1;

///
/// Definition of HII_DEPENDENCY_RULE_REF
///
typedef struct {
  UINT8    Operand;
  UINT8    RuleId;
} HII_DEPENDENCY_RULE_REF;

///
/// Definition of HII_DEPENDENCY_STRING_REF1
///
typedef struct {
  UINT8            Operand;
  EFI_HII_VALUE    Value;
} HII_DEPENDENCY_STRING_REF1;

///
/// Definition of HII_DEPENDENCY_THIS
///
typedef struct {
  UINT8              Operand;
  EFI_QUESTION_ID    QuestionId;
} HII_DEPENDENCY_THIS;

///
/// Definition of HII_DEPENDENCY_SECURITY
///
typedef struct {
  UINT8       Operand;
  EFI_GUID    Permissions;
} HII_DEPENDENCY_SECURITY;

///
/// Definition of HII_DEPENDENCY_GET
///
typedef struct  {
  UINT8                  Operand;
  HII_FORMSET_STORAGE    *VarStorage;
  HII_VAR_STORE_INFO     VarStoreInfo;
  UINT8                  ValueType;
  UINT8                  ValueWidth;
  CHAR16                 *ValueName;
} HII_DEPENDENCY_GET;

///
/// Definition of HII_DEPENDENCY_LENGTH
///
typedef struct  {
  UINT8                        Operand;
  HII_DEPENDENCY_EXPRESSION    *SubExpression;
} HII_DEPENDENCY_LENGTH;

///
/// Definition of HII_DEPENDENCY_BITWISE_NOT
///
typedef struct  {
  UINT8                        Operand;
  HII_DEPENDENCY_EXPRESSION    *SubExpression;
} HII_DEPENDENCY_BITWISE_NOT;

///
/// Definition of HII_DEPENDENCY_STRING_REF2
///
typedef struct  {
  UINT8                        Operand;
  HII_DEPENDENCY_EXPRESSION    *SubExpression;
} HII_DEPENDENCY_STRING_REF2;

///
/// Definition of HII_DEPENDENCY_QUESTION_REF2
///
typedef struct  {
  UINT8                        Operand;
  HII_DEPENDENCY_EXPRESSION    *SubExpression;
} HII_DEPENDENCY_QUESTION_REF2;

///
/// Definition of HII_DEPENDENCY_QUESTION_REF3
///
typedef struct  {
  UINT8                        Operand;
  EFI_STRING_ID                DevicePath;
  EFI_GUID                     Guid;
  HII_DEPENDENCY_EXPRESSION    *SubExpression;
} HII_DEPENDENCY_QUESTION_REF3;

///
/// Definition of HII_DEPENDENCY_TO_BOOLEAN
///
typedef struct  {
  UINT8                        Operand;
  HII_DEPENDENCY_EXPRESSION    *SubExpression;
} HII_DEPENDENCY_TO_BOOLEAN;

///
/// Definition of HII_DEPENDENCY_TO_STRING
///
typedef struct  {
  UINT8                        Operand;
  UINT8                        Format;
  HII_DEPENDENCY_EXPRESSION    *SubExpression;
} HII_DEPENDENCY_TO_STRING;

///
/// Definition of HII_DEPENDENCY_TO_UINT
///
typedef struct  {
  UINT8                        Operand;
  HII_DEPENDENCY_EXPRESSION    *SubExpression;
} HII_DEPENDENCY_TO_UINT;

///
/// Definition of HII_DEPENDENCY_TO_UPPER
///
typedef struct  {
  UINT8                        Operand;
  HII_DEPENDENCY_EXPRESSION    *SubExpression;
} HII_DEPENDENCY_TO_UPPER;

///
/// Definition of HII_DEPENDENCY_TO_LOWER
///
typedef struct  {
  UINT8                        Operand;
  HII_DEPENDENCY_EXPRESSION    *SubExpression;
} HII_DEPENDENCY_TO_LOWER;

///
/// Definition of HII_DEPENDENCY_SET
///
typedef struct  {
  UINT8                        Operand;
  HII_FORMSET_STORAGE          *VarStorage;
  HII_VAR_STORE_INFO           VarStoreInfo;
  UINT8                        ValueType;
  UINT8                        ValueWidth;
  CHAR16                       *ValueName;
  HII_DEPENDENCY_EXPRESSION    *SubExpression;
} HII_DEPENDENCY_SET;

///
/// Definition of HII_DEPENDENCY_NOT
///
typedef struct {
  UINT8                        Operand;
  HII_DEPENDENCY_EXPRESSION    *SubExpression;
} HII_DEPENDENCY_NOT;

///
/// Definition of HII_DEPENDENCY_CATENATE
///
typedef struct {
  UINT8                        Operand;
  HII_DEPENDENCY_EXPRESSION    *LeftStringExp;
  HII_DEPENDENCY_EXPRESSION    *RightStringExp;
} HII_DEPENDENCY_CATENATE;

///
/// Definition of HII_DEPENDENCY_MATCH
///
typedef struct {
  UINT8                        Operand;
  HII_DEPENDENCY_EXPRESSION    *StringExp;
  HII_DEPENDENCY_EXPRESSION    *PatternExp;
} HII_DEPENDENCY_MATCH;

///
/// Definition of HII_DEPENDENCY_MATCH2
///
typedef struct {
  UINT8                        Operand;
  EFI_GUID                     SyntaxType;
  HII_DEPENDENCY_EXPRESSION    *StringExp;
  HII_DEPENDENCY_EXPRESSION    *PatternExp;
} HII_DEPENDENCY_MATCH2;

///
/// Definition of HII_DEPENDENCY_MULT
///
typedef struct {
  UINT8                        Operand;
  HII_DEPENDENCY_EXPRESSION    *RightHandExp;
  HII_DEPENDENCY_EXPRESSION    *LeftHandExp;
} HII_DEPENDENCY_MULT;

///
/// Definition of HII_DEPENDENCY_DIV
///
typedef struct {
  UINT8                        Operand;
  HII_DEPENDENCY_EXPRESSION    *RightHandExp;    ///< right value
  HII_DEPENDENCY_EXPRESSION    *LeftHandExp;     ///< left value
} HII_DEPENDENCY_DIV;

///
/// Definition of HII_DEPENDENCY_MOD
///
typedef struct {
  UINT8                        Operand;
  HII_DEPENDENCY_EXPRESSION    *RightHandExp;    ///< right value
  HII_DEPENDENCY_EXPRESSION    *LeftHandExp;     ///< left value
} HII_DEPENDENCY_MOD;

///
/// Definition of HII_DEPENDENCY_ADD
///
typedef struct {
  UINT8                        Operand;
  HII_DEPENDENCY_EXPRESSION    *RightHandExp;     ///< right value
  HII_DEPENDENCY_EXPRESSION    *LeftHandExp;      ///< left value
} HII_DEPENDENCY_ADD;

///
/// Definition of HII_DEPENDENCY_SUBTRACT
///
typedef struct {
  UINT8                        Operand;
  HII_DEPENDENCY_EXPRESSION    *RightHandExp;    ///< right value
  HII_DEPENDENCY_EXPRESSION    *LeftHandExp;     ///< left value
} HII_DEPENDENCY_SUBTRACT;

///
/// Definition of HII_DEPENDENCY_SHIFT_LEFT
///
typedef struct {
  UINT8                        Operand;
  HII_DEPENDENCY_EXPRESSION    *RightHandExp;
  HII_DEPENDENCY_EXPRESSION    *LeftHandExp;
} HII_DEPENDENCY_SHIFT_LEFT;

///
/// Definition of HII_DEPENDENCY_SHIFT_RIGHT
///
typedef struct {
  UINT8                        Operand;
  HII_DEPENDENCY_EXPRESSION    *RightHandExp;
  HII_DEPENDENCY_EXPRESSION    *LeftHandExp;
} HII_DEPENDENCY_SHIFT_RIGHT;

///
/// Definition of HII_DEPENDENCY_GREATER_THAN
///
typedef struct {
  UINT8                        Operand;
  HII_DEPENDENCY_EXPRESSION    *RightHandExp;
  HII_DEPENDENCY_EXPRESSION    *LeftHandExp;
} HII_DEPENDENCY_GREATER_THAN;

///
/// Definition of HII_DEPENDENCY_GREATER_EQUAL
///
typedef struct {
  UINT8                        Operand;
  HII_DEPENDENCY_EXPRESSION    *RightHandExp;
  HII_DEPENDENCY_EXPRESSION    *LeftHandExp;
} HII_DEPENDENCY_GREATER_EQUAL;

///
/// Definition of HII_DEPENDENCY_LESS_THAN
///
typedef struct {
  UINT8                        Operand;
  HII_DEPENDENCY_EXPRESSION    *RightHandExp;
  HII_DEPENDENCY_EXPRESSION    *LeftHandExp;
} HII_DEPENDENCY_LESS_THAN;

///
/// Definition of HII_DEPENDENCY_LESS_EQUAL
///
typedef struct {
  UINT8                        Operand;
  HII_DEPENDENCY_EXPRESSION    *RightHandExp;
  HII_DEPENDENCY_EXPRESSION    *LeftHandExp;
} HII_DEPENDENCY_LESS_EQUAL;

///
/// Definition of HII_DEPENDENCY_EQUAL
///
typedef struct {
  UINT8                        Operand;
  HII_DEPENDENCY_EXPRESSION    *SubExpression1;
  HII_DEPENDENCY_EXPRESSION    *SubExpression2;
} HII_DEPENDENCY_EQUAL;

///
/// Definition of HII_DEPENDENCY_NOT_EQUAL
///
typedef struct {
  UINT8                        Operand;
  HII_DEPENDENCY_EXPRESSION    *SubExpression1;
  HII_DEPENDENCY_EXPRESSION    *SubExpression2;
} HII_DEPENDENCY_NOT_EQUAL;

///
/// Definition of HII_DEPENDENCY_BITWISE_AND
///
typedef struct {
  UINT8                        Operand;
  HII_DEPENDENCY_EXPRESSION    *SubExpression1;
  HII_DEPENDENCY_EXPRESSION    *SubExpression2;
} HII_DEPENDENCY_BITWISE_AND;

///
/// Definition of HII_DEPENDENCY_BITWISE_OR
///
typedef struct {
  UINT8                        Operand;
  HII_DEPENDENCY_EXPRESSION    *SubExpression1;
  HII_DEPENDENCY_EXPRESSION    *SubExpression2;
} HII_DEPENDENCY_BITWISE_OR;

///
/// Definition of HII_DEPENDENCY_AND
///
typedef struct {
  UINT8                        Operand;
  HII_DEPENDENCY_EXPRESSION    *SubExpression1;
  HII_DEPENDENCY_EXPRESSION    *SubExpression2;
} HII_DEPENDENCY_AND;

///
/// Definition of HII_DEPENDENCY_OR
///
typedef struct {
  UINT8                        Operand;
  HII_DEPENDENCY_EXPRESSION    *SubExpression1;
  HII_DEPENDENCY_EXPRESSION    *SubExpression2;
} HII_DEPENDENCY_OR;

///
/// Definition of HII_DEPENDENCY_CONDITIONAL
///
/// Ternary expression
///
typedef struct  {
  UINT8                        Operand;
  HII_DEPENDENCY_EXPRESSION    *CondTrueValExp;  ///< right value
  HII_DEPENDENCY_EXPRESSION    *CondFalseValExp; ///< middle value
  HII_DEPENDENCY_EXPRESSION    *ConditionExp;    ///< left value
} HII_DEPENDENCY_CONDITIONAL;

///
/// Definition of HII_DEPENDENCY_FIND
///
typedef struct  {
  UINT8                        Operand;
  UINT8                        Format;
  HII_DEPENDENCY_EXPRESSION    *IndexExp;             ///< right value
  HII_DEPENDENCY_EXPRESSION    *StringToCompWithExp;  ///< middle value
  HII_DEPENDENCY_EXPRESSION    *StringToSearchExp;    ///< left value
} HII_DEPENDENCY_FIND;

///
/// Definition of HII_DEPENDENCY_MID
///
typedef struct  {
  UINT8                        Operand;
  HII_DEPENDENCY_EXPRESSION    *LengthExp;         ///< right value
  HII_DEPENDENCY_EXPRESSION    *IndexExp;          ///< middle value
  HII_DEPENDENCY_EXPRESSION    *StringOrBufferExp; ///< left value
} HII_DEPENDENCY_MID;

///
/// Definition of HII_DEPENDENCY_TOKEN
///
typedef struct  {
  UINT8                        Operand;
  HII_DEPENDENCY_EXPRESSION    *IndexExp;           ///< right value
  HII_DEPENDENCY_EXPRESSION    *DelimiterExp;       ///< middle value
  HII_DEPENDENCY_EXPRESSION    *StringToSearchExp;  ///< left value
} HII_DEPENDENCY_TOKEN;

///
/// Definition of HII_DEPENDENCY_SPAN
///
typedef struct  {
  UINT8                        Operand;
  UINT8                        Flags;
  HII_DEPENDENCY_EXPRESSION    *IndexExp;            ///< right value
  HII_DEPENDENCY_EXPRESSION    *CharsetExp;          ///< middle value
  HII_DEPENDENCY_EXPRESSION    *StringToSearchExp;   ///< left value
} HII_DEPENDENCY_SPAN;

///
/// Map expression
///
typedef struct {
  HII_DEPENDENCY_EXPRESSION    *MatchExp;
  HII_DEPENDENCY_EXPRESSION    *ReturnExp;
} HII_DEPENDENCY_EXPRESSION_PAIR;

///
/// Definition of HII_DEPENDENCY_MAP
///
typedef struct  {
  UINT8                             Operand;
  HII_DEPENDENCY_EXPRESSION         *SubExp;
  HII_DEPENDENCY_EXPRESSION_PAIR    *ExpPair;
  UINT8                             ExpPairNo;
} HII_DEPENDENCY_MAP;

///
/// Definition of HII_DEPENDENCY_EXPRESSION
///
union _HII_DEPENDENCY_EXPRESSION {
  ///
  /// Constant
  ///
  HII_EXPRESSION_CONSTANT          ConstantExp;
  ///
  /// build-in expression
  ///
  HII_DEPENDENCY_DUP               DupExp;
  HII_DEPENDENCY_EQ_ID_VAL         EqIdValExp;
  HII_DEPENDENCY_EQ_ID_ID          EqIdIdExp;
  HII_DEPENDENCY_EQ_ID_VAL_LIST    EqIdListExp;
  HII_DEPENDENCY_QUESTION_REF1     QuestionRef1Exp;
  HII_DEPENDENCY_RULE_REF          RuleRefExp;
  HII_DEPENDENCY_STRING_REF1       StringRef1Exp;
  HII_DEPENDENCY_THIS              ThisExp;
  HII_DEPENDENCY_SECURITY          SecurityExp;
  HII_DEPENDENCY_GET               GetExp;

  ///
  /// unary expression
  ///
  HII_DEPENDENCY_LENGTH            LengthExp;
  HII_DEPENDENCY_BITWISE_NOT       BitWiseNotExp;
  HII_DEPENDENCY_STRING_REF2       StringRef2Exp;
  HII_DEPENDENCY_QUESTION_REF2     QuestionRef2Exp;
  HII_DEPENDENCY_QUESTION_REF3     QuestionRef3Exp;
  HII_DEPENDENCY_TO_BOOLEAN        ToBooleanExp;
  HII_DEPENDENCY_TO_STRING         ToStringExp;
  HII_DEPENDENCY_TO_UINT           ToUintExp;
  HII_DEPENDENCY_TO_UPPER          ToUpperExp;
  HII_DEPENDENCY_TO_LOWER          ToLowerExp;
  HII_DEPENDENCY_SET               SetExp;
  HII_DEPENDENCY_NOT               NotExp;

  ///
  /// Binary expression
  ///
  HII_DEPENDENCY_CATENATE          CatenateExp;
  HII_DEPENDENCY_MATCH             MatchExp;
  HII_DEPENDENCY_MATCH2            Match2Exp;
  HII_DEPENDENCY_MULT              MultExp;
  HII_DEPENDENCY_DIV               DivExp;
  HII_DEPENDENCY_MOD               ModExp;
  HII_DEPENDENCY_ADD               AddExp;
  HII_DEPENDENCY_SUBTRACT          SubtractExp;
  HII_DEPENDENCY_SHIFT_LEFT        ShiftLeftExp;
  HII_DEPENDENCY_SHIFT_RIGHT       ShiftRightExp;
  HII_DEPENDENCY_GREATER_THAN      GreaterThanExp;
  HII_DEPENDENCY_GREATER_EQUAL     GreaterEqualExp;
  HII_DEPENDENCY_LESS_THAN         LessThanExp;
  HII_DEPENDENCY_LESS_EQUAL        LessEqualExp;
  HII_DEPENDENCY_EQUAL             EqualExp;
  HII_DEPENDENCY_NOT_EQUAL         NotEqualExp;
  HII_DEPENDENCY_BITWISE_AND       BitwiseAndExp;
  HII_DEPENDENCY_BITWISE_OR        BitwiseOrExp;
  HII_DEPENDENCY_AND               AndExp;
  HII_DEPENDENCY_OR                OrExp;

  ///
  /// ternary expression
  ///
  HII_DEPENDENCY_CONDITIONAL       ConditionalExp;
  HII_DEPENDENCY_FIND              FindExp;
  HII_DEPENDENCY_MID               MidExp;
  HII_DEPENDENCY_TOKEN             TokenExp;
  HII_DEPENDENCY_SPAN              SpanExp;
  HII_DEPENDENCY_MAP               MapExp;
};

///
/// Definition of HII_EXPRESSION_OPCODE
///
typedef struct {
  UINTN                          Signature;
  LIST_ENTRY                     Link;
  UINT8                          Operand;
  HII_EXPRESSION_OPCODE_EXTRA    ExtraData;
  LIST_ENTRY                     MapExpressionList; ///< nested expressions inside of Map opcode.
} HII_EXPRESSION_OPCODE;

#define HII_EXPRESSION_OPCODE_SIGNATURE  SIGNATURE_32 ('E', 'X', 'O', 'P')
#define HII_EXPRESSION_OPCODE_FROM_LINK(a)  CR (a, HII_EXPRESSION_OPCODE, Link, HII_EXPRESSION_OPCODE_SIGNATURE)

///
/// Definition of HII_WARNING_IF_DATA
///
typedef struct {
  EFI_STRING_ID    WarningIfError;
  UINT8            TimeOut;
} HII_WARNING_IF_DATA;

///
/// Definition of HII_EXTRA_DATA
///
typedef union {
  UINT8                  RuleId;      ///< For EFI_IFR_RULE only
  EFI_STRING_ID          Error;       ///< For EFI_IFR_NO_SUBMIT_IF, EFI_IFR_INCONSISTENT_IF only
  HII_WARNING_IF_DATA    WarningIfData;
} HII_EXTRA_DATA;

///
/// Definition of HII_EXPRESSION
///
typedef struct {
  UINTN                        Signature;
  LIST_ENTRY                   Link;
  UINT8                        Type;               ///< Type for this expression
  EFI_IFR_OP_HEADER            *OpCode;            ///< Save the opcode buffer.
  LIST_ENTRY                   OpCodeListHead;     ///< OpCodes consist of this expression (HII_EXPRESSION_OPCODE)
  HII_DEPENDENCY_EXPRESSION    *RootDependencyExp; ///< Expression OpCodes tree layout to describe dependency of this expression.
  HII_EXTRA_DATA               ExtraData;
  EFI_HII_VALUE                Result;             ///< Expression evaluation result
} HII_EXPRESSION;

#define HII_EXPRESSION_SIGNATURE  SIGNATURE_32 ('F', 'E', 'X', 'P')
#define HII_EXPRESSION_FROM_LINK(a)  CR (a, HII_EXPRESSION, Link, HII_EXPRESSION_SIGNATURE)

///
/// Definition of HII_EXPRESSION_LIST
///
typedef struct {
  UINTN             Signature;
  UINTN             Count;
  HII_EXPRESSION    *Expression[1];    ///< Array[Count] of expressions
} HII_EXPRESSION_LIST;

#define HII_EXPRESSION_LIST_SIGNATURE  SIGNATURE_32 ('F', 'E', 'X', 'R')

///
/// Definition of HII_STATEMENT_VALUE
///
typedef struct {
  ///
  /// HII Data Type
  ///
  UINT8                 Type;
  EFI_IFR_TYPE_VALUE    Value;
  ///
  /// Buffer Data and Length if Type is EFI_IFR_TYPE_BUFFER or EFI_IFR_TYPE_STRING
  ///
  UINT8                 *Buffer;
  UINT16                BufferLen;
  UINT8                 BufferValueType; ///< Data type for buffer internal data, currently only for orderedlist
} HII_STATEMENT_VALUE;

///
/// Default value
///
typedef struct {
  UINTN                  Signature;
  LIST_ENTRY             Link;

  UINT16                 DefaultId;
  HII_STATEMENT_VALUE    Value;            ///< Default value

  HII_EXPRESSION         *ValueExpression; ///< Not-NULL indicates default value is provided by EFI_IFR_VALUE
} HII_QUESTION_DEFAULT;

#define HII_QUESTION_DEFAULT_SIGNATURE  SIGNATURE_32 ('Q', 'D', 'F', 'T')
#define HII_QUESTION_DEFAULT_FROM_LINK(a)  CR (a, HII_QUESTION_DEFAULT, Link, HII_QUESTION_DEFAULT_SIGNATURE)

#define HII_QUESTION_OPTION_SIGNATURE  SIGNATURE_32 ('Q', 'O', 'P', 'T')

///
/// Option value
///
typedef struct {
  UINTN                    Signature;
  LIST_ENTRY               Link;

  EFI_IFR_ONE_OF_OPTION    *OpCode;             ///< OneOfOption Data

  EFI_STRING_ID            Text;
  UINT8                    Flags;
  HII_STATEMENT_VALUE      Value;
  EFI_IMAGE_ID             ImageId;

  HII_EXPRESSION_LIST      *SuppressExpression; ///< Non-NULL indicates nested inside of SuppressIf
} HII_QUESTION_OPTION;

#define HII_QUESTION_OPTION_FROM_LINK(a)  CR (a, HII_QUESTION_OPTION, Link, HII_QUESTION_OPTION_SIGNATURE)

///
/// class of default
///
typedef struct {
  UINTN            Signature;
  LIST_ENTRY       Link;

  UINT16           DefaultId;
  EFI_STRING_ID    DefaultName;
} HII_FORMSET_DEFAULTSTORE;

#define HII_FORMSET_DEFAULTSTORE_SIGNATURE  SIGNATURE_32 ('F', 'D', 'F', 'S')
#define HII_FORMSET_DEFAULTSTORE_FROM_LINK(a)  CR (a, HII_FORMSET_DEFAULTSTORE, Link, HII_FORMSET_DEFAULTSTORE_SIGNATURE)

///
/// Definition of HII_STATEMENT_EXTRA
///
typedef union {
  UINT8             Flags;
  EFI_STRING_ID     TextTwo;
  EFI_DEFAULT_ID    DefaultId;
  EFI_STRING_ID     QuestionConfig;
  EFI_GUID          Guid;

  struct {
    UINT8       Flags;
    UINT64      Minimum;            ///< for EFI_IFR_ONE_OF/EFI_IFR_NUMERIC, it's Min/Max value
    UINT64      Maximum;            ///< for EFI_IFR_STRING/EFI_IFR_PASSWORD, it's Min/Max length
    UINT64      Step;
    EFI_GUID    Guid;
  } NumData;

  struct {
    UINT8    Flags;
    UINT8    MaxContainers;         ///< for EFI_IFR_ORDERED_LIST
  } OrderListData;

  struct {
    UINT8    Flags;
    UINT8    MinSize;
    UINT8    MaxSize;
  } StrData;

  struct {
    UINT16    MinSize;
    UINT16    MaxSize;
  } PwdData;
} HII_STATEMENT_EXTRA;

///
/// Statement (Question)
///
typedef struct _HII_STATEMENT HII_STATEMENT;
struct _HII_STATEMENT {
  UINTN                  Signature;
  LIST_ENTRY             Link;

  UINT8                  Operand;         ///< The operand (first byte) of this Statement or Question
  EFI_IFR_OP_HEADER      *OpCode;

  ///
  /// Statement Header
  ///
  EFI_STRING_ID          Prompt;
  EFI_STRING_ID          Help;

  ///
  /// Question Header
  ///
  EFI_QUESTION_ID        QuestionId;      ///< Question id, the value of zero is reserved
  EFI_VARSTORE_ID        VarStoreId;      ///< VarStore id, a value of zero indicates no variable storage
  HII_VAR_STORE_INFO     VarStoreInfo;    ///< VarStoreInfoIf VarStoreId refers to Buffer Storage (EFI_IFR_VARSTORE or EFI_IFR_VARSTORE_EFI), then VarStoreInfo contains a 16-bit Buffer Storage offset (VarOffset).
                                          ///< If VarStoreId refers to Name/Value Storage (EFI_IFR_VARSTORE_NAME_VALUE), then VarStoreInfo contains the String ID of the name (VarName) for this name/value pair.
  UINT8                  QuestionFlags;   ///< The flag of this Question.(Readonly, reset required, callback attribute....)

  BOOLEAN                QuestionReferToBitField;   ///< Whether the question is stored in a bit field.
  UINT16                 StorageWidth;              ///< The storage width of this Question.
  UINT16                 BitStorageWidth;           ///< The Storage width of this Question in bit level.
  UINT16                 BitVarOffset;              ///< The storage offset of this Question in bit level.
  CHAR16                 *VariableName;             ///< Name/Value or EFI Variable name
  CHAR16                 *BlockName;                ///< Buffer storage block name: "OFFSET=...WIDTH=..."

  HII_FORMSET_STORAGE    *Storage;                  ///< Point to the storage that store this question.
  HII_STATEMENT_EXTRA    ExtraData;

  BOOLEAN                Locked;                    ///< Whether this statement is locked.

  HII_STATEMENT_VALUE    Value;

  ///
  /// Get from IFR parsing
  ///

  HII_STATEMENT          *ParentStatement;     ///< Parent Statement of current statement.
  HII_EXPRESSION_LIST    *ExpressionList;      ///< nesting inside of GrayedOutIf/DisableIf/SuppressIf
  HII_EXPRESSION         *ValueExpression;     ///< nested EFI_IFR_VALUE, provide Question value and indicate Question is ReadOnly

  EFI_IMAGE_ID           ImageId;              ///< nested EFI_IFR_IMAGE
  UINT8                  RefreshInterval;      ///< nested EFI_IFR_REFRESH, refresh interval(in seconds) for Question value, 0 means no refresh

  LIST_ENTRY             DefaultListHead;      ///< nested EFI_IFR_DEFAULT list (HII_QUESTION_DEFAULT), provide default values
  LIST_ENTRY             OptionListHead;       ///< nested EFI_IFR_ONE_OF_OPTION list (HII_QUESTION_OPTION)
  LIST_ENTRY             InconsistentListHead; ///< nested inconsistent expression list (HII_EXPRESSION)
  LIST_ENTRY             NoSubmitListHead;     ///< nested nosubmit expression list (HII_EXPRESSION)
  LIST_ENTRY             WarningListHead;      ///< nested warning expression list (HII_EXPRESSION)

  HII_EXPRESSION         *ReadExpression;       ///< nested EFI_IFR_READ, provide this question value by read expression.
  HII_EXPRESSION         *WriteExpression;      ///< nested EFI_IFR_WRITE, evaluate write expression after this question value is set.
};

#define HII_STATEMENT_SIGNATURE  SIGNATURE_32 ('H', 'S', 'T', 'A')
#define HII_STATEMENT_FROM_LINK(a)  CR (a, HII_STATEMENT, Link, HII_STATEMENT_SIGNATURE)

///
/// Form
///
#define STANDARD_MAP_FORM_TYPE  0x01

typedef struct {
  UINTN                  Signature;
  LIST_ENTRY             Link;

  UINT16                 FormId;              ///< FormId of normal form or formmap form.
  EFI_STRING_ID          FormTitle;           ///< FormTile of normal form, or FormMapMethod title of formmap form.
  UINT16                 FormType;            ///< Specific form type for the different form.

  EFI_IMAGE_ID           ImageId;             ///< The image id.

  BOOLEAN                ModalForm;           ///< Whether this is a modal form.
  BOOLEAN                Locked;              ///< Whether this form is locked.
  EFI_GUID               RefreshGuid;         ///< Form refresh event guid.

  LIST_ENTRY             StatementListHead;   ///< List of Statements and Questions (HII_STATEMENT)
  LIST_ENTRY             ConfigRequestHead;   ///< List of configrequest for all storage.
  LIST_ENTRY             RuleListHead;        ///< nested EFI_IFR_RULE list, pre-defined expressions attached to the form.
  HII_EXPRESSION_LIST    *SuppressExpression; ///< nesting inside of SuppressIf
} HII_FORM;

#define HII_FORM_SIGNATURE  SIGNATURE_32 ('F', 'F', 'R', 'M')
#define HII_FORM_FROM_LINK(a)  CR (a, HII_FORM, Link, HII_FORM_SIGNATURE)

///
/// FormSet
///
typedef struct {
  UINTN                             Signature;
  LIST_ENTRY                        Link;

  EFI_HII_HANDLE                    HiiHandle;             ///< Unique id for formset, HII Handle of this FormSet package.
  EFI_HANDLE                        DriverHandle;          ///< EFI_HANDLE which was registered with the package list in NewPackageList().
  EFI_HII_CONFIG_ACCESS_PROTOCOL    *ConfigAccess;         ///< ConfigAccess Protocol associated with this HiiPackageList
  EFI_DEVICE_PATH_PROTOCOL          *DevicePath;

  UINTN                             IfrBinaryLength;       ///< Ifr binary data length of this formset.
  UINT8                             *IfrBinaryData;        ///< Point to the Ifr binary data.

  EFI_GUID                          Guid;                  ///< Formset Guid.
  EFI_STRING_ID                     FormSetTitle;          ///< String Id of Formset title.
  EFI_STRING_ID                     Help;                  ///< String Id of Formset title.

  UINT8                             NumberOfClassGuid;     ///< Class Guid name
  EFI_GUID                          ClassGuid[3];          ///< Up to three ClassGuid

  EFI_IMAGE_ID                      ImageId;               ///< The image id.

  LIST_ENTRY                        StatementListOSF;      ///< Statement list out side of the form.
  LIST_ENTRY                        StorageListHead;       ///< Storage list (HII_FORMSET_STORAGE)
  LIST_ENTRY                        DefaultStoreListHead;  ///< DefaultStore list (HII_FORMSET_DEFAULTSTORE)
  LIST_ENTRY                        FormListHead;          ///< Form list (HII_FORM_BROWSER_FORM)
} HII_FORMSET;

#define HII_FORMSET_SIGNATURE  SIGNATURE_32 ('H', 'I', 'F', 'S')
#define HII_FORMSET_FROM_LINK(a)  CR (a, HII_FORMSET, Link, HII_FORMSET_SIGNATURE)

///
/// Get/set question value from/to.
///
typedef enum {
  GetSetValueWithBuffer = 0,       ///< Get/Set question value from/to buffer in the storage.
  GetSetValueWithHiiDriver,        ///< Get/Set question value from/to hii driver.
  GetSetValueWithBoth,             ///< Compare the editbuffer with buffer for this question, not use the question value.
  GetSetValueWithMax               ///< Invalid value.
} GET_SET_QUESTION_VALUE_WITH;

/**
  Initialize the internal data structure of a FormSet.

  @param[in]      Handle         PackageList Handle
  @param[in,out]  FormSetGuid    On input, GUID or class GUID of a formset. If not
                                 specified (NULL or zero GUID), take the first
                                 FormSet with class GUID EFI_HII_PLATFORM_SETUP_FORMSET_GUID
                                 found in package list.
                                 On output, GUID of the formset found(if not NULL).
  @param[out]     FormSet        FormSet data structure.

  @retval EFI_SUCCESS            The function completed successfully.
  @retval EFI_NOT_FOUND          The specified FormSet could not be found.

**/
EFI_STATUS
CreateFormSetFromHiiHandle (
  IN     EFI_HII_HANDLE  Handle,
  IN OUT EFI_GUID        *FormSetGuid,
  OUT HII_FORMSET        *FormSet
  );

/**
  Initialize a Formset and get current setting for Questions.

  @param[in,out]  FormSet                FormSet data structure.

**/
VOID
InitializeFormSet (
  IN OUT HII_FORMSET  *FormSet
  );

/**
  Free resources allocated for a FormSet.

  @param[in,out]  FormSet                Pointer of the FormSet

**/
VOID
DestroyFormSet (
  IN OUT HII_FORMSET  *FormSet
  );

/**
  Save Question Value to the memory, but not to storage.

  @param[in]     FormSet                FormSet data structure.
  @param[in]     Form                   Form data structure.
  @param[in,out] Question               Pointer to the Question.
  @param[in]     QuestionValue          New Question Value to be set.

  @retval EFI_SUCCESS            The question value has been set successfully.
  @retval EFI_INVALID_PARAMETER  One or more parameters are invalid.

**/
EFI_STATUS
SetQuestionValue (
  IN     HII_FORMSET          *FormSet,
  IN     HII_FORM             *Form,
  IN OUT HII_STATEMENT        *Question,
  IN     HII_STATEMENT_VALUE  *QuestionValue
  );

/**
  Get Question's current Value from storage.

  @param[in]     FormSet                FormSet data structure.
  @param[in]     Form                   Form data structure.
  @param[in,out] Question               Question to be initialized.

  @return the current Question Value in storage if success.
  @return NULL if Question is not found or any error occurs.

**/
HII_STATEMENT_VALUE *
RetrieveQuestion (
  IN     HII_FORMSET    *FormSet,
  IN     HII_FORM       *Form,
  IN OUT HII_STATEMENT  *Question
  );

/**
  Get Question's current Value.

  @param[in]   FormSet                FormSet data structure.
  @param[in]   Form                   Form data structure.
  @param[out]  Question               Question to be initialized.
  @param[in]   GetValueFrom           Where to get value, may from editbuffer, buffer or hii driver.

  @retval EFI_SUCCESS            The function completed successfully.
  @retval EFI_INVALID_PARAMETER  Formset, Form or Question is NULL.

**/
EFI_STATUS
GetQuestionValue (
  IN HII_FORMSET                  *FormSet,
  IN HII_FORM                     *Form,
  IN OUT HII_STATEMENT            *Question,
  IN GET_SET_QUESTION_VALUE_WITH  GetValueFrom
  );

/**
  Submit data for a form.

  @param[in]  FormSet                FormSet which contains the Form.
  @param[in]  Form                   Form to submit.

  @retval EFI_SUCCESS            The function completed successfully.
  @retval Others                 Other errors occur.

**/
EFI_STATUS
SubmitForm (
  IN     HII_FORMSET  *FormSet,
  IN     HII_FORM     *Form
  );

/**
  Evaluate the result of a HII expression.

  If Expression is NULL, then ASSERT.

  @param[in]     FormSet                FormSet associated with this expression.
  @param[in]     Form                   Form associated with this expression.
  @param[in,out] Expression             Expression to be evaluated.

  @retval EFI_SUCCESS            The expression evaluated successfully
  @retval EFI_NOT_FOUND          The Question which referenced by a QuestionId
                                 could not be found.
  @retval EFI_OUT_OF_RESOURCES   There is not enough system memory to grow the
                                 stack.
  @retval EFI_ACCESS_DENIED      The pop operation underflowed the stack
  @retval EFI_INVALID_PARAMETER  Syntax error with the Expression

**/
EFI_STATUS
EvaluateHiiExpression (
  IN     HII_FORMSET     *FormSet,
  IN     HII_FORM        *Form,
  IN OUT HII_EXPRESSION  *Expression
  );

/**
  Retrieve dependencies within an expression. These dependencies can express how
  this expression will be evaluated.

  @param[in]  Expression             Expression to retrieve dependencies.

  @retval EFI_SUCCESS            The dependencies were successfully retrieved.
  @retval EFI_OUT_OF_RESOURCES   There is not enough system memory.

**/
EFI_STATUS
GetHiiExpressionDependency (
  IN HII_EXPRESSION  *Expression
  );

/**
  Get default value of question.

  @param[in]  FormSet                The form set.
  @param[in]  Form                   The form.
  @param[in]  Question               The question.
  @param[in]  DefaultId              The Class of the default.
  @param[out] DefaultValue           The default value of given question.

  @retval EFI_SUCCESS            Question is reset to default value.

**/
EFI_STATUS
GetQuestionDefault (
  IN HII_FORMSET           *FormSet,
  IN HII_FORM              *Form,
  IN HII_STATEMENT         *Question,
  IN UINT16                DefaultId,
  OUT HII_STATEMENT_VALUE  *DefaultValue
  );

/**
  Return the result of the expression list. Check the expression list and
  return the highest priority express result.
  Priority: DisableIf > SuppressIf > GrayOutIf > FALSE

  @param[in]  ExpList         The input expression list.
  @param[in]  Evaluate        Whether need to evaluate the expression first.
  @param[in]  FormSet         FormSet associated with this expression.
  @param[in]  Form            Form associated with this expression.

  @retval EXPRESS_RESULT      Return the higher priority express result.
                              DisableIf > SuppressIf > GrayOutIf > FALSE

**/
EXPRESS_RESULT
EvaluateExpressionList (
  IN HII_EXPRESSION_LIST  *ExpList,
  IN BOOLEAN              Evaluate,
  IN HII_FORMSET          *FormSet OPTIONAL,
  IN HII_FORM             *Form OPTIONAL
  );
