-/**\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