According to UEFI spec, NewImageEx()/SetImageEx()/DrawImageEx() implicitly call the non-Ex version interface of HiiImage protocol. GetImageEx()/DrawImageIdEx() are the enhanced version of GetImage()/DrawImageId(), which can support decoding JPEG/PNG through the help of HiiImageDecoder protocol. Contributed-under: TianoCore Contribution Agreement 1.0 Reviewed-by: Liming Gao <liming.gao@intel.com> Cc: Eric Dong <eric.dong@intel.com> Cc: Dandan Bi <dandan.bi@intel.com> Signed-off-by: Ruiyu Ni <ruiyu.ni@intel.com>
		
			
				
	
	
		
			257 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			257 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
| This file contains the entry code to the HII database, which is defined by
 | |
| UEFI 2.1 specification.
 | |
| 
 | |
| Copyright (c) 2007 - 2016, Intel Corporation. All rights reserved.<BR>
 | |
| This program and the accompanying materials
 | |
| are licensed and made available under the terms and conditions of the BSD License
 | |
| which accompanies this distribution.  The full text of the license may be found at
 | |
| http://opensource.org/licenses/bsd-license.php
 | |
| 
 | |
| THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
 | |
| WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 | |
| 
 | |
| **/
 | |
| 
 | |
| 
 | |
| #include "HiiDatabase.h"
 | |
| 
 | |
| //
 | |
| // Global variables
 | |
| //
 | |
| EFI_EVENT gHiiKeyboardLayoutChanged;
 | |
| BOOLEAN   gExportAfterReadyToBoot = FALSE;
 | |
| 
 | |
| HII_DATABASE_PRIVATE_DATA mPrivate = {
 | |
|   HII_DATABASE_PRIVATE_DATA_SIGNATURE,
 | |
|   {
 | |
|     (LIST_ENTRY *) NULL,
 | |
|     (LIST_ENTRY *) NULL
 | |
|   },
 | |
|   {
 | |
|     (LIST_ENTRY *) NULL,
 | |
|     (LIST_ENTRY *) NULL
 | |
|   },
 | |
|   {
 | |
|     HiiStringToImage,
 | |
|     HiiStringIdToImage,
 | |
|     HiiGetGlyph,
 | |
|     HiiGetFontInfo
 | |
|   },
 | |
|   {
 | |
|     HiiNewImage,
 | |
|     HiiGetImage,
 | |
|     HiiSetImage,
 | |
|     HiiDrawImage,
 | |
|     HiiDrawImageId
 | |
|   },
 | |
|   {
 | |
|     HiiNewImageEx,
 | |
|     HiiGetImageEx,
 | |
|     HiiSetImageEx,
 | |
|     HiiDrawImageEx,
 | |
|     HiiDrawImageIdEx,
 | |
|     HiiGetImageInfo
 | |
|   },
 | |
|   {
 | |
|     HiiNewString,
 | |
|     HiiGetString,
 | |
|     HiiSetString,
 | |
|     HiiGetLanguages,
 | |
|     HiiGetSecondaryLanguages
 | |
|   },
 | |
|   {
 | |
|     HiiNewPackageList,
 | |
|     HiiRemovePackageList,
 | |
|     HiiUpdatePackageList,
 | |
|     HiiListPackageLists,
 | |
|     HiiExportPackageLists,
 | |
|     HiiRegisterPackageNotify,
 | |
|     HiiUnregisterPackageNotify,
 | |
|     HiiFindKeyboardLayouts,
 | |
|     HiiGetKeyboardLayout,
 | |
|     HiiSetKeyboardLayout,
 | |
|     HiiGetPackageListHandle
 | |
|   },
 | |
|   {
 | |
|     HiiConfigRoutingExtractConfig,
 | |
|     HiiConfigRoutingExportConfig,
 | |
|     HiiConfigRoutingRouteConfig,
 | |
|     HiiBlockToConfig,
 | |
|     HiiConfigToBlock,
 | |
|     HiiGetAltCfg
 | |
|   },
 | |
|   {
 | |
|     EfiConfigKeywordHandlerSetData,
 | |
|     EfiConfigKeywordHandlerGetData
 | |
|   },
 | |
|   {
 | |
|     (LIST_ENTRY *) NULL,
 | |
|     (LIST_ENTRY *) NULL
 | |
|   },
 | |
|   0,
 | |
|   {
 | |
|     (LIST_ENTRY *) NULL,
 | |
|     (LIST_ENTRY *) NULL
 | |
|   },
 | |
|   EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK),
 | |
|   {
 | |
|     0x00000000,
 | |
|     0x0000,
 | |
|     0x0000,
 | |
|     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
 | |
|   },
 | |
|   NULL
 | |
| };
 | |
| 
 | |
