]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/SetupBrowserDxe/InputHandler.c
Refine the logic about processing options for oneof opcode.
[mirror_edk2.git] / MdeModulePkg / Universal / SetupBrowserDxe / InputHandler.c
index 5f857845aad177282a96dc31cfa421ef50adc7a2..844590770a68d9a867bf4294dc189a48dad2dc67 100644 (file)
@@ -726,6 +726,16 @@ TheKey2:
 EnterCarriageReturn:\r
 \r
     case CHAR_CARRIAGE_RETURN:\r
+      //\r
+      // Validate input value with Minimum value.\r
+      //\r
+      if (EditValue < Minimum) {\r
+        UpdateStatusBar (Selection, INPUT_ERROR, Question->QuestionFlags, TRUE);\r
+        break;\r
+      } else {\r
+        UpdateStatusBar (Selection, INPUT_ERROR, Question->QuestionFlags, FALSE);\r
+      }\r
+\r
       //\r
       // Store Edit value back to Question\r
       //\r
@@ -789,9 +799,9 @@ EnterCarriageReturn:
         //\r
         // Input value is not valid, restore Question Value\r
         //\r
-        GetQuestionValue (FormSet, Form, Question, TRUE);\r
+        GetQuestionValue (FormSet, Form, Question, GetSetValueWithEditBuffer);\r
       } else {\r
-        SetQuestionValue (FormSet, Form, Question, TRUE);\r
+        SetQuestionValue (FormSet, Form, Question, GetSetValueWithEditBuffer);\r
         if (!DateOrTime || (Question->Storage != NULL)) {\r
           //\r
           // NV flag is unnecessary for RTC type of Date/Time\r
@@ -977,48 +987,49 @@ GetSelectionInputPopUp (
   }\r
 \r
   //\r
-  // Prepare HiiValue array\r
+  // Move valid Option to list head.\r
   //\r
-  HiiValueArray = AllocateZeroPool (OptionCount * sizeof (EFI_HII_VALUE));\r
-  ASSERT (HiiValueArray != NULL);\r
-  Link = GetFirstNode (&Question->OptionListHead);\r
-  for (Index = 0; Index < OptionCount; Index++) {\r
-    if (OrderedList) {\r
+  PopUpMenuLines = 0;\r
+  if (OrderedList) {\r
+    //\r
+    // Prepare HiiValue array\r
+    //  \r
+    HiiValueArray = AllocateZeroPool (OptionCount * sizeof (EFI_HII_VALUE));\r
+    ASSERT (HiiValueArray != NULL);\r
+    for (Index = 0; Index < OptionCount; Index++) {\r
       HiiValueArray[Index].Type = ValueType;\r
       HiiValueArray[Index].Value.u64 = GetArrayData (ValueArray, ValueType, Index);\r
-    } else {\r
-      OneOfOption = QUESTION_OPTION_FROM_LINK (Link);\r
-      CopyMem (&HiiValueArray[Index], &OneOfOption->Value, sizeof (EFI_HII_VALUE));\r
-      Link = GetNextNode (&Question->OptionListHead, Link);\r
     }\r
-  }\r
 \r
-  //\r
-  // Move Suppressed Option to list tail\r
-  //\r
-  PopUpMenuLines = 0;\r
-  for (Index = 0; Index < OptionCount; Index++) {\r
-    OneOfOption = ValueToOption (Question, &HiiValueArray[OptionCount - Index - 1]);\r
-    if (OneOfOption == NULL) {\r
-      return EFI_NOT_FOUND;\r
-    }\r
+    for (Index = 0; Index < OptionCount; Index++) {\r
+      OneOfOption = ValueToOption (Question, &HiiValueArray[OptionCount - Index - 1]);\r
+      if (OneOfOption == NULL) {\r
+        return EFI_NOT_FOUND;\r
+      }\r
 \r
-    RemoveEntryList (&OneOfOption->Link);\r
+      RemoveEntryList (&OneOfOption->Link);\r
 \r
-    if ((OneOfOption->SuppressExpression != NULL) &&\r
-        EvaluateExpressionList(OneOfOption->SuppressExpression, FALSE, NULL, NULL) != ExpressFalse) {\r
       //\r
-      // This option is suppressed, insert to tail\r
-      //\r
-      InsertTailList (&Question->OptionListHead, &OneOfOption->Link);\r
-    } else {\r
-      //\r
-      // Insert to head\r
+      // Insert to head.\r
       //\r
       InsertHeadList (&Question->OptionListHead, &OneOfOption->Link);\r
 \r
       PopUpMenuLines++;\r
     }\r
+\r
+    FreePool (HiiValueArray);\r
+  } else {\r
+    Link = GetFirstNode (&Question->OptionListHead);\r
+    for (Index = 0; Index < OptionCount; Index++) {\r
+      OneOfOption = QUESTION_OPTION_FROM_LINK (Link);\r
+      Link = GetNextNode (&Question->OptionListHead, Link);\r
+      if ((OneOfOption->SuppressExpression != NULL) &&\r
+          EvaluateExpressionList(OneOfOption->SuppressExpression, FALSE, NULL, NULL) > ExpressFalse) {\r
+        continue;\r
+      } else {\r
+        PopUpMenuLines++;\r
+      }\r
+    }\r
   }\r
 \r
   //\r
@@ -1029,6 +1040,13 @@ GetSelectionInputPopUp (
   Link = GetFirstNode (&Question->OptionListHead);\r
   for (Index = 0; Index < PopUpMenuLines; Index++) {\r
     OneOfOption = QUESTION_OPTION_FROM_LINK (Link);\r
+    Link = GetNextNode (&Question->OptionListHead, Link);\r
+\r
+    if (!OrderedList && (OneOfOption->SuppressExpression != NULL) &&\r
+        EvaluateExpressionList(OneOfOption->SuppressExpression, FALSE, NULL, NULL) > ExpressFalse) {\r
+      Index--;\r
+      continue;\r
+    }\r
 \r
     StringPtr = GetToken (OneOfOption->Text, MenuOption->Handle);\r
     if (StrLen (StringPtr) > PopUpWidth) {\r
@@ -1042,8 +1060,6 @@ GetSelectionInputPopUp (
       //\r
       HighlightOptionIndex = Index;\r
     }\r
-\r
-    Link = GetNextNode (&Question->OptionListHead, Link);\r
   }\r
 \r
   //\r
@@ -1112,6 +1128,13 @@ GetSelectionInputPopUp (
     Link = GetFirstNode (&Question->OptionListHead);\r
     for (Index = 0; Index < TopOptionIndex; Index++) {\r
       Link = GetNextNode (&Question->OptionListHead, Link);\r
+\r
+      OneOfOption = QUESTION_OPTION_FROM_LINK (Link);\r
+      if (!OrderedList && (OneOfOption->SuppressExpression != NULL) &&\r
+          EvaluateExpressionList(OneOfOption->SuppressExpression, FALSE, NULL, NULL) > ExpressFalse) {\r
+        Index--;\r
+        continue;\r
+      }\r
     }\r
 \r
     //\r
@@ -1122,6 +1145,12 @@ GetSelectionInputPopUp (
       OneOfOption = QUESTION_OPTION_FROM_LINK (Link);\r
       Link = GetNextNode (&Question->OptionListHead, Link);\r
 \r
+      if (!OrderedList && (OneOfOption->SuppressExpression != NULL) &&\r
+          EvaluateExpressionList(OneOfOption->SuppressExpression, FALSE, NULL, NULL) > ExpressFalse) {\r
+        Index--;\r
+        continue;\r
+      }\r
+\r
       StringPtr = GetToken (OneOfOption->Text, MenuOption->Handle);\r
       ASSERT (StringPtr != NULL);\r
       //\r
@@ -1300,7 +1329,6 @@ TheKey:
           }\r
         }\r
 \r
-        FreePool (HiiValueArray);\r
         return EFI_DEVICE_ERROR;\r
 \r
       default:\r
@@ -1318,6 +1346,12 @@ TheKey:
         Link = GetFirstNode (&Question->OptionListHead);\r
         while (!IsNull (&Question->OptionListHead, Link)) {\r
           OneOfOption = QUESTION_OPTION_FROM_LINK (Link);\r
+          Link = GetNextNode (&Question->OptionListHead, Link);\r
+\r
+          if ((OneOfOption->SuppressExpression != NULL) &&\r
+              EvaluateExpressionList(OneOfOption->SuppressExpression, FALSE, NULL, NULL) != ExpressFalse) {\r
+            continue;\r
+          }\r
 \r
           SetArrayData (ValueArray, ValueType, Index, OneOfOption->Value.Value.u64);\r
 \r
@@ -1325,8 +1359,6 @@ TheKey:
           if (Index > Question->MaxContainers) {\r
             break;\r
           }\r
-\r
-          Link = GetNextNode (&Question->OptionListHead, Link);\r
         }\r
       } else {\r
         ASSERT (CurrentOption != NULL);\r
@@ -1334,16 +1366,15 @@ TheKey:
       }\r
 \r
       gST->ConOut->SetAttribute (gST->ConOut, SavedAttribute);\r
-      FreePool (HiiValueArray);\r
 \r
       Status = ValidateQuestion (Selection->FormSet, Selection->Form, Question, EFI_HII_EXPRESSION_INCONSISTENT_IF);\r
       if (EFI_ERROR (Status)) {\r
         //\r
         // Input value is not valid, restore Question Value\r
         //\r
-        GetQuestionValue (Selection->FormSet, Selection->Form, Question, TRUE);\r
+        GetQuestionValue (Selection->FormSet, Selection->Form, Question, GetSetValueWithEditBuffer);\r
       } else {\r
-        SetQuestionValue (Selection->FormSet, Selection->Form, Question, TRUE);\r
+        SetQuestionValue (Selection->FormSet, Selection->Form, Question, GetSetValueWithEditBuffer);\r
         UpdateStatusBar (Selection, NV_UPDATE_REQUIRED, Question->QuestionFlags, TRUE);\r
       }\r
 \r
@@ -1371,10 +1402,17 @@ WaitForKeyStroke (
 {\r
   EFI_STATUS  Status;\r
 \r
-  do {\r
-    UiWaitForSingleEvent (gST->ConIn->WaitForKey, 0, 0);\r
+  while (TRUE) {\r
     Status = gST->ConIn->ReadKeyStroke (gST->ConIn, Key);\r
-  } while (EFI_ERROR(Status));\r
+    if (!EFI_ERROR (Status)) {\r
+      break;\r
+    }\r
+\r
+    if (Status != EFI_NOT_READY) {\r
+      continue;\r
+    }\r
 \r
+    UiWaitForSingleEvent (gST->ConIn->WaitForKey, 0, 0);\r
+  }\r
   return Status;\r
 }\r