+ if (Selection->Form == NULL) {\r
+ //\r
+ // No Form to display\r
+ //\r
+ Status = EFI_NOT_FOUND;\r
+ goto Done;\r
+ }\r
+\r
+ //\r
+ // Check Form is suppressed.\r
+ //\r
+ if (Selection->Form->SuppressExpression != NULL) {\r
+ Status = EvaluateExpression (Selection->FormSet, Selection->Form, Selection->Form->SuppressExpression);\r
+ if (EFI_ERROR (Status) || (Selection->Form->SuppressExpression->Result.Type != EFI_IFR_TYPE_BOOLEAN)) {\r
+ Status = EFI_INVALID_PARAMETER;\r
+ goto Done;\r
+ }\r
+\r
+ if (Selection->Form->SuppressExpression->Result.Value.b) {\r
+ //\r
+ // Form is suppressed. \r
+ //\r
+ do {\r
+ CreateDialog (4, TRUE, 0, NULL, &Key, gEmptyString, gFormSuppress, gPressEnter, gEmptyString);\r
+ } while (Key.UnicodeChar != CHAR_CARRIAGE_RETURN);\r
+\r
+ Status = EFI_NOT_FOUND;\r
+ goto Done;\r
+ }\r
+ }\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 ((ConfigAccess != NULL) &&\r
+ ((Selection->Handle != mCurrentHiiHandle) ||\r
+ (!CompareGuid (&Selection->FormSetGuid, &mCurrentFormSetGuid)) ||\r
+ (Selection->FormId != mCurrentFormId))) {\r
+\r
+ //\r
+ // Keep current form information\r
+ //\r
+ mCurrentHiiHandle = Selection->Handle;\r
+ 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
+ }\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