| /** @file | |
| This file contains the entry code to the HII database, which is defined by | |
| UEFI 2.1 specification. | |
| Copyright (c) 2007 - 2008, Intel Corporation | |
| All rights reserved. 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; | |
| 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 | |
| }, | |
| { | |
| NULL, | |
| NULL, | |
| NULL, | |
| NULL, | |
| NULL | |
| }, | |
| { | |
| HiiNewString, | |
| HiiGetString, | |
| HiiSetString, | |
| HiiGetLanguages, | |
| HiiGetSecondaryLanguages | |
| }, | |
| { | |
| HiiNewPackageList, | |
| HiiRemovePackageList, | |
| HiiUpdatePackageList, | |
| HiiListPackageLists, | |
| HiiExportPackageLists, | |
| HiiRegisterPackageNotify, | |
| HiiUnregisterPackageNotify, | |
| HiiFindKeyboardLayouts, | |
| HiiGetKeyboardLayout, | |
| HiiSetKeyboardLayout, | |
| HiiGetPackageListHandle | |
| }, | |
| { | |
| HiiConfigRoutingExtractConfig, | |
| HiiConfigRoutingExportConfig, | |
| HiiConfigRoutingRouteConfig, | |
| HiiBlockToConfig, | |
| HiiConfigToBlock, | |
| HiiGetAltCfg | |
| }, | |
| { | |
| (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 | |
| }; | |
| GLOBAL_REMOVE_IF_UNREFERENCED CONST EFI_HII_IMAGE_PROTOCOL mImageProtocol = { | |
| HiiNewImage, | |
| HiiGetImage, | |
| HiiSetImage, | |
| HiiDrawImage, | |
| HiiDrawImageId | |
| }; | |
| /** | |
| 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; | |
| } | |
| /** | |
| 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 insatll the protocols. | |
| Check gBS->InstallMultipleProtocolInterfaces for details. | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| InitializeHiiDatabase ( | |
| IN EFI_HANDLE ImageHandle, | |
| IN EFI_SYSTEM_TABLE *SystemTable | |
| ) | |
| { | |
| EFI_STATUS Status; | |
| EFI_HANDLE Handle; | |
| // | |
| // 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); | |
| 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, | |
| NULL | |
| ); | |
| if (EFI_ERROR (Status)) { | |
| return Status; | |
| } | |
| if (FeaturePcdGet (PcdSupportHiiImageProtocol)) { | |
| CopyMem (&mPrivate.HiiImage, &mImageProtocol, sizeof (mImageProtocol)); | |
| Status = gBS->InstallMultipleProtocolInterfaces ( | |
| &Handle, | |
| &gEfiHiiImageProtocolGuid, | |
| &mPrivate.HiiImage, | |
| NULL | |
| ); | |
| } | |
| return Status; | |
| } | |