summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorqhuang8 <qhuang8@6f19259b-4bc3-4df7-8a09-765794883524>2009-03-25 10:07:39 +0000
committerqhuang8 <qhuang8@6f19259b-4bc3-4df7-8a09-765794883524>2009-03-25 10:07:39 +0000
commitbf9af1b959ed47b53131923fe63ef30f3faf3f99 (patch)
tree257cb54d6dce172ed43a3075988aabf519bc764e
parent2fef9e5f7a7738ea1b7d4fd2b8a454358698a64b (diff)
downloadedk2-bf9af1b959ed47b53131923fe63ef30f3faf3f99.tar.gz
edk2-bf9af1b959ed47b53131923fe63ef30f3faf3f99.tar.bz2
edk2-bf9af1b959ed47b53131923fe63ef30f3faf3f99.zip
Apply GetBestLanguage() for the implementation of HiiStringIdToImage() API.
E.g. L"PlatformLang" variable is "en" and registered string supports "en-US" git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@7954 6f19259b-4bc3-4df7-8a09-765794883524
-rw-r--r--MdeModulePkg/Universal/HiiDatabaseDxe/Font.c127
-rw-r--r--MdeModulePkg/Universal/HiiDatabaseDxe/R8Lib.c45
-rw-r--r--MdeModulePkg/Universal/HiiDatabaseDxe/R8Lib.h21
3 files changed, 94 insertions, 99 deletions
diff --git a/MdeModulePkg/Universal/HiiDatabaseDxe/Font.c b/MdeModulePkg/Universal/HiiDatabaseDxe/Font.c
index 82f47163b7..6d46fd1e36 100644
--- a/MdeModulePkg/Universal/HiiDatabaseDxe/Font.c
+++ b/MdeModulePkg/Universal/HiiDatabaseDxe/Font.c
@@ -2089,12 +2089,17 @@ HiiStringIdToImage (
{
EFI_STATUS Status;
HII_DATABASE_PRIVATE_DATA *Private;
+ EFI_HII_STRING_PROTOCOL *HiiString;
EFI_STRING String;
UINTN StringSize;
UINTN FontLen;
EFI_FONT_INFO *StringFontInfo;
EFI_FONT_DISPLAY_INFO *NewStringInfo;
- CHAR8 CurrentLang[RFC_3066_ENTRY_SIZE];
+ CHAR8 TempSupportedLanguages;
+ CHAR8 *SupportedLanguages;
+ UINTN SupportedLanguagesSize;
+ CHAR8 *CurrentLanguage;
+ CHAR8 *BestLanguage;
if (This == NULL || PackageList == NULL || Blt == NULL || PackageList == NULL) {
return EFI_INVALID_PARAMETER;
@@ -2105,57 +2110,104 @@ HiiStringIdToImage (
}
//
- // When Language points to NULL, current system language is used.
+ // Initialize string pointers to be NULL
//
- if (Language != NULL) {
- AsciiStrCpy (CurrentLang, (CHAR8 *) Language);
- } else {
- GetCurrentLanguage (CurrentLang);
- }
+ SupportedLanguages = NULL;
+ CurrentLanguage = NULL;
+ BestLanguage = NULL;
+ String = NULL;
+ StringInfo = NULL;
+ StringFontInfo = NULL;
+ NewStringInfo = NULL;
//
// Get the string to be displayed.
//
+ Private = HII_FONT_DATABASE_PRIVATE_DATA_FROM_THIS (This);
+ HiiString = &Private->HiiString;
+
+ //
+ // Get the size of supported language.
+ //
+ SupportedLanguagesSize = 0;
+ Status = HiiString->GetLanguages (
+ HiiString,
+ PackageList,
+ &TempSupportedLanguages,
+ &SupportedLanguagesSize
+ );
+ if (Status != EFI_BUFFER_TOO_SMALL) {
+ return Status;
+ }
+
+ SupportedLanguages = AllocatePool (SupportedLanguagesSize);
+ if (SupportedLanguages == NULL) {
+ return EFI_OUT_OF_RESOURCES;
+ }
+ Status = HiiString->GetLanguages (
+ HiiString,
+ PackageList,
+ SupportedLanguages,
+ &SupportedLanguagesSize
+ );
+ if (EFI_ERROR (Status)) {
+ goto Exit;
+ }
+
+ if (Language == NULL) {
+ Language = "";
+ }
+ CurrentLanguage = GetEfiGlobalVariable (L"PlatformLang");
+ BestLanguage = GetBestLanguage (
+ SupportedLanguages,
+ FALSE,
+ Language,
+ (CurrentLanguage == NULL) ? CurrentLanguage : "",
+ (CHAR8 *) PcdGetPtr (PcdUefiVariableDefaultPlatformLang),
+ NULL
+ );
+ if (BestLanguage == NULL) {
+ Status = EFI_NOT_FOUND;
+ goto Exit;
+ }
+
StringSize = MAX_STRING_LENGTH;
String = (EFI_STRING) AllocateZeroPool (StringSize);
if (String == NULL) {
- return EFI_OUT_OF_RESOURCES;
+ Status = EFI_OUT_OF_RESOURCES;
+ goto Exit;
}
- Private = HII_FONT_DATABASE_PRIVATE_DATA_FROM_THIS (This);
- StringFontInfo = NULL;
- NewStringInfo = NULL;
-
- Status = Private->HiiString.GetString (
- &Private->HiiString,
- CurrentLang,
- PackageList,
- StringId,
- String,
- &StringSize,
- &StringFontInfo
- );
+ Status = HiiString->GetString (
+ HiiString,
+ BestLanguage,
+ PackageList,
+ StringId,
+ String,
+ &StringSize,
+ &StringFontInfo
+ );
if (Status == EFI_BUFFER_TOO_SMALL) {
FreePool (String);
String = (EFI_STRING) AllocateZeroPool (StringSize);
if (String == NULL) {
- return EFI_OUT_OF_RESOURCES;
+ Status = EFI_OUT_OF_RESOURCES;
+ goto Exit;
}
- Status = Private->HiiString.GetString (
- &Private->HiiString,
- Language,
- PackageList,
- StringId,
- String,
- &StringSize,
- NULL
- );
-
+ Status = HiiString->GetString (
+ HiiString,
+ BestLanguage,
+ PackageList,
+ StringId,
+ String,
+ &StringSize,
+ NULL
+ );
}
if (EFI_ERROR (Status)) {
- goto Exit;
+ goto Exit;
}
//
@@ -2204,6 +2256,15 @@ HiiStringIdToImage (
);
Exit:
+ if (SupportedLanguages != NULL) {
+ FreePool (SupportedLanguages);
+ }
+ if (CurrentLanguage != NULL) {
+ FreePool (CurrentLanguage);
+ }
+ if (BestLanguage != NULL) {
+ FreePool (BestLanguage);
+ }
if (String != NULL) {
FreePool (String);
}
diff --git a/MdeModulePkg/Universal/HiiDatabaseDxe/R8Lib.c b/MdeModulePkg/Universal/HiiDatabaseDxe/R8Lib.c
index 789627f222..7c3e9b8b35 100644
--- a/MdeModulePkg/Universal/HiiDatabaseDxe/R8Lib.c
+++ b/MdeModulePkg/Universal/HiiDatabaseDxe/R8Lib.c
@@ -57,49 +57,4 @@ R8_EfiLibCompareLanguage (
}
-/**
- Determine what is the current language setting. The space reserved for Lang
- must be at least RFC_3066_ENTRY_SIZE bytes;
-
- If Lang is NULL, then ASSERT.
-
- @param Lang Pointer of system language. Lang will always be filled with
- a valid RFC 3066 language string. If "PlatformLang" is not
- set in the system, the default language specifed by PcdUefiVariableDefaultPlatformLang
- is returned.
-
- @return EFI_SUCCESS If the EFI Variable with "PlatformLang" is set and return in Lang.
- @return EFI_NOT_FOUND If the EFI Variable with "PlatformLang" is not set, but a valid default language is return in Lang.
-
-**/
-EFI_STATUS
-EFIAPI
-GetCurrentLanguage (
- OUT CHAR8 *Lang
- )
-{
- EFI_STATUS Status;
- UINTN Size;
-
- ASSERT (Lang != NULL);
-
- //
- // Get current language setting
- //
- Size = RFC_3066_ENTRY_SIZE;
- Status = gRT->GetVariable (
- L"PlatformLang",
- &gEfiGlobalVariableGuid,
- NULL,
- &Size,
- Lang
- );
-
- if (EFI_ERROR (Status)) {
- AsciiStrCpy (Lang, (CHAR8 *) PcdGetPtr (PcdUefiVariableDefaultPlatformLang));
- }
-
- return Status;
-}
-
diff --git a/MdeModulePkg/Universal/HiiDatabaseDxe/R8Lib.h b/MdeModulePkg/Universal/HiiDatabaseDxe/R8Lib.h
index e971dc264b..22b2bc9d39 100644
--- a/MdeModulePkg/Universal/HiiDatabaseDxe/R8Lib.h
+++ b/MdeModulePkg/Universal/HiiDatabaseDxe/R8Lib.h
@@ -34,27 +34,6 @@ R8_EfiLibCompareLanguage (
)
;
-/**
- Determine what is the current language setting. The space reserved for Lang
- must be at least RFC_3066_ENTRY_SIZE bytes;
-
- If Lang is NULL, then ASSERT.
-
- @param Lang Pointer of system language. Lang will always be filled with
- a valid RFC 3066 language string. If "PlatformLang" is not
- set in the system, the default language specifed by PcdUefiVariableDefaultPlatformLang
- is returned.
-
- @return EFI_SUCCESS If the EFI Variable with "PlatformLang" is set and return in Lang.
- @return EFI_NOT_FOUND If the EFI Variable with "PlatformLang" is not set, but a valid default language is return in Lang.
-
-**/
-EFI_STATUS
-EFIAPI
-GetCurrentLanguage (
- OUT CHAR8 *Lang
- );
-
#endif