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

Reply via email to