Add SuppressIf form support in SetupBrowser driver.
authorlgao4 <lgao4@de2fecce-e211-0410-80a6-f3fac2684e05>
Thu, 12 Nov 2009 01:16:12 +0000 (01:16 +0000)
committerlgao4 <lgao4@de2fecce-e211-0410-80a6-f3fac2684e05>
Thu, 12 Nov 2009 01:16:12 +0000 (01:16 +0000)
git-svn-id: https://edk2.tianocore.org/svn/edk2/trunk@9417 de2fecce-e211-0410-80a6-f3fac2684e05

edk2/MdeModulePkg/Universal/SetupBrowserDxe/IfrParse.c
edk2/MdeModulePkg/Universal/SetupBrowserDxe/Presentation.c
edk2/MdeModulePkg/Universal/SetupBrowserDxe/Setup.c
edk2/MdeModulePkg/Universal/SetupBrowserDxe/Setup.h
edk2/MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserStr.uni
edk2/MdeModulePkg/Universal/SetupBrowserDxe/Ui.c

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