If all glyphs in the string are available, the index is the index of the terminator \r
of the string. \r
@param GlyphBufferSize A pointer to a value. On output, if the function returns EFI_SUCCESS, \r
- it contains the amount of memory that is required to store the string¡¯s glyph equivalent.\r
+ it contains the amount of memory that is required to store the string? glyph equivalent.\r
\r
@retval EFI_UNSUPPORTED The function performs nothing and return EFI_UNSUPPORTED.\r
**/\r
)\r
{\r
EFI_STRING_ID NewStringId;\r
- EFI_STATUS Status;\r
-\r
\r
- NewStringId = 0;\r
- \r
- if (*StringId == 0) {\r
- //\r
- // Create a new string token.\r
- //\r
- if (Rfc3066AsciiLanguage == NULL) {\r
- //\r
- // For all languages in the package list.\r
- //\r
- Status = HiiLibNewString (ThunkContext->UefiHiiHandle, &NewStringId, NewString);\r
- } else {\r
- //\r
- // For specified language.\r
- //\r
- Status = mHiiStringProtocol->NewString (\r
- mHiiStringProtocol,\r
- ThunkContext->UefiHiiHandle,\r
- &NewStringId,\r
- Rfc3066AsciiLanguage,\r
- NULL,\r
- NewString,\r
- NULL\r
- );\r
- }\r
- } else {\r
- //\r
- // Update the existing string token.\r
- //\r
- if (Rfc3066AsciiLanguage == NULL) {\r
- //\r
- // For all languages in the package list.\r
- //\r
- Status = HiiLibSetString (ThunkContext->UefiHiiHandle, *StringId, NewString);\r
- } else {\r
- //\r
- // For specified language.\r
- //\r
- Status = mHiiStringProtocol->SetString (\r
- mHiiStringProtocol,\r
- ThunkContext->UefiHiiHandle,\r
- *StringId,\r
- Rfc3066AsciiLanguage,\r
- NewString,\r
- NULL\r
- );\r
- }\r
- }\r
- \r
- if (!EFI_ERROR (Status)) {\r
- if (*StringId == 0) {\r
- //\r
- // When creating new string, return the newly created String Token.\r
- //\r
- *StringId = NewStringId;\r
- }\r
- } else {\r
+ NewStringId = HiiSetString (ThunkContext->UefiHiiHandle, *StringId, NewString, Rfc3066AsciiLanguage);\r
+ *StringId = NewStringId;\r
+ if (NewStringId == 0) {\r
//\r
// Only EFI_INVALID_PARAMETER is defined in HII 0.92 specification.\r
//\r
- *StringId = 0;\r
+ return EFI_INVALID_PARAMETER;\r
+ } else {\r
+ return EFI_SUCCESS;\r
}\r
-\r
- return Status;\r
}\r
\r
/**\r
OUT EFI_STRING StringBuffer\r
)\r
{\r
- CHAR8 *Iso639AsciiLanguage;\r
HII_THUNK_PRIVATE_DATA *Private;\r
+ CHAR8 *Iso639AsciiLanguage;\r
CHAR8 *Rfc3066AsciiLanguage;\r
+ CHAR8 *SupportedLanguages;\r
+ CHAR8 *PlatformLanguage;\r
+ CHAR8 *BestLanguage;\r
EFI_HII_HANDLE UefiHiiHandle;\r
EFI_STATUS Status;\r
\r
}\r
\r
if (Rfc3066AsciiLanguage == NULL) {\r
- Status = HiiLibGetString (UefiHiiHandle, Token, StringBuffer, BufferLengthTemp);\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
+ //\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
+Error1:\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