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