}\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
LanguageString = HiiLibGetSupportedLanguages (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
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
- //\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
}\r
\r
- //\r
- // Get current language setting\r
- //\r
- GetCurrentLanguage (CurrentLang);\r
\r
//\r
// Allocate space for creation of UpdateData Buffer\r
HiiHandle = gFrontPagePrivate.HiiHandle;\r
LanguageString = HiiLibGetSupportedLanguages (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
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