return FALSE;\r
}\r
\r
-/**\r
- Check whether the storage data for current form set is changed.\r
-\r
- @param FormSet FormSet data structure.\r
-\r
- @retval TRUE Data is changed.\r
- @retval FALSE Data is not changed.\r
-**/\r
-BOOLEAN \r
-IsStorageDataChangedForFormSet (\r
- IN FORM_BROWSER_FORMSET *FormSet\r
- )\r
-{\r
- LIST_ENTRY *Link;\r
- FORMSET_STORAGE *Storage;\r
- BROWSER_STORAGE *BrowserStorage;\r
- CHAR16 *ConfigRespNew;\r
- CHAR16 *ConfigRespOld;\r
- BOOLEAN RetVal;\r
-\r
- RetVal = FALSE;\r
- ConfigRespNew = NULL;\r
- ConfigRespOld = NULL;\r
-\r
- //\r
- // Request current settings from Configuration Driver\r
- //\r
- Link = GetFirstNode (&FormSet->StorageListHead);\r
- while (!IsNull (&FormSet->StorageListHead, Link)) {\r
- Storage = FORMSET_STORAGE_FROM_LINK (Link);\r
- Link = GetNextNode (&FormSet->StorageListHead, Link);\r
-\r
- BrowserStorage = Storage->BrowserStorage;\r
-\r
- if (BrowserStorage->Type == EFI_HII_VARSTORE_EFI_VARIABLE) {\r
- continue;\r
- }\r
-\r
- if (Storage->ElementCount == 0) {\r
- continue;\r
- }\r
-\r
- StorageToConfigResp (BrowserStorage, &ConfigRespNew, Storage->ConfigRequest, TRUE);\r
- StorageToConfigResp (BrowserStorage, &ConfigRespOld, Storage->ConfigRequest, FALSE);\r
- ASSERT (ConfigRespNew != NULL && ConfigRespOld != NULL);\r
-\r
- if (StrCmp (ConfigRespNew, ConfigRespOld) != 0) {\r
- RetVal = TRUE;\r
- }\r
-\r
- FreePool (ConfigRespNew);\r
- ConfigRespNew = NULL;\r
-\r
- FreePool (ConfigRespOld);\r
- ConfigRespOld = NULL;\r
-\r
- if (RetVal) {\r
- break;\r
- }\r
- }\r
-\r
- return RetVal;\r
-}\r
-\r
/**\r
Find menu which will show next time.\r
\r
BROWSER_SETTING_SCOPE SettingLevel;\r
EFI_IFR_TYPE_VALUE BackUpValue;\r
UINT8 *BackUpBuffer;\r
+ CHAR16 *NewString;\r
\r
ConfigAccess = FormSet->ConfigAccess;\r
SubmitFormIsRequired = FALSE;\r
}\r
}\r
\r
+ //\r
+ // Need to sync the value between Statement->HiiValue->Value and Statement->BufferValue\r
+ //\r
+ if (HiiValue->Type == EFI_IFR_TYPE_STRING) {\r
+ NewString = GetToken (Statement->HiiValue.Value.string, FormSet->HiiHandle);\r
+ ASSERT (NewString != NULL);\r
+\r
+ ASSERT (StrLen (NewString) * sizeof (CHAR16) <= Statement->StorageWidth);\r
+ if (StrLen (NewString) * sizeof (CHAR16) <= Statement->StorageWidth) {\r
+ CopyMem (Statement->BufferValue, NewString, StrSize (NewString));\r
+ } else {\r
+ CopyMem (Statement->BufferValue, NewString, Statement->StorageWidth);\r
+ }\r
+ FreePool (NewString);\r
+ }\r
+\r
//\r
// According the spec, return value from call back of "changing" and \r
// "retrieve" should update to the question's temp buffer.\r
\r
@param ConfigAccess The config access protocol produced by the hii driver.\r
@param Statement The Question which need to call.\r
+ @param FormSet The formset this question belong to.\r
\r
@retval EFI_SUCCESS The call back function excutes successfully.\r
@return Other value if the call back function failed to excute. \r
EFI_STATUS \r
ProcessRetrieveForQuestion (\r
IN EFI_HII_CONFIG_ACCESS_PROTOCOL *ConfigAccess,\r
- IN FORM_BROWSER_STATEMENT *Statement\r
+ IN FORM_BROWSER_STATEMENT *Statement,\r
+ IN FORM_BROWSER_FORMSET *FormSet\r
)\r
{\r
EFI_STATUS Status;\r
EFI_BROWSER_ACTION_REQUEST ActionRequest;\r
EFI_HII_VALUE *HiiValue;\r
EFI_IFR_TYPE_VALUE *TypeValue;\r
+ CHAR16 *NewString;\r
\r
Status = EFI_SUCCESS;\r
ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;\r
- \r
- if ((Statement->QuestionFlags & EFI_IFR_FLAG_CALLBACK) != EFI_IFR_FLAG_CALLBACK) {\r
+\r
+ if (((Statement->QuestionFlags & EFI_IFR_FLAG_CALLBACK) != EFI_IFR_FLAG_CALLBACK) || ConfigAccess == NULL) {\r
return EFI_UNSUPPORTED;\r
}\r
\r
TypeValue,\r
&ActionRequest\r
);\r
+ if (!EFI_ERROR (Status) && HiiValue->Type == EFI_IFR_TYPE_STRING) {\r
+ NewString = GetToken (Statement->HiiValue.Value.string, FormSet->HiiHandle);\r
+ ASSERT (NewString != NULL);\r
+\r
+ ASSERT (StrLen (NewString) * sizeof (CHAR16) <= Statement->StorageWidth);\r
+ if (StrLen (NewString) * sizeof (CHAR16) <= Statement->StorageWidth) {\r
+ CopyMem (Statement->BufferValue, NewString, StrSize (NewString));\r
+ } else {\r
+ CopyMem (Statement->BufferValue, NewString, Statement->StorageWidth);\r
+ }\r
+ FreePool (NewString);\r
+ }\r
+\r
return Status;\r
}\r
\r
// for each question with callback flag.\r
// New form may be the first form, or the different form after another form close.\r
//\r
- if ((ConfigAccess != NULL) &&\r
- ((Selection->Handle != mCurrentHiiHandle) ||\r
+ if (((Selection->Handle != mCurrentHiiHandle) ||\r
(!CompareGuid (&Selection->FormSetGuid, &mCurrentFormSetGuid)) ||\r
(Selection->FormId != mCurrentFormId))) {\r
//\r
CopyGuid (&mCurrentFormSetGuid, &Selection->FormSetGuid);\r
mCurrentFormId = Selection->FormId;\r
\r
- Status = ProcessCallBackFunction (Selection, gCurrentSelection->FormSet, Selection->Form, NULL, EFI_BROWSER_ACTION_FORM_OPEN, FALSE);\r
- if (EFI_ERROR (Status)) {\r
- goto Done;\r
- }\r
+ if (ConfigAccess != NULL) {\r
+ Status = ProcessCallBackFunction (Selection, gCurrentSelection->FormSet, Selection->Form, NULL, EFI_BROWSER_ACTION_FORM_OPEN, FALSE);\r
+ if (EFI_ERROR (Status)) {\r
+ goto Done;\r
+ }\r
\r
- //\r
- // IFR is updated during callback of open form, force to reparse the IFR binary\r
- //\r
- if (mHiiPackageListUpdated) {\r
- Selection->Action = UI_ACTION_REFRESH_FORMSET;\r
- mHiiPackageListUpdated = FALSE;\r
- break;\r
+ //\r
+ // IFR is updated during callback of open form, force to reparse the IFR binary\r
+ //\r
+ if (mHiiPackageListUpdated) {\r
+ Selection->Action = UI_ACTION_REFRESH_FORMSET;\r
+ mHiiPackageListUpdated = FALSE;\r
+ break;\r
+ }\r
}\r
}\r
\r