]> git.proxmox.com Git - mirror_edk2.git/blobdiff - IntelFrameworkModulePkg/Universal/BdsDxe/DeviceMngr/DeviceManager.c
Update BdsDxe to use new designed HiiLib, remove the referrence to the original IfrSu...
[mirror_edk2.git] / IntelFrameworkModulePkg / Universal / BdsDxe / DeviceMngr / DeviceManager.c
index 920a0506306851ee3ec2fab8d396a04eb7a83511..86046081fea1336f7cc95c6c5e084d3a69f8ba5c 100644 (file)
@@ -13,6 +13,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 **/\r
 \r
 #include "DeviceManager.h"\r
+#include <Guid/HiiPlatformSetupFormset.h>\r
 \r
 DEVICE_MANAGER_CALLBACK_DATA  gDeviceManagerPrivate = {\r
   DEVICE_MANAGER_CALLBACK_DATA_SIGNATURE,\r
@@ -61,9 +62,6 @@ HII_VENDOR_DEVICE_PATH  mDeviceManagerHiiVendorDevicePath = {
   }\r
 };\r
 \r
-#define MENU_ITEM_NUM  \\r
-  (sizeof (mDeviceManagerMenuItemTable) / sizeof (DEVICE_MANAGER_MENU_ITEM))\r
-\r
 /**\r
   This function is invoked if user selected a iteractive opcode from Device Manager's\r
   Formset. The decision by user is saved to gCallbackKey for later processing. If\r
@@ -154,6 +152,124 @@ InitializeDeviceManager (
   return Status;\r
 }\r
 \r
+/**\r
+  Extract the displayed formset for given HII handle and class guid.\r
+\r
+  @param Handle          The HII handle.\r
+  @param SetupClassGuid  The class guid specifies which form set will be displayed.\r
+  @param FormSetTitle    Formset title string.\r
+  @param FormSetHelp     Formset help string.\r
+\r
+  @retval  TRUE          The formset for given HII handle will be displayed.\r
+  @return  FALSE         The formset for given HII handle will not be displayed.\r
+\r
+**/\r
+BOOLEAN\r
+ExtractDisplayedHiiFormFromHiiHandle (\r
+  IN      EFI_HII_HANDLE      Handle,\r
+  IN      EFI_GUID            *SetupClassGuid,\r
+  OUT     EFI_STRING_ID       *FormSetTitle,\r
+  OUT     EFI_STRING_ID       *FormSetHelp\r
+  )\r
+{\r
+  EFI_STATUS                   Status;\r
+  UINTN                        BufferSize;\r
+  EFI_HII_PACKAGE_LIST_HEADER  *HiiPackageList;\r
+  UINT8                        *Package;\r
+  UINT8                        *OpCodeData;\r
+  UINT32                       Offset;\r
+  UINT32                       Offset2;\r
+  UINT32                       PackageListLength;\r
+  EFI_HII_PACKAGE_HEADER       PackageHeader;\r
+  EFI_GUID                     *ClassGuid;\r
+  UINT8                        ClassGuidNum;\r
+\r
+  ASSERT (Handle != NULL);\r
+  ASSERT (SetupClassGuid != NULL);  \r
+  ASSERT (FormSetTitle != NULL);\r
+  ASSERT (FormSetHelp != NULL);\r
+\r
+  *FormSetTitle = 0;\r
+  *FormSetHelp  = 0;\r
+  ClassGuidNum  = 0;\r
+  ClassGuid     = NULL;\r
+\r
+  //\r
+  // Get HII PackageList\r
+  //\r
+  BufferSize = 0;\r
+  HiiPackageList = NULL;\r
+  Status = gHiiDatabase->ExportPackageLists (gHiiDatabase, Handle, &BufferSize, HiiPackageList);\r
+  //\r
+  // Handle is a invalid handle. Check if Handle is corrupted.\r
+  //\r
+  ASSERT (Status != EFI_NOT_FOUND);\r
+  //\r
+  // The return status should always be EFI_BUFFER_TOO_SMALL as input buffer's size is 0.\r
+  //\r
+  ASSERT (Status == EFI_BUFFER_TOO_SMALL);\r
+  \r
+  HiiPackageList = AllocatePool (BufferSize);\r
+  ASSERT (HiiPackageList != NULL);\r
+\r
+  Status = gHiiDatabase->ExportPackageLists (gHiiDatabase, Handle, &BufferSize, HiiPackageList);\r
+  if (EFI_ERROR (Status)) {\r
+    return FALSE;\r
+  }\r
+\r
+  //\r
+  // Get Form package from this HII package List\r
+  //\r
+  Offset = sizeof (EFI_HII_PACKAGE_LIST_HEADER);\r
+  Offset2 = 0;\r
+  PackageListLength = ReadUnaligned32 (&HiiPackageList->PackageLength);\r
+\r
+  while (Offset < PackageListLength) {\r
+    Package = ((UINT8 *) HiiPackageList) + Offset;\r
+    CopyMem (&PackageHeader, Package, sizeof (EFI_HII_PACKAGE_HEADER));\r
+\r
+    if (PackageHeader.Type == EFI_HII_PACKAGE_FORMS) {\r
+      //\r
+      // Search FormSet Opcode in this Form Package\r
+      //\r
+      Offset2 = sizeof (EFI_HII_PACKAGE_HEADER);\r
+      while (Offset2 < PackageHeader.Length) {\r
+        OpCodeData = Package + Offset2;\r
+\r
+        if (((EFI_IFR_OP_HEADER *) OpCodeData)->OpCode == EFI_IFR_FORM_SET_OP) {\r
+          //\r
+          // Find FormSet OpCode\r
+          //\r
+          ClassGuidNum = ((EFI_IFR_FORM_SET *) OpCodeData)->Flags;\r
+          ClassGuid = (EFI_GUID *) (VOID *)(OpCodeData + sizeof (EFI_IFR_FORM_SET));\r
+          while (ClassGuidNum-- > 0) {\r
+            if (CompareGuid (SetupClassGuid, ClassGuid)) {\r
+              CopyMem (FormSetTitle, &((EFI_IFR_FORM_SET *) OpCodeData)->FormSetTitle, sizeof (EFI_STRING_ID));\r
+              CopyMem (FormSetHelp, &((EFI_IFR_FORM_SET *) OpCodeData)->Help, sizeof (EFI_STRING_ID));\r
+              FreePool (HiiPackageList);\r
+              return TRUE;\r
+            }\r
+          }\r
+        }\r
+        \r
+        //\r
+        // Go to next opcode\r
+        //\r
+        Offset2 += ((EFI_IFR_OP_HEADER *) OpCodeData)->Length;\r
+      }\r
+    }\r
+    \r
+    //\r
+    // Go to next package\r
+    //\r
+    Offset += PackageHeader.Length;\r
+  }\r
+\r
+  FreePool (HiiPackageList);\r
+\r
+  return FALSE;\r
+}\r
+\r
 /**\r
   Call the browser and display the device manager to allow user\r
   to configure the platform.\r
@@ -172,21 +288,21 @@ CallDeviceManager (
   )\r
 {\r
   EFI_STATUS                  Status;\r
-  UINTN                       Count;\r
   UINTN                       Index;\r
   EFI_STRING                  String;\r
-  EFI_HII_UPDATE_DATA         UpdateData[MENU_ITEM_NUM];\r
   EFI_STRING_ID               Token;\r
   EFI_STRING_ID               TokenHelp;\r
   EFI_HII_HANDLE              *HiiHandles;\r
   EFI_HII_HANDLE              HiiHandle;\r
-  UINT16                      FormSetClass;\r
   EFI_STRING_ID               FormSetTitle;\r
   EFI_STRING_ID               FormSetHelp;\r
   EFI_BROWSER_ACTION_REQUEST  ActionRequest;\r
+  VOID                        *StartOpCodeHandle;\r
+  VOID                        *EndOpCodeHandle;\r
+  EFI_IFR_GUID_LABEL          *StartLabel;\r
+  EFI_IFR_GUID_LABEL          *EndLabel;\r
 \r
-  HiiHandles          = NULL;\r
-\r
+  HiiHandles    = NULL;\r
   Status        = EFI_SUCCESS;\r
   gCallbackKey  = 0;\r
 \r
@@ -201,17 +317,30 @@ CallDeviceManager (
   //\r
   // Create Subtitle OpCodes\r
   //\r
-  for (Index = 0; Index < MENU_ITEM_NUM; Index++) {\r
-    //\r
-    // Allocate space for creation of UpdateData Buffer\r
-    //\r
-    UpdateData[Index].BufferSize = 0x1000;\r
-    UpdateData[Index].Offset = 0;\r
-    UpdateData[Index].Data = AllocatePool (0x1000);\r
-    ASSERT (UpdateData[Index].Data != NULL);\r
+  //\r
+  // Allocate space for creation of UpdateData Buffer\r
+  //\r
+  StartOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+  ASSERT (StartOpCodeHandle != NULL);\r
 \r
-    CreateSubTitleOpCode (mDeviceManagerMenuItemTable[Index].StringId, 0, 0, 1,  &UpdateData[Index]);\r
-  }\r
+  EndOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+  ASSERT (EndOpCodeHandle != NULL);\r
+\r
+  //\r
+  // Create Hii Extend Label OpCode as the start opcode\r
+  //\r
+  StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (StartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
+  StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
+  StartLabel->Number       = LABEL_DEVICES_LIST;\r
+\r
+  //\r
+  // Create Hii Extend Label OpCode as the end opcode\r
+  //\r
+  EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (EndOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
+  EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
+  EndLabel->Number       = LABEL_END;\r
+\r
+  HiiCreateSubTitleOpCode (StartOpCodeHandle, STRING_TOKEN (STR_DEVICES_LIST), 0, 0, 1);\r
 \r
   //\r
   // Get all the Hii handles\r
@@ -225,9 +354,7 @@ CallDeviceManager (
   // Search for formset of each class type\r
   //\r
   for (Index = 0; HiiHandles[Index] != NULL; Index++) {\r
-    IfrLibExtractClassFromHiiHandle (HiiHandles[Index], &FormSetClass, &FormSetTitle, &FormSetHelp);\r
-\r
-    if (FormSetClass == EFI_NON_DEVICE_CLASS) {\r
+    if (!ExtractDisplayedHiiFormFromHiiHandle (HiiHandles[Index], &gEfiHiiPlatformSetupFormsetGuid, &FormSetTitle, &FormSetHelp)) {\r
       continue;\r
     }\r
 \r
@@ -241,42 +368,35 @@ CallDeviceManager (
     TokenHelp = HiiSetString (HiiHandle, 0, String, NULL);\r
     FreePool (String);\r
 \r
-    for (Count = 0; Count < MENU_ITEM_NUM; Count++) {\r
-      if (FormSetClass & mDeviceManagerMenuItemTable[Count].Class) {\r
-        CreateActionOpCode (\r
-          (EFI_QUESTION_ID) (Index + DEVICE_KEY_OFFSET),\r
-          Token,\r
-          TokenHelp,\r
-          EFI_IFR_FLAG_CALLBACK,\r
-          0,\r
-          &UpdateData[Count]\r
-          );\r
-      }\r
-    }\r
-  }\r
-\r
-  for (Index = 0; Index < MENU_ITEM_NUM; Index++) {\r
-    //\r
-    // Add End Opcode for Subtitle\r
-    //\r
-    CreateEndOpCode (&UpdateData[Index]);\r
-\r
-    IfrLibUpdateForm (\r
-      HiiHandle,\r
-      &mDeviceManagerGuid,\r
-      DEVICE_MANAGER_FORM_ID,\r
-      mDeviceManagerMenuItemTable[Index].Class,\r
-      FALSE,\r
-      &UpdateData[Index]\r
+    HiiCreateActionOpCode (\r
+      StartOpCodeHandle,\r
+      (EFI_QUESTION_ID) (Index + DEVICE_KEY_OFFSET),\r
+      Token,\r
+      TokenHelp,\r
+      EFI_IFR_FLAG_CALLBACK,\r
+      0\r
       );\r
   }\r
 \r
+  //\r
+  // Add End Opcode for Subtitle\r
+  //\r
+  HiiCreateEndOpCode (StartOpCodeHandle);\r
+\r
+  HiiUpdateForm (\r
+    HiiHandle,\r
+    &mDeviceManagerGuid,\r
+    DEVICE_MANAGER_FORM_ID,\r
+    StartOpCodeHandle,\r
+    EndOpCodeHandle\r
+    );\r
+\r
   ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;\r
   Status = gFormBrowser2->SendForm (\r
                            gFormBrowser2,\r
                            &HiiHandle,\r
                            1,\r
-                           NULL,\r
+                           &mDeviceManagerGuid,\r
                            0,\r
                            NULL,\r
                            &ActionRequest\r
@@ -329,9 +449,8 @@ CallDeviceManager (
     Status = EFI_SUCCESS;\r
   }\r
 \r
-  for (Index = 0; Index < MENU_ITEM_NUM; Index++) {\r
-    FreePool (UpdateData[Index].Data);\r
-  }\r
+  HiiFreeOpCodeHandle (StartOpCodeHandle);\r
+  HiiFreeOpCodeHandle (EndOpCodeHandle);\r
   FreePool (HiiHandles);\r
 \r
   return Status;\r