Revision: 13711
          http://edk2.svn.sourceforge.net/edk2/?rev=13711&view=rev
Author:   ydong10
Date:     2012-09-10 08:29:32 +0000 (Mon, 10 Sep 2012)
Log Message:
-----------
Enhance the check for options in the question.

Signed-off-by: Eric Dong <[email protected]>
Reviewed-by: Liming Gao <[email protected]>

Modified Paths:
--------------
    trunk/edk2/MdeModulePkg/Universal/SetupBrowserDxe/InputHandler.c
    trunk/edk2/MdeModulePkg/Universal/SetupBrowserDxe/ProcessOptions.c
    trunk/edk2/MdeModulePkg/Universal/SetupBrowserDxe/Setup.c
    trunk/edk2/MdeModulePkg/Universal/SetupBrowserDxe/Ui.h

Modified: trunk/edk2/MdeModulePkg/Universal/SetupBrowserDxe/InputHandler.c
===================================================================
--- trunk/edk2/MdeModulePkg/Universal/SetupBrowserDxe/InputHandler.c    
2012-09-10 03:03:40 UTC (rev 13710)
+++ trunk/edk2/MdeModulePkg/Universal/SetupBrowserDxe/InputHandler.c    
2012-09-10 08:29:32 UTC (rev 13711)
@@ -987,48 +987,49 @@
   }
 
   //
-  // Prepare HiiValue array
+  // Move valid Option to list head.
   //
-  HiiValueArray = AllocateZeroPool (OptionCount * sizeof (EFI_HII_VALUE));
-  ASSERT (HiiValueArray != NULL);
-  Link = GetFirstNode (&Question->OptionListHead);
-  for (Index = 0; Index < OptionCount; Index++) {
-    if (OrderedList) {
+  PopUpMenuLines = 0;
+  if (OrderedList) {
+    //
+    // Prepare HiiValue array
+    //  
+    HiiValueArray = AllocateZeroPool (OptionCount * sizeof (EFI_HII_VALUE));
+    ASSERT (HiiValueArray != NULL);
+    for (Index = 0; Index < OptionCount; Index++) {
       HiiValueArray[Index].Type = ValueType;
       HiiValueArray[Index].Value.u64 = GetArrayData (ValueArray, ValueType, 
Index);
-    } else {
-      OneOfOption = QUESTION_OPTION_FROM_LINK (Link);
-      CopyMem (&HiiValueArray[Index], &OneOfOption->Value, sizeof 
(EFI_HII_VALUE));
-      Link = GetNextNode (&Question->OptionListHead, Link);
     }
-  }
 
-  //
-  // Move Suppressed Option to list tail
-  //
-  PopUpMenuLines = 0;
-  for (Index = 0; Index < OptionCount; Index++) {
-    OneOfOption = ValueToOption (Question, &HiiValueArray[OptionCount - Index 
- 1]);
-    if (OneOfOption == NULL) {
-      return EFI_NOT_FOUND;
-    }
+    for (Index = 0; Index < OptionCount; Index++) {
+      OneOfOption = ValueToOption (Question, &HiiValueArray[OptionCount - 
Index - 1]);
+      if (OneOfOption == NULL) {
+        return EFI_NOT_FOUND;
+      }
 
-    RemoveEntryList (&OneOfOption->Link);
+      RemoveEntryList (&OneOfOption->Link);
 
-    if ((OneOfOption->SuppressExpression != NULL) &&
-        EvaluateExpressionList(OneOfOption->SuppressExpression, FALSE, NULL, 
NULL) != ExpressFalse) {
       //
-      // This option is suppressed, insert to tail
+      // Insert to head.
       //
-      InsertTailList (&Question->OptionListHead, &OneOfOption->Link);
-    } else {
-      //
-      // Insert to head
-      //
       InsertHeadList (&Question->OptionListHead, &OneOfOption->Link);
 
       PopUpMenuLines++;
     }
+
+    FreePool (HiiValueArray);
+  } else {
+    Link = GetFirstNode (&Question->OptionListHead);
+    for (Index = 0; Index < OptionCount; Index++) {
+      OneOfOption = QUESTION_OPTION_FROM_LINK (Link);
+      Link = GetNextNode (&Question->OptionListHead, Link);
+      if ((OneOfOption->SuppressExpression == NULL) ||
+            EvaluateExpressionList(OneOfOption->SuppressExpression, FALSE, 
NULL, NULL) == ExpressFalse) {
+        RemoveEntryList (&OneOfOption->Link);
+        InsertHeadList (&Question->OptionListHead, &OneOfOption->Link);
+        PopUpMenuLines++;
+      }
+    }
   }
 
   //
@@ -1310,7 +1311,6 @@
           }
         }
 
-        FreePool (HiiValueArray);
         return EFI_DEVICE_ERROR;
 
       default:
@@ -1328,15 +1328,19 @@
         Link = GetFirstNode (&Question->OptionListHead);
         while (!IsNull (&Question->OptionListHead, Link)) {
           OneOfOption = QUESTION_OPTION_FROM_LINK (Link);
+          Link = GetNextNode (&Question->OptionListHead, Link);
 
+          if ((OneOfOption->SuppressExpression != NULL) &&
+              EvaluateExpressionList(OneOfOption->SuppressExpression, FALSE, 
NULL, NULL) != ExpressFalse) {
+            continue;
+          }
+
           SetArrayData (ValueArray, ValueType, Index, 
OneOfOption->Value.Value.u64);
 
           Index++;
           if (Index > Question->MaxContainers) {
             break;
           }
-
-          Link = GetNextNode (&Question->OptionListHead, Link);
         }
       } else {
         ASSERT (CurrentOption != NULL);
@@ -1344,7 +1348,6 @@
       }
 
       gST->ConOut->SetAttribute (gST->ConOut, SavedAttribute);
