Refresh screen.\r
\r
**/\r
-VOID\r
+EFI_STATUS\r
RefreshForm (\r
VOID\r
)\r
{\r
- CHAR16 *OptionString;\r
- MENU_REFRESH_ENTRY *MenuRefreshEntry;\r
- UINTN Index;\r
- UINTN Loop;\r
- EFI_STATUS Status;\r
- UI_MENU_SELECTION *Selection;\r
- FORM_BROWSER_STATEMENT *Question;\r
-\r
- OptionString = NULL;\r
+ CHAR16 *OptionString;\r
+ MENU_REFRESH_ENTRY *MenuRefreshEntry;\r
+ UINTN Index;\r
+ EFI_STATUS Status;\r
+ UI_MENU_SELECTION *Selection;\r
+ FORM_BROWSER_STATEMENT *Question;\r
+ EFI_HII_CONFIG_ACCESS_PROTOCOL *ConfigAccess;\r
+ EFI_HII_VALUE *HiiValue;\r
+ EFI_BROWSER_ACTION_REQUEST ActionRequest;\r
\r
if (gMenuRefreshHead != NULL) {\r
\r
MenuRefreshEntry = gMenuRefreshHead;\r
\r
+ //\r
+ // Reset FormPackage update flag\r
+ //\r
+ mHiiPackageListUpdated = FALSE;\r
+\r
do {\r
gST->ConOut->SetAttribute (gST->ConOut, MenuRefreshEntry->CurrentAttribute);\r
\r
Selection = MenuRefreshEntry->Selection;\r
Question = MenuRefreshEntry->MenuOption->ThisTag;\r
\r
+ Status = GetQuestionValue (Selection->FormSet, Selection->Form, Question, FALSE);\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+\r
+ OptionString = NULL;\r
+ ProcessOptions (Selection, MenuRefreshEntry->MenuOption, FALSE, &OptionString);\r
+\r
+ if (OptionString != NULL) {\r
+ //\r
+ // If leading spaces on OptionString - remove the spaces\r
+ //\r
+ for (Index = 0; OptionString[Index] == L' '; Index++)\r
+ ;\r
+\r
+ PrintStringAt (MenuRefreshEntry->CurrentColumn, MenuRefreshEntry->CurrentRow, &OptionString[Index]);\r
+ gBS->FreePool (OptionString);\r
+ }\r
+\r
//\r
- // Don't update Question being edited\r
+ // Question value may be changed, need invoke its Callback()\r
//\r
- if (Question != MenuRefreshEntry->Selection->Statement) {\r
+ ConfigAccess = Selection->FormSet->ConfigAccess;\r
+ if ((Question->QuestionFlags & EFI_IFR_FLAG_CALLBACK) && (ConfigAccess != NULL)) {\r
+ ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;\r
\r
- Status = GetQuestionValue (Selection->FormSet, Selection->Form, Question, FALSE);\r
- if (EFI_ERROR (Status)) {\r
- return;\r
+ HiiValue = &Question->HiiValue;\r
+ if (HiiValue->Type == EFI_IFR_TYPE_STRING) {\r
+ //\r
+ // Create String in HII database for Configuration Driver to retrieve\r
+ //\r
+ HiiValue->Value.string = NewString ((CHAR16 *) Question->BufferValue, Selection->FormSet->HiiHandle);\r
}\r
\r
- ProcessOptions (Selection, MenuRefreshEntry->MenuOption, FALSE, &OptionString);\r
+ Status = ConfigAccess->Callback (\r
+ ConfigAccess,\r
+ EFI_BROWSER_ACTION_CHANGING,\r
+ Question->QuestionId,\r
+ HiiValue->Type,\r
+ &HiiValue->Value,\r
+ &ActionRequest\r
+ );\r
\r
- if (OptionString != NULL) {\r
+ if (HiiValue->Type == EFI_IFR_TYPE_STRING) {\r
//\r
- // If leading spaces on OptionString - remove the spaces\r
+ // Clean the String in HII Database\r
//\r
- for (Index = 0; OptionString[Index] == L' '; Index++)\r
- ;\r
+ DeleteString (HiiValue->Value.string, Selection->FormSet->HiiHandle);\r
+ }\r
\r
- for (Loop = 0; OptionString[Index] != CHAR_NULL; Index++) {\r
- OptionString[Loop] = OptionString[Index];\r
- Loop++;\r
- }\r
+ if (!EFI_ERROR (Status)) {\r
+ switch (ActionRequest) {\r
+ case EFI_BROWSER_ACTION_REQUEST_RESET:\r
+ gResetRequired = TRUE;\r
+ break;\r
\r
- OptionString[Loop] = CHAR_NULL;\r
+ case EFI_BROWSER_ACTION_REQUEST_SUBMIT:\r
+ SubmitForm (Selection->FormSet, Selection->Form);\r
+ break;\r
\r
- PrintStringAt (MenuRefreshEntry->CurrentColumn, MenuRefreshEntry->CurrentRow, OptionString);\r
- gBS->FreePool (OptionString);\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
\r
MenuRefreshEntry = MenuRefreshEntry->Next;\r
\r
} while (MenuRefreshEntry != NULL);\r
+\r
+ if (mHiiPackageListUpdated) {\r
+ //\r
+ // Package list is updated, force to reparse IFR binary of target Formset\r
+ //\r
+ mHiiPackageListUpdated = FALSE;\r
+ Selection->Action = UI_ACTION_REFRESH_FORMSET;\r
+ return EFI_SUCCESS;\r
+ }\r
}\r
+\r
+ return EFI_TIMEOUT;\r
}\r
\r
\r
if (!EFI_ERROR (Status) && Index == 1) {\r
Status = EFI_TIMEOUT;\r
if (RefreshInterval != 0) {\r
- RefreshForm ();\r
+ Status = RefreshForm ();\r
}\r
}\r
\r
Row = OriginalRow;\r
\r
gST->ConOut->SetAttribute (gST->ConOut, FIELD_TEXT | FIELD_BACKGROUND);\r
- ProcessOptions (Selection, MenuOption, FALSE, &OptionString);\r
+ Status = ProcessOptions (Selection, MenuOption, FALSE, &OptionString);\r
+ if (EFI_ERROR (Status)) {\r
+ //\r
+ // Repaint to clear possible error prompt pop-up\r
+ //\r
+ Repaint = TRUE;\r
+ NewLine = TRUE;\r
+ ControlFlag = CfRepaint;\r
+ break;\r
+ }\r
\r
if (OptionString != NULL) {\r
if (Statement->Operand == EFI_IFR_DATE_OP || Statement->Operand == EFI_IFR_TIME_OP) {\r
}\r
}\r
\r
- if (((NewPos->ForwardLink != &Menu) && (ScreenOperation == UiDown)) ||\r
- ((NewPos->BackLink != &Menu) && (ScreenOperation == UiUp)) ||\r
- (ScreenOperation == UiNoOperation)\r
- ) {\r
- UpdateKeyHelp (MenuOption, FALSE);\r
- }\r
+ UpdateKeyHelp (MenuOption, FALSE);\r
+\r
//\r
// Clear reverse attribute\r
//\r
Status = UiWaitForSingleEvent (gST->ConIn->WaitForKey, 0, MinRefreshInterval);\r
} while (Status == EFI_TIMEOUT);\r
\r
- if (Status == EFI_TIMEOUT) {\r
- Key.UnicodeChar = CHAR_CARRIAGE_RETURN;\r
- } else {\r
- Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);\r
+ if (Selection->Action == UI_ACTION_REFRESH_FORMSET) {\r
//\r
- // if we encounter error, continue to read another key in.\r
+ // IFR is updated in Callback of refresh opcode, re-parse it\r
//\r
- if (EFI_ERROR (Status)) {\r
- ControlFlag = CfReadKey;\r
- continue;\r
- }\r
+ ControlFlag = CfUiReset;\r
+ Selection->Statement = NULL;\r
+ break;\r
+ }\r
+\r
+ Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);\r
+ //\r
+ // if we encounter error, continue to read another key in.\r
+ //\r
+ if (EFI_ERROR (Status)) {\r
+ ControlFlag = CfReadKey;\r
+ break;\r
}\r
\r
if (IsListEmpty (&Menu) && Key.UnicodeChar != CHAR_NULL) {\r
gDirection = SCAN_LEFT;\r
}\r
Status = ProcessOptions (Selection, MenuOption, TRUE, &OptionString);\r
+ if (EFI_ERROR (Status)) {\r
+ //\r
+ // Repaint to clear possible error prompt pop-up\r
+ //\r
+ Repaint = TRUE;\r
+ NewLine = TRUE;\r
+ }\r
if (OptionString != NULL) {\r
FreePool (OptionString);\r
}\r
if (EFI_ERROR (Status)) {\r
Repaint = TRUE;\r
NewLine = TRUE;\r
- break;\r
- }\r
-\r
- if (OptionString != NULL) {\r
- PrintStringAt (LocalScreen.LeftColumn + gPromptBlockWidth + 1, MenuOption->Row, OptionString);\r
- gBS->FreePool (OptionString);\r
- }\r
+ UpdateKeyHelp (MenuOption, FALSE);\r
+ } else {\r
+ Selection->Action = UI_ACTION_REFRESH_FORM;\r
+ }\r
\r
- Selection->Action = UI_ACTION_REFRESH_FORM;\r
+ if (OptionString != NULL) {\r
+ FreePool (OptionString);\r
+ }\r
break;\r
}\r
break;\r