/** @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
{\r
CHAR8 *LanguageString;\r
CHAR8 *LangCode;\r
- CHAR8 Lang[RFC_3066_ENTRY_SIZE];\r
+ CHAR8 *Lang;\r
CHAR8 OldLang[ISO_639_2_ENTRY_SIZE];\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
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
+ 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
+\r
+ if (!FeaturePcdGet (PcdUefiVariableDefaultLangDeprecate)) {\r
+ //\r
+ // Set UEFI deprecated variable "Lang" for backwards compatibility\r
+ //\r
+ Status = ConvertRfc3066LanguageToIso639Language (BestLanguage, 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
}\r
+ FreePool (BestLanguage);\r
}\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
}\r
\r
//\r
- // Create driver handle used by HII database\r
+ // Install Device Path Protocol and Config Access protocol to driver handle\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
- //\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
- // Get current language setting\r
- //\r
- GetCurrentLanguage (CurrentLang);\r
\r
//\r
// Allocate space for creation of UpdateData Buffer\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
}\r
ASSERT_EFI_ERROR (Status);\r
\r
- Token = 0;\r
- Status = HiiLibNewString (HiiHandle, &Token, StringBuffer);\r
+ Token = HiiSetString (HiiHandle, 0, StringBuffer, NULL);\r
FreePool (StringBuffer);\r
} else {\r
Token = gFrontPagePrivate.LanguageToken[OptionCount];\r
}\r
\r
- if (AsciiStrCmp (Lang, CurrentLang) == 0) {\r
+ if (AsciiStrCmp (Lang, BestLanguage) == 0) {\r
OptionList[OptionCount].Flags = EFI_IFR_OPTION_DEFAULT;\r
} else {\r
OptionList[OptionCount].Flags = 0;\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
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
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
- ConsoleControl->SetMode (ConsoleControl, EfiConsoleControlScreenText);\r
-\r
}\r