]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Update the logic:
authorydong10 <ydong10@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 15 Mar 2013 01:53:03 +0000 (01:53 +0000)
committerydong10 <ydong10@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 15 Mar 2013 01:53:03 +0000 (01:53 +0000)
  Not remove the form set data, add check before browser use form set data to avoid use the useless form set data.

Signed-off-by: Eric Dong <eric.dong@intel.com>
Reviewed-by: Liming Gao <liming.gao@intel.com>
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@14206 6f19259b-4bc3-4df7-8a09-765794883524

MdeModulePkg/Universal/SetupBrowserDxe/Setup.c

index 15b943ffecea900974efe41fd7c288a105c1d226..60f96f4970743f17473f6a04307ee36b8861fd8f 100644 (file)
@@ -47,7 +47,7 @@ BOOLEAN               gResetRequired;
 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
@@ -558,66 +558,6 @@ BrowserCallback (
   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
@@ -636,7 +576,6 @@ InitializeSetup (
   )\r
 {\r
   EFI_STATUS                  Status;\r
-  EFI_HANDLE                  NotifyHandle;\r
   EFI_INPUT_KEY               DefaultHotKey;\r
   EFI_STRING                  HelpString;\r
 \r
@@ -734,19 +673,6 @@ InitializeSetup (
                   );\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
@@ -2258,6 +2184,52 @@ SendDiscardInfoToDriver (
   }\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
@@ -2365,8 +2337,11 @@ DiscardForm (
     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
@@ -2646,8 +2621,11 @@ SubmitForm (
     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
@@ -3332,8 +3310,11 @@ ExtractDefault (
     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
@@ -4224,10 +4205,13 @@ GetFormSetFromHiiHandle (
   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
@@ -4480,11 +4464,14 @@ SaveReminder (
   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