/** @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;
