/** @file
  Extension Form Browser Protocol provides the services that can be used to
  register the different hot keys for the standard Browser actions described in UEFI specification.

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

**/

#pragma once

#include <Protocol/FormBrowserEx.h>

#define EDKII_FORM_BROWSER_EXTENSION2_PROTOCOL_GUID  \
  { 0xa770c357, 0xb693, 0x4e6d, { 0xa6, 0xcf, 0xd2, 0x1c, 0x72, 0x8e, 0x55, 0xb }}

typedef struct _EDKII_FORM_BROWSER_EXTENSION2_PROTOCOL EDKII_FORM_BROWSER_EXTENSION2_PROTOCOL;

#define BROWSER_EXTENSION2_VERSION_1    0x10000
#define BROWSER_EXTENSION2_VERSION_1_1  0x10001

/**
  Check whether the browser data has been modified.

  @retval TRUE        Browser data is modified.
  @retval FALSE       No browser data is modified.

**/
typedef
BOOLEAN
(EFIAPI *IS_BROWSER_DATA_MODIFIED)(
  VOID
  );

/**
  Execute the action requested by the Action parameter.

  @param[in] Action     Execute the request action.
  @param[in] DefaultId  The default Id info when need to load default value.

  @retval EFI_SUCCESS              Execute the request action succss.

**/
typedef
EFI_STATUS
(EFIAPI *EXECUTE_ACTION)(
  IN UINT32        Action,
  IN UINT16        DefaultId
  );

/**
  Check whether required reset when exit the browser

  @retval TRUE      Browser required to reset after exit.
  @retval FALSE     Browser not need to reset after exit.

**/
typedef
BOOLEAN
(EFIAPI *IS_RESET_REQUIRED)(
  VOID
  );

#define FORM_ENTRY_INFO_SIGNATURE  SIGNATURE_32 ('f', 'e', 'i', 's')

typedef struct {
  UINTN              Signature;
  LIST_ENTRY         Link;

  EFI_HII_HANDLE     HiiHandle;
  EFI_GUID           FormSetGuid;
  EFI_FORM_ID        FormId;
  EFI_QUESTION_ID    QuestionId;
} FORM_ENTRY_INFO;

#define FORM_ENTRY_INFO_FROM_LINK(a)  CR (a, FORM_ENTRY_INFO, Link, FORM_ENTRY_INFO_SIGNATURE)

#define FORM_QUESTION_ATTRIBUTE_OVERRIDE_SIGNATURE  SIGNATURE_32 ('f', 'q', 'o', 's')

typedef struct {
  UINTN              Signature;
  LIST_ENTRY         Link;

  EFI_QUESTION_ID    QuestionId;         // Find the question
  EFI_FORM_ID        FormId;             // Find the form
  EFI_GUID           FormSetGuid;        // Find the formset.
  EFI_HII_HANDLE     HiiHandle;          // Find the HII handle
  UINT32             Attribute;          // Hide or grayout ...
} QUESTION_ATTRIBUTE_OVERRIDE;

#define FORM_QUESTION_ATTRIBUTE_OVERRIDE_FROM_LINK(a)  CR (a, QUESTION_ATTRIBUTE_OVERRIDE, Link, FORM_QUESTION_ATTRIBUTE_OVERRIDE_SIGNATURE)

struct _EDKII_FORM_BROWSER_EXTENSION2_PROTOCOL {
  ///
  /// Version for protocol future extension.
  ///
  UINT32                      Version;
  SET_SCOPE                   SetScope;
  REGISTER_HOT_KEY            RegisterHotKey;
  REGISTER_EXIT_HANDLER       RegiserExitHandler;
  IS_BROWSER_DATA_MODIFIED    IsBrowserDataModified;
  EXECUTE_ACTION              ExecuteAction;
  ///
  /// A list of type FORMID_INFO is Browser View Form History List.
  ///
  LIST_ENTRY                  FormViewHistoryHead;
  ///
  /// A list of type QUESTION_ATTRIBUTE_OVERRIDE.
  ///
  LIST_ENTRY                  OverrideQestListHead;

  IS_RESET_REQUIRED           IsResetRequired;
};

extern EFI_GUID  gEdkiiFormBrowserEx2ProtocolGuid;
