]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EdkCompatibilityPkg/Compatibility/FrameworkHiiOnUefiHiiThunk/HiiDatabase.c
Refine language conversion in ECP. Create a new library LanguageLib providing functio...
[mirror_edk2.git] / EdkCompatibilityPkg / Compatibility / FrameworkHiiOnUefiHiiThunk / HiiDatabase.c
index 4572254d2c715cc232517e261148907417d36794..ec7159b60b82476f076d2b9c988f5f7e4eb7e443 100644 (file)
@@ -34,12 +34,12 @@ HII_THUNK_PRIVATE_DATA mHiiThunkPrivateDataTempate = {
     HiiNewString,\r
     HiiGetPrimaryLanguages,\r
     HiiGetSecondaryLanguages,\r
-    HiiGetString,\r
+    HiiThunkGetString,\r
     HiiResetStrings,\r
     HiiGetLine,\r
     HiiGetForms,\r
     HiiGetDefaultImage,\r
-    HiiUpdateForm,\r
+    HiiThunkUpdateForm,\r
     \r
     HiiGetKeyboardLayout\r
   },\r
@@ -156,7 +156,7 @@ InitializeHiiDatabase (
                   );\r
   ASSERT_EFI_ERROR (Status);\r
 \r
-  Status = HiiLibListPackageLists (EFI_HII_PACKAGE_STRINGS, NULL, &BufferLength, &Buffer);\r
+  Status = ListPackageLists (EFI_HII_PACKAGE_STRINGS, NULL, &BufferLength, &Buffer);\r
   if (Status == EFI_SUCCESS) {\r
     for (Index = 0; Index < BufferLength / sizeof (EFI_HII_HANDLE); Index++) {\r
       ThunkContext = CreateThunkContextForUefiHiiHandle (Buffer[Index]);\r
@@ -305,65 +305,6 @@ HiiFindHandles (
   return EFI_SUCCESS;\r
 }\r
 \r
-EFI_STATUS\r
-LangCodes3066To639 (\r
-  IN CHAR8 *LangCodes3066,\r
-  IN CHAR8 **LangCodes639\r
-  )\r
-{\r
-  CHAR8                      *AsciiLangCodes;\r
-  CHAR8                      *Lang;\r
-  UINTN                      Index;\r
-  UINTN                      Count;\r
-  EFI_STATUS                 Status;\r
-\r
-  ASSERT (LangCodes3066 != NULL);\r
-  ASSERT (LangCodes639 != NULL);\r
-  \r
-  //\r
-  // Allocate working buffer to contain substring of LangCodes3066.\r
-  //\r
-  Lang = AllocatePool (AsciiStrSize (LangCodes3066));\r
-  if (Lang != NULL) {\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-\r
-  //\r
-  // Count the number of RFC 3066 language codes.\r
-  //\r
-  Index = 0;\r
-  AsciiLangCodes = LangCodes3066;\r
-  while (AsciiStrLen (AsciiLangCodes) != 0) {\r
-    HiiLibGetNextLanguage (&AsciiLangCodes, Lang);\r
-    Index++;\r
-  }\r
-\r
-  Count = Index;\r
-\r
-  //\r
-  // \r
-  //\r
-  *LangCodes639 = AllocateZeroPool (ISO_639_2_ENTRY_SIZE * Count + 1);\r
-  if (*LangCodes639 == NULL) {\r
-    Status = EFI_OUT_OF_RESOURCES;\r
-    goto Done;\r
-  }\r
-\r
-  AsciiLangCodes = LangCodes3066;\r
-\r
-  for (Index = 0; Index < Count; Index++) {\r
-    HiiLibGetNextLanguage (&AsciiLangCodes, Lang);\r
-    Status = ConvertRfc3066LanguageToIso639Language (Lang, *LangCodes639 + Index * ISO_639_2_ENTRY_SIZE);\r
-    ASSERT_EFI_ERROR (Status);\r
-  }\r
-\r
-  Status = EFI_SUCCESS;\r
-\r
-Done:\r
-  FreePool (Lang);\r
-  return Status;\r
-}\r
-\r
 /**\r
   Allows a program to determine the primary languages that are supported on a given handle.\r
 \r
@@ -391,7 +332,7 @@ HiiGetPrimaryLanguages (
 {\r
   HII_THUNK_PRIVATE_DATA     *Private;\r
   EFI_HII_HANDLE             UefiHiiHandle;\r
-  CHAR8                      *LangCodes3066;\r
+  CHAR8                      *LangCodes4646;\r
   CHAR16                     *UnicodeLangCodes639;\r
   CHAR8                      *LangCodes639;\r
   EFI_STATUS                 Status;\r
@@ -403,16 +344,15 @@ HiiGetPrimaryLanguages (
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  LangCodes3066 = HiiLibGetSupportedLanguages (UefiHiiHandle);\r
+  LangCodes4646 = HiiGetSupportedLanguages (UefiHiiHandle);\r
 \r
-  if (LangCodes3066 == NULL) {\r
+  if (LangCodes4646 == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-\r
-  LangCodes639 = NULL;\r
-  Status = LangCodes3066To639 (LangCodes3066, &LangCodes639);\r
-  if (EFI_ERROR (Status)) {\r
+  LangCodes639 = ConvertLanguagesRfc4646ToIso639 (LangCodes4646);\r
+  if (LangCodes639 == NULL) {\r
+    Status = EFI_INVALID_PARAMETER;\r
     goto Done;\r
   }\r
   \r
@@ -427,9 +367,10 @@ HiiGetPrimaryLanguages (
   //\r
   AsciiStrToUnicodeStr (LangCodes639, UnicodeLangCodes639);\r
   *LanguageString = UnicodeLangCodes639;\r
+  Status = EFI_SUCCESS;\r
 \r
 Done:\r
-  FreePool (LangCodes3066);\r
+  FreePool (LangCodes4646);\r
   if (LangCodes639 != NULL) {\r
     FreePool (LangCodes639);\r
   }\r
@@ -437,6 +378,61 @@ Done:
   return Status;\r
 }\r
 \r
+/**\r
+  This function returns the list of supported 2nd languages, in the format specified\r
+  in UEFI specification Appendix M.\r
+\r
+  If HiiHandle is not a valid Handle in the HII database, then ASSERT.\r
+  If not enough resource to complete the operation, then ASSERT.\r
+\r
+  @param  HiiHandle              The HII package list handle.\r
+  @param  FirstLanguage          Pointer to language name buffer.\r
+  \r
+  @return The supported languages.\r
+\r
+**/\r
+CHAR8 *\r
+EFIAPI\r
+HiiGetSupportedSecondaryLanguages (\r
+  IN EFI_HII_HANDLE           HiiHandle,\r
+  IN CONST CHAR8              *FirstLanguage\r
+  )\r
+{\r
+  EFI_STATUS  Status;\r
+  UINTN       BufferSize;\r
+  CHAR8       *LanguageString;\r
+\r
+  ASSERT (HiiHandle != NULL);\r
+\r
+  //\r
+  // Collect current supported 2nd Languages for given HII handle\r
+  // First try allocate 4K buffer to store the current supported 2nd languages.\r
+  //\r
+  BufferSize = 0x1000;\r
+  LanguageString = AllocateZeroPool (BufferSize);\r
+  if (LanguageString == NULL) {\r
+    return NULL;\r
+  }\r
+\r
+  Status = mHiiStringProtocol->GetSecondaryLanguages (mHiiStringProtocol, HiiHandle, FirstLanguage, LanguageString, &BufferSize);\r
+  ASSERT (Status != EFI_NOT_FOUND);\r
+  \r
+  if (Status == EFI_BUFFER_TOO_SMALL) {\r
+    FreePool (LanguageString);\r
+    LanguageString = AllocateZeroPool (BufferSize);\r
+    if (LanguageString == NULL) {\r
+      return NULL;\r
+    }\r
+\r
+    Status = mHiiStringProtocol->GetSecondaryLanguages (mHiiStringProtocol, HiiHandle, FirstLanguage, LanguageString, &BufferSize);\r
+  }\r
+\r
+  if (EFI_ERROR (Status)) {\r
+    LanguageString = NULL;\r
+  }\r
+\r
+  return LanguageString;\r
+}\r
 \r
 /**\r
   Allows a program to determine which secondary languages are supported on a given handle for a given primary language\r
@@ -469,9 +465,9 @@ HiiGetSecondaryLanguages (
 {\r
   HII_THUNK_PRIVATE_DATA     *Private;\r
   EFI_HII_HANDLE             UefiHiiHandle;\r
-  CHAR8                      *PrimaryLang3066;\r
+  CHAR8                      *PrimaryLang4646;\r
   CHAR8                      *PrimaryLang639;\r
-  CHAR8                      *SecLangCodes3066;\r
+  CHAR8                      *SecLangCodes4646;\r
   CHAR8                      *SecLangCodes639;\r
   CHAR16                     *UnicodeSecLangCodes639;\r
   EFI_STATUS                 Status;\r
@@ -479,8 +475,8 @@ HiiGetSecondaryLanguages (
   Private = HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
 \r
   SecLangCodes639        = NULL;\r
-  SecLangCodes3066       = NULL;\r
-  PrimaryLang3066        = NULL;\r
+  SecLangCodes4646       = NULL;\r
+  PrimaryLang4646        = NULL;\r
   UnicodeSecLangCodes639 = NULL;\r
 \r
   UefiHiiHandle = FwHiiHandleToUefiHiiHandle (Private, Handle);\r
@@ -496,18 +492,19 @@ HiiGetSecondaryLanguages (
 \r
   UnicodeStrToAsciiStr (PrimaryLanguage, PrimaryLang639);\r
 \r
-  PrimaryLang3066 = ConvertIso639LanguageToRfc3066Language (PrimaryLang639);\r
-  ASSERT_EFI_ERROR (PrimaryLang3066 != NULL);\r
+  PrimaryLang4646 = ConvertLanguagesIso639ToRfc4646 (PrimaryLang639);\r
+  ASSERT_EFI_ERROR (PrimaryLang4646 != NULL);\r
 \r
-  SecLangCodes3066 = HiiLibGetSupportedSecondaryLanguages (UefiHiiHandle, PrimaryLang3066);\r
+  SecLangCodes4646 = HiiGetSupportedSecondaryLanguages (UefiHiiHandle, PrimaryLang4646);\r
 \r
-  if (SecLangCodes3066 == NULL) {\r
+  if (SecLangCodes4646 == NULL) {\r
     Status =  EFI_INVALID_PARAMETER;\r
     goto Done;\r
   }\r
 \r
-  Status = LangCodes3066To639 (SecLangCodes3066, &SecLangCodes639);\r
-  if (EFI_ERROR (Status)) {\r
+  SecLangCodes639 = ConvertLanguagesIso639ToRfc4646 (SecLangCodes4646);\r
+  if (SecLangCodes639 == NULL) {\r
+    Status =  EFI_INVALID_PARAMETER;\r
     goto Done;\r
   }\r
 \r
@@ -518,9 +515,10 @@ HiiGetSecondaryLanguages (
   }\r
 \r
   //\r
-  // The language returned is in RFC 3066 format.\r
+  // The language returned is in RFC 4646 format.\r
   //\r
   *LanguageString = AsciiStrToUnicodeStr (SecLangCodes639, UnicodeSecLangCodes639);\r
+  Status = EFI_SUCCESS;\r
 \r
 Done:\r
   if (PrimaryLang639 != NULL) {\r
@@ -531,12 +529,12 @@ Done:
     FreePool (SecLangCodes639);\r
   }\r
 \r
-  if (PrimaryLang3066 != NULL) {\r
-    FreePool (PrimaryLang3066);\r
+  if (PrimaryLang4646 != NULL) {\r
+    FreePool (PrimaryLang4646);\r
   }\r
 \r
-  if (SecLangCodes3066 != NULL) {\r
-    FreePool (SecLangCodes3066);\r
+  if (SecLangCodes4646 != NULL) {\r
+    FreePool (SecLangCodes4646);\r
   }\r
   if (UnicodeSecLangCodes639 != NULL) {\r
     FreePool (UnicodeSecLangCodes639);\r