Revision: 14995
http://sourceforge.net/p/edk2/code/14995
Author: ydong10
Date: 2013-12-17 08:33:06 +0000 (Tue, 17 Dec 2013)
Log Message:
-----------
Update code to support guid op nest in the statement.
Signed-off-by: Eric Dong <[email protected]>
Reviewed-by: Liming Gao <[email protected]>
Modified Paths:
--------------
trunk/edk2/MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLibInternal.c
trunk/edk2/MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf
trunk/edk2/MdeModulePkg/Universal/DisplayEngineDxe/FormDisplay.c
trunk/edk2/MdeModulePkg/Universal/SetupBrowserDxe/IfrParse.c
trunk/edk2/MdeModulePkg/Universal/SetupBrowserDxe/Presentation.c
trunk/edk2/MdeModulePkg/Universal/SetupBrowserDxe/Setup.h
Modified:
trunk/edk2/MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLibInternal.c
===================================================================
---
trunk/edk2/MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLibInternal.c
2013-12-17 07:46:11 UTC (rev 14994)
+++
trunk/edk2/MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLibInternal.c
2013-12-17 08:33:06 UTC (rev 14995)
@@ -322,7 +322,9 @@
)
{
LIST_ENTRY *Link;
+ LIST_ENTRY *NestLink;
FORM_DISPLAY_ENGINE_STATEMENT *Statement;
+ FORM_DISPLAY_ENGINE_STATEMENT *NestStatement;
Link = GetFirstNode (&FormData->StatementListOSF);
while (!IsNull (&FormData->StatementListOSF, Link)) {
@@ -338,6 +340,15 @@
Link = GetNextNode (&FormData->StatementListHead, Link);
ProcessUserOpcode(Statement->OpCode);
+
+ NestLink = GetFirstNode (&Statement->NestStatementList);
+ while (!IsNull (&Statement->NestStatementList, NestLink)) {
+ NestStatement = FORM_DISPLAY_ENGINE_STATEMENT_FROM_LINK (NestLink);
+ NestLink = GetNextNode (&Statement->NestStatementList, NestLink);
+
+ ProcessUserOpcode(NestStatement->OpCode);
+ }
+
}
}
Modified:
trunk/edk2/MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf
===================================================================
--- trunk/edk2/MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf
2013-12-17 07:46:11 UTC (rev 14994)
+++ trunk/edk2/MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf
2013-12-17 08:33:06 UTC (rev 14995)
@@ -54,9 +54,6 @@
gEdkiiFormDisplayEngineProtocolGuid
gEdkiiFormBrowserEx2ProtocolGuid
-[Guids]
- gEfiIfrTianoGuid ## CONSUMES ## GUID
-
[Depex]
gEfiHiiDatabaseProtocolGuid AND gEfiHiiConfigRoutingProtocolGuid AND
gEdkiiFormBrowserEx2ProtocolGuid
Modified: trunk/edk2/MdeModulePkg/Universal/DisplayEngineDxe/FormDisplay.c
===================================================================
--- trunk/edk2/MdeModulePkg/Universal/DisplayEngineDxe/FormDisplay.c
2013-12-17 07:46:11 UTC (rev 14994)
+++ trunk/edk2/MdeModulePkg/Universal/DisplayEngineDxe/FormDisplay.c
2013-12-17 08:33:06 UTC (rev 14995)
@@ -699,6 +699,13 @@
NestStatement = FORM_DISPLAY_ENGINE_STATEMENT_FROM_LINK (NestLink);
NestLink = GetNextNode (&Statement->NestStatementList, NestLink);
+ //
+ // Skip the opcode not recognized by Display core.
+ //
+ if (NestStatement->OpCode->OpCode == EFI_IFR_GUID_OP) {
+ continue;
+ }
+
UiAddMenuOption (NestStatement, &MenuItemCount, TRUE);
}
}
Modified: trunk/edk2/MdeModulePkg/Universal/SetupBrowserDxe/IfrParse.c
===================================================================
--- trunk/edk2/MdeModulePkg/Universal/SetupBrowserDxe/IfrParse.c
2013-12-17 07:46:11 UTC (rev 14994)
+++ trunk/edk2/MdeModulePkg/Universal/SetupBrowserDxe/IfrParse.c
2013-12-17 08:33:06 UTC (rev 14995)
@@ -17,7 +17,6 @@
UINT16 mStatementIndex;
UINT16 mExpressionOpCodeIndex;
EFI_QUESTION_ID mUsedQuestionId;
-BOOLEAN mInScopeSubtitle;
extern LIST_ENTRY gBrowserStorageList;
/**
Initialize Statement header members.
@@ -79,8 +78,6 @@
CopyMem (Statement->Expression->Expression,
GetConditionalExpressionList(ExpressStatement), (UINTN) (sizeof
(FORM_EXPRESSION *) * ConditionalExprCount));
}
- Statement->InSubtitle = mInScopeSubtitle;
-
//
// Insert this Statement into current Form
//
@@ -1039,7 +1036,40 @@
}
}
+/**
+ Tell whether this Operand is an Statement OpCode.
+ @param Operand Operand of an IFR OpCode.
+
+ @retval TRUE This is an Statement OpCode.
+ @retval FALSE Not an Statement OpCode.
+
+**/
+BOOLEAN
+IsStatementOpCode (
+ IN UINT8 Operand
+ )
+{
+ if ((Operand == EFI_IFR_SUBTITLE_OP) ||
+ (Operand == EFI_IFR_TEXT_OP) ||
+ (Operand == EFI_IFR_RESET_BUTTON_OP) ||
+ (Operand == EFI_IFR_REF_OP) ||
+ (Operand == EFI_IFR_ACTION_OP) ||
+ (Operand == EFI_IFR_NUMERIC_OP) ||
+ (Operand == EFI_IFR_ORDERED_LIST_OP) ||
+ (Operand == EFI_IFR_CHECKBOX_OP) ||
+ (Operand == EFI_IFR_STRING_OP) ||
+ (Operand == EFI_IFR_PASSWORD_OP) ||
+ (Operand == EFI_IFR_DATE_OP) ||
+ (Operand == EFI_IFR_TIME_OP) ||
+ (Operand == EFI_IFR_GUID_OP) ||
+ (Operand == EFI_IFR_ONE_OF_OP)) {
+ return TRUE;
+ } else {
+ return FALSE;
+ }
+}
+
/**
Calculate number of Statemens(Questions) and Expression OpCodes.
@@ -1100,6 +1130,7 @@
EFI_STATUS Status;
FORM_BROWSER_FORM *CurrentForm;
FORM_BROWSER_STATEMENT *CurrentStatement;
+ FORM_BROWSER_STATEMENT *ParentStatement;
EXPRESSION_OPCODE *ExpressionOpCode;
FORM_EXPRESSION *CurrentExpression;
UINT8 Operand;
@@ -1132,7 +1163,6 @@
BOOLEAN InScopeDisable;
INTN ConditionalExprCount;
- mInScopeSubtitle = FALSE;
SuppressForQuestion = FALSE;
SuppressForOption = FALSE;
InScopeDisable = FALSE;
@@ -1180,6 +1210,7 @@
CurrentForm = NULL;
CurrentStatement = NULL;
+ ParentStatement = NULL;
ResetScopeStack ();
@@ -1270,8 +1301,8 @@
break;
case EFI_IFR_THIS_OP:
- ASSERT (CurrentStatement != NULL);
- ExpressionOpCode->QuestionId = CurrentStatement->QuestionId;
+ ASSERT (ParentStatement != NULL);
+ ExpressionOpCode->QuestionId = ParentStatement->QuestionId;
break;
case EFI_IFR_SECURITY_OP:
@@ -1685,9 +1716,6 @@
CurrentStatement->Flags = ((EFI_IFR_SUBTITLE *) OpCodeData)->Flags;
CurrentStatement->FakeQuestionId = mUsedQuestionId++;
- if (Scope != 0) {
- mInScopeSubtitle = TRUE;
- }
break;
case EFI_IFR_TEXT_OP:
@@ -1927,7 +1955,7 @@
//
// Insert to Default Value list of current Question
//
- InsertTailList (&CurrentStatement->DefaultListHead,
&CurrentDefault->Link);
+ InsertTailList (&ParentStatement->DefaultListHead,
&CurrentDefault->Link);
if (Scope != 0) {
InScopeDefault = TRUE;
@@ -1966,16 +1994,15 @@
CopyMem (CurrentOption->SuppressExpression->Expression,
GetConditionalExpressionList(ExpressOption), (UINTN) (sizeof (FORM_EXPRESSION
*) * ConditionalExprCount));
}
+ ASSERT (ParentStatement != NULL);
//
// Insert to Option list of current Question
//
- InsertTailList (&CurrentStatement->OptionListHead, &CurrentOption->Link);
-
+ InsertTailList (&ParentStatement->OptionListHead, &CurrentOption->Link);
//
// Now we know the Storage width of nested Ordered List
//
- ASSERT (CurrentStatement != NULL);
- if ((CurrentStatement->Operand == EFI_IFR_ORDERED_LIST_OP) &&
(CurrentStatement->BufferValue == NULL)) {
+ if ((ParentStatement->Operand == EFI_IFR_ORDERED_LIST_OP) &&
(ParentStatement->BufferValue == NULL)) {
Width = 1;
switch (CurrentOption->Value.Type) {
case EFI_IFR_TYPE_NUM_SIZE_8:
@@ -2001,15 +2028,15 @@
break;
}
- CurrentStatement->StorageWidth = (UINT16)
(CurrentStatement->MaxContainers * Width);
- CurrentStatement->BufferValue = AllocateZeroPool
(CurrentStatement->StorageWidth);
- CurrentStatement->ValueType = CurrentOption->Value.Type;
- if (CurrentStatement->HiiValue.Type == EFI_IFR_TYPE_BUFFER) {
- CurrentStatement->HiiValue.Buffer = CurrentStatement->BufferValue;
- CurrentStatement->HiiValue.BufferLen =
CurrentStatement->StorageWidth;
+ ParentStatement->StorageWidth = (UINT16)
(ParentStatement->MaxContainers * Width);
+ ParentStatement->BufferValue = AllocateZeroPool
(ParentStatement->StorageWidth);
+ ParentStatement->ValueType = CurrentOption->Value.Type;
+ if (ParentStatement->HiiValue.Type == EFI_IFR_TYPE_BUFFER) {
+ ParentStatement->HiiValue.Buffer = ParentStatement->BufferValue;
+ ParentStatement->HiiValue.BufferLen = ParentStatement->StorageWidth;
}
- InitializeRequestElement (FormSet, CurrentStatement, CurrentForm);
+ InitializeRequestElement (FormSet, ParentStatement, CurrentForm);
}
break;
@@ -2026,10 +2053,10 @@
if (Operand == EFI_IFR_NO_SUBMIT_IF_OP) {
CurrentExpression->Type = EFI_HII_EXPRESSION_NO_SUBMIT_IF;
- InsertTailList (&CurrentStatement->NoSubmitListHead,
&CurrentExpression->Link);
+ InsertTailList (&ParentStatement->NoSubmitListHead,
&CurrentExpression->Link);
} else {
CurrentExpression->Type = EFI_HII_EXPRESSION_INCONSISTENT_IF;
- InsertTailList (&CurrentStatement->InconsistentListHead,
&CurrentExpression->Link);
+ InsertTailList (&ParentStatement->InconsistentListHead,
&CurrentExpression->Link);
}
//
@@ -2049,7 +2076,7 @@
CopyMem (&CurrentExpression->Error, &((EFI_IFR_WARNING_IF *)
OpCodeData)->Warning, sizeof (EFI_STRING_ID));
CurrentExpression->TimeOut = ((EFI_IFR_WARNING_IF *)
OpCodeData)->TimeOut;
CurrentExpression->Type = EFI_HII_EXPRESSION_WARNING_IF;
- InsertTailList (&CurrentStatement->WarningListHead,
&CurrentExpression->Link);
+ InsertTailList (&ParentStatement->WarningListHead,
&CurrentExpression->Link);
//
// Take a look at next OpCode to see whether current expression consists
@@ -2160,8 +2187,8 @@
// If it is NULL, 1) ParseOpCodes functions may parse the IFR wrongly.
Or 2) the IFR
// file is wrongly generated by tools such as VFR Compiler. There may
be a bug in VFR Compiler.
//
- ASSERT (CurrentStatement != NULL);
- CurrentStatement->ValueExpression = CurrentExpression;
+ ASSERT (ParentStatement != NULL);
+ ParentStatement->ValueExpression = CurrentExpression;
}
//
@@ -2199,8 +2226,8 @@
// If it is NULL, 1) ParseOpCodes functions may parse the IFR wrongly.
Or 2) the IFR
// file is wrongly generated by tools such as VFR Compiler. There may be
a bug in VFR Compiler.
//
- ASSERT (CurrentStatement != NULL);
- CurrentStatement->ReadExpression = CurrentExpression;
+ ASSERT (ParentStatement != NULL);
+ ParentStatement->ReadExpression = CurrentExpression;
//
// Take a look at next OpCode to see whether current expression consists
@@ -2221,8 +2248,8 @@
// If it is NULL, 1) ParseOpCodes functions may parse the IFR wrongly.
Or 2) the IFR
// file is wrongly generated by tools such as VFR Compiler. There may be
a bug in VFR Compiler.
//
- ASSERT (CurrentStatement != NULL);
- CurrentStatement->WriteExpression = CurrentExpression;
+ ASSERT (ParentStatement != NULL);
+ ParentStatement->WriteExpression = CurrentExpression;
//
// Take a look at next OpCode to see whether current expression consists
@@ -2264,8 +2291,8 @@
// If it is NULL, 1) ParseOpCodes functions may parse the IFR wrongly.
Or 2) the IFR
// file is wrongly generated by tools such as VFR Compiler.
//
- ASSERT (CurrentStatement != NULL);
- ImageId = &CurrentStatement->ImageId;
+ ASSERT (ParentStatement != NULL);
+ ImageId = &ParentStatement->ImageId;
break;
}
@@ -2277,16 +2304,16 @@
// Refresh
//
case EFI_IFR_REFRESH_OP:
- ASSERT (CurrentStatement != NULL);
- CurrentStatement->RefreshInterval = ((EFI_IFR_REFRESH *)
OpCodeData)->RefreshInterval;
+ ASSERT (ParentStatement != NULL);
+ ParentStatement->RefreshInterval = ((EFI_IFR_REFRESH *)
OpCodeData)->RefreshInterval;
break;
//
// Refresh guid.
//
case EFI_IFR_REFRESH_ID_OP:
- ASSERT (CurrentStatement != NULL);
- CopyMem (&CurrentStatement->RefreshGuid, &((EFI_IFR_REFRESH_ID *)
OpCodeData)->RefreshEventGroupId, sizeof (EFI_GUID));
+ ASSERT (ParentStatement != NULL);
+ CopyMem (&ParentStatement->RefreshGuid, &((EFI_IFR_REFRESH_ID *)
OpCodeData)->RefreshEventGroupId, sizeof (EFI_GUID));
break;
//
@@ -2314,8 +2341,8 @@
break;
default:
- ASSERT (CurrentStatement != NULL);
- CurrentStatement->Locked = TRUE;
+ ASSERT (ParentStatement != NULL);
+ ParentStatement->Locked = TRUE;
}
break;
@@ -2335,6 +2362,13 @@
ResetScopeStack ();
return Status;
}
+
+ //
+ // Parent statement end tag found, update ParentStatement info.
+ //
+ if (IsStatementOpCode(ScopeOpCode) && ParentStatement->Operand ==
ScopeOpCode) {
+ ParentStatement = ParentStatement->ParentStatement;
+ }
switch (ScopeOpCode) {
case EFI_IFR_FORM_SET_OP:
@@ -2361,10 +2395,6 @@
CurrentOption = NULL;
break;
- case EFI_IFR_SUBTITLE_OP:
- mInScopeSubtitle = FALSE;
- break;
-
case EFI_IFR_NO_SUBMIT_IF_OP:
case EFI_IFR_INCONSISTENT_IF_OP:
case EFI_IFR_WARNING_IF_OP:
@@ -2456,6 +2486,17 @@
default:
break;
}
+
+ if (IsStatementOpCode(Operand)) {
+ CurrentStatement->ParentStatement = ParentStatement;
+ if (Scope != 0) {
+ //
+ // Scope != 0, other statements or options may nest in this statement.
+ // Update the ParentStatement info.
+ //
+ ParentStatement = CurrentStatement;
+ }
+ }
}
return EFI_SUCCESS;
Modified: trunk/edk2/MdeModulePkg/Universal/SetupBrowserDxe/Presentation.c
===================================================================
--- trunk/edk2/MdeModulePkg/Universal/SetupBrowserDxe/Presentation.c
2013-12-17 07:46:11 UTC (rev 14994)
+++ trunk/edk2/MdeModulePkg/Universal/SetupBrowserDxe/Presentation.c
2013-12-17 08:33:06 UTC (rev 14995)
@@ -387,18 +387,17 @@
@param DisplayStatement Pointer to the display Statement data strucure.
@param Statement The statement need to check.
- @param HostDisplayStatement Pointer to the display Statement data strucure
which is an host statement.
**/
VOID
InitializeDisplayStatement (
IN OUT FORM_DISPLAY_ENGINE_STATEMENT *DisplayStatement,
- IN FORM_BROWSER_STATEMENT *Statement,
- IN FORM_DISPLAY_ENGINE_STATEMENT *HostDisplayStatement
+ IN FORM_BROWSER_STATEMENT *Statement
)
{
LIST_ENTRY *Link;
QUESTION_OPTION *Option;
DISPLAY_QUESTION_OPTION *DisplayOption;
+ FORM_DISPLAY_ENGINE_STATEMENT *ParentStatement;
DisplayStatement->Signature = FORM_DISPLAY_ENGINE_STATEMENT_SIGNATURE;
DisplayStatement->Version = FORM_DISPLAY_ENGINE_STATEMENT_VERSION_1;
@@ -502,8 +501,10 @@
// If this statement is nest in the subtitle, insert to the host statement.
// else insert to the form it belongs to.
//
- if (Statement->InSubtitle) {
- InsertTailList(&HostDisplayStatement->NestStatementList,
&DisplayStatement->DisplayLink);
+ if (Statement->ParentStatement != NULL) {
+ ParentStatement = GetDisplayStatement(Statement->ParentStatement->OpCode);
+ ASSERT (ParentStatement != NULL);
+ InsertTailList(&ParentStatement->NestStatementList,
&DisplayStatement->DisplayLink);
} else {
InsertTailList(&gDisplayFormData.StatementListHead,
&DisplayStatement->DisplayLink);
}
@@ -625,14 +626,12 @@
LIST_ENTRY *Link;
FORM_BROWSER_STATEMENT *Statement;
FORM_DISPLAY_ENGINE_STATEMENT *DisplayStatement;
- FORM_DISPLAY_ENGINE_STATEMENT *HostDisplayStatement;
UINT8 MinRefreshInterval;
EFI_EVENT RefreshIntervalEvent;
FORM_BROWSER_REFRESH_EVENT_NODE *EventNode;
BOOLEAN FormEditable;
UINT32 ExtraAttribute;
- HostDisplayStatement = NULL;
MinRefreshInterval = 0;
FormEditable = FALSE;
@@ -686,21 +685,13 @@
//
// Initialize this statement and add it to the display form.
//
- InitializeDisplayStatement(DisplayStatement, Statement,
HostDisplayStatement);
+ InitializeDisplayStatement(DisplayStatement, Statement);
//
// Set the extra attribute.
//
DisplayStatement->Attribute |= ExtraAttribute;
- //
- // Save the Host statement info.
- // Host statement may has nest statement follow it.
- //
- if (!Statement->InSubtitle) {
- HostDisplayStatement = DisplayStatement;
- }
-
if (Statement->Storage != NULL) {
FormEditable = TRUE;
}
Modified: trunk/edk2/MdeModulePkg/Universal/SetupBrowserDxe/Setup.h
===================================================================
--- trunk/edk2/MdeModulePkg/Universal/SetupBrowserDxe/Setup.h 2013-12-17
07:46:11 UTC (rev 14994)
+++ trunk/edk2/MdeModulePkg/Universal/SetupBrowserDxe/Setup.h 2013-12-17
08:33:06 UTC (rev 14995)
@@ -288,9 +288,11 @@
ExpressOption
} EXPRESS_LEVEL;
+typedef struct _FORM_BROWSER_STATEMENT FORM_BROWSER_STATEMENT;
+
#define FORM_BROWSER_STATEMENT_SIGNATURE SIGNATURE_32 ('F', 'S', 'T', 'A')
-typedef struct {
+struct _FORM_BROWSER_STATEMENT{
UINTN Signature;
LIST_ENTRY Link;
@@ -352,8 +354,9 @@
EFI_IMAGE_ID ImageId; // nested EFI_IFR_IMAGE
UINT8 RefreshInterval; // nested EFI_IFR_REFRESH,
refresh interval(in seconds) for Question value, 0 means no refresh
- BOOLEAN InSubtitle; // nesting inside of
EFI_IFR_SUBTITLE
+ FORM_BROWSER_STATEMENT *ParentStatement;
+
LIST_ENTRY InconsistentListHead;// nested inconsistent expression
list (FORM_EXPRESSION)
LIST_ENTRY NoSubmitListHead; // nested nosubmit expression
list (FORM_EXPRESSION)
LIST_ENTRY WarningListHead; // nested warning expression list
(FORM_EXPRESSION)
@@ -361,7 +364,7 @@
FORM_EXPRESSION *ReadExpression; // nested EFI_IFR_READ, provide
this question value by read expression.
FORM_EXPRESSION *WriteExpression; // nested EFI_IFR_WRITE, evaluate
write expression after this question value is set.
-} FORM_BROWSER_STATEMENT;
+};
#define FORM_BROWSER_STATEMENT_FROM_LINK(a) CR (a, FORM_BROWSER_STATEMENT,
Link, FORM_BROWSER_STATEMENT_SIGNATURE)
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
------------------------------------------------------------------------------
Rapidly troubleshoot problems before they affect your business. Most IT
organizations don't have a clear picture of how application performance
affects their revenue. With AppDynamics, you get 100% visibility into your
Java,.NET, & PHP application. Start your 15-day FREE TRIAL of AppDynamics Pro!
http://pubads.g.doubleclick.net/gampad/clk?id=84349831&iu=/4140/ostg.clktrk
_______________________________________________
edk2-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-commits