Find parent menu for current menu.\r
\r
@param CurrentMenu Current Menu\r
+ @param SettingLevel Whether find parent menu in Form Level or Formset level.\r
+ In form level, just find the parent menu; \r
+ In formset level, find the parent menu which has different\r
+ formset guid value.\r
\r
@retval The parent menu for current menu.\r
**/\r
FORM_ENTRY_INFO *\r
UiFindParentMenu (\r
- IN FORM_ENTRY_INFO *CurrentMenu\r
+ IN FORM_ENTRY_INFO *CurrentMenu,\r
+ IN BROWSER_SETTING_SCOPE SettingLevel\r
)\r
{\r
FORM_ENTRY_INFO *ParentMenu;\r
+ LIST_ENTRY *Link;\r
+\r
+ ASSERT (SettingLevel == FormLevel || SettingLevel == FormSetLevel);\r
\r
+ if (CurrentMenu == NULL) {\r
+ return NULL;\r
+ }\r
+ \r
ParentMenu = NULL;\r
- if (CurrentMenu->Link.BackLink != &mPrivateData.FormBrowserEx2.FormViewHistoryHead) {\r
- ParentMenu = FORM_ENTRY_INFO_FROM_LINK (CurrentMenu->Link.BackLink);\r
+ Link = &CurrentMenu->Link;\r
+\r
+ while (Link->BackLink != &mPrivateData.FormBrowserEx2.FormViewHistoryHead) {\r
+ ParentMenu = FORM_ENTRY_INFO_FROM_LINK (Link->BackLink);\r
+\r
+ if (SettingLevel == FormLevel) {\r
+ //\r
+ // For FormLevel, just find the parent menu, return.\r
+ //\r
+ break;\r
+ }\r
+\r
+ if (!CompareGuid (&CurrentMenu->FormSetGuid, &ParentMenu->FormSetGuid)) {\r
+ //\r
+ // For SystemLevel, must find the menu which has different formset.\r
+ //\r
+ break;\r
+ }\r
+\r
+ Link = Link->BackLink;\r
+ }\r
+\r
+ //\r
+ // Not find the parent menu, just return NULL.\r
+ //\r
+ if (Link->BackLink == &mPrivateData.FormBrowserEx2.FormViewHistoryHead) {\r
+ return NULL;\r
}\r
\r
return ParentMenu;\r
FormSet = AllocateZeroPool (sizeof (FORM_BROWSER_FORMSET));\r
ASSERT (FormSet != NULL);\r
\r
+ //\r
+ // Validate the HiiHandle\r
+ // if validate failed, find the first validate parent HiiHandle.\r
+ //\r
+ if (!ValidateHiiHandle(Selection->Handle)) {\r
+ FindNextMenu (Selection, FormSetLevel);\r
+ }\r
+\r
//\r
// Initialize internal data structures of FormSet\r
//\r
\r
**/\r
BOOLEAN\r
-ValidateFormSet (\r
- FORM_BROWSER_FORMSET *FormSet\r
+ValidateHiiHandle (\r
+ EFI_HII_HANDLE HiiHandle\r
)\r
{\r
EFI_HII_HANDLE *HiiHandles;\r
UINTN Index;\r
BOOLEAN Find;\r
\r
- ASSERT (FormSet != NULL);\r
+ if (HiiHandle == NULL) {\r
+ return FALSE;\r
+ }\r
+\r
Find = FALSE;\r
- //\r
- // Get all the Hii handles\r
- //\r
+\r
HiiHandles = HiiGetHiiHandles (NULL);\r
ASSERT (HiiHandles != NULL);\r
\r
- //\r
- // Search for formset of each class type\r
- //\r
for (Index = 0; HiiHandles[Index] != NULL; Index++) {\r
- if (HiiHandles[Index] == FormSet->HiiHandle) {\r
+ if (HiiHandles[Index] == HiiHandle) {\r
Find = TRUE;\r
break;\r
}\r
}\r
\r
+ FreePool (HiiHandles);\r
+\r
+ return Find;\r
+}\r
+\r
+/**\r
+ Validate the FormSet. If the formset is not validate, remove it from the list.\r
+\r
+ @param FormSet The input FormSet which need to validate.\r
+\r
+ @retval TRUE The handle is validate.\r
+ @retval FALSE The handle is invalidate.\r
+\r
+**/\r
+BOOLEAN\r
+ValidateFormSet (\r
+ FORM_BROWSER_FORMSET *FormSet\r
+ )\r
+{\r
+ BOOLEAN Find;\r
+\r
+ ASSERT (FormSet != NULL);\r
+\r
+ Find = ValidateHiiHandle(FormSet->HiiHandle);\r
if (!Find) {\r
CleanBrowserStorage(FormSet);\r
RemoveEntryList (&FormSet->Link);\r
DestroyFormSet (FormSet);\r
}\r
\r
- FreePool (HiiHandles);\r
-\r
return Find;\r
}\r
/**\r
*EndStr = '&';\r
}\r
\r
- return (*RetForm != NULL);\r
+ return (BOOLEAN) (*RetForm != NULL);\r
}\r
\r
/**\r