877 lines
26 KiB
C
877 lines
26 KiB
C
/** @file
|
|
Main funcitons for Main menu
|
|
|
|
;******************************************************************************
|
|
;* Copyright (c) 2012 - 2021, Insyde Software Corp. All Rights Reserved.
|
|
;*
|
|
;* You may not reproduce, distribute, publish, display, perform, modify, adapt,
|
|
;* transmit, broadcast, present, recite, release, license or otherwise exploit
|
|
;* any part of this publication in any form, by any means, without the prior
|
|
;* written permission of Insyde Software Corporation.
|
|
;*
|
|
;******************************************************************************
|
|
*/
|
|
|
|
#include "Main.h"
|
|
#include <Library/DxeOemSvcKernelLib.h>
|
|
|
|
STATIC EFI_CALLBACK_INFO *mMainCallBackInfo;
|
|
|
|
STATIC EFI_STRING_ID mCopyrightStrList[10] = {
|
|
STRING_TOKEN (STR_COPYRIGHT),
|
|
0
|
|
};
|
|
|
|
/**
|
|
Update used DMI information from FLASH_REGION_NV_COMMON_STORE_SUBREGION_OEM_DMI_STORE
|
|
, if the used data is in this region.
|
|
|
|
@param Type SMBIOS type number
|
|
@param Offset The offset of the string reference
|
|
@param HiiHandle Target EFI_HII_HANDLE instance
|
|
@param TokenToUpdate Updated token number
|
|
|
|
@retval EFI_SUCCESS Udpate string token successfully
|
|
@return Other Cannot find HII protocol
|
|
|
|
**/
|
|
STATIC
|
|
EFI_STATUS
|
|
FindUpdateString (
|
|
IN UINT8 Type,
|
|
IN UINT8 Offset,
|
|
IN EFI_HII_HANDLE HiiHandle,
|
|
IN EFI_STRING_ID TokenToUpdate
|
|
)
|
|
{
|
|
CHAR16 *UniString;
|
|
UINTN Index;
|
|
UINT8 *DmiPtr;
|
|
UINT8 *Buffer;
|
|
DMI_STRING_STRUCTURE *CurrentPtr;
|
|
UINTN StringLen;
|
|
|
|
if (FLASH_REGION_NV_COMMON_STORE_SUBREGION_OEM_DMI_STORE_SIZE == 0 ||
|
|
FLASH_REGION_NV_COMMON_STORE_SUBREGION_OEM_DMI_STORE_SIZE <= 9) {
|
|
return EFI_NOT_FOUND;
|
|
}
|
|
|
|
DmiPtr = (UINT8*)(UINTN)(FLASH_REGION_NV_COMMON_STORE_SUBREGION_OEM_DMI_STORE_BASE);
|
|
if (DmiPtr == NULL) {
|
|
return EFI_NOT_FOUND;
|
|
}
|
|
|
|
if (!(*(UINT32*)DmiPtr == DMI_UPDATE_STRING_SIGNATURE)){
|
|
return EFI_NOT_FOUND;
|
|
}
|
|
|
|
Buffer = (UINT8*)(UINTN)(FLASH_REGION_NV_COMMON_STORE_SUBREGION_OEM_DMI_STORE_BASE + 4);
|
|
while (TRUE) {
|
|
CurrentPtr = (DMI_STRING_STRUCTURE*) Buffer;
|
|
if ((UINTN) Buffer >=
|
|
(UINTN)(FLASH_REGION_NV_COMMON_STORE_SUBREGION_OEM_DMI_STORE_BASE +
|
|
FLASH_REGION_NV_COMMON_STORE_SUBREGION_OEM_DMI_STORE_SIZE)
|
|
) {
|
|
return EFI_NOT_FOUND;
|
|
}
|
|
if (CurrentPtr->Type == 0xFF || CurrentPtr->Length == 0) {
|
|
return EFI_NOT_FOUND;
|
|
}
|
|
if (CurrentPtr->Type == Type &&
|
|
CurrentPtr->Offset == Offset &&
|
|
CurrentPtr->Valid == 0xFF) {
|
|
break;
|
|
}
|
|
Buffer = Buffer + CurrentPtr->Length;
|
|
}
|
|
|
|
StringLen = CurrentPtr->Length - OFFSET_OF(DMI_STRING_STRUCTURE, String);
|
|
UniString = AllocatePool ((StringLen + 1) * sizeof (CHAR16));
|
|
if (UniString == NULL) {
|
|
return EFI_OUT_OF_RESOURCES;
|
|
}
|
|
//
|
|
// UINT8 transform CHAR16
|
|
//
|
|
for (Index = 0; Index < StringLen; Index++) {
|
|
UniString[Index] = (CHAR16)CurrentPtr->String[Index];
|
|
}
|
|
UniString[Index] = (CHAR16) 0x0;
|
|
|
|
HiiSetString (HiiHandle, TokenToUpdate, UniString, NULL);
|
|
|
|
FreePool (UniString);
|
|
|
|
return EFI_SUCCESS;
|
|
|
|
}
|
|
|
|
/**
|
|
Using BVDT data to update STR_MISC_BIOS_VERSION string token
|
|
|
|
@param HiiHandle Target EFI_HII_HANDLE instance
|
|
|
|
@retval EFI_SUCCESS Udpate string token successfully
|
|
@return Other Cannot find HII protocol
|
|
|
|
**/
|
|
STATIC
|
|
EFI_STATUS
|
|
UpdateBiosVersionFromBvdt (
|
|
IN EFI_HII_HANDLE HiiHandle
|
|
)
|
|
{
|
|
UINTN StrSize;
|
|
CHAR16 Str[BVDT_MAX_STR_SIZE];
|
|
EFI_STATUS Status;
|
|
VOID *StartOpCodeHandle;
|
|
VOID *EndOpCodeHandle;
|
|
EFI_IFR_GUID_LABEL *StartLabel;
|
|
EFI_IFR_GUID_LABEL *EndLabel;
|
|
|
|
//
|
|
// Update BIOS version string from BVDT
|
|
//
|
|
StrSize = BVDT_MAX_STR_SIZE;
|
|
Status = GetBvdtInfo ((BVDT_TYPE) BvdtBiosVer, &StrSize, Str);
|
|
if (!EFI_ERROR (Status)) {
|
|
HiiSetString (
|
|
HiiHandle,
|
|
STRING_TOKEN (STR_MISC_BIOS_VERSION),
|
|
Str,
|
|
NULL
|
|
);
|
|
}
|
|
|
|
//
|
|
// Add BIOS version text opcode in Main page.
|
|
//
|
|
StartOpCodeHandle = HiiAllocateOpCodeHandle ();
|
|
EndOpCodeHandle = HiiAllocateOpCodeHandle ();
|
|
|
|
StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (StartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));
|
|
StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
|
|
StartLabel->Number = BIOS_VERSION_LABEL;
|
|
|
|
EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (EndOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));
|
|
EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
|
|
EndLabel->Number = BIOS_VERSION_END_LABEL;
|
|
|
|
HiiCreateTextOpCode (
|
|
StartOpCodeHandle,
|
|
(EFI_STRING_ID)STRING_TOKEN(STR_BIOS_VERSION_STRING),
|
|
(EFI_STRING_ID)STRING_TOKEN(STR_BLANK_STRING),
|
|
(EFI_STRING_ID)STRING_TOKEN(STR_MISC_BIOS_VERSION)
|
|
);
|
|
|
|
HiiUpdateForm (
|
|
HiiHandle,
|
|
NULL,
|
|
ROOT_FORM_ID,
|
|
StartOpCodeHandle,
|
|
EndOpCodeHandle
|
|
);
|
|
|
|
HiiFreeOpCodeHandle (StartOpCodeHandle);
|
|
HiiFreeOpCodeHandle (EndOpCodeHandle);
|
|
|
|
return Status;
|
|
}
|
|
|
|
/**
|
|
Update BIOS build time string tokens
|
|
|
|
@param[in] HiiHandle Target EFI_HII_HANDLE instance
|
|
|
|
@retval EFI_SUCCESS Udpate string token successfully
|
|
@retval Other Fail to get BVDT information
|
|
**/
|
|
STATIC
|
|
EFI_STATUS
|
|
UpdateBiosBuildDateTimeFromBvdt (
|
|
IN EFI_HII_HANDLE HiiHandle
|
|
)
|
|
{
|
|
UINTN StrBufferSize;
|
|
CHAR16 StrBuffer[BVDT_MAX_STR_SIZE];
|
|
EFI_STATUS Status;
|
|
VOID *StartOpCodeHandle;
|
|
EFI_IFR_GUID_LABEL *StartLabel;
|
|
|
|
//
|
|
// Update string tokens of BIOS build time item from BVDT
|
|
//
|
|
StrBufferSize = BVDT_MAX_STR_SIZE;
|
|
Status = GetBvdtInfo (BvdtBuildDate, &StrBufferSize, StrBuffer);
|
|
if (EFI_ERROR (Status)) {
|
|
return Status;
|
|
}
|
|
HiiSetString (HiiHandle, (EFI_STRING_ID) STRING_TOKEN (STR_BIOS_BUILD_DATE_STRING), StrBuffer, NULL);
|
|
|
|
StrBufferSize = BVDT_MAX_STR_SIZE;
|
|
Status = GetBvdtInfo (BvdtBuildTime, &StrBufferSize, StrBuffer);
|
|
if (EFI_ERROR (Status)) {
|
|
return Status;
|
|
}
|
|
HiiSetString (HiiHandle, (EFI_STRING_ID)STRING_TOKEN (STR_BIOS_BUILD_TIME_STRING), StrBuffer, NULL);
|
|
|
|
//
|
|
// Update the label of BIOS build time item
|
|
//
|
|
StartOpCodeHandle = HiiAllocateOpCodeHandle ();
|
|
ASSERT (StartOpCodeHandle != NULL);
|
|
|
|
StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (StartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));
|
|
StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
|
|
StartLabel->Number = BIOS_BUILD_TIME_LABEL;
|
|
|
|
HiiCreateTextOpCode (
|
|
StartOpCodeHandle,
|
|
(EFI_STRING_ID)STRING_TOKEN(STR_BIOS_BUILD_DATE_PROMPT),
|
|
0,
|
|
(EFI_STRING_ID)STRING_TOKEN(STR_BIOS_BUILD_DATE_STRING)
|
|
);
|
|
HiiCreateTextOpCode (
|
|
StartOpCodeHandle,
|
|
(EFI_STRING_ID) STRING_TOKEN(STR_BIOS_BUILD_TIME_PROMPT),
|
|
0,
|
|
(EFI_STRING_ID)STRING_TOKEN(STR_BIOS_BUILD_TIME_STRING)
|
|
);
|
|
|
|
Status = HiiUpdateForm (
|
|
HiiHandle,
|
|
NULL,
|
|
ROOT_FORM_ID,
|
|
StartOpCodeHandle,
|
|
NULL
|
|
);
|
|
|
|
HiiFreeOpCodeHandle (StartOpCodeHandle);
|
|
|
|
return EFI_SUCCESS;
|
|
}
|
|
|
|
/**
|
|
Update the language item with all of support languages for main menu use.
|
|
|
|
@param HiiHandle Hii hanlde for the call back routine
|
|
|
|
@retval EFI_SUCCESS Udpate string token successfully
|
|
@return Other Error occurred during execution.
|
|
|
|
**/
|
|
STATIC
|
|
EFI_STATUS
|
|
UpdateLanguage (
|
|
IN EFI_HII_HANDLE HiiHandle
|
|
)
|
|
{
|
|
EFI_STATUS Status;
|
|
KERNEL_CONFIGURATION SetupNvData;
|
|
UINT16 VarOffset;
|
|
UINT16 *StringBuffer;
|
|
UINTN Index;
|
|
UINTN OptionCount;
|
|
EFI_STRING_ID Token;
|
|
CHAR8 *LanguageString;
|
|
UINTN LangNum;
|
|
VOID *StartOpCodeHandle;
|
|
VOID *OptionsOpCodeHandle;
|
|
EFI_IFR_GUID_LABEL *StartLabel;
|
|
SETUP_UTILITY_BROWSER_DATA *SuBrowser;
|
|
CHAR8 *PlatformLangVar;
|
|
UINT8 PlatformLangValue;
|
|
CHAR8 DefaultLangCode[]="en-US";
|
|
UINT8 DefaultLangValue;
|
|
|
|
Status = GetSetupUtilityBrowserData (&SuBrowser);
|
|
if (EFI_ERROR (Status)) {
|
|
return Status;
|
|
}
|
|
|
|
Status = GetLangDatabase (
|
|
&LangNum,
|
|
(UINT8 **) &LanguageString
|
|
);
|
|
if (EFI_ERROR (Status)) {
|
|
return Status;
|
|
}
|
|
|
|
PlatformLangVar = CommonGetVariableData (
|
|
L"PlatformLang",
|
|
&gEfiGlobalVariableGuid
|
|
);
|
|
|
|
//
|
|
// Init OpCode Handle and Allocate space for creation of UpdateData Buffer
|
|
//
|
|
StartOpCodeHandle = HiiAllocateOpCodeHandle ();
|
|
ASSERT (StartOpCodeHandle != NULL);
|
|
|
|
OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();
|
|
ASSERT (OptionsOpCodeHandle != NULL);
|
|
|
|
//
|
|
// Create Hii Extend Label OpCode as the start opcode
|
|
//
|
|
StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (StartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));
|
|
StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
|
|
StartLabel->Number = SETUP_UTILITY_LANG_MENU;
|
|
|
|
|
|
OptionCount = 0;
|
|
|
|
DefaultLangValue = (UINT8) LangNum;
|
|
PlatformLangValue = (UINT8) LangNum;
|
|
for (Index = 0; Index < LangNum; Index++) {
|
|
if ((AsciiStrnCmp (&LanguageString[Index * RFC_3066_ENTRY_SIZE], UEFI_CONFIG_LANG, AsciiStrLen (UEFI_CONFIG_LANG)) == 0) ||
|
|
(AsciiStrnCmp (&LanguageString[Index * RFC_3066_ENTRY_SIZE], UEFI_CONFIG_LANG_2, AsciiStrLen (UEFI_CONFIG_LANG_2)) == 0)) {
|
|
continue;
|
|
}
|
|
StringBuffer = HiiGetString (
|
|
HiiHandle,
|
|
PRINTABLE_LANGUAGE_NAME_STRING_ID,
|
|
&LanguageString[Index * RFC_3066_ENTRY_SIZE]
|
|
);
|
|
ASSERT (StringBuffer != NULL);
|
|
|
|
Token = HiiSetString (HiiHandle, 0, StringBuffer, NULL);
|
|
FreePool (StringBuffer);
|
|
|
|
HiiCreateOneOfOptionOpCode (
|
|
OptionsOpCodeHandle,
|
|
Token,
|
|
OptionCount == 0 ? EFI_IFR_OPTION_DEFAULT : 0,
|
|
EFI_IFR_NUMERIC_SIZE_1,
|
|
(UINT8) OptionCount
|
|
);
|
|
|
|
if (PlatformLangVar != NULL && AsciiStrCmp (PlatformLangVar, &LanguageString[Index * RFC_3066_ENTRY_SIZE]) == 0) {
|
|
PlatformLangValue = (UINT8) Index;
|
|
}
|
|
if (AsciiStrCmp (DefaultLangCode, &LanguageString[Index * RFC_3066_ENTRY_SIZE]) == 0) {
|
|
DefaultLangValue = (UINT8) Index;
|
|
}
|
|
|
|
OptionCount++;
|
|
}
|
|
|
|
VarOffset = (UINT16)((UINTN)(&SetupNvData.Language) - (UINTN)(&SetupNvData));
|
|
|
|
HiiCreateOneOfOpCode (
|
|
StartOpCodeHandle,
|
|
KEY_LANGUAGE_UPDATE,
|
|
CONFIGURATION_VARSTORE_ID,
|
|
VarOffset,
|
|
STRING_TOKEN (STR_LANGUAGE_PROMPT),
|
|
STRING_TOKEN (STR_LANGUAGE_HELP),
|
|
EFI_IFR_FLAG_CALLBACK,
|
|
EFI_IFR_NUMERIC_SIZE_1,
|
|
OptionsOpCodeHandle,
|
|
NULL
|
|
);
|
|
|
|
Status = HiiUpdateForm (
|
|
HiiHandle,
|
|
NULL,
|
|
ROOT_FORM_ID,
|
|
StartOpCodeHandle,
|
|
NULL
|
|
);
|
|
|
|
//
|
|
// Make sure that PlatformLang variable is included in language list.
|
|
// Sync language value between PlatformLang variable and language of Setup variable.
|
|
//
|
|
if (PlatformLangValue == LangNum) {
|
|
PlatformLangValue = DefaultLangValue;
|
|
CommonSetVariable (
|
|
L"PlatformLang",
|
|
&gEfiGlobalVariableGuid,
|
|
EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
|
|
sizeof (DefaultLangCode),
|
|
DefaultLangCode
|
|
);
|
|
}
|
|
|
|
if (((KERNEL_CONFIGURATION *) SuBrowser->SCBuffer)->Language != PlatformLangValue) {
|
|
((KERNEL_CONFIGURATION *) SuBrowser->SCBuffer)->Language = PlatformLangValue;
|
|
UpdateStringToken ((KERNEL_CONFIGURATION *) SuBrowser->SCBuffer);
|
|
}
|
|
|
|
if (LangNum != 0) {
|
|
FreePool (LanguageString);
|
|
}
|
|
|
|
HiiFreeOpCodeHandle (StartOpCodeHandle);
|
|
HiiFreeOpCodeHandle (OptionsOpCodeHandle);
|
|
if (PlatformLangVar != NULL) {
|
|
FreePool (PlatformLangVar);
|
|
}
|
|
|
|
return Status;
|
|
}
|
|
|
|
/**
|
|
Update the copyright for main menu use.
|
|
|
|
@param [in] HiiHandle Hii hanlde for the call back routine
|
|
|
|
@retval EFI_SUCCESS Function has completed successfully.
|
|
@return Others Error occurred during execution.
|
|
|
|
**/
|
|
STATIC
|
|
EFI_STATUS
|
|
UpdateCopyRight (
|
|
IN EFI_HII_HANDLE HiiHandle
|
|
)
|
|
{
|
|
EFI_STATUS Status;
|
|
VOID *StartOpCodeHandle;
|
|
EFI_IFR_GUID_LABEL *StartLabel;
|
|
UINTN Index;
|
|
|
|
|
|
Index = 1;
|
|
|
|
if (FeaturePcdGet (PcdH2OFormBrowserLocalMetroDESupported)) {
|
|
mCopyrightStrList[Index++] = STRING_TOKEN (STR_GRAPHICS_SETUP_COPYRIGHT);
|
|
}
|
|
|
|
if (mCopyrightStrList[1] == 0) {
|
|
return EFI_SUCCESS;
|
|
}
|
|
|
|
//
|
|
// Init OpCode Handle and Allocate space for creation of UpdateData Buffer
|
|
//
|
|
StartOpCodeHandle = HiiAllocateOpCodeHandle ();
|
|
ASSERT (StartOpCodeHandle != NULL);
|
|
|
|
StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (StartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));
|
|
StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
|
|
StartLabel->Number = COPYRIGHT_LABEL;
|
|
|
|
HiiCreateSubTitleOpCode (StartOpCodeHandle, STRING_TOKEN (STR_BLANK_STRING), 0, 0, 0);
|
|
HiiCreateActionOpCode (
|
|
StartOpCodeHandle,
|
|
KEY_ABOUT_THIS_SOFTWARE,
|
|
STRING_TOKEN(STR_ABOUT_THIS_SOFTWARE),
|
|
STRING_TOKEN(STR_BLANK_STRING),
|
|
EFI_IFR_FLAG_CALLBACK,
|
|
0
|
|
);
|
|
|
|
Status = HiiUpdateForm (HiiHandle, NULL, ROOT_FORM_ID, StartOpCodeHandle, NULL);
|
|
HiiFreeOpCodeHandle (StartOpCodeHandle);
|
|
|
|
return Status;
|
|
}
|
|
|
|
/**
|
|
Initialize main menu for setuputility use
|
|
|
|
@param HiiHandle Hii hanlde for the call back routine
|
|
|
|
@retval EFI_SUCCESS Udpate string token successfully
|
|
@return Other Error occurred during execution.
|
|
|
|
**/
|
|
STATIC
|
|
EFI_STATUS
|
|
InitMainMenu (
|
|
IN EFI_HII_HANDLE HiiHandle
|
|
)
|
|
{
|
|
EFI_STATUS Status;
|
|
|
|
|
|
UpdateBiosVersionFromBvdt (HiiHandle);
|
|
UpdateBiosBuildDateTimeFromBvdt (HiiHandle);
|
|
|
|
Status = FindUpdateString (
|
|
0,
|
|
0x05,
|
|
HiiHandle,
|
|
((EFI_STRING_ID)STRING_TOKEN (STR_MISC_BIOS_VERSION))
|
|
);
|
|
|
|
//
|
|
// Update System Information
|
|
//
|
|
Status = UpdateSystemInfo (HiiHandle);
|
|
|
|
//
|
|
// Update current language
|
|
//
|
|
Status = UpdateLanguage (HiiHandle);
|
|
|
|
UpdateCopyRight (HiiHandle);
|
|
|
|
return Status;
|
|
}
|
|
|
|
/**
|
|
Update the content of string tokens while changing language.
|
|
|
|
@param IfrNVData Point to KERNEL_CONFIGURATION instance.
|
|
|
|
@retval EFI_SUCCESS Udpate string token successfully
|
|
@return Other Cannot find SETUP_UTILITY_BROWSER_DATA instance.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
UpdateStringToken (
|
|
IN KERNEL_CONFIGURATION *IfrNVData
|
|
)
|
|
{
|
|
SETUP_UTILITY_CONFIGURATION *SUCInfo;
|
|
SETUP_UTILITY_BROWSER_DATA *SuBrowser;
|
|
EFI_STATUS Status;
|
|
|
|
Status = GetSetupUtilityBrowserData (&SuBrowser);
|
|
if (EFI_ERROR (Status)) {
|
|
return Status;
|
|
}
|
|
|
|
SUCInfo = SuBrowser->SUCInfo;
|
|
|
|
UpdatePasswordState (SUCInfo->MapTable[SecurityHiiHandle].HiiHandle);
|
|
if (IfrNVData->NewPositionPolicy == IN_AUTO) {
|
|
ChangeToAutoBootOrder (
|
|
SUCInfo->AdvBootDeviceNum,
|
|
SUCInfo->BootOrder
|
|
);
|
|
}
|
|
|
|
SetupUtilityLibUpdateDeviceString (SUCInfo->MapTable[BootHiiHandle].HiiHandle, IfrNVData);
|
|
|
|
return EFI_SUCCESS;
|
|
}
|
|
|
|
/**
|
|
This function is called by the forms browser in response to a user action on a question which has the
|
|
EFI_IFR_FLAG_CALLBACK bit set in the EFI_IFR_QUESTION_HEADER. The user action is specified by Action.
|
|
Depending on the action, the browser may also pass the question value using Type and Value. Upon return,
|
|
the callback function may specify the desired browser action. Callback functions should return
|
|
EFI_UNSUPPORTEDfor all values of Action that they do not support.
|
|
|
|
@param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
|
|
@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. The format of the data tends to vary based on the opcode that
|
|
generated the callback.
|
|
@param Type The type of value for the question.
|
|
@param Value A pointer to the data being sent to the original exporting driver. The type is specified
|
|
by Type. Type EFI_IFR_TYPE_VALUE is defined in EFI_IFR_ONE_OF_OPTION.
|
|
@param ActionRequest On return, points to the action requested by the callback function. Type
|
|
EFI_BROWSER_ACTION_REQUEST is specified in SendForm() in the Form Browser Protocol.
|
|
|
|
@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.
|
|
@return EFI_UNSUPPORTED The specified Action is not supported by the callback.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
MainCallbackRoutine (
|
|
IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
|
|
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
|
|
)
|
|
{
|
|
EFI_STATUS Status;
|
|
CHAR16 *StringPtr;
|
|
EFI_HII_HANDLE HiiHandle;
|
|
EFI_CALLBACK_INFO *CallbackInfo;
|
|
EFI_SETUP_UTILITY_BROWSER_PROTOCOL *Interface;
|
|
UINTN BufferSize;
|
|
SETUP_UTILITY_BROWSER_DATA *SuBrowser;
|
|
CHAR16 *TitleString;
|
|
CHAR16 *CopyrightStr;
|
|
UINTN StrLength;
|
|
UINTN Index;
|
|
EFI_GUID VarStoreGuid = SYSTEM_CONFIGURATION_GUID;
|
|
|
|
if (Action != EFI_BROWSER_ACTION_CHANGED) {
|
|
return MainCallbackRoutineByAction (This, Action, QuestionId, Type, Value, ActionRequest);
|
|
}
|
|
|
|
*ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;
|
|
CallbackInfo = EFI_CALLBACK_INFO_FROM_THIS (This);
|
|
|
|
Status = GetSetupUtilityBrowserData (&SuBrowser);
|
|
if (EFI_ERROR (Status)) {
|
|
return Status;
|
|
}
|
|
|
|
BufferSize = GetVarStoreSize (CallbackInfo->HiiHandle, &CallbackInfo->FormsetGuid, &VarStoreGuid, "SystemConfig");
|
|
Interface = NULL;
|
|
|
|
Status = SetupVariableConfig (
|
|
&VarStoreGuid,
|
|
L"SystemConfig",
|
|
BufferSize,
|
|
(UINT8 *) SuBrowser->SCBuffer,
|
|
TRUE
|
|
);
|
|
Status = EFI_SUCCESS;
|
|
StringPtr = NULL;
|
|
HiiHandle = CallbackInfo->HiiHandle;
|
|
|
|
switch (QuestionId) {
|
|
|
|
case KEY_LANGUAGE_UPDATE:
|
|
UpdateLangItem (This, &(((KERNEL_CONFIGURATION *) SuBrowser->SCBuffer)->Language));
|
|
UpdateStringToken ((KERNEL_CONFIGURATION *) SuBrowser->SCBuffer);
|
|
BrowserRefreshFormSet ();
|
|
break;
|
|
|
|
case KEY_ABOUT_THIS_SOFTWARE:
|
|
|
|
if (mCopyrightStrList[1] == 0) {
|
|
break;
|
|
}
|
|
|
|
for (Index = 0, StrLength = 0; mCopyrightStrList[Index] != 0; Index++) {
|
|
StringPtr = HiiGetString (CallbackInfo->HiiHandle, mCopyrightStrList[Index], NULL);
|
|
if (StringPtr == NULL) {
|
|
return EFI_OUT_OF_RESOURCES;
|
|
}
|
|
StrLength += StrSize (StringPtr);
|
|
FreePool (StringPtr);
|
|
}
|
|
|
|
CopyrightStr = AllocateZeroPool (StrLength);
|
|
if (CopyrightStr == NULL) {
|
|
return EFI_OUT_OF_RESOURCES;
|
|
}
|
|
|
|
for (Index = 0; mCopyrightStrList[Index] != 0; Index++) {
|
|
StringPtr = HiiGetString (CallbackInfo->HiiHandle, mCopyrightStrList[Index], NULL);
|
|
if (StringPtr == NULL) {
|
|
return EFI_OUT_OF_RESOURCES;
|
|
}
|
|
StrCatS (CopyrightStr, StrLength / sizeof(CHAR16), StringPtr);
|
|
FreePool (StringPtr);
|
|
}
|
|
|
|
TitleString = HiiGetString (CallbackInfo->HiiHandle, STRING_TOKEN (STR_ABOUT_THIS_SOFTWARE), NULL);
|
|
if (TitleString == NULL) {
|
|
return EFI_OUT_OF_RESOURCES;
|
|
}
|
|
|
|
SuBrowser->H2ODialog->ShowPageInfo (
|
|
TitleString,
|
|
CopyrightStr
|
|
);
|
|
FreePool (TitleString);
|
|
FreePool (CopyrightStr);
|
|
break;
|
|
default:
|
|
Status = SuBrowser->HotKeyCallback (
|
|
This,
|
|
Action,
|
|
QuestionId,
|
|
Type,
|
|
Value,
|
|
ActionRequest
|
|
);
|
|
break;
|
|
}
|
|
|
|
SetupVariableConfig (
|
|
&VarStoreGuid,
|
|
L"SystemConfig",
|
|
BufferSize,
|
|
(UINT8 *) SuBrowser->SCBuffer,
|
|
FALSE
|
|
);
|
|
|
|
return Status;
|
|
}
|
|
|
|
EFI_STATUS
|
|
MainCallbackRoutineByAction (
|
|
IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
|
|
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
|
|
)
|
|
{
|
|
EFI_STATUS Status;
|
|
EFI_CALLBACK_INFO *CallbackInfo;
|
|
UINTN BufferSize;
|
|
SETUP_UTILITY_BROWSER_DATA *SuBrowser;
|
|
EFI_GUID VarStoreGuid = SYSTEM_CONFIGURATION_GUID;
|
|
|
|
if ((This == NULL) ||
|
|
((Value == NULL) &&
|
|
(Action != EFI_BROWSER_ACTION_FORM_OPEN) &&
|
|
(Action != EFI_BROWSER_ACTION_FORM_CLOSE))||
|
|
(ActionRequest == NULL)) {
|
|
return EFI_INVALID_PARAMETER;
|
|
}
|
|
|
|
Status = GetSetupUtilityBrowserData (&SuBrowser);
|
|
if (EFI_ERROR (Status)) {
|
|
return Status;
|
|
}
|
|
|
|
CallbackInfo = EFI_CALLBACK_INFO_FROM_THIS (This);
|
|
BufferSize = GetVarStoreSize (CallbackInfo->HiiHandle, &CallbackInfo->FormsetGuid, &VarStoreGuid, "SystemConfig");
|
|
Status = EFI_UNSUPPORTED;
|
|
*ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;
|
|
|
|
switch (Action) {
|
|
|
|
case EFI_BROWSER_ACTION_FORM_OPEN:
|
|
if (QuestionId == 0) {
|
|
Status = SetupVariableConfig (
|
|
&VarStoreGuid,
|
|
L"SystemConfig",
|
|
BufferSize,
|
|
(UINT8 *) SuBrowser->SCBuffer,
|
|
FALSE
|
|
);
|
|
}
|
|
break;
|
|
|
|
case EFI_BROWSER_ACTION_FORM_CLOSE:
|
|
if (QuestionId == 0) {
|
|
Status = SetupVariableConfig (
|
|
&VarStoreGuid,
|
|
L"SystemConfig",
|
|
BufferSize,
|
|
(UINT8 *) SuBrowser->SCBuffer,
|
|
TRUE
|
|
);
|
|
}
|
|
break;
|
|
|
|
case EFI_BROWSER_ACTION_CHANGING:
|
|
Status = EFI_SUCCESS;
|
|
break;
|
|
|
|
case EFI_BROWSER_ACTION_DEFAULT_MANUFACTURING:
|
|
if (QuestionId == KEY_SCAN_F9) {
|
|
Status = SuBrowser->HotKeyCallback (
|
|
This,
|
|
Action,
|
|
QuestionId,
|
|
Type,
|
|
Value,
|
|
ActionRequest
|
|
);
|
|
SetupVariableConfig (
|
|
&VarStoreGuid,
|
|
L"SystemConfig",
|
|
BufferSize,
|
|
(UINT8 *) SuBrowser->SCBuffer,
|
|
FALSE
|
|
);
|
|
}
|
|
//
|
|
// avoid GetQuestionDefault execute ExtractConfig
|
|
//
|
|
return EFI_SUCCESS;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return Status;
|
|
}
|
|
|
|
/**
|
|
Install Main Callback routine.
|
|
|
|
@param DriverHandle Specific driver handle for the call back routine
|
|
@param HiiHandle Hii hanlde for the call back routine
|
|
|
|
@retval EFI_SUCCESS Function has completed successfully.
|
|
@return Other Error occurred during execution.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
InstallMainCallbackRoutine (
|
|
IN EFI_HANDLE DriverHandle,
|
|
IN EFI_HII_HANDLE HiiHandle
|
|
)
|
|
{
|
|
EFI_STATUS Status;
|
|
SETUP_UTILITY_BROWSER_DATA *SuBrowser;
|
|
EFI_GUID FormsetGuid = FORMSET_ID_GUID_MAIN;
|
|
|
|
Status = GetSetupUtilityBrowserData (&SuBrowser);
|
|
if (EFI_ERROR (Status)) {
|
|
return Status;
|
|
}
|
|
|
|
mMainCallBackInfo = AllocatePool (sizeof(EFI_CALLBACK_INFO));
|
|
if (mMainCallBackInfo == NULL) {
|
|
return EFI_OUT_OF_RESOURCES;
|
|
}
|
|
|
|
mMainCallBackInfo->Signature = EFI_CALLBACK_INFO_SIGNATURE;
|
|
mMainCallBackInfo->DriverCallback.ExtractConfig = SuBrowser->ExtractConfig;
|
|
mMainCallBackInfo->DriverCallback.RouteConfig = SuBrowser->RouteConfig;
|
|
mMainCallBackInfo->DriverCallback.Callback = MainCallbackRoutine;
|
|
mMainCallBackInfo->HiiHandle = HiiHandle;
|
|
CopyGuid (&mMainCallBackInfo->FormsetGuid, &FormsetGuid);
|
|
|
|
//
|
|
// Install protocol interface
|
|
//
|
|
Status = gBS->InstallProtocolInterface (
|
|
&DriverHandle,
|
|
&gEfiHiiConfigAccessProtocolGuid,
|
|
EFI_NATIVE_INTERFACE,
|
|
&mMainCallBackInfo->DriverCallback
|
|
);
|
|
ASSERT_EFI_ERROR (Status);
|
|
|
|
Status = InitMainMenu (HiiHandle);
|
|
|
|
return Status;
|
|
}
|
|
|
|
/**
|
|
Uninstall Main Callback routine.
|
|
|
|
@param DriverHandle Specific driver handle for the call back routine
|
|
|
|
@retval EFI_SUCCESS Function has completed successfully.
|
|
@return Other Error occurred during execution.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
UninstallMainCallbackRoutine (
|
|
IN EFI_HANDLE DriverHandle
|
|
)
|
|
{
|
|
EFI_STATUS Status;
|
|
|
|
if (mMainCallBackInfo == NULL) {
|
|
return EFI_SUCCESS;
|
|
}
|
|
Status = gBS->UninstallProtocolInterface (
|
|
DriverHandle,
|
|
&gEfiHiiConfigAccessProtocolGuid,
|
|
&mMainCallBackInfo->DriverCallback
|
|
);
|
|
ASSERT_EFI_ERROR (Status);
|
|
FreePool (mMainCallBackInfo);
|
|
mMainCallBackInfo = NULL;
|
|
return Status;
|
|
}
|