]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EdkCompatibilityPkg/Compatibility/FrameworkHiiOnUefiHiiThunk/HiiDatabase.c
Merge branch 'master' of https://github.com/tianocore/edk2
[mirror_edk2.git] / EdkCompatibilityPkg / Compatibility / FrameworkHiiOnUefiHiiThunk / HiiDatabase.c
index a89d91e23382bbe70d2e3a36ead99b2d960f3da1..2d456da3035392c2548552a272dd2e370d3d9ea9 100644 (file)
@@ -1,9 +1,9 @@
-/**@file\r
+/** @file\r
 Framework to UEFI 2.1 HII Thunk. The driver consume UEFI HII protocols\r
 to produce a Framework HII protocol.\r
 \r
-Copyright (c) 2008, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
+Copyright (c) 2008 - 2014, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
 which accompanies this distribution.  The full text of the license may be found at\r
 http://opensource.org/licenses/bsd-license.php\r
@@ -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,8 +156,9 @@ 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
+    ASSERT (Buffer != NULL);\r
     for (Index = 0; Index < BufferLength / sizeof (EFI_HII_HANDLE); Index++) {\r
       ThunkContext = CreateThunkContextForUefiHiiHandle (Buffer[Index]);\r
       ASSERT (ThunkContext!= NULL);\r
@@ -243,7 +244,7 @@ InitializeHiiDatabase (
   @param This                 A pointer to the EFI_HII_PROTOCOL instance.\r
   @param HandleBufferLength   On input, a pointer to the length of the handle buffer. \r
                               On output, the length of the handle buffer that is required for the handles found.\r
-  @param Handle               An array of EFI_HII_HANDLE instances returned. \r
+  @param Handle               Pointer to an array of EFI_HII_HANDLE instances returned. \r
                               Type EFI_HII_HANDLE is defined in EFI_HII_PROTOCOL.NewPack() in the Packages section.\r
 \r
   @retval EFI_SUCCESS         Handle was updated successfully.\r
@@ -257,13 +258,13 @@ EFIAPI
 HiiFindHandles (\r
   IN     EFI_HII_PROTOCOL *This,\r
   IN OUT UINT16           *HandleBufferLength,\r
-  OUT    FRAMEWORK_EFI_HII_HANDLE    Handle[1]\r
+  OUT    FRAMEWORK_EFI_HII_HANDLE    *Handle\r
   )\r
 {\r
-  UINT16                                     Count;\r
-  LIST_ENTRY                                *Link;\r
-  HII_THUNK_CONTEXT *ThunkContext;\r
-  HII_THUNK_PRIVATE_DATA               *Private;\r
+  UINT16                      Count;\r
+  LIST_ENTRY                  *Link;\r
+  HII_THUNK_CONTEXT           *ThunkContext;\r
+  HII_THUNK_PRIVATE_DATA      *Private;\r
 \r
   if (HandleBufferLength == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
@@ -305,65 +306,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
@@ -377,9 +319,9 @@ Done:
                         registered on the handle. The routine will not return the three-spaces language identifier used in \r
                         other functions to indicate non-language-specific strings.\r
 \r
-  @reval EFI_SUCCESS            LanguageString was correctly returned.\r
+  @retval EFI_SUCCESS            LanguageString was correctly returned.\r
  \r
-  @reval EFI_INVALID_PARAMETER The Handle was unknown.\r
+  @retval EFI_INVALID_PARAMETER  The Handle was unknown.\r
 **/\r
 EFI_STATUS\r
 EFIAPI\r
@@ -391,7 +333,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 +345,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 +368,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 +379,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  PrimaryLanguage        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              *PrimaryLanguage\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, PrimaryLanguage, 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, PrimaryLanguage, 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
@@ -455,8 +452,8 @@ Done:
                          but returns a NULL LanguageString if there are no secondary languages associated with the input Handle and \r
                          PrimaryLanguage pair. Type EFI_STRING is defined in String.\r
   \r
-  @reval EFI_SUCCESS            LanguageString was correctly returned.\r
-  @reval EFI_INVALID_PARAMETER  The Handle was unknown.\r
+  @retval EFI_SUCCESS            LanguageString was correctly returned.\r
+  @retval EFI_INVALID_PARAMETER  The Handle was unknown.\r
 **/\r
 EFI_STATUS\r
 EFIAPI\r
@@ -469,9 +466,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 +476,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 +493,19 @@ HiiGetSecondaryLanguages (
 \r
   UnicodeStrToAsciiStr (PrimaryLanguage, PrimaryLang639);\r
 \r
-  PrimaryLang3066 = ConvertIso639LanguageToRfc3066Language (PrimaryLang639);\r
-  ASSERT_EFI_ERROR (PrimaryLang3066 != NULL);\r
+  PrimaryLang4646 = ConvertLanguagesIso639ToRfc4646 (PrimaryLang639);\r
+  ASSERT (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 +516,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 +530,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
@@ -545,4 +544,3 @@ Done:
   return Status;\r
 }\r
 \r
\r