4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HII Library implementation that uses DXE protocols and services.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This program and the accompanying materials
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync are licensed and made available under the terms and conditions of the BSD License
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync which accompanies this distribution. The full text of the license may be found at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync http://opensource.org/licenses/bsd-license.php
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "InternalHiiLib.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function create a new string in String Package or updates an existing
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync string in a String Package. If StringId is 0, then a new string is added to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync a String Package. If StringId is not zero, then a string in String Package is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync updated. If SupportedLanguages is NULL, then the string is added or updated
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for all the languages that the String Package supports. If SupportedLanguages
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync is not NULL, then the string is added or updated for the set of languages
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync specified by SupportedLanguages.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If HiiHandle is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If String is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] HiiHandle A handle that was previously registered in the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HII Database.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] StringId If zero, then a new string is created in the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String Package associated with HiiHandle. If
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync non-zero, then the string specified by StringId
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync is updated in the String Package associated
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync with HiiHandle.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] String A pointer to the Null-terminated Unicode string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync to add or update in the String Package associated
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync with HiiHandle.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] SupportedLanguages A pointer to a Null-terminated ASCII string of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync language codes. If this parameter is NULL, then
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String is added or updated in the String Package
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync associated with HiiHandle for all the languages
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync that the String Package supports. If this
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync parameter is not NULL, then then String is added
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync or updated in the String Package associated with
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiHandle for the set oflanguages specified by
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SupportedLanguages. The format of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SupportedLanguages must follow the language
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync format assumed the HII Database.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval 0 The string could not be added or updated in the String Package.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Other The EFI_STRING_ID of the newly added or updated string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STRING_ID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncHiiSetString (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HII_HANDLE HiiHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_STRING_ID StringId, OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST EFI_STRING String,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR8 *SupportedLanguages OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR8 *AllocatedLanguages;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR8 *Supported;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR8 *Language;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (HiiHandle != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (String != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (SupportedLanguages == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Retrieve the languages that the package specified by HiiHandle supports
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AllocatedLanguages = HiiGetSupportedLanguages (HiiHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Allocate a copy of the SupportLanguages string that passed in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AllocatedLanguages = AllocateCopyPool (AsciiStrSize (SupportedLanguages), SupportedLanguages);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If there are not enough resources for the supported languages string, then return a StringId of 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (AllocatedLanguages == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_STRING_ID)(0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Loop through each language that the string supports
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Supported = AllocatedLanguages; *Supported != '\0'; ) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Cache a pointer to the beginning of the current language in the list of languages
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Language = Supported;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Search for the next language seperator and replace it with a Null-terminator
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (; *Supported != 0 && *Supported != ';'; Supported++);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*Supported != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *(Supported++) = '\0';
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If StringId is 0, then call NewString(). Otherwise, call SetString()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StringId == (EFI_STRING_ID)(0)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gHiiString->NewString (gHiiString, HiiHandle, &StringId, Language, NULL, String, NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gHiiString->SetString (gHiiString, HiiHandle, StringId, Language, String, NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If there was an error, then break out of the loop and return a StringId of 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Free the buffer of supported languages
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (AllocatedLanguages);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_STRING_ID)(0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return StringId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Retrieves a string from a string package names by GUID in a specific language.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If the language is not specified, then a string from a string package in the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync current platform language is retrieved. If the string can not be retrieved
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync using the specified language or the current platform language, then the string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync is retrieved from the string package in the first language the string package
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync supports. The returned string is allocated using AllocatePool(). The caller
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync is responsible for freeing the allocated buffer using FreePool().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If PackageListGuid is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If StringId is 0, then ASSERT.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] PackageListGuid The GUID of a package list that was previously
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync registered in the HII Database.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] StringId The identifier of the string to retrieved from the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync string package associated with PackageListGuid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Language The language of the string to retrieve. If this
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync parameter is NULL, then the current platform
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync language is used. The format of Language must
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync follow the language format assumed the HII Database.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval NULL The package list specified by PackageListGuid is not present in the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HII Database.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval NULL The string specified by StringId is not present in the string package.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Other The string was returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STRING
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncHiiGetPackageString (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST EFI_GUID *PackageListGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_STRING_ID StringId,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR8 *Language OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HANDLE *HiiHandleBuffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HANDLE HiiHandle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (PackageListGuid != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiHandleBuffer = HiiGetHiiHandles (PackageListGuid);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (HiiHandleBuffer == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiHandle = HiiHandleBuffer[0];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (HiiHandleBuffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return HiiGetString (HiiHandle, StringId, Language);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Retrieves a string from a string package in a specific language. If the language
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync is not specified, then a string from a string package in the current platform
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync language is retrieved. If the string can not be retrieved using the specified
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync language or the current platform language, then the string is retrieved from
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the string package in the first language the string package supports. The
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync returned string is allocated using AllocatePool(). The caller is responsible
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for freeing the allocated buffer using FreePool().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If HiiHandle is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If StringId is 0, then ASSET.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] HiiHandle A handle that was previously registered in the HII Database.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] StringId The identifier of the string to retrieved from the string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync package associated with HiiHandle.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Language The language of the string to retrieve. If this parameter
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync is NULL, then the current platform language is used. The
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync format of Language must follow the language format assumed
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the HII Database.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval NULL The string specified by StringId is not present in the string package.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Other The string was returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STRING
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncHiiGetString (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HII_HANDLE HiiHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_STRING_ID StringId,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR8 *Language OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN StringSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 TempString;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING String;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR8 *SupportedLanguages;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR8 *PlatformLanguage;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR8 *BestLanguage;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (HiiHandle != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (StringId != 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Initialize all allocated buffers to NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SupportedLanguages = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PlatformLanguage = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BestLanguage = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get the languages that the package specified by HiiHandle supports
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SupportedLanguages = HiiGetSupportedLanguages (HiiHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (SupportedLanguages == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Error;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get the current platform language setting
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PlatformLanguage = GetEfiGlobalVariable (L"PlatformLang");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If Languag is NULL, then set it to an empty string, so it will be
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // skipped by GetBestLanguage()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Language == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Language = "";
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get the best matching language from SupportedLanguages
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BestLanguage = GetBestLanguage (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SupportedLanguages,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FALSE, // RFC 4646 mode
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Language, // Highest priority
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PlatformLanguage != NULL ? PlatformLanguage : "", // Next highest priority
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SupportedLanguages, // Lowest priority
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (BestLanguage == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Error;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Retrieve the size of the string in the string package for the BestLanguage
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringSize = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gHiiString->GetString (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gHiiString,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BestLanguage,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringId,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &TempString,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &StringSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If GetString() returns EFI_SUCCESS for a zero size,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // then there are no supported languages registered for HiiHandle. If GetString()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // returns an error other than EFI_BUFFER_TOO_SMALL, then HiiHandle is not present
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // in the HII Database
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Status != EFI_BUFFER_TOO_SMALL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Error;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Allocate a buffer for the return string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String = AllocateZeroPool (StringSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (String == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Error;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Retrieve the string from the string package
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gHiiString->GetString (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gHiiString,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BestLanguage,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringId,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &StringSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Free the buffer and return NULL if the supported languages can not be retrieved.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (String);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncError:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Free allocated buffers
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (SupportedLanguages != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (SupportedLanguages);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (PlatformLanguage != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (PlatformLanguage);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (BestLanguage != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (BestLanguage);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Return the Null-terminated Unicode string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return String;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync