**/\r
VOID\r
EFIAPI\r
-RefreshEventNotify(\r
+RefreshEventNotifyForStatement(\r
IN EFI_EVENT Event,\r
IN VOID *Context\r
)\r
gBS->SignalEvent (mValueChangedEvent);\r
}\r
\r
+/**\r
+ Refresh the questions within this form.\r
+ \r
+ @param Event The event which has this function related.\r
+ @param Context The input context info related to this event or the status code return to the caller.\r
+**/\r
+VOID\r
+EFIAPI\r
+RefreshEventNotifyForForm(\r
+ IN EFI_EVENT Event,\r
+ IN VOID *Context\r
+ )\r
+{\r
+ gCurrentSelection->Action = UI_ACTION_REFRESH_FORMSET;\r
+\r
+ gBS->SignalEvent (mValueChangedEvent);\r
+}\r
\r
/**\r
Create refresh hook event for statement which has refresh event or interval.\r
\r
**/\r
VOID\r
-CreateRefreshEvent (\r
+CreateRefreshEventForStatement (\r
IN FORM_BROWSER_STATEMENT *Statement\r
)\r
{\r
Status = gBS->CreateEventEx (\r
EVT_NOTIFY_SIGNAL,\r
TPL_CALLBACK,\r
- RefreshEventNotify,\r
+ RefreshEventNotifyForStatement,\r
Statement,\r
&Statement->RefreshGuid,\r
&RefreshEvent);\r
InsertTailList(&mRefreshEventList, &EventNode->Link);\r
}\r
\r
+/**\r
+ Create refresh hook event for form which has refresh event or interval.\r
+\r
+ @param Form The form need to check.\r
+\r
+**/\r
+VOID\r
+CreateRefreshEventForForm (\r
+ IN FORM_BROWSER_FORM *Form\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_EVENT RefreshEvent;\r
+ FORM_BROWSER_REFRESH_EVENT_NODE *EventNode;\r
+\r
+ //\r
+ // If question has refresh guid, create the notify function.\r
+ //\r
+ Status = gBS->CreateEventEx (\r
+ EVT_NOTIFY_SIGNAL,\r
+ TPL_CALLBACK,\r
+ RefreshEventNotifyForForm,\r
+ Form,\r
+ &Form->RefreshGuid,\r
+ &RefreshEvent);\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ EventNode = AllocateZeroPool (sizeof (FORM_BROWSER_REFRESH_EVENT_NODE));\r
+ ASSERT (EventNode != NULL);\r
+ EventNode->RefreshEvent = RefreshEvent;\r
+ InsertTailList(&mRefreshEventList, &EventNode->Link);\r
+}\r
+\r
/**\r
\r
Initialize the Display statement structure data.\r
// Create the refresh event process function.\r
//\r
if (!CompareGuid (&Statement->RefreshGuid, &gZeroGuid)) {\r
- CreateRefreshEvent (Statement);\r
+ CreateRefreshEventForStatement (Statement);\r
}\r
\r
//\r
InsertTailList(&gDisplayFormData.StatementListOSF, &DisplayStatement->DisplayLink);\r
}\r
\r
+ //\r
+ // treat formset as statement outside the form,get its opcode.\r
+ //\r
+ DisplayStatement = AllocateZeroPool (sizeof (FORM_DISPLAY_ENGINE_STATEMENT));\r
+ ASSERT (DisplayStatement != NULL);\r
+\r
+ DisplayStatement->Signature = FORM_DISPLAY_ENGINE_STATEMENT_SIGNATURE;\r
+ DisplayStatement->Version = FORM_DISPLAY_ENGINE_STATEMENT_VERSION_1;\r
+ DisplayStatement->OpCode = gCurrentSelection->FormSet->OpCode;\r
+\r
+ InitializeListHead (&DisplayStatement->NestStatementList);\r
+ InitializeListHead (&DisplayStatement->OptionListHead);\r
+\r
+ InsertTailList(&gDisplayFormData.StatementListOSF, &DisplayStatement->DisplayLink);\r
+\r
//\r
// Process the statement in this form.\r
//\r
InsertTailList(&mRefreshEventList, &EventNode->Link);\r
}\r
\r
+ //\r
+ // Create the refresh event process function for Form.\r
+ //\r
+ if (!CompareGuid (&gCurrentSelection->Form->RefreshGuid, &gZeroGuid)) {\r
+ CreateRefreshEventForForm (gCurrentSelection->Form);\r
+ if (gDisplayFormData.FormRefreshEvent == NULL) {\r
+ gDisplayFormData.FormRefreshEvent = mValueChangedEvent;\r
+ }\r
+ }\r
+\r
//\r
// Update hotkey list field.\r
//\r
return TRUE;\r
}\r
\r
+/**\r
+ Reconnect the controller.\r
+\r
+ @param DriverHandle The controller handle which need to be reconnect.\r
+\r
+ @retval TRUE do the reconnect behavior success.\r
+ @retval FALSE do the reconnect behavior failed.\r
+ \r
+**/\r
+BOOLEAN\r
+ReconnectController (\r
+ IN EFI_HANDLE DriverHandle\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+\r
+ Status = gBS->DisconnectController(DriverHandle, NULL, NULL);\r
+ if (!EFI_ERROR (Status)) {\r
+ Status = gBS->ConnectController(DriverHandle, NULL, NULL, TRUE);\r
+ }\r
+\r
+ return Status == EFI_SUCCESS;\r
+}\r
+\r
/**\r
Call the call back function for the question and process the return action.\r
\r
SettingLevel = FormLevel;\r
break;\r
\r
+ case EFI_BROWSER_ACTION_REQUEST_RECONNECT:\r
+ gCallbackReconnect = TRUE;\r
+ break;\r
+\r
default:\r
break;\r
}\r
//\r
Status = ValueChangedValidation (gCurrentSelection->FormSet, gCurrentSelection->Form, Statement);\r
if (!EFI_ERROR (Status)) {\r
+ //\r
+ //check whether the question value changed compared with edit buffer before updating edit buffer\r
+ // if changed, set the ValueChanged flag to TRUE,in order to trig the CHANGED callback function\r
+ //\r
+ IsQuestionValueChanged(gCurrentSelection->FormSet, gCurrentSelection->Form, Statement, GetSetValueWithEditBuffer);\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
InternalStatus = ValueChangedValidation (gCurrentSelection->FormSet, gCurrentSelection->Form, Statement);\r
if (!EFI_ERROR (InternalStatus)) {\r
+ //\r
+ //check whether the question value changed compared with edit buffer before updating edit buffer\r
+ // if changed, set the ValueChanged flag to TRUE,in order to trig the CHANGED callback function\r
+ //\r
+ IsQuestionValueChanged(gCurrentSelection->FormSet, gCurrentSelection->Form, Statement, GetSetValueWithEditBuffer);\r
SetQuestionValue(FormSet, Form, Statement, GetSetValueWithEditBuffer);\r
}\r
}\r
}\r
}\r
\r
+ if (gCallbackReconnect && (EFI_BROWSER_ACTION_CHANGED == Action)) {\r
+ //\r
+ // Confirm changes with user first.\r
+ //\r
+ if (IsNvUpdateRequiredForFormSet(FormSet)) {\r
+ if (BROWSER_ACTION_DISCARD == PopupErrorMessage(BROWSER_RECONNECT_SAVE_CHANGES, NULL, NULL, NULL)) {\r
+ gCallbackReconnect = FALSE;\r
+ DiscardFormIsRequired = TRUE;\r
+ } else {\r
+ SubmitFormIsRequired = TRUE;\r
+ }\r
+ } else {\r
+ PopupErrorMessage(BROWSER_RECONNECT_REQUIRED, NULL, NULL, NULL);\r
+ }\r
+\r
+ //\r
+ // Exit current formset before do the reconnect.\r
+ //\r
+ NeedExit = TRUE;\r
+ SettingLevel = FormSetLevel;\r
+ }\r
+\r
if (SubmitFormIsRequired && !SkipSaveOrDiscard) {\r
SubmitForm (FormSet, Form, SettingLevel);\r
}\r
}\r
}\r
\r
- //\r
- // Verify whether question value has checked, update the ValueChanged flag in Question.\r
- //\r
- IsQuestionValueChanged(gCurrentSelection->FormSet, gCurrentSelection->Form, Statement, GetSetValueWithBuffer);\r
\r
if (!EFI_ERROR (Status) && \r
(Statement->Operand != EFI_IFR_REF_OP) && \r
// Only question value has been changed, browser will trig CHANGED callback.\r
//\r
ProcessCallBackFunction(Selection, Selection->FormSet, Selection->Form, Statement, EFI_BROWSER_ACTION_CHANGED, FALSE);\r
+ //\r
+ //check whether the question value changed compared with buffer value\r
+ //if doesn't change ,set the ValueChanged flag to FALSE ,in order not to display the "configuration changed "information on the screen\r
+ //\r
+ IsQuestionValueChanged(gCurrentSelection->FormSet, gCurrentSelection->Form, Statement, GetSetValueWithBuffer);\r
}\r
} else {\r
//\r
}\r
\r
//\r
- // If question has EFI_IFR_FLAG_RESET_REQUIRED flag and without storage and process question success till here, \r
- // trig the gResetFlag.\r
+ // If question has EFI_IFR_FLAG_RESET_REQUIRED/EFI_IFR_FLAG_RECONNECT_REQUIRED flag and without storage \r
+ // and process question success till here, trig the gResetFlag/gFlagReconnect.\r
//\r
if ((Status == EFI_SUCCESS) && \r
- (Statement->Storage == NULL) && \r
- ((Statement->QuestionFlags & EFI_IFR_FLAG_RESET_REQUIRED) != 0)) {\r
- gResetRequired = TRUE;\r
+ (Statement->Storage == NULL)) { \r
+ if ((Statement->QuestionFlags & EFI_IFR_FLAG_RESET_REQUIRED) != 0) {\r
+ gResetRequired = TRUE;\r
+ }\r
+\r
+ if ((Statement->QuestionFlags & EFI_IFR_FLAG_RECONNECT_REQUIRED) != 0) {\r
+ gFlagReconnect = TRUE;\r
+ }\r
}\r
}\r
\r