-      FreePool (HiiValueArray);
 
       Status = ValidateQuestion (Selection->FormSet, Selection->Form, 
Question, EFI_HII_EXPRESSION_INCONSISTENT_IF);
       if (EFI_ERROR (Status)) {

Modified: trunk/edk2/MdeModulePkg/Universal/SetupBrowserDxe/ProcessOptions.c
===================================================================
--- trunk/edk2/MdeModulePkg/Universal/SetupBrowserDxe/ProcessOptions.c  
2012-09-10 03:03:40 UTC (rev 13710)
+++ trunk/edk2/MdeModulePkg/Universal/SetupBrowserDxe/ProcessOptions.c  
2012-09-10 08:29:32 UTC (rev 13711)
@@ -91,7 +91,13 @@
     Option = QUESTION_OPTION_FROM_LINK (Link);
 
     if ((CompareHiiValue (&Option->Value, OptionValue, &Result, NULL) == 
EFI_SUCCESS) && (Result == 0)) {
-      return Option;
+      //
+      // Check the suppressif condition, only a valid option can be return.
+      //
+      if ((Option->SuppressExpression == NULL) ||
+          ((EvaluateExpressionList(Option->SuppressExpression, FALSE, NULL, 
NULL) == ExpressFalse))) {
+        return Option;
+      }
     }
 
     Link = GetNextNode (&Question->OptionListHead, Link);
@@ -190,7 +196,48 @@
   }
 }
 
