2 Framework to UEFI 2.1 HII Thunk. The driver consume UEFI HII protocols
3 to produce a Framework HII protocol.
5 Copyright (c) 2008, Intel Corporation
6 All rights reserved. This program and the accompanying materials
7 are licensed and made available under the terms and conditions of the BSD License
8 which accompanies this distribution. The full text of the license may be found at
9 http://opensource.org/licenses/bsd-license.php
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
16 #include "HiiDatabase.h"
18 EFI_HII_THUNK_PRIVATE_DATA
*mHiiThunkPrivateData
;
20 EFI_HII_THUNK_PRIVATE_DATA mHiiThunkPrivateDataTempate
= {
22 EFI_HII_THUNK_DRIVER_DATA_SIGNATURE
38 HiiGetPrimaryLanguages
,
39 HiiGetSecondaryLanguages
,
50 //The FRAMEWORK_EFI_HII_HANDLE starts from 1
51 // and increase upwords untill reach the value of StaticPureUefiHiiHandle.
52 // The code will assert to prevent overflow.
53 (FRAMEWORK_EFI_HII_HANDLE
) 1
55 //StaticPureUefiHiiHandle
56 //The Static FRAMEWORK_EFI_HII_HANDLE starts from 0xFFFF
57 // and decrease downwords untill reach the value of StaticHiiHandle.
58 // The code will assert to prevent overflow.
59 (FRAMEWORK_EFI_HII_HANDLE
) 0xFFFF
62 NULL
, NULL
//HiiHandleLinkList
66 EFI_FORMBROWSER_THUNK_PRIVATE_DATA mBrowserThunkPrivateDataTemplate
= {
67 EFI_FORMBROWSER_THUNK_PRIVATE_DATA_SIGNATURE
,
76 CONST EFI_HII_DATABASE_PROTOCOL
*mHiiDatabase
;
77 CONST EFI_HII_FONT_PROTOCOL
*mHiiFontProtocol
;
78 CONST EFI_HII_IMAGE_PROTOCOL
*mHiiImageProtocol
;
79 CONST EFI_HII_STRING_PROTOCOL
*mHiiStringProtocol
;
80 CONST EFI_HII_CONFIG_ROUTING_PROTOCOL
*mHiiConfigRoutingProtocol
;
83 RegisterUefiHiiHandle (
84 EFI_HII_THUNK_PRIVATE_DATA
*Private
,
85 EFI_HII_HANDLE UefiHiiHandle
90 HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY
*HandleMappingEntry
;
92 HandleMappingEntry
= AllocateZeroPool (sizeof (*HandleMappingEntry
));
93 HandleMappingEntry
->Signature
= HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY_SIGNATURE
;
95 Status
= AssignPureUefiHiiHandle (Private
, &HandleMappingEntry
->FrameworkHiiHandle
);
96 if (EFI_ERROR (Status
)) {
100 HandleMappingEntry
->UefiHiiHandle
= UefiHiiHandle
;
101 Status
= HiiLibExtractGuidFromHiiHandle (UefiHiiHandle
, &PackageGuid
);
102 ASSERT_EFI_ERROR (Status
);
104 CopyGuid(&HandleMappingEntry
->TagGuid
, &PackageGuid
);
106 InsertTailList (&Private
->HiiThunkHandleMappingDBListHead
, &HandleMappingEntry
->List
);
113 UnRegisterUefiHiiHandle (
114 EFI_HII_THUNK_PRIVATE_DATA
*Private
,
115 EFI_HII_HANDLE UefiHiiHandle
118 HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY
*MapEntry
;
120 MapEntry
= UefiHiiHandleToMapDatabaseEntry (Private
, UefiHiiHandle
);
121 ASSERT (MapEntry
!= NULL
);
123 RemoveEntryList (&MapEntry
->List
);
133 IN UINT8 PackageType
,
134 IN CONST EFI_GUID
*PackageGuid
,
135 IN CONST EFI_HII_PACKAGE_HEADER
*Package
,
136 IN EFI_HII_HANDLE Handle
,
137 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
141 EFI_HII_THUNK_PRIVATE_DATA
*Private
;
143 ASSERT (PackageType
== EFI_HII_PACKAGE_STRINGS
);
144 ASSERT (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
);
146 Status
= EFI_SUCCESS
;
147 Private
= mHiiThunkPrivateData
;
149 if (mInFrameworkHiiNewPack
) {
154 // We only create a MapEntry if the Uefi Hii Handle is only already registered
155 // by the HII Thunk Layer.
157 if (UefiHiiHandleToMapDatabaseEntry (Private
, Handle
) == NULL
) {
158 Status
= RegisterUefiHiiHandle (Private
, Handle
);
166 IN UINT8 PackageType
,
167 IN CONST EFI_GUID
*PackageGuid
,
168 IN CONST EFI_HII_PACKAGE_HEADER
*Package
,
169 IN EFI_HII_HANDLE Handle
,
170 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
174 EFI_HII_THUNK_PRIVATE_DATA
*Private
;
176 ASSERT (PackageType
== EFI_HII_PACKAGE_STRINGS
);
177 ASSERT (NotifyType
== EFI_HII_DATABASE_NOTIFY_NEW_PACK
);
179 if (mInFrameworkHiiNewPack
) {
183 Status
= EFI_SUCCESS
;
184 Private
= mHiiThunkPrivateData
;
189 if (UefiHiiHandleToMapDatabaseEntry (Private
, Handle
) == NULL
) {
190 Status
= RegisterUefiHiiHandle (Private
, Handle
);
198 IN CONST EFI_HII_PACKAGE_HEADER
*Package
,
199 IN EFI_HII_HANDLE Handle
202 EFI_HII_PACKAGE_LIST_HEADER
*HiiPackageList
;
205 EFI_HII_PACKAGE_HEADER
*PackageHdrPtr
;
206 EFI_HII_PACKAGE_HEADER PackageHeader
;
210 HiiPackageList
= NULL
;
212 Status
= mHiiDatabase
->ExportPackageLists (mHiiDatabase
, Handle
, &BufferSize
, HiiPackageList
);
213 ASSERT (Status
!= EFI_NOT_FOUND
);
215 if (Status
== EFI_BUFFER_TOO_SMALL
) {
216 HiiPackageList
= AllocateZeroPool (BufferSize
);
217 ASSERT (HiiPackageList
!= NULL
);
219 Status
= mHiiDatabase
->ExportPackageLists (mHiiDatabase
, Handle
, &BufferSize
, HiiPackageList
);
223 PackageHdrPtr
= (EFI_HII_PACKAGE_HEADER
*) ((UINT8
*) HiiPackageList
+ sizeof (EFI_HII_PACKAGE_LIST_HEADER
));
224 CopyMem (&PackageHeader
, PackageHdrPtr
, sizeof (EFI_HII_PACKAGE_HEADER
));
226 Status
= EFI_SUCCESS
;
228 while (PackageHeader
.Type
!= EFI_HII_PACKAGE_END
) {
229 switch (PackageHeader
.Type
) {
230 case EFI_HII_PACKAGE_STRINGS
:
231 if (CompareMem (Package
, PackageHdrPtr
, Package
->Length
) != 0) {
232 FreePool (HiiPackageList
);
240 // goto header of next package
242 PackageHdrPtr
= (EFI_HII_PACKAGE_HEADER
*) ((UINT8
*) PackageHdrPtr
+ PackageHeader
.Length
);
243 CopyMem (&PackageHeader
, PackageHdrPtr
, sizeof (EFI_HII_PACKAGE_HEADER
));
246 FreePool (HiiPackageList
);
253 IN UINT8 PackageType
,
254 IN CONST EFI_GUID
*PackageGuid
,
255 IN CONST EFI_HII_PACKAGE_HEADER
*Package
,
256 IN EFI_HII_HANDLE Handle
,
257 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
261 EFI_HII_THUNK_PRIVATE_DATA
*Private
;
262 HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY
* MapEntry
;
264 Status
= EFI_SUCCESS
;
266 ASSERT (PackageType
== EFI_HII_PACKAGE_STRINGS
);
267 ASSERT (NotifyType
== EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
);
269 if (mInFrameworkHiiRemovePack
) {
273 Private
= mHiiThunkPrivateData
;
275 MapEntry
= UefiHiiHandleToMapDatabaseEntry (Private
, Handle
);
277 if (MapEntry
->FrameworkHiiHandle
> Private
->StaticHiiHandle
) {
279 // This is a PackageList registered using UEFI HII Protocol Instance.
280 // The MapEntry->TagGuid for this type of PackageList is a auto generated GUID
281 // to link StringPack with IfrPack.
282 // RemovePackNotify is only used to remove PackageList when it is removed by
283 // calling mHiiDatabase->RemovePackageList interface.
284 if (IsLastStringPack (Package
, Handle
)) {
285 Status
= UnRegisterUefiHiiHandle (Private
, Handle
);
295 EFI_HII_THUNK_PRIVATE_DATA
*Private
298 UINTN HandleBufferLength
;
299 EFI_HII_HANDLE
*HandleBuffer
;
302 HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY
* MapEntry
;
304 HandleBufferLength
= 0;
306 Status
= mHiiDatabase
->ListPackageLists (
308 EFI_HII_PACKAGE_TYPE_ALL
,
313 if (EFI_ERROR (Status
) && (Status
!= EFI_BUFFER_TOO_SMALL
)) {
315 // As no package is registered to UEFI HII Database, EFI_SUCCESS is returned.
318 if (Status
== EFI_NOT_FOUND
) {
325 HandleBuffer
= AllocateZeroPool (HandleBufferLength
);
326 Status
= mHiiDatabase
->ListPackageLists (
328 EFI_HII_PACKAGE_TYPE_ALL
,
334 for (Index
= 0; Index
< HandleBufferLength
/ sizeof (EFI_HII_HANDLE
); Index
++) {
335 MapEntry
= UefiHiiHandleToMapDatabaseEntry (Private
, HandleBuffer
[Index
]);
337 // Only register those UEFI HII Handles that are registered using the UEFI HII database interface.
339 if (MapEntry
== NULL
) {
340 Status
= RegisterUefiHiiHandle (Private
, HandleBuffer
[Index
]);
341 ASSERT_EFI_ERROR (Status
);
350 InitializeHiiDatabase (
351 IN EFI_HANDLE ImageHandle
,
352 IN EFI_SYSTEM_TABLE
*SystemTable
357 Initialize HII Database
360 (Standard EFI Image entry - EFI_IMAGE_ENTRY_POINT)
363 EFI_SUCCESS - Setup loaded.
368 EFI_HII_THUNK_PRIVATE_DATA
*HiiData
;
372 ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL
, &gEfiHiiProtocolGuid
);
374 HiiData
= AllocateCopyPool (sizeof (EFI_HII_THUNK_PRIVATE_DATA
), &mHiiThunkPrivateDataTempate
);
375 ASSERT (HiiData
!= NULL
);
376 InitializeListHead (&HiiData
->HiiThunkHandleMappingDBListHead
);
378 mHiiThunkPrivateData
= HiiData
;
380 Status
= gBS
->LocateProtocol (
381 &gEfiHiiDatabaseProtocolGuid
,
383 (VOID
**) &mHiiDatabase
385 ASSERT_EFI_ERROR (Status
);
387 Status
= gBS
->LocateProtocol (
388 &gEfiHiiFontProtocolGuid
,
390 (VOID
**) &mHiiFontProtocol
392 ASSERT_EFI_ERROR (Status
);
394 Status
= gBS
->LocateProtocol (
395 &gEfiHiiImageProtocolGuid
,
397 (VOID
**) &mHiiImageProtocol
399 ASSERT_EFI_ERROR (Status
);
401 Status
= gBS
->LocateProtocol (
402 &gEfiHiiStringProtocolGuid
,
404 (VOID
**) &mHiiStringProtocol
406 ASSERT_EFI_ERROR (Status
);
408 Status
= gBS
->LocateProtocol (
409 &gEfiHiiConfigRoutingProtocolGuid
,
411 (VOID
**) &mHiiConfigRoutingProtocol
413 ASSERT_EFI_ERROR (Status
);
416 // Install protocol interface
419 Status
= gBS
->InstallProtocolInterface (
421 &gEfiHiiProtocolGuid
,
422 EFI_NATIVE_INTERFACE
,
423 (VOID
*) &HiiData
->Hii
425 ASSERT_EFI_ERROR (Status
);
427 Status
= MapUefiHiiHandles (HiiData
);
428 ASSERT_EFI_ERROR (Status
);
430 Status
= mHiiDatabase
->RegisterPackageNotify (
432 EFI_HII_PACKAGE_STRINGS
,
435 EFI_HII_DATABASE_NOTIFY_NEW_PACK
,
436 &HiiData
->NewPackNotifyHandle
438 ASSERT_EFI_ERROR (Status
);
440 Status
= mHiiDatabase
->RegisterPackageNotify (
442 EFI_HII_PACKAGE_STRINGS
,
445 EFI_HII_DATABASE_NOTIFY_ADD_PACK
,
446 &HiiData
->AddPackNotifyHandle
448 ASSERT_EFI_ERROR (Status
);
450 Status
= mHiiDatabase
->RegisterPackageNotify (
452 EFI_HII_PACKAGE_STRINGS
,
455 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
456 &HiiData
->RemovePackNotifyHandle
458 ASSERT_EFI_ERROR (Status
);
460 Status
= gBS
->InstallProtocolInterface (
461 &mBrowserThunkPrivateDataTemplate
.Handle
,
462 &gEfiFormBrowserProtocolGuid
,
463 EFI_NATIVE_INTERFACE
,
464 (VOID
*) &mBrowserThunkPrivateDataTemplate
.FormBrowser
466 ASSERT_EFI_ERROR (Status
);
474 IN EFI_HII_PROTOCOL
*This
,
475 IN OUT UINT16
*HandleBufferLength
,
476 OUT FRAMEWORK_EFI_HII_HANDLE Handle
[1]
481 Determines the handles that are currently active in the database.
490 LIST_ENTRY
*ListEntry
;
491 HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY
*HandleMapEntry
;
492 EFI_HII_THUNK_PRIVATE_DATA
*Private
;
494 if (HandleBufferLength
== NULL
) {
495 return EFI_INVALID_PARAMETER
;
498 Private
= EFI_HII_THUNK_PRIVATE_DATA_FROM_THIS(This
);
501 for (ListEntry
= Private
->HiiThunkHandleMappingDBListHead
.ForwardLink
;
502 ListEntry
!= &Private
->HiiThunkHandleMappingDBListHead
;
503 ListEntry
= ListEntry
->ForwardLink
508 if (Count
> *HandleBufferLength
) {
509 *HandleBufferLength
= (Count
* sizeof (FRAMEWORK_EFI_HII_HANDLE
));
510 return EFI_BUFFER_TOO_SMALL
;
514 for (ListEntry
= Private
->HiiThunkHandleMappingDBListHead
.ForwardLink
;
515 ListEntry
!= &Private
->HiiThunkHandleMappingDBListHead
;
516 ListEntry
= ListEntry
->ForwardLink
518 HandleMapEntry
= HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY_FROM_LISTENTRY (ListEntry
);
520 Handle
[Count
] = HandleMapEntry
->FrameworkHiiHandle
;
525 *HandleBufferLength
= (Count
* sizeof (FRAMEWORK_EFI_HII_HANDLE
));
531 HiiGetPrimaryLanguages (
532 IN EFI_HII_PROTOCOL
*This
,
533 IN FRAMEWORK_EFI_HII_HANDLE Handle
,
534 OUT EFI_STRING
*LanguageString
540 This function allows a program to determine what the primary languages that are supported on a given handle.
548 EFI_HII_THUNK_PRIVATE_DATA
*Private
;
549 EFI_HII_HANDLE UefiHiiHandle
;
550 CHAR8
*AsciiLanguageCodes
;
551 CHAR16
*UnicodeLanguageCodes
;
553 Private
= EFI_HII_THUNK_PRIVATE_DATA_FROM_THIS(This
);
557 UefiHiiHandle
= FrameworkHiiHandleToUefiHiiHandle (Private
, Handle
);
558 if (UefiHiiHandle
== NULL
) {
559 return EFI_INVALID_PARAMETER
;
562 AsciiLanguageCodes
= HiiLibGetSupportedLanguages (UefiHiiHandle
);
564 if (AsciiLanguageCodes
== NULL
) {
565 return EFI_INVALID_PARAMETER
;
568 UnicodeLanguageCodes
= AllocateZeroPool (AsciiStrSize (AsciiLanguageCodes
) * sizeof (CHAR16
));
569 if (UnicodeLanguageCodes
== NULL
) {
570 return EFI_OUT_OF_RESOURCES
;
574 // The language returned is in RFC 3066 format.
576 *LanguageString
= AsciiStrToUnicodeStr (AsciiLanguageCodes
, UnicodeLanguageCodes
);
583 HiiGetSecondaryLanguages (
584 IN EFI_HII_PROTOCOL
*This
,
585 IN FRAMEWORK_EFI_HII_HANDLE Handle
,
586 IN CHAR16
*PrimaryLanguage
,
587 OUT EFI_STRING
*LanguageString
593 This function allows a program to determine which secondary languages are supported
594 on a given handle for a given primary language.
602 EFI_HII_THUNK_PRIVATE_DATA
*Private
;
603 EFI_HII_HANDLE UefiHiiHandle
;
604 CHAR8
*AsciiPrimaryLanguage
;
605 CHAR8
*AsciiLanguageCodes
;
606 CHAR16
*UnicodeLanguageCodes
;
608 Private
= EFI_HII_THUNK_PRIVATE_DATA_FROM_THIS(This
);
612 UefiHiiHandle
= FrameworkHiiHandleToUefiHiiHandle (Private
, Handle
);
613 if (UefiHiiHandle
== NULL
) {
614 return EFI_INVALID_PARAMETER
;
617 AsciiPrimaryLanguage
= AllocateZeroPool (StrLen (PrimaryLanguage
) + 1);
619 UnicodeStrToAsciiStr (PrimaryLanguage
, AsciiPrimaryLanguage
);
621 AsciiLanguageCodes
= HiiLibGetSupportedSecondaryLanguages (UefiHiiHandle
, AsciiPrimaryLanguage
);
623 if (AsciiLanguageCodes
== NULL
) {
624 return EFI_INVALID_PARAMETER
;
627 UnicodeLanguageCodes
= AllocateZeroPool (AsciiStrSize (AsciiLanguageCodes
) * sizeof (CHAR16
));
628 if (UnicodeLanguageCodes
== NULL
) {
629 return EFI_OUT_OF_RESOURCES
;
633 // The language returned is in RFC 3066 format.
635 *LanguageString
= AsciiStrToUnicodeStr (AsciiLanguageCodes
, UnicodeLanguageCodes
);
643 IN EFI_FORM_BROWSER_PROTOCOL
*This
,
644 IN BOOLEAN UseDatabase
,
645 IN FRAMEWORK_EFI_HII_HANDLE
*Handle
,
646 IN UINTN HandleCount
,
647 IN FRAMEWORK_EFI_IFR_PACKET
*Packet
, OPTIONAL
648 IN EFI_HANDLE CallbackHandle
, OPTIONAL
649 IN UINT8
*NvMapOverride
, OPTIONAL
650 IN FRAMEWORK_EFI_SCREEN_DESCRIPTOR
*ScreenDimensions
, OPTIONAL
651 OUT BOOLEAN
*ResetRequired OPTIONAL
655 return EFI_UNSUPPORTED
;
661 IN UINTN NumberOfLines
,
663 IN UINTN MaximumStringSize
,
664 OUT CHAR16
*StringBuffer
,
665 OUT EFI_INPUT_KEY
*KeyValue
,
671 return EFI_UNSUPPORTED
;