]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/SetupBrowserDxe/Presentation.c
Update HiiBlockToConfig function to follow spec.
[mirror_edk2.git] / MdeModulePkg / Universal / SetupBrowserDxe / Presentation.c
index 8dc1651950745245d6a7cd2aee8828fd4975f07d..863097d00540aa77fa7fa97c467f80be5e56380f 100644 (file)
@@ -182,10 +182,13 @@ GetStringWidth (
 /**\r
   This function displays the page frame.\r
 \r
+  @param  Selection              Selection contains the information about \r
+                                 the Selection, form and formset to be displayed.\r
+                                 Selection action may be updated in retrieve callback.\r
 **/\r
 VOID\r
 DisplayPageFrame (\r
-  VOID\r
+  IN UI_MENU_SELECTION    *Selection\r
   )\r
 {\r
   UINTN                  Index;\r
@@ -203,6 +206,10 @@ DisplayPageFrame (
   gST->ConOut->QueryMode (gST->ConOut, gST->ConOut->Mode->Mode, &LocalScreen.RightColumn, &LocalScreen.BottomRow);\r
   ClearLines (0, LocalScreen.RightColumn, 0, LocalScreen.BottomRow, KEYHELP_BACKGROUND);\r
 \r
+  if (Selection->Form->ModalForm) {\r
+    return;\r
+  }\r
+\r
   CopyMem (&LocalScreen, &gScreenDimensions, sizeof (EFI_SCREEN_DESCRIPTOR));\r
 \r
   //\r
@@ -484,7 +491,11 @@ DisplayForm (
   StringPtr = GetToken (Selection->Form->FormTitle, Handle);\r
 \r
   if ((gClassOfVfr & FORMSET_CLASS_FRONT_PAGE) != FORMSET_CLASS_FRONT_PAGE) {\r
-    gST->ConOut->SetAttribute (gST->ConOut, TITLE_TEXT | TITLE_BACKGROUND);\r
+    if (Selection->Form->ModalForm) {\r
+      gST->ConOut->SetAttribute (gST->ConOut, TITLE_TEXT | EFI_BACKGROUND_BLACK);\r
+    } else {\r
+      gST->ConOut->SetAttribute (gST->ConOut, TITLE_TEXT | TITLE_BACKGROUND);\r
+    }\r
     PrintStringAt (\r
       (LocalScreen.RightColumn + LocalScreen.LeftColumn - GetStringWidth (StringPtr) / 2) / 2,\r
       LocalScreen.TopRow + 1,\r
@@ -673,6 +684,12 @@ UpdateKeyHelp (
   EFI_SCREEN_DESCRIPTOR  LocalScreen;\r
   FORM_BROWSER_STATEMENT *Statement;\r
 \r
+  gST->ConOut->SetAttribute (gST->ConOut, KEYHELP_TEXT | KEYHELP_BACKGROUND);\r
+\r
+  if (Selection->Form->ModalForm) {\r
+    return;\r
+  }\r
+\r
   CopyMem (&LocalScreen, &gScreenDimensions, sizeof (EFI_SCREEN_DESCRIPTOR));\r
 \r
   SecCol            = LocalScreen.LeftColumn + (LocalScreen.RightColumn - LocalScreen.LeftColumn) / 3;\r
@@ -684,8 +701,6 @@ UpdateKeyHelp (
   TopRowOfHelp      = LocalScreen.BottomRow - 4;\r
   BottomRowOfHelp   = LocalScreen.BottomRow - 3;\r
 \r
-  gST->ConOut->SetAttribute (gST->ConOut, KEYHELP_TEXT | KEYHELP_BACKGROUND);\r
-\r
   Statement = MenuOption->ThisTag;\r
   switch (Statement->Operand) {\r
   case EFI_IFR_ORDERED_LIST_OP:\r
@@ -847,6 +862,337 @@ FormUpdateNotify (
   return EFI_SUCCESS;\r
 }\r
 \r
+/**\r
+  check whether the formset need to update the NV.\r
+\r
+  @param  FormSet                FormSet data structure.\r
+\r
+  @retval TRUE                   Need to update the NV.\r
+  @retval FALSE                  No need to update the NV.\r
+**/\r
+BOOLEAN \r
+IsNvUpdateRequired (\r
+  IN FORM_BROWSER_FORMSET  *FormSet\r
+  )\r
+{\r
+  LIST_ENTRY              *Link;\r
+  FORM_BROWSER_FORM       *Form;\r
+\r
+  Link = GetFirstNode (&FormSet->FormListHead);\r
+  while (!IsNull (&FormSet->FormListHead, Link)) {\r
+    Form = FORM_BROWSER_FORM_FROM_LINK (Link);\r
+\r
+    if (Form->NvUpdateRequired ) {\r
+      return TRUE;\r
+    }\r
+\r
+    Link = GetNextNode (&FormSet->FormListHead, Link);\r
+  }\r
+\r
+  return FALSE;\r
+}\r
+\r
+/**\r
+  check whether the formset need to update the NV.\r
+\r
+  @param  FormSet                FormSet data structure.\r
+  @param  SetValue               Whether set new value or clear old value.\r
+\r
+**/\r
+VOID\r
+UpdateNvInfoInForm (\r
+  IN FORM_BROWSER_FORMSET  *FormSet,\r
+  IN BOOLEAN               SetValue\r
+  )\r
+{\r
+  LIST_ENTRY              *Link;\r
+  FORM_BROWSER_FORM       *Form;\r
+  \r
+  Link = GetFirstNode (&FormSet->FormListHead);\r
+  while (!IsNull (&FormSet->FormListHead, Link)) {\r
+    Form = FORM_BROWSER_FORM_FROM_LINK (Link);\r
+\r
+    Form->NvUpdateRequired = SetValue;\r
+\r
+    Link = GetNextNode (&FormSet->FormListHead, Link);\r
+  }\r
+}\r
+/**\r
+  Find menu which will show next time.\r
+\r
+  @param Selection       On input, Selection tell setup browser the information\r
+                         about the Selection, form and formset to be displayed.\r
+                         On output, Selection return the screen item that is selected\r
+                         by user.\r
+  @param Repaint         Whether need to repaint the menu.\r
+  @param NewLine         Whether need to show at new line.\r
+  \r
+  @retval TRUE           Need return.\r
+  @retval FALSE          No need to return.\r
+**/\r
+BOOLEAN\r
+FindNextMenu (\r
+  IN OUT UI_MENU_SELECTION    *Selection,\r
+  IN     BOOLEAN              *Repaint, \r
+  IN     BOOLEAN              *NewLine  \r
+  )\r
+{\r
+  UI_MENU_LIST            *CurrentMenu;\r
+  CHAR16                  YesResponse;\r
+  CHAR16                  NoResponse;\r
+  EFI_INPUT_KEY           Key;\r
+  EFI_STATUS              Status;\r
+  \r
+  CurrentMenu = Selection->CurrentMenu;\r
+\r
+  if (CurrentMenu != NULL && CurrentMenu->Parent != NULL) {\r
+    //\r
+    // we have a parent, so go to the parent menu\r
+    //\r
+    if (CompareGuid (&CurrentMenu->FormSetGuid, &CurrentMenu->Parent->FormSetGuid)) {\r
+      //\r
+      // The parent menu and current menu are in the same formset\r
+      //\r
+      Selection->Action = UI_ACTION_REFRESH_FORM;\r
+    } else {\r
+      Selection->Action = UI_ACTION_REFRESH_FORMSET;\r
+    }\r
+    Selection->Statement = NULL;\r
+\r
+    Selection->FormId = CurrentMenu->Parent->FormId;\r
+    Selection->QuestionId = CurrentMenu->Parent->QuestionId;\r
+\r
+    //\r
+    // Clear highlight record for this menu\r
+    //\r
+    CurrentMenu->QuestionId = 0;\r
+    return FALSE;\r
+  }\r
+\r
+  if ((gClassOfVfr & FORMSET_CLASS_FRONT_PAGE) == FORMSET_CLASS_FRONT_PAGE) {\r
+    //\r
+    // We never exit FrontPage, so skip the ESC\r
+    //\r
+    Selection->Action = UI_ACTION_NONE;\r
+    return FALSE;\r
+  }\r
+\r
+  //\r
+  // We are going to leave current FormSet, so check uncommited data in this FormSet\r
+  //\r
+  if (IsNvUpdateRequired(Selection->FormSet)) {\r
+    Status      = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);\r
+\r
+    YesResponse = gYesResponse[0];\r
+    NoResponse  = gNoResponse[0];\r
+\r
+    //\r
+    // If NV flag is up, prompt user\r
+    //\r
+    do {\r
+      CreateDialog (4, TRUE, 0, NULL, &Key, gEmptyString, gSaveChanges, gAreYouSure, gEmptyString);\r
+    } while\r
+    (\r
+      (Key.ScanCode != SCAN_ESC) &&\r
+      ((Key.UnicodeChar | UPPER_LOWER_CASE_OFFSET) != (NoResponse | UPPER_LOWER_CASE_OFFSET)) &&\r
+      ((Key.UnicodeChar | UPPER_LOWER_CASE_OFFSET) != (YesResponse | UPPER_LOWER_CASE_OFFSET))\r
+    );\r
+\r
+    if (Key.ScanCode == SCAN_ESC) {\r
+      //\r
+      // User hits the ESC key\r
+      //\r
+      if (Repaint != NULL) {\r
+        *Repaint = TRUE;\r
+      }\r
+\r
+      if (NewLine != NULL) {\r
+        *NewLine = TRUE;\r
+      }\r
+\r
+      Selection->Action = UI_ACTION_NONE;\r
+      return FALSE;\r
+    }\r
+\r
+    //\r
+    // If the user hits the YesResponse key\r
+    //\r
+    if ((Key.UnicodeChar | UPPER_LOWER_CASE_OFFSET) == (YesResponse | UPPER_LOWER_CASE_OFFSET)) {\r
+      Status = SubmitForm (Selection->FormSet, Selection->Form, FALSE);\r
+    }\r
+  }\r
+\r
+  Selection->Statement = NULL;\r
+  if (CurrentMenu != NULL) {\r
+    CurrentMenu->QuestionId = 0;\r
+  }\r
+\r
+  Selection->Action = UI_ACTION_EXIT;\r
+  return TRUE;\r
+}\r
+\r
+/**\r
+  Call the call back function for the question and process the return action.\r
+\r
+  @param Selection             On input, Selection tell setup browser the information\r
+                               about the Selection, form and formset to be displayed.\r
+                               On output, Selection return the screen item that is selected\r
+                               by user.\r
+  @param Question              The Question which need to call.\r
+  @param Action                The action request.\r
+  @param SkipSaveOrDiscard     Whether skip save or discard action.\r
+\r
+  @retval EFI_SUCCESS          The call back function excutes successfully.\r
+  @return Other value if the call back function failed to excute.  \r
+**/\r
+EFI_STATUS \r
+ProcessCallBackFunction (\r
+  IN OUT UI_MENU_SELECTION               *Selection,\r
+  IN     FORM_BROWSER_STATEMENT          *Question,\r
+  IN     EFI_BROWSER_ACTION              Action,\r
+  IN     BOOLEAN                         SkipSaveOrDiscard\r
+  )\r
+{\r
+  EFI_STATUS                      Status;\r
+  EFI_BROWSER_ACTION_REQUEST      ActionRequest;\r
+  EFI_HII_CONFIG_ACCESS_PROTOCOL  *ConfigAccess;\r
+  EFI_HII_VALUE                   *HiiValue;\r
+  EFI_IFR_TYPE_VALUE              *TypeValue;\r
+  FORM_BROWSER_STATEMENT          *Statement;\r
+  BOOLEAN                         SubmitFormIsRequired;\r
+  BOOLEAN                         SingleForm;\r
+  BOOLEAN                         DiscardFormIsRequired;\r
+  BOOLEAN                         NeedExit;\r
+  LIST_ENTRY                      *Link;\r
+\r
+  ConfigAccess = Selection->FormSet->ConfigAccess;\r
+  SubmitFormIsRequired  = FALSE;\r
+  SingleForm            = FALSE;\r
+  DiscardFormIsRequired = FALSE;\r
+  NeedExit              = FALSE;\r
+  Status                = EFI_SUCCESS;\r
+  ActionRequest         = EFI_BROWSER_ACTION_REQUEST_NONE;\r
+\r
+  if (ConfigAccess == NULL) {\r
+    return EFI_SUCCESS;\r
+  }\r
+\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
+    //\r
+    // if Question != NULL, only process the question. Else, process all question in this form.\r
+    //\r
+    if ((Question != NULL) && (Statement != Question)) {\r
+      continue;\r
+    }\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
+    HiiValue = &Statement->HiiValue;\r
+    TypeValue = &HiiValue->Value;\r
+    if (HiiValue->Type == EFI_IFR_TYPE_BUFFER) {\r
+      //\r
+      // For OrderedList, passing in the value buffer to Callback()\r
+      //\r
+      TypeValue = (EFI_IFR_TYPE_VALUE *) Statement->BufferValue;\r
+    }\r
+      \r
+    ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;\r
+    Status = ConfigAccess->Callback (\r
+                             ConfigAccess,\r
+                             Action,\r
+                             Statement->QuestionId,\r
+                             HiiValue->Type,\r
+                             TypeValue,\r
+                             &ActionRequest\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
+        break;\r
+\r
+      case EFI_BROWSER_ACTION_REQUEST_FORM_SUBMIT_EXIT:\r
+        SubmitFormIsRequired  = TRUE;\r
+        SingleForm            = TRUE;\r
+        NeedExit              = TRUE;\r
+        break;\r
+\r
+      case EFI_BROWSER_ACTION_REQUEST_FORM_DISCARD_EXIT:\r
+        DiscardFormIsRequired = TRUE;\r
+        SingleForm            = TRUE;      \r
+        NeedExit              = TRUE;\r
+        break;\r
+\r
+      case EFI_BROWSER_ACTION_REQUEST_FORM_APPLY:\r
+        SubmitFormIsRequired  = TRUE;\r
+        SingleForm            = TRUE;\r
+        break;\r
+\r
+      case EFI_BROWSER_ACTION_REQUEST_FORM_DISCARD:\r
+        DiscardFormIsRequired = TRUE;\r
+        SingleForm            = TRUE;\r
+        break;\r
+\r
+      default:\r
+        break;\r
+      }\r
+\r
+      //\r
+      // According the spec, return value from call back of "changing" and \r
+      // "retrieve" should update to the question's temp buffer.\r
+      //\r
+      if (Action == EFI_BROWSER_ACTION_CHANGING || Action == EFI_BROWSER_ACTION_RETRIEVE) {\r
+        SetQuestionValue(Selection->FormSet, Selection->Form, Statement, TRUE);\r
+      }\r
+    } else if (Status == EFI_UNSUPPORTED) {\r
+      //\r
+      // If return EFI_UNSUPPORTED, also consider Hii driver suceess deal with it.\r
+      //\r
+      Status = EFI_SUCCESS;\r
+    }\r
+  }\r
+\r
+  if (SubmitFormIsRequired && !SkipSaveOrDiscard) {\r
+    SubmitForm (Selection->FormSet, Selection->Form, SingleForm);\r
+  }\r
+\r
+  if (DiscardFormIsRequired && !SkipSaveOrDiscard) {\r
+    DiscardForm (Selection->FormSet, Selection->Form, SingleForm);\r
+  }\r
+\r
+  if (NeedExit) {\r
+    FindNextMenu (Selection, NULL, NULL);\r
+  }\r
+\r
+  return Status;\r
+}\r
+\r
 /**\r
   The worker function that send the displays to the screen. On output,\r
   the selection made by user is returned.\r
@@ -867,15 +1213,11 @@ SetupBrowser (
 {\r
   EFI_STATUS                      Status;\r
   LIST_ENTRY                      *Link;\r
-  EFI_BROWSER_ACTION_REQUEST      ActionRequest;\r
   EFI_HANDLE                      NotifyHandle;\r
-  EFI_HII_VALUE                   *HiiValue;\r
-  EFI_IFR_TYPE_VALUE              *TypeValue;\r
   FORM_BROWSER_STATEMENT          *Statement;\r
   EFI_HII_CONFIG_ACCESS_PROTOCOL  *ConfigAccess;\r
   FORM_BROWSER_FORMSET            *FormSet;\r
   EFI_INPUT_KEY                   Key;\r
-  BOOLEAN                         SubmitFormIsRequired;\r
 \r
   gMenuRefreshHead = NULL;\r
   gResetRequired = FALSE;\r
@@ -974,69 +1316,11 @@ SetupBrowser (
       CopyGuid (&mCurrentFormSetGuid, &Selection->FormSetGuid);\r
       mCurrentFormId      = Selection->FormId;\r
 \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
-        } else if (Status == EFI_UNSUPPORTED) {\r
-          //\r
-          // If return EFI_UNSUPPORTED, also consider Hii driver suceess deal with it.\r
-          //\r
-          Status = EFI_SUCCESS;\r
-        }\r
-      }\r
-      if (SubmitFormIsRequired) {\r
-        SubmitForm (Selection->FormSet, Selection->Form);\r
+      Status = ProcessCallBackFunction (Selection, NULL, EFI_BROWSER_ACTION_FORM_OPEN, FALSE);\r
+      if (EFI_ERROR (Status)) {\r
+        goto Done;\r
       }\r
+\r
       //\r
       // EXIT requests to close form.\r
       //\r
@@ -1049,7 +1333,7 @@ SetupBrowser (
       if (mHiiPackageListUpdated) {\r
         Selection->Action = UI_ACTION_REFRESH_FORMSET;\r
         mHiiPackageListUpdated = FALSE;\r
-        goto Done;\r
+        break;\r
       }\r
     }\r
 \r
@@ -1073,13 +1357,13 @@ SetupBrowser (
     if (mHiiPackageListUpdated) {\r
       Selection->Action = UI_ACTION_REFRESH_FORMSET;\r
       mHiiPackageListUpdated = FALSE;\r
-      goto Done;\r
+      break;\r
     }\r
 \r
     //\r
     // Displays the Header and Footer borders\r
     //\r
-    DisplayPageFrame ();\r
+    DisplayPageFrame (Selection);\r
 \r
     //\r
     // Display form\r
@@ -1107,60 +1391,25 @@ SetupBrowser (
           ((Statement->QuestionFlags & EFI_IFR_FLAG_CALLBACK) == EFI_IFR_FLAG_CALLBACK) && \r
           (Statement->Operand != EFI_IFR_PASSWORD_OP)) {\r
 \r
-        ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;\r
-\r
-        HiiValue = &Statement->HiiValue;\r
-        TypeValue = &HiiValue->Value;\r
-        if (HiiValue->Type == EFI_IFR_TYPE_BUFFER) {\r
+        Status = ProcessCallBackFunction(Selection, Statement, EFI_BROWSER_ACTION_CHANGING, FALSE);         \r
+        if (Statement->Operand == EFI_IFR_REF_OP && Selection->Action != UI_ACTION_EXIT) {\r
           //\r
-          // For OrderedList, passing in the value buffer to Callback()\r
+          // Process dynamic update ref opcode.\r
           //\r
-          TypeValue = (EFI_IFR_TYPE_VALUE *) Statement->BufferValue;\r
-        }\r
-\r
-        Status = ConfigAccess->Callback (\r
-                                 ConfigAccess,\r
-                                 EFI_BROWSER_ACTION_CHANGING,\r
-                                 Statement->QuestionId,\r
-                                 HiiValue->Type,\r
-                                 TypeValue,\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
-            SubmitForm (Selection->FormSet, Selection->Form);\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
+          if (!EFI_ERROR (Status)) {\r
+            Status = ProcessGotoOpCode(Statement, Selection, NULL, NULL);\r
           }\r
-        } else if (Status != EFI_UNSUPPORTED) {\r
+          \r
           //\r
-          // Callback return error status other than EFI_UNSUPPORTED\r
+          // Callback return error status or status return from process goto opcode.\r
           //\r
-          if (Statement->Operand == EFI_IFR_REF_OP) {\r
+          if (EFI_ERROR (Status)) {\r
             //\r
             // Cross reference will not be taken\r
             //\r
             Selection->FormId = Selection->Form->FormId;\r
             Selection->QuestionId = 0;\r
           }\r
-        } else {\r
-          //\r
-          // If return EFI_UNSUPPORTED, also consider Hii driver suceess deal with it.\r
-          //\r
-          Status = EFI_SUCCESS;\r
         }\r
       }\r
 \r
@@ -1185,56 +1434,10 @@ SetupBrowser (
          (Selection->Handle != mCurrentHiiHandle) ||\r
          (!CompareGuid (&Selection->FormSetGuid, &mCurrentFormSetGuid)) ||\r
          (Selection->FormId != mCurrentFormId))) {\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
-        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
-        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
-        } else if (Status == EFI_UNSUPPORTED) {\r
-          //\r
-          // If return EFI_UNSUPPORTED, also consider Hii driver suceess deal with it.\r
-          //\r
-          Status = EFI_SUCCESS;\r
-        }\r
-      }\r
-      if (SubmitFormIsRequired) {\r
-        SubmitForm (Selection->FormSet, Selection->Form);\r
+      Status = ProcessCallBackFunction (Selection, NULL, EFI_BROWSER_ACTION_FORM_CLOSE, FALSE);\r
+      if (EFI_ERROR (Status)) {\r
+        goto Done;\r
       }\r
     }\r
   } while (Selection->Action == UI_ACTION_REFRESH_FORM);\r