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