/** @file\r
FrontPage routines to handle the callbacks and browser calls\r
\r
-Copyright (c) 2004 - 2008, Intel Corporation. <BR>\r
+Copyright (c) 2004 - 2009, Intel Corporation. <BR>\r
All rights reserved. This program and the accompanying materials\r
are licensed and made available under the terms and conditions of the BSD License\r
which accompanies this distribution. The full text of the license may be found at\r
\r
#include "Bds.h"\r
#include "FrontPage.h"\r
+#include "Language.h"\r
\r
EFI_GUID mFrontPageGuid = FRONT_PAGE_FORMSET_GUID;\r
\r
}\r
};\r
\r
+HII_VENDOR_DEVICE_PATH mFrontPageHiiVendorDevicePath = {\r
+ {\r
+ {\r
+ HARDWARE_DEVICE_PATH,\r
+ HW_VENDOR_DP,\r
+ {\r
+ (UINT8) (sizeof (VENDOR_DEVICE_PATH)),\r
+ (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)\r
+ }\r
+ },\r
+ //\r
+ // {8E6D99EE-7531-48f8-8745-7F6144468FF2}\r
+ //\r
+ { 0x8e6d99ee, 0x7531, 0x48f8, { 0x87, 0x45, 0x7f, 0x61, 0x44, 0x46, 0x8f, 0xf2 } }\r
+ },\r
+ {\r
+ END_DEVICE_PATH_TYPE,\r
+ END_ENTIRE_DEVICE_PATH_SUBTYPE,\r
+ { \r
+ (UINT8) (END_DEVICE_PATH_LENGTH),\r
+ (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8)\r
+ }\r
+ }\r
+};\r
+\r
/**\r
This function allows a caller to extract the current configuration for one\r
or more named elements from the target driver.\r
OUT EFI_STRING *Results\r
)\r
{\r
+ if (Request == NULL || Progress == NULL || Results == NULL) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+ *Progress = Request;\r
return EFI_NOT_FOUND;\r
}\r
\r
OUT EFI_STRING *Progress\r
)\r
{\r
+ if (Configuration == NULL || Progress == NULL) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ *Progress = Configuration;\r
+ if (!HiiIsConfigHdrMatch (Configuration, &mBootMaintGuid, mBootMaintStorageName)\r
+ && !HiiIsConfigHdrMatch (Configuration, &mFileExplorerGuid, mFileExplorerStorageName)) {\r
+ return EFI_NOT_FOUND;\r
+ }\r
+\r
+ *Progress = Configuration + StrLen (Configuration);\r
return EFI_SUCCESS;\r
}\r
\r
{\r
CHAR8 *LanguageString;\r
CHAR8 *LangCode;\r
- CHAR8 Lang[RFC_3066_ENTRY_SIZE];\r
- CHAR8 OldLang[ISO_639_2_ENTRY_SIZE];\r
+ CHAR8 *Lang;\r
UINTN Index;\r
EFI_STATUS Status;\r
+ CHAR8 *PlatformSupportedLanguages;\r
+ CHAR8 *BestLanguage;\r
\r
if ((Value == NULL) || (ActionRequest == NULL)) {\r
return EFI_INVALID_PARAMETER;\r
//\r
// Collect the languages from what our current Language support is based on our VFR\r
//\r
- LanguageString = HiiLibGetSupportedLanguages (gFrontPagePrivate.HiiHandle);\r
+ LanguageString = HiiGetSupportedLanguages (gFrontPagePrivate.HiiHandle);\r
ASSERT (LanguageString != NULL);\r
-\r
+ //\r
+ // Allocate working buffer for RFC 4646 language in supported LanguageString.\r
+ //\r
+ Lang = AllocatePool (AsciiStrSize (LanguageString));\r
+ ASSERT (Lang != NULL);\r
+ \r
Index = 0;\r
LangCode = LanguageString;\r
while (*LangCode != 0) {\r
- HiiLibGetNextLanguage (&LangCode, Lang);\r
+ GetNextLanguage (&LangCode, Lang);\r
\r
if (Index == Value->u8) {\r
break;\r
Index++;\r
}\r
\r
- Status = gRT->SetVariable (\r
- L"PlatformLang",\r
- &gEfiGlobalVariableGuid,\r
- EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
- AsciiStrSize (Lang),\r
- Lang\r
- );\r
-\r
- if (!FeaturePcdGet (PcdUefiVariableDefaultLangDeprecate)) {\r
- //\r
- // Set UEFI deprecated variable "Lang" for backwards compatibility\r
- //\r
- Status = ConvertRfc3066LanguageToIso639Language (Lang, OldLang);\r
- if (!EFI_ERROR (Status)) {\r
- Status = gRT->SetVariable (\r
- L"Lang",\r
- &gEfiGlobalVariableGuid,\r
- EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
- ISO_639_2_ENTRY_SIZE,\r
- OldLang\r
- );\r
- }\r
+ PlatformSupportedLanguages = GetEfiGlobalVariable (L"PlatformLangCodes");\r
+ if (PlatformSupportedLanguages == NULL) {\r
+ PlatformSupportedLanguages = AllocateCopyPool (\r
+ AsciiStrSize ((CHAR8 *) PcdGetPtr (PcdUefiVariableDefaultPlatformLangCodes)),\r
+ (CHAR8 *) PcdGetPtr (PcdUefiVariableDefaultPlatformLangCodes)\r
+ );\r
+ ASSERT (PlatformSupportedLanguages != NULL);\r
+ }\r
+ \r
+ //\r
+ // Select the best language in platform supported Language.\r
+ //\r
+ BestLanguage = GetBestLanguage (\r
+ PlatformSupportedLanguages,\r
+ FALSE,\r
+ Lang,\r
+ NULL\r
+ );\r
+ if (BestLanguage != NULL) {\r
+ Status = gRT->SetVariable (\r
+ L"PlatformLang",\r
+ &gEfiGlobalVariableGuid,\r
+ EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
+ AsciiStrSize (BestLanguage),\r
+ Lang\r
+ );\r
+ ASSERT_EFI_ERROR(Status);\r
+ FreePool (BestLanguage);\r
+ } else {\r
+ ASSERT (FALSE);\r
}\r
\r
+ FreePool (PlatformSupportedLanguages);\r
+ FreePool (Lang);\r
FreePool (LanguageString);\r
break;\r
\r
)\r
{\r
EFI_STATUS Status;\r
- EFI_HII_PACKAGE_LIST_HEADER *PackageList;\r
- EFI_HII_UPDATE_DATA UpdateData;\r
- IFR_OPTION *OptionList;\r
CHAR8 *LanguageString;\r
CHAR8 *LangCode;\r
- CHAR8 Lang[RFC_3066_ENTRY_SIZE];\r
- CHAR8 CurrentLang[RFC_3066_ENTRY_SIZE];\r
+ CHAR8 *Lang;\r
+ CHAR8 *CurrentLang;\r
+ CHAR8 *BestLanguage;\r
UINTN OptionCount;\r
- EFI_STRING_ID Token;\r
CHAR16 *StringBuffer;\r
UINTN BufferSize;\r
- UINTN Index;\r
EFI_HII_HANDLE HiiHandle;\r
+ VOID *OptionsOpCodeHandle;\r
+ VOID *StartOpCodeHandle;\r
+ VOID *EndOpCodeHandle;\r
+ EFI_IFR_GUID_LABEL *StartLabel;\r
+ EFI_IFR_GUID_LABEL *EndLabel;\r
+ BOOLEAN FirstFlag;\r
\r
if (InitializeHiiData) {\r
//\r
}\r
\r
//\r
- // Create driver handle used by HII database\r
- //\r
- Status = HiiLibCreateHiiDriverHandle (&gFrontPagePrivate.DriverHandle);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- //\r
- // Install Config Access protocol to driver handle\r
+ // Install Device Path Protocol and Config Access protocol to driver handle\r
//\r
- Status = gBS->InstallProtocolInterface (\r
+ Status = gBS->InstallMultipleProtocolInterfaces (\r
&gFrontPagePrivate.DriverHandle,\r
+ &gEfiDevicePathProtocolGuid,\r
+ &mFrontPageHiiVendorDevicePath,\r
&gEfiHiiConfigAccessProtocolGuid,\r
- EFI_NATIVE_INTERFACE,\r
- &gFrontPagePrivate.ConfigAccess\r
+ &gFrontPagePrivate.ConfigAccess,\r
+ NULL\r
);\r
ASSERT_EFI_ERROR (Status);\r
\r
//\r
// Publish our HII data\r
//\r
- PackageList = HiiLibPreparePackageList (2, &mFrontPageGuid, FrontPageVfrBin, BdsDxeStrings);\r
- ASSERT (PackageList != NULL);\r
-\r
- Status = gHiiDatabase->NewPackageList (\r
- gHiiDatabase,\r
- PackageList,\r
- gFrontPagePrivate.DriverHandle,\r
- &gFrontPagePrivate.HiiHandle\r
- );\r
- FreePool (PackageList);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
+ gFrontPagePrivate.HiiHandle = HiiAddPackages (\r
+ &mFrontPageGuid,\r
+ gFrontPagePrivate.DriverHandle,\r
+ FrontPageVfrBin,\r
+ BdsDxeStrings,\r
+ NULL\r
+ );\r
+ if (gFrontPagePrivate.HiiHandle == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
}\r
}\r
\r
+\r
//\r
- // Get current language setting\r
+ // Init OpCode Handle and Allocate space for creation of UpdateData Buffer\r
//\r
- GetCurrentLanguage (CurrentLang);\r
+ StartOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+ ASSERT (StartOpCodeHandle != NULL);\r
\r
+ EndOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+ ASSERT (EndOpCodeHandle != NULL);\r
+\r
+ OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+ ASSERT (OptionsOpCodeHandle != NULL);\r
//\r
- // Allocate space for creation of UpdateData Buffer\r
+ // Create Hii Extend Label OpCode as the start opcode\r
//\r
- UpdateData.BufferSize = 0x1000;\r
- UpdateData.Data = AllocateZeroPool (0x1000);\r
- ASSERT (UpdateData.Data != NULL);\r
+ StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (StartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
+ StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
+ StartLabel->Number = LABEL_SELECT_LANGUAGE;\r
\r
- OptionList = AllocateZeroPool (0x1000);\r
- ASSERT (OptionList != NULL);\r
+ //\r
+ // Create Hii Extend Label OpCode as the end opcode\r
+ //\r
+ EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (EndOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
+ EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
+ EndLabel->Number = LABEL_END;\r
\r
//\r
// Collect the languages from what our current Language support is based on our VFR\r
//\r
HiiHandle = gFrontPagePrivate.HiiHandle;\r
- LanguageString = HiiLibGetSupportedLanguages (HiiHandle);\r
+ LanguageString = HiiGetSupportedLanguages (HiiHandle);\r
ASSERT (LanguageString != NULL);\r
+ //\r
+ // Allocate working buffer for RFC 4646 language in supported LanguageString.\r
+ //\r
+ Lang = AllocatePool (AsciiStrSize (LanguageString));\r
+ ASSERT (Lang != NULL);\r
+\r
+ CurrentLang = GetEfiGlobalVariable (L"PlatformLang");\r
+ //\r
+ // Select the best language in LanguageString as the default one.\r
+ //\r
+ BestLanguage = GetBestLanguage (\r
+ LanguageString,\r
+ FALSE,\r
+ (CurrentLang != NULL) ? CurrentLang : "",\r
+ (CHAR8 *) PcdGetPtr (PcdUefiVariableDefaultPlatformLang),\r
+ LanguageString,\r
+ NULL\r
+ );\r
+ //\r
+ // BestLanguage must be selected as it is the first language in LanguageString by default\r
+ //\r
+ ASSERT (BestLanguage != NULL);\r
+\r
+ OptionCount = 0;\r
+ LangCode = LanguageString;\r
+ FirstFlag = FALSE;\r
+ \r
+ if (gFrontPagePrivate.LanguageToken == NULL) {\r
+ while (*LangCode != 0) {\r
+ GetNextLanguage (&LangCode, Lang);\r
+ OptionCount ++;\r
+ }\r
+ gFrontPagePrivate.LanguageToken = AllocatePool (OptionCount * sizeof (EFI_STRING_ID));\r
+ ASSERT (gFrontPagePrivate.LanguageToken != NULL);\r
+ FirstFlag = TRUE;\r
+ }\r
\r
OptionCount = 0;\r
LangCode = LanguageString;\r
while (*LangCode != 0) {\r
- HiiLibGetNextLanguage (&LangCode, Lang);\r
+ GetNextLanguage (&LangCode, Lang);\r
\r
- if (gFrontPagePrivate.LanguageToken == NULL) {\r
+ if (FirstFlag) {\r
//\r
// Get Language Name from String Package. The StringId of Printable Language\r
// Name is always 1 which is generated by StringGather Tool.\r
}\r
ASSERT_EFI_ERROR (Status);\r
\r
- Token = 0;\r
- Status = HiiLibNewString (HiiHandle, &Token, StringBuffer);\r
+ //\r
+ // Save the string Id for each language\r
+ //\r
+ gFrontPagePrivate.LanguageToken[OptionCount] = HiiSetString (HiiHandle, 0, StringBuffer, NULL);\r
FreePool (StringBuffer);\r
- } else {\r
- Token = gFrontPagePrivate.LanguageToken[OptionCount];\r
}\r
\r
- if (AsciiStrCmp (Lang, CurrentLang) == 0) {\r
- OptionList[OptionCount].Flags = EFI_IFR_OPTION_DEFAULT;\r
+ if (AsciiStrCmp (Lang, BestLanguage) == 0) {\r
+ HiiCreateOneOfOptionOpCode (\r
+ OptionsOpCodeHandle,\r
+ gFrontPagePrivate.LanguageToken[OptionCount],\r
+ EFI_IFR_OPTION_DEFAULT,\r
+ EFI_IFR_NUMERIC_SIZE_1,\r
+ (UINT8) OptionCount\r
+ );\r
} else {\r
- OptionList[OptionCount].Flags = 0;\r
+ HiiCreateOneOfOptionOpCode (\r
+ OptionsOpCodeHandle,\r
+ gFrontPagePrivate.LanguageToken[OptionCount],\r
+ 0,\r
+ EFI_IFR_NUMERIC_SIZE_1,\r
+ (UINT8) OptionCount\r
+ );\r
}\r
- OptionList[OptionCount].StringToken = Token;\r
- OptionList[OptionCount].Value.u8 = (UINT8) OptionCount;\r
\r
OptionCount++;\r
}\r
\r
+ if (CurrentLang != NULL) {\r
+ FreePool (CurrentLang);\r
+ }\r
+ FreePool (BestLanguage);\r
+ FreePool (Lang);\r
FreePool (LanguageString);\r
\r
- UpdateData.Offset = 0;\r
- CreateOneOfOpCode (\r
+ HiiCreateOneOfOpCode (\r
+ StartOpCodeHandle,\r
FRONT_PAGE_KEY_LANGUAGE,\r
0,\r
0,\r
STRING_TOKEN (STR_LANGUAGE_SELECT_HELP),\r
EFI_IFR_FLAG_CALLBACK,\r
EFI_IFR_NUMERIC_SIZE_1,\r
- OptionList,\r
- OptionCount,\r
- &UpdateData\r
+ OptionsOpCodeHandle,\r
+ NULL\r
);\r
\r
- Status = IfrLibUpdateForm (\r
+ Status = HiiUpdateForm (\r
HiiHandle,\r
&mFrontPageGuid,\r
FRONT_PAGE_FORM_ID,\r
- LABEL_SELECT_LANGUAGE,\r
- FALSE,\r
- &UpdateData\r
+ StartOpCodeHandle, // LABEL_SELECT_LANGUAGE\r
+ EndOpCodeHandle // LABEL_END\r
);\r
\r
- //\r
- // Save the string Id for each language\r
- //\r
- gFrontPagePrivate.LanguageToken = AllocatePool (OptionCount * sizeof (EFI_STRING_ID));\r
- ASSERT (gFrontPagePrivate.LanguageToken != NULL);\r
- for (Index = 0; Index < OptionCount; Index++) {\r
- gFrontPagePrivate.LanguageToken[Index] = OptionList[Index].StringToken;\r
- }\r
-\r
- FreePool (UpdateData.Data);\r
- FreePool (OptionList);\r
+ HiiFreeOpCodeHandle (StartOpCodeHandle);\r
+ HiiFreeOpCodeHandle (EndOpCodeHandle);\r
+ HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
return Status;\r
}\r
\r
gFormBrowser2,\r
&gFrontPagePrivate.HiiHandle,\r
1,\r
- NULL,\r
+ &mFrontPageGuid,\r
0,\r
NULL,\r
&ActionRequest\r
OUT CHAR16 **String\r
)\r
{\r
- EFI_STATUS Status;\r
+ EFI_STRING TmpString;\r
\r
- Status = HiiLibGetStringFromToken (ProducerGuid, Token, String);\r
- if (EFI_ERROR (Status)) {\r
+ TmpString = HiiGetPackageString (ProducerGuid, Token, NULL);\r
+ if (TmpString == NULL) {\r
*String = GetStringById (STRING_TOKEN (STR_MISSING_STRING));\r
+ } else {\r
+ *String = TmpString;\r
}\r
\r
return EFI_SUCCESS;\r
}\r
\r
/**\r
- Convert Processor Frequency Data to a string\r
+ Convert Processor Frequency Data to a string.\r
\r
@param ProcessorFrequency The frequency data to process\r
@param String The string that is created\r
BiosVendor = (EFI_MISC_BIOS_VENDOR_DATA *) (DataHeader + 1);\r
GetProducerString (&Record->ProducerName, BiosVendor->BiosVersion, &NewString);\r
TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_BIOS_VERSION);\r
- HiiLibSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString);\r
+ HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL);\r
FreePool (NewString);\r
Find[0] = TRUE;\r
}\r
SystemManufacturer = (EFI_MISC_SYSTEM_MANUFACTURER_DATA *) (DataHeader + 1);\r
GetProducerString (&Record->ProducerName, SystemManufacturer->SystemProductName, &NewString);\r
TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_COMPUTER_MODEL);\r
- HiiLibSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString);\r
+ HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL);\r
FreePool (NewString);\r
Find[1] = TRUE;\r
}\r
ProcessorVersion = (EFI_PROCESSOR_VERSION_DATA *) (DataHeader + 1);\r
GetProducerString (&Record->ProducerName, *ProcessorVersion, &NewString);\r
TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_CPU_MODEL);\r
- HiiLibSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString);\r
+ HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL);\r
FreePool (NewString);\r
Find[2] = TRUE;\r
}\r
ProcessorFrequency = (EFI_PROCESSOR_CORE_FREQUENCY_DATA *) (DataHeader + 1);\r
ConvertProcessorToString (ProcessorFrequency, &NewString);\r
TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_CPU_SPEED);\r
- HiiLibSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString);\r
+ HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL);\r
FreePool (NewString);\r
Find[3] = TRUE;\r
}\r
&NewString\r
);\r
TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_MEMORY_SIZE);\r
- HiiLibSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString);\r
+ HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL);\r
FreePool (NewString);\r
Find[4] = TRUE;\r
}\r
)\r
{\r
EFI_STATUS Status;\r
- EFI_CONSOLE_CONTROL_PROTOCOL *ConsoleControl;\r
\r
PERF_START (0, "BdsTimeOut", "BDS", 0);\r
//\r
// takes affect\r
//\r
PERF_END (0, "BdsTimeOut", "BDS", 0);\r
- Status = gBS->LocateProtocol (&gEfiConsoleControlProtocolGuid, NULL, (VOID **) &ConsoleControl);\r
- if (Status == EFI_SUCCESS) {\r
- ConsoleControl->SetMode (ConsoleControl, EfiConsoleControlScreenText);\r
- }\r
}\r