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
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
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
+ BrowserStatus = BROWSER_SUCCESS;\r
+ ErrorStr = NULL;\r
\r
- if (Type == EFI_HII_EXPRESSION_NO_SUBMIT_IF) {\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
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_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
Link = GetNextNode (&Form->StatementListHead, Link);\r
}\r
\r