summaryrefslogtreecommitdiff
path: root/MdeModulePkg
diff options
context:
space:
mode:
authorlgao4 <lgao4@6f19259b-4bc3-4df7-8a09-765794883524>2009-11-12 01:16:12 +0000
committerlgao4 <lgao4@6f19259b-4bc3-4df7-8a09-765794883524>2009-11-12 01:16:12 +0000
commit0c66bc762aa186a78b3c6ce6c691af31bedec5fd (patch)
tree7ddf1adf4c526f1bdcf18381991d94c590aa0ec8 /MdeModulePkg
parent369d5f2e9801c9d768422c7b0acab9b12a00ba5b (diff)
downloadedk2-0c66bc762aa186a78b3c6ce6c691af31bedec5fd.zip
edk2-0c66bc762aa186a78b3c6ce6c691af31bedec5fd.tar.gz
edk2-0c66bc762aa186a78b3c6ce6c691af31bedec5fd.tar.bz2
Add SuppressIf form support in SetupBrowser driver.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@9417 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'MdeModulePkg')
-rw-r--r--MdeModulePkg/Universal/SetupBrowserDxe/IfrParse.c91
-rw-r--r--MdeModulePkg/Universal/SetupBrowserDxe/Presentation.c26
-rw-r--r--MdeModulePkg/Universal/SetupBrowserDxe/Setup.c3
-rw-r--r--MdeModulePkg/Universal/SetupBrowserDxe/Setup.h3
-rw-r--r--MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserStr.unibin11734 -> 12138 bytes
-rw-r--r--MdeModulePkg/Universal/SetupBrowserDxe/Ui.c34
6 files changed, 148 insertions, 9 deletions
diff --git a/MdeModulePkg/Universal/SetupBrowserDxe/IfrParse.c b/MdeModulePkg/Universal/SetupBrowserDxe/IfrParse.c
index d9193b9..141f953 100644
--- a/MdeModulePkg/Universal/SetupBrowserDxe/IfrParse.c
+++ b/MdeModulePkg/Universal/SetupBrowserDxe/IfrParse.c
@@ -652,6 +652,7 @@ DestroyFormSet (
LIST_ENTRY *Link;
FORMSET_STORAGE *Storage;
FORMSET_DEFAULTSTORE *DefaultStore;
+ FORM_EXPRESSION *Expression;
FORM_BROWSER_FORM *Form;
//
@@ -686,6 +687,17 @@ DestroyFormSet (
}
//
+ // Free Formset Expressions
+ //
+ while (!IsListEmpty (&FormSet->ExpressionListHead)) {
+ Link = GetFirstNode (&FormSet->ExpressionListHead);
+ Expression = FORM_EXPRESSION_FROM_LINK (Link);
+ RemoveEntryList (&Expression->Link);
+
+ DestroyExpression (Expression);
+ }
+
+ //
// Free Forms
//
if (FormSet->FormListHead.ForwardLink != NULL) {
@@ -815,9 +827,12 @@ ParseOpCodes (
UINT16 NumberOfStatement;
UINT16 NumberOfExpression;
EFI_IMAGE_ID *ImageId;
+ BOOLEAN SuppressForQuestion;
BOOLEAN SuppressForOption;
BOOLEAN InScopeOptionSuppress;
FORM_EXPRESSION *OptionSuppressExpression;
+ BOOLEAN InScopeFormSuppress;
+ FORM_EXPRESSION *FormSuppressExpression;
UINT16 DepthOfDisable;
BOOLEAN OpCodeDisabled;
BOOLEAN SingleOpCodeExpression;
@@ -825,7 +840,9 @@ ParseOpCodes (
EFI_HII_VALUE *Value;
mInScopeSubtitle = FALSE;
+ SuppressForQuestion = FALSE;
SuppressForOption = FALSE;
+ InScopeFormSuppress = FALSE;
mInScopeSuppress = FALSE;
InScopeOptionSuppress = FALSE;
mInScopeGrayOut = FALSE;
@@ -838,6 +855,7 @@ ParseOpCodes (
CurrentDefault = NULL;
CurrentOption = NULL;
OptionSuppressExpression = NULL;
+ FormSuppressExpression = NULL;
ImageId = NULL;
//
@@ -1086,6 +1104,8 @@ ParseOpCodes (
//
FormSet->NumberOfClassGuid = (UINT8) (((EFI_IFR_FORM_SET *) OpCodeData)->Flags & 0x3);
CopyMem (FormSet->ClassGuid, OpCodeData + sizeof (EFI_IFR_FORM_SET), FormSet->NumberOfClassGuid * sizeof (EFI_GUID));
+
+ InitializeListHead (&FormSet->ExpressionListHead);
break;
case EFI_IFR_FORM_OP:
@@ -1101,6 +1121,20 @@ ParseOpCodes (
CopyMem (&CurrentForm->FormId, &((EFI_IFR_FORM *) OpCodeData)->FormId, sizeof (UINT16));
CopyMem (&CurrentForm->FormTitle, &((EFI_IFR_FORM *) OpCodeData)->FormTitle, sizeof (EFI_STRING_ID));
+ if (InScopeFormSuppress) {
+ //
+ // Form is inside of suppressif
+ //
+ CurrentForm->SuppressExpression = FormSuppressExpression;
+ }
+
+ if (Scope != 0) {
+ //
+ // Enter scope of a Form, suppressif will be used for Question or Option
+ //
+ SuppressForQuestion = TRUE;
+ }
+
//
// Insert into Form list of this FormSet
//
@@ -1510,6 +1544,14 @@ ParseOpCodes (
CurrentExpression->Type = EFI_HII_EXPRESSION_INCONSISTENT_IF;
InsertTailList (&CurrentStatement->InconsistentListHead, &CurrentExpression->Link);
}
+
+ //
+ // Take a look at next OpCode to see whether current expression consists
+ // of single OpCode
+ //
+ if (((EFI_IFR_OP_HEADER *) (OpCodeData + OpCodeLength))->Scope == 0) {
+ SingleOpCodeExpression = TRUE;
+ }
break;
case EFI_IFR_SUPPRESS_IF_OP:
@@ -1518,14 +1560,30 @@ ParseOpCodes (
//
CurrentExpression = CreateExpression (CurrentForm);
CurrentExpression->Type = EFI_HII_EXPRESSION_SUPPRESS_IF;
- InsertTailList (&CurrentForm->ExpressionListHead, &CurrentExpression->Link);
+
+ if (CurrentForm == NULL) {
+ InsertTailList (&FormSet->ExpressionListHead, &CurrentExpression->Link);
+ } else {
+ InsertTailList (&CurrentForm->ExpressionListHead, &CurrentExpression->Link);
+ }
if (SuppressForOption) {
InScopeOptionSuppress = TRUE;
OptionSuppressExpression = CurrentExpression;
- } else {
+ } else if (SuppressForQuestion) {
mInScopeSuppress = TRUE;
mSuppressExpression = CurrentExpression;
+ } else {
+ InScopeFormSuppress = TRUE;
+ FormSuppressExpression = CurrentExpression;
+ }
+
+ //
+ // Take a look at next OpCode to see whether current expression consists
+ // of single OpCode
+ //
+ if (((EFI_IFR_OP_HEADER *) (OpCodeData + OpCodeLength))->Scope == 0) {
+ SingleOpCodeExpression = TRUE;
}
break;
@@ -1539,6 +1597,14 @@ ParseOpCodes (
mInScopeGrayOut = TRUE;
mGrayOutExpression = CurrentExpression;
+
+ //
+ // Take a look at next OpCode to see whether current expression consists
+ // of single OpCode
+ //
+ if (((EFI_IFR_OP_HEADER *) (OpCodeData + OpCodeLength))->Scope == 0) {
+ SingleOpCodeExpression = TRUE;
+ }
break;
case EFI_IFR_DISABLE_IF_OP:
@@ -1597,6 +1663,14 @@ ParseOpCodes (
ASSERT (CurrentStatement != NULL);
CurrentStatement->ValueExpression = CurrentExpression;
}
+
+ //
+ // Take a look at next OpCode to see whether current expression consists
+ // of single OpCode
+ //
+ if (((EFI_IFR_OP_HEADER *) (OpCodeData + OpCodeLength))->Scope == 0) {
+ SingleOpCodeExpression = TRUE;
+ }
break;
case EFI_IFR_RULE_OP:
@@ -1605,6 +1679,14 @@ ParseOpCodes (
CurrentExpression->RuleId = ((EFI_IFR_RULE *) OpCodeData)->RuleId;
InsertTailList (&CurrentForm->ExpressionListHead, &CurrentExpression->Link);
+
+ //
+ // Take a look at next OpCode to see whether current expression consists
+ // of single OpCode
+ //
+ if (((EFI_IFR_OP_HEADER *) (OpCodeData + OpCodeLength))->Scope == 0) {
+ SingleOpCodeExpression = TRUE;
+ }
break;
//
@@ -1722,6 +1804,7 @@ ParseOpCodes (
// End of Form
//
CurrentForm = NULL;
+ SuppressForQuestion = FALSE;
break;
case EFI_IFR_ONE_OF_OPTION_OP:
@@ -1745,8 +1828,10 @@ ParseOpCodes (
case EFI_IFR_SUPPRESS_IF_OP:
if (SuppressForOption) {
InScopeOptionSuppress = FALSE;
- } else {
+ } else if (SuppressForQuestion) {
mInScopeSuppress = FALSE;
+ } else {
+ InScopeFormSuppress = FALSE;
}
break;
diff --git a/MdeModulePkg/Universal/SetupBrowserDxe/Presentation.c b/MdeModulePkg/Universal/SetupBrowserDxe/Presentation.c
index 93267f0..9fd08c5 100644
--- a/MdeModulePkg/Universal/SetupBrowserDxe/Presentation.c
+++ b/MdeModulePkg/Universal/SetupBrowserDxe/Presentation.c
@@ -591,6 +591,7 @@ InitializeBrowserStrings (
gAdjustNumber = GetToken (STRING_TOKEN (ADJUST_NUMBER), gHiiHandle);
gSaveChanges = GetToken (STRING_TOKEN (SAVE_CHANGES), gHiiHandle);
gOptionMismatch = GetToken (STRING_TOKEN (OPTION_MISMATCH), gHiiHandle);
+ gFormSuppress = GetToken (STRING_TOKEN (FORM_SUPPRESSED), gHiiHandle);
return ;
}
@@ -632,6 +633,7 @@ FreeBrowserStrings (
FreePool (gAdjustNumber);
FreePool (gSaveChanges);
FreePool (gOptionMismatch);
+ FreePool (gFormSuppress);
return ;
}
@@ -858,6 +860,7 @@ SetupBrowser (
FORM_BROWSER_STATEMENT *Statement;
EFI_HII_CONFIG_ACCESS_PROTOCOL *ConfigAccess;
FORM_BROWSER_FORMSET *FormSet;
+ EFI_INPUT_KEY Key;
gMenuRefreshHead = NULL;
gResetRequired = FALSE;
@@ -919,6 +922,7 @@ SetupBrowser (
//
// IFR is updated during callback, force to reparse the IFR binary
//
+ mHiiPackageListUpdated = FALSE;
Selection->Action = UI_ACTION_REFRESH_FORMSET;
goto Done;
}
@@ -957,6 +961,27 @@ SetupBrowser (
}
//
+ // Check Form is suppressed.
+ //
+ if (Selection->Form->SuppressExpression != NULL) {
+ Status = EvaluateExpression (Selection->FormSet, Selection->Form, Selection->Form->SuppressExpression);
+ if (EFI_ERROR (Status)) {
+ return Status;
+ }
+
+ if (Selection->Form->SuppressExpression->Result.Value.b) {
+ //
+ // Form is suppressed.
+ //
+ do {
+ CreateDialog (4, TRUE, 0, NULL, &Key, gEmptyString, gFormSuppress, gPressEnter, gEmptyString);
+ } while (Key.UnicodeChar != CHAR_CARRIAGE_RETURN);
+
+ return EFI_NOT_FOUND;
+ }
+ }
+
+ //
// Load Questions' Value for display
//
Status = LoadFormSetConfig (Selection->FormSet);
@@ -1060,6 +1085,7 @@ SetupBrowser (
//
// Force to reparse IFR binary of target Formset
//
+ mHiiPackageListUpdated = FALSE;
Selection->Action = UI_ACTION_REFRESH_FORMSET;
}
}
diff --git a/MdeModulePkg/Universal/SetupBrowserDxe/Setup.c b/MdeModulePkg/Universal/SetupBrowserDxe/Setup.c
index 907f63c..0bc2d1b 100644
--- a/MdeModulePkg/Universal/SetupBrowserDxe/Setup.c
+++ b/MdeModulePkg/Universal/SetupBrowserDxe/Setup.c
@@ -74,6 +74,7 @@ CHAR16 *gMinusString;
CHAR16 *gAdjustNumber;
CHAR16 *gSaveChanges;
CHAR16 *gOptionMismatch;
+CHAR16 *gFormSuppress;
CHAR16 *mUnknownString = L"!";
@@ -2313,7 +2314,7 @@ GetIfrBinaryData (
OpCodeData = NULL;
Package = NULL;
- ZeroMem (&PackageHeader, sizeof (EFI_HII_PACKAGE_HEADER));;
+ ZeroMem (&PackageHeader, sizeof (EFI_HII_PACKAGE_HEADER));
//
// if FormSetGuid is NULL or zero GUID, return first Setup FormSet in the package list
diff --git a/MdeModulePkg/Universal/SetupBrowserDxe/Setup.h b/MdeModulePkg/Universal/SetupBrowserDxe/Setup.h
index d375b21..310d3e6 100644
--- a/MdeModulePkg/Universal/SetupBrowserDxe/Setup.h
+++ b/MdeModulePkg/Universal/SetupBrowserDxe/Setup.h
@@ -401,6 +401,7 @@ typedef struct {
LIST_ENTRY ExpressionListHead; // List of Expressions (FORM_EXPRESSION)
LIST_ENTRY StatementListHead; // List of Statements and Questions (FORM_BROWSER_STATEMENT)
+ FORM_EXPRESSION *SuppressExpression; // nesting inside of SuppressIf
} FORM_BROWSER_FORM;
#define FORM_BROWSER_FORM_FROM_LINK(a) CR (a, FORM_BROWSER_FORM, Link, FORM_BROWSER_FORM_SIGNATURE)
@@ -441,6 +442,7 @@ typedef struct {
LIST_ENTRY StorageListHead; // Storage list (FORMSET_STORAGE)
LIST_ENTRY DefaultStoreListHead; // DefaultStore list (FORMSET_DEFAULTSTORE)
LIST_ENTRY FormListHead; // Form list (FORM_BROWSER_FORM)
+ LIST_ENTRY ExpressionListHead; // List of Expressions (FORM_EXPRESSION)
} FORM_BROWSER_FORMSET;
#define BROWSER_CONTEXT_SIGNATURE SIGNATURE_32 ('B', 'C', 'T', 'X')
@@ -550,6 +552,7 @@ extern CHAR16 *gMinusString;
extern CHAR16 *gAdjustNumber;
extern CHAR16 *gSaveChanges;
extern CHAR16 *gOptionMismatch;
+extern CHAR16 *gFormSuppress;
extern CHAR16 gPromptBlockWidth;
extern CHAR16 gOptionBlockWidth;
diff --git a/MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserStr.uni b/MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserStr.uni
index 4652bf6..c32f7bf 100644
--- a/MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserStr.uni
+++ b/MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserStr.uni
Binary files differ
diff --git a/MdeModulePkg/Universal/SetupBrowserDxe/Ui.c b/MdeModulePkg/Universal/SetupBrowserDxe/Ui.c
index dacc472..db2bd27 100644
--- a/MdeModulePkg/Universal/SetupBrowserDxe/Ui.c
+++ b/MdeModulePkg/Universal/SetupBrowserDxe/Ui.c
@@ -1669,6 +1669,7 @@ UiDisplayMenu (
UINT8 DigitUint8;
UI_MENU_LIST *CurrentMenu;
UI_MENU_LIST *MenuList;
+ FORM_BROWSER_FORM *RefForm;
CopyMem (&LocalScreen, &gScreenDimensions, sizeof (EFI_SCREEN_DESCRIPTOR));
@@ -1690,6 +1691,7 @@ UiDisplayMenu (
NextMenuOption = NULL;
PreviousMenuOption = NULL;
SavedMenuOption = NULL;
+ RefForm = NULL;
ZeroMem (&Key, sizeof (EFI_INPUT_KEY));
@@ -2494,7 +2496,6 @@ UiDisplayMenu (
//
// Goto another Hii Package list
//
- ControlFlag = CfCheckSelection;
Selection->Action = UI_ACTION_REFRESH_FORMSET;
StringPtr = GetToken (Statement->RefDevicePath, Selection->FormSet->HiiHandle);
@@ -2549,7 +2550,6 @@ UiDisplayMenu (
//
// Goto another Formset, check for uncommitted data
//
- ControlFlag = CfCheckSelection;
Selection->Action = UI_ACTION_REFRESH_FORMSET;
CopyMem (&Selection->FormSetGuid, &Statement->RefFormSetId, sizeof (EFI_GUID));
@@ -2557,6 +2557,30 @@ UiDisplayMenu (
Selection->QuestionId = Statement->RefQuestionId;
} else if (Statement->RefFormId != 0) {
//
+ // Check Ref From is suppressed.
+ //
+ RefForm = IdToForm (Selection->FormSet, Statement->RefFormId);
+
+ if (RefForm->SuppressExpression != NULL) {
+ Status = EvaluateExpression (Selection->FormSet, RefForm, RefForm->SuppressExpression);
+ if (EFI_ERROR (Status)) {
+ return Status;
+ }
+
+ if (RefForm->SuppressExpression->Result.Value.b) {
+ //
+ // Form is suppressed.
+ //
+ do {
+ CreateDialog (4, TRUE, 0, NULL, &Key, gEmptyString, gFormSuppress, gPressEnter, gEmptyString);
+ } while (Key.UnicodeChar != CHAR_CARRIAGE_RETURN);
+
+ Repaint = TRUE;
+ break;
+ }
+ }
+
+ //
// Goto another form inside this formset,
//
Selection->Action = UI_ACTION_REFRESH_FORM;
@@ -2626,9 +2650,9 @@ UiDisplayMenu (
Selection->Action = UI_ACTION_REFRESH_FORM;
}
- if (OptionString != NULL) {
- FreePool (OptionString);
- }
+ if (OptionString != NULL) {
+ FreePool (OptionString);
+ }
break;
}
break;