//\r
// If no data is changed, don't need to save current FormSet into the maintain list.\r
//\r
- if (!IsNvUpdateRequiredForFormSet (FormSet) && !IsStorageDataChangedForFormSet(FormSet)) {\r
+ if (!IsNvUpdateRequiredForFormSet (FormSet)) {\r
CleanBrowserStorage(FormSet);\r
RemoveEntryList (&FormSet->Link);\r
DestroyFormSet (FormSet);\r
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
EFI_IFR_TYPE_VALUE *TypeValue;\r
EFI_BROWSER_ACTION_REQUEST ActionRequest;\r
\r
+ if (FormSet->ConfigAccess == NULL) {\r
+ return;\r
+ }\r
+\r
Link = GetFirstNode (&Form->StatementListHead);\r
while (!IsNull (&Form->StatementListHead, Link)) {\r
Question = FORM_BROWSER_STATEMENT_FROM_LINK (Link);\r
EFI_HII_CONFIG_ACCESS_PROTOCOL *ConfigAccess;\r
EFI_BROWSER_ACTION_REQUEST ActionRequest;\r
INTN Action;\r
+ CHAR16 *NewString;\r
\r
Status = EFI_NOT_FOUND;\r
StrValue = NULL;\r
&ActionRequest\r
);\r
if (!EFI_ERROR (Status)) {\r
+ if (HiiValue->Type == EFI_IFR_TYPE_STRING) {\r
+ NewString = GetToken (Question->HiiValue.Value.string, FormSet->HiiHandle);\r
+ ASSERT (NewString != NULL);\r
+\r
+ ASSERT (StrLen (NewString) * sizeof (CHAR16) <= Question->StorageWidth);\r
+ if (StrLen (NewString) * sizeof (CHAR16) <= Question->StorageWidth) {\r
+ CopyMem (Question->BufferValue, NewString, StrSize (NewString));\r
+ } else {\r
+ CopyMem (Question->BufferValue, NewString, Question->StorageWidth);\r
+ }\r
+\r
+ FreePool (NewString);\r
+ }\r
return Status;\r
}\r
}\r
//\r
// Call the Retrieve call back to get the initial question value.\r
//\r
- Status = ProcessRetrieveForQuestion(FormSet->ConfigAccess, Question);\r
+ Status = ProcessRetrieveForQuestion(FormSet->ConfigAccess, Question, FormSet);\r
}\r
\r
//\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
FreePool (Storage->BrowserStorage->ConfigRequest);\r
+ Storage->BrowserStorage->ConfigRequest = NULL;\r
}\r
Storage->BrowserStorage->Initialized = FALSE;\r
}\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
+ ASSERT (NextRequestElement != NULL);\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
+ ASSERT (NextRequestElement != NULL);\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
-\r
- //\r
- // Create the config request string to get all fields for this storage.\r
- // Allocate and fill a buffer large enough to hold the <ConfigHdr> template\r
- // followed by "&OFFSET=0&WIDTH=WWWW"followed by a Null-terminator\r
- //\r
- StrLen = StrSize (Storage->BrowserStorage->ConfigHdr) + 20 * sizeof (CHAR16);\r
- ConfigRequest = AllocateZeroPool (StrLen);\r
- ASSERT (ConfigRequest != NULL);\r
- UnicodeSPrint (\r
- ConfigRequest, \r
- StrLen, \r
- L"%s&OFFSET=0&WIDTH=%04x", \r
- Storage->BrowserStorage->ConfigHdr,\r
- Storage->BrowserStorage->Size);\r
break;\r
\r
case EFI_HII_VARSTORE_BUFFER:\r
case EFI_HII_VARSTORE_NAME_VALUE:\r
//\r
- // Skip if there is no RequestElement or data has initilized.\r
+ // Skip if there is no RequestElement.\r
//\r
- if (Storage->ElementCount == 0 || Storage->BrowserStorage->Initialized) {\r
+ if (Storage->ElementCount == 0) {\r
return;\r
}\r
+\r
+ //\r
+ // Just update the ConfigRequest, if storage already initialized. \r
+ //\r
+ if (Storage->BrowserStorage->Initialized) {\r
+ ConfigRequestAdjust(Storage->BrowserStorage, Storage->ConfigRequest, FALSE);\r
+ return;\r
+ }\r
+\r
Storage->BrowserStorage->Initialized = TRUE;\r
- ConfigRequest = Storage->ConfigRequest;\r
break;\r
\r
default:\r
return;\r
}\r
\r
+ if (Storage->BrowserStorage->Type != EFI_HII_VARSTORE_NAME_VALUE) {\r
+ //\r
+ // Create the config request string to get all fields for this storage.\r
+ // Allocate and fill a buffer large enough to hold the <ConfigHdr> template\r
+ // followed by "&OFFSET=0&WIDTH=WWWW"followed by a Null-terminator\r
+ //\r
+ StrLen = StrSize (Storage->BrowserStorage->ConfigHdr) + 20 * sizeof (CHAR16);\r
+ ConfigRequest = AllocateZeroPool (StrLen);\r
+ ASSERT (ConfigRequest != NULL);\r
+ UnicodeSPrint (\r
+ ConfigRequest, \r
+ StrLen, \r
+ L"%s&OFFSET=0&WIDTH=%04x", \r
+ Storage->BrowserStorage->ConfigHdr,\r
+ Storage->BrowserStorage->Size);\r
+ } else {\r
+ ConfigRequest = Storage->ConfigRequest;\r
+ }\r
+\r
//\r
// Request current settings from Configuration Driver\r
//\r
//\r
SynchronizeStorage(FormSet, Storage->BrowserStorage, NULL, TRUE);\r
\r
- if (Storage->BrowserStorage->Type == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER) {\r
+ if (Storage->BrowserStorage->Type != EFI_HII_VARSTORE_NAME_VALUE) {\r
if (ConfigRequest != NULL) {\r
FreePool (ConfigRequest);\r
}\r