LIST_ENTRY gBrowserContextList = INITIALIZE_LIST_HEAD_VARIABLE (gBrowserContextList);\r
LIST_ENTRY gBrowserFormSetList = INITIALIZE_LIST_HEAD_VARIABLE (gBrowserFormSetList);\r
LIST_ENTRY gBrowserHotKeyList = INITIALIZE_LIST_HEAD_VARIABLE (gBrowserHotKeyList);\r
+LIST_ENTRY gBrowserStorageList = INITIALIZE_LIST_HEAD_VARIABLE (gBrowserStorageList);\r
\r
BANNER_DATA *gBannerData;\r
EFI_HII_HANDLE gFrontPageHandle;\r
EFI_HII_HANDLE gHiiHandle;\r
UINT16 gDirection;\r
EFI_SCREEN_DESCRIPTOR gScreenDimensions;\r
-BROWSER_SETTING_SCOPE gBrowserSettingScope = SystemLevel;\r
+BROWSER_SETTING_SCOPE gBrowserSettingScope = FormSetLevel;\r
BOOLEAN mBrowserScopeFirstSet = TRUE;\r
EXIT_HANDLER ExitHandlerFunction = NULL;\r
UINTN gFooterHeight;\r
//\r
gFooterHeight = FOOTER_HEIGHT + (Index / 3);\r
\r
+ //\r
+ // Clean the history menu list.\r
+ //\r
+ InitializeListHead (&gMenuList);\r
+\r
//\r
// Save globals used by SendForm()\r
//\r
//\r
InitializeBrowserStrings ();\r
\r
- gFunctionKeySetting = ENABLE_FUNCTION_KEY_SETTING;\r
-\r
//\r
// Ensure we are in Text mode\r
//\r
}\r
\r
FreeBrowserStrings ();\r
+ UiFreeMenuList(&gMenuList);\r
\r
gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK));\r
gST->ConOut->ClearScreen (gST->ConOut);\r
Storage = FORMSET_STORAGE_FROM_LINK (Link);\r
Link = GetNextNode (&FormSet->StorageListHead, Link);\r
\r
- if (CompareGuid (&Storage->Guid, (EFI_GUID *) VariableGuid)) {\r
- if (Storage->Type == EFI_HII_VARSTORE_BUFFER ||\r
- Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER) {\r
+ if (CompareGuid (&Storage->BrowserStorage->Guid, (EFI_GUID *) VariableGuid)) {\r
+ if (Storage->BrowserStorage->Type == EFI_HII_VARSTORE_BUFFER ||\r
+ Storage->BrowserStorage->Type == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER) {\r
//\r
// Buffer storage require both GUID and Name\r
//\r
return EFI_NOT_FOUND;\r
}\r
\r
- if (StrCmp (Storage->Name, (CHAR16 *) VariableName) != 0) {\r
+ if (StrCmp (Storage->BrowserStorage->Name, (CHAR16 *) VariableName) != 0) {\r
continue;\r
}\r
}\r
//\r
// Generate <ConfigResp>\r
//\r
- Status = StorageToConfigResp (Storage, &ConfigResp, FALSE);\r
+ Status = StorageToConfigResp (Storage->BrowserStorage, &ConfigResp, Storage->ConfigRequest);\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
//\r
// Skip <ConfigHdr> and '&' to point to <ConfigBody>\r
//\r
- StrPtr = ConfigResp + StrLen (Storage->ConfigHdr) + 1;\r
+ StrPtr = ConfigResp + StrLen (Storage->BrowserStorage->ConfigHdr) + 1;\r
\r
BufferSize = StrSize (StrPtr);\r
if (*ResultsDataSize < BufferSize) {\r
// Prepare <ConfigResp>\r
//\r
TmpSize = StrLen (ResultsData);\r
- BufferSize = (TmpSize + StrLen (Storage->ConfigHdr) + 2) * sizeof (CHAR16);\r
+ BufferSize = (TmpSize + StrLen (Storage->BrowserStorage->ConfigHdr) + 2) * sizeof (CHAR16);\r
ConfigResp = AllocateZeroPool (BufferSize);\r
ASSERT (ConfigResp != NULL);\r
\r
- StrCpy (ConfigResp, Storage->ConfigHdr);\r
+ StrCpy (ConfigResp, Storage->BrowserStorage->ConfigHdr);\r
StrCat (ConfigResp, L"&");\r
StrCat (ConfigResp, ResultsData);\r
\r
//\r
// Update Browser uncommited data\r
//\r
- Status = ConfigRespToStorage (Storage, ConfigResp);\r
+ Status = ConfigRespToStorage (Storage->BrowserStorage, ConfigResp);\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
**/\r
VOID\r
SynchronizeStorage (\r
- IN FORMSET_STORAGE *Storage,\r
+ IN BROWSER_STORAGE *Storage,\r
IN BOOLEAN SyncOrRestore\r
)\r
{\r
**/\r
EFI_STATUS\r
GetValueByName (\r
- IN FORMSET_STORAGE *Storage,\r
+ IN BROWSER_STORAGE *Storage,\r
IN CHAR16 *Name,\r
IN OUT CHAR16 **Value,\r
IN GET_SET_QUESTION_VALUE_WITH GetValueFrom\r
**/\r
EFI_STATUS\r
SetValueByName (\r
- IN FORMSET_STORAGE *Storage,\r
+ IN BROWSER_STORAGE *Storage,\r
IN CHAR16 *Name,\r
IN CHAR16 *Value,\r
IN GET_SET_QUESTION_VALUE_WITH SetValueTo\r
/**\r
Convert setting of Buffer Storage or NameValue Storage to <ConfigResp>.\r
\r
- @param Buffer The Storage to be conveted.\r
+ @param Storage The Storage to be conveted.\r
@param ConfigResp The returned <ConfigResp>.\r
- @param SingleForm Whether update data for single form or formset level.\r
+ @param ConfigRequest The ConfigRequest string.\r
\r
@retval EFI_SUCCESS Convert success.\r
@retval EFI_INVALID_PARAMETER Incorrect storage type.\r
**/\r
EFI_STATUS\r
StorageToConfigResp (\r
- IN VOID *Buffer,\r
+ IN BROWSER_STORAGE *Storage,\r
IN CHAR16 **ConfigResp,\r
- IN BOOLEAN SingleForm\r
+ IN CHAR16 *ConfigRequest\r
)\r
{\r
- EFI_STATUS Status;\r
- EFI_STRING Progress;\r
+ EFI_STATUS Status;\r
+ EFI_STRING Progress;\r
LIST_ENTRY *Link;\r
NAME_VALUE_NODE *Node;\r
- CHAR16 *ConfigRequest;\r
- FORMSET_STORAGE *Storage;\r
- FORM_BROWSER_CONFIG_REQUEST *ConfigInfo;\r
\r
Status = EFI_SUCCESS;\r
- if (SingleForm) {\r
- ConfigInfo = (FORM_BROWSER_CONFIG_REQUEST *) Buffer;\r
- Storage = ConfigInfo->Storage;\r
- ConfigRequest = ConfigInfo->ConfigRequest;\r
- } else {\r
- Storage = (FORMSET_STORAGE *) Buffer;\r
- ConfigRequest = Storage->ConfigRequest;\r
- }\r
\r
switch (Storage->Type) {\r
case EFI_HII_VARSTORE_BUFFER:\r
**/\r
EFI_STATUS\r
ConfigRespToStorage (\r
- IN FORMSET_STORAGE *Storage,\r
+ IN BROWSER_STORAGE *Storage,\r
IN CHAR16 *ConfigResp\r
)\r
{\r
UINT8 *Dst;\r
UINTN StorageWidth;\r
EFI_TIME EfiTime;\r
- FORMSET_STORAGE *Storage;\r
+ BROWSER_STORAGE *Storage;\r
EFI_IFR_TYPE_VALUE *QuestionValue;\r
CHAR16 *ConfigRequest;\r
CHAR16 *Progress;\r
EFI_TIME EfiTime;\r
UINTN BufferLen;\r
UINTN StorageWidth;\r
- FORMSET_STORAGE *Storage;\r
+ BROWSER_STORAGE *Storage;\r
EFI_IFR_TYPE_VALUE *QuestionValue;\r
CHAR16 *ConfigResp;\r
CHAR16 *Progress;\r
Storage = FORMSET_STORAGE_FROM_LINK (Link);\r
Link = GetNextNode (&FormSet->StorageListHead, Link);\r
\r
- if (Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE) {\r
+ if (Storage->BrowserStorage->Type == EFI_HII_VARSTORE_EFI_VARIABLE) {\r
continue;\r
}\r
\r
continue;\r
}\r
\r
- SynchronizeStorage(Storage, FALSE);\r
+ SynchronizeStorage(Storage->BrowserStorage, FALSE);\r
}\r
\r
Link = GetFirstNode (&FormSet->FormListHead);\r
LIST_ENTRY *Link;\r
EFI_STRING ConfigResp;\r
EFI_STRING Progress;\r
- FORMSET_STORAGE *Storage;\r
+ BROWSER_STORAGE *Storage;\r
+ FORMSET_STORAGE *FormSetStorage;\r
UINTN BufferSize;\r
UINT8 *TmpBuf; \r
FORM_BROWSER_FORMSET *LocalFormSet;\r
//\r
// 1. Prepare <ConfigResp>\r
//\r
- Status = StorageToConfigResp (ConfigInfo, &ConfigResp, TRUE);\r
+ Status = StorageToConfigResp (ConfigInfo->Storage, &ConfigResp, ConfigInfo->ConfigRequest);\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
//\r
Link = GetFirstNode (&FormSet->StorageListHead);\r
while (!IsNull (&FormSet->StorageListHead, Link)) {\r
- Storage = FORMSET_STORAGE_FROM_LINK (Link);\r
+ FormSetStorage = (FORMSET_STORAGE_FROM_LINK (Link));\r
+ Storage = FormSetStorage->BrowserStorage;\r
Link = GetNextNode (&FormSet->StorageListHead, Link);\r
\r
if (Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE) {\r
//\r
// Skip if there is no RequestElement\r
//\r
- if (Storage->ElementCount == 0) {\r
+ if (FormSetStorage->ElementCount == 0) {\r
continue;\r
}\r
\r
//\r
// 1. Prepare <ConfigResp>\r
//\r
- Status = StorageToConfigResp (Storage, &ConfigResp, FALSE);\r
+ Status = StorageToConfigResp (Storage, &ConfigResp, FormSetStorage->ConfigRequest);\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
BOOLEAN IsBufferStorage;\r
BOOLEAN IsString; \r
UINTN Length;\r
- FORMSET_STORAGE *Storage;\r
+ BROWSER_STORAGE *Storage;\r
CHAR16 *ConfigRequest;\r
CHAR16 *Progress;\r
CHAR16 *Result;\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 BROWSER_STORAGE *Storage OPTIONAL,\r
IN BOOLEAN RetrieveValueFirst\r
)\r
{\r
EFI_STRING Result;\r
CHAR16 *StrPtr;\r
\r
- if (Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE) {\r
+ if (Storage->BrowserStorage->Type == EFI_HII_VARSTORE_EFI_VARIABLE) {\r
return EFI_SUCCESS;\r
}\r
\r
- if (Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER) {\r
+ if (Storage->BrowserStorage->Type == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER) {\r
Status = gRT->GetVariable (\r
- Storage->Name,\r
- &Storage->Guid,\r
+ Storage->BrowserStorage->Name,\r
+ &Storage->BrowserStorage->Guid,\r
NULL,\r
- (UINTN*)&Storage->Size,\r
- Storage->EditBuffer\r
+ (UINTN*)&Storage->BrowserStorage->Size,\r
+ Storage->BrowserStorage->EditBuffer\r
);\r
return Status;\r
}\r
*StrPtr = L'\0';\r
}\r
\r
- Status = ConfigRespToStorage (Storage, Result);\r
+ Status = ConfigRespToStorage (Storage->BrowserStorage, Result);\r
FreePool (Result);\r
return Status;\r
}\r
\r
-\r
-/**\r
- Copy uncommitted data from source Storage to destination Storage.\r
-\r
- @param Dst Target Storage for uncommitted data.\r
- @param Src Source Storage for uncommitted data.\r
-\r
- @retval EFI_SUCCESS The function completed successfully.\r
- @retval EFI_INVALID_PARAMETER Source and destination Storage is not the same type.\r
-\r
-**/\r
-EFI_STATUS\r
-CopyStorage (\r
- IN OUT FORMSET_STORAGE *Dst,\r
- IN FORMSET_STORAGE *Src\r
- )\r
-{\r
- LIST_ENTRY *Link;\r
- NAME_VALUE_NODE *Node;\r
-\r
- if ((Dst->Type != Src->Type) || (Dst->Size != Src->Size)) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- switch (Src->Type) {\r
- case EFI_HII_VARSTORE_BUFFER:\r
- case EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER:\r
- CopyMem (Dst->EditBuffer, Src->EditBuffer, Src->Size);\r
- CopyMem (Dst->Buffer, Src->Buffer, Src->Size);\r
- break;\r
-\r
- case EFI_HII_VARSTORE_NAME_VALUE:\r
- Link = GetFirstNode (&Src->NameValueListHead);\r
- while (!IsNull (&Src->NameValueListHead, Link)) {\r
- Node = NAME_VALUE_NODE_FROM_LINK (Link);\r
-\r
- SetValueByName (Dst, Node->Name, Node->EditValue, GetSetValueWithEditBuffer);\r
- SetValueByName (Dst, Node->Name, Node->Value, GetSetValueWithBuffer);\r
-\r
- Link = GetNextNode (&Src->NameValueListHead, Link);\r
- }\r
- break;\r
-\r
- case EFI_HII_VARSTORE_EFI_VARIABLE:\r
- default:\r
- break;\r
- }\r
-\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
\r
}\r
}\r
\r
- if (OldStorage == NULL) {\r
- //\r
- // Storage is not found in backup formset, request it from ConfigDriver\r
- //\r
+ //\r
+ // Storage is not found in backup formset and current global storage not has other driver used,\r
+ // request it from ConfigDriver\r
+ //\r
+ if (OldStorage == NULL && Storage->BrowserStorage->ReferenceCount == 1) {\r
Status = LoadStorage (FormSet, Storage);\r
\r
if (EFI_ERROR (Status)) {\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, TRUE);\r
+ ExtractDefault (FormSet, NULL, EFI_HII_DEFAULT_CLASS_STANDARD, FormSetLevel, GetDefaultForStorage, Storage->BrowserStorage, TRUE);\r
//\r
// ExtractDefault will set the NV flag to TRUE, so need this function to clean the flag\r
// in current situation.\r
// Now Edit Buffer is filled with default values(lower priority) or current\r
// settings(higher priority), sychronize it to shadow Buffer\r
//\r
- SynchronizeStorage (Storage, TRUE);\r
- } else {\r
- //\r
- // Storage found in backup formset, use it\r
- //\r
- Status = CopyStorage (Storage, OldStorage);\r
+ SynchronizeStorage (Storage->BrowserStorage, TRUE);\r
}\r
\r
Link = GetNextNode (&FormSet->StorageListHead, Link);\r
}\r
}\r
\r
+ gFunctionKeySetting = ENABLE_FUNCTION_KEY_SETTING;\r
+\r
if ((gClassOfVfr & FORMSET_CLASS_FRONT_PAGE) == FORMSET_CLASS_FRONT_PAGE) {\r
gFrontPageHandle = FormSet->HiiHandle;\r
gFunctionKeySetting = NONE_FUNCTION_KEY_SETTING;\r