X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=MdePkg%2FLibrary%2FHiiLib%2FHiiLib.c;fp=MdePkg%2FLibrary%2FHiiLib%2FHiiLib.c;h=efae6780bc2356d1945abeacd12c97a0e7bc7f1b;hp=2eae82fec89c6b5a5b7481bca56e35bd70f09404;hb=55a9663bdea82251406a82c4eb0fdf81993a9664;hpb=d00afc4ef8ca8eaaf2debec3d9f40fa3ade3fae6 diff --git a/MdePkg/Library/HiiLib/HiiLib.c b/MdePkg/Library/HiiLib/HiiLib.c index 2eae82fec8..efae6780bc 100644 --- a/MdePkg/Library/HiiLib/HiiLib.c +++ b/MdePkg/Library/HiiLib/HiiLib.c @@ -505,6 +505,130 @@ HiiLibDevicePathToHiiHandle ( return HiiHandle; } +/** + Exports the contents of one or all package lists in the HII database into a buffer. + + If Handle is not NULL and not a valid EFI_HII_HANDLE registered in the database, + then ASSERT. + If PackageListHeader is NULL, then ASSERT. + If PackageListSize is NULL, then ASSERT. + + @param Handle The HII Handle. + @param PackageListHeader A pointer to a buffer that will contain the results of + the export function. + @param PackageListSize On output, the length of the buffer that is required for the exported data. + + @retval EFI_SUCCESS Package exported. + + @retval EFI_OUT_OF_RESOURCES Not enought memory to complete the operations. + +**/ +EFI_STATUS +EFIAPI +HiiLibExportPackageLists ( + IN EFI_HII_HANDLE Handle, + OUT EFI_HII_PACKAGE_LIST_HEADER **PackageListHeader, + OUT UINTN *PackageListSize + ) +{ + EFI_STATUS Status; + UINTN Size; + EFI_HII_PACKAGE_LIST_HEADER *PackageListHdr; + + ASSERT (PackageListSize != NULL); + ASSERT (PackageListHeader != NULL); + + LocateHiiProtocols (); + + if (Handle != NULL) { + ASSERT (IsHiiHandleRegistered (Handle)); + } + + Size = 0; + PackageListHdr = NULL; + Status = mHiiDatabaseProt->ExportPackageLists ( + mHiiDatabaseProt, + Handle, + &Size, + PackageListHdr + ); + ASSERT_EFI_ERROR (Status != EFI_BUFFER_TOO_SMALL); + + if (Status == EFI_BUFFER_TOO_SMALL) { + PackageListHdr = AllocateZeroPool (Size); + + if (PackageListHeader == NULL) { + return EFI_OUT_OF_RESOURCES; + } else { + Status = mHiiDatabaseProt->ExportPackageLists ( + mHiiDatabaseProt, + Handle, + &Size, + PackageListHdr + ); + } + } + + if (!EFI_ERROR (Status)) { + *PackageListHeader = PackageListHdr; + *PackageListSize = Size; + } else { + FreePool (PackageListHdr); + } + + return Status; +} + + +EFI_STATUS +EFIAPI +HiiLibListPackageLists ( + IN UINT8 PackageType, + IN CONST EFI_GUID *PackageGuid, + IN OUT UINTN *HandleBufferLength, + OUT EFI_HII_HANDLE **HandleBuffer + ) +{ + EFI_STATUS Status; + + ASSERT (HandleBufferLength != NULL); + ASSERT (HandleBuffer != NULL); + + *HandleBufferLength = 0; + *HandleBuffer = NULL; + + LocateHiiProtocols (); + + Status = mHiiDatabaseProt->ListPackageLists ( + mHiiDatabaseProt, + PackageType, + PackageGuid, + HandleBufferLength, + *HandleBuffer + ); + if (EFI_ERROR (Status) && (Status != EFI_BUFFER_TOO_SMALL)) { + // + // No packages is registered to UEFI HII Database, just return EFI_SUCCESS. + // + // + return Status; + } + + *HandleBuffer = AllocateZeroPool (*HandleBufferLength); + + if (*HandleBuffer == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + return mHiiDatabaseProt->ListPackageLists ( + mHiiDatabaseProt, + PackageType, + PackageGuid, + HandleBufferLength, + *HandleBuffer + ); + +} /** This function check if the Hii Handle is a valid handle registered in the HII database.