]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/SetupBrowserDxe/IfrParse.c
1. Update GetStringWorker() of HiiDataBaseDxe to only search in other language and...
[mirror_edk2.git] / MdeModulePkg / Universal / SetupBrowserDxe / IfrParse.c
index 3285cfe5aae6acc59c1363219affea71f84066ca..fc03834f1dee148a2bd58a17c230fd5d8eb34354 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
 Parser for IFR binary encoding.\r
 \r
-Copyright (c) 2007 - 2009, Intel Corporation\r
+Copyright (c) 2007 - 2010, 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
@@ -13,7 +13,6 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 **/\r
 \r
 #include "Setup.h"\r
-#include "Ui.h"\r
 \r
 UINT16           mStatementIndex;\r
 UINT16           mExpressionOpCodeIndex;\r
@@ -96,15 +95,15 @@ CreateStatement (
   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
+\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
+\r
   If the Statement is NULL, the ASSERT.\r
   If the opcode is not Numeric, then ASSERT.\r
-  \r
+\r
   @retval EFI_SUCCESS The funtion always succeeds.\r
 **/\r
 EFI_STATUS\r
@@ -118,7 +117,7 @@ UpdateCheckBoxStringToken (
 \r
   ASSERT (Statement != NULL);\r
   ASSERT (Statement->Operand == EFI_IFR_NUMERIC_OP);\r
-  \r
+\r
   UnicodeValueToString (Str, 0, Statement->VarStoreInfo.VarName, MAXIMUM_VALUE_CHARACTERS - 1);\r
 \r
   Id = HiiSetString (FormSet->HiiHandle, 0, Str, NULL);\r
@@ -127,21 +126,21 @@ UpdateCheckBoxStringToken (
   }\r
 \r
   Statement->VarStoreInfo.VarName = Id;\r
-    \r
+\r
   return EFI_SUCCESS;\r
 }\r
 \r
 /**\r
   Check if the next opcode is the EFI_IFR_EXTEND_OP_VAREQNAME.\r
-  \r
+\r
   @param OpCodeData     The current opcode.\r
-                        \r
+\r
   @retval TRUE Yes.\r
   @retval FALSE No.\r
 **/\r
 BOOLEAN\r
 IsNextOpCodeGuidedVarEqName (\r
-  UINT8 *OpCodeData\r
+  IN UINT8 *OpCodeData\r
   )\r
 {\r
   //\r
@@ -151,7 +150,7 @@ IsNextOpCodeGuidedVarEqName (
   if (*OpCodeData == EFI_IFR_GUID_OP) {\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
+      // Specific GUIDed opcodes to support IFR generated from Framework HII VFR\r
       //\r
       if ((((EFI_IFR_GUID_VAREQNAME *) OpCodeData)->ExtendOpCode) == EFI_IFR_EXTEND_OP_VAREQNAME) {\r
         return TRUE;\r
@@ -329,19 +328,19 @@ InitializeConfigHdr (
   )\r
 {\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
+\r
   Storage->ConfigHdr = HiiConstructConfigHdr (\r
                          &Storage->Guid,\r
                          Name,\r
                          FormSet->DriverHandle\r
                          );\r
-  \r
+\r
   if (Storage->ConfigHdr == NULL) {\r
     return EFI_NOT_FOUND;\r
   }\r
@@ -591,6 +590,9 @@ DestroyStatement (
   if (Statement->BlockName != NULL) {\r
     FreePool (Statement->BlockName);\r
   }\r
+  if (Statement->BufferValue != NULL) {\r
+    FreePool (Statement->BufferValue);\r
+  }\r
 }\r
 \r
 \r
@@ -652,8 +654,17 @@ DestroyFormSet (
   LIST_ENTRY            *Link;\r
   FORMSET_STORAGE       *Storage;\r
   FORMSET_DEFAULTSTORE  *DefaultStore;\r
+  FORM_EXPRESSION       *Expression;\r
   FORM_BROWSER_FORM     *Form;\r
 \r
+  if (FormSet->IfrBinaryData == NULL) {\r
+    //\r
+    // Uninitialized FormSet\r
+    //\r
+    FreePool (FormSet);\r
+    return;\r
+  }\r
+\r
   //\r
   // Free IFR binary buffer\r
   //\r
@@ -685,6 +696,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
@@ -728,8 +750,8 @@ IsExpressionOpCode (
       (Operand == EFI_IFR_CATENATE_OP) ||\r
       (Operand == EFI_IFR_TO_LOWER_OP) ||\r
       (Operand == EFI_IFR_TO_UPPER_OP) ||\r
-      (Operand == EFI_IFR_VERSION_OP)\r
-     ) {\r
+      (Operand == EFI_IFR_VERSION_OP)  ||\r
+      (Operand == EFI_IFR_SECURITY_OP)) {\r
     return TRUE;\r
   } else {\r
     return FALSE;\r
@@ -815,9 +837,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 +850,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 +865,7 @@ ParseOpCodes (
   CurrentDefault           = NULL;\r
   CurrentOption            = NULL;\r
   OptionSuppressExpression = NULL;\r
+  FormSuppressExpression   = NULL;\r
   ImageId                  = NULL;\r
 \r
   //\r
@@ -957,6 +985,10 @@ ParseOpCodes (
         ExpressionOpCode->QuestionId = CurrentStatement->QuestionId;\r
         break;\r
 \r
+      case EFI_IFR_SECURITY_OP:\r
+        CopyMem (&ExpressionOpCode->Guid, &((EFI_IFR_SECURITY *) OpCodeData)->Permissions, sizeof (EFI_GUID));\r
+        break;\r
+\r
       case EFI_IFR_QUESTION_REF1_OP:\r
         CopyMem (&ExpressionOpCode->QuestionId, &((EFI_IFR_EQ_ID_VAL_LIST *) OpCodeData)->QuestionId, sizeof (EFI_QUESTION_ID));\r
         break;\r
@@ -1081,11 +1113,15 @@ ParseOpCodes (
       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
+      if (OpCodeLength > OFFSET_OF (EFI_IFR_FORM_SET, Flags)) {\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
+      }\r
+\r
+      InitializeListHead (&FormSet->ExpressionListHead);\r
       break;\r
 \r
     case EFI_IFR_FORM_OP:\r
@@ -1101,6 +1137,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
@@ -1188,7 +1238,7 @@ ParseOpCodes (
     case EFI_IFR_SUBTITLE_OP:\r
       CurrentStatement = CreateStatement (OpCodeData, FormSet, CurrentForm);\r
       ASSERT (CurrentStatement != NULL);\r
-      \r
+\r
       CurrentStatement->Flags = ((EFI_IFR_SUBTITLE *) OpCodeData)->Flags;\r
 \r
       if (Scope != 0) {\r
@@ -1249,7 +1299,7 @@ ParseOpCodes (
     case EFI_IFR_NUMERIC_OP:\r
       CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
       ASSERT(CurrentStatement != NULL);\r
-      \r
+\r
       CurrentStatement->Flags = ((EFI_IFR_ONE_OF *) OpCodeData)->Flags;\r
       Value = &CurrentStatement->HiiValue;\r
 \r
@@ -1300,11 +1350,12 @@ ParseOpCodes (
     case EFI_IFR_ORDERED_LIST_OP:\r
       CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
       ASSERT(CurrentStatement != NULL);\r
-      \r
+\r
       CurrentStatement->Flags = ((EFI_IFR_ORDERED_LIST *) OpCodeData)->Flags;\r
       CurrentStatement->MaxContainers = ((EFI_IFR_ORDERED_LIST *) OpCodeData)->MaxContainers;\r
 \r
       CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_BUFFER;\r
+      CurrentStatement->BufferValue = NULL;\r
 \r
       if (Scope != 0) {\r
         SuppressForOption = TRUE;\r
@@ -1314,7 +1365,7 @@ ParseOpCodes (
     case EFI_IFR_CHECKBOX_OP:\r
       CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
       ASSERT(CurrentStatement != NULL);\r
-      \r
+\r
       CurrentStatement->Flags = ((EFI_IFR_CHECKBOX *) OpCodeData)->Flags;\r
       CurrentStatement->StorageWidth = sizeof (BOOLEAN);\r
       CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_BOOLEAN;\r
@@ -1363,7 +1414,7 @@ ParseOpCodes (
     case EFI_IFR_DATE_OP:\r
       CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
       ASSERT(CurrentStatement != NULL);\r
-      \r
+\r
       CurrentStatement->Flags = ((EFI_IFR_DATE *) OpCodeData)->Flags;\r
       CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_DATE;\r
 \r
@@ -1383,7 +1434,7 @@ ParseOpCodes (
     case EFI_IFR_TIME_OP:\r
       CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
       ASSERT(CurrentStatement != NULL);\r
-      \r
+\r
       CurrentStatement->Flags = ((EFI_IFR_TIME *) OpCodeData)->Flags;\r
       CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_TIME;\r
 \r
@@ -1458,6 +1509,7 @@ ParseOpCodes (
       //\r
       // Now we know the Storage width of nested Ordered List\r
       //\r
+      ASSERT (CurrentStatement != NULL);\r
       if ((CurrentStatement->Operand == EFI_IFR_ORDERED_LIST_OP) && (CurrentStatement->BufferValue == NULL)) {\r
         Width = 1;\r
         switch (CurrentOption->Value.Type) {\r
@@ -1510,6 +1562,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 +1578,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 +1615,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 +1681,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 +1697,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 +1822,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 +1846,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