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 CONST EFI_HII_DATABASE_PROTOCOL
*mHiiDatabase
;
67 CONST EFI_HII_FONT_PROTOCOL
*mHiiFontProtocol
;
68 CONST EFI_HII_IMAGE_PROTOCOL
*mHiiImageProtocol
;
69 CONST EFI_HII_STRING_PROTOCOL
*mHiiStringProtocol
;
70 CONST EFI_HII_CONFIG_ROUTING_PROTOCOL
*mHiiConfigRoutingProtocol
;
73 RegisterUefiHiiHandle (
74 EFI_HII_THUNK_PRIVATE_DATA
*Private
,
75 EFI_HII_HANDLE UefiHiiHandle
80 HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY
*HandleMappingEntry
;
82 HandleMappingEntry
= AllocateZeroPool (sizeof (*HandleMappingEntry
));
83 HandleMappingEntry
->Signature
= HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY_SIGNATURE
;
85 Status
= AssignPureUefiHiiHandle (Private
, &HandleMappingEntry
->FrameworkHiiHandle
);
86 if (EFI_ERROR (Status
)) {
90 HandleMappingEntry
->UefiHiiHandle
= UefiHiiHandle
;
91 Status
= HiiLibExtractGuidFromHiiHandle (UefiHiiHandle
, &PackageGuid
);
92 ASSERT_EFI_ERROR (Status
);
94 CopyGuid(&HandleMappingEntry
->TagGuid
, &PackageGuid
);
96 InsertTailList (&Private
->HiiThunkHandleMappingDBListHead
, &HandleMappingEntry
->List
);
103 UnRegisterUefiHiiHandle (
104 EFI_HII_THUNK_PRIVATE_DATA
*Private
,
105 EFI_HII_HANDLE UefiHiiHandle
108 HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY
*MapEntry
;
110 MapEntry
= UefiHiiHandleToMapDatabaseEntry (Private
, UefiHiiHandle
);
111 ASSERT (MapEntry
!= NULL
);
113 RemoveEntryList (&MapEntry
->List
);
123 IN UINT8 PackageType
,
124 IN CONST EFI_GUID
*PackageGuid
,
125 IN CONST EFI_HII_PACKAGE_HEADER
*Package
,
126 IN EFI_HII_HANDLE Handle
,
127 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
131 EFI_HII_THUNK_PRIVATE_DATA
*Private
;
133 ASSERT (PackageType
== EFI_HII_PACKAGE_STRINGS
);
134 ASSERT (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
);
136 Status
= EFI_SUCCESS
;
137 Private
= mHiiThunkPrivateData
;
139 if (mInFrameworkHiiNewPack
) {
144 // We only create a MapEntry if the Uefi Hii Handle is only already registered
145 // by the HII Thunk Layer.
147 if (UefiHiiHandleToMapDatabaseEntry (Private
, Handle
) == NULL
) {
148 Status
= RegisterUefiHiiHandle (Private
, Handle
);
156 IN UINT8 PackageType
,
157 IN CONST EFI_GUID
*PackageGuid
,
158 IN CONST EFI_HII_PACKAGE_HEADER
*Package
,
159 IN EFI_HII_HANDLE Handle
,
160 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
164 EFI_HII_THUNK_PRIVATE_DATA
*Private
;
166 ASSERT (PackageType
== EFI_HII_PACKAGE_STRINGS
);
167 ASSERT (NotifyType
== EFI_HII_DATABASE_NOTIFY_NEW_PACK
);
169 if (mInFrameworkHiiNewPack
) {
173 Status
= EFI_SUCCESS
;
174 Private
= mHiiThunkPrivateData
;
179 if (UefiHiiHandleToMapDatabaseEntry (Private
, Handle
) == NULL
) {
180 Status
= RegisterUefiHiiHandle (Private
, Handle
);
188 IN CONST EFI_HII_PACKAGE_HEADER
*Package
,
189 IN EFI_HII_HANDLE Handle
192 EFI_HII_PACKAGE_LIST_HEADER
*HiiPackageList
;
195 EFI_HII_PACKAGE_HEADER
*PackageHdrPtr
;
196 EFI_HII_PACKAGE_HEADER PackageHeader
;
200 HiiPackageList
= NULL
;
202 Status
= mHiiDatabase
->ExportPackageLists (mHiiDatabase
, Handle
, &BufferSize
, HiiPackageList
);
203 ASSERT (Status
!= EFI_NOT_FOUND
);
205 if (Status
== EFI_BUFFER_TOO_SMALL
) {
206 HiiPackageList
= AllocateZeroPool (BufferSize
);
207 ASSERT (HiiPackageList
!= NULL
);
209 Status
= mHiiDatabase
->ExportPackageLists (mHiiDatabase
, Handle
, &BufferSize
, HiiPackageList
);
213 PackageHdrPtr
= (EFI_HII_PACKAGE_HEADER
*) ((UINT8
*) HiiPackageList
+ sizeof (EFI_HII_PACKAGE_LIST_HEADER
));
214 CopyMem (&PackageHeader
, PackageHdrPtr
, sizeof (EFI_HII_PACKAGE_HEADER
));
216 Status
= EFI_SUCCESS
;
218 while (PackageHeader
.Type
!= EFI_HII_PACKAGE_END
) {
219 switch (PackageHeader
.Type
) {
220 case EFI_HII_PACKAGE_STRINGS
:
221 if (CompareMem (Package
, PackageHdrPtr
, Package
->Length
) != 0) {
222 FreePool (HiiPackageList
);
230 // goto header of next package
232 PackageHdrPtr
= (EFI_HII_PACKAGE_HEADER
*) ((UINT8
*) PackageHdrPtr
+ PackageHeader
.Length
);
233 CopyMem (&PackageHeader
, PackageHdrPtr
, sizeof (EFI_HII_PACKAGE_HEADER
));
236 FreePool (HiiPackageList
);
243 IN UINT8 PackageType
,
244 IN CONST EFI_GUID
*PackageGuid
,
245 IN CONST EFI_HII_PACKAGE_HEADER
*Package
,
246 IN EFI_HII_HANDLE Handle
,
247 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
251 EFI_HII_THUNK_PRIVATE_DATA
*Private
;
252 HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY
* MapEntry
;
254 Status
= EFI_SUCCESS
;
256 ASSERT (PackageType
== EFI_HII_PACKAGE_STRINGS
);
257 ASSERT (NotifyType
== EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
);
259 if (mInFrameworkHiiRemovePack
) {
263 Private
= mHiiThunkPrivateData
;
265 MapEntry
= UefiHiiHandleToMapDatabaseEntry (Private
, Handle
);
267 if (MapEntry
->FrameworkHiiHandle
> Private
->StaticHiiHandle
) {
269 // This is a PackageList registered using UEFI HII Protocol Instance.
270 // The MapEntry->TagGuid for this type of PackageList is a auto generated GUID
271 // to link StringPack with IfrPack.
272 // RemovePackNotify is only used to remove PackageList when it is removed by
273 // calling mHiiDatabase->RemovePackageList interface.
274 if (IsLastStringPack (Package
, Handle
)) {
275 Status
= UnRegisterUefiHiiHandle (Private
, Handle
);
285 EFI_HII_THUNK_PRIVATE_DATA
*Private
288 UINTN HandleBufferLength
;
289 EFI_HII_HANDLE
*HandleBuffer
;
292 HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY
* MapEntry
;
294 HandleBufferLength
= 0;
296 Status
= mHiiDatabase
->ListPackageLists (
298 EFI_HII_PACKAGE_TYPE_ALL
,
303 if (EFI_ERROR (Status
) && (Status
!= EFI_BUFFER_TOO_SMALL
)) {
307 HandleBuffer
= AllocateZeroPool (HandleBufferLength
);
308 Status
= mHiiDatabase
->ListPackageLists (
310 EFI_HII_PACKAGE_TYPE_ALL
,
316 for (Index
= 0; Index
< HandleBufferLength
/ sizeof (EFI_HII_HANDLE
); Index
++) {
317 MapEntry
= UefiHiiHandleToMapDatabaseEntry (Private
, HandleBuffer
[Index
]);
319 // Only register those UEFI HII Handles that are registered using the UEFI HII database interface.
321 if (MapEntry
== NULL
) {
322 Status
= RegisterUefiHiiHandle (Private
, HandleBuffer
[Index
]);
323 ASSERT_EFI_ERROR (Status
);
332 InitializeHiiDatabase (
333 IN EFI_HANDLE ImageHandle
,
334 IN EFI_SYSTEM_TABLE
*SystemTable
339 Initialize HII Database
342 (Standard EFI Image entry - EFI_IMAGE_ENTRY_POINT)
345 EFI_SUCCESS - Setup loaded.
350 EFI_HII_THUNK_PRIVATE_DATA
*HiiData
;
354 ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL
, &gEfiHiiProtocolGuid
);
356 HiiData
= AllocateCopyPool (sizeof (EFI_HII_THUNK_PRIVATE_DATA
), &mHiiThunkPrivateDataTempate
);
357 ASSERT (HiiData
!= NULL
);
358 InitializeListHead (&HiiData
->HiiThunkHandleMappingDBListHead
);
360 mHiiThunkPrivateData
= HiiData
;
362 Status
= gBS
->LocateProtocol (
363 &gEfiHiiDatabaseProtocolGuid
,
365 (VOID
**) &mHiiDatabase
367 ASSERT_EFI_ERROR (Status
);
369 Status
= gBS
->LocateProtocol (
370 &gEfiHiiFontProtocolGuid
,
372 (VOID
**) &mHiiFontProtocol
374 ASSERT_EFI_ERROR (Status
);
376 Status
= gBS
->LocateProtocol (
377 &gEfiHiiImageProtocolGuid
,
379 (VOID
**) &mHiiImageProtocol
381 ASSERT_EFI_ERROR (Status
);
383 Status
= gBS
->LocateProtocol (
384 &gEfiHiiStringProtocolGuid
,
386 (VOID
**) &mHiiStringProtocol
388 ASSERT_EFI_ERROR (Status
);
390 Status
= gBS
->LocateProtocol (
391 &gEfiHiiConfigRoutingProtocolGuid
,
393 (VOID
**) &mHiiConfigRoutingProtocol
395 ASSERT_EFI_ERROR (Status
);
398 // Install protocol interface
401 Status
= gBS
->InstallProtocolInterface (
403 &gEfiHiiProtocolGuid
,
404 EFI_NATIVE_INTERFACE
,
405 (VOID
*) &HiiData
->Hii
407 ASSERT_EFI_ERROR (Status
);
409 Status
= MapUefiHiiHandles (HiiData
);
410 ASSERT_EFI_ERROR (Status
);
412 Status
= mHiiDatabase
->RegisterPackageNotify (
414 EFI_HII_PACKAGE_STRINGS
,
417 EFI_HII_DATABASE_NOTIFY_NEW_PACK
,
418 &HiiData
->NewPackNotifyHandle
420 ASSERT_EFI_ERROR (Status
);
422 Status
= mHiiDatabase
->RegisterPackageNotify (
424 EFI_HII_PACKAGE_STRINGS
,
427 EFI_HII_DATABASE_NOTIFY_ADD_PACK
,
428 &HiiData
->AddPackNotifyHandle
430 ASSERT_EFI_ERROR (Status
);
432 Status
= mHiiDatabase
->RegisterPackageNotify (
434 EFI_HII_PACKAGE_STRINGS
,
437 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
438 &HiiData
->RemovePackNotifyHandle
440 ASSERT_EFI_ERROR (Status
);
448 IN EFI_HII_PROTOCOL
*This
,
449 IN OUT UINT16
*HandleBufferLength
,
450 OUT FRAMEWORK_EFI_HII_HANDLE Handle
[1]
455 Determines the handles that are currently active in the database.
464 LIST_ENTRY
*ListEntry
;
465 HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY
*HandleMapEntry
;
466 EFI_HII_THUNK_PRIVATE_DATA
*Private
;
468 if (HandleBufferLength
== NULL
) {
469 return EFI_INVALID_PARAMETER
;
472 Private
= EFI_HII_THUNK_PRIVATE_DATA_FROM_THIS(This
);
475 for (ListEntry
= Private
->HiiThunkHandleMappingDBListHead
.ForwardLink
;
476 ListEntry
!= &Private
->HiiThunkHandleMappingDBListHead
;
477 ListEntry
= ListEntry
->ForwardLink
482 if (Count
> *HandleBufferLength
) {
483 *HandleBufferLength
= (Count
* sizeof (FRAMEWORK_EFI_HII_HANDLE
));
484 return EFI_BUFFER_TOO_SMALL
;
488 for (ListEntry
= Private
->HiiThunkHandleMappingDBListHead
.ForwardLink
;
489 ListEntry
!= &Private
->HiiThunkHandleMappingDBListHead
;
490 ListEntry
= ListEntry
->ForwardLink
492 HandleMapEntry
= HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY_FROM_LISTENTRY (ListEntry
);
494 Handle
[Count
] = HandleMapEntry
->FrameworkHiiHandle
;
499 *HandleBufferLength
= (Count
* sizeof (FRAMEWORK_EFI_HII_HANDLE
));
505 HiiGetPrimaryLanguages (
506 IN EFI_HII_PROTOCOL
*This
,
507 IN FRAMEWORK_EFI_HII_HANDLE Handle
,
508 OUT EFI_STRING
*LanguageString
514 This function allows a program to determine what the primary languages that are supported on a given handle.
522 EFI_HII_THUNK_PRIVATE_DATA
*Private
;
523 EFI_HII_HANDLE UefiHiiHandle
;
524 CHAR8
*AsciiLanguageCodes
;
525 CHAR16
*UnicodeLanguageCodes
;
527 Private
= EFI_HII_THUNK_PRIVATE_DATA_FROM_THIS(This
);
531 UefiHiiHandle
= FrameworkHiiHandleToUefiHiiHandle (Private
, Handle
);
532 if (UefiHiiHandle
== NULL
) {
533 return EFI_INVALID_PARAMETER
;
536 AsciiLanguageCodes
= HiiLibGetSupportedLanguages (UefiHiiHandle
);
538 if (AsciiLanguageCodes
== NULL
) {
539 return EFI_INVALID_PARAMETER
;
542 UnicodeLanguageCodes
= AllocateZeroPool (AsciiStrSize (AsciiLanguageCodes
) * sizeof (CHAR16
));
543 if (UnicodeLanguageCodes
== NULL
) {
544 return EFI_OUT_OF_RESOURCES
;
548 // The language returned is in RFC 3066 format.
550 *LanguageString
= AsciiStrToUnicodeStr (AsciiLanguageCodes
, UnicodeLanguageCodes
);
557 HiiGetSecondaryLanguages (
558 IN EFI_HII_PROTOCOL
*This
,
559 IN FRAMEWORK_EFI_HII_HANDLE Handle
,
560 IN CHAR16
*PrimaryLanguage
,
561 OUT EFI_STRING
*LanguageString
567 This function allows a program to determine which secondary languages are supported
568 on a given handle for a given primary language.
576 EFI_HII_THUNK_PRIVATE_DATA
*Private
;
577 EFI_HII_HANDLE UefiHiiHandle
;
578 CHAR8
*AsciiPrimaryLanguage
;
579 CHAR8
*AsciiLanguageCodes
;
580 CHAR16
*UnicodeLanguageCodes
;
582 Private
= EFI_HII_THUNK_PRIVATE_DATA_FROM_THIS(This
);
586 UefiHiiHandle
= FrameworkHiiHandleToUefiHiiHandle (Private
, Handle
);
587 if (UefiHiiHandle
== NULL
) {
588 return EFI_INVALID_PARAMETER
;
591 AsciiPrimaryLanguage
= AllocateZeroPool (StrLen (PrimaryLanguage
) + 1);
593 UnicodeStrToAsciiStr (PrimaryLanguage
, AsciiPrimaryLanguage
);
595 AsciiLanguageCodes
= HiiLibGetSupportedSecondaryLanguages (UefiHiiHandle
, AsciiPrimaryLanguage
);
597 if (AsciiLanguageCodes
== NULL
) {
598 return EFI_INVALID_PARAMETER
;
601 UnicodeLanguageCodes
= AllocateZeroPool (AsciiStrSize (AsciiLanguageCodes
) * sizeof (CHAR16
));
602 if (UnicodeLanguageCodes
== NULL
) {
603 return EFI_OUT_OF_RESOURCES
;
607 // The language returned is in RFC 3066 format.
609 *LanguageString
= AsciiStrToUnicodeStr (AsciiLanguageCodes
, UnicodeLanguageCodes
);