]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/SetupBrowserDxe/IfrParse.c
Update SetUp Browser doesn't set a default value to Numeric field per UEFI spec....
[mirror_edk2.git] / MdeModulePkg / Universal / SetupBrowserDxe / IfrParse.c
index 02f555625566c53dae7e0c48de833e494a86348a..0a5d39ad50769eeb446325cb70ca921f73aed590 100644 (file)
@@ -21,8 +21,10 @@ UINT16           mExpressionOpCodeIndex;
 BOOLEAN          mInScopeSubtitle;\r
 BOOLEAN          mInScopeSuppress;\r
 BOOLEAN          mInScopeGrayOut;\r
+BOOLEAN          mInScopeDisable;\r
 FORM_EXPRESSION  *mSuppressExpression;\r
 FORM_EXPRESSION  *mGrayOutExpression;\r
+FORM_EXPRESSION  *mDisableExpression;\r
 \r
 /**\r
   Initialize Statement header members.\r
@@ -75,6 +77,11 @@ CreateStatement (
     Statement->GrayOutExpression = mGrayOutExpression;\r
   }\r
 \r
+\r
+  if (mInScopeDisable) {\r
+    Statement->DisableExpression = mDisableExpression;\r
+  }\r
+\r
   Statement->InSubtitle = mInScopeSubtitle;\r
 \r
   //\r
@@ -810,7 +817,6 @@ ParseOpCodes (
   BOOLEAN                 SuppressForOption;\r
   BOOLEAN                 InScopeOptionSuppress;\r
   FORM_EXPRESSION         *OptionSuppressExpression;\r
-  BOOLEAN                 InScopeDisable;\r
   UINT16                  DepthOfDisable;\r
   BOOLEAN                 OpCodeDisabled;\r
   BOOLEAN                 SingleOpCodeExpression;\r
@@ -822,7 +828,7 @@ ParseOpCodes (
   mInScopeSuppress         = FALSE;\r
   InScopeOptionSuppress    = FALSE;\r
   mInScopeGrayOut          = FALSE;\r
-  InScopeDisable           = FALSE;\r
+  mInScopeDisable          = FALSE;\r
   DepthOfDisable           = 0;\r
   OpCodeDisabled           = FALSE;\r
   SingleOpCodeExpression   = FALSE;\r
@@ -890,7 +896,7 @@ ParseOpCodes (
 \r
         if (ScopeOpCode == EFI_IFR_DISABLE_IF_OP) {\r
           if (DepthOfDisable == 0) {\r
-            InScopeDisable = FALSE;\r
+            mInScopeDisable = FALSE;\r
             OpCodeDisabled = FALSE;\r
           } else {\r
             DepthOfDisable--;\r
@@ -1035,9 +1041,9 @@ ParseOpCodes (
         //\r
         SingleOpCodeExpression = FALSE;\r
 \r
-        if (InScopeDisable) {\r
+        if (mInScopeDisable && CurrentForm == NULL) {\r
           //\r
-          // Evaluate DisableIf expression\r
+          // This is DisableIf expression for Form, it should be a constant expression\r
           //\r
           Status = EvaluateExpression (FormSet, CurrentForm, CurrentExpression);\r
           if (EFI_ERROR (Status)) {\r
@@ -1073,6 +1079,12 @@ ParseOpCodes (
 \r
       CopyMem (&FormSet->FormSetTitle, &((EFI_IFR_FORM_SET *) OpCodeData)->FormSetTitle, sizeof (EFI_STRING_ID));\r
       CopyMem (&FormSet->Help,         &((EFI_IFR_FORM_SET *) OpCodeData)->Help,         sizeof (EFI_STRING_ID));\r
+\r
+      //\r
+      // The formset OpCode contains ClassGuid\r
+      //\r
+      FormSet->NumberOfClassGuid = ((EFI_IFR_FORM_SET *) OpCodeData)->Flags & 0x3;\r
+      CopyMem (FormSet->ClassGuid, OpCodeData + sizeof (EFI_IFR_FORM_SET), FormSet->NumberOfClassGuid * sizeof (EFI_GUID));\r
       break;\r
 \r
     case EFI_IFR_FORM_OP:\r
@@ -1208,8 +1220,10 @@ ParseOpCodes (
       break;\r
 \r
     case EFI_IFR_RESET_BUTTON_OP:\r
-      CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
-\r
+      //\r
+      // Create Statement todo\r
+      //\r
+      CurrentStatement = CreateStatement (OpCodeData, FormSet, CurrentForm);\r
       CopyMem (&CurrentStatement->DefaultId, &((EFI_IFR_RESET_BUTTON *) OpCodeData)->DefaultId, sizeof (EFI_DEFAULT_ID));\r
       break;\r
 \r
@@ -1504,8 +1518,16 @@ ParseOpCodes (
       CurrentExpression->Type = EFI_HII_EXPRESSION_DISABLE_IF;\r
       InitializeListHead (&CurrentExpression->OpCodeListHead);\r
 \r
-      InScopeDisable = TRUE;\r
-      OpCodeDisabled = FALSE;\r
+      if (CurrentForm != NULL) {\r
+        //\r
+        // This is DisableIf for Question, enqueue it to Form expression list\r
+        //\r
+        InsertTailList (&CurrentForm->ExpressionListHead, &CurrentExpression->Link);\r
+      }\r
+\r
+      mDisableExpression = CurrentExpression;\r
+      mInScopeDisable    = TRUE;\r
+      OpCodeDisabled     = FALSE;\r
 \r
       //\r
       // Take a look at next OpCode to see whether current expression consists\r
@@ -1614,9 +1636,12 @@ ParseOpCodes (
           break;\r
 \r
         case EFI_IFR_EXTEND_OP_BANNER:\r
+          //\r
+          // By SubClass or By ClassGuid to get Banner Data?\r
+          //\r
           if (FormSet->SubClass == EFI_FRONT_PAGE_SUBCLASS) {\r
             CopyMem (\r
-              &BannerData->Banner[((EFI_IFR_GUID_BANNER *) OpCodeData)->LineNumber][\r
+              &gBannerData->Banner[((EFI_IFR_GUID_BANNER *) OpCodeData)->LineNumber][\r
               ((EFI_IFR_GUID_BANNER *) OpCodeData)->Alignment],\r
               &((EFI_IFR_GUID_BANNER *) OpCodeData)->Title,\r
               sizeof (EFI_STRING_ID)\r
@@ -1696,7 +1721,7 @@ ParseOpCodes (
         break;\r
 \r
       case EFI_IFR_DISABLE_IF_OP:\r
-        InScopeDisable = FALSE;\r
+        mInScopeDisable = FALSE;\r
         OpCodeDisabled = FALSE;\r
         break;\r
 \r
@@ -1711,9 +1736,9 @@ ParseOpCodes (
 \r
       default:\r
         if (IsExpressionOpCode (ScopeOpCode)) {\r
-          if (InScopeDisable) {\r
+          if (mInScopeDisable && CurrentForm == NULL) {\r
             //\r
-            // Evaluate DisableIf expression\r
+            // This is DisableIf expression for Form, it should be a constant expression\r
             //\r
             Status = EvaluateExpression (FormSet, CurrentForm, CurrentExpression);\r
             if (EFI_ERROR (Status)) {\r