]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EdkCompatibilityPkg/Compatibility/FrameworkHiiOnUefiHiiThunk/Utility.c
HII Library Class interface refine.
[mirror_edk2.git] / EdkCompatibilityPkg / Compatibility / FrameworkHiiOnUefiHiiThunk / Utility.c
index 0ad0668f728e6d1cb1f725b61cf67b505663a951..e74830de56b124c5bce82df42a6d62009d8d7955 100644 (file)
@@ -21,6 +21,220 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 CONST EFI_GUID  gZeroGuid = {0, 0, 0, {0, 0, 0, 0, 0, 0, 0, 0}};\r
 CONST CHAR16 FrameworkReservedVarstoreName[] = FRAMEWORK_RESERVED_VARSTORE_NAME;\r
 \r
+/**\r
+  \r
+  This function returns a list of the package handles of the   \r
+  specified type that are currently active in the HII database. The   \r
+  pseudo-type EFI_HII_PACKAGE_TYPE_ALL will cause all package   \r
+  handles to be listed.\r
+\r
+  If HandleBufferLength is NULL, then ASSERT.\r
+  If HandleBuffer is NULL, the ASSERT.\r
+  If PackageType is EFI_HII_PACKAGE_TYPE_GUID and PackageGuid is\r
+  NULL, then ASSERT.\r
+  If PackageType is not EFI_HII_PACKAGE_TYPE_GUID and PackageGuid is not\r
+  NULL, then ASSERT.\r
+  \r
+  \r
+  @param PackageType          Specifies the package type of the packages\r
+                              to list or EFI_HII_PACKAGE_TYPE_ALL for\r
+                              all packages to be listed.\r
+  \r
+  @param PackageGuid          If PackageType is\r
+                              EFI_HII_PACKAGE_TYPE_GUID, then this is\r
+                              the pointer to the GUID which must match\r
+                              the Guid field of\r
+                              EFI_HII_PACKAGE_GUID_HEADER. Otherwise, it\r
+                              must be NULL.\r
+  \r
+  @param HandleBufferLength   On output, the length of the handle buffer\r
+                              that is required for the handles found.\r
+\r
+  @param HandleBuffer         On output, an array of EFI_HII_HANDLE  instances returned.\r
+                              The caller is responcible to free this pointer allocated.\r
+\r
+  @retval EFI_SUCCESS           The matching handles are outputed successfully.\r
+                                HandleBufferLength is updated with the actual length.\r
+  @retval EFI_OUT_OF_RESOURCES  Not enough resource to complete the operation.\r
+  @retval EFI_NOT_FOUND         No matching handle could not be found in database.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+ListPackageLists (\r
+  IN        UINT8                     PackageType,\r
+  IN CONST  EFI_GUID                  *PackageGuid,\r
+  IN OUT    UINTN                     *HandleBufferLength,\r
+  OUT       EFI_HII_HANDLE            **HandleBuffer\r
+  )\r
+{\r
+  EFI_STATUS          Status;\r
+  \r
+  ASSERT (HandleBufferLength != NULL);\r
+  ASSERT (HandleBuffer != NULL);\r
+  \r
+  *HandleBufferLength = 0;\r
+  *HandleBuffer       = NULL;\r
+\r
+  if (PackageType == EFI_HII_PACKAGE_TYPE_GUID) {\r
+    ASSERT (PackageGuid != NULL);\r
+  } else {\r
+    ASSERT (PackageGuid == NULL);\r
+  }\r
+\r
+  Status = mHiiDatabase->ListPackageLists (\r
+                           mHiiDatabase,\r
+                           PackageType,\r
+                           PackageGuid,\r
+                           HandleBufferLength,\r
+                           *HandleBuffer\r
+                           );\r
+  if (EFI_ERROR (Status) && (Status != EFI_BUFFER_TOO_SMALL)) {\r
+    //\r
+    // No packages is registered to UEFI HII Database, just return.\r
+    // \r
+    //\r
+    return Status;\r
+  }\r
+\r
+  *HandleBuffer = AllocateZeroPool (*HandleBufferLength);\r
+  \r
+  if (*HandleBuffer == NULL) {\r
+    return EFI_OUT_OF_RESOURCES;\r
+  }\r
+  \r
+  return mHiiDatabase->ListPackageLists (\r
+                         mHiiDatabase,\r
+                         PackageType,\r
+                         PackageGuid,\r
+                         HandleBufferLength,\r
+                         *HandleBuffer\r
+                         );\r
+  \r
+}\r
+\r
+/**\r
+  Exports the contents of one or all package lists in the HII database into a buffer.\r
+\r
+  If Handle is not NULL and not a valid EFI_HII_HANDLE registered in the database, \r
+  then ASSERT.\r
+  If PackageListHeader is NULL, then ASSERT.\r
+  If PackageListSize is NULL, then ASSERT.\r
+\r
+  @param  Handle                 The HII Handle.\r
+  @param  PackageListHeader      A pointer to a buffer that will contain the results of \r
+                                 the export function.\r
+  @param  PackageListSize        On output, the length of the buffer that is required for the exported data.\r
+\r
+  @retval EFI_SUCCESS            Package exported.\r
+\r
+  @retval EFI_OUT_OF_RESOURCES   Not enought memory to complete the operations.\r
+\r
+**/\r
+EFI_STATUS \r
+EFIAPI\r
+ExportPackageLists (\r
+  IN EFI_HII_HANDLE                    Handle,\r
+  OUT EFI_HII_PACKAGE_LIST_HEADER      **PackageListHeader,\r
+  OUT UINTN                            *PackageListSize\r
+  )\r
+{\r
+  EFI_STATUS                       Status;\r
+  UINTN                            Size;\r
+  EFI_HII_PACKAGE_LIST_HEADER      *PackageListHdr;\r
+\r
+  ASSERT (PackageListSize != NULL);\r
+  ASSERT (PackageListHeader != NULL);\r
+\r
+  Size = 0;\r
+  PackageListHdr = NULL;\r
+  Status = mHiiDatabase->ExportPackageLists (\r
+                           mHiiDatabase,\r
+                           Handle,\r
+                           &Size,\r
+                           PackageListHdr\r
+                           );\r
+  ASSERT_EFI_ERROR (Status != EFI_BUFFER_TOO_SMALL);\r
+  \r
+  if (Status == EFI_BUFFER_TOO_SMALL) {\r
+    PackageListHdr = AllocateZeroPool (Size);\r
+    \r
+    if (PackageListHeader == NULL) {\r
+      return EFI_OUT_OF_RESOURCES;\r
+    } else {\r
+      Status = mHiiDatabase->ExportPackageLists (\r
+                               mHiiDatabase,\r
+                               Handle,\r
+                               &Size,\r
+                               PackageListHdr\r
+                               );\r
+    }\r
+  }\r
+\r
+  if (!EFI_ERROR (Status)) {\r
+    *PackageListHeader = PackageListHdr;\r
+    *PackageListSize   = Size;\r
+  } else {\r
+    FreePool (PackageListHdr);\r
+  }\r
+\r
+  return Status;\r
+}\r
+\r
+/**\r
+  Extract Hii package list GUID for given HII handle.\r
+\r
+  If HiiHandle could not be found in the HII database, then ASSERT.\r
+  If Guid is NULL, then ASSERT.\r
+\r
+  @param  Handle              Hii handle\r
+  @param  Guid                Package list GUID\r
+\r
+  @retval EFI_SUCCESS            Successfully extract GUID from Hii database.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+ExtractGuidFromHiiHandle (\r
+  IN      EFI_HII_HANDLE      Handle,\r
+  OUT     EFI_GUID            *Guid\r
+  )\r
+{\r
+  EFI_STATUS                   Status;\r
+  UINTN                        BufferSize;\r
+  EFI_HII_PACKAGE_LIST_HEADER  *HiiPackageList;\r
+\r
+  ASSERT (Guid != NULL);\r
+  ASSERT (Handle != NULL);\r
+\r
+  //\r
+  // Get HII PackageList\r
+  //\r
+  BufferSize = 0;\r
+  HiiPackageList = NULL;\r
+\r
+  Status = mHiiDatabase->ExportPackageLists (mHiiDatabase, Handle, &BufferSize, HiiPackageList);\r
+  ASSERT (Status != EFI_NOT_FOUND);\r
+  \r
+  if (Status == EFI_BUFFER_TOO_SMALL) {\r
+    HiiPackageList = AllocatePool (BufferSize);\r
+    ASSERT (HiiPackageList != NULL);\r
+\r
+    Status = mHiiDatabase->ExportPackageLists (mHiiDatabase, Handle, &BufferSize, HiiPackageList);\r
+  }\r
+  if (EFI_ERROR (Status)) {\r
+    FreePool (HiiPackageList);\r
+    return Status;\r
+  }\r
+\r
+  //\r
+  // Extract GUID\r
+  //\r
+  CopyGuid (Guid, &HiiPackageList->PackageListGuid);\r
+\r
+  FreePool (HiiPackageList);\r
+\r
+  return EFI_SUCCESS;\r
+}\r
 \r
 /**\r
   Find the corressponding UEFI HII Handle from a Framework HII Handle given.\r
@@ -202,7 +416,7 @@ CreateThunkContextForUefiHiiHandle (
   \r
   ThunkContext->UefiHiiHandle = UefiHiiHandle;\r
   \r
-  Status = HiiLibExtractGuidFromHiiHandle (UefiHiiHandle, &PackageGuid);\r
+  Status = ExtractGuidFromHiiHandle (UefiHiiHandle, &PackageGuid);\r
   ASSERT_EFI_ERROR (Status);\r
   \r
   CopyGuid(&ThunkContext->TagGuid, &PackageGuid);\r