LIST_ENTRY gBrowserHotKeyList = INITIALIZE_LIST_HEAD_VARIABLE (gBrowserHotKeyList);\r
LIST_ENTRY gBrowserStorageList = INITIALIZE_LIST_HEAD_VARIABLE (gBrowserStorageList);\r
\r
-BOOLEAN gFinishRetrieveCall;\r
BOOLEAN gResetRequired;\r
BOOLEAN gExitRequired;\r
BROWSER_SETTING_SCOPE gBrowserSettingScope = FormSetLevel;\r
\r
EFI_GUID gZeroGuid = {0, 0, 0, {0, 0, 0, 0, 0, 0, 0, 0}};\r
\r
-extern UINT32 gBrowserStatus;\r
-extern CHAR16 *gErrorInfo;\r
extern EFI_GUID mCurrentFormSetGuid;\r
extern EFI_HII_HANDLE mCurrentHiiHandle;\r
extern UINT16 mCurrentFormId;\r
EFI_GUID ZeroGuid;\r
EFI_STATUS Status;\r
FORM_BROWSER_FORMSET *OldFormset;\r
- BOOLEAN OldRetrieveValue;\r
\r
OldFormset = mSystemLevelFormSet;\r
- OldRetrieveValue = gFinishRetrieveCall;\r
- gFinishRetrieveCall = FALSE;\r
\r
//\r
// Get all the Hii handles\r
//\r
FreePool (HiiHandles);\r
\r
- gFinishRetrieveCall = OldRetrieveValue;\r
mSystemLevelFormSet = OldFormset;\r
}\r
\r
+/**\r
+ Pop up the error info.\r
+\r
+ @param BrowserStatus The input browser status.\r
+ @param OpCode The opcode use to get the erro info and timeout value.\r
+ @param ErrorString Error string used by BROWSER_NO_SUBMIT_IF.\r
+\r
+**/\r
+VOID\r
+PopupErrorMessage (\r
+ IN UINT32 BrowserStatus,\r
+ IN EFI_IFR_OP_HEADER *OpCode, OPTIONAL\r
+ IN CHAR16 *ErrorString\r
+ )\r
+{\r
+ FORM_DISPLAY_ENGINE_STATEMENT *Statement;\r
+\r
+ Statement = NULL;\r
+\r
+ if (OpCode != NULL) {\r
+ Statement = AllocateZeroPool (sizeof(FORM_DISPLAY_ENGINE_STATEMENT));\r
+ ASSERT (Statement != NULL);\r
+ Statement->OpCode = OpCode;\r
+ gDisplayFormData.HighLightedStatement = Statement;\r
+ }\r
+\r
+ //\r
+ // Used to compatible with old display engine.\r
+ // New display engine not use this field.\r
+ //\r
+ gDisplayFormData.ErrorString = ErrorString;\r
+ gDisplayFormData.BrowserStatus = BrowserStatus;\r
+ \r
+ mFormDisplay->FormDisplay (&gDisplayFormData, NULL);\r
+\r
+ gDisplayFormData.BrowserStatus = BROWSER_SUCCESS;\r
+ gDisplayFormData.ErrorString = NULL;\r
+\r
+ if (OpCode != NULL) {\r
+ FreePool (Statement);\r
+ }\r
+}\r
+\r
/**\r
This is the routine which an external caller uses to direct the browser\r
where to obtain it's information.\r
//\r
SaveBrowserContext ();\r
\r
- gFinishRetrieveCall = FALSE;\r
gResetRequired = FALSE;\r
gExitRequired = FALSE;\r
Status = EFI_SUCCESS;\r
//\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
FreePool (Selection);\r
}\r
\r
- //\r
- // Still has error info, pop up a message.\r
- //\r
- if (gBrowserStatus != BROWSER_SUCCESS) {\r
- gDisplayFormData.BrowserStatus = gBrowserStatus;\r
- gDisplayFormData.ErrorString = gErrorInfo;\r
-\r
- gBrowserStatus = BROWSER_SUCCESS;\r
- gErrorInfo = NULL;\r
-\r
- mFormDisplay->FormDisplay (&gDisplayFormData, NULL);\r
- }\r
-\r
if (ActionRequest != NULL) {\r
*ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;\r
if (gResetRequired) {\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
// \r
CopyMem (Storage->Buffer + Question->VarStoreInfo.VarOffset, Src, StorageWidth);\r
}\r
- //\r
- // Check whether question value has been changed.\r
- //\r
- if (CompareMem (Storage->Buffer + Question->VarStoreInfo.VarOffset, Storage->EditBuffer + Question->VarStoreInfo.VarOffset, StorageWidth) != 0) {\r
- Question->ValueChanged = TRUE;\r
- } else {\r
- Question->ValueChanged = FALSE;\r
- }\r
} else {\r
if (IsString) {\r
//\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
- //\r
- // Check whether question value has been changed.\r
- //\r
- if (StrCmp (Node->Value, Node->EditValue) != 0) {\r
- Question->ValueChanged = TRUE;\r
- } else {\r
- Question->ValueChanged = FALSE;\r
- }\r
}\r
} else if (SetValueTo == GetSetValueWithHiiDriver) {\r
//\r
EFI_STATUS Status;\r
LIST_ENTRY *Link;\r
LIST_ENTRY *ListHead;\r
- EFI_STRING PopUp;\r
FORM_EXPRESSION *Expression;\r
+ UINT32 BrowserStatus;\r
+ CHAR16 *ErrorStr;\r
\r
- if (Type == EFI_HII_EXPRESSION_NO_SUBMIT_IF) {\r
+ BrowserStatus = BROWSER_SUCCESS;\r
+ ErrorStr = NULL;\r
+\r
+ switch (Type) {\r
+ case EFI_HII_EXPRESSION_INCONSISTENT_IF:\r
+ ListHead = &Question->InconsistentListHead;\r
+ break;\r
+\r
+ case EFI_HII_EXPRESSION_WARNING_IF:\r
+ ListHead = &Question->WarningListHead;\r
+ break;\r
+\r
+ case EFI_HII_EXPRESSION_NO_SUBMIT_IF:\r
ListHead = &Question->NoSubmitListHead;\r
- } else {\r
+ break;\r
+\r
+ default:\r
+ ASSERT (FALSE);\r
return EFI_UNSUPPORTED;\r
}\r
\r
return Status;\r
}\r
\r
- if ((Expression->Result.Type == EFI_IFR_TYPE_BOOLEAN) && Expression->Result.Value.b) {\r
- //\r
- // Condition meet, show up error message\r
- //\r
- if (Expression->Error != 0) {\r
- PopUp = GetToken (Expression->Error, FormSet->HiiHandle);\r
- if (Type == EFI_HII_EXPRESSION_NO_SUBMIT_IF) {\r
- gBrowserStatus = BROWSER_NO_SUBMIT_IF;\r
- gErrorInfo = PopUp;\r
+ if (IsTrue (&Expression->Result)) {\r
+ switch (Type) {\r
+ case EFI_HII_EXPRESSION_INCONSISTENT_IF:\r
+ BrowserStatus = BROWSER_INCONSISTENT_IF;\r
+ break;\r
+\r
+ case EFI_HII_EXPRESSION_WARNING_IF:\r
+ BrowserStatus = BROWSER_WARNING_IF;\r
+ break;\r
+\r
+ case EFI_HII_EXPRESSION_NO_SUBMIT_IF:\r
+ BrowserStatus = BROWSER_NO_SUBMIT_IF;\r
+ //\r
+ // This code only used to compatible with old display engine,\r
+ // New display engine will not use this field.\r
+ //\r
+ if (Expression->Error != 0) {\r
+ ErrorStr = GetToken (Expression->Error, FormSet->HiiHandle);\r
}\r
+ break;\r
+\r
+ default:\r
+ ASSERT (FALSE);\r
+ break;\r
}\r
\r
- return EFI_NOT_READY;\r
+ PopupErrorMessage(BrowserStatus, Expression->OpCode, ErrorStr);\r
+\r
+ if (ErrorStr != NULL) {\r
+ FreePool (ErrorStr);\r
+ }\r
+\r
+ if (Type == EFI_HII_EXPRESSION_WARNING_IF) {\r
+ return EFI_SUCCESS;\r
+ } else {\r
+ return EFI_NOT_READY;\r
+ }\r
}\r
\r
Link = GetNextNode (ListHead, Link);\r
return EFI_SUCCESS;\r
}\r
\r
+/**\r
+ Perform question check. \r
+ \r
+ If one question has more than one check, process form high priority to low. \r
+ Only one error info will be popup.\r
+\r
+ @param FormSet FormSet data structure.\r
+ @param Form Form data structure.\r
+ @param Question The Question to be validated.\r
+\r
+ @retval EFI_SUCCESS Form validation pass.\r
+ @retval other Form validation failed.\r
+\r
+**/\r
+EFI_STATUS\r
+ValueChangedValidation (\r
+ IN FORM_BROWSER_FORMSET *FormSet,\r
+ IN FORM_BROWSER_FORM *Form,\r
+ IN FORM_BROWSER_STATEMENT *Question\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+\r
+ Status = EFI_SUCCESS;\r
+\r
+ //\r
+ // Do the inconsistentif check.\r
+ //\r
+ if (!IsListEmpty (&Question->InconsistentListHead)) {\r
+ Status = ValidateQuestion (FormSet, Form, Question, EFI_HII_EXPRESSION_INCONSISTENT_IF);\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+ }\r
+\r
+ //\r
+ // Do the warningif check.\r
+ //\r
+ if (!IsListEmpty (&Question->WarningListHead)) {\r
+ Status = ValidateQuestion (FormSet, Form, Question, EFI_HII_EXPRESSION_WARNING_IF);\r
+ }\r
+\r
+ return Status;\r
+}\r
\r
/**\r
Perform NoSubmit check for each Form in FormSet.\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
continue;\r
}\r
\r
+ if ((Question->QuestionFlags & EFI_IFR_FLAG_CALLBACK) != EFI_IFR_FLAG_CALLBACK) {\r
+ continue;\r
+ }\r
+\r
if (Question->Operand == EFI_IFR_PASSWORD_OP) {\r
continue;\r
}\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
FreePool (BackUpBuffer);\r
}\r
\r
+ Question->ValueChanged = ValueChanged;\r
+\r
return ValueChanged;\r
}\r
\r
EFI_STATUS Status;\r
LIST_ENTRY *Link;\r
FORM_BROWSER_STATEMENT *Question;\r
- UINT8 *BufferValue;\r
- UINTN StorageWidth;\r
\r
Link = GetFirstNode (&Form->StatementListHead);\r
while (!IsNull (&Form->StatementListHead, Link)) {\r
HiiSetString (FormSet->HiiHandle, Question->HiiValue.Value.string, (CHAR16*)Question->BufferValue, NULL);\r
}\r
\r
- //\r
- // Call the Retrieve call back function for all questions.\r
- //\r
- if ((FormSet->ConfigAccess != NULL) && (Selection != NULL) &&\r
- ((Question->QuestionFlags & EFI_IFR_FLAG_CALLBACK) == EFI_IFR_FLAG_CALLBACK) &&\r
- !gFinishRetrieveCall) {\r
- //\r
- // Check QuestionValue does exist.\r
- //\r
- StorageWidth = Question->StorageWidth;\r
- if (Question->BufferValue != NULL) {\r
- BufferValue = Question->BufferValue;\r
- } else {\r
- BufferValue = (UINT8 *) &Question->HiiValue.Value;\r
- }\r
-\r
- //\r
- // For efivarstore storage, initial question value first.\r
- //\r
- if ((Question->Storage != NULL) && (Question->Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE)) {\r
- Status = gRT->GetVariable (\r
- Question->VariableName,\r
- &Question->Storage->Guid,\r
- NULL,\r
- &StorageWidth,\r
- BufferValue\r
- );\r
- }\r
-\r
- Status = ProcessCallBackFunction(Selection, FormSet, Form, Question, EFI_BROWSER_ACTION_RETRIEVE, TRUE);\r
- }\r
-\r
- //\r
- // Update Question Value changed flag.\r
- //\r
- Question->ValueChanged = IsQuestionValueChanged(FormSet, Form, Question, GetSetValueWithBuffer);\r
-\r
Link = GetNextNode (&Form->StatementListHead, Link);\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
}\r
}\r
\r
+/**\r
+ Get Value changed status from old question.\r
+\r
+ @param NewFormSet FormSet data structure.\r
+ @param OldQuestion Old question which has value changed.\r
+\r
+**/\r
+VOID\r
+SyncStatusForQuestion (\r
+ IN OUT FORM_BROWSER_FORMSET *NewFormSet,\r
+ IN FORM_BROWSER_STATEMENT *OldQuestion\r
+ )\r
+{\r
+ LIST_ENTRY *Link;\r
+ LIST_ENTRY *QuestionLink;\r
+ FORM_BROWSER_FORM *Form;\r
+ FORM_BROWSER_STATEMENT *Question;\r
+\r
+ //\r
+ // For each form in one formset.\r
+ //\r
+ Link = GetFirstNode (&NewFormSet->FormListHead);\r
+ while (!IsNull (&NewFormSet->FormListHead, Link)) {\r
+ Form = FORM_BROWSER_FORM_FROM_LINK (Link);\r
+ Link = GetNextNode (&NewFormSet->FormListHead, Link);\r
+\r
+ //\r
+ // for each question in one form.\r
+ //\r
+ QuestionLink = GetFirstNode (&Form->StatementListHead);\r
+ while (!IsNull (&Form->StatementListHead, QuestionLink)) {\r
+ Question = FORM_BROWSER_STATEMENT_FROM_LINK (QuestionLink);\r
+ QuestionLink = GetNextNode (&Form->StatementListHead, QuestionLink);\r
+\r
+ if (Question->QuestionId == OldQuestion->QuestionId) {\r
+ Question->ValueChanged = TRUE;\r
+ return;\r
+ }\r
+ }\r
+ }\r
+}\r
+\r
+/**\r
+ Get Value changed status from old formset.\r
+\r
+ @param NewFormSet FormSet data structure.\r
+ @param OldFormSet FormSet data structure.\r
+\r
+**/\r
+VOID\r
+SyncStatusForFormSet (\r
+ IN OUT FORM_BROWSER_FORMSET *NewFormSet,\r
+ IN FORM_BROWSER_FORMSET *OldFormSet\r
+ )\r
+{\r
+ LIST_ENTRY *Link;\r
+ LIST_ENTRY *QuestionLink;\r
+ FORM_BROWSER_FORM *Form;\r
+ FORM_BROWSER_STATEMENT *Question;\r
+\r
+ //\r
+ // For each form in one formset.\r
+ //\r
+ Link = GetFirstNode (&OldFormSet->FormListHead);\r
+ while (!IsNull (&OldFormSet->FormListHead, Link)) {\r
+ Form = FORM_BROWSER_FORM_FROM_LINK (Link);\r
+ Link = GetNextNode (&OldFormSet->FormListHead, Link);\r
+\r
+ //\r
+ // for each question in one form.\r
+ //\r
+ QuestionLink = GetFirstNode (&Form->StatementListHead);\r
+ while (!IsNull (&Form->StatementListHead, QuestionLink)) {\r
+ Question = FORM_BROWSER_STATEMENT_FROM_LINK (QuestionLink);\r
+ QuestionLink = GetNextNode (&Form->StatementListHead, QuestionLink);\r
+\r
+ if (!Question->ValueChanged) {\r
+ continue;\r
+ }\r
+\r
+ //\r
+ // Find the same question in new formset and update the value changed flag.\r
+ //\r
+ SyncStatusForQuestion (NewFormSet, Question);\r
+ }\r
+ }\r
+}\r
+\r
/**\r
Get current setting of Questions.\r
\r
//\r
OldFormSet = GetFormSetFromHiiHandle (FormSet->HiiHandle);\r
if (OldFormSet != NULL) {\r
+ SyncStatusForFormSet (FormSet, OldFormSet);\r
RemoveEntryList (&OldFormSet->Link);\r
DestroyFormSet (OldFormSet);\r
}\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
+ UpdateStatementStatus (FormSet, Form, gBrowserSettingScope);\r
}\r
\r
//\r