/** @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 | |