\r
#include "InternalHiiLib.h"\r
\r
-EFI_HII_DATABASE_PROTOCOL *mHiiDatabaseProt;\r
-EFI_HII_STRING_PROTOCOL *mHiiStringProt;\r
+CONST EFI_HII_DATABASE_PROTOCOL *mHiiDatabaseProt;\r
+CONST EFI_HII_STRING_PROTOCOL *mHiiStringProt;\r
+BOOLEAN mHiiProtocolsInitialized = FALSE;\r
+\r
\r
/**\r
- The constructor function of Hii Library.\r
- \r
- The constructor function caches the value of default HII protocol instances.\r
\r
- @param ImageHandle The firmware allocated handle for the EFI image.\r
- @param SystemTable A pointer to the EFI System Table.\r
- \r
- @retval EFI_SUCCESS The constructor always returns EFI_SUCCESS.\r
+ This function locate Hii relative protocols for later usage.\r
+\r
+ @param VOID\r
+\r
+ @retval VOID\r
\r
**/\r
-EFI_STATUS\r
-EFIAPI\r
-UefiHiiLibConstructor (\r
- IN EFI_HANDLE ImageHandle,\r
- IN EFI_SYSTEM_TABLE *SystemTable\r
+VOID\r
+LocateHiiProtocols (\r
+ VOID\r
)\r
{\r
- EFI_STATUS Status;\r
- \r
- Status = gBS->LocateProtocol (\r
- &gEfiHiiDatabaseProtocolGuid,\r
- NULL,\r
- (VOID **) &mHiiDatabaseProt\r
- );\r
+ EFI_STATUS Status;\r
+\r
+ if (mHiiProtocolsInitialized) {\r
+ return;\r
+ }\r
+\r
+ Status = gBS->LocateProtocol (&gEfiHiiDatabaseProtocolGuid, NULL, (VOID **) &mHiiDatabaseProt);\r
ASSERT_EFI_ERROR (Status);\r
- ASSERT (mHiiDatabaseProt != NULL);\r
\r
- Status = gBS->LocateProtocol (\r
- &gEfiHiiStringProtocolGuid,\r
- NULL,\r
- (VOID **) &mHiiStringProt\r
- );\r
+ Status = gBS->LocateProtocol (&gEfiHiiStringProtocolGuid, NULL, (VOID **) &mHiiStringProt);\r
ASSERT_EFI_ERROR (Status);\r
- ASSERT (mHiiStringProt != NULL);\r
\r
- return EFI_SUCCESS;\r
+ mHiiProtocolsInitialized = TRUE;\r
}\r
\r
\r
\r
ASSERT (HiiHandle != NULL);\r
\r
+ LocateHiiProtocols ();\r
+\r
VA_START (Args, HiiHandle);\r
PackageListHeader = InternalHiiLibPreparePackages (NumberOfPackages, GuidId, Args);\r
\r
return Status;\r
}\r
\r
-EFI_STATUS\r
-EFIAPI\r
-HiiLibAddFontPackageToHiiDatabase (\r
- IN UINTN FontSize,\r
- IN CONST UINT8 *FontBinary,\r
- IN CONST EFI_GUID *GuidId,\r
- OUT EFI_HII_HANDLE *HiiHandle OPTIONAL\r
- )\r
-{\r
- EFI_STATUS Status;\r
- UINT8 *Location;\r
- EFI_HII_SIMPLE_FONT_PACKAGE_HDR *SimplifiedFont;\r
- UINTN PackageLength;\r
- EFI_HII_PACKAGE_LIST_HEADER *PackageList;\r
- UINT8 *Package;\r
-\r
- //\r
- // Add 4 bytes to the header for entire length for HiiLibPreparePackageList use only.\r
- // Looks ugly. Might be updated when font tool is ready.\r
- //\r
- PackageLength = sizeof (EFI_HII_SIMPLE_FONT_PACKAGE_HDR) + FontSize + 4;\r
- Package = AllocateZeroPool (PackageLength);\r
- if (Package == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
- CopyMem (Package, &PackageLength, 4);\r
- SimplifiedFont = (EFI_HII_SIMPLE_FONT_PACKAGE_HDR*) (Package + 4);\r
- SimplifiedFont->Header.Length = (UINT32) (PackageLength - 4);\r
- SimplifiedFont->Header.Type = EFI_HII_PACKAGE_SIMPLE_FONTS;\r
- SimplifiedFont->NumberOfNarrowGlyphs = (UINT16) (FontSize / sizeof (EFI_NARROW_GLYPH));\r
- \r
- Location = (UINT8 *) (&SimplifiedFont->NumberOfWideGlyphs + 1);\r
- CopyMem (Location, FontBinary, FontSize);\r
- \r
- //\r
- // Add this simplified font package to a package list then install it.\r
- //\r
- PackageList = HiiLibPreparePackageList (1, GuidId, Package);\r
- Status = mHiiDatabaseProt->NewPackageList (mHiiDatabaseProt, PackageList, NULL, HiiHandle);\r
- ASSERT_EFI_ERROR (Status);\r
- SafeFreePool (PackageList);\r
- SafeFreePool (Package); \r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
VOID\r
EFIAPI\r
HiiLibRemovePackages (\r
)\r
{\r
EFI_STATUS Status;\r
-\r
ASSERT (HiiHandle != NULL);\r
+\r
+ LocateHiiProtocols ();\r
+\r
Status = mHiiDatabaseProt->RemovePackageList (mHiiDatabaseProt, HiiHandle);\r
ASSERT_EFI_ERROR (Status);\r
}\r
\r
BufferLength = 0;\r
\r
+ LocateHiiProtocols ();\r
+\r
//\r
// Try to find the actual buffer size for HiiHandle Buffer.\r
//\r
//\r
BufferSize = 0;\r
HiiPackageList = NULL;\r
+\r
+ LocateHiiProtocols ();\r
+\r
Status = mHiiDatabaseProt->ExportPackageLists (mHiiDatabaseProt, Handle, &BufferSize, HiiPackageList);\r
ASSERT (Status != EFI_NOT_FOUND);\r
\r
return NULL;\r
}\r
\r
+ LocateHiiProtocols ();\r
+\r
//\r
// Retrieve all Hii Handles from HII database\r
//\r
\r
HiiPackageList = NULL;\r
BufferSize = 0;\r
+\r
+ LocateHiiProtocols ();\r
+\r
Status = mHiiDatabaseProt->ExportPackageLists (\r
mHiiDatabaseProt,\r
HiiHandle,\r