]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Enhance the check for options in the question.
authorydong10 <ydong10@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 10 Sep 2012 08:29:32 +0000 (08:29 +0000)
committerydong10 <ydong10@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 10 Sep 2012 08:29:32 +0000 (08:29 +0000)
Signed-off-by: Eric Dong <eric.dong@intel.com>
Reviewed-by: Liming Gao <liming.gao@intel.com>
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13711 6f19259b-4bc3-4df7-8a09-765794883524

MdeModulePkg/Universal/SetupBrowserDxe/InputHandler.c
MdeModulePkg/Universal/SetupBrowserDxe/ProcessOptions.c
MdeModulePkg/Universal/SetupBrowserDxe/Setup.c
MdeModulePkg/Universal/SetupBrowserDxe/Ui.h

index 81190464cb325aa4f4555813139f8593f9366a24..720efb9a04331f927d9785792570dff0dd9a841e 100644 (file)
@@ -987,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
+        RemoveEntryList (&OneOfOption->Link);\r
+        InsertHeadList (&Question->OptionListHead, &OneOfOption->Link);\r
+        PopUpMenuLines++;\r
+      }\r
+    }\r
   }\r
 \r
   //\r
@@ -1310,7 +1311,6 @@ TheKey:
           }\r
         }\r
 \r
-        FreePool (HiiValueArray);\r
         return EFI_DEVICE_ERROR;\r
 \r
       default:\r
@@ -1328,6 +1328,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
@@ -1335,8 +1341,6 @@ TheKey:
           if (Index > Question->MaxContainers) {\r
             break;\r
           }\r
