| /** @file | |
| The file provides Database manager for HII-related data | |
| structures. | |
| Copyright (c) 2006 - 2010, 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 that 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. | |
| **/ | |
| #ifndef __HII_DATABASE_H__ | |
| #define __HII_DATABASE_H__ | |
| #define EFI_HII_DATABASE_PROTOCOL_GUID \ | |
| { 0xef9fc172, 0xa1b2, 0x4693, { 0xb3, 0x27, 0x6d, 0x32, 0xfc, 0x41, 0x60, 0x42 } } | |
| typedef struct _EFI_HII_DATABASE_PROTOCOL EFI_HII_DATABASE_PROTOCOL; | |
| /// | |
| /// EFI_HII_DATABASE_NOTIFY_TYPE. | |
| /// | |
| typedef UINTN EFI_HII_DATABASE_NOTIFY_TYPE; | |
| #define EFI_HII_DATABASE_NOTIFY_NEW_PACK 0x00000001 | |
| #define EFI_HII_DATABASE_NOTIFY_REMOVE_PACK 0x00000002 | |
| #define EFI_HII_DATABASE_NOTIFY_EXPORT_PACK 0x00000004 | |
| #define EFI_HII_DATABASE_NOTIFY_ADD_PACK 0x00000008 | |
| /** | |
| Functions which are registered to receive notification of | |
| database events have this prototype. The actual event is encoded | |
| in NotifyType. The following table describes how PackageType, | |
| PackageGuid, Handle, and Package are used for each of the | |
| notification types. | |
| @param PackageType Package type of the notification. | |
| @param PackageGuid If PackageType is | |
| EFI_HII_PACKAGE_TYPE_GUID, then this is | |
| the pointer to the GUID from the Guid | |
| field of EFI_HII_PACKAGE_GUID_HEADER. | |
| Otherwise, it must be NULL. | |
| @param Package Points to the package referred to by the notification. | |
| @param Handle The handle of the package | |
| list which contains the specified package. | |
| @param NotifyType The type of change concerning the | |
| database. See | |
| EFI_HII_DATABASE_NOTIFY_TYPE. | |
| **/ | |
| typedef | |
| EFI_STATUS | |
| (EFIAPI *EFI_HII_DATABASE_NOTIFY)( | |
| IN UINT8 PackageType, | |
| IN CONST EFI_GUID *PackageGuid, | |
| IN CONST EFI_HII_PACKAGE_HEADER *Package, | |
| IN EFI_HII_HANDLE Handle, | |
| IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType | |
| ); | |
| /** | |
| This function adds the packages in the package list to the | |
| database and returns a handle. If there is a | |
| EFI_DEVICE_PATH_PROTOCOL associated with the DriverHandle, then | |
| this function will create a package of type | |
| EFI_PACKAGE_TYPE_DEVICE_PATH and add it to the package list. For | |
| each package in the package list, registered functions with the | |
| notification type NEW_PACK and having the same package type will | |
| be called. For each call to NewPackageList(), there should be a | |
| corresponding call to | |
| EFI_HII_DATABASE_PROTOCOL.RemovePackageList(). | |
| @param This A pointer to the EFI_HII_DATABASE_PROTOCOL instance. | |
| @param PackageList A pointer to an EFI_HII_PACKAGE_LIST_HEADER structure. | |
| @param DriverHandle Associate the package list with this EFI handle. | |
| If a NULL is specified, this data will not be associate | |
| with any drivers and cannot have a callback induced. | |
| @param Handle A pointer to the EFI_HII_HANDLE instance. | |
| @retval EFI_SUCCESS The package list associated with the | |
| Handle was added to the HII database. | |
| @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary | |
| resources for the new database | |
| contents. | |
| @retval EFI_INVALID_PARAMETER PackageList is NULL, or Handle is NULL. | |
| **/ | |
| typedef | |
| EFI_STATUS | |
| (EFIAPI *EFI_HII_DATABASE_NEW_PACK)( | |
| IN CONST EFI_HII_DATABASE_PROTOCOL *This, | |
| IN CONST EFI_HII_PACKAGE_LIST_HEADER *PackageList, | |
| IN EFI_HANDLE DriverHandle, OPTIONAL | |
| OUT EFI_HII_HANDLE *Handle | |
| ); | |
| /** | |
| This function removes the package list that is associated with a | |
| handle Handle from the HII database. Before removing the | |
| package, any registered functions with the notification type | |
| REMOVE_PACK and the same package type will be called. For each | |
| call to EFI_HII_DATABASE_PROTOCOL.NewPackageList(), there should | |
| be a corresponding call to RemovePackageList. | |
| @param This A pointer to the EFI_HII_DATABASE_PROTOCOL instance. | |
| @param Handle The handle that was registered to the data | |
| that is requested for removal. | |
| @retval EFI_SUCCESS The data associated with the Handle was | |
| removed from the HII database. | |
| @retval EFI_NOT_FOUND The specified Handle is not in database. | |
| **/ | |
| typedef | |
| EFI_STATUS | |
| (EFIAPI *EFI_HII_DATABASE_REMOVE_PACK)( | |
| IN CONST EFI_HII_DATABASE_PROTOCOL *This, | |
| IN EFI_HII_HANDLE Handle | |
| ); | |
| /** | |
| This function updates the existing package list (which has the | |
| specified Handle) in the HII databases, using the new package | |
| list specified by PackageList. The update process has the | |
| following steps: Collect all the package types in the package | |
| list specified by PackageList. A package type consists of the | |
| Type field of EFI_HII_PACKAGE_HEADER and, if the Type is | |
| EFI_HII_PACKAGE_TYPE_GUID, the Guid field, as defined in | |
| EFI_HII_PACKAGE_GUID_HEADER. Iterate through the packages within | |
| the existing package list in the HII database specified by | |
| Handle. If a package's type matches one of the collected types collected | |
| in step 1, then perform the following steps: | |
| - Call any functions registered with the notification type | |
| REMOVE_PACK. | |
| - Remove the package from the package list and the HII | |
| database. | |
| Add all of the packages within the new package list specified | |
| by PackageList, using the following steps: | |
| - Add the package to the package list and the HII database. | |
| - Call any functions registered with the notification type | |
| ADD_PACK. | |
| @param This A pointer to the EFI_HII_DATABASE_PROTOCOL instance. | |
| @param Handle The handle that was registered to the data | |
| that is requested for removal. | |
| @param PackageList A pointer to an EFI_HII_PACKAGE_LIST | |
| package. | |
| @retval EFI_SUCCESS The HII database was successfully updated. | |
| @retval EFI_OUT_OF_RESOURCES Unable to allocate enough memory | |
| for the updated database. | |
| @retval EFI_INVALID_PARAMETER PackageList was NULL. | |
| @retval EFI_NOT_FOUND The specified Handle is not in database. | |
| **/ | |
| typedef | |
| EFI_STATUS | |
| (EFIAPI *EFI_HII_DATABASE_UPDATE_PACK)( | |
| IN CONST EFI_HII_DATABASE_PROTOCOL *This, | |
| IN EFI_HII_HANDLE Handle, | |
| IN CONST EFI_HII_PACKAGE_LIST_HEADER *PackageList | |
| ); | |
| /** | |
| This function returns a list of the package handles of the | |
| specified type that are currently active in the database. The | |
| pseudo-type EFI_HII_PACKAGE_TYPE_ALL will cause all package | |
| handles to be listed. | |
| @param This A pointer to the EFI_HII_DATABASE_PROTOCOL instance. | |
| @param PackageType Specifies the package type of the packages | |
| to list or EFI_HII_PACKAGE_TYPE_ALL for | |
| all packages to be listed. | |
| @param PackageGuid If PackageType is | |
| EFI_HII_PACKAGE_TYPE_GUID, then this is | |
| the pointer to the GUID which must match | |
| the Guid field of | |
| EFI_HII_PACKAGE_GUID_HEADER. Otherwise, it | |
| must be NULL. | |
| @param HandleBufferLength On input, a pointer to the length | |
| of the handle buffer. On output, | |
| the length of the handle buffer | |
| that is required for the handles found. | |
| @param Handle An array of EFI_HII_HANDLE instances returned. | |
| @retval EFI_SUCCESS The matching handles are outputed successfully. | |
| HandleBufferLength is updated with the actual length. | |
| @retval EFI_BUFFER_TOO_SMALL The HandleBufferLength parameter | |
| indicates that Handle is too | |
| small to support the number of | |
| handles. HandleBufferLength is | |
| updated with a value that will | |
| enable the data to fit. | |
| @retval EFI_NOT_FOUND No matching handle could be found in database. | |
| @retval EFI_INVALID_PARAMETER HandleBufferLength was NULL. | |
| @retval EFI_INVALID_PARAMETER The value referenced by HandleBufferLength was not | |
| zero and Handle was NULL. | |
| @retval EFI_INVALID_PARAMETER PackageType is not a EFI_HII_PACKAGE_TYPE_GUID but | |
| PackageGuid is not NULL, PackageType is a EFI_HII_ | |
| PACKAGE_TYPE_GUID but PackageGuid is NULL. | |
| **/ | |
| typedef | |
| EFI_STATUS | |
| (EFIAPI *EFI_HII_DATABASE_LIST_PACKS)( | |
| IN CONST EFI_HII_DATABASE_PROTOCOL *This, | |
| IN UINT8 PackageType, | |
| IN CONST EFI_GUID *PackageGuid, | |
| IN OUT UINTN *HandleBufferLength, | |
| OUT EFI_HII_HANDLE *Handle | |
| ); | |
| /** | |
| This function will export one or all package lists in the | |
| database to a buffer. For each package list exported, this | |
| function will call functions registered with EXPORT_PACK and | |
| then copy the package list to the buffer. The registered | |
| functions may call EFI_HII_DATABASE_PROTOCOL.UpdatePackageList() | |
| to modify the package list before it is copied to the buffer. If | |
| the specified BufferSize is too small, then the status | |
| EFI_OUT_OF_RESOURCES will be returned and the actual package | |
| size will be returned in BufferSize. | |
| @param This A pointer to the EFI_HII_DATABASE_PROTOCOL instance. | |
| @param Handle An EFI_HII_HANDLE that corresponds to the | |
| desired package list in the HII database to | |
| export or NULL to indicate all package lists | |
| should be exported. | |
| @param BufferSize On input, a pointer to the length of the | |
| buffer. On output, the length of the | |
| buffer that is required for the exported | |
| data. | |
| @param Buffer A pointer to a buffer that will contain the | |
| results of the export function. | |
| @retval EFI_SUCCESS Package exported. | |
| @retval EFI_OUT_OF_RESOURCES BufferSize is too small to hold the package. | |
| @retval EFI_NOT_FOUND The specifiecd Handle could not be found in the | |
| current database. | |
| @retval EFI_INVALID_PARAMETER BufferSize was NULL. | |
| @retval EFI_INVALID_PARAMETER The value referenced by BufferSize was not zero | |
| and Buffer was NULL. | |
| **/ | |
| typedef | |
| EFI_STATUS | |
| (EFIAPI *EFI_HII_DATABASE_EXPORT_PACKS)( | |
| IN CONST EFI_HII_DATABASE_PROTOCOL *This, | |
| IN EFI_HII_HANDLE Handle, | |
| IN OUT UINTN *BufferSize, | |
| OUT EFI_HII_PACKAGE_LIST_HEADER *Buffer | |
| ); | |
| /** | |
| This function registers a function which will be called when | |
| specified actions related to packages of the specified type | |
| occur in the HII database. By registering a function, other | |
| HII-related drivers are notified when specific package types | |
| are added, removed or updated in the HII database. Each driver | |
| or application which registers a notification should use | |
| EFI_HII_DATABASE_PROTOCOL.UnregisterPackageNotify() before | |
| exiting. | |
| @param This A pointer to the EFI_HII_DATABASE_PROTOCOL instance. | |
| @param PackageType The package type. See | |
| EFI_HII_PACKAGE_TYPE_x in EFI_HII_PACKAGE_HEADER. | |
| @param PackageGuid If PackageType is | |
| EFI_HII_PACKAGE_TYPE_GUID, then this is | |
| the pointer to the GUID which must match | |
| the Guid field of | |
| EFI_HII_PACKAGE_GUID_HEADER. Otherwise, it | |
| must be NULL. | |
| @param PackageNotifyFn Points to the function to be called | |
| when the event specified by | |
| NotificationType occurs. See | |
| EFI_HII_DATABASE_NOTIFY. | |
| @param NotifyType Describes the types of notification which | |
| this function will be receiving. See | |
| EFI_HII_DATABASE_NOTIFY_TYPE for a | |
| list of types. | |
| @param NotifyHandle Points to the unique handle assigned to | |
| the registered notification. Can be used | |
| in EFI_HII_DATABASE_PROTOCOL.UnregisterPack | |
| to stop notifications. | |
| @retval EFI_SUCCESS Notification registered successfully. | |
| @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary | |
| data structures. | |
| @retval EFI_INVALID_PARAMETER PackageGuid is not NULL when | |
| PackageType is not | |
| EFI_HII_PACKAGE_TYPE_GUID. | |
| **/ | |
| typedef | |
| EFI_STATUS | |
| (EFIAPI *EFI_HII_DATABASE_REGISTER_NOTIFY)( | |
| IN CONST EFI_HII_DATABASE_PROTOCOL *This, | |
| IN UINT8 PackageType, | |
| IN CONST EFI_GUID *PackageGuid, | |
| IN EFI_HII_DATABASE_NOTIFY PackageNotifyFn, | |
| IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType, | |
| OUT EFI_HANDLE *NotifyHandle | |
| ); | |
| /** | |
| Removes the specified HII database package-related notification. | |
| @param This A pointer to the EFI_HII_DATABASE_PROTOCOL instance. | |
| @param NotificationHandle The handle of the notification | |
| function being unregistered. | |
| @retval EFI_SUCCESS Successsfully unregistered the notification. | |
| @retval EFI_NOT_FOUND The incoming notification handle does not exist | |
| in the current hii database. | |
| **/ | |
| typedef | |
| EFI_STATUS | |
| (EFIAPI *EFI_HII_DATABASE_UNREGISTER_NOTIFY)( | |
| IN CONST EFI_HII_DATABASE_PROTOCOL *This, | |
| IN EFI_HANDLE NotificationHandle | |
| ); | |
| /** | |
| This routine retrieves an array of GUID values for each keyboard | |
| layout that was previously registered in the system. | |
| @param This A pointer to the EFI_HII_PROTOCOL instance. | |
| @param KeyGuidBufferLength On input, a pointer to the length | |
| of the keyboard GUID buffer. On | |
| output, the length of the handle | |
| buffer that is required for the | |
| handles found. | |
| @param KeyGuidBuffer An array of keyboard layout GUID | |
| instances returned. | |
| @retval EFI_SUCCESS KeyGuidBuffer was updated successfully. | |
| @retval EFI_BUFFER_TOO_SMALL The KeyGuidBufferLength | |
| parameter indicates that | |
| KeyGuidBuffer is too small to | |
| support the number of GUIDs. | |
| KeyGuidBufferLength is updated | |
| with a value that will enable | |
| the data to fit. | |
| @retval EFI_INVALID_PARAMETER The KeyGuidBufferLength is NULL. | |
| @retval EFI_INVALID_PARAMETER The value referenced by | |
| KeyGuidBufferLength is not | |
| zero and KeyGuidBuffer is NULL. | |
| @retval EFI_NOT_FOUND There was no keyboard layout. | |
| **/ | |
| typedef | |
| EFI_STATUS | |
| (EFIAPI *EFI_HII_FIND_KEYBOARD_LAYOUTS)( | |
| IN CONST EFI_HII_DATABASE_PROTOCOL *This, | |
| IN OUT UINT16 *KeyGuidBufferLength, | |
| OUT EFI_GUID *KeyGuidBuffer | |
| ); | |
| /** | |
| This routine retrieves the requested keyboard layout. The layout | |
| is a physical description of the keys on a keyboard, and the | |
| character(s) that are associated with a particular set of key | |
| strokes. | |
| @param This A pointer to the EFI_HII_PROTOCOL instance. | |
| @param KeyGuid A pointer to the unique ID associated with a | |
| given keyboard layout. If KeyGuid is NULL then | |
| the current layout will be retrieved. | |
| @param KeyboardLayoutLength On input, a pointer to the length of the | |
| KeyboardLayout buffer. On output, the length of | |
| the data placed into KeyboardLayout. | |
| @param KeyboardLayout A pointer to a buffer containing the | |
| retrieved keyboard layout. | |
| @retval EFI_SUCCESS The keyboard layout was retrieved | |
| successfully. | |
| @retval EFI_NOT_FOUND The requested keyboard layout was not found. | |
| **/ | |
| typedef | |
| EFI_STATUS | |
| (EFIAPI *EFI_HII_GET_KEYBOARD_LAYOUT)( | |
| IN CONST EFI_HII_DATABASE_PROTOCOL *This, | |
| IN CONST EFI_GUID *KeyGuid, | |
| IN OUT UINT16 *KeyboardLayoutLength, | |
| OUT EFI_HII_KEYBOARD_LAYOUT *KeyboardLayout | |
| ); | |
| /** | |
| This routine sets the default keyboard layout to the one | |
| referenced by KeyGuid. When this routine is called, an event | |
| will be signaled of the EFI_HII_SET_KEYBOARD_LAYOUT_EVENT_GUID | |
| group type. This is so that agents which are sensitive to the | |
| current keyboard layout being changed can be notified of this | |
| change. | |
| @param This A pointer to the EFI_HII_PROTOCOL instance. | |
| @param KeyGuid A pointer to the unique ID associated with a | |
| given keyboard layout. | |
| @retval EFI_SUCCESS The current keyboard layout was successfully set. | |
| @retval EFI_NOT_FOUND The referenced keyboard layout was not | |
| found, so action was taken. | |
| **/ | |
| typedef | |
| EFI_STATUS | |
| (EFIAPI *EFI_HII_SET_KEYBOARD_LAYOUT)( | |
| IN CONST EFI_HII_DATABASE_PROTOCOL *This, | |
| IN CONST EFI_GUID *KeyGuid | |
| ); | |
| /** | |
| Return the EFI handle associated with a package list. | |
| @param This A pointer to the EFI_HII_PROTOCOL instance. | |
| @param PackageListHandle An EFI_HII_HANDLE that corresponds | |
| to the desired package list in the | |
| HIIdatabase. | |
| @param DriverHandle On return, contains the EFI_HANDLE which | |
| was registered with the package list in | |
| NewPackageList(). | |
| @retval EFI_SUCCESS The DriverHandle was returned successfully. | |
| @retval EFI_INVALID_PARAMETER The PackageListHandle was not valid. | |
| **/ | |
| typedef | |
| EFI_STATUS | |
| (EFIAPI *EFI_HII_DATABASE_GET_PACK_HANDLE)( | |
| IN CONST EFI_HII_DATABASE_PROTOCOL *This, | |
| IN EFI_HII_HANDLE PackageListHandle, | |
| OUT EFI_HANDLE *DriverHandle | |
| ); | |
| /// | |
| /// Database manager for HII-related data structures. | |
| /// | |
| struct _EFI_HII_DATABASE_PROTOCOL { | |
| EFI_HII_DATABASE_NEW_PACK NewPackageList; | |
| EFI_HII_DATABASE_REMOVE_PACK RemovePackageList; | |
| EFI_HII_DATABASE_UPDATE_PACK UpdatePackageList; | |
| EFI_HII_DATABASE_LIST_PACKS ListPackageLists; | |
| EFI_HII_DATABASE_EXPORT_PACKS ExportPackageLists; | |
| EFI_HII_DATABASE_REGISTER_NOTIFY RegisterPackageNotify; | |
| EFI_HII_DATABASE_UNREGISTER_NOTIFY UnregisterPackageNotify; | |
| EFI_HII_FIND_KEYBOARD_LAYOUTS FindKeyboardLayouts; | |
| EFI_HII_GET_KEYBOARD_LAYOUT GetKeyboardLayout; | |
| EFI_HII_SET_KEYBOARD_LAYOUT SetKeyboardLayout; | |
| EFI_HII_DATABASE_GET_PACK_HANDLE GetPackageListHandle; | |
| }; | |
| extern EFI_GUID gEfiHiiDatabaseProtocolGuid; | |
| #endif | |