]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EdkCompatibilityPkg/Compatibility/FrameworkHiiOnUefiHiiThunk/Strings.c
HII Library Class interface refine.
[mirror_edk2.git] / EdkCompatibilityPkg / Compatibility / FrameworkHiiOnUefiHiiThunk / Strings.c
index d9cc39eb8d54d6f829479199c211ecdb94114ca5..05a885cc8ffc0ad14fc7d38d9bf0464f7f8c1f5a 100644 (file)
@@ -65,7 +65,7 @@ ConvertIso639ToRfc3066 (
                          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
@@ -148,73 +148,17 @@ UpdateString (
   )\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
@@ -388,9 +332,12 @@ HiiThunkGetString (
   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
@@ -427,7 +374,51 @@ HiiThunkGetString (
   }\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