+/**
+  Check whether this value already in the array, if yes, return the index.
 
+  @param  Array                  The data array.
+  @param  Type                   Type of the data in this array.
+  @param  Value                  The value to be find.
+  @param  Index                  The index in the array which has same value 
with Value.
+  
+  @retval   TRUE Found the value in the array.
+  @retval   FALSE Not found the value.
+
+**/
+BOOLEAN 
+FindArrayData (
+  IN VOID                     *Array,
+  IN UINT8                    Type,
+  IN UINT64                   Value,
+  OUT UINTN                   *Index OPTIONAL
+  )
+{
+  UINTN  Count;
+  UINT64 TmpValue;
+  
+  ASSERT (Array != NULL);
+
+  Count    = 0;
+  TmpValue = 0;
+
+  while ((TmpValue = GetArrayData (Array, Type, Count)) != 0) {
+    if (Value == TmpValue) {
+      if (Index != NULL) {
+        *Index = Count;
+      }
+      return TRUE;
+    }
+
+    Count ++;
+  }
+
+  return FALSE;
+}
+
 /**
   Print Question Value according to it's storage width and display attributes.
 
@@ -396,7 +443,6 @@
   LIST_ENTRY                      *Link;
   EFI_HII_VALUE                   HiiValue;
   EFI_HII_VALUE                   *QuestionValue;
-  BOOLEAN                         Suppress;
   UINT16                          Maximum;
   QUESTION_OPTION                 *Option;
   UINTN                           Index2;
@@ -476,9 +522,13 @@
           Index2 = 0;
           while (!IsNull (&Question->OptionListHead, Link) && Index2 < 
Question->MaxContainers) {
             Option = QUESTION_OPTION_FROM_LINK (Link);
+            Link = GetNextNode (&Question->OptionListHead, Link);
+            if ((Option->SuppressExpression != NULL) &&
+                ((EvaluateExpressionList(Option->SuppressExpression, FALSE, 
NULL, NULL) == ExpressSuppress))) {
+              continue;
+            }
             SetArrayData (ValueArray, ValueType, Index2, 
Option->Value.Value.u64);
             Index2++;
-            Link = GetNextNode (&Question->OptionListHead, Link);
           }
           SetArrayData (ValueArray, ValueType, Index2, 0);
 
@@ -490,28 +540,46 @@
           return EFI_NOT_FOUND;
         }
 
-        Suppress = FALSE;
+        Character[0] = LEFT_ONEOF_DELIMITER;
+        NewStrCat (OptionString[0], Character);
+        StringPtr = GetToken (OneOfOption->Text, Selection->Handle);
+        ASSERT (StringPtr != NULL);
+        NewStrCat (OptionString[0], StringPtr);
+        Character[0] = RIGHT_ONEOF_DELIMITER;
+        NewStrCat (OptionString[0], Character);
+        Character[0] = CHAR_CARRIAGE_RETURN;
+        NewStrCat (OptionString[0], Character);
+        FreePool (StringPtr);
+      }
+
+      //
+      // Search the other options, try to find the one not in the container.
+      //
+      Link = GetFirstNode (&Question->OptionListHead);
+      while (!IsNull (&Question->OptionListHead, Link)) {
+        OneOfOption = QUESTION_OPTION_FROM_LINK (Link);
+        Link = GetNextNode (&Question->OptionListHead, Link);
         if ((OneOfOption->SuppressExpression != NULL) &&
-            (EvaluateExpressionList(OneOfOption->SuppressExpression, FALSE, 
NULL, NULL) == ExpressSuppress)) {
-          //
-          // This option is suppressed
-          //
-          Suppress = TRUE;
+            ((EvaluateExpressionList(OneOfOption->SuppressExpression, FALSE, 
NULL, NULL) == ExpressSuppress))) {
+          continue;
         }
 
-        if (!Suppress) {
-          Character[0] = LEFT_ONEOF_DELIMITER;
-          NewStrCat (OptionString[0], Character);
-          StringPtr = GetToken (OneOfOption->Text, Selection->Handle);
-          ASSERT (StringPtr != NULL);
-          NewStrCat (OptionString[0], StringPtr);
-          Character[0] = RIGHT_ONEOF_DELIMITER;
-          NewStrCat (OptionString[0], Character);
-          Character[0] = CHAR_CARRIAGE_RETURN;
-          NewStrCat (OptionString[0], Character);
+        if (FindArrayData (ValueArray, ValueType, 
OneOfOption->Value.Value.u64, NULL)) {
+          continue;
+        }
 
-          FreePool (StringPtr);
-        }
+        SetArrayData (ValueArray, ValueType, Index++, 
OneOfOption->Value.Value.u64);
+
+        Character[0] = LEFT_ONEOF_DELIMITER;
+        NewStrCat (OptionString[0], Character);
+        StringPtr = GetToken (OneOfOption->Text, Selection->Handle);
+        ASSERT (StringPtr != NULL);
+        NewStrCat (OptionString[0], StringPtr);
+        Character[0] = RIGHT_ONEOF_DELIMITER;
+        NewStrCat (OptionString[0], Character);
+        Character[0] = CHAR_CARRIAGE_RETURN;
+        NewStrCat (OptionString[0], Character);
+        FreePool (StringPtr);
       }
     }
     break;
@@ -564,50 +632,15 @@
         return EFI_NOT_FOUND;
       }
 
-      if ((OneOfOption->SuppressExpression != NULL) &&
-          ((EvaluateExpressionList(OneOfOption->SuppressExpression, FALSE, 
NULL, NULL) == ExpressSuppress))) {
-        //
-        // This option is suppressed
-        //
-        Suppress = TRUE;
-      } else {
-        Suppress = FALSE;
-      }
+      Character[0] = LEFT_ONEOF_DELIMITER;
+      NewStrCat (OptionString[0], Character);
+      StringPtr = GetToken (OneOfOption->Text, Selection->Handle);
+      ASSERT (StringPtr != NULL);
+      NewStrCat (OptionString[0], StringPtr);
+      Character[0] = RIGHT_ONEOF_DELIMITER;
+      NewStrCat (OptionString[0], Character);
 
-      if (Suppress) {
-        //
-        // Current selected option happen to be suppressed,
-        // enforce to select on a non-suppressed option
-        //
-        Link = GetFirstNode (&Question->OptionListHead);
-        while (!IsNull (&Question->OptionListHead, Link)) {
-          OneOfOption = QUESTION_OPTION_FROM_LINK (Link);
-
-          if ((OneOfOption->SuppressExpression == NULL) ||
-              (EvaluateExpressionList(OneOfOption->SuppressExpression, FALSE, 
NULL, NULL) == ExpressFalse)) {
-            Suppress = FALSE;
-            CopyMem (QuestionValue, &OneOfOption->Value, sizeof 
(EFI_HII_VALUE));
-            SetQuestionValue (Selection->FormSet, Selection->Form, Question, 
GetSetValueWithEditBuffer);
-            UpdateStatusBar (Selection, NV_UPDATE_REQUIRED, 
Question->QuestionFlags, TRUE);
-            gST->ConOut->SetAttribute (gST->ConOut, PcdGet8 
(PcdBrowserFieldTextColor) | FIELD_BACKGROUND);
-            break;
-          }
-
-          Link = GetNextNode (&Question->OptionListHead, Link);
-        }
-      }
-
-      if (!Suppress) {
-        Character[0] = LEFT_ONEOF_DELIMITER;
-        NewStrCat (OptionString[0], Character);
-        StringPtr = GetToken (OneOfOption->Text, Selection->Handle);
-        ASSERT (StringPtr != NULL);
-        NewStrCat (OptionString[0], StringPtr);
-        Character[0] = RIGHT_ONEOF_DELIMITER;
-        NewStrCat (OptionString[0], Character);
-
-        FreePool (StringPtr);
-      }
+      FreePool (StringPtr);
     }
     break;
 

Modified: trunk/edk2/MdeModulePkg/Universal/SetupBrowserDxe/Setup.c
===================================================================
--- trunk/edk2/MdeModulePkg/Universal/SetupBrowserDxe/Setup.c   2012-09-10 
03:03:40 UTC (rev 13710)
+++ trunk/edk2/MdeModulePkg/Universal/SetupBrowserDxe/Setup.c   2012-09-10 
08:29:32 UTC (rev 13711)
@@ -3026,7 +3026,13 @@
       Link = GetFirstNode (&Question->OptionListHead);
       while (!IsNull (&Question->OptionListHead, Link)) {
         Option = QUESTION_OPTION_FROM_LINK (Link);
+        Link = GetNextNode (&Question->OptionListHead, Link);
 
+        if ((Option->SuppressExpression != NULL) &&
+            EvaluateExpressionList(Option->SuppressExpression, FALSE, NULL, 
NULL) != ExpressFalse) {
+          continue;
+        }
+
         if (((DefaultId == EFI_HII_DEFAULT_CLASS_STANDARD) && ((Option->Flags 
& EFI_IFR_OPTION_DEFAULT) != 0)) ||
             ((DefaultId == EFI_HII_DEFAULT_CLASS_MANUFACTURING) && 
((Option->Flags & EFI_IFR_OPTION_DEFAULT_MFG) != 0))
            ) {
@@ -3034,8 +3040,6 @@
 
           return EFI_SUCCESS;
         }
-
-        Link = GetNextNode (&Question->OptionListHead, Link);
       }
     }
   }
@@ -3081,10 +3085,18 @@
     //
     if (ValueToOption (Question, HiiValue) == NULL) {
       Link = GetFirstNode (&Question->OptionListHead);
-      if (!IsNull (&Question->OptionListHead, Link)) {
+      while (!IsNull (&Question->OptionListHead, Link)) {
         Option = QUESTION_OPTION_FROM_LINK (Link);
+        Link = GetNextNode (&Question->OptionListHead, Link);
+
+        if ((Option->SuppressExpression != NULL) &&
+            EvaluateExpressionList(Option->SuppressExpression, FALSE, NULL, 
NULL) != ExpressFalse) {
+          continue;
+        }
+
         CopyMem (HiiValue, &Option->Value, sizeof (EFI_HII_VALUE));
         Status = EFI_SUCCESS;
+        break;
       }
     }
     break;
@@ -3098,15 +3110,19 @@
     while (!IsNull (&Question->OptionListHead, Link)) {
       Status = EFI_SUCCESS;
       Option = QUESTION_OPTION_FROM_LINK (Link);
+      Link = GetNextNode (&Question->OptionListHead, Link);
 
+      if ((Option->SuppressExpression != NULL) &&
+          EvaluateExpressionList(Option->SuppressExpression, FALSE, NULL, 
NULL) != ExpressFalse) {
+        continue;
+      }
+
       SetArrayData (Question->BufferValue, Question->ValueType, Index, 
Option->Value.Value.u64);
 
       Index++;
       if (Index >= Question->MaxContainers) {
         break;
       }
-
-      Link = GetNextNode (&Question->OptionListHead, Link);
     }
     break;
 

Modified: trunk/edk2/MdeModulePkg/Universal/SetupBrowserDxe/Ui.h
===================================================================
--- trunk/edk2/MdeModulePkg/Universal/SetupBrowserDxe/Ui.h      2012-09-10 
03:03:40 UTC (rev 13710)
+++ trunk/edk2/MdeModulePkg/Universal/SetupBrowserDxe/Ui.h      2012-09-10 
08:29:32 UTC (rev 13711)
@@ -579,6 +579,26 @@
   );
 
 /**
+  Check whether this value already in the array, if yes, return the index.
+
+  @param  Array                  The data array.
+  @param  Type                   Type of the data in this array.
+  @param  Value                  The value to be find.
+  @param  Index                  The index in the array which has same value 
with Value.
+  
+  @retval   TRUE Found the value in the array.
+  @retval   FALSE Not found the value.
+
+**/
+BOOLEAN 
+FindArrayData (
+  IN VOID                     *Array,
+  IN UINT8                    Type,
+  IN UINT64                   Value,
+  OUT UINTN                   *Index OPTIONAL
+  );
+
+/**
   Process a Question's Option (whether selected or un-selected).
 
   @param  Selection              Pointer to UI_MENU_SELECTION.

This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.


------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
_______________________________________________
edk2-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-commits

Reply via email to