]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Utility.c
Fix the build bugs for these three files.
[mirror_edk2.git] / EdkCompatibilityPkg / Compatibility / FrameworkHiiToUefiHiiThunk / Utility.c
index 58019d5b9516b9bb4d58404248e7a53f9ca5188b..b0010a6f9beb85edfcc547e802ffe1bd3a19c12c 100644 (file)
@@ -15,34 +15,12 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \r
 \r
 #include "HiiDatabase.h"\r
+#include "HiiHandle.h"\r
 \r
 EFI_GUID  gFrameworkHiiCompatbilityGuid = EFI_IFR_FRAMEWORK_GUID;\r
 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
@@ -112,8 +90,8 @@ UefiHiiHandleToThunkContext (
   return NULL;\r
 }\r
 \r
-EFI_HII_HANDLE *\r
-TagGuidToUefiHiiHandle (\r
+HII_THUNK_CONTEXT *\r
+TagGuidToIfrPackThunkContext (\r
   IN CONST HII_THUNK_PRIVATE_DATA *Private,\r
   IN CONST EFI_GUID                   *Guid\r
   )\r
@@ -127,7 +105,7 @@ TagGuidToUefiHiiHandle (
     ThunkContext = HII_THUNK_CONTEXT_FROM_LINK (Link);\r
 \r
     if (CompareGuid (Guid, &ThunkContext->TagGuid) && (ThunkContext->IfrPackageCount != 0)) {\r
-      return ThunkContext->UefiHiiHandle;\r
+      return ThunkContext;\r
     }\r
 \r
     Link = GetNextNode (&Private->ThunkContextListHead, Link);\r
@@ -137,47 +115,8 @@ TagGuidToUefiHiiHandle (
   \r
 }\r
 \r
-BOOLEAN\r
-IsFrameworkHiiDatabaseHandleDepleted (\r
-  IN CONST HII_THUNK_PRIVATE_DATA *Private\r
-  )\r
-{\r
-  return (BOOLEAN) (Private->StaticHiiHandle == (UINTN) Private->StaticPureUefiHiiHandle);\r
-}\r
-\r
-EFI_STATUS\r
-AssignFrameworkHiiHandle (\r
-  IN OUT HII_THUNK_PRIVATE_DATA     *Private,\r
-  IN     BOOLEAN                    FromFwHiiNewPack,\r
-  OUT    FRAMEWORK_EFI_HII_HANDLE   *Handle\r
-  )\r
-{\r
-  ASSERT (Handle != NULL);\r
-\r
-  if (FromFwHiiNewPack) {\r
 \r
-    *Handle = Private->StaticHiiHandle;\r
-    Private->StaticHiiHandle += 1;\r
-\r
-    if (IsFrameworkHiiDatabaseHandleDepleted (Private)) {\r
-      return EFI_OUT_OF_RESOURCES;\r
-    }\r
-\r
-  } else {\r
-\r
-    *Handle = Private->StaticPureUefiHiiHandle;\r
-    Private->StaticPureUefiHiiHandle -= 1;\r
-    \r
-    if (IsFrameworkHiiDatabaseHandleDepleted (Private)) {\r
-      return EFI_OUT_OF_RESOURCES;\r
-    }\r
-\r
-  }\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
+VOID\r
 DestroyThunkContextForUefiHiiHandle (\r
   IN HII_THUNK_PRIVATE_DATA     *Private,\r
   IN EFI_HII_HANDLE             UefiHiiHandle\r
@@ -188,14 +127,7 @@ DestroyThunkContextForUefiHiiHandle (
   ThunkContext = UefiHiiHandleToThunkContext (Private, UefiHiiHandle);\r
   ASSERT (ThunkContext != NULL);\r
 \r
-  ASSERT (IsListEmpty (&ThunkContext->OneOfOptionMapListHead));\r
-  ASSERT (IsListEmpty (&ThunkContext->QuestionIdMapListHead));\r
-  \r
-  RemoveEntryList (&ThunkContext->Link);\r
-\r
-  FreePool (ThunkContext);\r
-    \r
-  return EFI_SUCCESS;\r
+  DestroyThunkContext (ThunkContext);\r
 }\r
 \r
 \r
@@ -208,7 +140,6 @@ DestroyThunkContextForUefiHiiHandle (
 **/\r
 HII_THUNK_CONTEXT *\r
 CreateThunkContextForUefiHiiHandle (\r
-  IN  HII_THUNK_PRIVATE_DATA     *Private,\r
   IN  EFI_HII_HANDLE             UefiHiiHandle\r
  )\r
 {\r
@@ -221,7 +152,7 @@ CreateThunkContextForUefiHiiHandle (
   \r
   ThunkContext->Signature = HII_THUNK_CONTEXT_SIGNATURE;\r
 \r
-  Status = AssignFrameworkHiiHandle (Private, FALSE, &ThunkContext->FwHiiHandle);\r
+  Status = AllocateHiiHandle (&ThunkContext->FwHiiHandle);\r
   if (EFI_ERROR (Status)) {\r
     return NULL;\r
   }\r
@@ -236,8 +167,6 @@ CreateThunkContextForUefiHiiHandle (
   InitializeListHead (&ThunkContext->QuestionIdMapListHead);\r
   InitializeListHead (&ThunkContext->OneOfOptionMapListHead);\r
   \r
-  InsertTailList (&Private->ThunkContextListHead, &ThunkContext->Link);\r
-\r
   return ThunkContext;\r
 }\r
 \r
@@ -287,6 +216,173 @@ GetOneOfOptionMapEntryListHead (
   return NULL;\r
 }\r
 \r
+EFI_HII_PACKAGE_HEADER *\r
+GetIfrPackage (\r
+  IN CONST EFI_HII_PACKAGES               *Packages\r
+  )\r
+{\r
+  UINTN                         Index;\r
+  TIANO_AUTOGEN_PACKAGES_HEADER **TianoAutogenPackageHdrArray;\r
+\r
+  ASSERT (Packages != NULL);\r
+\r
+  TianoAutogenPackageHdrArray = (TIANO_AUTOGEN_PACKAGES_HEADER **) (((UINT8 *) &Packages->GuidId) + sizeof (Packages->GuidId));\r
+  \r
+  for (Index = 0; Index < Packages->NumberOfPackages; Index++) {\r
+    //\r
+    // The current UEFI HII build tool generate a binary in the format defined by \r
+    // TIANO_AUTOGEN_PACKAGES_HEADER. We assume that all packages generated in\r
+    // this binary is with same package type. So the returned IfrPackageCount and StringPackageCount\r
+    // may not be the exact number of valid package number in the binary generated \r
+    // by HII Build tool.\r
+    //\r
+    switch (TianoAutogenPackageHdrArray[Index]->PackageHeader.Type) {\r
+      case EFI_HII_PACKAGE_FORM:\r
+        return &TianoAutogenPackageHdrArray[Index]->PackageHeader;\r
+        break;\r
+      case EFI_HII_PACKAGE_STRINGS:\r
+      case EFI_HII_PACKAGE_SIMPLE_FONTS:\r
+        break;\r
+\r
+      //\r
+      // The following fonts are invalid for a module that using Framework to UEFI thunk layer.\r
+      //\r
+      case EFI_HII_PACKAGE_KEYBOARD_LAYOUT:\r
+      case EFI_HII_PACKAGE_FONTS:\r
+      case EFI_HII_PACKAGE_IMAGES:\r
+      default:\r
+        ASSERT (FALSE);\r
+        return NULL;\r
+        break;\r
+    }\r
+  }\r
+\r
+  return NULL;\r
+}\r
+\r
+VOID\r
+GetFormSetGuid (\r
+  IN  EFI_HII_PACKAGE_HEADER  *Package,\r
+  OUT EFI_GUID                *FormSetGuid\r
+  )\r
+{\r
+  UINTN                         Offset;\r
+  EFI_IFR_OP_HEADER             *OpCode;\r
+  EFI_IFR_FORM_SET              *FormSet;\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
+      CopyMem (FormSetGuid, &FormSet->Guid, sizeof (EFI_GUID));\r
+      return;\r
+      \r
+      default:\r
+        break;\r
+      \r
+    }\r
+    Offset += OpCode->Length;\r
+  }\r
+\r
+  //\r
+  // A proper IFR must have a formset opcode.\r
+  //\r
+  ASSERT (FALSE);\r
+\r
+}\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 (CompareMem (&Class->Guid, &gTianoHiiIfrGuid, sizeof (EFI_GUID)) == 0) {\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
@@ -310,6 +406,14 @@ 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
+  UINT8                         OneOfType;\r
+  EFI_IFR_ONE_OF                *OneOfOpcode;\r
+\r
+  //\r
+  // Set to a invalid value.\r
+  //\r
+  OneOfType = (UINT8) -1;\r
   \r
 \r
   Status = HiiLibExportPackageLists (ThunkContext->UefiHiiHandle, &List, &Size);\r
@@ -384,11 +488,16 @@ CreateQuestionIdMap (
             InsertTailList (QuestionIdMapEntryListHead, &IdMapEntry->Link);\r
           }\r
 \r
+          if (OpCode->OpCode == EFI_IFR_ONE_OF_OP) {\r
+            OneOfOpcode = (EFI_IFR_ONE_OF *) OpCode;\r
+            OneOfType   = OneOfOpcode->Flags & EFI_IFR_NUMERIC_SIZE;\r
+          }\r
+\r
           break;\r
        \r
         case EFI_IFR_GUID_OP:\r
           OptionMap = (EFI_IFR_GUID_OPTIONKEY *) OpCode;\r
-          if (CompareGuid (&OptionMap->Guid, &gFrameworkHiiCompatbilityGuid)) {\r
+          if (CompareMem (&OptionMap->Guid, &gFrameworkHiiCompatbilityGuid, sizeof (EFI_GUID)) == 0) {\r
             if (OptionMap->ExtendOpCode == EFI_IFR_EXTEND_OP_OPTIONKEY) {\r
               OneOfOptinMapEntryListHead = GetOneOfOptionMapEntryListHead (ThunkContext, OptionMap->QuestionId);\r
               if (OneOfOptinMapEntryListHead == NULL) {\r
@@ -397,7 +506,12 @@ CreateQuestionIdMap (
 \r
                 OneOfOptionMap->Signature = ONE_OF_OPTION_MAP_SIGNATURE;\r
                 OneOfOptionMap->QuestionId = OptionMap->QuestionId;\r
-                OneOfOptionMap->ValueType = EFI_IFR_TYPE_NUM_SIZE_8;\r
+\r
+                //\r
+                // Make sure OneOfType is initialized.\r
+                //\r
+                ASSERT (OneOfType != (UINT8) -1);\r
+                OneOfOptionMap->ValueType = OneOfType;\r
                 InitializeListHead (&OneOfOptionMap->OneOfOptionMapEntryListHead);\r
                 OneOfOptinMapEntryListHead = &OneOfOptionMap->OneOfOptionMapEntryListHead;\r
                 InsertTailList (&ThunkContext->OneOfOptionMapListHead, &OneOfOptionMap->Link);\r
@@ -411,7 +525,7 @@ CreateQuestionIdMap (
               \r
               InsertTailList (OneOfOptinMapEntryListHead, &OneOfOptionMapEntry->Link);\r
             }\r
-          }else if (CompareGuid (&OptionMap->Guid, &gTianoHiiIfrGuid)) {\r
+         } else if (CompareMem (&OptionMap->Guid, &gTianoHiiIfrGuid, sizeof (EFI_GUID)) == 0) {\r
             Class = (EFI_IFR_GUID_CLASS *) OpCode;\r
 \r
             switch (Class->ExtendOpCode) {\r
@@ -419,7 +533,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
@@ -471,3 +586,114 @@ GetMapEntryListHead (
 }\r
 \r
 \r
+HII_THUNK_CONTEXT *\r
+CreateThunkContext (\r
+  IN  HII_THUNK_PRIVATE_DATA      *Private,\r
+  IN  UINTN                       StringPackageCount,\r
+  IN  UINTN                       IfrPackageCount\r
+  )\r
+{\r
+  EFI_STATUS                   Status;\r
+  HII_THUNK_CONTEXT            *ThunkContext;\r
+\r
+  ThunkContext = AllocateZeroPool (sizeof (HII_THUNK_CONTEXT));\r
+  ASSERT (ThunkContext != NULL);\r
+  \r
+  ThunkContext->Signature = HII_THUNK_CONTEXT_SIGNATURE;\r
+  ThunkContext->IfrPackageCount = IfrPackageCount;\r
+  ThunkContext->StringPackageCount = StringPackageCount;\r
+  Status = AllocateHiiHandle (&ThunkContext->FwHiiHandle);\r
+  if (EFI_ERROR (Status)) {\r
+    return NULL;\r
+  }\r
+\r
+  InitializeListHead (&ThunkContext->QuestionIdMapListHead);\r
+  InitializeListHead (&ThunkContext->OneOfOptionMapListHead);\r
+\r
+\r
+  return ThunkContext;\r
+     \r
+}\r
+\r
+VOID\r
+DestroyThunkContext (\r
+  IN HII_THUNK_CONTEXT          *ThunkContext\r
+  )\r
+{\r
+  ASSERT (ThunkContext != NULL);\r
+\r
+  FreeHiiHandle (ThunkContext->FwHiiHandle);\r
+\r
+  DestroyQuestionIdMap (&ThunkContext->QuestionIdMapListHead);\r
+\r
+  DestoryOneOfOptionMap (&ThunkContext->OneOfOptionMapListHead);\r
+\r
+  RemoveEntryList (&ThunkContext->Link);\r
+\r
+  FreePool (ThunkContext);\r
+}\r
+\r
+\r
+VOID\r
+DestroyQuestionIdMap (\r
+  IN LIST_ENTRY     *QuestionIdMapListHead\r
+  )\r
+{\r
+  QUESTION_ID_MAP           *IdMap;\r
+  QUESTION_ID_MAP_ENTRY     *IdMapEntry;\r
+  LIST_ENTRY                *Link;\r
+  LIST_ENTRY                *Link2;\r
+\r
+  while (!IsListEmpty (QuestionIdMapListHead)) {\r
+    Link = GetFirstNode (QuestionIdMapListHead);\r
+    \r
+    IdMap = QUESTION_ID_MAP_FROM_LINK (Link);\r
+\r
+    while (!IsListEmpty (&IdMap->MapEntryListHead)) {\r
+      Link2 = GetFirstNode (&IdMap->MapEntryListHead);\r
+      \r
+      IdMapEntry = QUESTION_ID_MAP_ENTRY_FROM_LINK (Link2);\r
+\r
+      RemoveEntryList (Link2);\r
+\r
+      FreePool (IdMapEntry);\r
+    }\r
+\r
+    RemoveEntryList (Link);\r
+    FreePool (IdMap);\r
+  }\r
+}\r
+\r
+VOID\r
+DestoryOneOfOptionMap (\r
+  IN LIST_ENTRY     *OneOfOptionMapListHead\r
+  )\r
+{\r
+  ONE_OF_OPTION_MAP         *Map;\r
+  ONE_OF_OPTION_MAP_ENTRY   *MapEntry;\r
+  LIST_ENTRY                *Link;\r
+  LIST_ENTRY                *Link2;\r
+\r
+  while (!IsListEmpty (OneOfOptionMapListHead)) {\r
+    Link = GetFirstNode (OneOfOptionMapListHead);\r
+    \r
+    Map = ONE_OF_OPTION_MAP_FROM_LINK (Link);\r
+\r
+    while (!IsListEmpty (&Map->OneOfOptionMapEntryListHead)) {\r
+      Link2 = GetFirstNode (&Map->OneOfOptionMapEntryListHead);\r
+      \r
+      MapEntry = ONE_OF_OPTION_MAP_ENTRY_FROM_LINK (Link2);\r
+\r
+      RemoveEntryList (Link2);\r
+\r
+      FreePool (MapEntry);\r
+    }\r
+\r
+    RemoveEntryList (Link);\r
+    FreePool (Map);\r
+  }\r
+}\r
+\r
+\r
+\r
+\r