Patch includes:

1.Enable Retrieve callback type for all questions before show these questions.
2.Enable retrieve callback type for all questions without storage when initial these questions.

Signed-off-by: Eric Dong <eric.dong@intel.com>
Reviewed-by: Liming Gao <liming.gao@intel.com>

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13655 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
ydong10 2012-08-21 08:23:20 +00:00
parent 09c990aeb1
commit 9776099ffa
4 changed files with 215 additions and 61 deletions

View File

@ -1322,6 +1322,57 @@ ProcessCallBackFunction (
return Status; return Status;
} }
/**
Call the retrieve type call back function for one question to get the initialize data.
This function only used when in the initialize stage, because in this stage, the
Selection->Form is not ready. For other case, use the ProcessCallBackFunction instead.
@param ConfigAccess The config access protocol produced by the hii driver.
@param Statement The Question which need to call.
@retval EFI_SUCCESS The call back function excutes successfully.
@return Other value if the call back function failed to excute.
**/
EFI_STATUS
ProcessRetrieveForQuestion (
IN EFI_HII_CONFIG_ACCESS_PROTOCOL *ConfigAccess,
IN FORM_BROWSER_STATEMENT *Statement
)
{
EFI_STATUS Status;
EFI_BROWSER_ACTION_REQUEST ActionRequest;
EFI_HII_VALUE *HiiValue;
EFI_IFR_TYPE_VALUE *TypeValue;
Status = EFI_SUCCESS;
ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;
if ((Statement->QuestionFlags & EFI_IFR_FLAG_CALLBACK) != EFI_IFR_FLAG_CALLBACK) {
return EFI_UNSUPPORTED;
}
HiiValue = &Statement->HiiValue;
TypeValue = &HiiValue->Value;
if (HiiValue->Type == EFI_IFR_TYPE_BUFFER) {
//
// For OrderedList, passing in the value buffer to Callback()
//
TypeValue = (EFI_IFR_TYPE_VALUE *) Statement->BufferValue;
}
ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;
Status = ConfigAccess->Callback (
ConfigAccess,
EFI_BROWSER_ACTION_RETRIEVE,
Statement->QuestionId,
HiiValue->Type,
TypeValue,
&ActionRequest
);
return Status;
}
/** /**
The worker function that send the displays to the screen. On output, The worker function that send the displays to the screen. On output,
the selection made by user is returned. the selection made by user is returned.

View File

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

View File

@ -1081,7 +1081,7 @@ InitializeFormSet (
); );
/** /**
Reset Questions to their default value in a Form, Formset or System. Reset Questions to their initial value or default value in a Form, Formset or System.
GetDefaultValueScope parameter decides which questions will reset GetDefaultValueScope parameter decides which questions will reset
to its default value. to its default value.
@ -1092,6 +1092,9 @@ InitializeFormSet (
@param SettingScope Setting Scope for Default action. @param SettingScope Setting Scope for Default action.
@param GetDefaultValueScope Get default value scope. @param GetDefaultValueScope Get default value scope.
@param Storage Get default value only for this storage. @param Storage Get default value only for this storage.
@param RetrieveValueFirst Whether call the retrieve call back to
get the initial value before get default
value.
@retval EFI_SUCCESS The function completed successfully. @retval EFI_SUCCESS The function completed successfully.
@retval EFI_UNSUPPORTED Unsupport SettingScope. @retval EFI_UNSUPPORTED Unsupport SettingScope.
@ -1104,7 +1107,8 @@ ExtractDefault (
IN UINT16 DefaultId, IN UINT16 DefaultId,
IN BROWSER_SETTING_SCOPE SettingScope, IN BROWSER_SETTING_SCOPE SettingScope,
IN BROWSER_GET_DEFAULT_VALUE GetDefaultValueScope, IN BROWSER_GET_DEFAULT_VALUE GetDefaultValueScope,
IN FORMSET_STORAGE *Storage OPTIONAL IN FORMSET_STORAGE *Storage,
IN BOOLEAN RetrieveValueFirst
); );
/** /**
@ -1384,6 +1388,24 @@ ProcessCallBackFunction (
IN EFI_BROWSER_ACTION Action, IN EFI_BROWSER_ACTION Action,
IN BOOLEAN SkipSaveOrDiscard IN BOOLEAN SkipSaveOrDiscard
); );
/**
Call the retrieve type call back function for one question to get the initialize data.
This function only used when in the initialize stage, because in this stage, the
Selection->Form is not ready. For other case, use the ProcessCallBackFunction instead.
@param ConfigAccess The config access protocol produced by the hii driver.
@param Statement The Question which need to call.
@retval EFI_SUCCESS The call back function excutes successfully.
@return Other value if the call back function failed to excute.
**/
EFI_STATUS
ProcessRetrieveForQuestion (
IN EFI_HII_CONFIG_ACCESS_PROTOCOL *ConfigAccess,
IN FORM_BROWSER_STATEMENT *Statement
);
/** /**
Find the matched FormSet context in the backup maintain list based on HiiHandle. Find the matched FormSet context in the backup maintain list based on HiiHandle.

View File

@ -3809,7 +3809,7 @@ UiDisplayMenu (
// Reterieve default setting. After it. NV flag will be showed. // Reterieve default setting. After it. NV flag will be showed.
// //
if ((HotKey->Action & BROWSER_ACTION_DEFAULT) == BROWSER_ACTION_DEFAULT) { if ((HotKey->Action & BROWSER_ACTION_DEFAULT) == BROWSER_ACTION_DEFAULT) {
Status = ExtractDefault (Selection->FormSet, Selection->Form, HotKey->DefaultId, gBrowserSettingScope, GetDefaultForAll, NULL); Status = ExtractDefault (Selection->FormSet, Selection->Form, HotKey->DefaultId, gBrowserSettingScope, GetDefaultForAll, NULL, FALSE);
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {
Selection->Action = UI_ACTION_REFRESH_FORM; Selection->Action = UI_ACTION_REFRESH_FORM;
Selection->Statement = NULL; Selection->Statement = NULL;
@ -3887,7 +3887,7 @@ UiDisplayMenu (
// //
// Reset to default value for all forms in the whole system. // Reset to default value for all forms in the whole system.
// //
Status = ExtractDefault (Selection->FormSet, NULL, DefaultId, FormSetLevel, GetDefaultForAll, NULL); Status = ExtractDefault (Selection->FormSet, NULL, DefaultId, FormSetLevel, GetDefaultForAll, NULL, FALSE);
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {
Selection->Action = UI_ACTION_REFRESH_FORM; Selection->Action = UI_ACTION_REFRESH_FORM;