]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Application/PlatOverMngr/PlatOverMngr.c
Retire Extended HII library class.
[mirror_edk2.git] / MdeModulePkg / Application / PlatOverMngr / PlatOverMngr.c
index 3fe9cb28fd7e62ab38973e013a84e3390754c7c4..543f896a743858cc448b7c57913521370655fe0b 100644 (file)
@@ -39,8 +39,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #include <Protocol/DevicePathToText.h>\r
 #include <Protocol/DevicePath.h>\r
 \r
-#include <Guid/GlobalVariable.h>\r
-\r
+#include <Library/DevicePathLib.h>\r
 #include <Library/BaseLib.h>\r
 #include <Library/DebugLib.h>\r
 #include <Library/UefiLib.h>\r
@@ -49,11 +48,9 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #include <Library/PlatformDriverOverrideLib.h>\r
 #include <Library/HiiLib.h>\r
 #include <Library/IfrSupportLib.h>\r
-#include <Library/ExtendedHiiLib.h>\r
 #include <Library/ExtendedIfrSupportLib.h>\r
 #include <Library/BaseMemoryLib.h>\r
 #include <Library/MemoryAllocationLib.h>\r
-#include <Library/UefiRuntimeServicesTableLib.h>\r
 #include <Library/DevicePathLib.h>\r
 #include "PlatOverMngr.h"\r
 \r
@@ -69,6 +66,18 @@ typedef struct {
   EFI_HII_CONFIG_ACCESS_PROTOCOL  ConfigAccess;\r
 } EFI_CALLBACK_INFO;\r
 \r
+#pragma pack(1)\r
+\r
+///\r
+/// HII specific Vendor Device Path definition.\r
+///\r
+typedef struct {\r
+  VENDOR_DEVICE_PATH             VendorDevicePath;\r
+  EFI_DEVICE_PATH_PROTOCOL       End;\r
+} HII_VENDOR_DEVICE_PATH;\r
+\r
+#pragma pack()\r
+\r
 //\r
 // uni string and Vfr Binary data.\r
 //\r
@@ -93,9 +102,33 @@ EFI_LOADED_IMAGE_PROTOCOL    *mDriverImageProtocol[MAX_CHOICE_NUM];
 EFI_DEVICE_PATH_PROTOCOL     *mControllerDevicePathProtocol[MAX_CHOICE_NUM];\r
 UINTN                        mSelectedDriverImageNum;\r
 UINTN                        mLastSavedDriverImageNum;\r
-CHAR8                        mLanguage[RFC_3066_ENTRY_SIZE];\r
 UINT16                       mCurrentPage;\r
 \r
+HII_VENDOR_DEVICE_PATH  mHiiVendorDevicePath = {\r
+  {\r
+    {\r
+      HARDWARE_DEVICE_PATH,\r
+      HW_VENDOR_DP,\r
+      {\r
+        (UINT8) (sizeof (VENDOR_DEVICE_PATH)),\r
+        (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)\r
+      }\r
+    },\r
+    //\r
+    // {99936717-BF3D-4b04-9787-76CEE324D76F}\r
+    //\r
+    { 0x99936717, 0xbf3d, 0x4b04, { 0x97, 0x87, 0x76, 0xce, 0xe3, 0x24, 0xd7, 0x6f } }\r
+  },\r
+  {\r
+    END_DEVICE_PATH_TYPE,\r
+    END_ENTIRE_DEVICE_PATH_SUBTYPE,\r
+    { \r
+      (UINT8) (END_DEVICE_PATH_LENGTH),\r
+      (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8)\r
+    }\r
+  }\r
+};\r
+\r
 /**\r
   Converting a given device to an unicode string. \r
   \r
@@ -113,55 +146,71 @@ DevicePathToStr (
   );\r
 \r
 /**\r
-  Do string convertion for the ComponentName supported language. It do\r
-  the convertion just for english language code from RFC 3066 to ISO 639-2.\r
-  Then it will check whether the converted language is in the supported language list.\r
-  If not supported, NULL is returned.\r
-  If Language is not english, NULL is returned.\r
+  Worker function to get the driver name by ComponentName or ComponentName2 protocol \r
+  according to the driver binding handle.\r
 \r
-  @param SupportedLanguages        Pointer to ComponentName supported language string list. ISO 639-2 language\r
-  @param Language                  The language string. RFC 3066 language\r
+  @param  DriverBindingHandle  The Handle of DriverBinding.\r
+  @param  ProtocolGuid         The pointer to Component Name (2) protocol GUID.\r
+  @param  VariableName         The name of the RFC 4646 or ISO 639-2 language variable.\r
 \r
-  @return  English language string (ISO 639-2)\r
-  @return  NULL if the conertion is not successful.\r
+  @retval !NULL               Pointer into the image name if the image name is found,\r
+  @retval NULL                Pointer to NULL if the image name is not found.\r
 \r
 **/\r
