]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/SetupBrowserDxe/IfrParse.c
HII Library Class interface refine.
[mirror_edk2.git] / MdeModulePkg / Universal / SetupBrowserDxe / IfrParse.c
index 7a09b32b738df9d7a0b54a3757dc9cd7ab2f0114..02f555625566c53dae7e0c48de833e494a86348a 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
 Parser for IFR binary encoding.\r
 \r
-Copyright (c) 2007 - 2008, Intel Corporation\r
+Copyright (c) 2007 - 2009, Intel Corporation\r
 All rights reserved. This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
 which accompanies this distribution.  The full text of the license may be found at\r
@@ -24,10 +24,6 @@ BOOLEAN          mInScopeGrayOut;
 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
-\r
 /**\r
   Initialize Statement header members.\r
 \r
@@ -112,17 +108,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 +142,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 +202,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 +321,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
@@ -852,6 +831,7 @@ ParseOpCodes (
   CurrentDefault           = NULL;\r
   CurrentOption            = NULL;\r
   OptionSuppressExpression = NULL;\r
+  ImageId                  = NULL;\r
 \r
   //\r
   // Get the number of Statements and Expressions\r
@@ -1059,11 +1039,12 @@ ParseOpCodes (
           //\r
           // Evaluate DisableIf expression\r
           //\r
-          ASSERT (CurrentExpression != NULL);\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
@@ -1193,6 +1174,8 @@ ParseOpCodes (
     //\r
     case EFI_IFR_SUBTITLE_OP:\r
       CurrentStatement = CreateStatement (OpCodeData, FormSet, CurrentForm);\r
+      ASSERT (CurrentStatement != NULL);\r
+      \r
       CurrentStatement->Flags = ((EFI_IFR_SUBTITLE *) OpCodeData)->Flags;\r
 \r
       if (Scope != 0) {\r
@@ -1202,6 +1185,7 @@ ParseOpCodes (
 \r
     case EFI_IFR_TEXT_OP:\r
       CurrentStatement = CreateStatement (OpCodeData, FormSet, CurrentForm);\r
+      ASSERT (CurrentStatement != NULL);\r
 \r
       CopyMem (&CurrentStatement->TextTwo, &((EFI_IFR_TEXT *) OpCodeData)->TextTwo, sizeof (EFI_STRING_ID));\r
       break;\r
@@ -1211,6 +1195,7 @@ ParseOpCodes (
     //\r
     case EFI_IFR_ACTION_OP:\r
       CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
+      ASSERT (CurrentStatement != NULL);\r
 \r
       if (OpCodeLength == sizeof (EFI_IFR_ACTION_1)) {\r
         //\r
@@ -1548,6 +1533,12 @@ ParseOpCodes (
         //\r
         // If used for a question, then the question will be read-only\r
         //\r
+        //\r
+        // Make sure CurrentStatement is not NULL.\r
+        // If it is NULL, 1) ParseOpCodes functions may parse the IFR wrongly. Or 2) the IFR\r
+        // file is wrongly generated by tools such as VFR Compiler. There may be a bug in VFR Compiler.\r
+        //\r
+        ASSERT (CurrentStatement != NULL);\r
         CurrentStatement->ValueExpression = CurrentExpression;\r
       }\r
       break;\r
@@ -1585,10 +1576,17 @@ ParseOpCodes (
         break;\r
 \r
       default:\r
+        //\r
+        // Make sure CurrentStatement is not NULL.\r
+        // If it is NULL, 1) ParseOpCodes functions may parse the IFR wrongly. Or 2) the IFR\r
+        // file is wrongly generated by tools such as VFR Compiler.\r
+        //\r
+        ASSERT (CurrentStatement != NULL);\r
         ImageId = &CurrentStatement->ImageId;\r
         break;\r
       }\r
 \r
+      ASSERT (ImageId != NULL);\r
       CopyMem (ImageId, &((EFI_IFR_IMAGE *) OpCodeData)->Id, sizeof (EFI_IMAGE_ID));\r
       break;\r
 \r
@@ -1596,6 +1594,7 @@ ParseOpCodes (
     // Refresh\r
     //\r
     case EFI_IFR_REFRESH_OP:\r
+      ASSERT (CurrentStatement != NULL);\r
       CurrentStatement->RefreshInterval = ((EFI_IFR_REFRESH *) OpCodeData)->RefreshInterval;\r
       break;\r
 \r
@@ -1603,7 +1602,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
@@ -1720,6 +1719,8 @@ ParseOpCodes (
             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