From a3a795afdb9d8efd8e6603cce92103d610346b78 Mon Sep 17 00:00:00 2001 From: qhuang8 Date: Fri, 27 Mar 2009 03:21:37 +0000 Subject: [PATCH] Apply GetBestLanguage() API in UEFI git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@7963 6f19259b-4bc3-4df7-8a09-765794883524 --- .../Universal/BdsDxe/FrontPage.c | 116 +++++++++++++----- 1 file changed, 85 insertions(+), 31 deletions(-) diff --git a/IntelFrameworkModulePkg/Universal/BdsDxe/FrontPage.c b/IntelFrameworkModulePkg/Universal/BdsDxe/FrontPage.c index fb605d57d9..29974769bb 100644 --- a/IntelFrameworkModulePkg/Universal/BdsDxe/FrontPage.c +++ b/IntelFrameworkModulePkg/Universal/BdsDxe/FrontPage.c @@ -129,10 +129,12 @@ FrontPageCallback ( { CHAR8 *LanguageString; CHAR8 *LangCode; - CHAR8 Lang[RFC_3066_ENTRY_SIZE]; + CHAR8 *Lang; CHAR8 OldLang[ISO_639_2_ENTRY_SIZE]; UINTN Index; EFI_STATUS Status; + CHAR8 *PlatformSupportedLanguages; + CHAR8 *BestLanguage; if ((Value == NULL) || (ActionRequest == NULL)) { return EFI_INVALID_PARAMETER; @@ -158,7 +160,12 @@ FrontPageCallback ( // LanguageString = HiiLibGetSupportedLanguages (gFrontPagePrivate.HiiHandle); ASSERT (LanguageString != NULL); - + // + // Allocate working buffer for RFC 4646 language in supported LanguageString. + // + Lang = AllocatePool (AsciiStrSize (LanguageString)); + ASSERT (Lang != NULL); + Index = 0; LangCode = LanguageString; while (*LangCode != 0) { @@ -171,30 +178,53 @@ FrontPageCallback ( Index++; } - Status = gRT->SetVariable ( - L"PlatformLang", - &gEfiGlobalVariableGuid, - EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, - AsciiStrSize (Lang), - Lang - ); - - if (!FeaturePcdGet (PcdUefiVariableDefaultLangDeprecate)) { - // - // Set UEFI deprecated variable "Lang" for backwards compatibility - // - Status = ConvertRfc3066LanguageToIso639Language (Lang, OldLang); - if (!EFI_ERROR (Status)) { - Status = gRT->SetVariable ( - L"Lang", - &gEfiGlobalVariableGuid, - EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, - ISO_639_2_ENTRY_SIZE, - OldLang - ); + PlatformSupportedLanguages = GetEfiGlobalVariable (L"PlatformLangCodes"); + if (PlatformSupportedLanguages == NULL) { + PlatformSupportedLanguages = AllocateCopyPool ( + AsciiStrSize ((CHAR8 *) PcdGetPtr (PcdUefiVariableDefaultPlatformLangCodes)), + (CHAR8 *) PcdGetPtr (PcdUefiVariableDefaultPlatformLangCodes) + ); + ASSERT (PlatformSupportedLanguages != NULL); + } + + // + // Select the best language in platform supported Language. + // + BestLanguage = GetBestLanguage ( + PlatformSupportedLanguages, + FALSE, + Lang, + NULL + ); + if (BestLanguage != NULL) { + Status = gRT->SetVariable ( + L"PlatformLang", + &gEfiGlobalVariableGuid, + EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, + AsciiStrSize (BestLanguage), + Lang + ); + + if (!FeaturePcdGet (PcdUefiVariableDefaultLangDeprecate)) { + // + // Set UEFI deprecated variable "Lang" for backwards compatibility + // + Status = ConvertRfc3066LanguageToIso639Language (BestLanguage, OldLang); + if (!EFI_ERROR (Status)) { + Status = gRT->SetVariable ( + L"Lang", + &gEfiGlobalVariableGuid, + EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, + ISO_639_2_ENTRY_SIZE, + OldLang + ); + } } + FreePool (BestLanguage); } - + + FreePool (PlatformSupportedLanguages); + FreePool (Lang); FreePool (LanguageString); break; @@ -247,8 +277,9 @@ InitializeFrontPage ( IFR_OPTION *OptionList; CHAR8 *LanguageString; CHAR8 *LangCode; - CHAR8 Lang[RFC_3066_ENTRY_SIZE]; - CHAR8 CurrentLang[RFC_3066_ENTRY_SIZE]; + CHAR8 *Lang; + CHAR8 *CurrentLang; + CHAR8 *BestLanguage; UINTN OptionCount; EFI_STRING_ID Token; CHAR16 *StringBuffer; @@ -329,10 +360,6 @@ InitializeFrontPage ( } } - // - // Get current language setting - // - GetCurrentLanguage (CurrentLang); // // Allocate space for creation of UpdateData Buffer @@ -350,6 +377,28 @@ InitializeFrontPage ( HiiHandle = gFrontPagePrivate.HiiHandle; LanguageString = HiiLibGetSupportedLanguages (HiiHandle); ASSERT (LanguageString != NULL); + // + // Allocate working buffer for RFC 4646 language in supported LanguageString. + // + Lang = AllocatePool (AsciiStrSize (LanguageString)); + ASSERT (Lang != NULL); + + CurrentLang = GetEfiGlobalVariable (L"PlatformLang"); + // + // Select the best language in LanguageString as the default one. + // + BestLanguage = GetBestLanguage ( + LanguageString, + FALSE, + (CurrentLang != NULL) ? CurrentLang : "", + (CHAR8 *) PcdGetPtr (PcdUefiVariableDefaultPlatformLang), + LanguageString, + NULL + ); + // + // BestLanguage must be selected as it is the first language in LanguageString by default + // + ASSERT (BestLanguage != NULL); OptionCount = 0; LangCode = LanguageString; @@ -394,7 +443,7 @@ InitializeFrontPage ( Token = gFrontPagePrivate.LanguageToken[OptionCount]; } - if (AsciiStrCmp (Lang, CurrentLang) == 0) { + if (AsciiStrCmp (Lang, BestLanguage) == 0) { OptionList[OptionCount].Flags = EFI_IFR_OPTION_DEFAULT; } else { OptionList[OptionCount].Flags = 0; @@ -405,6 +454,11 @@ InitializeFrontPage ( OptionCount++; } + if (CurrentLang != NULL) { + FreePool (CurrentLang); + } + FreePool (BestLanguage); + FreePool (Lang); FreePool (LanguageString); UpdateData.Offset = 0; -- 2.39.2