-CHAR8 *\r
-ConvertComponentNameSupportLanguage (\r
-  IN CHAR8                           *SupportedLanguages,\r
-  IN CHAR8                           *Language\r
+CHAR16 *\r
+GetComponentNameWorker (\r
+  IN EFI_HANDLE                      DriverBindingHandle,\r
+  IN EFI_GUID                        *ProtocolGuid,\r
+  IN CONST CHAR16                    *VariableName\r
   )\r
 {\r
-  CHAR8    *LangCode;\r
-  LangCode = NULL;\r
+  EFI_STATUS                         Status;\r
+  EFI_COMPONENT_NAME_PROTOCOL        *ComponentName;\r
+  CHAR16                             *DriverName;\r
+  CHAR8                              *Language;\r
+  CHAR8                              *BestLanguage;\r
 \r
-  //\r
-  // Check the input language is English\r
-  //\r
-  if (AsciiStrnCmp (Language, "en-", 3) != 0) {\r
+  Status = gBS->OpenProtocol (\r
+                  DriverBindingHandle,\r
+                  ProtocolGuid,\r
+                  (VOID *) &ComponentName,\r
+                  NULL,\r
+                  NULL,\r
+                  EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
+                  );\r
+  if (EFI_ERROR (Status)) {\r
     return NULL;\r
   }\r
-  \r
+\r
   //\r
-  // Check SupportedLanguages format\r
+  // Find the best matching language.\r
   //\r
-  if (AsciiStrStr (SupportedLanguages, "en-") != NULL) {\r
-    //\r
-    // Create RFC 3066 language\r
-    //\r
-    LangCode = AllocateZeroPool(AsciiStrSize (Language));\r
-    AsciiStrCpy (LangCode, Language);\r
-  } else if (AsciiStrStr (SupportedLanguages, "en") != NULL) {\r
-    //\r
-    // Create ISO 639-2 Language\r
-    //\r
-    LangCode = AllocateZeroPool(4);\r
-    AsciiStrCpy (LangCode, "eng");    \r
+  Language = GetEfiGlobalVariable (VariableName);\r
+  BestLanguage = GetBestLanguage (\r
+                   ComponentName->SupportedLanguages,\r
+                   (BOOLEAN) (ProtocolGuid == &gEfiComponentNameProtocolGuid),\r
+                   Language,\r
+                   NULL\r
+                   );\r
+\r
+  DriverName = NULL;\r
+  if (BestLanguage != NULL) {\r
+    ComponentName->GetDriverName (\r
+                     ComponentName,\r
+                     BestLanguage,\r
+                     &DriverName\r
+                     );\r
+    FreePool (BestLanguage);\r
   }\r
-  \r
-  return LangCode;\r
+\r
+  if (Language != NULL) {\r
+    FreePool (Language);\r
+  }\r
+\r
+  return DriverName;\r
 }\r
 \r
+\r
 /**\r
   Get the driver name by ComponentName or ComponentName2 protocol \r
   according to the driver binding handle\r
@@ -177,59 +226,17 @@ GetComponentName (
   IN EFI_HANDLE                      DriverBindingHandle\r
   )\r
 {\r
-  EFI_STATUS                   Status;\r
-  EFI_COMPONENT_NAME_PROTOCOL  *ComponentName;\r
-  EFI_COMPONENT_NAME2_PROTOCOL *ComponentName2;\r
-  CHAR8                        *SupportedLanguage;\r
-  CHAR16                       *DriverName;\r
-\r
-  ComponentName  = NULL;\r
-  ComponentName2 = NULL;\r
-  Status = gBS->OpenProtocol (\r
-                 DriverBindingHandle,\r
-                 &gEfiComponentName2ProtocolGuid,\r
-                 (VOID **) &ComponentName2,\r
-                 NULL,\r
-                 NULL,\r
-                 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
-                 );\r
-  if (EFI_ERROR(Status)) {\r
-    Status = gBS->OpenProtocol (\r
-                   DriverBindingHandle,\r
-                   &gEfiComponentNameProtocolGuid,\r
-                   (VOID **) &ComponentName,\r
-                   NULL,\r
-                   NULL,\r
-                   EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
-                   );\r
-  }\r
+  CHAR16                    *DriverName;\r
 \r
-  Status     = EFI_SUCCESS;\r
-  DriverName = NULL;\r
-  if (ComponentName != NULL) {\r
-    if (ComponentName->GetDriverName != NULL) {\r
-      SupportedLanguage = ConvertComponentNameSupportLanguage (ComponentName->SupportedLanguages, mLanguage);\r
-      if (SupportedLanguage != NULL) {\r
-        Status = ComponentName->GetDriverName (\r
-                                  ComponentName,\r
-                                  SupportedLanguage,\r
-                                  &DriverName\r
-                                  );\r
-        FreePool (SupportedLanguage);\r
-      }\r
-    }\r
-  } else if (ComponentName2 != NULL) {\r
-    if (ComponentName2->GetDriverName != NULL) {\r
-      Status = ComponentName2->GetDriverName (\r
-                                 ComponentName2,\r
-                                 mLanguage,\r
-                                 &DriverName\r
-                                 );\r
-    }\r
-  }\r
-\r
-  if (EFI_ERROR (Status)) {\r
-    return NULL;\r
+  //\r
+  // Try RFC 4646 Component Name 2 protocol first.\r
+  //\r
+  DriverName = GetComponentNameWorker (DriverBindingHandle, &gEfiComponentName2ProtocolGuid, L"PlatformLang");\r
+  if (DriverName == NULL) {\r
+    //\r
+    // If we can not get driver name from Component Name 2 protocol, we can try ISO 639-2 Component Name protocol. \r
+    //\r
+    DriverName = GetComponentNameWorker (DriverBindingHandle, &gEfiComponentNameProtocolGuid, L"Lang");\r
   }\r
 \r
   return DriverName;\r
@@ -237,7 +244,7 @@ GetComponentName (
 \r
 /**\r
   Get the image name from EFI UI section.\r
-  Get FV protocol by its loaded image protoocl to abastract EFI UI section.\r
+  Get FV protocol by its loaded image protocol to abstract EFI UI section.\r
 \r
   @param Image            Pointer to the loaded image protocol\r
 \r
@@ -340,7 +347,6 @@ UpdateDeviceSelectPage (
 {\r
   EFI_HII_UPDATE_DATA                       UpdateData;\r
   EFI_STATUS                                Status;\r
-  UINTN                                     LangSize;\r
   UINTN                                     Index;\r
   UINTN                                     DevicePathHandleCount;\r
   CHAR16                                    *NewString;\r
@@ -356,19 +362,6 @@ UpdateDeviceSelectPage (
   //\r
   mCurrentPage = FORM_ID_DEVICE;  \r
   \r
-  //\r
-  // Get Platform supported Language (RFC_3066 format)\r
-  //\r
-  LangSize = RFC_3066_ENTRY_SIZE;\r
-  Status = gRT->GetVariable (\r
-              L"PlatformLang",\r
-              &gEfiGlobalVariableGuid,\r
-              NULL,\r
-              &LangSize,\r
-              mLanguage\r
-              );\r
-  ASSERT_EFI_ERROR (Status);\r
-\r
   //\r
   // Initial the mapping database in memory\r
   //\r
@@ -1320,8 +1313,7 @@ PlatOverMngrInit (
   EFI_HII_DATABASE_PROTOCOL   *HiiDatabase;\r
   EFI_HII_PACKAGE_LIST_HEADER *PackageList;\r
   EFI_CALLBACK_INFO           *CallbackInfo;\r
-  EFI_HANDLE                  DriverHandle;\r
-  EFI_FORM_BROWSER2_PROTOCOL       *FormBrowser2;\r
+  EFI_FORM_BROWSER2_PROTOCOL  *FormBrowser2;\r
   \r
   //\r
   // There should only be one HII protocol\r
@@ -1358,22 +1350,15 @@ PlatOverMngrInit (
   CallbackInfo->ConfigAccess.Callback      = PlatOverMngrCallback;\r
 \r
   //\r
-  // Create driver handle used by HII database\r
-  //\r
-  Status = HiiLibCreateHiiDriverHandle (&DriverHandle);\r
-  if (EFI_ERROR (Status)) {\r
-    goto Finish;\r
-  }\r
-  CallbackInfo->DriverHandle = DriverHandle;\r
-\r
-  //\r
-  // Install Config Access protocol to driver handle\r
+  // Install Device Path Protocol and Config Access protocol to driver handle\r
   //\r
-  Status = gBS->InstallProtocolInterface (\r
-                  &DriverHandle,\r
+  Status = gBS->InstallMultipleProtocolInterfaces (\r
+                  &CallbackInfo->DriverHandle,\r
+                  &gEfiDevicePathProtocolGuid,\r
+                  &mHiiVendorDevicePath,\r
                   &gEfiHiiConfigAccessProtocolGuid,\r
-                  EFI_NATIVE_INTERFACE,\r
-                  &CallbackInfo->ConfigAccess\r
+                  &CallbackInfo->ConfigAccess,\r
+                  NULL\r
                   );\r
   if (EFI_ERROR (Status)) {\r
     goto Finish;\r
@@ -1393,7 +1378,7 @@ PlatOverMngrInit (
   Status = HiiDatabase->NewPackageList (\r
                            HiiDatabase,\r
                            PackageList,\r
-                           DriverHandle,\r
+                           CallbackInfo->DriverHandle,\r
                            &CallbackInfo->RegisteredHandle\r
                            );\r
   FreePool (PackageList);\r
@@ -1449,7 +1434,14 @@ PlatOverMngrInit (
 \r
 Finish:\r
   if (CallbackInfo->DriverHandle != NULL) {\r
-    HiiLibDestroyHiiDriverHandle (CallbackInfo->DriverHandle);\r
+    gBS->UninstallMultipleProtocolInterfaces (\r
+           CallbackInfo->DriverHandle,\r
+           &gEfiDevicePathProtocolGuid,\r
+           &mHiiVendorDevicePath,\r
+           &gEfiHiiConfigAccessProtocolGuid,\r
+           &CallbackInfo->ConfigAccess,\r
+           NULL\r
+           );\r
   }\r
   if (CallbackInfo != NULL) {\r
     FreePool (CallbackInfo);\r