]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/SetupBrowserDxe/IfrParse.c
Refine code for PeiReportStatusCodeLib.
[mirror_edk2.git] / MdeModulePkg / Universal / SetupBrowserDxe / IfrParse.c
index 0070502f9b592b52276c341a71a43b4b2b4154d2..737aaf7315139dfea448f7f13f41eacfe00128c3 100644 (file)
@@ -21,12 +21,10 @@ UINT16           mExpressionOpCodeIndex;
 BOOLEAN          mInScopeSubtitle;\r
 BOOLEAN          mInScopeSuppress;\r
 BOOLEAN          mInScopeGrayOut;\r
+BOOLEAN          mInScopeDisable;\r
 FORM_EXPRESSION  *mSuppressExpression;\r
 FORM_EXPRESSION  *mGrayOutExpression;\r
-\r
-EFI_GUID  gTianoHiiIfrGuid = EFI_IFR_TIANO_GUID;\r
-GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID  mFrameworkHiiCompatibilityGuid = EFI_IFR_FRAMEWORK_GUID;\r
-\r
+FORM_EXPRESSION  *mDisableExpression;\r
 \r
 /**\r
   Initialize Statement header members.\r
@@ -79,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
@@ -112,17 +115,15 @@ UpdateCheckBoxStringToken (
 {\r
   CHAR16                  Str[MAXIMUM_VALUE_CHARACTERS];\r
   EFI_STRING_ID           Id;\r
-  EFI_STATUS              Status;\r
 \r
   ASSERT (Statement != NULL);\r
   ASSERT (Statement->Operand == EFI_IFR_NUMERIC_OP);\r
   \r
   UnicodeValueToString (Str, 0, Statement->VarStoreInfo.VarName, MAXIMUM_VALUE_CHARACTERS - 1);\r
-  \r
-  Status = HiiLibNewString (FormSet->HiiHandle, &Id, Str);\r
 \r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
+  Id = HiiSetString (FormSet->HiiHandle, 0, Str, NULL);\r
+  if (Id == 0) {\r
+    return EFI_OUT_OF_RESOURCES;\r
   }\r
 \r
   Statement->VarStoreInfo.VarName = Id;\r
@@ -148,7 +149,7 @@ IsNextOpCodeGuidedVarEqName (
   //\r
   OpCodeData += ((EFI_IFR_OP_HEADER *) OpCodeData)->Length;\r
   if (*OpCodeData == EFI_IFR_GUID_OP) {\r
-    if (CompareGuid (&mFrameworkHiiCompatibilityGuid, (EFI_GUID *)(OpCodeData + sizeof (EFI_IFR_OP_HEADER)))) {\r
+    if (CompareGuid (&gEfiIfrFrameworkGuid, (EFI_GUID *)(OpCodeData + sizeof (EFI_IFR_OP_HEADER)))) {\r
       //\r
       // Specific GUIDed opcodes to support IFR generated from Framework HII VFR \r
       //\r
@@ -208,7 +209,7 @@ CreateQuestion (
   // Take a look at next OpCode to see whether it is a GUIDed opcode to support\r
   // Framework Compatibility\r
   //\r
-  if (FeaturePcdGet (PcdFrameworkHiiCompatibilitySupport)) {\r
+  if (FeaturePcdGet (PcdFrameworkCompatibilitySupport)) {\r
     if ((*OpCodeData == EFI_IFR_NUMERIC_OP) && IsNextOpCodeGuidedVarEqName (OpCodeData)) {\r
       Status = UpdateCheckBoxStringToken (FormSet, Statement);\r
       if (EFI_ERROR (Status)) {\r
@@ -327,40 +328,25 @@ InitializeConfigHdr (
   IN OUT FORMSET_STORAGE   *Storage\r
   )\r
 {\r
-  EFI_STATUS  Status;\r
-  UINTN       StrBufferLen;\r
   CHAR16      *Name;\r
-\r
+  \r
   if (Storage->Type == EFI_HII_VARSTORE_BUFFER) {\r
     Name = Storage->Name;\r
   } else {\r
     Name = NULL;\r
   }\r
-\r
-  StrBufferLen = 0;\r
-  Status = ConstructConfigHdr (\r
-             Storage->ConfigHdr,\r
-             &StrBufferLen,\r
-             &Storage->Guid,\r
-             Name,\r
-             FormSet->DriverHandle\r
-             );\r
-  if (Status == EFI_BUFFER_TOO_SMALL) {\r
-    Storage->ConfigHdr = AllocateZeroPool (StrBufferLen);\r
-    Status = ConstructConfigHdr (\r
-               Storage->ConfigHdr,\r
-               &StrBufferLen,\r
-               &Storage->Guid,\r
-               Name,\r
-               FormSet->DriverHandle\r
-               );\r
-  }\r
-\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
+  \r
+  Storage->ConfigHdr = HiiConstructConfigHdr (\r
+                         &Storage->Guid,\r
+                         Name,\r
+                         FormSet->DriverHandle\r
+                         );\r
+  \r
+  if (Storage->ConfigHdr == NULL) {\r
+    return EFI_NOT_FOUND;\r
   }\r
 \r
-  Storage->ConfigRequest = AllocateCopyPool (StrBufferLen, Storage->ConfigHdr);\r
+  Storage->ConfigRequest = AllocateCopyPool (StrSize (Storage->ConfigHdr), Storage->ConfigHdr);\r
   Storage->SpareStrLen = 0;\r
 \r
   return EFI_SUCCESS;\r
@@ -831,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
@@ -843,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
@@ -911,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
@@ -1056,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
@@ -1094,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 = (UINT8) (((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
@@ -1229,8 +1220,10 @@ ParseOpCodes (
       break;\r
 \r
     case EFI_IFR_RESET_BUTTON_OP:\r
-      CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
-\r
+      //\r
+      // Create Statement\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
@@ -1525,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
@@ -1623,7 +1624,7 @@ ParseOpCodes (
     // Vendor specific\r
     //\r
     case EFI_IFR_GUID_OP:\r
-      if (CompareGuid (&gTianoHiiIfrGuid, (EFI_GUID *)(OpCodeData + sizeof (EFI_IFR_OP_HEADER)))) {\r
+      if (CompareGuid (&gEfiIfrTianoGuid, (EFI_GUID *)(OpCodeData + sizeof (EFI_IFR_OP_HEADER)))) {\r
         //\r
         // Tiano specific GUIDed opcodes\r
         //\r
@@ -1635,9 +1636,12 @@ ParseOpCodes (
           break;\r
 \r
         case EFI_IFR_EXTEND_OP_BANNER:\r
+          //\r
+          // By SubClass to get Banner Data from Front Page\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
@@ -1717,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
@@ -1732,14 +1736,16 @@ 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
               return Status;\r
             }\r
+\r
+            ASSERT (CurrentExpression != NULL);\r
             if (CurrentExpression->Result.Type != EFI_IFR_TYPE_BOOLEAN) {\r
               return EFI_INVALID_PARAMETER;\r
             }\r