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