| /**
 | |
|   The default event handler for gHiiKeyboardLayoutChanged
 | |
|   event group.
 | |
| 
 | |
|   This is internal function.
 | |
| 
 | |
|   @param Event           The event that triggered this notification function.
 | |
|   @param Context         Pointer to the notification functions context.
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| EFIAPI
 | |
| KeyboardLayoutChangeNullEvent (
 | |
|   IN EFI_EVENT                Event,
 | |
|   IN VOID                     *Context
 | |
|   )
 | |
| {
 | |
|   return;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   On Ready To Boot Services Event notification handler.
 | |
| 
 | |
|   To trigger the function that to export the Hii Configuration setting.
 | |
| 
 | |
|   @param[in]  Event     Event whose notification function is being invoked
 | |
|   @param[in]  Context   Pointer to the notification function's context
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| EFIAPI
 | |
| OnReadyToBoot (
 | |
|   IN      EFI_EVENT                         Event,
 | |
|   IN      VOID                              *Context
 | |
|   )
 | |
| {
 | |
|   //
 | |
|   // When ready to boot, we begin to export the HiiDatabase date.
 | |
|   // And hook all the possible HiiDatabase change actions to export data.
 | |
|   //
 | |
|   HiiGetConfigurationSetting(&mPrivate.HiiDatabase);
 | |
|   gExportAfterReadyToBoot = TRUE;
 | |
| 
 | |
|   gBS->CloseEvent (Event);
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Initialize HII Database.
 | |
| 
 | |
| 
 | |
|   @param ImageHandle     The image handle.
 | |
|   @param SystemTable     The system table.
 | |
| 
 | |
|   @retval EFI_SUCCESS    The Hii database is setup correctly.
 | |
|   @return Other value if failed to create the default event for
 | |
|           gHiiKeyboardLayoutChanged. Check gBS->CreateEventEx for
 | |
|           details. Or failed to install the protocols.
 | |
|           Check gBS->InstallMultipleProtocolInterfaces for details.
 | |
|           Or failed to create Ready To Boot Event.
 | |
|           Check EfiCreateEventReadyToBootEx for details.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| InitializeHiiDatabase (
 | |
|   IN EFI_HANDLE           ImageHandle,
 | |
|   IN EFI_SYSTEM_TABLE     *SystemTable
 | |
|   )
 | |
| {
 | |
|   EFI_STATUS                             Status;
 | |
|   EFI_HANDLE                             Handle;
 | |
|   EFI_EVENT                              ReadyToBootEvent;
 | |
| 
 | |
|   //
 | |
|   // There will be only one HII Database in the system
 | |
|   // If there is another out there, someone is trying to install us
 | |
|   // again.  Fail that scenario.
 | |
|   //
 | |
|   ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiHiiDatabaseProtocolGuid);
 | |
|   ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiHiiFontProtocolGuid);
 | |
|   ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiHiiImageProtocolGuid);
 | |
|   ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiHiiStringProtocolGuid);
 | |
|   ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiHiiConfigRoutingProtocolGuid);
 | |
|   ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiConfigKeywordHandlerProtocolGuid);
 | |
|   
 | |
|   InitializeListHead (&mPrivate.DatabaseList);
 | |
|   InitializeListHead (&mPrivate.DatabaseNotifyList);
 | |
|   InitializeListHead (&mPrivate.HiiHandleList);
 | |
|   InitializeListHead (&mPrivate.FontInfoList);
 | |
| 
 | |
|   //
 | |
|   // Create a event with EFI_HII_SET_KEYBOARD_LAYOUT_EVENT_GUID group type.
 | |
|   //
 | |
|   Status = gBS->CreateEventEx (
 | |
|                   EVT_NOTIFY_SIGNAL,
 | |
|                   TPL_NOTIFY,
 | |
|                   KeyboardLayoutChangeNullEvent,
 | |
|                   NULL,
 | |
|                   &gEfiHiiKeyBoardLayoutGuid,
 | |
|                   &gHiiKeyboardLayoutChanged
 | |
|                   );
 | |
|   if (EFI_ERROR (Status)) {
 | |
|     return Status;
 | |
|   }
 | |
| 
 | |
|   Handle = NULL;
 | |
|   Status = gBS->InstallMultipleProtocolInterfaces (
 | |
|                   &Handle,
 | |
|                   &gEfiHiiFontProtocolGuid,
 | |
|                   &mPrivate.HiiFont,
 | |
|                   &gEfiHiiStringProtocolGuid,
 | |
|                   &mPrivate.HiiString,
 | |
|                   &gEfiHiiDatabaseProtocolGuid,
 | |
|                   &mPrivate.HiiDatabase,
 | |
|                   &gEfiHiiConfigRoutingProtocolGuid,
 | |
|                   &mPrivate.ConfigRouting,
 | |
|                   &gEfiConfigKeywordHandlerProtocolGuid,
 | |
|                   &mPrivate.ConfigKeywordHandler,
 | |
|                   NULL
 | |
|                   );
 | |
| 
 | |
|   if (EFI_ERROR (Status)) {
 | |
|     return Status;
 | |
|   }
 | |
| 
 | |
|   if (FeaturePcdGet (PcdSupportHiiImageProtocol)) {
 | |
|     Status = gBS->InstallMultipleProtocolInterfaces (
 | |
|                     &Handle,
 | |
|                     &gEfiHiiImageProtocolGuid, &mPrivate.HiiImage,
 | |
|                     &gEfiHiiImageExProtocolGuid, &mPrivate.HiiImageEx,
 | |
|                     NULL
 | |
|                     );
 | |
| 
 | |
|   }
 | |
| 
 | |
|   if (FeaturePcdGet(PcdHiiOsRuntimeSupport)) {
 | |
|     Status = EfiCreateEventReadyToBootEx (
 | |
|                TPL_CALLBACK,
 | |
|                OnReadyToBoot,
 | |
|                NULL,
 | |
|                &ReadyToBootEvent
 | |
|                );
 | |
|     if (EFI_ERROR (Status)) {
 | |
|       return Status;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   return Status;
 | |
| }
 | |
| 
 |