]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Per UEFI spec, FORM_OPEN/FORM_CLOSE Callback function should be called for each quest...
authorlgao4 <lgao4@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 2 Jun 2010 02:05:47 +0000 (02:05 +0000)
committerlgao4 <lgao4@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 2 Jun 2010 02:05:47 +0000 (02:05 +0000)
Update SetupBrowser driver to call Callback function (FORM_OPEN/FORM_CLOSE) based on UEFI spec, and update all EDKII HII drivers to correctly handle FORM_OPEN and FORM_CLOSE call back.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10560 6f19259b-4bc3-4df7-8a09-765794883524

MdeModulePkg/Universal/DriverSampleDxe/DriverSample.c
MdeModulePkg/Universal/DriverSampleDxe/VfrStrings.uni
MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.c
MdeModulePkg/Universal/Network/Ip4ConfigDxe/Ip4ConfigNv.c
MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigImpl.c
MdeModulePkg/Universal/PlatformDriOverrideDxe/PlatDriOverrideDxe.c
MdeModulePkg/Universal/SetupBrowserDxe/Presentation.c
MdeModulePkg/Universal/SetupBrowserDxe/Setup.c

index e490ca45d831dd61ddd2cf2c11b12f40f21b2447..efd260512ac62405452aed2dd36d82b5a63b61e4 100644 (file)
@@ -842,61 +842,67 @@ DriverCallback (
   UINTN                           MyVarSize;\r
 \r
   if (Action == EFI_BROWSER_ACTION_FORM_OPEN) {\r
-    //\r
-    // On FORM_OPEN event, update the form on-the-fly\r
-    //\r
-    PrivateData = DRIVER_SAMPLE_PRIVATE_FROM_THIS (This);\r
-\r
-    //\r
-    // Initialize the container for dynamic opcodes\r
-    //\r
-    StartOpCodeHandle = HiiAllocateOpCodeHandle ();\r
-    ASSERT (StartOpCodeHandle != 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_UPDATE2;\r
+    if (QuestionId == 0x1234) {\r
+      //\r
+      // Sample CallBack for UEFI FORM_OPEN action:\r
+      //   Add Save action into Form 3 when Form 1 is opened.\r
+      //   This will be done only in FORM_OPEN CallBack of question with ID 0x1234 from Form 1.\r
+      //\r
+      PrivateData = DRIVER_SAMPLE_PRIVATE_FROM_THIS (This);\r
 \r
-    HiiCreateActionOpCode (\r
-      StartOpCodeHandle,                // Container for dynamic created opcodes\r
-      0x1238,                           // Question ID\r
-      STRING_TOKEN(STR_SAVE_TEXT),      // Prompt text\r
-      STRING_TOKEN(STR_SAVE_TEXT),      // Help text\r
-      EFI_IFR_FLAG_CALLBACK,            // Question flag\r
-      0                                 // Action String ID\r
-    );\r
+      //\r
+      // Initialize the container for dynamic opcodes\r
+      //\r
+      StartOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+      ASSERT (StartOpCodeHandle != NULL);\r
 \r
-    HiiUpdateForm (\r
-      PrivateData->HiiHandle[0],  // HII handle\r
-      &mFormSetGuid,              // Formset GUID\r
-      0x3,                        // Form ID\r
-      StartOpCodeHandle,          // Label for where to insert opcodes\r
-      NULL                        // Insert data\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_UPDATE2;\r
+\r
+      HiiCreateActionOpCode (\r
+        StartOpCodeHandle,                // Container for dynamic created opcodes\r
+        0x1238,                           // Question ID\r
+        STRING_TOKEN(STR_SAVE_TEXT),      // Prompt text\r
+        STRING_TOKEN(STR_SAVE_TEXT),      // Help text\r
+        EFI_IFR_FLAG_CALLBACK,            // Question flag\r
+        0                                 // Action String ID\r
       );\r
 \r
-    HiiFreeOpCodeHandle (StartOpCodeHandle);\r
+      HiiUpdateForm (\r
+        PrivateData->HiiHandle[0],  // HII handle\r
+        &mFormSetGuid,              // Formset GUID\r
+        0x3,                        // Form ID\r
+        StartOpCodeHandle,          // Label for where to insert opcodes\r
+        NULL                        // Insert data\r
+        );\r
+\r
+      HiiFreeOpCodeHandle (StartOpCodeHandle);\r
+    }\r
     return EFI_SUCCESS;\r
   }\r
 \r
   if (Action == EFI_BROWSER_ACTION_FORM_CLOSE) {\r
-    //\r
-    // On FORM_CLOSE event, show up a pop-up\r
-    //\r
-    do {\r
-      CreatePopUp (\r
-        EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
-        &Key,\r
-        L"",\r
-        L"You are going to leave the Form!",\r
-        L"Press ESC or ENTER to continue ...",\r
-        L"",\r
-        NULL\r
-        );\r
-    } while ((Key.ScanCode != SCAN_ESC) && (Key.UnicodeChar != CHAR_CARRIAGE_RETURN));\r
-\r
+    if (QuestionId == 0x5678) {\r
+      //\r
+      // Sample CallBack for UEFI FORM_CLOSE action:\r
+      //   Show up a pop-up to specify Form 3 will be closed when exit Form 3.\r
+      //\r
+      do {\r
+        CreatePopUp (\r
+          EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
+          &Key,\r
+          L"",\r
+          L"You are going to leave third Form!",\r
+          L"Press ESC or ENTER to continue ...",\r
+          L"",\r
+          NULL\r
+          );\r
+      } while ((Key.ScanCode != SCAN_ESC) && (Key.UnicodeChar != CHAR_CARRIAGE_RETURN));\r
+    }\r
     return EFI_SUCCESS;\r
   }\r
 \r
@@ -1028,6 +1034,37 @@ DriverCallback (
       NULL                                       // Default Opcode is NULl\r
       );\r
 \r
+    HiiCreateTextOpCode (\r
+      StartOpCodeHandle,\r
+      STRING_TOKEN(STR_TEXT_SAMPLE_HELP),\r
+      STRING_TOKEN(STR_TEXT_SAMPLE_HELP),\r
+      STRING_TOKEN(STR_TEXT_SAMPLE_STRING)\r
+    );\r
+\r
+    HiiCreateDateOpCode (\r
+      StartOpCodeHandle,\r
+      0x8004,\r
+      0x0,\r
+      0x0,\r
+      STRING_TOKEN(STR_DATE_SAMPLE_HELP),\r
+      STRING_TOKEN(STR_DATE_SAMPLE_HELP),\r
+      0,\r
+      QF_DATE_STORAGE_TIME,\r
+      NULL\r
+      );\r
+\r
+    HiiCreateTimeOpCode (\r
+      StartOpCodeHandle,\r
+      0x8005,\r
+      0x0,\r
+      0x0,\r
+      STRING_TOKEN(STR_TIME_SAMPLE_HELP),\r
+      STRING_TOKEN(STR_TIME_SAMPLE_HELP),\r
+      0,\r
+      QF_TIME_STORAGE_TIME,\r
+      NULL\r
+      );\r
+\r
     HiiCreateGotoOpCode (\r
       StartOpCodeHandle,                // Container for dynamic created opcodes\r
       1,                                // Target Form ID\r
index 0fc0016082e66229a54f49d14c00d1ab1215c48e..4abcfa2cd7344297dd559f3ed9bb25cf9fcbf62f 100644 (file)
Binary files a/MdeModulePkg/Universal/DriverSampleDxe/VfrStrings.uni and b/MdeModulePkg/Universal/DriverSampleDxe/VfrStrings.uni differ
index 4eb76aca63abb58f6c2ac04dfcb4387a4e55fe25..2f9806e20a3b650a842d360abe5299d5995fc36e 100644 (file)
@@ -562,6 +562,13 @@ IScsiFormCallback (
   EFI_STATUS                Status;\r
   EFI_INPUT_KEY             Key;\r
 \r
+  if ((Action == EFI_BROWSER_ACTION_FORM_OPEN) || (Action == EFI_BROWSER_ACTION_FORM_CLOSE)) {\r
+    //\r
+    // Do nothing for UEFI OPEN/CLOSE Action\r
+    //\r
+    return EFI_SUCCESS;\r
+  }\r
+\r
   Private   = ISCSI_FORM_CALLBACK_INFO_FROM_FORM_CALLBACK (This);\r
 \r
   //\r
index d660e403ba8629a8f378e4f5f73ba1d4c308e2dc..c0d27aac78c1f6eeed8a7155d070239e25577c44 100644 (file)
@@ -670,6 +670,13 @@ Ip4FormCallback (
   EFI_STATUS                Status;\r
   EFI_INPUT_KEY             Key;\r
 \r
+  if ((Action == EFI_BROWSER_ACTION_FORM_OPEN) || (Action == EFI_BROWSER_ACTION_FORM_CLOSE)) {
+    //\r
+    // Do nothing for UEFI OPEN/CLOSE Action\r
+    //\r
+    return EFI_SUCCESS;
+  }\r
+\r
   Ip4ConfigInstance = IP4_CONFIG_INSTANCE_FROM_CONFIG_ACCESS (This);\r
 \r
   IfrFormNvData = AllocateZeroPool (sizeof (IP4_CONFIG_IFR_NVDATA));\r
index 82ffcf2215eefecc0a7b252e344867e04d8860de..57fe339129a274ea88dc880b72edec34f5c5265d 100644 (file)
@@ -237,11 +237,20 @@ VlanCallback (
   PrivateData = VLAN_CONFIG_PRIVATE_DATA_FROM_THIS (This);\r
 \r
   if (Action == EFI_BROWSER_ACTION_FORM_OPEN) {\r
+    if (QuestionId == VLAN_ADD_QUESTION_ID) {\r
+      //\r
+      // Update current VLAN list into Form when Form is opened.\r
+      // This will be done only in FORM_OPEN CallBack of question with VLAN_ADD_QUESTION_ID.\r
+      //\r
+      VlanUpdateForm (PrivateData);\r
+    }\r
+    return EFI_SUCCESS;\r
+  }\r
+\r
+  if (Action == EFI_BROWSER_ACTION_FORM_CLOSE) {\r
     //\r
-    // On FORM_OPEN event, update current VLAN list\r
+    // Do nothing for UEFI FORM_CLOSE action\r
     //\r
-    VlanUpdateForm (PrivateData);\r
-\r
     return EFI_SUCCESS;\r
   }\r
 \r
index 1e5481ef725e6311cb6018fb82692daa1ece6432..70f29998bad4a58202d8830f54a77fe6c56cad61 100644 (file)
@@ -1334,7 +1334,14 @@ PlatOverMngrCallback (
   EFI_STRING_ID                             NewStringToken;\r
   EFI_INPUT_KEY                             Key;\r
   PLAT_OVER_MNGR_DATA                       *FakeNvData;\r
-  \r
+\r
+  if ((Action == EFI_BROWSER_ACTION_FORM_OPEN) || (Action == EFI_BROWSER_ACTION_FORM_CLOSE)) {
+    //\r
+    // Do nothing for UEFI OPEN/CLOSE Action\r
+    //\r
+    return EFI_SUCCESS;
+  }\r
+\r
   Private = EFI_CALLBACK_INFO_FROM_THIS (This);\r
   FakeNvData = &Private->FakeNvData;\r
   if (!HiiGetBrowserData (&mPlatformOverridesManagerGuid, mVariableName, sizeof (PLAT_OVER_MNGR_DATA), (UINT8 *) FakeNvData)) {\r
index a89bb2f50b28029cecd252a1a8c1a70ac7a78a88..e9b4df4df9f7ba710eaf5b352f0e7b8462a717c3 100644 (file)
@@ -842,6 +842,8 @@ FormUpdateNotify (
   return EFI_SUCCESS;\r
 }\r
 \r
+BOOLEAN mFormCloseCallBack = FALSE;\r
+\r
 /**\r
   The worker function that send the displays to the screen. On output,\r
   the selection made by user is returned.\r
@@ -870,10 +872,16 @@ SetupBrowser (
   EFI_HII_CONFIG_ACCESS_PROTOCOL  *ConfigAccess;\r
   FORM_BROWSER_FORMSET            *FormSet;\r
   EFI_INPUT_KEY                   Key;\r
+  BOOLEAN                         FormOpenCallBack;\r
+  BOOLEAN                         SubmitFormIsRequired;\r
+  EFI_GUID                        CurrentFormSetGuid;\r
+  EFI_HII_HANDLE                  CurrentHiiHandle;\r
+  UINT16                          CurrentFormId;\r
 \r
   gMenuRefreshHead = NULL;\r
   gResetRequired = FALSE;\r
   FormSet = Selection->FormSet;\r
+  ConfigAccess = Selection->FormSet->ConfigAccess;\r
 \r
   //\r
   // Register notify for Form package update\r
@@ -890,53 +898,6 @@ SetupBrowser (
     return Status;\r
   }\r
 \r
-  //\r
-  // Before display the formset, invoke ConfigAccess.Callback() with EFI_BROWSER_ACTION_FORM_OPEN\r
-  //\r
-  ConfigAccess = Selection->FormSet->ConfigAccess;\r
-  if ((ConfigAccess != NULL) && (Selection->Action != UI_ACTION_REFRESH_FORMSET)) {\r
-    ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;\r
-    mHiiPackageListUpdated = FALSE;\r
-    Status = ConfigAccess->Callback (\r
-                             ConfigAccess,\r
-                             EFI_BROWSER_ACTION_FORM_OPEN,\r
-                             0,\r
-                             EFI_IFR_TYPE_UNDEFINED,\r
-                             NULL,\r
-                             &ActionRequest\r
-                             );\r
-\r
-    if (!EFI_ERROR (Status)) {\r
-      switch (ActionRequest) {\r
-      case EFI_BROWSER_ACTION_REQUEST_RESET:\r
-        gResetRequired = TRUE;\r
-        break;\r
-\r
-      case EFI_BROWSER_ACTION_REQUEST_SUBMIT:\r
-        //\r
-        // Till now there is no uncommitted data, so ignore this request\r
-        //\r
-        break;\r
-\r
-      case EFI_BROWSER_ACTION_REQUEST_EXIT:\r
-        Selection->Action = UI_ACTION_EXIT;\r
-        break;\r
-\r
-      default:\r
-        break;\r
-      }\r
-    }\r
-\r
-    if (mHiiPackageListUpdated) {\r
-      //\r
-      // IFR is updated during callback, force to reparse the IFR binary\r
-      //\r
-      mHiiPackageListUpdated = FALSE;\r
-      Selection->Action = UI_ACTION_REFRESH_FORMSET;\r
-      goto Done;\r
-    }\r
-  }\r
-\r
   //\r
   // Initialize current settings of Questions in this FormSet\r
   //\r
@@ -950,7 +911,13 @@ SetupBrowser (
     //\r
     // Initialize Selection->Form\r
     //\r
+    FormOpenCallBack = FALSE;\r
     if (Selection->FormId == 0) {\r
+      //\r
+      // First Form will open.\r
+      //\r
+      FormOpenCallBack = TRUE;\r
+\r
       //\r
       // Zero FormId indicates display the first Form in a FormSet\r
       //\r
@@ -959,6 +926,12 @@ SetupBrowser (
       Selection->Form = FORM_BROWSER_FORM_FROM_LINK (Link);\r
       Selection->FormId = Selection->Form->FormId;\r
     } else {\r
+      if (Selection->Form == NULL) {\r
+        //\r
+        // First Form will open.\r
+        //\r
+        FormOpenCallBack = TRUE;\r
+      }\r
       Selection->Form = IdToForm (Selection->FormSet, Selection->FormId);\r
     }\r
 \r
@@ -989,12 +962,100 @@ SetupBrowser (
         return EFI_NOT_FOUND;\r
       }\r
     }\r
-    \r
+\r
+    //\r
+    // Keep current form information\r
+    //\r
+    CurrentHiiHandle   = Selection->Handle;\r
+    CopyGuid (&CurrentFormSetGuid, &Selection->FormSetGuid);\r
+    CurrentFormId      = Selection->FormId;\r
+\r
     //\r
     // Reset FormPackage update flag\r
     //\r
     mHiiPackageListUpdated = FALSE;\r
 \r
+    //\r
+    // Before display new form, invoke ConfigAccess.Callback() with EFI_BROWSER_ACTION_FORM_OPEN\r
+    // for each question with callback flag.\r
+    // New form may be the first form, or the different form after another form close.\r
+    //\r
+    if ((FormOpenCallBack || mFormCloseCallBack) && (ConfigAccess != NULL)) {\r
+      mFormCloseCallBack = FALSE;\r
+      //\r
+      // Go through each statement in this form\r
+      //\r
+      SubmitFormIsRequired = FALSE;\r
+      Link = GetFirstNode (&Selection->Form->StatementListHead);\r
+      while (!IsNull (&Selection->Form->StatementListHead, Link)) {\r
+        Statement = FORM_BROWSER_STATEMENT_FROM_LINK (Link);\r
+        Link = GetNextNode (&Selection->Form->StatementListHead, Link);\r
+        \r
+        if ((Statement->QuestionFlags & EFI_IFR_FLAG_CALLBACK) != EFI_IFR_FLAG_CALLBACK) {\r
+          continue;\r
+        }\r
+\r
+        //\r
+        // Check whether Statement is disabled.\r
+        //\r
+        if (Statement->DisableExpression != NULL) {\r
+          Status = EvaluateExpression (Selection->FormSet, Selection->Form, Statement->DisableExpression);\r
+          if (!EFI_ERROR (Status) && \r
+              (Statement->DisableExpression->Result.Type == EFI_IFR_TYPE_BOOLEAN) && \r
+              (Statement->DisableExpression->Result.Value.b)) {\r
+            continue;\r
+          }\r
+        }\r
+\r
+        ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;\r
+        Status = ConfigAccess->Callback (\r
+                                 ConfigAccess,\r
+                                 EFI_BROWSER_ACTION_FORM_OPEN,\r
+                                 Statement->QuestionId,\r
+                                 EFI_IFR_TYPE_UNDEFINED,\r
+                                 NULL,\r
+                                 &ActionRequest\r
+                                 );\r
+\r
+        if (!EFI_ERROR (Status)) {\r
+          switch (ActionRequest) {\r
+          case EFI_BROWSER_ACTION_REQUEST_RESET:\r
+            gResetRequired = TRUE;\r
+            break;\r
+\r
+          case EFI_BROWSER_ACTION_REQUEST_SUBMIT:\r
+            SubmitFormIsRequired = TRUE;\r
+            break;\r
+\r
+          case EFI_BROWSER_ACTION_REQUEST_EXIT:\r
+            Selection->Action = UI_ACTION_EXIT;\r
+            gNvUpdateRequired = FALSE;\r
+            break;\r
+\r
+          default:\r
+            break;\r
+          }\r
+        }\r
+      }\r
+      if (SubmitFormIsRequired) {\r
+        SubmitForm (Selection->FormSet, Selection->Form);\r
+      }\r
+      //\r
+      // EXIT requests to close form.\r
+      //\r
+      if (Selection->Action == UI_ACTION_EXIT) {\r
+        goto Done;\r
+      }\r
+      //\r
+      // IFR is updated during callback of open form, force to reparse the IFR binary\r
+      //\r
+      if (mHiiPackageListUpdated) {\r
+        Selection->Action = UI_ACTION_REFRESH_FORMSET;\r
+        mHiiPackageListUpdated = FALSE;\r
+        goto Done;\r
+      }\r
+    }\r
+\r
     //\r
     // Load Questions' Value for display\r
     //\r
@@ -1003,6 +1064,12 @@ SetupBrowser (
       return Status;\r
     }\r
 \r
+    //\r
+    // EXIT requests to close form.\r
+    //\r
+    if (Selection->Action == UI_ACTION_EXIT) {\r
+      goto Done;\r
+    }\r
     //\r
     // IFR is updated during callback of read value, force to reparse the IFR binary\r
     //\r
@@ -1119,41 +1186,66 @@ SetupBrowser (
         Selection->Action = UI_ACTION_REFRESH_FORMSET;\r
       }\r
     }\r
-  } while (Selection->Action == UI_ACTION_REFRESH_FORM);\r
 \r
-  //\r
-  // Before exit the formset, invoke ConfigAccess.Callback() with EFI_BROWSER_ACTION_FORM_CLOSE\r
-  //\r
-  if ((ConfigAccess != NULL) && (Selection->Action == UI_ACTION_EXIT)) {\r
-    ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;\r
-    Status = ConfigAccess->Callback (\r
-                             ConfigAccess,\r
-                             EFI_BROWSER_ACTION_FORM_CLOSE,\r
-                             0,\r
-                             EFI_IFR_TYPE_UNDEFINED,\r
-                             NULL,\r
-                             &ActionRequest\r
-                             );\r
-\r
-    if (!EFI_ERROR (Status)) {\r
-      switch (ActionRequest) {\r
-      case EFI_BROWSER_ACTION_REQUEST_RESET:\r
-        gResetRequired = TRUE;\r
-        break;\r
+    //\r
+    // Before exit the form, invoke ConfigAccess.Callback() with EFI_BROWSER_ACTION_FORM_CLOSE\r
+    // for each question with callback flag.\r
+    //\r
+    mFormCloseCallBack = FALSE;\r
+    if ((ConfigAccess != NULL) && \r
+        ((Selection->Action == UI_ACTION_EXIT) || \r
+         (Selection->Handle != CurrentHiiHandle) ||\r
+         (!CompareGuid (&CurrentFormSetGuid, &Selection->FormSetGuid)) ||\r
+         (Selection->FormId != CurrentFormId))) {\r
+      //\r
+      // Go through each statement in this form\r
+      //\r
+      mFormCloseCallBack   = TRUE;\r
+      SubmitFormIsRequired = FALSE;\r
+      Link = GetFirstNode (&Selection->Form->StatementListHead);\r
+      while (!IsNull (&Selection->Form->StatementListHead, Link)) {\r
+        Statement = FORM_BROWSER_STATEMENT_FROM_LINK (Link);\r
+        Link = GetNextNode (&Selection->Form->StatementListHead, Link);\r
+        \r
+        if ((Statement->QuestionFlags & EFI_IFR_FLAG_CALLBACK) != EFI_IFR_FLAG_CALLBACK) {\r
+          continue;\r
+        }\r
 \r
-      case EFI_BROWSER_ACTION_REQUEST_SUBMIT:\r
-        SubmitForm (Selection->FormSet, Selection->Form);\r
-        break;\r
+        ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;\r
+        Status = ConfigAccess->Callback (\r
+                                 ConfigAccess,\r
+                                 EFI_BROWSER_ACTION_FORM_CLOSE,\r
+                                 Statement->QuestionId,\r
+                                 EFI_IFR_TYPE_UNDEFINED,\r
+                                 NULL,\r
+                                 &ActionRequest\r
+                                 );\r
 \r
-      case EFI_BROWSER_ACTION_REQUEST_EXIT:\r
-        gNvUpdateRequired = FALSE;\r
-        break;\r
+        if (!EFI_ERROR (Status)) {\r
+          switch (ActionRequest) {\r
+          case EFI_BROWSER_ACTION_REQUEST_RESET:\r
+            gResetRequired = TRUE;\r
+            break;\r
 \r
-      default:\r
-        break;\r
+          case EFI_BROWSER_ACTION_REQUEST_SUBMIT:\r
+            SubmitFormIsRequired = TRUE;\r
+            break;\r
+\r
+          case EFI_BROWSER_ACTION_REQUEST_EXIT:\r
+            Selection->Action = UI_ACTION_EXIT;\r
+            gNvUpdateRequired = FALSE;\r
+            break;\r
+\r
+          default:\r
+            break;\r
+          }\r
+        }\r
+      }\r
+      if (SubmitFormIsRequired) {\r
+        SubmitForm (Selection->FormSet, Selection->Form);\r
       }\r
     }\r
-  }\r
+  } while (Selection->Action == UI_ACTION_REFRESH_FORM);\r
 \r
   //\r
   // Record the old formset\r
index d25bcdf86f703b0c99496b62c6237f99399b7589..e06228d4aa7f020b11b932943d44143baf654fde 100644 (file)
@@ -1679,10 +1679,9 @@ ValidateQuestion (
 \r
 \r
 /**\r
-  Perform NoSubmit check for a Form.\r
+  Perform NoSubmit check for each Form in FormSet.\r
 \r
   @param  FormSet                FormSet data structure.\r
-  @param  Form                   Form data structure.\r
 \r
   @retval EFI_SUCCESS            Form validation pass.\r
   @retval other                  Form validation failed.\r
@@ -1690,24 +1689,32 @@ ValidateQuestion (
 **/\r
 EFI_STATUS\r
 NoSubmitCheck (\r
-  IN  FORM_BROWSER_FORMSET            *FormSet,\r
-  IN  FORM_BROWSER_FORM               *Form\r
+  IN  FORM_BROWSER_FORMSET            *FormSet\r
   )\r
 {\r
   EFI_STATUS              Status;\r
   LIST_ENTRY              *Link;\r
   FORM_BROWSER_STATEMENT  *Question;\r
+  FORM_BROWSER_FORM       *Form;\r
+  LIST_ENTRY              *LinkForm;\r
 \r
-  Link = GetFirstNode (&Form->StatementListHead);\r
-  while (!IsNull (&Form->StatementListHead, Link)) {\r
-    Question = FORM_BROWSER_STATEMENT_FROM_LINK (Link);\r
+  LinkForm = GetFirstNode (&FormSet->FormListHead);\r
+  while (!IsNull (&FormSet->FormListHead, LinkForm)) {\r
+    Form = FORM_BROWSER_FORM_FROM_LINK (LinkForm);\r
 \r
-    Status = ValidateQuestion (FormSet, Form, Question, EFI_HII_EXPRESSION_NO_SUBMIT_IF);\r
-    if (EFI_ERROR (Status)) {\r
-      return Status;\r
+    Link = GetFirstNode (&Form->StatementListHead);\r
+    while (!IsNull (&Form->StatementListHead, Link)) {\r
+      Question = FORM_BROWSER_STATEMENT_FROM_LINK (Link);\r
+\r
+      Status = ValidateQuestion (FormSet, Form, Question, EFI_HII_EXPRESSION_NO_SUBMIT_IF);\r
+      if (EFI_ERROR (Status)) {\r
+        return Status;\r
+      }\r
+\r
+      Link = GetNextNode (&Form->StatementListHead, Link);\r
     }\r
 \r
-    Link = GetNextNode (&Form->StatementListHead, Link);\r
+    LinkForm = GetNextNode (&FormSet->FormListHead, LinkForm);\r
   }\r
 \r
   return EFI_SUCCESS;\r
@@ -1738,7 +1745,7 @@ SubmitForm (
   //\r
   // Validate the Form by NoSubmit check\r
   //\r
-  Status = NoSubmitCheck (FormSet, Form);\r
+  Status = NoSubmitCheck (FormSet);\r
   if (EFI_ERROR (Status)) {\r
     return Status;\r
   }\r