/** @file

  This library class defines a set of interfaces to customize Ui module

Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent

**/
#include <Uefi.h>
#include <Protocol/HiiConfigAccess.h>
#include "BootMaintenanceManagerCustomizedUiSupport.h"

/**
  Customize menus in the page.

  @param[in]  HiiHandle             The HII Handle of the form to update.
  @param[in]  StartOpCodeHandle     The context used to insert opcode.
  @param[in]  CustomizePageType     The page type need to be customized.

**/
VOID
UiCustomizeBMMPage (
  IN EFI_HII_HANDLE  HiiHandle,
  IN VOID            *StartOpCodeHandle
  )
{
  //
  // Create "Boot Option" menu.
  //
  BmmCreateBootOptionMenu (HiiHandle, StartOpCodeHandle);
  //
  // Create "Driver Option" menu.
  //
  BmmCreateDriverOptionMenu (HiiHandle, StartOpCodeHandle);
  //
  // Create "Com Option" menu.
  //
  BmmCreateComOptionMenu (HiiHandle, StartOpCodeHandle);
  //
  // Create "Boot From File" menu.
  //
  BmmCreateBootFromFileMenu (HiiHandle, StartOpCodeHandle);

  //
  // Find third party drivers which need to be shown in the Bmm page.
  //
  BmmListThirdPartyDrivers (HiiHandle, &gEfiIfrBootMaintenanceGuid, NULL, StartOpCodeHandle);

  //
  // Create empty line.
  //
  BmmCreateEmptyLine (HiiHandle, StartOpCodeHandle);

  //
  // Create "Boot Next" menu.
  //
  BmmCreateBootNextMenu (HiiHandle, StartOpCodeHandle);
  //
  // Create "Time Out" menu.
  //
  BmmCreateTimeOutMenu (HiiHandle, StartOpCodeHandle);
}

/**
  This function processes the results of changes in configuration.


  @param HiiHandle       Points to the hii handle for this formset.
  @param Action          Specifies the type of action taken by the browser.
  @param QuestionId      A unique value which is sent to the original exporting driver
                         so that it can identify the type of data to expect.
  @param Type            The type of value for the question.
  @param Value           A pointer to the data being sent to the original exporting driver.
  @param ActionRequest   On return, points to the action requested by the callback function.

  @retval  EFI_SUCCESS           The callback successfully handled the action.
  @retval  EFI_OUT_OF_RESOURCES  Not enough storage is available to hold the variable and its data.
  @retval  EFI_DEVICE_ERROR      The variable could not be saved.
  @retval  EFI_UNSUPPORTED       The specified Action is not supported by the callback.

**/
EFI_STATUS
UiBMMCallbackHandler (
  IN  EFI_HII_HANDLE              HiiHandle,
  IN  EFI_BROWSER_ACTION          Action,
  IN  EFI_QUESTION_ID             QuestionId,
  IN  UINT8                       Type,
  IN  EFI_IFR_TYPE_VALUE          *Value,
  OUT EFI_BROWSER_ACTION_REQUEST  *ActionRequest
  )
{
  return EFI_UNSUPPORTED;
}
