]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/SetupBrowserDxe/Setup.c
Fix GCC build fail.
[mirror_edk2.git] / MdeModulePkg / Universal / SetupBrowserDxe / Setup.c
index 26cbd234c677cf405293f8fdcef2487529fd6dc2..fb988d9ed636cceb8611ee2c9b2777a6e42a723d 100644 (file)
@@ -63,8 +63,6 @@ CHAR16            *mUnknownString = L"!";
 \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
@@ -310,6 +308,49 @@ LoadAllHiiFormset (
   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
@@ -425,19 +466,6 @@ SendForm (
     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
@@ -1920,12 +1948,28 @@ ValidateQuestion (
   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
@@ -1941,19 +1985,43 @@ ValidateQuestion (
       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
@@ -1962,6 +2030,50 @@ ValidateQuestion (
   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