]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Utility.c
1) Add GetAttributesOfFirstFormSet to scan form package to read formset title, class...
[mirror_edk2.git] / EdkCompatibilityPkg / Compatibility / FrameworkHiiToUefiHiiThunk / Utility.c
index 9e41487778f2304022e5e354ea0f6f0ba611640c..8208b813c7072d44a4ba999dc3ada90d6efd9e96 100644 (file)
@@ -21,29 +21,6 @@ EFI_GUID  gFrameworkHiiCompatbilityGuid = EFI_IFR_FRAMEWORK_GUID;
 EFI_GUID  gTianoHiiIfrGuid              = EFI_IFR_TIANO_GUID;\r
 \r
 \r
-EFI_GUID *\r
-GetGuidOfFirstFormset (\r
-  CONST EFI_HII_FORM_PACKAGE * FormPackage\r
-) \r
-{\r
-  UINT8                   *StartOfNextPackage;\r
-  EFI_IFR_OP_HEADER       *OpCodeData;\r
-\r
-  StartOfNextPackage = (UINT8 *) FormPackage + FormPackage->Header.Length;\r
-  OpCodeData = (EFI_IFR_OP_HEADER *) (FormPackage + 1);\r
-\r
-  while ((UINT8 *) OpCodeData < StartOfNextPackage) {\r
-    if (OpCodeData->OpCode == EFI_IFR_FORM_SET_OP) {\r
-      return AllocateCopyPool (sizeof(EFI_GUID), &(((EFI_IFR_FORM_SET *) OpCodeData)->Guid));\r
-    }\r
-    OpCodeData = (EFI_IFR_OP_HEADER *) ((UINT8 *) OpCodeData + OpCodeData->Length);\r
-  }\r
-\r
-  ASSERT (FALSE);\r
-\r
-  return NULL;\r
-}\r
-\r
 EFI_HII_HANDLE\r
 FwHiiHandleToUefiHiiHandle (\r
   IN CONST HII_THUNK_PRIVATE_DATA      *Private,\r
@@ -239,6 +216,94 @@ GetOneOfOptionMapEntryListHead (
   return NULL;\r
 }\r
 \r
+VOID\r
+GetAttributesOfFirstFormSet (\r
+  IN    OUT HII_THUNK_CONTEXT  *ThunkContext\r
+  )\r
+{\r
+  EFI_STATUS                    Status;\r
+  EFI_HII_PACKAGE_LIST_HEADER   *List;\r
+  EFI_HII_PACKAGE_HEADER        *Package;\r
+  UINTN                         Size;\r
+  EFI_IFR_OP_HEADER             *OpCode;\r
+  UINTN                         Offset;\r
+  EFI_IFR_GUID_CLASS            *Class;\r
+  EFI_IFR_FORM_SET              *FormSet;\r
+  EFI_IFR_GUID_SUBCLASS         *SubClass;\r
+\r
+  Status = HiiLibExportPackageLists (ThunkContext->UefiHiiHandle, &List, &Size);\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  //\r
+  // There must be at least one EFI_HII_PACKAGE_FORM in the package list.\r
+  //\r
+  ASSERT (GetPackageCountByType (List, EFI_HII_PACKAGE_FORM) >= 1);\r
+\r
+  //\r
+  // Skip the package list header.\r
+  //\r
+  Package = (EFI_HII_PACKAGE_HEADER *) (List + 1);\r
+\r
+  while (Package->Type != EFI_HII_PACKAGE_END) {\r
+\r
+    if (Package->Type == EFI_HII_PACKAGE_FORM) {\r
+\r
+      //\r
+      // Skip the package header\r
+      //\r
+      Offset = sizeof (EFI_HII_PACKAGE_HEADER);\r
+      while (Offset < Package->Length) {\r
+        OpCode = (EFI_IFR_OP_HEADER *)((UINT8 *) Package + Offset);\r
+\r
+        switch (OpCode->OpCode) {\r
+        case EFI_IFR_FORM_SET_OP:\r
+          FormSet = (EFI_IFR_FORM_SET *) OpCode;\r
+          ThunkContext->FormSetTitle = FormSet->FormSetTitle;\r
+          ThunkContext->FormSetHelp  = FormSet->Help;\r
+          break;\r
+          \r
+\r
+        case EFI_IFR_GUID_OP:\r
+          Class = (EFI_IFR_GUID_CLASS*) OpCode;\r
+          if (CompareGuid (&Class->Guid, &gTianoHiiIfrGuid)) {\r
+            Class = (EFI_IFR_GUID_CLASS *) OpCode;\r
+\r
+            switch (Class->ExtendOpCode) {\r
+              case EFI_IFR_EXTEND_OP_CLASS:\r
+                ThunkContext->FormSetClass = Class->Class;\r
+                break;\r
+              case EFI_IFR_EXTEND_OP_SUBCLASS:\r
+                SubClass = (EFI_IFR_GUID_SUBCLASS *) OpCode;\r
+                ThunkContext->FormSetSubClass = SubClass->SubClass;\r
+                break;\r
+\r
+              default:\r
+                break;\r
+            }\r
+          }\r
+          break;\r
+          \r
+        default:\r
+          break;\r
+        \r
+        }\r
+\r
+        Offset += OpCode->Length;\r
+      }\r
+      //\r
+      // The attributes of first FormSet is ready now.\r
+      //\r
+      FreePool (List);\r
+      return;\r
+      \r
+      break;\r
+    }\r
+\r
+    Package = (EFI_HII_PACKAGE_HEADER *) (UINT8 *) Package + Package->Length;\r
+  }\r
+\r
+}\r
+\r
 \r
 EFI_STATUS\r
 CreateQuestionIdMap (\r
@@ -262,6 +327,7 @@ CreateQuestionIdMap (
   ONE_OF_OPTION_MAP             *OneOfOptionMap;\r
   ONE_OF_OPTION_MAP_ENTRY       *OneOfOptionMapEntry;\r
   EFI_IFR_GUID_CLASS            *Class;\r
+  EFI_IFR_GUID_SUBCLASS         *SubClass;\r
   \r
 \r
   Status = HiiLibExportPackageLists (ThunkContext->UefiHiiHandle, &List, &Size);\r
@@ -371,7 +437,8 @@ CreateQuestionIdMap (
                 ThunkContext->FormSetClass = Class->Class;\r
                 break;\r
               case EFI_IFR_EXTEND_OP_SUBCLASS:\r
-                ThunkContext->FormSetSubClass = ((EFI_IFR_GUID_SUBCLASS *) Class)->SubClass;\r
+                SubClass = (EFI_IFR_GUID_SUBCLASS *) OpCode;\r
+                ThunkContext->FormSetSubClass = SubClass->SubClass;\r
                 break;\r
 \r
               default:\r
@@ -489,7 +556,7 @@ DestroyQuestionIdMap (
     while (!IsListEmpty (&IdMap->MapEntryListHead)) {\r
       Link2 = GetFirstNode (&IdMap->MapEntryListHead);\r
       \r
-      IdMapEntry = QUESTION_ID_MAP_ENTRY_FROM_LINK (Link);\r
+      IdMapEntry = QUESTION_ID_MAP_ENTRY_FROM_LINK (Link2);\r
 \r
       RemoveEntryList (Link2);\r
 \r
@@ -519,7 +586,7 @@ DestoryOneOfOptionMap (
     while (!IsListEmpty (&Map->OneOfOptionMapEntryListHead)) {\r
       Link2 = GetFirstNode (&Map->OneOfOptionMapEntryListHead);\r
       \r
-      MapEntry = ONE_OF_OPTION_MAP_ENTRY_FROM_LINK (Link);\r
+      MapEntry = ONE_OF_OPTION_MAP_ENTRY_FROM_LINK (Link2);\r
 \r
       RemoveEntryList (Link2);\r
 \r