X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=IntelFrameworkPkg%2FLibrary%2FFrameworkHiiLib%2FHiiLib.c;h=f2edf44317a837b985bdd18288c7c9cfb7d51719;hp=913b471c5aa49a75781a6d9ae687377c3f09b27e;hb=7459094d5f6904a0c8445d97519f4a99b654ef43;hpb=8e5b17b25e91ffa293c1cbcb30e1c6997c6bdecd diff --git a/IntelFrameworkPkg/Library/FrameworkHiiLib/HiiLib.c b/IntelFrameworkPkg/Library/FrameworkHiiLib/HiiLib.c index 913b471c5a..f2edf44317 100644 --- a/IntelFrameworkPkg/Library/FrameworkHiiLib/HiiLib.c +++ b/IntelFrameworkPkg/Library/FrameworkHiiLib/HiiLib.c @@ -10,17 +10,95 @@ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - Module Name: HiiLib.c - **/ #include +#include #include #include #include +#include +#include + + +EFI_HII_PROTOCOL *mHii = NULL; + +/** + Library constustor function for HiiLib library instance locate the + gEfiHiiProtocolGuid firstly, the other interface in this library + instance will dependent on the protocol of gEfiHiiProtocolGuid. + So the depex of gEfiHiiProtocolGuid is required for this library + instance. + If protocol of gEfiHiiProtocolGuid is not installed, then ASSERT(). + + @param ImageHandle The image handle of driver module who use this library + instance. + @param SystemTable Pointer to the EFI System Table. + @retval EFI_SUCCESS library constuctor always success. +**/ +EFI_STATUS +EFIAPI +FrameworkHiiLibConstructor ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + + Status = gBS->LocateProtocol ( + &gEfiHiiProtocolGuid, + NULL, + (VOID **) &mHii + ); + ASSERT_EFI_ERROR (Status); + ASSERT (mHii != NULL); + + return EFI_SUCCESS; +} + +/** + This function is internal function that prepare and create + HII packages with given number and package's guid. + It is invoked by HiiAddPackages() and PreparePackages() interface. + If the parameter of package's number is 0, then ASSERT(). + + @param NumberOfPackages Given number of package item in a HII package list. + @param Guid Given GUID of a HII package list. + @param Marker Package's content list. + + @return pointer to new created HII package list. +**/ +EFI_HII_PACKAGES * +InternalPreparePackages ( + IN UINTN NumberOfPackages, + IN CONST EFI_GUID *Guid OPTIONAL, + VA_LIST Marker + ) +{ + EFI_HII_PACKAGES *HiiPackages; + VOID **Package; + UINTN Index; + + ASSERT (NumberOfPackages > 0); + + HiiPackages = AllocateZeroPool (sizeof (EFI_HII_PACKAGES) + NumberOfPackages * sizeof (VOID *)); + ASSERT (HiiPackages != NULL); + + HiiPackages->GuidId = (EFI_GUID *) Guid; + HiiPackages->NumberOfPackages = NumberOfPackages; + Package = (VOID **) (((UINT8 *) HiiPackages) + sizeof (EFI_HII_PACKAGES)); + + for (Index = 0; Index < NumberOfPackages; Index++) { + *Package = VA_ARG (Marker, VOID *); + Package++; + } + + return HiiPackages; + +} /** This function allocates pool for an EFI_HII_PACKAGES structure @@ -43,28 +121,210 @@ PreparePackages ( ) { VA_LIST Args; - EFI_HII_PACKAGES *HiiPackages; - VOID **Package; - UINTN Index; - ASSERT (NumberOfPackages > 0); + VA_START (Args, Guid); - HiiPackages = AllocateZeroPool (sizeof (EFI_HII_PACKAGES) + NumberOfPackages * sizeof (VOID *)); - ASSERT (HiiPackages != NULL); + return InternalPreparePackages (NumberOfPackages, Guid, Args); +} - HiiPackages->GuidId = (EFI_GUID *) Guid; - HiiPackages->NumberOfPackages = NumberOfPackages; - Package = (VOID **) (((UINT8 *) HiiPackages) + sizeof (EFI_HII_PACKAGES)); - VA_START (Args, Guid); +/** + This function allocates pool for an EFI_HII_PACKAGE_LIST structure + with additional space that is big enough to host all packages described by the variable + argument list of package pointers. The allocated structure is initialized using NumberOfPackages, + GuidId, and the variable length argument list of package pointers. - for (Index = 0; Index < NumberOfPackages; Index++) { - *Package = VA_ARG (Args, VOID *); - Package++; + Then, EFI_HII_PACKAGE_LIST will be register to the default System HII Database. The + Handle to the newly registered Package List is returned throught HiiHandle. + + @param NumberOfPackages The number of HII packages to register. + @param GuidId Package List GUID ID. + @param DriverHandle The pointer of driver handle + @param HiiHandle The ID used to retrieve the Package List later. + @param ... The variable argument list describing all HII Package. + + @return + The allocated and initialized packages. + +**/ + +EFI_STATUS +EFIAPI +HiiLibAddPackages ( + IN UINTN NumberOfPackages, + IN CONST EFI_GUID *GuidId, + IN EFI_HANDLE DriverHandle, OPTIONAL + OUT EFI_HII_HANDLE *HiiHandle, OPTIONAL + ... + ) +{ + VA_LIST Args; + EFI_HII_PACKAGES *FrameworkHiiPacages; + FRAMEWORK_EFI_HII_HANDLE FrameworkHiiHandle; + EFI_STATUS Status; + + + VA_START (Args, HiiHandle); + FrameworkHiiPacages = InternalPreparePackages (NumberOfPackages, GuidId, Args); + + Status = mHii->NewPack (mHii, FrameworkHiiPacages, &FrameworkHiiHandle); + if (HiiHandle != NULL) { + if (EFI_ERROR (Status)) { + *HiiHandle = NULL; + } else { + *HiiHandle = (EFI_HII_HANDLE) (UINTN) FrameworkHiiHandle; + } } - VA_END (Args); + FreePool (FrameworkHiiPacages); + + return Status; +} - return HiiPackages; +/** + Removes a package list from the default HII database. + + If HiiHandle is NULL, then ASSERT. + If HiiHandle is not a valid EFI_HII_HANDLE in the default HII database, then ASSERT. + + @param HiiHandle The handle that was previously registered to the data base that is requested for removal. + List later. + + @return VOID + +**/ +VOID +EFIAPI +HiiLibRemovePackages ( + IN EFI_HII_HANDLE HiiHandle + ) +{ + EFI_STATUS Status; + + Status = mHii->RemovePack (mHii, (FRAMEWORK_EFI_HII_HANDLE) (UINTN) HiiHandle); + ASSERT_EFI_ERROR (Status); +} + + +/** + This function adds the string into String Package of each language. + + @param PackageList Handle of the package list where this string will + be added. + @param StringId On return, contains the new strings id, which is + unique within PackageList. + @param String Points to the new null-terminated string. + + @retval EFI_SUCCESS The new string was added successfully. + @retval EFI_NOT_FOUND The specified PackageList could not be found in + database. + @retval EFI_OUT_OF_RESOURCES Could not add the string due to lack of resources. + @retval EFI_INVALID_PARAMETER String is NULL or StringId is NULL is NULL. +**/ +EFI_STATUS +EFIAPI +HiiLibNewString ( + IN EFI_HII_HANDLE PackageList, + OUT EFI_STRING_ID *StringId, + IN CONST EFI_STRING String + ) +{ + FRAMEWORK_EFI_HII_HANDLE FrameworkHiiHandle; + EFI_STATUS Status; + + FrameworkHiiHandle = (FRAMEWORK_EFI_HII_HANDLE) (UINTN) PackageList; + Status = mHii->NewString ( + mHii, + NULL, + FrameworkHiiHandle, + StringId, + String + ); + + return Status; } + +/** + Get the string given the StringId and String package Producer's Guid. The caller + is responsible to free the *String. + + If PackageList with the matching ProducerGuid is not found, then ASSERT. + If PackageList with the matching ProducerGuid is found but no String is + specified by StringId is found, then ASSERT. + + @param ProducerGuid The Guid of String package list. + @param StringId The String ID. + @param String The output string. + + @retval EFI_SUCCESS Operation is successful. + @retval EFI_OUT_OF_RESOURCES There is not enought memory in the system. + +**/ +EFI_STATUS +EFIAPI +HiiLibGetStringFromToken ( + IN EFI_GUID *ProducerGuid, + IN EFI_STRING_ID StringId, + OUT EFI_STRING *String + ) +{ + return EFI_SUCCESS; +} + +/** + Get string specified by StringId form the HiiHandle. The caller + is responsible to free the *String. + + If String is NULL, then ASSERT. + If HiiHandle could not be found in the default HII database, then ASSERT. + If StringId is not found in PackageList, then ASSERT. + + @param PackageList The HII handle of package list. + @param StringId The String ID. + @param String The output string. + + @retval EFI_NOT_FOUND String is not found. + @retval EFI_SUCCESS Operation is successful. + @retval EFI_OUT_OF_RESOURCES There is not enought memory in the system. + @retval EFI_INVALID_PARAMETER The String is NULL. + +**/ +EFI_STATUS +EFIAPI +HiiLibGetStringFromHandle ( + IN EFI_HII_HANDLE PackageList, + IN EFI_STRING_ID StringId, + OUT EFI_STRING *String + ) +{ + return EFI_SUCCESS; +} + +/** + Create the driver handle for HII driver. The protocol and + Package list of this driver wili be installed into this + driver handle. + The implement set DriverHandle to NULL simpliy to let + handle manager create a default new handle. + + @param[out] DriverHandle the pointer of driver handle + @return always successful. +**/ +EFI_STATUS +EFIAPI +HiiLibCreateHiiDriverHandle ( + OUT EFI_HANDLE *DriverHandle + ) +{ + // + // Driver + // This implementation does nothing as DriverHandle concept only + // applies to UEFI HII specification. + // + + *DriverHandle = NULL; + + return EFI_SUCCESS; +} +