Found = FALSE;\r
Status = EFI_SUCCESS;\r
\r
- //\r
- // If set browser data, pre load all hii formset to avoid set the varstore which is not \r
- // saved in browser.\r
- //\r
- if (!RetrieveData && (gBrowserSettingScope == SystemLevel)) {\r
- LoadAllHiiFormset();\r
- }\r
-\r
if (VariableGuid != NULL) {\r
//\r
// Try to find target storage in the current formset.\r
return Status;\r
}\r
\r
+ if (Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER) {\r
+ ConfigRequestAdjust (Storage, ResultsData, TRUE);\r
+ }\r
+\r
//\r
// Different formsets may have same varstore, so here just set the flag\r
// not exit the circle.\r
{\r
LIST_ENTRY *Link;\r
FORMSET_STORAGE *Storage;\r
- CHAR16 *ConfigRequest;\r
\r
Link = GetFirstNode (&FormSet->StorageListHead);\r
while (!IsNull (&FormSet->StorageListHead, Link)) {\r
continue;\r
}\r
\r
- ConfigRequest = FormSet->QuestionInited ? Storage->ConfigRequest : Storage->ConfigElements;\r
- RemoveConfigRequest (Storage->BrowserStorage, ConfigRequest);\r
+ RemoveConfigRequest (Storage->BrowserStorage, Storage->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
Adjust the config request info, remove the request elements which already in AllConfigRequest string.\r
\r
@param Storage Form set Storage.\r
+ @param Request The input request string.\r
+ @param RespString Whether the input is ConfigRequest or ConfigResp format.\r
\r
@retval TRUE Has element not covered by current used elements, need to continue to call ExtractConfig\r
@retval FALSE All elements covered by current used elements.\r
**/\r
BOOLEAN \r
ConfigRequestAdjust (\r
- IN FORMSET_STORAGE *Storage\r
+ IN BROWSER_STORAGE *Storage,\r
+ IN CHAR16 *Request,\r
+ IN BOOLEAN RespString\r
)\r
{\r
CHAR16 *RequestElement;\r
CHAR16 *NextRequestElement;\r
- CHAR16 *RetBuf;\r
+ CHAR16 *NextElementBakup;\r
UINTN SpareBufLen;\r
CHAR16 *SearchKey;\r
+ CHAR16 *ValueKey;\r
BOOLEAN RetVal;\r
+ CHAR16 *ConfigRequest;\r
\r
SpareBufLen = 0;\r
- RetBuf = NULL;\r
RetVal = FALSE;\r
+ NextElementBakup = NULL;\r
+ ValueKey = NULL;\r
\r
- if (Storage->BrowserStorage->ConfigRequest == NULL) {\r
- Storage->BrowserStorage->ConfigRequest = AllocateCopyPool (StrSize (Storage->ConfigRequest), Storage->ConfigRequest);\r
- if (Storage->ConfigElements != NULL) {\r
- FreePool (Storage->ConfigElements);\r
- }\r
- Storage->ConfigElements = AllocateCopyPool (StrSize (Storage->ConfigRequest), Storage->ConfigRequest);\r
+ if (Request != NULL) {\r
+ ConfigRequest = Request;\r
+ } else {\r
+ ConfigRequest = Storage->ConfigRequest;\r
+ }\r
+\r
+ if (Storage->ConfigRequest == NULL) {\r
+ Storage->ConfigRequest = AllocateCopyPool (StrSize (ConfigRequest), ConfigRequest);\r
return TRUE;\r
}\r
\r
- if (Storage->BrowserStorage->Type == EFI_HII_VARSTORE_NAME_VALUE) {\r
+ if (Storage->Type == EFI_HII_VARSTORE_NAME_VALUE) {\r
//\r
// "&Name1&Name2" section for EFI_HII_VARSTORE_NAME_VALUE storage\r
//\r
// "&OFFSET=####&WIDTH=####" section for EFI_HII_VARSTORE_BUFFER storage\r
//\r
SearchKey = L"&OFFSET";\r
+ ValueKey = L"&VALUE";\r
}\r
\r
- //\r
- // Prepare the config header.\r
- // \r
- RetBuf = AllocateCopyPool(StrSize (Storage->BrowserStorage->ConfigHdr), Storage->BrowserStorage->ConfigHdr);\r
- ASSERT (RetBuf != NULL);\r
-\r
//\r
// Find SearchKey storage\r
//\r
- if (Storage->BrowserStorage->Type == EFI_HII_VARSTORE_NAME_VALUE) {\r
- RequestElement = StrStr (Storage->ConfigRequest, L"PATH");\r
+ if (Storage->Type == EFI_HII_VARSTORE_NAME_VALUE) {\r
+ RequestElement = StrStr (ConfigRequest, L"PATH");\r
ASSERT (RequestElement != NULL);\r
RequestElement = StrStr (RequestElement, SearchKey); \r
} else {\r
- RequestElement = StrStr (Storage->ConfigRequest, SearchKey);\r
+ RequestElement = StrStr (ConfigRequest, SearchKey);\r
}\r
\r
while (RequestElement != NULL) {\r
+\r
//\r
// +1 to avoid find header itself.\r
//\r
// The last Request element in configRequest string.\r
//\r
if (NextRequestElement != NULL) {\r
+ if (RespString && (Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER)) {\r
+ NextElementBakup = NextRequestElement;\r
+ NextRequestElement = StrStr (RequestElement, ValueKey);\r
+ }\r
//\r
// Replace "&" with '\0'.\r
//\r
*NextRequestElement = L'\0';\r
+ } else {\r
+ if (RespString && (Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER)) {\r
+ NextElementBakup = NextRequestElement;\r
+ NextRequestElement = StrStr (RequestElement, ValueKey);\r
+ //\r
+ // Replace "&" with '\0'.\r
+ //\r
+ *NextRequestElement = L'\0';\r
+ }\r
}\r
\r
- if (!ElementValidation (Storage->BrowserStorage, RequestElement)) {\r
+ if (!ElementValidation (Storage, RequestElement)) {\r
//\r
// Add this element to the Storage->BrowserStorage->AllRequestElement.\r
//\r
- AppendConfigRequest(&Storage->BrowserStorage->ConfigRequest, &Storage->BrowserStorage->SpareStrLen, RequestElement);\r
- AppendConfigRequest (&RetBuf, &SpareBufLen, RequestElement);\r
+ AppendConfigRequest(&Storage->ConfigRequest, &Storage->SpareStrLen, RequestElement);\r
RetVal = TRUE;\r
}\r
\r
*NextRequestElement = L'&';\r
}\r
\r
- RequestElement = NextRequestElement;\r
- }\r
-\r
- if (RetVal) {\r
- if (Storage->ConfigElements != NULL) {\r
- FreePool (Storage->ConfigElements);\r
+ if (RespString && (Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER)) {\r
+ RequestElement = NextElementBakup;\r
+ } else {\r
+ RequestElement = NextRequestElement;\r
}\r
- Storage->ConfigElements = RetBuf;\r
- } else {\r
- FreePool (RetBuf);\r
}\r
\r
return RetVal;\r
\r
case EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER:\r
if (Storage->BrowserStorage->ConfigRequest != NULL) {\r
- ConfigRequestAdjust(Storage);\r
+ ConfigRequestAdjust(Storage->BrowserStorage, Storage->ConfigRequest, FALSE);\r
return;\r
}\r
break;\r
// Just update the ConfigRequest, if storage already initialized. \r
//\r
if (Storage->BrowserStorage->Initialized) {\r
- ConfigRequestAdjust(Storage);\r
+ ConfigRequestAdjust(Storage->BrowserStorage, Storage->ConfigRequest, FALSE);\r
return;\r
}\r
\r