/**\r
Find the global storage link base on the input storate type, name and guid.\r
\r
+ For EFI_HII_VARSTORE_EFI_VARIABLE and EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER,\r
+ same guid + name = same storage\r
+\r
+ For EFI_HII_VARSTORE_NAME_VALUE:\r
+ same guid + HiiHandle = same storage\r
+\r
+ For EFI_HII_VARSTORE_BUFFER:\r
+ same guid + name + HiiHandle = same storage\r
+\r
@param StorageType Storage type.\r
@param StorageGuid Storage guid.\r
@param StorageName Storage Name.\r
+ @param HiiHandle HiiHandle for this varstore.\r
\r
@return Pointer to a GLOBAL_STORAGE data structure.\r
\r
FindStorageInList (\r
IN UINT8 StorageType,\r
IN EFI_GUID *StorageGuid,\r
- IN CHAR16 *StorageName\r
+ IN CHAR16 *StorageName,\r
+ IN EFI_HII_HANDLE HiiHandle\r
)\r
{\r
LIST_ENTRY *Link;\r
BrowserStorage = BROWSER_STORAGE_FROM_LINK (Link);\r
\r
if ((BrowserStorage->Type == StorageType) && CompareGuid (&BrowserStorage->Guid, StorageGuid)) {\r
- if (StorageType == EFI_HII_VARSTORE_NAME_VALUE) {\r
+ if (StorageType == EFI_HII_VARSTORE_NAME_VALUE && BrowserStorage->HiiHandle == HiiHandle) {\r
return BrowserStorage;\r
}\r
\r
if (StrCmp (BrowserStorage->Name, StorageName) == 0) {\r
- return BrowserStorage;\r
+ if (StorageType == EFI_HII_VARSTORE_EFI_VARIABLE || StorageType == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER) {\r
+ return BrowserStorage;\r
+ } else if (StorageType == EFI_HII_VARSTORE_BUFFER && BrowserStorage->HiiHandle == HiiHandle) {\r
+ return BrowserStorage;\r
+ }\r
}\r
}\r
\r
Storage->Signature = FORMSET_STORAGE_SIGNATURE;\r
InsertTailList (&FormSet->StorageListHead, &Storage->Link);\r
\r
- BrowserStorage = FindStorageInList(StorageType, StorageGuid, UnicodeString);\r
+ BrowserStorage = FindStorageInList(StorageType, StorageGuid, UnicodeString, FormSet->HiiHandle);\r
if (BrowserStorage == NULL) {\r
BrowserStorage = AllocateZeroPool (sizeof (BROWSER_STORAGE));\r
ASSERT (BrowserStorage != NULL);\r
BrowserStorage->Name = UnicodeString;\r
}\r
\r
+ BrowserStorage->HiiHandle = FormSet->HiiHandle;\r
InitializeConfigHdr (FormSet, BrowserStorage);\r
+\r
+ BrowserStorage->Initialized = FALSE;\r
}\r
\r
Storage->BrowserStorage = BrowserStorage;\r
}\r
}\r
\r
+ if (Storage->Type == EFI_HII_VARSTORE_NAME_VALUE ||\r
+ Storage->Type == EFI_HII_VARSTORE_BUFFER) {\r
+ if (mSystemLevelFormSet == NULL || mSystemLevelFormSet->HiiHandle == NULL) {\r
+ return EFI_NOT_FOUND;\r
+ }\r
+\r
+ if (Storage->HiiHandle != mSystemLevelFormSet->HiiHandle) {\r
+ continue;\r
+ }\r
+ }\r
+\r
Status = ProcessStorage (&TotalSize, &ResultsData, RetrieveData, Storage);\r
if (EFI_ERROR (Status)) {\r
return Status;\r
Storage = FORMSET_STORAGE_FROM_LINK (Link);\r
Link = GetNextNode (&FormSet->StorageListHead, Link);\r
\r
- if ((Storage->BrowserStorage->Type != EFI_HII_VARSTORE_BUFFER) && \r
- (Storage->BrowserStorage->Type != EFI_HII_VARSTORE_NAME_VALUE) && \r
- (Storage->BrowserStorage->Type != EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER)) {\r
- continue;\r
- }\r
+ if (Storage->BrowserStorage->Type == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER) {\r
+ if (Storage->ConfigRequest == NULL || Storage->BrowserStorage->ConfigRequest == NULL) {\r
+ continue;\r
+ }\r
\r
- if (Storage->ConfigRequest == NULL || Storage->BrowserStorage->ConfigRequest == NULL) {\r
- continue;\r
+ ConfigRequest = FormSet->QuestionInited ? Storage->ConfigRequest : Storage->ConfigElements;\r
+ RemoveConfigRequest (Storage->BrowserStorage, ConfigRequest);\r
+ } else if (Storage->BrowserStorage->Type == EFI_HII_VARSTORE_BUFFER ||\r
+ Storage->BrowserStorage->Type == EFI_HII_VARSTORE_NAME_VALUE) {\r
+ if (Storage->BrowserStorage->ConfigRequest != NULL) { \r
+ FreePool (Storage->BrowserStorage->ConfigRequest);\r
+ }\r
+ Storage->BrowserStorage->Initialized = FALSE;\r
}\r
-\r
- ConfigRequest = FormSet->QuestionInited ? Storage->ConfigRequest : Storage->ConfigElements;\r
- RemoveConfigRequest (Storage->BrowserStorage, ConfigRequest);\r
}\r
}\r
\r
case EFI_HII_VARSTORE_BUFFER:\r
case EFI_HII_VARSTORE_NAME_VALUE:\r
//\r
- // Skip if there is no RequestElement\r
+ // Skip if there is no RequestElement or data has initilized.\r
//\r
- if (Storage->ElementCount == 0) {\r
+ if (Storage->ElementCount == 0 || Storage->BrowserStorage->Initialized) {\r
return;\r
}\r
\r
- //\r
- // Adjust the ConfigRequest string, only the field not saved in BrowserStorage->AllConfig\r
- // will used to call ExtractConfig.\r
- // If not elements need to udpate, return.\r
- //\r
- if (!ConfigRequestAdjust(Storage)) {\r
- return;\r
- }\r
- ASSERT (Storage->ConfigElements != NULL);\r
-\r
Status = EFI_NOT_FOUND;\r
if (FormSet->ConfigAccess != NULL) { \r
//\r
//\r
Status = FormSet->ConfigAccess->ExtractConfig (\r
FormSet->ConfigAccess,\r
- Storage->ConfigElements,\r
+ Storage->ConfigRequest,\r
&Progress,\r
&Result\r
);\r
//\r
// Base on the configRequest string to get default value.\r
//\r
- GetDefaultForFormset (FormSet, Storage->BrowserStorage, Storage->ConfigElements);\r
+ GetDefaultForFormset (FormSet, Storage->BrowserStorage, Storage->ConfigRequest);\r
}\r
\r
- SynchronizeStorage(FormSet, Storage->BrowserStorage, Storage->ConfigElements, TRUE);\r
+ SynchronizeStorage(FormSet, Storage->BrowserStorage, Storage->ConfigRequest, TRUE);\r
+\r
+ Storage->BrowserStorage->ConfigRequest = AllocateCopyPool (StrSize (Storage->ConfigRequest), Storage->ConfigRequest);\r
+ Storage->BrowserStorage->Initialized = TRUE;\r
break;\r
\r
default:\r