]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/SetupBrowserDxe/IfrParse.c
Move MdeModuleHii.h into Include\Guid directory
[mirror_edk2.git] / MdeModulePkg / Universal / SetupBrowserDxe / IfrParse.c
index cde8d6f10b6528b6eda63abb2bc6245422dc62a1..094043f4eeca9e629a2194bc492fdbca1a1b14e6 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
@@ -89,6 +85,21 @@ CreateStatement (
   return Statement;\r
 }\r
 \r
+/**\r
+  Convert a numeric value to a Unicode String and insert it to String Package.\r
+  This string is used as the Unicode Name for the EFI Variable. This is to support\r
+  the deprecated vareqval opcode.\r
+  \r
+  @param FormSet        The FormSet.\r
+  @param Statement      The numeric question whose VarStoreInfo.VarName is the\r
+                        numeric value which is used to produce the Unicode Name\r
+                        for the EFI Variable.\r
+                        \r
+  If the Statement is NULL, the ASSERT.\r
+  If the opcode is not Numeric, then ASSERT.\r
+  \r
+  @retval EFI_SUCCESS The funtion always succeeds.\r
+**/\r
 EFI_STATUS\r
 UpdateCheckBoxStringToken (\r
   IN CONST FORM_BROWSER_FORMSET *FormSet,\r
@@ -115,6 +126,14 @@ UpdateCheckBoxStringToken (
   return EFI_SUCCESS;\r
 }\r
 \r
+/**\r
+  Check if the next opcode is the EFI_IFR_EXTEND_OP_VAREQNAME.\r
+  \r
+  @param OpCodeData     The current opcode.\r
+                        \r
+  @retval TRUE Yes.\r
+  @retval FALSE No.\r
+**/\r
 BOOLEAN\r
 IsNextOpCodeGuidedVarEqName (\r
   UINT8 *OpCodeData\r
@@ -125,7 +144,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
@@ -256,6 +275,7 @@ CreateExpression (
   FORM_EXPRESSION  *Expression;\r
 \r
   Expression = AllocateZeroPool (sizeof (FORM_EXPRESSION));\r
+  ASSERT (Expression != NULL);\r
   Expression->Signature = FORM_EXPRESSION_SIGNATURE;\r
   InitializeListHead (&Expression->OpCodeListHead);\r
 \r
@@ -279,6 +299,7 @@ CreateStorage (
   FORMSET_STORAGE  *Storage;\r
 \r
   Storage = AllocateZeroPool (sizeof (FORMSET_STORAGE));\r
+  ASSERT (Storage != NULL);\r
   Storage->Signature = FORMSET_STORAGE_SIGNATURE;\r
   InitializeListHead (&Storage->NameValueListHead);\r
   InsertTailList (&FormSet->StorageListHead, &Storage->Link);\r
@@ -410,9 +431,10 @@ InitializeRequestElement (
     //\r
     StringSize = (Storage->ConfigRequest != NULL) ? StrSize (Storage->ConfigRequest) : sizeof (CHAR16);\r
     NewStr = AllocateZeroPool (StringSize + CONFIG_REQUEST_STRING_INCREMENTAL * sizeof (CHAR16));\r
+    ASSERT (NewStr != NULL);\r
     if (Storage->ConfigRequest != NULL) {\r
       CopyMem (NewStr, Storage->ConfigRequest, StringSize);\r
-      gBS->FreePool (Storage->ConfigRequest);\r
+      FreePool (Storage->ConfigRequest);\r
     }\r
     Storage->ConfigRequest = NewStr;\r
     Storage->SpareStrLen   = CONFIG_REQUEST_STRING_INCREMENTAL;\r
@@ -453,7 +475,7 @@ DestroyExpression (
   //\r
   // Free this Expression\r
   //\r
-  gBS->FreePool (Expression);\r
+  FreePool (Expression);\r
 }\r
 \r
 \r
@@ -537,7 +559,7 @@ DestroyStatement (
     Default = QUESTION_DEFAULT_FROM_LINK (Link);\r
     RemoveEntryList (&Default->Link);\r
 \r
-    gBS->FreePool (Default);\r
+    FreePool (Default);\r
   }\r
 \r
   //\r
@@ -548,7 +570,7 @@ DestroyStatement (
     Option = QUESTION_OPTION_FROM_LINK (Link);\r
     RemoveEntryList (&Option->Link);\r
 \r
-    gBS->FreePool (Option);\r
+    FreePool (Option);\r
   }\r
 \r
   //\r
@@ -622,7 +644,7 @@ DestroyForm (
   //\r
   // Free this Form\r
   //\r
-  gBS->FreePool (Form);\r
+  FreePool (Form);\r
 }\r
 \r
 \r
@@ -669,7 +691,7 @@ DestroyFormSet (
       DefaultStore = FORMSET_DEFAULTSTORE_FROM_LINK (Link);\r
       RemoveEntryList (&DefaultStore->Link);\r
 \r
-      gBS->FreePool (DefaultStore);\r
+      FreePool (DefaultStore);\r
     }\r
   }\r
 \r
@@ -826,6 +848,7 @@ ParseOpCodes (
   CurrentDefault           = NULL;\r
   CurrentOption            = NULL;\r
   OptionSuppressExpression = NULL;\r
+  ImageId                  = NULL;\r
 \r
   //\r
   // Get the number of Statements and Expressions\r
@@ -940,6 +963,7 @@ ParseOpCodes (
         break;\r
 \r
       case EFI_IFR_THIS_OP:\r
+        ASSERT (CurrentStatement != NULL);\r
         ExpressionOpCode->QuestionId = CurrentStatement->QuestionId;\r
         break;\r
 \r
@@ -1036,6 +1060,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
@@ -1071,6 +1097,7 @@ ParseOpCodes (
       // Create a new Form for this FormSet\r
       //\r
       CurrentForm = AllocateZeroPool (sizeof (FORM_BROWSER_FORM));\r
+      ASSERT (CurrentForm != NULL);\r
       CurrentForm->Signature = FORM_BROWSER_FORM_SIGNATURE;\r
       InitializeListHead (&CurrentForm->ExpressionListHead);\r
       InitializeListHead (&CurrentForm->StatementListHead);\r
@@ -1147,6 +1174,7 @@ ParseOpCodes (
     //\r
     case EFI_IFR_DEFAULTSTORE_OP:\r
       DefaultStore = AllocateZeroPool (sizeof (FORMSET_DEFAULTSTORE));\r
+      ASSERT (DefaultStore != NULL);\r
       DefaultStore->Signature = FORMSET_DEFAULTSTORE_SIGNATURE;\r
 \r
       CopyMem (&DefaultStore->DefaultId,   &((EFI_IFR_DEFAULTSTORE *) OpCodeData)->DefaultId,   sizeof (UINT16));\r
@@ -1163,6 +1191,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
@@ -1172,6 +1202,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
@@ -1181,6 +1212,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
@@ -1383,6 +1415,7 @@ ParseOpCodes (
       // A Question may have more than one Default value which have different default types.\r
       //\r
       CurrentDefault = AllocateZeroPool (sizeof (QUESTION_DEFAULT));\r
+      ASSERT (CurrentDefault != NULL);\r
       CurrentDefault->Signature = QUESTION_DEFAULT_SIGNATURE;\r
 \r
       CurrentDefault->Value.Type = ((EFI_IFR_DEFAULT *) OpCodeData)->Type;\r
@@ -1409,6 +1442,7 @@ ParseOpCodes (
       // It create a selection for use in current Question.\r
       //\r
       CurrentOption = AllocateZeroPool (sizeof (QUESTION_OPTION));\r
+      ASSERT (CurrentOption != NULL);\r
       CurrentOption->Signature = QUESTION_OPTION_SIGNATURE;\r
 \r
       CurrentOption->Flags = ((EFI_IFR_ONE_OF_OPTION *) OpCodeData)->Flags;\r
@@ -1482,6 +1516,7 @@ ParseOpCodes (
       // evaluated at initialization and it will not be queued\r
       //\r
       CurrentExpression = AllocateZeroPool (sizeof (FORM_EXPRESSION));\r
+      ASSERT (CurrentExpression != NULL);\r
       CurrentExpression->Signature = FORM_EXPRESSION_SIGNATURE;\r
       CurrentExpression->Type = EFI_HII_EXPRESSION_DISABLE_IF;\r
       InitializeListHead (&CurrentExpression->OpCodeListHead);\r
@@ -1515,6 +1550,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
@@ -1543,6 +1584,7 @@ ParseOpCodes (
         break;\r
 \r
       case EFI_IFR_FORM_OP:\r
+        ASSERT (CurrentForm != NULL);\r
         ImageId = &CurrentForm->ImageId;\r
         break;\r
 \r
@@ -1551,10 +1593,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
@@ -1562,6 +1611,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
@@ -1569,7 +1619,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
@@ -1686,6 +1736,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