]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EdkCompatibilityPkg/Compatibility/FrameworkHiiOnUefiHiiThunk/UefiIfrParser.c
Add new HII FormMap Opcode support
[mirror_edk2.git] / EdkCompatibilityPkg / Compatibility / FrameworkHiiOnUefiHiiThunk / UefiIfrParser.c
index d58d62c58abbcaa431f48e6bbbb28e0569f2cfc9..98754ec544735e84f40876a2f79a5a0d9834f74f 100644 (file)
@@ -12,24 +12,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \r
 **/\r
 \r
-#include <PiDxe.h>\r
-\r
-#include <Protocol/HiiConfigAccess.h>\r
-#include <Protocol/HiiConfigRouting.h>\r
-#include <Protocol/HiiDatabase.h>\r
-#include <Protocol/HiiString.h>\r
-\r
-#include <Library/BaseLib.h>\r
-#include <Library/BaseMemoryLib.h>\r
-#include <Library/DebugLib.h>\r
-#include <Library/HiiLib.h>\r
-#include <Library/MemoryAllocationLib.h>\r
-#include <Library/PrintLib.h>\r
-#include <Library/UefiBootServicesTableLib.h>\r
-\r
-#include <Guid/MdeModuleHii.h>\r
-\r
-#include "UefiIfrParser.h"\r
+#include "HiiDatabase.h"\r
 \r
 #include "UefiIfrParserExpression.h"\r
 \r
