UINT16 mCurrentFormId = 0;\r
EFI_EVENT mValueChangedEvent = NULL;\r
LIST_ENTRY mRefreshEventList = INITIALIZE_LIST_HEAD_VARIABLE (mRefreshEventList);\r
-UINT32 gBrowserStatus = BROWSER_SUCCESS;\r
-CHAR16 *gErrorInfo;\r
UINT16 mCurFakeQestId;\r
FORM_DISPLAY_ENGINE_FORM gDisplayFormData;\r
BOOLEAN mFinishRetrieveCall = FALSE;\r
InsertTailList(&mRefreshEventList, &EventNode->Link);\r
}\r
\r
-/**\r
- Perform value check for a question.\r
- \r
- @param Question The question need to do check.\r
- @param Type Condition type need to check.\r
- @param ErrorInfo Return info about the error.\r
- \r
- @retval The check result.\r
-**/\r
-UINT32\r
-ConditionCheck (\r
- IN FORM_BROWSER_STATEMENT *Question,\r
- IN UINT8 Type,\r
- OUT STATEMENT_ERROR_INFO *ErrorInfo\r
- )\r
-{\r
- EFI_STATUS Status;\r
- LIST_ENTRY *Link;\r
- FORM_EXPRESSION *Expression;\r
- LIST_ENTRY *ListHead;\r
- UINT32 RetVal;\r
-\r
- RetVal = STATEMENT_VALID;\r
- ListHead = 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
- default:\r
- ASSERT (FALSE);\r
- return RetVal;\r
- }\r
-\r
- ASSERT (ListHead != NULL);\r
- Link = GetFirstNode (ListHead);\r
- while (!IsNull (ListHead, Link)) {\r
- Expression = FORM_EXPRESSION_FROM_LINK (Link);\r
- Link = GetNextNode (ListHead, Link);\r
-\r
- //\r
- // Evaluate the expression\r
- //\r
- Status = EvaluateExpression (gCurrentSelection->FormSet, gCurrentSelection->Form, Expression);\r
- if (EFI_ERROR (Status)) {\r
- continue;\r
- }\r
-\r
- if ((Expression->Result.Type == EFI_IFR_TYPE_BOOLEAN) && Expression->Result.Value.b) {\r
- ErrorInfo->StringId = Expression->Error;\r
- switch (Type) {\r
- case EFI_HII_EXPRESSION_INCONSISTENT_IF:\r
- ErrorInfo->TimeOut = 0;\r
- RetVal = INCOSISTENT_IF_TRUE;\r
- break;\r
-\r
- case EFI_HII_EXPRESSION_WARNING_IF:\r
- ErrorInfo->TimeOut = Expression->TimeOut;\r
- RetVal = WARNING_IF_TRUE;\r
- break;\r
-\r
- default:\r
- ASSERT (FALSE);\r
- break;\r
- }\r
- break;\r
- }\r
- }\r
-\r
- return RetVal;\r
-}\r
-\r
-/**\r
- Perform value check for a question.\r
- \r
- @param Form Form where Statement is in.\r
- @param Statement Value will check for it.\r
- @param InputValue New value will be checked.\r
- @param ErrorInfo Return the error info for this check.\r
- \r
- @retval TRUE Input Value is valid.\r
- @retval FALSE Input Value is invalid.\r
-**/\r
-UINT32\r
-EFIAPI\r
-QuestionCheck (\r
- IN FORM_DISPLAY_ENGINE_FORM *Form,\r
- IN FORM_DISPLAY_ENGINE_STATEMENT *Statement,\r
- IN EFI_HII_VALUE *InputValue,\r
- OUT STATEMENT_ERROR_INFO *ErrorInfo\r
- )\r
-{\r
- FORM_BROWSER_STATEMENT *Question;\r
- EFI_HII_VALUE BackUpValue;\r
- UINT8 *BackUpBuffer;\r
- UINT32 RetVal;\r
-\r
- BackUpBuffer = NULL;\r
- RetVal = STATEMENT_VALID;\r
-\r
- ASSERT (Form != NULL && Statement != NULL && InputValue != NULL && ErrorInfo != NULL);\r
-\r
- Question = GetBrowserStatement(Statement);\r
- ASSERT (Question != NULL);\r
-\r
- //\r
- // Back up the quesion value.\r
- //\r
- switch (Question->Operand) {\r
- case EFI_IFR_ORDERED_LIST_OP:\r
- BackUpBuffer = AllocateCopyPool (Question->StorageWidth, Question->BufferValue);\r
- ASSERT (BackUpBuffer != NULL);\r
- CopyMem (Question->BufferValue, InputValue->Buffer, Question->StorageWidth);\r
- break;\r
-\r
- default:\r
- CopyMem (&BackUpValue, &Question->HiiValue, sizeof (EFI_HII_VALUE));\r
- CopyMem (&Question->HiiValue, InputValue, sizeof (EFI_HII_VALUE));\r
- break;\r
- }\r
-\r
- //\r
- // Do the inconsistentif check.\r
- //\r
- if (!IsListEmpty (&Question->InconsistentListHead)) {\r
- RetVal = ConditionCheck(Question, EFI_HII_EXPRESSION_INCONSISTENT_IF, ErrorInfo);\r
- }\r
-\r
- //\r
- // Do the warningif check.\r
- //\r
- if (RetVal == STATEMENT_VALID && !IsListEmpty (&Question->WarningListHead)) {\r
- RetVal = ConditionCheck(Question, EFI_HII_EXPRESSION_WARNING_IF, ErrorInfo);\r
- }\r
-\r
- //\r
- // Restore the quesion value.\r
- //\r
- switch (Question->Operand) {\r
- case EFI_IFR_ORDERED_LIST_OP:\r
- CopyMem (Question->BufferValue, BackUpBuffer, Question->StorageWidth);\r
- break;\r
-\r
- default:\r
- CopyMem (&Question->HiiValue, &BackUpValue, sizeof (EFI_HII_VALUE));\r
- break;\r
- }\r
-\r
- return RetVal;\r
-}\r
-\r
/**\r
\r
Initialize the Display statement structure data.\r
DisplayStatement->PasswordCheck = PasswordCheck;\r
}\r
\r
- //\r
- // Save the validate check question for later use.\r
- //\r
- if (!IsListEmpty (&Statement->InconsistentListHead) || !IsListEmpty (&Statement->WarningListHead)) {\r
- DisplayStatement->ValidateQuestion = QuestionCheck;\r
- }\r
-\r
//\r
// If this statement is nest in the subtitle, insert to the host statement.\r
// else insert to the form it belongs to.\r
gDisplayFormData.FormRefreshEvent = NULL;\r
gDisplayFormData.HighLightedStatement = NULL;\r
\r
- gDisplayFormData.BrowserStatus = gBrowserStatus;\r
- gDisplayFormData.ErrorString = gErrorInfo;\r
-\r
- gBrowserStatus = BROWSER_SUCCESS;\r
- gErrorInfo = NULL;\r
-\r
UpdateDataChangedFlag ();\r
\r
AddStatementToDisplayForm ();\r
if ((Action & BROWSER_ACTION_SUBMIT) == BROWSER_ACTION_SUBMIT) {\r
Status = SubmitForm (gCurrentSelection->FormSet, gCurrentSelection->Form, gBrowserSettingScope);\r
if (EFI_ERROR (Status)) {\r
- gBrowserStatus = BROWSER_SUBMIT_FAIL;\r
+ PopupErrorMessage(BROWSER_SUBMIT_FAIL, NULL, NULL);\r
}\r
}\r
\r
//\r
// Not found the EFI_DEVICE_PATH_FROM_TEXT_PROTOCOL protocol.\r
//\r
- gBrowserStatus = BROWSER_PROTOCOL_NOT_FOUND;\r
+ PopupErrorMessage(BROWSER_PROTOCOL_NOT_FOUND, NULL, NULL);\r
FreePool (StringPtr);\r
return Status;\r
}\r
//\r
// Form is suppressed. \r
//\r
- gBrowserStatus = BROWSER_FORM_SUPPRESS;\r
+ PopupErrorMessage(BROWSER_FORM_SUPPRESS, NULL, NULL);\r
return EFI_SUCCESS;\r
}\r
}\r
&ActionRequest\r
);\r
if (!EFI_ERROR (Status)) {\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
// Only for EFI_BROWSER_ACTION_CHANGED need to handle this ActionRequest.\r
//\r
- if (Action == EFI_BROWSER_ACTION_CHANGED) {\r
+ switch (Action) {\r
+ case EFI_BROWSER_ACTION_CHANGED:\r
switch (ActionRequest) {\r
case EFI_BROWSER_ACTION_REQUEST_RESET:\r
DiscardFormIsRequired = TRUE;\r
default:\r
break;\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
+ break;\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
+ case EFI_BROWSER_ACTION_CHANGING:\r
+ //\r
+ // Do the question validation.\r
+ //\r
+ Status = ValueChangedValidation (gCurrentSelection->FormSet, gCurrentSelection->Form, Statement);\r
+ if (!EFI_ERROR (Status)) {\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
+ SetQuestionValue(FormSet, Form, Statement, GetSetValueWithEditBuffer);\r
}\r
- FreePool (NewString);\r
- }\r
+ break;\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
- if (Action == EFI_BROWSER_ACTION_CHANGING || Action == EFI_BROWSER_ACTION_RETRIEVE) {\r
+ case EFI_BROWSER_ACTION_RETRIEVE:\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
SetQuestionValue(FormSet, Form, Statement, GetSetValueWithEditBuffer);\r
+ break;\r
+\r
+ default:\r
+ break;\r
}\r
} else {\r
//\r
} else {\r
CopyMem (&HiiValue->Value, &BackUpValue, sizeof (EFI_IFR_TYPE_VALUE));\r
}\r
-\r
- SetQuestionValue(FormSet, Form, Statement, GetSetValueWithEditBuffer);\r
+ \r
+ //\r
+ // Do the question validation.\r
+ //\r
+ Status = ValueChangedValidation (gCurrentSelection->FormSet, gCurrentSelection->Form, Statement);\r
+ if (!EFI_ERROR (Status)) {\r
+ SetQuestionValue(FormSet, Form, Statement, GetSetValueWithEditBuffer);\r
+ }\r
}\r
\r
//\r
//\r
// Form is suppressed. \r
//\r
- gBrowserStatus = BROWSER_FORM_SUPPRESS;\r
+ PopupErrorMessage(BROWSER_FORM_SUPPRESS, NULL, NULL);\r
Status = EFI_NOT_FOUND;\r
goto Done;\r
}\r
if (!EFI_ERROR (Status) && Statement->Operand != EFI_IFR_REF_OP) {\r
ProcessCallBackFunction(Selection, Selection->FormSet, Selection->Form, Statement, EFI_BROWSER_ACTION_CHANGED, FALSE);\r
}\r
- } else if (Statement->Operand != EFI_IFR_PASSWORD_OP) {\r
- SetQuestionValue (gCurrentSelection->FormSet, gCurrentSelection->Form, Statement, GetSetValueWithEditBuffer);\r
+ } else {\r
//\r
- // Verify whether question value has checked, update the ValueChanged flag in Question.\r
+ // Do the question validation.\r
//\r
- IsQuestionValueChanged(gCurrentSelection->FormSet, gCurrentSelection->Form, Statement, GetSetValueWithBuffer);\r
+ Status = ValueChangedValidation (gCurrentSelection->FormSet, gCurrentSelection->Form, Statement);\r
+ if (!EFI_ERROR (Status) && (Statement->Operand != EFI_IFR_PASSWORD_OP)) {\r
+ SetQuestionValue (gCurrentSelection->FormSet, gCurrentSelection->Form, Statement, GetSetValueWithEditBuffer);\r
+ //\r
+ // Verify whether question value has checked, update the ValueChanged flag in Question.\r
+ //\r
+ IsQuestionValueChanged(gCurrentSelection->FormSet, gCurrentSelection->Form, Statement, GetSetValueWithBuffer);\r
+ }\r
}\r
\r
//\r