**/\r
\r
#include "DeviceManager.h"\r
+#include <Guid/HiiPlatformSetupFormset.h>\r
\r
DEVICE_MANAGER_CALLBACK_DATA gDeviceManagerPrivate = {\r
DEVICE_MANAGER_CALLBACK_DATA_SIGNATURE,\r
}\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
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
)\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
//\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
// 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
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
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