]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/HiiDatabase.c
Bug fixes for FrameworkHiiToUefiHiiThunk;
[mirror_edk2.git] / EdkCompatibilityPkg / Compatibility / FrameworkHiiToUefiHiiThunk / HiiDatabase.c
index d5ef19c356aeea52e3ba4963e4e28a8a58cd4465..50b902a952cd08b01b8cb3eb79c2a36b06df983b 100644 (file)
@@ -15,15 +15,12 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \r
 #include "HiiDatabase.h"\r
 \r
+HII_THUNK_PRIVATE_DATA *mHiiThunkPrivateData;\r
 \r
-EFI_HII_THUNK_PRIVATE_DATA HiiThunkPrivateDataTempate = {\r
-  {//Signature\r
-    EFI_HII_THUNK_DRIVER_DATA_SIGNATURE \r
-  },\r
-  {//Handle\r
-    (EFI_HANDLE) NULL\r
-  },\r
-  { //Hii\r
+HII_THUNK_PRIVATE_DATA mHiiThunkPrivateDataTempate = {\r
+  HII_THUNK_PRIVATE_DATA_SIGNATURE,\r
+  (EFI_HANDLE) NULL,\r
+  {\r
     HiiNewPack,\r
     HiiRemovePack,\r
     HiiFindHandles,\r
@@ -45,21 +42,47 @@ EFI_HII_THUNK_PRIVATE_DATA HiiThunkPrivateDataTempate = {
     \r
     HiiGetKeyboardLayout\r
   },\r
-  { //StaticHiiHandle\r
-    //The FRAMEWORK_EFI_HII_HANDLE starts from 1 \r
-    // and increase upwords untill reach 2^(sizeof (FRAMEWORK_EFI_HII_HANDLE)) - 1. \r
-    // The code will assert to prevent overflow.\r
-    (FRAMEWORK_EFI_HII_HANDLE) 1 \r
-  },\r
+\r
+  //\r
+  //StaticHiiHandle\r
+  //The FRAMEWORK_EFI_HII_HANDLE starts from 1 \r
+  // and increase upwords untill reach the value of StaticPureUefiHiiHandle. \r
+  // The code will assert to prevent overflow.\r
+  (FRAMEWORK_EFI_HII_HANDLE) 1,\r
+\r
+  //\r
+  //StaticPureUefiHiiHandle\r
+  //The Static FRAMEWORK_EFI_HII_HANDLE starts from 0xFFFF \r
+  // and decrease downwords untill reach the value of StaticHiiHandle. \r
+  // The code will assert to prevent overflow.\r
+  //\r
+  (FRAMEWORK_EFI_HII_HANDLE) 0xFFFF,\r
   {\r
     NULL, NULL                  //HiiHandleLinkList\r
   },\r
 };\r
 \r
-EFI_HII_DATABASE_PROTOCOL *mUefiHiiDatabaseProtocol;\r
-EFI_HII_FONT_PROTOCOL     *mUefiHiiFontProtocol;\r
-EFI_HII_IMAGE_PROTOCOL    *mUefiHiiImageProtocol;\r
-EFI_HII_STRING_PROTOCOL   *mUefiStringProtocol;\r
+EFI_FORMBROWSER_THUNK_PRIVATE_DATA mBrowserThunkPrivateDataTemplate = {\r
+  EFI_FORMBROWSER_THUNK_PRIVATE_DATA_SIGNATURE,\r
+  (EFI_HANDLE) NULL,\r
+  (HII_THUNK_PRIVATE_DATA *) NULL,\r
+  {\r
+    ThunkSendForm,\r
+    ThunkCreatePopUp\r
+  }\r
+};\r
+\r
+\r
+CONST EFI_HII_DATABASE_PROTOCOL            *mHiiDatabase;\r
+CONST EFI_HII_IMAGE_PROTOCOL               *mHiiImageProtocol;\r
+CONST EFI_HII_STRING_PROTOCOL              *mHiiStringProtocol;\r
+CONST EFI_HII_CONFIG_ROUTING_PROTOCOL      *mHiiConfigRoutingProtocol;\r
+CONST EFI_FORM_BROWSER2_PROTOCOL           *mFormBrowser2Protocol;\r
+\r
+\r
+\r
+\r
+\r
 \r
 EFI_STATUS\r
 EFIAPI\r
@@ -81,56 +104,134 @@ Returns:
 \r
 --*/\r
 {\r
-  EFI_HII_THUNK_PRIVATE_DATA *HiiData;\r
-  EFI_HANDLE                 Handle;\r
-  EFI_STATUS                 Status;\r
+  HII_THUNK_PRIVATE_DATA *Private;\r
+  EFI_HANDLE              Handle;\r
+  EFI_STATUS              Status;\r
+  UINTN                   BufferLength;\r
+  EFI_HII_HANDLE          *Buffer;\r
+  UINTN                   Index;\r
+  \r
 \r
   ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiHiiProtocolGuid);\r
 \r
-  HiiData = AllocateCopyPool (sizeof (EFI_HII_THUNK_PRIVATE_DATA), &HiiThunkPrivateDataTempate);\r
-  ASSERT (HiiData != NULL);\r
-  InitializeListHead (&HiiData->HiiThunkHandleMappingDBListHead);\r
+  Private = AllocateCopyPool (sizeof (HII_THUNK_PRIVATE_DATA), &mHiiThunkPrivateDataTempate);\r
+  ASSERT (Private != NULL);\r
+  InitializeListHead (&Private->ThunkContextListHead);\r
+\r
+  mHiiThunkPrivateData = Private;\r
 \r
   Status = gBS->LocateProtocol (\r
                   &gEfiHiiDatabaseProtocolGuid,\r
                   NULL,\r
-                  (VOID **) &mUefiHiiDatabaseProtocol\r
+                  (VOID **) &mHiiDatabase\r
                   );\r
   ASSERT_EFI_ERROR (Status);\r
 \r
   Status = gBS->LocateProtocol (\r
-                  &gEfiHiiFontProtocolGuid,\r
+                  &gEfiHiiStringProtocolGuid,\r
                   NULL,\r
-                  (VOID **) &mUefiHiiFontProtocol\r
+                  (VOID **) &mHiiStringProtocol\r
                   );\r
   ASSERT_EFI_ERROR (Status);\r
 \r
   Status = gBS->LocateProtocol (\r
-                  &gEfiHiiImageProtocolGuid,\r
+                  &gEfiHiiConfigRoutingProtocolGuid,\r
                   NULL,\r
-                  (VOID **) &mUefiHiiImageProtocol\r
+                  (VOID **) &mHiiConfigRoutingProtocol\r
                   );\r
   ASSERT_EFI_ERROR (Status);\r
 \r
+\r
   Status = gBS->LocateProtocol (\r
-                  &gEfiHiiStringProtocolGuid,\r
+                  &gEfiFormBrowser2ProtocolGuid,\r
                   NULL,\r
-                  (VOID **) &mUefiStringProtocol\r
+                  (VOID **) &mFormBrowser2Protocol\r
                   );\r
   ASSERT_EFI_ERROR (Status);\r
 \r
+\r
+  \r
+\r
   //\r
   // Install protocol interface\r
   //\r
-  Handle = NULL;\r
   Status = gBS->InstallProtocolInterface (\r
-                  &HiiData->Handle,\r
+                  &Private->Handle,\r
                   &gEfiHiiProtocolGuid,\r
                   EFI_NATIVE_INTERFACE,\r
-                  (VOID *) &HiiData->Hii\r
+                  (VOID *) &Private->Hii\r
                   );\r
   ASSERT_EFI_ERROR (Status);\r
 \r
+  Status = HiiLibListPackageLists (EFI_HII_PACKAGE_STRINGS, NULL, &BufferLength, &Buffer);\r
+  if (Status == EFI_SUCCESS) {\r
+    for (Index = 0; Index < BufferLength / sizeof (EFI_HII_HANDLE); Index++) {\r
+      CreateThunkContextForUefiHiiHandle (Private, Buffer[Index]);\r
+      ASSERT_EFI_ERROR (Status);\r
+    }\r
+\r
+    FreePool (Buffer);\r
+  }\r
+\r
+  Status = mHiiDatabase->RegisterPackageNotify (\r
+                           mHiiDatabase,\r
+                           EFI_HII_PACKAGE_STRINGS,\r
+                           NULL,\r
+                           NewOrAddPackNotify,\r
+                           EFI_HII_DATABASE_NOTIFY_NEW_PACK,\r
+                           &Handle\r
+                           );\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  Status = mHiiDatabase->RegisterPackageNotify (\r
+                           mHiiDatabase,\r
+                           EFI_HII_PACKAGE_STRINGS,\r
+                           NULL,\r
+                           NewOrAddPackNotify,\r
+                           EFI_HII_DATABASE_NOTIFY_ADD_PACK,\r
+                           &Handle\r
+                           );\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  Status = mHiiDatabase->RegisterPackageNotify (\r
+                           mHiiDatabase,\r
+                           EFI_HII_PACKAGE_FORM,\r
+                           NULL,\r
+                           NewOrAddPackNotify,\r
+                           EFI_HII_DATABASE_NOTIFY_NEW_PACK,\r
+                           &Handle\r
+                           );\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  Status = mHiiDatabase->RegisterPackageNotify (\r
+                           mHiiDatabase,\r
+                           EFI_HII_PACKAGE_FORM,\r
+                           NULL,\r
+                           NewOrAddPackNotify,\r
+                           EFI_HII_DATABASE_NOTIFY_ADD_PACK,\r
+                           &Handle\r
+                           );\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  Status = mHiiDatabase->RegisterPackageNotify (\r
+                           mHiiDatabase,\r
+                           EFI_HII_PACKAGE_STRINGS,\r
+                           NULL,\r
+                           RemovePackNotify,\r
+                           EFI_HII_DATABASE_NOTIFY_REMOVE_PACK,\r
+                           &Handle\r
+                           );\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  mBrowserThunkPrivateDataTemplate.ThunkPrivate = Private;\r
+  Status = gBS->InstallProtocolInterface (\r
+                  &mBrowserThunkPrivateDataTemplate.Handle,\r
+                  &gEfiFormBrowserProtocolGuid,\r
+                  EFI_NATIVE_INTERFACE,\r
+                  (VOID *) &mBrowserThunkPrivateDataTemplate.FormBrowser\r
+                  );\r
+  ASSERT_EFI_ERROR (Status);\r
+  \r
   return Status;\r
 }\r
 \r
@@ -152,7 +253,94 @@ Returns:
 \r
 --*/\r
 {\r
-  ASSERT (FALSE);\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
+  }\r
+\r
+  Private = HII_THUNK_PRIVATE_DATA_FROM_THIS(This);  \r
+\r
+  //\r
+  // Count the number of handles.\r
+  //\r
+  Count = 0;\r
+  Link = GetFirstNode (&Private->ThunkContextListHead);\r
+  while (!IsNull (&Private->ThunkContextListHead, Link)) {\r
+    Count++;\r
+    Link = GetNextNode (&Private->ThunkContextListHead, Link);\r
+  }\r
+\r
+  if (Count > *HandleBufferLength) {\r
+    *HandleBufferLength = (Count * sizeof (FRAMEWORK_EFI_HII_HANDLE));\r
+    return EFI_BUFFER_TOO_SMALL;\r
+  }\r
+\r
+  //\r
+  // Output the handles.\r
+  //\r
+  Count = 0;\r
+  Link = GetFirstNode (&Private->ThunkContextListHead);\r
+  while (!IsNull (&Private->ThunkContextListHead, Link)) {\r
+\r
+    ThunkContext = HII_THUNK_CONTEXT_FROM_LINK (Link);\r
+    Handle[Count] = ThunkContext->FwHiiHandle;\r
+\r
+    Count++;\r
+    Link = GetNextNode (&Private->ThunkContextListHead, Link);\r
+\r
+  }\r
+\r
+  *HandleBufferLength = (Count * sizeof (FRAMEWORK_EFI_HII_HANDLE));\r
+  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[RFC_3066_ENTRY_SIZE];\r
+  UINTN                      Index;\r
+  UINTN                      Count;\r
+  EFI_STATUS                 Status;\r
+\r
+  ASSERT (LangCodes3066 != NULL);\r
+  ASSERT (LangCodes639 != NULL);\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
+    return EFI_OUT_OF_RESOURCES;\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
   return EFI_SUCCESS;\r
 }\r
 \r
@@ -175,46 +363,61 @@ Returns:
 \r
 --*/\r
 {\r
-  EFI_HII_THUNK_PRIVATE_DATA *Private;\r
+  HII_THUNK_PRIVATE_DATA     *Private;\r
   EFI_HII_HANDLE             UefiHiiHandle;\r
-  CHAR8                      *AsciiLanguageCodes;\r
-  CHAR16                     *UnicodeLanguageCodes;\r
+  CHAR8                      *LangCodes3066;\r
+  CHAR16                     *UnicodeLangCodes639;\r
+  CHAR8                      *LangCodes639;\r
+  EFI_STATUS                 Status;\r
 \r
-  Private = EFI_HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
+  Private = HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
 \r
-  \r
-  \r
-  UefiHiiHandle = FrameworkHiiHandleToUefiHiiHandle (Private, Handle);\r
+  UefiHiiHandle = FwHiiHandleToUefiHiiHandle (Private, Handle);\r
   if (UefiHiiHandle == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  AsciiLanguageCodes = HiiLibGetSupportedLanguages (UefiHiiHandle);\r
+  LangCodes3066 = HiiLibGetSupportedLanguages (UefiHiiHandle);\r
 \r
-  if (AsciiLanguageCodes == NULL) {\r
+  if (LangCodes3066 == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  UnicodeLanguageCodes = AllocateZeroPool (AsciiStrSize (AsciiLanguageCodes) * sizeof (CHAR16));\r
-  if (UnicodeLanguageCodes == NULL) {\r
-    return EFI_OUT_OF_RESOURCES;\r
+\r
+  LangCodes639 = NULL;\r
+  Status = LangCodes3066To639 (LangCodes3066, &LangCodes639);\r
+  if (EFI_ERROR (Status)) {\r
+    goto Done;\r
+  }\r
+  \r
+  UnicodeLangCodes639 = AllocateZeroPool (AsciiStrSize (LangCodes639) * sizeof (CHAR16));\r
+  if (UnicodeLangCodes639 == NULL) {\r
+    Status =  EFI_OUT_OF_RESOURCES;\r
+    goto Done;\r
   }\r
 \r
   //\r
-  // The language returned is in RFC 3066 format.\r
+  // The language returned is in RFC 639-2 format.\r
   //\r
-  *LanguageString = AsciiStrToUnicodeStr (AsciiLanguageCodes, UnicodeLanguageCodes);\r
+  AsciiStrToUnicodeStr (LangCodes639, UnicodeLangCodes639);\r
+  *LanguageString = UnicodeLangCodes639;\r
 \r
-  return EFI_SUCCESS;\r
+Done:\r
+  FreePool (LangCodes3066);\r
+  SafeFreePool (LangCodes639);\r
+\r
+  return Status;\r
 }\r
 \r
+\r
+\r
 EFI_STATUS\r
 EFIAPI\r
 HiiGetSecondaryLanguages (\r
-  IN  EFI_HII_PROTOCOL      *This,\r
-  IN  FRAMEWORK_EFI_HII_HANDLE         Handle,\r
-  IN  CHAR16                *PrimaryLanguage,\r
-  OUT EFI_STRING            *LanguageString\r
+  IN  EFI_HII_PROTOCOL              *This,\r
+  IN  FRAMEWORK_EFI_HII_HANDLE      Handle,\r
+  IN  CHAR16                        *PrimaryLanguage,\r
+  OUT EFI_STRING                    *LanguageString\r
   )\r
 /*++\r
 \r
@@ -229,42 +432,68 @@ Returns:
 \r
 --*/\r
 {\r
-  EFI_HII_THUNK_PRIVATE_DATA *Private;\r
+  HII_THUNK_PRIVATE_DATA *Private;\r
   EFI_HII_HANDLE             UefiHiiHandle;\r
-  CHAR8                      *AsciiPrimaryLanguage;\r
-  CHAR8                      *AsciiLanguageCodes;\r
-  CHAR16                     *UnicodeLanguageCodes;\r
+  CHAR8                      PrimaryLang3066[RFC_3066_ENTRY_SIZE];\r
+  CHAR8                      *PrimaryLang639;\r
+  CHAR8                      *SecLangCodes3066;\r
+  CHAR8                      *SecLangCodes639;\r
+  CHAR16                     *UnicodeSecLangCodes639;\r
+  EFI_STATUS                 Status;\r
 \r
-  Private = EFI_HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
+  Private = HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
 \r
-  \r
-  \r
-  UefiHiiHandle = FrameworkHiiHandleToUefiHiiHandle (Private, Handle);\r
+  SecLangCodes639         = NULL;\r
+  SecLangCodes3066        = NULL;\r
+  UnicodeSecLangCodes639 = NULL;\r
+\r
+  UefiHiiHandle = FwHiiHandleToUefiHiiHandle (Private, Handle);\r
   if (UefiHiiHandle == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  AsciiPrimaryLanguage = AllocateZeroPool (StrLen (PrimaryLanguage) + 1);\r
+  PrimaryLang639 = AllocateZeroPool (StrLen (PrimaryLanguage) + 1);\r
+  if (PrimaryLang639 == NULL) {\r
+    Status = EFI_OUT_OF_RESOURCES;\r
+    goto Done;\r
+  }\r
 \r
-  UnicodeStrToAsciiStr (PrimaryLanguage, AsciiPrimaryLanguage);\r
+  UnicodeStrToAsciiStr (PrimaryLanguage, PrimaryLang639);\r
 \r
-  AsciiLanguageCodes = HiiLibGetSupportedSecondaryLanguages (UefiHiiHandle, AsciiPrimaryLanguage);\r
+  Status = ConvertIso639LanguageToRfc3066Language (PrimaryLang639, PrimaryLang3066);\r
+  ASSERT_EFI_ERROR (Status);\r
 \r
-  if (AsciiLanguageCodes == NULL) {\r
-    return EFI_INVALID_PARAMETER;\r
+  SecLangCodes3066 = HiiLibGetSupportedSecondaryLanguages (UefiHiiHandle, PrimaryLang3066);\r
+\r
+  if (SecLangCodes3066 == NULL) {\r
+    Status =  EFI_INVALID_PARAMETER;\r
+    goto Done;\r
   }\r
 \r
-  UnicodeLanguageCodes = AllocateZeroPool (AsciiStrSize (AsciiLanguageCodes) * sizeof (CHAR16));\r
-  if (UnicodeLanguageCodes == NULL) {\r
-    return EFI_OUT_OF_RESOURCES;\r
+  Status = LangCodes3066To639 (SecLangCodes3066, &SecLangCodes639);\r
+  if (EFI_ERROR (Status)) {\r
+    goto Done;\r
+  }\r
+\r
+  UnicodeSecLangCodes639 = AllocateZeroPool (AsciiStrSize (SecLangCodes639) * sizeof (CHAR16));\r
+  if (UnicodeSecLangCodes639 == NULL) {\r
+    Status = EFI_OUT_OF_RESOURCES;\r
+    goto Done;\r
   }\r
 \r
   //\r
   // The language returned is in RFC 3066 format.\r
   //\r
-  *LanguageString = AsciiStrToUnicodeStr (AsciiLanguageCodes, UnicodeLanguageCodes);\r
+  *LanguageString = AsciiStrToUnicodeStr (SecLangCodes639, UnicodeSecLangCodes639);\r
 \r
-  return EFI_SUCCESS;\r
+Done:\r
+  \r
+  SafeFreePool (PrimaryLang639);\r
+  SafeFreePool (SecLangCodes639);\r
+  SafeFreePool (SecLangCodes3066);\r
+  SafeFreePool (UnicodeSecLangCodes639);\r
+  \r
+  return Status;\r
 }\r
 \r
-\r
\r