#include "Language.h"\r
#define MAX_STRING_LEN 200\r
\r
-EFI_GUID mFrontPageGuid = FRONT_PAGE_FORMSET_GUID;\r
+EFI_GUID mFrontPageGuid = FRONT_PAGE_FORMSET_GUID;\r
\r
BOOLEAN gConnectAllHappened = FALSE;\r
BOOLEAN mFeaturerSwitch = TRUE;\r
BOOLEAN mResetRequired = FALSE;\r
-BOOLEAN mEnterBmm = FALSE;\r
\r
EFI_FORM_BROWSER2_PROTOCOL *gFormBrowser2;\r
CHAR8 *mLanguageString;\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
- *Progress = Configuration;\r
- if (!HiiIsConfigHdrMatch (Configuration, &mBootMaintGuid, mBootMaintStorageName)\r
- && !HiiIsConfigHdrMatch (Configuration, &mFileExplorerGuid, mFileExplorerStorageName)) {\r
- return EFI_NOT_FOUND;\r
- }\r
-\r
- *Progress = Configuration + StrLen (Configuration);\r
- return EFI_SUCCESS;\r
+ return EFI_NOT_FOUND;\r
}\r
\r
/**\r
UINTN Index;\r
EFI_STATUS Status;\r
\r
- //\r
- //Chech whether exit from BMM and reenter frontpage,if yes,reclaim string depositories\r
- //\r
- if (Action == EFI_BROWSER_ACTION_FORM_OPEN){\r
- if (mEnterBmm){\r
- ReclaimStringDepository();\r
- mEnterBmm = FALSE;\r
- }\r
- }\r
-\r
- if (Action != EFI_BROWSER_ACTION_CHANGING && Action != EFI_BROWSER_ACTION_CHANGED) {\r
+ if (Action != EFI_BROWSER_ACTION_CHANGED) {\r
//\r
// Do nothing for other UEFI Action. Only do call back when data is changed.\r
//\r
default:\r
break;\r
}\r
- } else if (Action == EFI_BROWSER_ACTION_CHANGING) {\r
- if (Value == NULL) {\r
- return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+Update front page form base on the ClassGuid in the formset in other modules.\r
+\r
+**/\r
+VOID\r
+UpdateFrontPageForm (\r
+ VOID\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_HII_HANDLE HiiHandle;\r
+ VOID *StartOpCodeHandle;\r
+ VOID *EndOpCodeHandle;\r
+ EFI_IFR_GUID_LABEL *StartLabel;\r
+ EFI_IFR_GUID_LABEL *EndLabel;\r
+ UINTN Index;\r
+ EFI_STRING String;\r
+ EFI_STRING_ID Token;\r
+ EFI_STRING_ID TokenHelp;\r
+ EFI_HII_HANDLE *HiiHandles;\r
+ EFI_GUID FormSetGuid;\r
+ CHAR16 *DevicePathStr;\r
+ EFI_STRING_ID DevicePathId;\r
+ EFI_IFR_FORM_SET *Buffer;\r
+ UINTN BufferSize;\r
+ UINT8 ClassGuidNum;\r
+ EFI_GUID *ClassGuid;\r
+ UINTN TempSize;\r
+ UINT8 *Ptr;\r
+\r
+ TempSize =0;\r
+ BufferSize = 0;\r
+ Buffer = NULL;\r
+\r
+ HiiHandle = gFrontPagePrivate.HiiHandle;\r
+\r
+ //\r
+ // Allocate space for creation of UpdateData Buffer\r
+ //\r
+ StartOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+ ASSERT (StartOpCodeHandle != NULL);\r
+\r
+ EndOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+ ASSERT (EndOpCodeHandle != NULL);\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_PLATFORM_INFORMATION;\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
+ //\r
+ // Get all the Hii handles\r
+ //\r
+ HiiHandles = HiiGetHiiHandles (NULL);\r
+ ASSERT (HiiHandles != NULL);\r
+ //\r
+ // Search for formset of each class type\r
+ //\r
+ for (Index = 0; HiiHandles[Index] != NULL; Index++) {\r
+ Status = HiiGetFormSetFromHiiHandle(HiiHandles[Index], &Buffer,&BufferSize);\r
+ if (EFI_ERROR (Status)) {\r
+ continue;\r
}\r
\r
- //\r
- // The first 4 entries in the Front Page are to be GUARANTEED to remain constant so IHV's can\r
- // describe to their customers in documentation how to find their setup information (namely\r
- // under the device manager and specific buckets)\r
- //\r
- switch (QuestionId) {\r
- case FRONT_PAGE_KEY_BOOT_MANAGER:\r
- //\r
- // Boot Manager\r
- //\r
- EnumerateBootOptions ();\r
- break;\r
+ Ptr = (UINT8 *)Buffer;\r
+ while(TempSize < BufferSize) {\r
+ TempSize += ((EFI_IFR_OP_HEADER *) Ptr)->Length;\r
\r
- case FRONT_PAGE_KEY_DEVICE_MANAGER:\r
- //\r
- // Device Manager\r
- //\r
- CreateDeviceManagerForm(DEVICE_MANAGER_FORM_ID);\r
- break;\r
+ if (((EFI_IFR_OP_HEADER *) Ptr)->Length <= OFFSET_OF (EFI_IFR_FORM_SET, Flags)){\r
+ Ptr += ((EFI_IFR_OP_HEADER *) Ptr)->Length;\r
+ continue;\r
+ }\r
\r
- case FRONT_PAGE_KEY_BOOT_MAINTAIN:\r
//\r
- // Boot Maintenance Manager\r
+ // Find Class Guid\r
//\r
- InitializeBM ();\r
- mEnterBmm = TRUE;\r
- break;\r
+ ClassGuidNum = (UINT8) (((EFI_IFR_FORM_SET *)Ptr)->Flags & 0x3);\r
+ ClassGuid = (EFI_GUID *) (VOID *)(Ptr + sizeof (EFI_IFR_FORM_SET));\r
+ while (ClassGuidNum-- > 0) {\r
+ if (CompareGuid (&gEfiIfrFrontPageGuid, ClassGuid) == 0){\r
+ ClassGuid ++;\r
+ continue;\r
+ }\r
\r
- default:\r
- break;\r
+ String = HiiGetString (HiiHandles[Index], ((EFI_IFR_FORM_SET *)Ptr)->FormSetTitle, NULL);\r
+ if (String == NULL) {\r
+ String = HiiGetString (HiiHandle, STRING_TOKEN (STR_MISSING_STRING), NULL);\r
+ ASSERT (String != NULL);\r
+ }\r
+ Token = HiiSetString (HiiHandle, 0, String, NULL);\r
+ FreePool (String);\r
+\r
+ String = HiiGetString (HiiHandles[Index], ((EFI_IFR_FORM_SET *)Ptr)->Help, NULL);\r
+\r
+ if (String == NULL) {\r
+ String = HiiGetString (HiiHandle, STRING_TOKEN (STR_MISSING_STRING), NULL);\r
+ ASSERT (String != NULL);\r
+ }\r
+ TokenHelp = HiiSetString (HiiHandle, 0, String, NULL);\r
+ FreePool (String);\r
+\r
+ FormSetGuid = ((EFI_IFR_FORM_SET *)Ptr)->Guid;\r
+\r
+ DevicePathStr = ExtractDevicePathFromHiiHandle(HiiHandles[Index]);\r
+ DevicePathId = 0;\r
+ if (DevicePathStr != NULL){\r
+ DevicePathId = HiiSetString (HiiHandle, 0, DevicePathStr, NULL);\r
+ FreePool (DevicePathStr);\r
+ }\r
+ HiiCreateGotoExOpCode (\r
+ StartOpCodeHandle,\r
+ 0,\r
+ Token,\r
+ TokenHelp,\r
+ 0,\r
+ (EFI_QUESTION_ID) (Index + FRONT_PAGE_KEY_OFFSET),\r
+ 0,\r
+ &FormSetGuid,\r
+ DevicePathId\r
+ );\r
+ break;\r
+ }\r
+ Ptr += ((EFI_IFR_OP_HEADER *) Ptr)->Length;\r
}\r
+\r
+ FreePool(Buffer);\r
+ Buffer = NULL;\r
+ TempSize = 0;\r
+ BufferSize = 0;\r
}\r
\r
- return EFI_SUCCESS;\r
+ HiiUpdateForm (\r
+ HiiHandle,\r
+ &mFrontPageGuid,\r
+ FRONT_PAGE_FORM_ID,\r
+ StartOpCodeHandle,\r
+ EndOpCodeHandle\r
+ );\r
+\r
+ HiiFreeOpCodeHandle (StartOpCodeHandle);\r
+ HiiFreeOpCodeHandle (EndOpCodeHandle);\r
+ FreePool (HiiHandles);\r
}\r
\r
/**\r
)\r
{\r
EFI_STATUS Status;\r
-\r
//\r
// Locate Hii relative protocols\r
//\r
//\r
InitializeLanguage ();\r
\r
+ //\r
+ //Updata Front Page form\r
+ //\r
+ UpdateFrontPageForm();\r
+\r
return Status;\r
}\r
\r
}\r
\r
InitializeFrontPage ();\r
- InitializeDeviceManager ();\r
- InitializeBootManager ();\r
- InitBootMaintenance();\r
\r
CallFrontPage ();\r
\r
- FreeBMPackage ();\r
- FreeBootManager ();\r
- FreeDeviceManager ();\r
FreeFrontPage ();\r
\r
if (mLanguageString != NULL) {\r
{\r
EFI_STATUS Status;\r
EFI_HANDLE DriverHandle;\r
- EFI_DEVICE_PATH_PROTOCOL *DevicePath; \r
- EFI_DEVICE_PATH_TO_TEXT_PROTOCOL *PathToText;\r
- CHAR16 *NewString;\r
-\r
+ \r
ASSERT (Handle != NULL);\r
\r
if (Handle == NULL) {\r
}\r
\r
Status = gHiiDatabase->GetPackageListHandle (gHiiDatabase, Handle, &DriverHandle);\r
- if (EFI_ERROR (Status)) {\r
- return NULL;\r
- }\r
-\r
- //\r
- // Get the device path by the got Driver handle .\r
- //\r
- Status = gBS->HandleProtocol (DriverHandle, &gEfiDevicePathProtocolGuid, (VOID **) &DevicePath);\r
- if (EFI_ERROR (Status)) {\r
- return NULL;\r
- }\r
-\r
- Status = gBS->LocateProtocol (\r
- &gEfiDevicePathToTextProtocolGuid,\r
- NULL,\r
- (VOID **) &PathToText\r
- );\r
if (EFI_ERROR (Status)) {\r
return NULL;\r
}\r
\r
- //\r
- // Get device path string.\r
- //\r
- NewString = PathToText->ConvertDevicePathToText(DevicePath, FALSE, FALSE);\r
+ return ConvertDevicePathToText(DevicePathFromHandle (DriverHandle), FALSE, FALSE);\r
\r
- return NewString;\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 SkipCount Skip some formsets which has processed before.\r
- @param FormSetTitle Formset title string.\r
- @param FormSetHelp Formset help string.\r
- @param FormSetGuid Formset Guid.\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
- IN UINTN SkipCount,\r
- OUT EFI_STRING_ID *FormSetTitle,\r
- OUT EFI_STRING_ID *FormSetHelp,\r
- OUT EFI_GUID *FormSetGuid\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
- BOOLEAN FoundAndSkip;\r
-\r
- ASSERT (Handle != NULL);\r
- ASSERT (SetupClassGuid != NULL && FormSetTitle != NULL && FormSetHelp != NULL && FormSetGuid != NULL);\r
-\r
- *FormSetTitle = 0;\r
- *FormSetHelp = 0;\r
- ClassGuidNum = 0;\r
- ClassGuid = NULL;\r
- FoundAndSkip = FALSE;\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
- PackageListLength = ReadUnaligned32 (&HiiPackageList->PackageLength);\r
-\r
- while (Offset < PackageListLength) {\r
- Package = ((UINT8 *) HiiPackageList) + Offset;\r
- CopyMem (&PackageHeader, Package, sizeof (EFI_HII_PACKAGE_HEADER));\r
- Offset += PackageHeader.Length;\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
- Offset2 += ((EFI_IFR_OP_HEADER *) OpCodeData)->Length;\r
-\r
- if (((EFI_IFR_OP_HEADER *) OpCodeData)->OpCode == EFI_IFR_FORM_SET_OP) {\r
- if (((EFI_IFR_OP_HEADER *) OpCodeData)->Length > OFFSET_OF (EFI_IFR_FORM_SET, Flags)) {\r
- //\r
- // Find FormSet OpCode\r
- //\r
- ClassGuidNum = (UINT8) (((EFI_IFR_FORM_SET *) OpCodeData)->Flags & 0x3);\r
- ClassGuid = (EFI_GUID *) (VOID *)(OpCodeData + sizeof (EFI_IFR_FORM_SET));\r
- while (ClassGuidNum-- > 0) {\r
- if (CompareGuid (SetupClassGuid, ClassGuid)) {\r
- //\r
- // Check whether need to skip the formset.\r
- //\r
- if (SkipCount != 0) {\r
- SkipCount--;\r
- FoundAndSkip = TRUE;\r
- break;\r
- }\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
- CopyGuid (FormSetGuid, (CONST EFI_GUID *)(&((EFI_IFR_FORM_SET *) OpCodeData)->Guid));\r
- FreePool (HiiPackageList);\r
- return TRUE;\r
- }\r
- ClassGuid ++;\r
- }\r
- if (FoundAndSkip) {\r
- break;\r
- }\r
- } else if (CompareGuid (SetupClassGuid, &gEfiHiiPlatformSetupFormsetGuid)) {\r
- //\r
- // Check whether need to skip the formset.\r
- //\r
- if (SkipCount != 0) {\r
- SkipCount--;\r
- break;\r
- }\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
- CopyGuid (FormSetGuid, (CONST EFI_GUID *)(&((EFI_IFR_FORM_SET *) OpCodeData)->Guid));\r
- FreePool (HiiPackageList);\r
- return TRUE;\r
- }\r
- }\r
- }\r
- }\r
- }\r
-\r
- FreePool (HiiPackageList);\r
-\r
- return FALSE;\r
}\r
\r
//\r
}\r
}\r
\r
-\r
-/**\r
- This function converts an input device structure to a Unicode string.\r
-\r
- @param DevPath A pointer to the device path structure.\r
-\r
- @return A new allocated Unicode string that represents the device path.\r
-\r
-**/\r
-CHAR16 *\r
-UiDevicePathToStr (\r
- IN EFI_DEVICE_PATH_PROTOCOL *DevPath\r
- )\r
-{\r
- EFI_STATUS Status;\r
- CHAR16 *ToText;\r
- EFI_DEVICE_PATH_TO_TEXT_PROTOCOL *DevPathToText;\r
-\r
- if (DevPath == NULL) {\r
- return NULL;\r
- }\r
-\r
- Status = gBS->LocateProtocol (\r
- &gEfiDevicePathToTextProtocolGuid,\r
- NULL,\r
- (VOID **) &DevPathToText\r
- );\r
- ASSERT_EFI_ERROR (Status);\r
- ToText = DevPathToText->ConvertDevicePathToText (\r
- DevPath,\r
- FALSE,\r
- TRUE\r
- );\r
- ASSERT (ToText != NULL);\r
- return ToText;\r
-}\r