]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdePkg/Library/HiiLib/HiiLib.c
Merged in the following trackers from EDK:
[mirror_edk2.git] / MdePkg / Library / HiiLib / HiiLib.c
index e2153f307d79f22762af2831f9d98abbbd8f105f..940536620cfc69b683afb856c2af2915769eb8ee 100644 (file)
 \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
@@ -151,6 +143,8 @@ HiiLibAddPackages (
 \r
   ASSERT (HiiHandle != NULL);\r
 \r
+  LocateHiiProtocols ();\r
+\r
   VA_START (Args, HiiHandle);\r
   PackageListHeader = InternalHiiLibPreparePackages (NumberOfPackages, GuidId, Args);\r
 \r
@@ -167,52 +161,6 @@ HiiLibAddPackages (
   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
@@ -220,8 +168,10 @@ HiiLibRemovePackages (
   )\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
@@ -242,6 +192,8 @@ HiiLibGetHiiHandles (
 \r
   BufferLength = 0;\r
 \r
+  LocateHiiProtocols ();\r
+\r
   //\r
   // Try to find the actual buffer size for HiiHandle Buffer.\r
   //\r
@@ -291,6 +243,9 @@ HiiLibExtractGuidFromHiiHandle (
   //\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
@@ -372,6 +327,8 @@ HiiLibDevicePathToHiiHandle (
     return NULL;\r
   }\r
 \r
+  LocateHiiProtocols ();\r
+\r
   //\r
   // Retrieve all Hii Handles from HII database\r
   //\r
@@ -438,6 +395,9 @@ IsHiiHandleRegistered (
 \r
   HiiPackageList = NULL;\r
   BufferSize = 0;\r
+\r
+  LocateHiiProtocols ();\r
+\r
   Status = mHiiDatabaseProt->ExportPackageLists (\r
              mHiiDatabaseProt,\r
              HiiHandle,\r