]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Library/UefiHiiLib/HiiString.c
Update UefiHiiLib to support new defined IFR related HII APIs.
[mirror_edk2.git] / MdeModulePkg / Library / UefiHiiLib / HiiString.c
index c6cef6dc62fd169473b111f9ce8be171a7040fd3..7d8ca5e11720664a8c1f670d9db2d7ce16ba9514 100644 (file)
@@ -191,7 +191,7 @@ HiiLibNewString (
   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
@@ -200,6 +200,11 @@ HiiLibNewString (
 \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
@@ -209,8 +214,8 @@ HiiLibNewString (
     // For each language supported by the package,\r
     // a string token is created.\r
     //\r
-    Status = mHiiStringProt->NewString (\r
-                                 mHiiStringProt,\r
+    Status = gHiiString->NewString (\r
+                                 gHiiString,\r
                                  PackageList,\r
                                  StringId,\r
                                  Lang,\r
@@ -223,6 +228,7 @@ HiiLibNewString (
     }\r
   }\r
 \r
+  FreePool (Lang);\r
   FreePool (Languages);\r
 \r
   return Status;\r
@@ -258,7 +264,7 @@ HiiLibSetString (
   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
@@ -267,6 +273,12 @@ HiiLibSetString (
   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
@@ -275,8 +287,8 @@ HiiLibSetString (
     // For each language supported by the package,\r
     // the string is updated.\r
     //\r
-    Status = mHiiStringProt->SetString (\r
-                                 mHiiStringProt,\r
+    Status = gHiiString->SetString (\r
+                                 gHiiString,\r
                                  PackageList,\r
                                  StringId,\r
                                  Lang,\r
@@ -288,6 +300,7 @@ HiiLibSetString (
     }\r
   }\r
 \r
+  FreePool (Lang);\r
   FreePool (Languages);\r
 \r
   return Status;\r
@@ -390,44 +403,43 @@ HiiLibGetString (
 {\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
-                               mHiiStringProt,\r
-                               CurrentLang,\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 = gHiiString->GetString (\r
+                               gHiiString,\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
@@ -520,41 +532,40 @@ ConvertRfc3066LanguageToIso639Language (
 \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
@@ -575,15 +586,25 @@ Rfc3066ToIso639 (
   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
@@ -596,6 +617,7 @@ Rfc3066ToIso639 (
     }\r
   }\r
 \r
+  FreePool (LangRfc3066);\r
   return ReturnValue;\r
 }\r
 \r