]> git.proxmox.com Git - mirror_edk2.git/blobdiff - IntelFrameworkPkg/Library/FrameworkHiiLib/HiiLib.c
UEFI HII: Merge UEFI HII support changes from branch.
[mirror_edk2.git] / IntelFrameworkPkg / Library / FrameworkHiiLib / HiiLib.c
index 913b471c5aa49a75781a6d9ae687377c3f09b27e..1b4c0dd79a2f33e42e7596640ac0bb69c989a3cc 100644 (file)
 \r
 #include <FrameworkDxe.h>\r
 \r
+#include <Protocol/FrameworkHii.h>\r
+\r
 \r
 #include <Library/FrameworkHiiLib.h>\r
 #include <Library/DebugLib.h>\r
 #include <Library/MemoryAllocationLib.h>\r
+#include <Library/UefiBootServicesTableLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
+\r
+EFI_HII_PROTOCOL *mHii = NULL;\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+FrameworkHiiLibConstructor (\r
+  IN EFI_HANDLE           ImageHandle,\r
+  IN EFI_SYSTEM_TABLE     *SystemTable\r
+  )\r
+{\r
+  EFI_STATUS Status;\r
+  \r
+  Status = gBS->LocateProtocol (\r
+      &gEfiHiiProtocolGuid,\r
+      NULL,\r
+      (VOID **) &mHii\r
+    );\r
+  ASSERT_EFI_ERROR (Status);\r
+  ASSERT (mHii != NULL);\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+\r
+EFI_HII_PACKAGES *\r
+InternalPreparePackages (\r
+  IN UINTN           NumberOfPackages,\r
+  IN CONST EFI_GUID  *Guid OPTIONAL,\r
+  VA_LIST            Marker\r
+  )\r
+{\r
+  EFI_HII_PACKAGES  *HiiPackages;\r
+  VOID              **Package;\r
+  UINTN             Index;\r
+\r
+  ASSERT (NumberOfPackages > 0);\r
+\r
+  HiiPackages                   = AllocateZeroPool (sizeof (EFI_HII_PACKAGES) + NumberOfPackages * sizeof (VOID *));\r
+  ASSERT (HiiPackages != NULL);\r
+\r
+  HiiPackages->GuidId           = (EFI_GUID *) Guid;\r
+  HiiPackages->NumberOfPackages = NumberOfPackages;\r
+  Package                       = (VOID **) (((UINT8 *) HiiPackages) + sizeof (EFI_HII_PACKAGES));\r
+\r
+  for (Index = 0; Index < NumberOfPackages; Index++) {\r
+    *Package = VA_ARG (Marker, VOID *);\r
+    Package++;\r
+  }\r
+\r
+  return HiiPackages;\r
+\r
+}\r
+\r
 \r
 /**\r
   This function allocates pool for an EFI_HII_PACKAGES structure\r
@@ -43,28 +100,219 @@ PreparePackages (
   )\r
 {\r
   VA_LIST           Args;\r
-  EFI_HII_PACKAGES  *HiiPackages;\r
-  VOID              **Package;\r
-  UINTN             Index;\r
 \r
-  ASSERT (NumberOfPackages > 0);\r
+  VA_START (Args, Guid);\r
 \r
-  HiiPackages                   = AllocateZeroPool (sizeof (EFI_HII_PACKAGES) + NumberOfPackages * sizeof (VOID *));\r
-  ASSERT (HiiPackages != NULL);\r
+  return InternalPreparePackages (NumberOfPackages, Guid, Args);\r
+}\r
 \r
-  HiiPackages->GuidId           = (EFI_GUID *) Guid;\r
-  HiiPackages->NumberOfPackages = NumberOfPackages;\r
-  Package                       = (VOID **) (((UINT8 *) HiiPackages) + sizeof (EFI_HII_PACKAGES));\r
 \r
-  VA_START (Args, Guid);\r
+/**\r
+  This function allocates pool for an EFI_HII_PACKAGE_LIST structure\r
+  with additional space that is big enough to host all packages described by the variable \r
+  argument list of package pointers.  The allocated structure is initialized using NumberOfPackages, \r
+  GuidId,  and the variable length argument list of package pointers.\r
 \r
-  for (Index = 0; Index < NumberOfPackages; Index++) {\r
-    *Package = VA_ARG (Args, VOID *);\r
-    Package++;\r
+  Then, EFI_HII_PACKAGE_LIST will be register to the default System HII Database. The\r
+  Handle to the newly registered Package List is returned throught HiiHandle.\r
+\r
+  @param  NumberOfPackages  The number of HII packages to register.\r
+  @param  GuidId                    Package List GUID ID.\r
+  @param  HiiHandle                The ID used to retrieve the Package List later.\r
+  @param  ...                          The variable argument list describing all HII Package.\r
+\r
+  @return\r
+  The allocated and initialized packages.\r
+\r
+**/\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+HiiLibAddPackagesToHiiDatabase (\r
+  IN       UINTN               NumberOfPackages,\r
+  IN CONST EFI_GUID            *GuidId,\r
+  IN       EFI_HANDLE          DriverHandle, OPTIONAL\r
+  OUT      EFI_HII_HANDLE      *HiiHandle, OPTIONAL\r
+  ...\r
+  )\r
+{\r
+  VA_LIST                   Args;\r
+  EFI_HII_PACKAGES          *FrameworkHiiPacages;\r
+  FRAMEWORK_EFI_HII_HANDLE  FrameworkHiiHandle;\r
+  EFI_STATUS                Status;\r
+\r
+\r
+  VA_START (Args, HiiHandle);\r
+  FrameworkHiiPacages = InternalPreparePackages (NumberOfPackages, GuidId, Args);\r
+\r
+  Status      = mHii->NewPack (mHii, FrameworkHiiPacages, &FrameworkHiiHandle);\r
+  if (HiiHandle != NULL) {\r
+    if (EFI_ERROR (Status)) {\r
+      *HiiHandle = NULL;\r
+    } else {\r
+      *HiiHandle = (EFI_HII_HANDLE) (UINTN) FrameworkHiiHandle;\r
+    }\r
   }\r
 \r
-  VA_END (Args);\r
+  FreePool (FrameworkHiiPacages);\r
+  \r
+  return Status;\r
+}\r
 \r
-  return HiiPackages;\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
+  EFI_HII_FONT_PACK     *FontPack;\r
+  UINT8                 *Location;\r
+\r
+  FontPack        = AllocateZeroPool (sizeof (EFI_HII_FONT_PACK) + FontSize);\r
+  ASSERT (FontPack != NULL);\r
+\r
+  FontPack->Header.Length         = (UINT32) (sizeof (EFI_HII_FONT_PACK) + FontSize);\r
+  FontPack->Header.Type           = EFI_HII_FONT;\r
+  FontPack->NumberOfNarrowGlyphs  = (UINT16) (FontSize / sizeof (EFI_NARROW_GLYPH));\r
+\r
+  Location                        = (UINT8 *) (&FontPack->NumberOfWideGlyphs + sizeof (UINT8));\r
+  CopyMem (Location, FontBinary, FontSize);\r
+\r
+\r
+  //\r
+  // Register our Fonts into the global database\r
+  //\r
+  Status = HiiLibAddPackagesToHiiDatabase (1, NULL, HiiHandle, NULL, FontPack);\r
+  //\r
+  // Free the font database\r
+  //\r
+  FreePool (FontPack);\r
 \r
+  return Status;  \r
 }\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+HiiLibRemovePackagesFromHiiDatabase (\r
+  IN      EFI_HII_HANDLE      HiiHandle\r
+  )\r
+{\r
+  return mHii->RemovePack (mHii, (FRAMEWORK_EFI_HII_HANDLE) (UINTN) HiiHandle);\r
+}\r
+\r
+\r
+/**\r
+  This function adds the string into String Package of each language.\r
+\r
+  @param  PackageList            Handle of the package list where this string will\r
+                                 be added.\r
+  @param  StringId               On return, contains the new strings id, which is\r
+                                 unique within PackageList.\r
+  @param  String                 Points to the new null-terminated string.\r
+\r
+  @retval EFI_SUCCESS            The new string was added successfully.\r
+  @retval EFI_NOT_FOUND          The specified PackageList could not be found in\r
+                                 database.\r
+  @retval EFI_OUT_OF_RESOURCES   Could not add the string due to lack of resources.\r
+  @retval EFI_INVALID_PARAMETER  String is NULL or StringId is NULL is NULL.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiLibCreateString (\r
+  IN  EFI_HII_HANDLE                  PackageList,\r
+  OUT EFI_STRING_ID                   *StringId,\r
+  IN  CONST EFI_STRING                String\r
+  )\r
+{\r
+  FRAMEWORK_EFI_HII_HANDLE  FrameworkHiiHandle;\r
+  EFI_STATUS                Status;\r
+\r
+  FrameworkHiiHandle = (FRAMEWORK_EFI_HII_HANDLE) (UINTN) PackageList;\r
+  Status = mHii->NewString (\r
+            mHii,\r
+            NULL,\r
+            FrameworkHiiHandle,\r
+            StringId,\r
+            String\r
+          );\r
+\r
+  return Status;\r
+}\r
+\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+HiiLibUpdateString (\r
+  IN  EFI_HII_HANDLE                  PackageList,\r
+  IN  EFI_STRING_ID                   StringId,\r
+  IN  CONST EFI_STRING                String\r
+  )\r
+{\r
+  FRAMEWORK_EFI_HII_HANDLE  FrameworkHiiHandle;\r
+  EFI_STATUS                Status;\r
+\r
+  FrameworkHiiHandle = (FRAMEWORK_EFI_HII_HANDLE) (UINTN) PackageList;\r
+  Status = mHii->NewString (\r
+            mHii,\r
+            NULL,\r
+            FrameworkHiiHandle,\r
+            &StringId,\r
+            String\r
+          );\r
+\r
+  return Status;\r
+}\r
+\r
+//\r
+// Just use the UEFI prototype\r
+//\r
+EFI_STATUS\r
+EFIAPI\r
+HiiLibGetStringFromGuidId (\r
+  IN  EFI_GUID                        *ProducerGuid,\r
+  IN  EFI_STRING_ID                   StringId,\r
+  OUT EFI_STRING                      *String\r
+  )\r
+{\r
+  return EFI_SUCCESS;  \r
+}\r
+\r
+//\r
+// Just use the UEFI prototype\r
+//\r
+EFI_STATUS\r
+EFIAPI\r
+HiiLibGetStringFromHandle (\r
+  IN  EFI_HII_HANDLE                  PackageList,\r
+  IN  EFI_STRING_ID                   StringId,\r
+  OUT EFI_STRING                      *String\r
+  )\r
+{\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+//\r
+// Just use the UEFI prototype\r
+//\r
+EFI_STATUS\r
+EFIAPI\r
+HiiLibCreateHiiDriverHandle (\r
+  OUT EFI_HANDLE               *DriverHandle\r
+  )\r
+{\r
+  //\r
+  // Driver\r
+  // This implementation does nothing as DriverHandle concept only\r
+  // applies to UEFI HII specification.\r
+  //\r
+  \r
+  *DriverHandle = NULL;\r
+  \r
+  return EFI_SUCCESS;\r
+}\r
+\r