-\r
-          Link = GetNextNode (&Question->OptionListHead, Link);\r
         }\r
       } else {\r
         ASSERT (CurrentOption != NULL);\r
@@ -1344,7 +1348,6 @@ 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
index 181afec16d836dd02b621880bdfa5fa1d356eba1..fecb98e8bf9a275b2716f8298803b22c012062b4 100644 (file)
@@ -91,7 +91,13 @@ ValueToOption (
     Option = QUESTION_OPTION_FROM_LINK (Link);\r
 \r
     if ((CompareHiiValue (&Option->Value, OptionValue, &Result, NULL) == EFI_SUCCESS) && (Result == 0)) {\r
-      return Option;\r
+      //\r
+      // Check the suppressif condition, only a valid option can be return.\r
+      //\r
+      if ((Option->SuppressExpression == NULL) ||\r
+          ((EvaluateExpressionList(Option->SuppressExpression, FALSE, NULL, NULL) == ExpressFalse))) {\r
+        return Option;\r
+      }\r
     }\r
 \r
     Link = GetNextNode (&Question->OptionListHead, Link);\r
@@ -190,6 +196,47 @@ SetArrayData (
   }\r
 }\r
 \r
+/**\r
+  Check whether this value already in the array, if yes, return the index.\r
+\r
+  @param  Array                  The data array.\r
+  @param  Type                   Type of the data in this array.\r
+  @param  Value                  The value to be find.\r
+  @param  Index                  The index in the array which has same value with Value.\r
+  \r
+  @retval   TRUE Found the value in the array.\r
+  @retval   FALSE Not found the value.\r
+\r
+**/\r
+BOOLEAN \r
+FindArrayData (\r
+  IN VOID                     *Array,\r
+  IN UINT8                    Type,\r
+  IN UINT64                   Value,\r
+  OUT UINTN                   *Index OPTIONAL\r
+  )\r
+{\r
+  UINTN  Count;\r
+  UINT64 TmpValue;\r
+  \r
+  ASSERT (Array != NULL);\r
+\r
+  Count    = 0;\r
+  TmpValue = 0;\r
+\r
+  while ((TmpValue = GetArrayData (Array, Type, Count)) != 0) {\r
+    if (Value == TmpValue) {\r
+      if (Index != NULL) {\r
+        *Index = Count;\r
+      }\r
+      return TRUE;\r
+    }\r
+\r
+    Count ++;\r
+  }\r
+\r
+  return FALSE;\r
+}\r
 \r
 /**\r
   Print Question Value according to it's storage width and display attributes.\r
@@ -396,7 +443,6 @@ ProcessOptions (
   LIST_ENTRY                      *Link;\r
   EFI_HII_VALUE                   HiiValue;\r
   EFI_HII_VALUE                   *QuestionValue;\r
-  BOOLEAN                         Suppress;\r
   UINT16                          Maximum;\r
   QUESTION_OPTION                 *Option;\r
   UINTN                           Index2;\r
@@ -476,9 +522,13 @@ ProcessOptions (
           Index2 = 0;\r
           while (!IsNull (&Question->OptionListHead, Link) && Index2 < Question->MaxContainers) {\r
             Option = QUESTION_OPTION_FROM_LINK (Link);\r
+            Link = GetNextNode (&Question->OptionListHead, Link);\r
+            if ((Option->SuppressExpression != NULL) &&\r
+                ((EvaluateExpressionList(Option->SuppressExpression, FALSE, NULL, NULL) == ExpressSuppress))) {\r
+              continue;\r
+            }\r
             SetArrayData (ValueArray, ValueType, Index2, Option->Value.Value.u64);\r
             Index2++;\r
-            Link = GetNextNode (&Question->OptionListHead, Link);\r
           }\r
           SetArrayData (ValueArray, ValueType, Index2, 0);\r
 \r
@@ -490,28 +540,46 @@ ProcessOptions (
           return EFI_NOT_FOUND;\r
         }\r
 \r
-        Suppress = FALSE;\r
+        Character[0] = LEFT_ONEOF_DELIMITER;\r
+        NewStrCat (OptionString[0], Character);\r
+        StringPtr = GetToken (OneOfOption->Text, Selection->Handle);\r
+        ASSERT (StringPtr != NULL);\r
+        NewStrCat (OptionString[0], StringPtr);\r
+        Character[0] = RIGHT_ONEOF_DELIMITER;\r
+        NewStrCat (OptionString[0], Character);\r
+        Character[0] = CHAR_CARRIAGE_RETURN;\r
+        NewStrCat (OptionString[0], Character);\r
+        FreePool (StringPtr);\r
+      }\r
+\r
+      //\r
+      // Search the other options, try to find the one not in the container.\r
+      //\r
+      Link = GetFirstNode (&Question->OptionListHead);\r
+      while (!IsNull (&Question->OptionListHead, Link)) {\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) == ExpressSuppress)) {\r
-          //\r
-          // This option is suppressed\r
-          //\r
-          Suppress = TRUE;\r
+            ((EvaluateExpressionList(OneOfOption->SuppressExpression, FALSE, NULL, NULL) == ExpressSuppress))) {\r
+          continue;\r
         }\r
 \r
-        if (!Suppress) {\r
-          Character[0] = LEFT_ONEOF_DELIMITER;\r
-          NewStrCat (OptionString[0], Character);\r
-          StringPtr = GetToken (OneOfOption->Text, Selection->Handle);\r
-          ASSERT (StringPtr != NULL);\r
-          NewStrCat (OptionString[0], StringPtr);\r
-          Character[0] = RIGHT_ONEOF_DELIMITER;\r
-          NewStrCat (OptionString[0], Character);\r
-          Character[0] = CHAR_CARRIAGE_RETURN;\r
-          NewStrCat (OptionString[0], Character);\r
-\r
-          FreePool (StringPtr);\r
+        if (FindArrayData (ValueArray, ValueType, OneOfOption->Value.Value.u64, NULL)) {\r
+          continue;\r
         }\r
+\r
+        SetArrayData (ValueArray, ValueType, Index++, OneOfOption->Value.Value.u64);\r
+\r
+        Character[0] = LEFT_ONEOF_DELIMITER;\r
+        NewStrCat (OptionString[0], Character);\r
+        StringPtr = GetToken (OneOfOption->Text, Selection->Handle);\r
+        ASSERT (StringPtr != NULL);\r
+        NewStrCat (OptionString[0], StringPtr);\r
+        Character[0] = RIGHT_ONEOF_DELIMITER;\r
+        NewStrCat (OptionString[0], Character);\r
+        Character[0] = CHAR_CARRIAGE_RETURN;\r
+        NewStrCat (OptionString[0], Character);\r
+        FreePool (StringPtr);\r
       }\r
     }\r
     break;\r
@@ -564,50 +632,15 @@ ProcessOptions (
         return EFI_NOT_FOUND;\r
       }\r
 \r
-      if ((OneOfOption->SuppressExpression != NULL) &&\r
-          ((EvaluateExpressionList(OneOfOption->SuppressExpression, FALSE, NULL, NULL) == ExpressSuppress))) {\r
-        //\r
-        // This option is suppressed\r
-        //\r
-        Suppress = TRUE;\r
-      } else {\r
-        Suppress = FALSE;\r
-      }\r
-\r
-      if (Suppress) {\r
-        //\r
-        // Current selected option happen to be suppressed,\r
-        // enforce to select on a non-suppressed option\r
-        //\r
-        Link = GetFirstNode (&Question->OptionListHead);\r
-        while (!IsNull (&Question->OptionListHead, Link)) {\r
-          OneOfOption = QUESTION_OPTION_FROM_LINK (Link);\r
+      Character[0] = LEFT_ONEOF_DELIMITER;\r
+      NewStrCat (OptionString[0], Character);\r
+      StringPtr = GetToken (OneOfOption->Text, Selection->Handle);\r
+      ASSERT (StringPtr != NULL);\r
+      NewStrCat (OptionString[0], StringPtr);\r
+      Character[0] = RIGHT_ONEOF_DELIMITER;\r
+      NewStrCat (OptionString[0], Character);\r
 \r
-          if ((OneOfOption->SuppressExpression == NULL) ||\r
-              (EvaluateExpressionList(OneOfOption->SuppressExpression, FALSE, NULL, NULL) == ExpressFalse)) {\r
-            Suppress = FALSE;\r
-            CopyMem (QuestionValue, &OneOfOption->Value, sizeof (EFI_HII_VALUE));\r
-            SetQuestionValue (Selection->FormSet, Selection->Form, Question, GetSetValueWithEditBuffer);\r
-            UpdateStatusBar (Selection, NV_UPDATE_REQUIRED, Question->QuestionFlags, TRUE);\r
-            gST->ConOut->SetAttribute (gST->ConOut, PcdGet8 (PcdBrowserFieldTextColor) | FIELD_BACKGROUND);\r
-            break;\r
-          }\r
-\r
-          Link = GetNextNode (&Question->OptionListHead, Link);\r
-        }\r
-      }\r
-\r
-      if (!Suppress) {\r
-        Character[0] = LEFT_ONEOF_DELIMITER;\r
-        NewStrCat (OptionString[0], Character);\r
-        StringPtr = GetToken (OneOfOption->Text, Selection->Handle);\r
-        ASSERT (StringPtr != NULL);\r
-        NewStrCat (OptionString[0], StringPtr);\r
-        Character[0] = RIGHT_ONEOF_DELIMITER;\r
-        NewStrCat (OptionString[0], Character);\r
-\r
-        FreePool (StringPtr);\r
-      }\r
+      FreePool (StringPtr);\r
     }\r
     break;\r
 \r
index ed7f015d663eb454fe7d6f332b9d85bb64def07c..381cefeae5937690e40442d22a4175b9486fefcb 100644 (file)
@@ -3026,6 +3026,12 @@ GetQuestionDefault (
       Link = GetFirstNode (&Question->OptionListHead);\r
       while (!IsNull (&Question->OptionListHead, Link)) {\r
         Option = QUESTION_OPTION_FROM_LINK (Link);\r
+        Link = GetNextNode (&Question->OptionListHead, Link);\r
+\r
+        if ((Option->SuppressExpression != NULL) &&\r
+            EvaluateExpressionList(Option->SuppressExpression, FALSE, NULL, NULL) != ExpressFalse) {\r
+          continue;\r
+        }\r
 \r
         if (((DefaultId == EFI_HII_DEFAULT_CLASS_STANDARD) && ((Option->Flags & EFI_IFR_OPTION_DEFAULT) != 0)) ||\r
             ((DefaultId == EFI_HII_DEFAULT_CLASS_MANUFACTURING) && ((Option->Flags & EFI_IFR_OPTION_DEFAULT_MFG) != 0))\r
@@ -3034,8 +3040,6 @@ GetQuestionDefault (
 \r
           return EFI_SUCCESS;\r
         }\r
-\r
-        Link = GetNextNode (&Question->OptionListHead, Link);\r
       }\r
     }\r
   }\r
@@ -3081,10 +3085,18 @@ GetQuestionDefault (
     //\r
     if (ValueToOption (Question, HiiValue) == NULL) {\r
       Link = GetFirstNode (&Question->OptionListHead);\r
-      if (!IsNull (&Question->OptionListHead, Link)) {\r
+      while (!IsNull (&Question->OptionListHead, Link)) {\r
         Option = QUESTION_OPTION_FROM_LINK (Link);\r
+        Link = GetNextNode (&Question->OptionListHead, Link);\r
+\r
+        if ((Option->SuppressExpression != NULL) &&\r
+            EvaluateExpressionList(Option->SuppressExpression, FALSE, NULL, NULL) != ExpressFalse) {\r
+          continue;\r
+        }\r
+\r
         CopyMem (HiiValue, &Option->Value, sizeof (EFI_HII_VALUE));\r
         Status = EFI_SUCCESS;\r
+        break;\r
       }\r
     }\r
     break;\r
@@ -3098,6 +3110,12 @@ GetQuestionDefault (
     while (!IsNull (&Question->OptionListHead, Link)) {\r
       Status = EFI_SUCCESS;\r
       Option = QUESTION_OPTION_FROM_LINK (Link);\r
+      Link = GetNextNode (&Question->OptionListHead, Link);\r
+\r
+      if ((Option->SuppressExpression != NULL) &&\r
+          EvaluateExpressionList(Option->SuppressExpression, FALSE, NULL, NULL) != ExpressFalse) {\r
+        continue;\r
+      }\r
 \r
       SetArrayData (Question->BufferValue, Question->ValueType, Index, Option->Value.Value.u64);\r
 \r
@@ -3105,8 +3123,6 @@ GetQuestionDefault (
       if (Index >= Question->MaxContainers) {\r
         break;\r
       }\r
-\r
-      Link = GetNextNode (&Question->OptionListHead, Link);\r
     }\r
     break;\r
 \r
index fca33b71e567ef13fe9df082286c823663f43159..ac016bbed828dc39bce8a316d36364b153dbc882 100644 (file)
@@ -578,6 +578,26 @@ SetArrayData (
   IN UINT64                   Value\r
   );\r
 \r
+/**\r
+  Check whether this value already in the array, if yes, return the index.\r
+\r
+  @param  Array                  The data array.\r
+  @param  Type                   Type of the data in this array.\r
+  @param  Value                  The value to be find.\r
+  @param  Index                  The index in the array which has same value with Value.\r
+  \r
+  @retval   TRUE Found the value in the array.\r
+  @retval   FALSE Not found the value.\r
+\r
+**/\r
+BOOLEAN \r
+FindArrayData (\r
+  IN VOID                     *Array,\r
+  IN UINT8                    Type,\r
+  IN UINT64                   Value,\r
+  OUT UINTN                   *Index OPTIONAL\r
+  );\r
+\r
 /**\r
   Process a Question's Option (whether selected or un-selected).\r
 \r