\r
#include "HiiDatabase.h"\r
\r
-typedef struct {\r
- CHAR8 *Iso639;\r
- CHAR8 *Rfc4646;\r
-} ISO639TORFC4646MAP;\r
-\r
-ISO639TORFC4646MAP Iso639ToRfc4646Map [] = {\r
- {"eng", "en-US"},\r
- {"fra", "fr-FR"},\r
-};\r
-\r
-//\r
-// Lookup table of ISO639-2 3 character language codes to ISO 639-1 2 character language codes\r
-// Each entry is 5 CHAR8 values long. The first 3 CHAR8 values are the ISO 639-2 code.\r
-// The last 2 CHAR8 values are the ISO 639-1 code.\r
-//\r
-GLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8 Iso639ToRfc4646ConversionTable[] =\r
-"\\r
-aaraa\\r
-abkab\\r
-afraf\\r
-amham\\r
-araar\\r
-asmas\\r
-aymay\\r
-azeaz\\r
-bakba\\r
-belbe\\r
-benbn\\r
-bihbh\\r
-bisbi\\r
-bodbo\\r
-brebr\\r
-bulbg\\r
-catca\\r
-cescs\\r
-corkw\\r
-cosco\\r
-cymcy\\r
-danda\\r
-deude\\r
-dzodz\\r
-ellel\\r
-engen\\r
-epoeo\\r
-estet\\r
-euseu\\r
-faofo\\r
-fasfa\\r
-fijfj\\r
-finfi\\r
-frafr\\r
-fryfy\\r
-gaiga\\r
-gdhgd\\r
-glggl\\r
-grngn\\r
-gujgu\\r
-hauha\\r
-hebhe\\r
-hinhi\\r
-hrvhr\\r
-hunhu\\r
-hyehy\\r
-ikuiu\\r
-ileie\\r
-inaia\\r
-indid\\r
-ipkik\\r
-islis\\r
-itait\\r
-jawjw\\r
-jpnja\\r
-kalkl\\r
-kankn\\r
-kasks\\r
-katka\\r
-kazkk\\r
-khmkm\\r
-kinrw\\r
-kirky\\r
-korko\\r
-kurku\\r
-laolo\\r
-latla\\r
-lavlv\\r
-linln\\r
-litlt\\r
-ltzlb\\r
-malml\\r
-marmr\\r
-mkdmk\\r
-mlgmg\\r
-mltmt\\r
-molmo\\r
-monmn\\r
-mrimi\\r
-msams\\r
-myamy\\r
-nauna\\r
-nepne\\r
-nldnl\\r
-norno\\r
-ocioc\\r
-ormom\\r
-panpa\\r
-polpl\\r
-porpt\\r
-pusps\\r
-quequ\\r
-rohrm\\r
-ronro\\r
-runrn\\r
-rusru\\r
-sagsg\\r
-sansa\\r
-sinsi\\r
-slksk\\r
-slvsl\\r
-smise\\r
-smosm\\r
-snasn\\r
-sndsd\\r
-somso\\r
-sotst\\r
-spaes\\r
-sqisq\\r
-srpsr\\r
-sswss\\r
-sunsu\\r
-swasw\\r
-swesv\\r
-tamta\\r
-tattt\\r
-telte\\r
-tgktg\\r
-tgltl\\r
-thath\\r
-tsnts\\r
-tuktk\\r
-twitw\\r
-uigug\\r
-ukruk\\r
-urdur\\r
-uzbuz\\r
-vievi\\r
-volvo\\r
-wolwo\\r
-xhoxh\\r
-yidyi\\r
-zhaza\\r
-zhozh\\r
-zulzu\\r
-";\r
-\r
-CHAR8 *\r
-ConvertIso639ToRfc4646 (\r
- CHAR8 *Iso638Lang\r
- )\r
-{\r
- UINTN Index;\r
- CHAR8 AsciiLanguage[ISO_639_2_ENTRY_SIZE + 1];\r
- \r
- AsciiStrnCpy (AsciiLanguage, Iso638Lang, sizeof (AsciiLanguage));\r
- for (Index = 0; Index < ISO_639_2_ENTRY_SIZE + 1; Index ++) {\r
- if (AsciiLanguage [Index] == 0) {\r
- break;\r
- } else if (AsciiLanguage [Index] >= 'A' && AsciiLanguage [Index] <= 'Z') {\r
- AsciiLanguage [Index] = (CHAR8) (AsciiLanguage [Index] - 'A' + 'a');\r
- }\r
- }\r
-\r
- for (Index = 0; Index < sizeof (Iso639ToRfc4646Map) / sizeof (Iso639ToRfc4646Map[0]); Index++) {\r
- if (AsciiStrnCmp (AsciiLanguage, Iso639ToRfc4646Map[Index].Iso639, AsciiStrSize (AsciiLanguage)) == 0) {\r
- return Iso639ToRfc4646Map[Index].Rfc4646;\r
- }\r
- }\r
-\r
- return (CHAR8 *) NULL;\r
-}\r
-\r
-/**\r
- Convert language code from RFC4646 to ISO639-2.\r
-\r
- @param LanguageRfc4646 RFC4646 language code.\r
- @param LanguageIso639 ISO639-2 language code.\r
-\r
- @retval EFI_SUCCESS Language code converted.\r
- @retval EFI_NOT_FOUND Language code not found.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-ConvertRfc4646LanguageToIso639Language (\r
- IN CHAR8 *LanguageRfc4646,\r
- OUT CHAR8 *LanguageIso639\r
- )\r
-{\r
- UINTN Index;\r
-\r
- if ((LanguageRfc4646[2] != '-') && (LanguageRfc4646[2] != 0)) {\r
- CopyMem (LanguageIso639, LanguageRfc4646, 3);\r
- return EFI_SUCCESS;\r
- }\r
-\r
- for (Index = 0; Iso639ToRfc4646ConversionTable[Index] != 0; Index += 5) {\r
- if (CompareMem (LanguageRfc4646, &Iso639ToRfc4646ConversionTable[Index + 3], 2) == 0) {\r
- CopyMem (LanguageIso639, &Iso639ToRfc4646ConversionTable[Index], 3);\r
- return EFI_SUCCESS;\r
- }\r
- }\r
-\r
- return EFI_NOT_FOUND;\r
-}\r
-\r
-\r
-/**\r
- Convert language code from ISO639-2 to RFC4646 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
- If LanguageIso639 is NULL, then ASSERT.\r
- If LanguageRfc4646 is NULL, then ASSERT.\r
-\r
- @param LanguageIso639 ISO639-2 language code.\r
-\r
- @return the allocated buffer or NULL, if the language is not found.\r
-\r
-**/\r
-CHAR8*\r
-EFIAPI\r
-ConvertIso639LanguageToRfc4646Language (\r
- IN CONST CHAR8 *LanguageIso639\r
- )\r
-{\r
- UINTN Index;\r
- CHAR8 *Rfc4646Language;\r
- \r
- for (Index = 0; Iso639ToRfc4646ConversionTable[Index] != 0; Index += 5) {\r
- if (CompareMem (LanguageIso639, &Iso639ToRfc4646ConversionTable[Index], 3) == 0) {\r
- Rfc4646Language = AllocateZeroPool (3);\r
- if (Rfc4646Language != NULL) {\r
- Rfc4646Language = CopyMem (Rfc4646Language, &Iso639ToRfc4646ConversionTable[Index + 3], 2);\r
- }\r
- return Rfc4646Language;\r
- }\r
- }\r
-\r
- return NULL;\r
-}\r
-\r
-/**\r
- Get next language from language code list (with separator ';').\r
-\r
- If LangCode is NULL, then ASSERT.\r
- If Lang is NULL, then ASSERT.\r
-\r
- @param LangCode On input: point to first language in the list. On\r
- output: point to next language in the list, or\r
- NULL if no more language in the list.\r
- @param Lang The first language in the list.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-GetNextLanguage (\r
- IN OUT CHAR8 **LangCode,\r
- OUT CHAR8 *Lang\r
- )\r
-{\r
- UINTN Index;\r
- CHAR8 *StringPtr;\r
-\r
- ASSERT (LangCode != NULL);\r
- ASSERT (*LangCode != NULL);\r
- ASSERT (Lang != NULL);\r
-\r
- Index = 0;\r
- StringPtr = *LangCode;\r
- while (StringPtr[Index] != 0 && StringPtr[Index] != ';') {\r
- Index++;\r
- }\r
-\r
- CopyMem (Lang, StringPtr, Index);\r
- Lang[Index] = 0;\r
-\r
- if (StringPtr[Index] == ';') {\r
- Index++;\r
- }\r
- *LangCode = StringPtr + Index;\r
-}\r
-\r
/**\r
Test if all of the characters in a string have corresponding font characters.\r
\r
ZeroMem (LanguageCopy, sizeof (LanguageCopy));\r
CopyMem (LanguageCopy, Language, ISO_639_2_ENTRY_SIZE * sizeof (CHAR16));\r
UnicodeStrToAsciiStr (LanguageCopy, AsciiLanguage);\r
- Rfc4646AsciiLanguage = ConvertIso639ToRfc4646 (AsciiLanguage);\r
+ Rfc4646AsciiLanguage = ConvertLanguagesIso639ToRfc4646 (AsciiLanguage);\r
ASSERT (Rfc4646AsciiLanguage != NULL);\r
}\r
\r
\r
Private = HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
\r
- Iso639AsciiLanguage = NULL;\r
Rfc4646AsciiLanguage = NULL;\r
\r
if (LanguageString != NULL) {\r
// Caller of Framework HII Interface uses the Language Identification String defined \r
// in Iso639. So map it to the Language Identifier defined in RFC4646.\r
//\r
- Rfc4646AsciiLanguage = ConvertIso639ToRfc4646 (Iso639AsciiLanguage);\r
+ Rfc4646AsciiLanguage = ConvertLanguagesIso639ToRfc4646 (Iso639AsciiLanguage);\r
+ FreePool (Iso639AsciiLanguage);\r
\r
//\r
// If Rfc4646AsciiLanguage is NULL, more language mapping must be added to \r
goto Done;\r
}\r
\r
- if (Rfc4646AsciiLanguage == NULL) {\r
- //\r
- // Get the languages that the package specified by HiiHandle supports\r
- //\r
- SupportedLanguages = HiiGetSupportedLanguages (UefiHiiHandle);\r
- if (SupportedLanguages == NULL) {\r
- goto Error2;\r
- }\r
+ //\r
+ // Get the languages that the package specified by HiiHandle supports\r
+ //\r
+ SupportedLanguages = HiiGetSupportedLanguages (UefiHiiHandle);\r
+ if (SupportedLanguages == NULL) {\r
+ goto Error2;\r
+ }\r
\r
- //\r
- // Get the current platform language setting\r
- //\r
- PlatformLanguage = GetEfiGlobalVariable (L"PlatformLang");\r
- if (PlatformLanguage == NULL) {\r
- goto Error1;\r
- }\r
+ //\r
+ // Get the current platform language setting\r
+ //\r
+ PlatformLanguage = GetEfiGlobalVariable (L"PlatformLang");\r
+ if (PlatformLanguage == NULL) {\r
+ goto Error1;\r
+ }\r
\r
- //\r
- // Get the best matching language from SupportedLanguages\r
- //\r
- BestLanguage = GetBestLanguage (\r
- SupportedLanguages, \r
- FALSE, // RFC 4646 mode\r
- PlatformLanguage, // Next highest priority\r
- SupportedLanguages, // Lowest priority \r
- NULL\r
- );\r
- if (BestLanguage == NULL) {\r
- FreePool (PlatformLanguage);\r
+ //\r
+ // Get the best matching language from SupportedLanguages\r
+ //\r
+ BestLanguage = GetBestLanguage (\r
+ SupportedLanguages, \r
+ FALSE, // RFC 4646 mode\r
+ (Rfc4646AsciiLanguage != NULL) ? Rfc4646AsciiLanguage : "",\r
+ PlatformLanguage, // Next highest priority\r
+ SupportedLanguages, // Lowest priority \r
+ NULL\r
+ );\r
+ if (BestLanguage == NULL) {\r
+ FreePool (PlatformLanguage);\r
Error1:\r
- FreePool (SupportedLanguages);\r
+ FreePool (SupportedLanguages);\r
Error2:\r
- Status = EFI_INVALID_PARAMETER;\r
- goto Done;\r
- }\r
-\r
- Status = mHiiStringProtocol->GetString (\r
- mHiiStringProtocol,\r
- BestLanguage,\r
- UefiHiiHandle,\r
- Token,\r
- StringBuffer,\r
- BufferLengthTemp,\r
- NULL\r
- );\r
- FreePool (BestLanguage);\r
- } else {\r
- Status = mHiiStringProtocol->GetString (\r
- mHiiStringProtocol,\r
- Rfc4646AsciiLanguage,\r
- UefiHiiHandle,\r
- Token,\r
- StringBuffer,\r
- BufferLengthTemp,\r
- NULL\r
- );\r
+ Status = EFI_INVALID_PARAMETER;\r
+ goto Done;\r
}\r
\r
+ Status = mHiiStringProtocol->GetString (\r
+ mHiiStringProtocol,\r
+ BestLanguage,\r
+ UefiHiiHandle,\r
+ Token,\r
+ StringBuffer,\r
+ BufferLengthTemp,\r
+ NULL\r
+ );\r
+ FreePool (BestLanguage);\r
+\r
Done:\r
- if (Iso639AsciiLanguage != NULL) {\r
- FreePool (Iso639AsciiLanguage);\r
+ if (Rfc4646AsciiLanguage != NULL) {\r
+ FreePool (Rfc4646AsciiLanguage);\r
}\r
\r
return Status;\r