@@ -425,9 +408,14 @@ IsExpressionOpCode (
   )\r
 {\r
   if (((Operand >= EFI_IFR_EQ_ID_VAL_OP) && (Operand <= EFI_IFR_NOT_OP)) ||\r
-      ((Operand >= EFI_IFR_MATCH_OP) && (Operand <= EFI_IFR_SPAN_OP)) ||\r
-      (Operand == EFI_IFR_CATENATE_OP)\r
-     ) {\r
+      ((Operand >= EFI_IFR_MATCH_OP) && (Operand <= EFI_IFR_SET_OP))  ||\r
+      ((Operand >= EFI_IFR_EQUAL_OP) && (Operand <= EFI_IFR_SPAN_OP)) ||\r
+      (Operand == EFI_IFR_CATENATE_OP) ||\r
+      (Operand == EFI_IFR_TO_LOWER_OP) ||\r
+      (Operand == EFI_IFR_TO_UPPER_OP) ||\r
+      (Operand == EFI_IFR_MAP_OP)      ||\r
+      (Operand == EFI_IFR_VERSION_OP)  ||\r
+      (Operand == EFI_IFR_SECURITY_OP)) {\r
     return TRUE;\r
   } else {\r
     return FALSE;\r
@@ -518,12 +506,16 @@ ParseOpCodes (
   ONE_OF_OPTION_MAP_ENTRY *OneOfOptionMapEntry;\r
   UINT8                   OneOfType;\r
   EFI_IFR_ONE_OF          *OneOfOpcode;\r
+  HII_THUNK_CONTEXT       *ThunkContext;\r
+  EFI_IFR_FORM_MAP_METHOD *MapMethod;\r
 \r
-  mInScopeSubtitle         = FALSE;\r
-  mInScopeSuppress         = FALSE;\r
-  mInScopeGrayOut          = FALSE;\r
-  CurrentDefault           = NULL;\r
-  CurrentOption            = NULL;\r
+  mInScopeSubtitle = FALSE;\r
+  mInScopeSuppress = FALSE;\r
+  mInScopeGrayOut  = FALSE;\r
+  CurrentDefault   = NULL;\r
+  CurrentOption    = NULL;\r
+  MapMethod        = NULL;\r
+  ThunkContext     = UefiHiiHandleToThunkContext ((CONST HII_THUNK_PRIVATE_DATA*) mHiiThunkPrivateData, FormSet->HiiHandle);\r
 \r
   //\r
   // Set to a invalid value.\r
@@ -607,6 +599,49 @@ ParseOpCodes (
       InsertTailList (&FormSet->FormListHead, &CurrentForm->Link);\r
       break;\r
 \r
+    case EFI_IFR_FORM_MAP_OP:\r
+      //\r
+      // Create a new Form Map for this FormSet\r
+      //\r
+      CurrentForm = AllocateZeroPool (sizeof (FORM_BROWSER_FORM));\r
+      CurrentForm->Signature = FORM_BROWSER_FORM_SIGNATURE;\r
+\r
+      InitializeListHead (&CurrentForm->StatementListHead);\r
+\r
+      CopyMem (&CurrentForm->FormId, &((EFI_IFR_FORM *) OpCodeData)->FormId, sizeof (UINT16));\r
+      MapMethod = (EFI_IFR_FORM_MAP_METHOD *) (OpCodeData + sizeof (EFI_IFR_FORM_MAP));\r
+\r
+      //\r
+      // FormMap Form must contain at least one Map Method.\r
+      //\r
+      if (((EFI_IFR_OP_HEADER *) OpCodeData)->Length < ((UINTN) (UINT8 *) (MapMethod + 1) - (UINTN) OpCodeData)) {\r
+        return EFI_INVALID_PARAMETER;\r
+      }\r
+\r
+      //\r
+      // Try to find the standard form map method.\r
+      //\r
+      while (((UINTN) (UINT8 *) MapMethod - (UINTN) OpCodeData) < ((EFI_IFR_OP_HEADER *) OpCodeData)->Length) {\r
+        if (CompareGuid ((EFI_GUID *) (VOID *) &MapMethod->MethodIdentifier, &gEfiHiiStandardFormGuid)) {\r
+          CopyMem (&CurrentForm->FormTitle, &MapMethod->MethodTitle, sizeof (EFI_STRING_ID));\r
+          break;\r
+        }\r
+        MapMethod ++;\r
+      }\r
+      //\r
+      // If the standard form map method is not found, the first map method title will be used.\r
+      //\r
+      if (CurrentForm->FormTitle == 0) {\r
+        MapMethod = (EFI_IFR_FORM_MAP_METHOD *) (OpCodeData + sizeof (EFI_IFR_FORM_MAP));\r
+        CopyMem (&CurrentForm->FormTitle, &MapMethod->MethodTitle, sizeof (EFI_STRING_ID));\r
+      }\r
+\r
+      //\r
+      // Insert into Form list of this FormSet\r
+      //\r
+      InsertTailList (&FormSet->FormListHead, &CurrentForm->Link);\r
+      break;\r
+\r
     //\r
     // Storage\r
     //\r
@@ -631,7 +666,21 @@ ParseOpCodes (
       break;\r
 \r
     case EFI_IFR_VARSTORE_NAME_VALUE_OP:\r
-      ASSERT (FALSE);\r
+      //\r
+      // Framework IFR doesn't support Name/Value VarStore opcode\r
+      //\r
+      if (ThunkContext != NULL && ThunkContext->ByFrameworkHiiNewPack) {\r
+        ASSERT (FALSE);\r
+      }\r
+\r
+      //\r
+      // Create a name/value Storage for this FormSet\r
+      //\r
+      Storage = CreateStorage (FormSet);\r
+      Storage->Type = EFI_HII_VARSTORE_NAME_VALUE;\r
+\r
+      CopyMem (&Storage->VarStoreId, &((EFI_IFR_VARSTORE_NAME_VALUE *) OpCodeData)->VarStoreId, sizeof (EFI_VARSTORE_ID));\r
+      CopyMem (&Storage->Guid,       &((EFI_IFR_VARSTORE_NAME_VALUE *) OpCodeData)->Guid,       sizeof (EFI_GUID));\r
 \r
       break;\r
 \r
@@ -698,8 +747,7 @@ ParseOpCodes (
       break;\r
 \r
     case EFI_IFR_RESET_BUTTON_OP:\r
-      CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\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
@@ -908,13 +956,19 @@ ParseOpCodes (
       break;\r
 \r
     case EFI_IFR_DISABLE_IF_OP:\r
-      ASSERT (FALSE);\r
-\r
+      //\r
+      // Framework IFR doesn't support DisableIf opcode\r
+      //\r
+      if (ThunkContext != NULL && ThunkContext->ByFrameworkHiiNewPack) {\r
+        ASSERT (FALSE);\r
+      }\r
 \r
     //\r
     // Expression\r
     //\r
     case EFI_IFR_VALUE_OP:\r
+    case EFI_IFR_READ_OP:\r
+    case EFI_IFR_WRITE_OP:\r
       break;\r
 \r
     case EFI_IFR_RULE_OP:\r
@@ -936,6 +990,7 @@ ParseOpCodes (
         break;\r
 \r
       case EFI_IFR_FORM_OP:\r
+      case EFI_IFR_FORM_MAP_OP:\r
         ImageId = &CurrentForm->ImageId;\r
         break;\r
 \r
@@ -987,8 +1042,7 @@ ParseOpCodes (
         default:\r
           break;\r
         }\r
-      } \r
-      else if (CompareGuid ((EFI_GUID *)(VOID *)&OptionMap->Guid, &mFrameworkHiiCompatibilityGuid)) {\r
+      } else if (CompareGuid ((EFI_GUID *)(VOID *)&OptionMap->Guid, &mFrameworkHiiCompatibilityGuid)) {\r
         if (OptionMap->ExtendOpCode == EFI_IFR_EXTEND_OP_OPTIONKEY) {\r
           OneOfOptinMapEntryListHead = GetOneOfOptionMapEntryListHead (FormSet, OptionMap->QuestionId);\r
           if (OneOfOptinMapEntryListHead == NULL) {\r
@@ -1039,6 +1093,7 @@ ParseOpCodes (
         break;\r
 \r
       case EFI_IFR_FORM_OP:\r
+      case EFI_IFR_FORM_MAP_OP:\r
         //\r
         // End of Form\r
         //\r