EFI_HII_HANDLE gHiiHandle;\r
UINT16 gDirection;\r
EFI_SCREEN_DESCRIPTOR gScreenDimensions;\r
-BROWSER_SETTING_SCOPE gBrowserSettingScope = FormSetLevel;\r
+BROWSER_SETTING_SCOPE gBrowserSettingScope = SystemLevel;\r
BOOLEAN mBrowserScopeFirstSet = TRUE;\r
EXIT_HANDLER ExitHandlerFunction = NULL;\r
UINTN gFooterHeight;\r
return EFI_SUCCESS;\r
}\r
\r
-/**\r
- Notify function will remove the formset in the maintain list \r
- once this formset is removed.\r
- \r
- Functions which are registered to receive notification of\r
- database events have this prototype. The actual event is encoded\r
- in NotifyType. The following table describes how PackageType,\r
- PackageGuid, Handle, and Package are used for each of the\r
- notification types.\r
-\r
- @param PackageType Package type of the notification.\r
-\r
- @param PackageGuid If PackageType is\r
- EFI_HII_PACKAGE_TYPE_GUID, then this is\r
- the pointer to the GUID from the Guid\r
- field of EFI_HII_PACKAGE_GUID_HEADER.\r
- Otherwise, it must be NULL.\r
-\r
- @param Package Points to the package referred to by the\r
- notification Handle The handle of the package\r
- list which contains the specified package.\r
-\r
- @param Handle The HII handle.\r
-\r
- @param NotifyType The type of change concerning the\r
- database. See\r
- EFI_HII_DATABASE_NOTIFY_TYPE.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-FormsetRemoveNotify (\r
- IN UINT8 PackageType,\r
- IN CONST EFI_GUID *PackageGuid,\r
- IN CONST EFI_HII_PACKAGE_HEADER *Package,\r
- IN EFI_HII_HANDLE Handle,\r
- IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType\r
- )\r
-{\r
- FORM_BROWSER_FORMSET *FormSet;\r
-\r
- //\r
- // Ignore the update for current using formset, which is handled by another notify function.\r
- //\r
- if (IsHiiHandleInBrowserContext (Handle)) {\r
- return EFI_SUCCESS;\r
- }\r
- \r
- //\r
- // Remove the backup FormSet data when the Form Package is removed.\r
- //\r
- FormSet = GetFormSetFromHiiHandle (Handle);\r
- if (FormSet != NULL) {\r
- RemoveEntryList (&FormSet->Link);\r
- DestroyFormSet (FormSet);\r
- }\r
- \r
- return EFI_SUCCESS;\r
-}\r
-\r
/**\r
Initialize Setup Browser driver.\r
\r
)\r
{\r
EFI_STATUS Status;\r
- EFI_HANDLE NotifyHandle;\r
EFI_INPUT_KEY DefaultHotKey;\r
EFI_STRING HelpString;\r
\r
);\r
ASSERT_EFI_ERROR (Status);\r
\r
- //\r
- // Register notify for Form package remove\r
- //\r
- Status = mHiiDatabase->RegisterPackageNotify (\r
- mHiiDatabase,\r
- EFI_HII_PACKAGE_FORMS,\r
- NULL,\r
- FormsetRemoveNotify,\r
- EFI_HII_DATABASE_NOTIFY_REMOVE_PACK,\r
- &NotifyHandle\r
- );\r
- ASSERT_EFI_ERROR (Status);\r
-\r
return Status;\r
}\r
\r
}\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
+ EFI_HII_HANDLE *HiiHandles;\r
+ UINTN Index;\r
+ BOOLEAN Find;\r
+\r
+ ASSERT (FormSet != NULL);\r
+ Find = FALSE;\r
+ //\r
+ // Get all the Hii handles\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
+ Find = TRUE;\r
+ break;\r
+ }\r
+ }\r
+\r
+ if (!Find) {\r
+ RemoveEntryList (&FormSet->Link);\r
+ DestroyFormSet (FormSet);\r
+ }\r
+\r
+ FreePool (HiiHandles);\r
+\r
+ return Find;\r
+}\r
+\r
/**\r
Discard data based on the input setting scope (Form, FormSet or System).\r
\r
Link = GetFirstNode (&gBrowserFormSetList);\r
while (!IsNull (&gBrowserFormSetList, Link)) {\r
LocalFormSet = FORM_BROWSER_FORMSET_FROM_LINK (Link);\r
- DiscardForm (LocalFormSet, NULL, FormSetLevel);\r
Link = GetNextNode (&gBrowserFormSetList, Link);\r
+ if (!ValidateFormSet(LocalFormSet)) {\r
+ continue;\r
+ }\r
+ DiscardForm (LocalFormSet, NULL, FormSetLevel);\r
if (!IsHiiHandleInBrowserContext (LocalFormSet->HiiHandle)) {\r
//\r
// Remove maintain backup list after discard except for the current using FormSet.\r
Link = GetFirstNode (&gBrowserFormSetList);\r
while (!IsNull (&gBrowserFormSetList, Link)) {\r
LocalFormSet = FORM_BROWSER_FORMSET_FROM_LINK (Link);\r
- SubmitForm (LocalFormSet, NULL, FormSetLevel);\r
Link = GetNextNode (&gBrowserFormSetList, Link);\r
+ if (!ValidateFormSet(LocalFormSet)) {\r
+ continue;\r
+ }\r
+ SubmitForm (LocalFormSet, NULL, FormSetLevel);\r
if (!IsHiiHandleInBrowserContext (LocalFormSet->HiiHandle)) {\r
//\r
// Remove maintain backup list after save except for the current using FormSet.\r
Link = GetFirstNode (&gBrowserFormSetList);\r
while (!IsNull (&gBrowserFormSetList, Link)) {\r
LocalFormSet = FORM_BROWSER_FORMSET_FROM_LINK (Link);\r
- ExtractDefault (LocalFormSet, NULL, DefaultId, FormSetLevel, GetDefaultValueScope, Storage, RetrieveValueFirst);\r
Link = GetNextNode (&gBrowserFormSetList, Link);\r
+ if (!ValidateFormSet(LocalFormSet)) {\r
+ continue;\r
+ }\r
+ ExtractDefault (LocalFormSet, NULL, DefaultId, FormSetLevel, GetDefaultValueScope, Storage, RetrieveValueFirst);\r
}\r
}\r
\r
Link = GetFirstNode (&gBrowserFormSetList);\r
while (!IsNull (&gBrowserFormSetList, Link)) {\r
FormSet = FORM_BROWSER_FORMSET_FROM_LINK (Link);\r
+ Link = GetNextNode (&gBrowserFormSetList, Link);\r
+ if (!ValidateFormSet(FormSet)) {\r
+ continue;\r
+ }\r
if (FormSet->HiiHandle == Handle) {\r
return FormSet;\r
}\r
- Link = GetNextNode (&gBrowserFormSetList, Link);\r
}\r
\r
return NULL;\r
Link = GetFirstNode (&gBrowserFormSetList);\r
while (!IsNull (&gBrowserFormSetList, Link)) {\r
FormSet = FORM_BROWSER_FORMSET_FROM_LINK (Link);\r
+ Link = GetNextNode (&gBrowserFormSetList, Link);\r
+ if (!ValidateFormSet(FormSet)) {\r
+ continue;\r
+ }\r
if (IsNvUpdateRequired (FormSet)) {\r
IsDataChanged = TRUE;\r
break;\r
}\r
- Link = GetNextNode (&gBrowserFormSetList, Link);\r
}\r
\r
//\r