EFI_STATUS Status;\r
CHAR8 *Languages;\r
CHAR8 *LangStrings;\r
- CHAR8 Lang[RFC_3066_ENTRY_SIZE];\r
+ CHAR8 *Lang;\r
\r
ASSERT (String != NULL);\r
ASSERT (StringId != NULL);\r
Status = EFI_SUCCESS;\r
\r
Languages = HiiLibGetSupportedLanguages (PackageList);\r
+ ASSERT (Languages != NULL);\r
+ //\r
+ // Allocate working buffer to contain substring of Languages.\r
+ //\r
+ Lang = AllocatePool (AsciiStrSize (Languages));\r
+ ASSERT (Lang != NULL);\r
\r
LangStrings = Languages;\r
while (*LangStrings != 0) {\r
}\r
}\r
\r
+ FreePool (Lang);\r
FreePool (Languages);\r
\r
return Status;\r
EFI_STATUS Status;\r
CHAR8 *Languages;\r
CHAR8 *LangStrings;\r
- CHAR8 Lang[RFC_3066_ENTRY_SIZE];\r
+ CHAR8 *Lang;\r
\r
ASSERT (IsHiiHandleRegistered (PackageList));\r
\r
Languages = HiiLibGetSupportedLanguages (PackageList);\r
ASSERT (Languages != NULL);\r
\r
+ //\r
+ // Allocate working buffer to contain substring of Languages.\r
+ //\r
+ Lang = AllocatePool (AsciiStrSize (Languages));\r
+ ASSERT (Lang != NULL);\r
+\r
LangStrings = Languages;\r
while (*LangStrings != 0) {\r
HiiLibGetNextLanguage (&LangStrings, Lang);\r
}\r
}\r
\r
+ FreePool (Lang);\r
FreePool (Languages);\r
\r
return Status;\r
EFI_GUID Guid;\r
\r
Status = HiiLibGetHiiHandles (&HandleBufferLen, &HiiHandleBuffer);\r
- if (EFI_ERROR(Status)) {\r
- return Status;\r
+ if (HiiHandleBuffer == NULL) {\r
+ return EFI_NOT_FOUND;\r
}\r
for (Index = 0; Index < (HandleBufferLen / sizeof (EFI_HII_HANDLE)); Index++) {\r
Status = HiiLibExtractGuidFromHiiHandle (HiiHandleBuffer[Index], &Guid);\r
Status = HiiLibGetStringFromHandle (HiiHandleBuffer[Index], StringId, String);\r
\r
Out:\r
- if (HiiHandleBuffer != NULL) {\r
- FreePool (HiiHandleBuffer);\r
- }\r
+ FreePool (HiiHandleBuffer);\r
+\r
return Status;\r
}\r
\r
{\r
EFI_STATUS Status;\r
CHAR8 *Languages;\r
- CHAR8 *LangStrings;\r
- CHAR8 Lang[RFC_3066_ENTRY_SIZE];\r
- CHAR8 CurrentLang[RFC_3066_ENTRY_SIZE];\r
+ CHAR8 *CurrentLang;\r
+ CHAR8 *BestLanguage;\r
\r
ASSERT (StringSize != NULL);\r
ASSERT (!(*StringSize != 0 && String == NULL));\r
ASSERT (IsHiiHandleRegistered (PackageList));\r
\r
- GetCurrentLanguage (CurrentLang);\r
+ Languages = HiiLibGetSupportedLanguages (PackageList);\r
+ ASSERT (Languages != NULL);\r
\r
- Status = mHiiStringProt->GetString (\r
+ CurrentLang = GetEfiGlobalVariable (L"PlatformLang");\r
+ \r
+ Status = EFI_NOT_FOUND;\r
+ BestLanguage = GetBestLanguage (\r
+ Languages,\r
+ FALSE,\r
+ (CurrentLang != NULL) ? CurrentLang : "",\r
+ (CHAR8 *) PcdGetPtr (PcdUefiVariableDefaultPlatformLang),\r
+ Languages,\r
+ NULL\r
+ );\r
+ if (BestLanguage != NULL ) {\r
+ Status = mHiiStringProt->GetString (\r
mHiiStringProt,\r
- CurrentLang,\r
+ BestLanguage,\r
PackageList,\r
StringId,\r
String,\r
StringSize,\r
NULL\r
);\r
-\r
- if (EFI_ERROR (Status) && (Status != EFI_BUFFER_TOO_SMALL)) {\r
- Languages = HiiLibGetSupportedLanguages (PackageList);\r
- ASSERT (Languages != NULL);\r
- \r
- LangStrings = Languages;\r
- HiiLibGetNextLanguage (&LangStrings, Lang);\r
- FreePool (Languages);\r
-\r
- Status = mHiiStringProt->GetString (\r
- mHiiStringProt,\r
- Lang,\r
- PackageList,\r
- StringId,\r
- String,\r
- StringSize,\r
- NULL\r
- );\r
+ FreePool (BestLanguage);\r
}\r
+ if (CurrentLang != NULL) {\r
+ FreePool (CurrentLang);\r
+ }\r
+ FreePool (Languages);\r
\r
return Status;\r
}\r
\r
\r
/**\r
- Convert language code from ISO639-2 to RFC3066.\r
+ Convert language code from ISO639-2 to RFC3066 and return the converted language.\r
+ Caller is responsible for freeing the allocated buffer.\r
\r
LanguageIso639 contain a single ISO639-2 code such as\r
"eng" or "fra".\r
\r
- The LanguageRfc3066 must be a buffer large enough\r
- for RFC_3066_ENTRY_SIZE characters.\r
-\r
If LanguageIso639 is NULL, then ASSERT.\r
If LanguageRfc3066 is NULL, then ASSERT.\r
\r
@param LanguageIso639 ISO639-2 language code.\r
- @param LanguageRfc3066 RFC3066 language code.\r
\r
- @retval EFI_SUCCESS Language code converted.\r
- @retval EFI_NOT_FOUND Language code not found.\r
+ @return the allocated buffer or NULL, if the language is not found.\r
\r
**/\r
-EFI_STATUS\r
+CHAR8*\r
EFIAPI\r
ConvertIso639LanguageToRfc3066Language (\r
- IN CONST CHAR8 *LanguageIso639,\r
- OUT CHAR8 *LanguageRfc3066\r
+ IN CONST CHAR8 *LanguageIso639\r
)\r
{\r
UINTN Index;\r
+ CHAR8 *Rfc3066Language;\r
\r
for (Index = 0; Iso639ToRfc3066ConversionTable[Index] != 0; Index += 5) {\r
if (CompareMem (LanguageIso639, &Iso639ToRfc3066ConversionTable[Index], 3) == 0) {\r
- CopyMem (LanguageRfc3066, &Iso639ToRfc3066ConversionTable[Index + 3], 2);\r
- return EFI_SUCCESS;\r
+ Rfc3066Language = AllocateZeroPool (3);\r
+ if (Rfc3066Language != NULL) {\r
+ Rfc3066Language = CopyMem (Rfc3066Language, &Iso639ToRfc3066ConversionTable[Index + 3], 2);\r
+ }\r
+ return Rfc3066Language;\r
}\r
}\r
\r
- return EFI_NOT_FOUND;\r
+ return NULL;\r
}\r
\r
/**\r
CHAR8 *Languages;\r
CHAR8 *ReturnValue;\r
CHAR8 *LangCodes;\r
- CHAR8 LangRfc3066[RFC_3066_ENTRY_SIZE];\r
+ CHAR8 *LangRfc3066;\r
CHAR8 LangIso639[ISO_639_2_ENTRY_SIZE];\r
+ UINTN LanguageSize;\r
EFI_STATUS Status;\r
\r
- ReturnValue = AllocateZeroPool (AsciiStrSize (SupportedLanguages));\r
+ LanguageSize = AsciiStrSize (SupportedLanguages);\r
+ ReturnValue = AllocateZeroPool (LanguageSize);\r
if (ReturnValue == NULL) {\r
return ReturnValue;\r
}\r
\r
+ //\r
+ // Allocate working buffer to contain substring in SupportedLanguages;\r
+ //\r
+ LangRfc3066 = AllocatePool (LanguageSize);\r
+ if (LangRfc3066 == NULL) {\r
+ FreePool (ReturnValue);\r
+ return NULL;\r
+ }\r
Languages = ReturnValue;\r
LangCodes = SupportedLanguages;\r
while (*LangCodes != 0) {\r
}\r
}\r
\r
+ FreePool (LangRfc3066);\r
return ReturnValue;\r
}\r
\r