MdeModulePkg: Refine the get default value logic.

Based on the input request to get default value for questions.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Eric Dong <eric.dong@intel.com>
Reviewed-by: Liming Gao <liming.gao@intel.com>

git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@16413 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
Eric Dong 2014-11-21 01:23:09 +00:00 committed by ydong10
parent 76c94bb2dd
commit 787fc2a600
3 changed files with 48 additions and 168 deletions

View File

@ -928,7 +928,7 @@ ProcessAction (
}
if ((Action & BROWSER_ACTION_DEFAULT) == BROWSER_ACTION_DEFAULT) {
ExtractDefault (gCurrentSelection->FormSet, gCurrentSelection->Form, DefaultId, gBrowserSettingScope, GetDefaultForAll, NULL, FALSE);
ExtractDefault (gCurrentSelection->FormSet, gCurrentSelection->Form, DefaultId, gBrowserSettingScope, GetDefaultForAll, NULL, FALSE, FALSE);
UpdateStatementStatus (gCurrentSelection->FormSet, gCurrentSelection->Form, gBrowserSettingScope);
}
@ -1542,7 +1542,7 @@ ProcessUserInput (
//
// Reset Question to default value specified by DefaultId
//
Status = ExtractDefault (gCurrentSelection->FormSet, NULL, Statement->DefaultId, FormSetLevel, GetDefaultForAll, NULL, FALSE);
Status = ExtractDefault (gCurrentSelection->FormSet, NULL, Statement->DefaultId, FormSetLevel, GetDefaultForAll, NULL, FALSE, FALSE);
UpdateStatementStatus (gCurrentSelection->FormSet, NULL, FormSetLevel);
break;

View File

@ -3986,13 +3986,15 @@ GetQuestionDefault (
@param FormSet Form data structure.
@param Form Form data structure.
@param DefaultId The Class of the default.
@param BrowserStorage The input request storage for the questions.
**/
VOID
ExtractAltCfgForForm (
IN FORM_BROWSER_FORMSET *FormSet,
IN FORM_BROWSER_FORM *Form,
IN UINT16 DefaultId
IN UINT16 DefaultId,
IN BROWSER_STORAGE *BrowserStorage
)
{
EFI_STATUS Status;
@ -4013,10 +4015,13 @@ ExtractAltCfgForForm (
FormSetStorage = FORMSET_STORAGE_FROM_LINK (Link);
Storage = FormSetStorage->BrowserStorage;
Link = GetNextNode (&FormSet->StorageListHead, Link);
if (BrowserStorage != NULL && BrowserStorage != Storage) {
continue;
}
if (Storage->Type != EFI_HII_VARSTORE_EFI_VARIABLE &&
FormSetStorage->ElementCount != 0 &&
FormSetStorage->ConfigAltResp != NULL) {
FormSetStorage->HasCallAltCfg) {
return;
}
}
@ -4030,6 +4035,10 @@ ExtractAltCfgForForm (
Link = GetNextNode (&Form->ConfigRequestHead, Link);
Storage = ConfigInfo->Storage;
if (BrowserStorage != NULL && BrowserStorage != Storage) {
continue;
}
if (Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE) {
continue;
}
@ -4107,12 +4116,14 @@ CleanAltCfgForForm (
@param FormSet Form data structure.
@param DefaultId The Class of the default.
@param BrowserStorage The input request storage for the questions.
**/
VOID
ExtractAltCfgForFormSet (
IN FORM_BROWSER_FORMSET *FormSet,
IN UINT16 DefaultId
IN UINT16 DefaultId,
IN BROWSER_STORAGE *BrowserStorage
)
{
EFI_STATUS Status;
@ -4129,6 +4140,10 @@ ExtractAltCfgForFormSet (
Storage = FormSetStorage->BrowserStorage;
Link = GetNextNode (&FormSet->StorageListHead, Link);
if (BrowserStorage != NULL && BrowserStorage != Storage) {
continue;
}
if (Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE) {
continue;
}
@ -4140,6 +4155,8 @@ ExtractAltCfgForFormSet (
continue;
}
FormSetStorage->HasCallAltCfg = TRUE;
//
// 2. Get value through hii config routine protocol.
//
@ -4200,6 +4217,8 @@ CleanAltCfgForFormSet (
FreePool (FormSetStorage->ConfigAltResp);
FormSetStorage->ConfigAltResp = NULL;
}
FormSetStorage->HasCallAltCfg = FALSE;
}
}
@ -4218,6 +4237,7 @@ CleanAltCfgForFormSet (
@param RetrieveValueFirst Whether call the retrieve call back to
get the initial value before get default
value.
@param SkipGetAltCfg Whether skip the get altcfg string process.
@retval EFI_SUCCESS The function completed successfully.
@retval EFI_UNSUPPORTED Unsupport SettingScope.
@ -4231,7 +4251,8 @@ ExtractDefault (
IN BROWSER_SETTING_SCOPE SettingScope,
IN BROWSER_GET_DEFAULT_VALUE GetDefaultValueScope,
IN BROWSER_STORAGE *Storage OPTIONAL,
IN BOOLEAN RetrieveValueFirst
IN BOOLEAN RetrieveValueFirst,
IN BOOLEAN SkipGetAltCfg
)
{
EFI_STATUS Status;
@ -4258,7 +4279,9 @@ ExtractDefault (
//
// Prepare the AltCfg String for form.
//
ExtractAltCfgForForm (FormSet, Form, DefaultId);
if (!SkipGetAltCfg && (GetDefaultValueScope != GetDefaultForNoStorage)) {
ExtractAltCfgForForm (FormSet, Form, DefaultId, Storage);
}
//
// Extract Form default
@ -4320,24 +4343,30 @@ ExtractDefault (
//
// Clean the AltCfg String.
//
CleanAltCfgForForm(Form);
if (!SkipGetAltCfg && (GetDefaultValueScope != GetDefaultForNoStorage)) {
CleanAltCfgForForm(Form);
}
} else if (SettingScope == FormSetLevel) {
//
// Prepare the AltCfg String for formset.
//
ExtractAltCfgForFormSet (FormSet, DefaultId);
if (!SkipGetAltCfg && (GetDefaultValueScope != GetDefaultForNoStorage)) {
ExtractAltCfgForFormSet (FormSet, DefaultId, Storage);
}
FormLink = GetFirstNode (&FormSet->FormListHead);
while (!IsNull (&FormSet->FormListHead, FormLink)) {
Form = FORM_BROWSER_FORM_FROM_LINK (FormLink);
ExtractDefault (FormSet, Form, DefaultId, FormLevel, GetDefaultValueScope, Storage, RetrieveValueFirst);
ExtractDefault (FormSet, Form, DefaultId, FormLevel, GetDefaultValueScope, Storage, RetrieveValueFirst, SkipGetAltCfg);
FormLink = GetNextNode (&FormSet->FormListHead, FormLink);
}
//
// Clean the AltCfg String.
//
CleanAltCfgForFormSet (FormSet);
if (!SkipGetAltCfg && (GetDefaultValueScope != GetDefaultForNoStorage)) {
CleanAltCfgForFormSet (FormSet);
}
} else if (SettingScope == SystemLevel) {
//
// Preload all Hii formset.
@ -4359,7 +4388,7 @@ ExtractDefault (
mSystemLevelFormSet = LocalFormSet;
ExtractDefault (LocalFormSet, NULL, DefaultId, FormSetLevel, GetDefaultValueScope, Storage, RetrieveValueFirst);
ExtractDefault (LocalFormSet, NULL, DefaultId, FormSetLevel, GetDefaultValueScope, Storage, RetrieveValueFirst, SkipGetAltCfg);
}
mSystemLevelFormSet = OldFormSet;
@ -4919,158 +4948,6 @@ ConfigRequestAdjust (
return RetVal;
}
/**
Base on ConfigRequest info to get default value for current formset.
ConfigRequest info include the info about which questions in current formset need to
get default value. This function only get these questions default value.
@param FormSet FormSet data structure.
@param Storage Storage need to update value.
@param ConfigRequest The config request string.
**/
VOID
GetDefaultForFormset (
IN FORM_BROWSER_FORMSET *FormSet,
IN BROWSER_STORAGE *Storage,
IN CHAR16 *ConfigRequest
)
{
UINT8 *BackUpBuf;
UINTN BufferSize;
LIST_ENTRY BackUpList;
NAME_VALUE_NODE *Node;
LIST_ENTRY *Link;
LIST_ENTRY *NodeLink;
NAME_VALUE_NODE *TmpNode;
EFI_STATUS Status;
EFI_STRING Progress;
EFI_STRING Result;
BackUpBuf = NULL;
InitializeListHead(&BackUpList);
//
// Back update the edit buffer.
//
if (Storage->Type == EFI_HII_VARSTORE_BUFFER ||
(Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER)) {
BackUpBuf = AllocateCopyPool (Storage->Size, Storage->EditBuffer);
ASSERT (BackUpBuf != NULL);
} else if (Storage->Type == EFI_HII_VARSTORE_NAME_VALUE) {
Link = GetFirstNode (&Storage->NameValueListHead);
while (!IsNull (&Storage->NameValueListHead, Link)) {
Node = NAME_VALUE_NODE_FROM_LINK (Link);
Link = GetNextNode (&Storage->NameValueListHead, Link);
//
// Only back Node belong to this formset.
//
if (StrStr (Storage->ConfigRequest, Node->Name) == NULL) {
continue;
}
TmpNode = AllocateCopyPool (sizeof (NAME_VALUE_NODE), Node);
ASSERT (TmpNode != NULL);
TmpNode->Name = AllocateCopyPool (StrSize(Node->Name) * sizeof (CHAR16), Node->Name);
ASSERT (TmpNode->Name != NULL);
TmpNode->EditValue = AllocateCopyPool (StrSize(Node->EditValue) * sizeof (CHAR16), Node->EditValue);
ASSERT (TmpNode->EditValue != NULL);
InsertTailList(&BackUpList, &TmpNode->Link);
}
}
//
// Get default value.
//
ExtractDefault (FormSet, NULL, EFI_HII_DEFAULT_CLASS_STANDARD, FormSetLevel, GetDefaultForStorage, Storage, TRUE);
//
// Update the question value based on the input ConfigRequest.
//
if (Storage->Type == EFI_HII_VARSTORE_BUFFER ||
(Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER)) {
ASSERT (BackUpBuf != NULL);
BufferSize = Storage->Size;
Status = mHiiConfigRouting->BlockToConfig(
mHiiConfigRouting,
ConfigRequest,
Storage->EditBuffer,
BufferSize,
&Result,
&Progress
);
ASSERT_EFI_ERROR (Status);
Status = mHiiConfigRouting->ConfigToBlock (
mHiiConfigRouting,
Result,
BackUpBuf,
&BufferSize,
&Progress
);
ASSERT_EFI_ERROR (Status);
if (Result != NULL) {
FreePool (Result);
}
CopyMem (Storage->EditBuffer, BackUpBuf, Storage->Size);
FreePool (BackUpBuf);
} else if (Storage->Type == EFI_HII_VARSTORE_NAME_VALUE) {
//
// Update question value, only element in ConfigReqeust will be update.
//
Link = GetFirstNode (&BackUpList);
while (!IsNull (&BackUpList, Link)) {
Node = NAME_VALUE_NODE_FROM_LINK (Link);
Link = GetNextNode (&BackUpList, Link);
if (StrStr (ConfigRequest, Node->Name) != NULL) {
continue;
}
NodeLink = GetFirstNode (&Storage->NameValueListHead);
while (!IsNull (&Storage->NameValueListHead, NodeLink)) {
TmpNode = NAME_VALUE_NODE_FROM_LINK (NodeLink);
NodeLink = GetNextNode (&Storage->NameValueListHead, NodeLink);
if (StrCmp (Node->Name, TmpNode->Name) != 0) {
continue;
}
FreePool (TmpNode->EditValue);
TmpNode->EditValue = AllocateCopyPool (StrSize(Node->EditValue) * sizeof (CHAR16), Node->EditValue);
RemoveEntryList (&Node->Link);
FreePool (Node->EditValue);
FreePool (Node->Name);
FreePool (Node);
}
}
//
// Restore the Name/Value node.
//
Link = GetFirstNode (&BackUpList);
while (!IsNull (&BackUpList, Link)) {
Node = NAME_VALUE_NODE_FROM_LINK (Link);
Link = GetNextNode (&BackUpList, Link);
//
// Free this node.
//
RemoveEntryList (&Node->Link);
FreePool (Node->EditValue);
FreePool (Node->Name);
FreePool (Node);
}
}
}
/**
Fill storage's edit copy with settings requested from Configuration Driver.
@ -5161,7 +5038,7 @@ LoadStorage (
// If get value fail, extract default from IFR binary
//
if (EFI_ERROR (Status)) {
ExtractDefault (FormSet, NULL, EFI_HII_DEFAULT_CLASS_STANDARD, FormSetLevel, GetDefaultForStorage, Storage->BrowserStorage, TRUE);
ExtractDefault (FormSet, NULL, EFI_HII_DEFAULT_CLASS_STANDARD, FormSetLevel, GetDefaultForStorage, Storage->BrowserStorage, TRUE, TRUE);
} else {
//
// Convert Result from <ConfigAltResp> to <ConfigResp>
@ -5307,7 +5184,7 @@ InitializeCurrentSetting (
//
// Extract default from IFR binary for no storage questions.
//
ExtractDefault (FormSet, NULL, EFI_HII_DEFAULT_CLASS_STANDARD, FormSetLevel, GetDefaultForNoStorage, NULL, TRUE);
ExtractDefault (FormSet, NULL, EFI_HII_DEFAULT_CLASS_STANDARD, FormSetLevel, GetDefaultForNoStorage, NULL, TRUE, FALSE);
//
// Request current settings from Configuration Driver
@ -6100,7 +5977,7 @@ ExecuteAction (
// Executet the difault action.
//
if ((Action & BROWSER_ACTION_DEFAULT) != 0) {
Status = ExtractDefault (FormSet, Form, DefaultId, gBrowserSettingScope, GetDefaultForAll, NULL, FALSE);
Status = ExtractDefault (FormSet, Form, DefaultId, gBrowserSettingScope, GetDefaultForAll, NULL, FALSE, FALSE);
if (EFI_ERROR (Status)) {
return Status;
}

View File

@ -172,6 +172,7 @@ typedef struct {
CHAR16 *ConfigRequest; // <ConfigRequest> = <ConfigHdr> + <RequestElement>
CHAR16 *ConfigAltResp; // Alt config response string for this ConfigRequest.
BOOLEAN HasCallAltCfg; // Flag to show whether browser has call ExtractConfig to get Altcfg string.
UINTN ElementCount; // Number of <RequestElement> in the <ConfigRequest>
UINTN SpareStrLen; // Spare length of ConfigRequest string buffer
} FORMSET_STORAGE;
@ -917,6 +918,7 @@ InitializeFormSet (
@param RetrieveValueFirst Whether call the retrieve call back to
get the initial value before get default
value.
@param SkipGetAltCfg Whether skip the get altcfg string process.
@retval EFI_SUCCESS The function completed successfully.
@retval EFI_UNSUPPORTED Unsupport SettingScope.
@ -930,7 +932,8 @@ ExtractDefault (
IN BROWSER_SETTING_SCOPE SettingScope,
IN BROWSER_GET_DEFAULT_VALUE GetDefaultValueScope,
IN BROWSER_STORAGE *Storage,
IN BOOLEAN RetrieveValueFirst
IN BOOLEAN RetrieveValueFirst,
IN BOOLEAN SkipGetAltCfg
);
/**