]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Framework code may call PreparePacckage with NULL GUID and both IFR and String Packages.
authorqwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524>
Tue, 16 Sep 2008 06:47:08 +0000 (06:47 +0000)
committerqwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524>
Tue, 16 Sep 2008 06:47:08 +0000 (06:47 +0000)
    PackageList = PreparePackages (2, NULL, IfrPack, StringPack);

    mHii->NewPack( mHii, PackageList, &HiiHandle );

Framework HII database make use of the formset GUID as ID to retrieve String using

EFI_STATUS
GetStringFromToken (
  IN  EFI_GUID                  *ProducerGuid,
  IN  STRING_REF                Token,
  OUT CHAR16                    **String
  )

Update the code to cache the Formset GUID too.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@5896 6f19259b-4bc3-4df7-8a09-765794883524

EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Package.c
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Utility.c
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Utility.h

index b3e9bdd9be4bc260ab034a2d226a6659d2a210eb..d84eadeb93971926dbdc40ed13454534468c56d8 100644 (file)
@@ -259,7 +259,9 @@ UefiRegisterPackageList(
   UINTN                       IfrPackageCount;\r
   EFI_HII_PACKAGE_LIST_HEADER *PackageListHeader;\r
   HII_THUNK_CONTEXT           *ThunkContext;\r
+  HII_THUNK_CONTEXT           *ThunkContextToRemove;\r
   EFI_GUID                    GuidId;\r
+  EFI_HII_PACKAGE_HEADER      *IfrPackage;\r
 \r
   PackageListHeader = NULL;\r
 \r
@@ -274,6 +276,12 @@ UefiRegisterPackageList(
     return EFI_UNSUPPORTED;\r
   }\r
 \r
+  ThunkContext = CreateThunkContext (Private, StringPackageCount, IfrPackageCount);\r
+  if (ThunkContext == NULL) {\r
+    return EFI_OUT_OF_RESOURCES;\r
+  }\r
+  ThunkContext->ByFrameworkHiiNewPack = TRUE;\r
+  \r
   if (Packages->GuidId == NULL) {\r
     //\r
     // UEFI HII Database require Package List GUID must be unique.\r
@@ -284,39 +292,27 @@ UefiRegisterPackageList(
     // GUID.\r
     //\r
     ASSERT (StringPackageCount >=1 && IfrPackageCount == 1);\r
-    GenerateRandomGuid (&GuidId);\r
+    IfrPackage = GetIfrPackage (Packages);\r
+    GetFormSetGuid (IfrPackage, &ThunkContext->TagGuid);\r
   } else {\r
-    ThunkContext = TagGuidToIfrPackThunkContext (Private, Packages->GuidId);\r
+    ThunkContextToRemove = TagGuidToIfrPackThunkContext (Private, Packages->GuidId);\r
     \r
     if (IfrPackageCount > 0 && \r
         StringPackageCount > 0 && \r
-        (ThunkContext!= NULL)) {\r
+        (ThunkContextToRemove!= NULL)) {\r
         DEBUG((EFI_D_WARN, "Framework code registers HII package list with the same GUID more than once.\n"));\r
         DEBUG((EFI_D_WARN, "This package list should be already registered. Just return successfully.\n"));\r
-        HiiRemovePack (This, ThunkContext->FwHiiHandle);\r
+        HiiRemovePack (This, ThunkContextToRemove->FwHiiHandle);\r
     }\r
-    CopyGuid (&GuidId, Packages->GuidId);\r
+    CopyGuid (&ThunkContext->TagGuid, Packages->GuidId);\r
   }\r
 \r
-  ThunkContext = CreateThunkContext (Private, StringPackageCount, IfrPackageCount);\r
-  if (ThunkContext == NULL) {\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-  ThunkContext->ByFrameworkHiiNewPack = TRUE;\r
-  \r
   //\r
-  // Record the Package List GUID, it is used as a name for the package list by Framework HII.\r
+  // UEFI HII database does not allow two package list with the same GUID.\r
+  // In Framework HII implementation, Packages->GuidId is used as an identifier to associate \r
+  // a PackageList with only IFR to a Package list the with String package.\r
   //\r
-  CopyGuid (&ThunkContext->TagGuid, &GuidId);\r
-\r
-  if ((StringPackageCount == 0) && (IfrPackageCount != 0)) {\r
-    //\r
-    // UEFI HII database does not allow two package list with the same GUID.\r
-    // In Framework HII implementation, Packages->GuidId is used as an identifier to associate \r
-    // a PackageList with only IFR to a Package list the with String package.\r
-    //\r
-    GenerateRandomGuid (&GuidId);\r
-  }\r
+  GenerateRandomGuid (&GuidId);\r
 \r
   //\r
   // UEFI HII require EFI_HII_CONFIG_ACCESS_PROTOCOL to be installed on a EFI_HANDLE, so\r
index e015f832c087d899b371c777f868e2ae1f020d88..b05378901904e6424c77c9741ed31172951d40cf 100644 (file)
@@ -216,6 +216,85 @@ 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
+      CopyGuid (FormSetGuid, &FormSet->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
index 5d93c706279854a90bbc45bf708790b75500bd29..90b4784beae0a19dea541f87356a9367020d0e2e 100644 (file)
@@ -107,4 +107,17 @@ DestoryOneOfOptionMap (
   IN LIST_ENTRY     *OneOfOptionMapListHead\r
   );\r
 \r
+VOID\r
+GetFormSetGuid (\r
+  IN  EFI_HII_PACKAGE_HEADER  *Package,\r
+  OUT EFI_GUID                *FormSetGuid\r
+  )\r
+;\r
+\r
+EFI_HII_PACKAGE_HEADER *\r
+GetIfrPackage (\r
+  IN CONST EFI_HII_PACKAGES               *Packages\r
+  )\r
+;\r
+\r
 #endif\r