\r
\r
/**\r
- Reset Questions to their default value in a Form, Formset or System.\r
+ Reset Questions to their initial value or default value in a Form, Formset or System.\r
\r
GetDefaultValueScope parameter decides which questions will reset \r
to its default value.\r
@param SettingScope Setting Scope for Default action.\r
@param GetDefaultValueScope Get default value scope.\r
@param Storage Get default value only for this storage.\r
+ @param RetrieveValueFirst Whether call the retrieve call back to\r
+ get the initial value before get default\r
+ value.\r
\r
@retval EFI_SUCCESS The function completed successfully.\r
@retval EFI_UNSUPPORTED Unsupport SettingScope.\r
IN UINT16 DefaultId,\r
IN BROWSER_SETTING_SCOPE SettingScope,\r
IN BROWSER_GET_DEFAULT_VALUE GetDefaultValueScope,\r
- IN FORMSET_STORAGE *Storage OPTIONAL\r
+ IN FORMSET_STORAGE *Storage OPTIONAL,\r
+ IN BOOLEAN RetrieveValueFirst\r
)\r
{\r
EFI_STATUS Status;\r
UINTN Index;\r
EFI_GUID ZeroGuid;\r
\r
+ Status = EFI_SUCCESS;\r
+\r
//\r
// Check the supported setting level.\r
//\r
continue;\r
}\r
}\r
- \r
+\r
+ if (RetrieveValueFirst) {\r
+ //\r
+ // Call the Retrieve call back to get the initial question value.\r
+ //\r
+ Status = ProcessRetrieveForQuestion(FormSet->ConfigAccess, Question);\r
+ }\r
+\r
//\r
- // Reset Question to its default value\r
+ // If not request to get the initial value or get initial value fail, then get default value.\r
//\r
- Status = GetQuestionDefault (FormSet, Form, Question, DefaultId);\r
- if (EFI_ERROR (Status)) {\r
- continue;\r
+ if (!RetrieveValueFirst || EFI_ERROR (Status)) {\r
+ Status = GetQuestionDefault (FormSet, Form, Question, DefaultId);\r
+ if (EFI_ERROR (Status)) {\r
+ continue;\r
+ }\r
}\r
- \r
+\r
//\r
// Synchronize Buffer storage's Edit buffer\r
//\r
FormLink = GetFirstNode (&FormSet->FormListHead);\r
while (!IsNull (&FormSet->FormListHead, FormLink)) {\r
Form = FORM_BROWSER_FORM_FROM_LINK (FormLink);\r
- ExtractDefault (FormSet, Form, DefaultId, FormLevel, GetDefaultValueScope, Storage);\r
+ ExtractDefault (FormSet, Form, DefaultId, FormLevel, GetDefaultValueScope, Storage, RetrieveValueFirst);\r
FormLink = GetNextNode (&FormSet->FormListHead, FormLink);\r
}\r
} else if (SettingScope == SystemLevel) {\r
Link = GetFirstNode (&gBrowserFormSetList);\r
while (!IsNull (&gBrowserFormSetList, Link)) {\r
LocalFormSet = FORM_BROWSER_FORMSET_FROM_LINK (Link);\r
- ExtractDefault (LocalFormSet, NULL, DefaultId, FormSetLevel, GetDefaultValueScope, Storage);\r
+ ExtractDefault (LocalFormSet, NULL, DefaultId, FormSetLevel, GetDefaultValueScope, Storage, RetrieveValueFirst);\r
Link = GetNextNode (&gBrowserFormSetList, Link);\r
}\r
}\r
}\r
\r
//\r
- // According the spec, ref opcode try to get value from call back with "retrieve" type.\r
- //\r
- if ((Question->Operand == EFI_IFR_REF_OP) && (FormSet->ConfigAccess != NULL) && (Selection != NULL)) {\r
- Status = ProcessCallBackFunction(Selection, Question, EFI_BROWSER_ACTION_RETRIEVE, TRUE);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
- }\r
-\r
- //\r
- // Check whether EfiVarstore with CallBack can be got.\r
+ // Call the Retrieve call back function for all questions.\r
//\r
- if ((FormSet->ConfigAccess != NULL) &&\r
- (Selection != NULL) &&\r
- (Selection->Action != UI_ACTION_REFRESH_FORMSET) &&\r
- (Question->QuestionId != 0) && \r
- (Question->Storage != NULL) &&\r
- (Question->Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE) && \r
+ if ((FormSet->ConfigAccess != NULL) && (Selection != NULL) &&\r
((Question->QuestionFlags & EFI_IFR_FLAG_CALLBACK) == EFI_IFR_FLAG_CALLBACK)) {\r
-\r
//\r
// Check QuestionValue does exist.\r
//\r
} else {\r
BufferValue = (UINT8 *) &Question->HiiValue.Value;\r
}\r
- Status = gRT->GetVariable (\r
- Question->VariableName,\r
- &Question->Storage->Guid,\r
- NULL,\r
- &StorageWidth,\r
- BufferValue\r
- );\r
\r
- if (!EFI_ERROR (Status)) {\r
- Status = ProcessCallBackFunction(Selection, Question, EFI_BROWSER_ACTION_RETRIEVE, TRUE);\r
+ //\r
+ // For efivarstore storage, initial question value first.\r
+ //\r
+ if ((Question->Storage != NULL) && (Question->Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE)) {\r
+ Status = gRT->GetVariable (\r
+ Question->VariableName,\r
+ &Question->Storage->Guid,\r
+ NULL,\r
+ &StorageWidth,\r
+ BufferValue\r
+ );\r
}\r
+\r
+ Status = ProcessCallBackFunction(Selection, Question, EFI_BROWSER_ACTION_RETRIEVE, TRUE);\r
}\r
\r
Link = GetNextNode (&Form->StatementListHead, Link);\r
return EFI_SUCCESS;\r
}\r
\r
+/**\r
+ Get old question value from the saved formset.\r
+\r
+ @param Statement The question which need to get old question value.\r
+ @param OldFormSet FormSet data structure saved in the list.\r
+\r
+**/\r
+VOID \r
+GetOldQuestionValue (\r
+ IN OUT FORM_BROWSER_STATEMENT *Statement,\r
+ IN FORM_BROWSER_FORMSET *OldFormSet\r
+ )\r
+{\r
+ LIST_ENTRY *FormLink;\r
+ LIST_ENTRY *Link;\r
+ FORM_BROWSER_STATEMENT *Question;\r
+ FORM_BROWSER_FORM *Form;\r
+\r
+ FormLink = GetFirstNode (&OldFormSet->FormListHead);\r
+ while (!IsNull (&OldFormSet->FormListHead, FormLink)) {\r
+ Form = FORM_BROWSER_FORM_FROM_LINK (FormLink);\r
+ FormLink = GetNextNode (&OldFormSet->FormListHead, FormLink);\r
+\r
+ Link = GetFirstNode (&Form->StatementListHead);\r
+ while (!IsNull (&Form->StatementListHead, Link)) {\r
+ Question = FORM_BROWSER_STATEMENT_FROM_LINK (Link);\r
+ Link = GetNextNode (&Form->StatementListHead, Link);\r
+\r
+ if (Question->QuestionId != Statement->QuestionId) {\r
+ continue;\r
+ }\r
+\r
+ CopyMem (&Statement->HiiValue, &Question->HiiValue, sizeof (EFI_HII_VALUE));\r
+ return;\r
+ }\r
+ }\r
+}\r
+\r
+/**\r
+ Get old question value from the saved formset, all these questions not have\r
+ storage.\r
+\r
+ @param FormSet FormSet data structure which is used now.\r
+ @param OldFormSet FormSet data structure saved in the list.\r
+\r
+**/\r
+VOID\r
+CopyOldValueForNoStorageQst (\r
+ IN OUT FORM_BROWSER_FORMSET *FormSet,\r
+ IN FORM_BROWSER_FORMSET *OldFormSet\r
+ )\r
+{\r
+ LIST_ENTRY *FormLink;\r
+ LIST_ENTRY *Link;\r
+ FORM_BROWSER_STATEMENT *Question;\r
+ FORM_BROWSER_FORM *Form;\r
+\r
+ FormLink = GetFirstNode (&FormSet->FormListHead);\r
+ while (!IsNull (&FormSet->FormListHead, FormLink)) {\r
+ Form = FORM_BROWSER_FORM_FROM_LINK (FormLink);\r
+ FormLink = GetNextNode (&FormSet->FormListHead, FormLink);\r
+\r
+ Link = GetFirstNode (&Form->StatementListHead);\r
+ while (!IsNull (&Form->StatementListHead, Link)) {\r
+ Question = FORM_BROWSER_STATEMENT_FROM_LINK (Link);\r
+ Link = GetNextNode (&Form->StatementListHead, Link);\r
+\r
+ if (Question->Storage == NULL) {\r
+ GetOldQuestionValue (Question, OldFormSet);\r
+ }\r
+ }\r
+ }\r
+}\r
\r
/**\r
Get current setting of Questions.\r
FORM_BROWSER_FORM *Form2;\r
EFI_STATUS Status;\r
\r
- //\r
- // Extract default from IFR binary for no storage questions.\r
- //\r
- ExtractDefault (FormSet, NULL, EFI_HII_DEFAULT_CLASS_STANDARD, FormSetLevel, GetDefaultForNoStorage, NULL);\r
-\r
//\r
// Request current settings from Configuration Driver\r
//\r
//\r
// If get last time changed value failed, extract default from IFR binary\r
//\r
- ExtractDefault (FormSet, NULL, EFI_HII_DEFAULT_CLASS_STANDARD, FormSetLevel, GetDefaultForStorage, Storage);\r
+ ExtractDefault (FormSet, NULL, EFI_HII_DEFAULT_CLASS_STANDARD, FormSetLevel, GetDefaultForStorage, Storage, TRUE);\r
//\r
// ExtractDefault will set the NV flag to TRUE, so need this function to clean the flag\r
// in current situation.\r
// If has old formset, get the old nv update status.\r
//\r
if (gOldFormSet != NULL) {\r
- Link = GetFirstNode (&FormSet->FormListHead);\r
- while (!IsNull (&FormSet->FormListHead, Link)) {\r
- Form = FORM_BROWSER_FORM_FROM_LINK (Link);\r
+ //\r
+ // Restore question value for questions without storage.\r
+ //\r
+ CopyOldValueForNoStorageQst (FormSet, gOldFormSet);\r
\r
- Link2 = GetFirstNode (&gOldFormSet->FormListHead);\r
- while (!IsNull (&gOldFormSet->FormListHead, Link2)) {\r
- Form2 = FORM_BROWSER_FORM_FROM_LINK (Link2);\r
+ Link = GetFirstNode (&FormSet->FormListHead);\r
+ while (!IsNull (&FormSet->FormListHead, Link)) {\r
+ Form = FORM_BROWSER_FORM_FROM_LINK (Link);\r
\r
- if (Form->FormId == Form2->FormId) {\r
- Form->NvUpdateRequired = Form2->NvUpdateRequired;\r
- break;\r
- }\r
+ Link2 = GetFirstNode (&gOldFormSet->FormListHead);\r
+ while (!IsNull (&gOldFormSet->FormListHead, Link2)) {\r
+ Form2 = FORM_BROWSER_FORM_FROM_LINK (Link2);\r
\r
- Link2 = GetNextNode (&gOldFormSet->FormListHead, Link2);\r
+ if (Form->FormId == Form2->FormId) {\r
+ Form->NvUpdateRequired = Form2->NvUpdateRequired;\r
+ break;\r
}\r
- Link = GetNextNode (&FormSet->FormListHead, Link);\r
+\r
+ Link2 = GetNextNode (&gOldFormSet->FormListHead, Link2);\r
}\r
+ Link = GetNextNode (&FormSet->FormListHead, Link);\r
+ }\r
+ } else {\r
+ //\r
+ // Extract default from IFR binary for no storage questions.\r
+ // \r
+ ExtractDefault (FormSet, NULL, EFI_HII_DEFAULT_CLASS_STANDARD, FormSetLevel, GetDefaultForNoStorage, NULL, TRUE);\r
}\r
\r
return EFI_SUCCESS;\r