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
)) {
305 // As no package is registered to UEFI HII Database, EFI_SUCCESS is returned.
308 if (Status
== EFI_NOT_FOUND
) {
315 HandleBuffer
= AllocateZeroPool (HandleBufferLength
);
316 Status
= mHiiDatabase
->ListPackageLists (
318 EFI_HII_PACKAGE_TYPE_ALL
,
324 for (Index
= 0; Index
< HandleBufferLength
/ sizeof (EFI_HII_HANDLE
); Index
++) {
325 MapEntry
= UefiHiiHandleToMapDatabaseEntry (Private
, HandleBuffer
[Index
]);
327 // Only register those UEFI HII Handles that are registered using the UEFI HII database interface.
329 if (MapEntry
== NULL
) {
330 Status
= RegisterUefiHiiHandle (Private
, HandleBuffer
[Index
]);
331 ASSERT_EFI_ERROR (Status
);
340 InitializeHiiDatabase (
341 IN EFI_HANDLE ImageHandle
,
342 IN EFI_SYSTEM_TABLE
*SystemTable
347 Initialize HII Database
350 (Standard EFI Image entry - EFI_IMAGE_ENTRY_POINT)
353 EFI_SUCCESS - Setup loaded.
358 EFI_HII_THUNK_PRIVATE_DATA
*HiiData
;
362 ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL
, &gEfiHiiProtocolGuid
);
364 HiiData
= AllocateCopyPool (sizeof (EFI_HII_THUNK_PRIVATE_DATA
), &mHiiThunkPrivateDataTempate
);
365 ASSERT (HiiData
!= NULL
);
366 InitializeListHead (&HiiData
->HiiThunkHandleMappingDBListHead
);
368 mHiiThunkPrivateData
= HiiData
;
370 Status
= gBS
->LocateProtocol (
371 &gEfiHiiDatabaseProtocolGuid
,
373 (VOID
**) &mHiiDatabase
375 ASSERT_EFI_ERROR (Status
);
377 Status
= gBS
->LocateProtocol (
378 &gEfiHiiFontProtocolGuid
,
380 (VOID
**) &mHiiFontProtocol
382 ASSERT_EFI_ERROR (Status
);
384 Status
= gBS
->LocateProtocol (
385 &gEfiHiiImageProtocolGuid
,
387 (VOID
**) &mHiiImageProtocol
389 ASSERT_EFI_ERROR (Status
);
391 Status
= gBS
->LocateProtocol (
392 &gEfiHiiStringProtocolGuid
,
394 (VOID
**) &mHiiStringProtocol
396 ASSERT_EFI_ERROR (Status
);
398 Status
= gBS
->LocateProtocol (
399 &gEfiHiiConfigRoutingProtocolGuid
,
401 (VOID
**) &mHiiConfigRoutingProtocol
403 ASSERT_EFI_ERROR (Status
);
406 // Install protocol interface
409 Status
= gBS
->InstallProtocolInterface (
411 &gEfiHiiProtocolGuid
,
412 EFI_NATIVE_INTERFACE
,
413 (VOID
*) &HiiData
->Hii
415 ASSERT_EFI_ERROR (Status
);
417 Status
= MapUefiHiiHandles (HiiData
);
418 ASSERT_EFI_ERROR (Status
);
420 Status
= mHiiDatabase
->RegisterPackageNotify (
422 EFI_HII_PACKAGE_STRINGS
,
425 EFI_HII_DATABASE_NOTIFY_NEW_PACK
,
426 &HiiData
->NewPackNotifyHandle
428 ASSERT_EFI_ERROR (Status
);
430 Status
= mHiiDatabase
->RegisterPackageNotify (
432 EFI_HII_PACKAGE_STRINGS
,
435 EFI_HII_DATABASE_NOTIFY_ADD_PACK
,
436 &HiiData
->AddPackNotifyHandle
438 ASSERT_EFI_ERROR (Status
);
440 Status
= mHiiDatabase
->RegisterPackageNotify (
442 EFI_HII_PACKAGE_STRINGS
,
445 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
446 &HiiData
->RemovePackNotifyHandle
448 ASSERT_EFI_ERROR (Status
);
456 IN EFI_HII_PROTOCOL
*This
,
457 IN OUT UINT16
*HandleBufferLength
,
458 OUT FRAMEWORK_EFI_HII_HANDLE Handle
[1]
463 Determines the handles that are currently active in the database.
472 LIST_ENTRY
*ListEntry
;
473 HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY
*HandleMapEntry
;
474 EFI_HII_THUNK_PRIVATE_DATA
*Private
;
476 if (HandleBufferLength
== NULL
) {
477 return EFI_INVALID_PARAMETER
;
480 Private
= EFI_HII_THUNK_PRIVATE_DATA_FROM_THIS(This
);
483 for (ListEntry
= Private
->HiiThunkHandleMappingDBListHead
.ForwardLink
;
484 ListEntry
!= &Private
->HiiThunkHandleMappingDBListHead
;
485 ListEntry
= ListEntry
->ForwardLink
490 if (Count
> *HandleBufferLength
) {
491 *HandleBufferLength
= (Count
* sizeof (FRAMEWORK_EFI_HII_HANDLE
));
492 return EFI_BUFFER_TOO_SMALL
;
496 for (ListEntry
= Private
->HiiThunkHandleMappingDBListHead
.ForwardLink
;
497 ListEntry
!= &Private
->HiiThunkHandleMappingDBListHead
;
498 ListEntry
= ListEntry
->ForwardLink
500 HandleMapEntry
= HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY_FROM_LISTENTRY (ListEntry
);
502 Handle
[Count
] = HandleMapEntry
->FrameworkHiiHandle
;
507 *HandleBufferLength
= (Count
* sizeof (FRAMEWORK_EFI_HII_HANDLE
));
513 HiiGetPrimaryLanguages (
514 IN EFI_HII_PROTOCOL
*This
,
515 IN FRAMEWORK_EFI_HII_HANDLE Handle
,
516 OUT EFI_STRING
*LanguageString
522 This function allows a program to determine what the primary languages that are supported on a given handle.
530 EFI_HII_THUNK_PRIVATE_DATA
*Private
;
531 EFI_HII_HANDLE UefiHiiHandle
;
532 CHAR8
*AsciiLanguageCodes
;
533 CHAR16
*UnicodeLanguageCodes
;
535 Private
= EFI_HII_THUNK_PRIVATE_DATA_FROM_THIS(This
);
539 UefiHiiHandle
= FrameworkHiiHandleToUefiHiiHandle (Private
, Handle
);
540 if (UefiHiiHandle
== NULL
) {
541 return EFI_INVALID_PARAMETER
;
544 AsciiLanguageCodes
= HiiLibGetSupportedLanguages (UefiHiiHandle
);
546 if (AsciiLanguageCodes
== NULL
) {
547 return EFI_INVALID_PARAMETER
;
550 UnicodeLanguageCodes
= AllocateZeroPool (AsciiStrSize (AsciiLanguageCodes
) * sizeof (CHAR16
));
551 if (UnicodeLanguageCodes
== NULL
) {
552 return EFI_OUT_OF_RESOURCES
;
556 // The language returned is in RFC 3066 format.
558 *LanguageString
= AsciiStrToUnicodeStr (AsciiLanguageCodes
, UnicodeLanguageCodes
);
565 HiiGetSecondaryLanguages (
566 IN EFI_HII_PROTOCOL
*This
,
567 IN FRAMEWORK_EFI_HII_HANDLE Handle
,
568 IN CHAR16
*PrimaryLanguage
,
569 OUT EFI_STRING
*LanguageString
575 This function allows a program to determine which secondary languages are supported
576 on a given handle for a given primary language.
584 EFI_HII_THUNK_PRIVATE_DATA
*Private
;
585 EFI_HII_HANDLE UefiHiiHandle
;
586 CHAR8
*AsciiPrimaryLanguage
;
587 CHAR8
*AsciiLanguageCodes
;
588 CHAR16
*UnicodeLanguageCodes
;
590 Private
= EFI_HII_THUNK_PRIVATE_DATA_FROM_THIS(This
);
594 UefiHiiHandle
= FrameworkHiiHandleToUefiHiiHandle (Private
, Handle
);
595 if (UefiHiiHandle
== NULL
) {
596 return EFI_INVALID_PARAMETER
;
599 AsciiPrimaryLanguage
= AllocateZeroPool (StrLen (PrimaryLanguage
) + 1);
601 UnicodeStrToAsciiStr (PrimaryLanguage
, AsciiPrimaryLanguage
);
603 AsciiLanguageCodes
= HiiLibGetSupportedSecondaryLanguages (UefiHiiHandle
, AsciiPrimaryLanguage
);
605 if (AsciiLanguageCodes
== NULL
) {
606 return EFI_INVALID_PARAMETER
;
609 UnicodeLanguageCodes
= AllocateZeroPool (AsciiStrSize (AsciiLanguageCodes
) * sizeof (CHAR16
));
610 if (UnicodeLanguageCodes
== NULL
) {
611 return EFI_OUT_OF_RESOURCES
;
615 // The language returned is in RFC 3066 format.
617 *LanguageString
= AsciiStrToUnicodeStr (AsciiLanguageCodes
, UnicodeLanguageCodes
);