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