diff --git a/MdeModulePkg/Universal/SetupBrowserDxe/Presentation.c b/MdeModulePkg/Universal/SetupBrowserDxe/Presentation.c index fc8bae2317..5b8fc89de0 100644 --- a/MdeModulePkg/Universal/SetupBrowserDxe/Presentation.c +++ b/MdeModulePkg/Universal/SetupBrowserDxe/Presentation.c @@ -866,6 +866,52 @@ SetupBrowser ( return Status; } + // + // Before display the formset, invoke ConfigAccess.Callback() with EFI_BROWSER_ACTION_FORM_OPEN + // + ConfigAccess = Selection->FormSet->ConfigAccess; + if ((ConfigAccess != NULL) && (Selection->Action != UI_ACTION_REFRESH_FORMSET)) { + ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE; + mHiiPackageListUpdated = FALSE; + Status = ConfigAccess->Callback ( + ConfigAccess, + EFI_BROWSER_ACTION_FORM_OPEN, + 0, + EFI_IFR_TYPE_UNDEFINED, + NULL, + &ActionRequest + ); + + if (!EFI_ERROR (Status)) { + switch (ActionRequest) { + case EFI_BROWSER_ACTION_REQUEST_RESET: + gResetRequired = TRUE; + break; + + case EFI_BROWSER_ACTION_REQUEST_SUBMIT: + // + // Till now there is no uncommitted data, so ignore this request + // + break; + + case EFI_BROWSER_ACTION_REQUEST_EXIT: + Selection->Action = UI_ACTION_EXIT; + break; + + default: + break; + } + } + + if (mHiiPackageListUpdated) { + // + // IFR is updated during callback, force to reparse the IFR binary + // + Selection->Action = UI_ACTION_REFRESH_FORMSET; + goto Done; + } + } + // // Initialize current settings of Questions in this FormSet // @@ -944,7 +990,6 @@ SetupBrowser ( HiiValue->Value.string = NewString ((CHAR16 *) Statement->BufferValue, Selection->FormSet->HiiHandle); } - ConfigAccess = Selection->FormSet->ConfigAccess; if (ConfigAccess == NULL) { return EFI_UNSUPPORTED; } @@ -1008,6 +1053,40 @@ SetupBrowser ( } } while (Selection->Action == UI_ACTION_REFRESH_FORM); + // + // Before exit the formset, invoke ConfigAccess.Callback() with EFI_BROWSER_ACTION_FORM_CLOSE + // + if ((ConfigAccess != NULL) && (Selection->Action == UI_ACTION_EXIT)) { + ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE; + Status = ConfigAccess->Callback ( + ConfigAccess, + EFI_BROWSER_ACTION_FORM_CLOSE, + 0, + EFI_IFR_TYPE_UNDEFINED, + NULL, + &ActionRequest + ); + + if (!EFI_ERROR (Status)) { + switch (ActionRequest) { + case EFI_BROWSER_ACTION_REQUEST_RESET: + gResetRequired = TRUE; + break; + + case EFI_BROWSER_ACTION_REQUEST_SUBMIT: + SubmitForm (Selection->FormSet, Selection->Form); + break; + + case EFI_BROWSER_ACTION_REQUEST_EXIT: + gNvUpdateRequired = FALSE; + break; + + default: + break; + } + } + } + // // Record the old formset //