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
;
140 // We only create a MapEntry if the Uefi Hii Handle is only already registered
141 // by the HII Thunk Layer.
143 if (UefiHiiHandleToMapDatabaseEntry (Private
, Handle
) == NULL
) {
144 Status
= RegisterUefiHiiHandle (Private
, Handle
);
152 IN UINT8 PackageType
,
153 IN CONST EFI_GUID
*PackageGuid
,
154 IN CONST EFI_HII_PACKAGE_HEADER
*Package
,
155 IN EFI_HII_HANDLE Handle
,
156 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
160 EFI_HII_THUNK_PRIVATE_DATA
*Private
;
162 ASSERT (PackageType
== EFI_HII_PACKAGE_STRINGS
);
163 ASSERT (NotifyType
== EFI_HII_DATABASE_NOTIFY_NEW_PACK
);
165 if (mInFrameworkHiiNewPack
) {
169 Status
= EFI_SUCCESS
;
170 Private
= mHiiThunkPrivateData
;
175 if (UefiHiiHandleToMapDatabaseEntry (Private
, Handle
) == NULL
) {
176 Status
= RegisterUefiHiiHandle (Private
, Handle
);
184 IN CONST EFI_HII_PACKAGE_HEADER
*Package
,
185 IN EFI_HII_HANDLE Handle
188 EFI_HII_PACKAGE_LIST_HEADER
*HiiPackageList
;
191 EFI_HII_PACKAGE_HEADER
*PackageHdrPtr
;
192 EFI_HII_PACKAGE_HEADER PackageHeader
;
196 HiiPackageList
= NULL
;
198 Status
= mHiiDatabase
->ExportPackageLists (mHiiDatabase
, Handle
, &BufferSize
, HiiPackageList
);
199 ASSERT (Status
!= EFI_NOT_FOUND
);
201 if (Status
== EFI_BUFFER_TOO_SMALL
) {
202 HiiPackageList
= AllocateZeroPool (BufferSize
);
203 ASSERT (HiiPackageList
!= NULL
);
205 Status
= mHiiDatabase
->ExportPackageLists (mHiiDatabase
, Handle
, &BufferSize
, HiiPackageList
);
209 PackageHdrPtr
= (EFI_HII_PACKAGE_HEADER
*) ((UINT8
*) HiiPackageList
+ sizeof (EFI_HII_PACKAGE_LIST_HEADER
));
210 CopyMem (&PackageHeader
, PackageHdrPtr
, sizeof (EFI_HII_PACKAGE_HEADER
));
212 Status
= EFI_SUCCESS
;
214 while (PackageHeader
.Type
!= EFI_HII_PACKAGE_END
) {
215 switch (PackageHeader
.Type
) {
216 case EFI_HII_PACKAGE_STRINGS
:
217 if (CompareMem (Package
, PackageHdrPtr
, Package
->Length
) != 0) {
218 FreePool (HiiPackageList
);
226 // goto header of next package
228 PackageHdrPtr
= (EFI_HII_PACKAGE_HEADER
*) ((UINT8
*) PackageHdrPtr
+ PackageHeader
.Length
);
229 CopyMem (&PackageHeader
, PackageHdrPtr
, sizeof (EFI_HII_PACKAGE_HEADER
));
232 FreePool (HiiPackageList
);
239 IN UINT8 PackageType
,
240 IN CONST EFI_GUID
*PackageGuid
,
241 IN CONST EFI_HII_PACKAGE_HEADER
*Package
,
242 IN EFI_HII_HANDLE Handle
,
243 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
247 EFI_HII_THUNK_PRIVATE_DATA
*Private
;
248 HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY
* MapEntry
;
250 Status
= EFI_SUCCESS
;
252 ASSERT (PackageType
== EFI_HII_PACKAGE_STRINGS
);
253 ASSERT (NotifyType
== EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
);
255 Private
= mHiiThunkPrivateData
;
257 MapEntry
= UefiHiiHandleToMapDatabaseEntry (Private
, Handle
);
259 if (MapEntry
->FrameworkHiiHandle
> Private
->StaticHiiHandle
) {
261 // This is a PackageList registered using UEFI HII Protocol Instance.
262 // The MapEntry->TagGuid for this type of PackageList is a auto generated GUID
263 // to link StringPack with IfrPack.
264 // RemovePackNotify is only used to remove PackageList when it is removed by
265 // calling mHiiDatabase->RemovePackageList interface.
266 if (IsLastStringPack (Package
, Handle
)) {
267 Status
= UnRegisterUefiHiiHandle (Private
, Handle
);
277 EFI_HII_THUNK_PRIVATE_DATA
*Private
280 UINTN HandleBufferLength
;
281 EFI_HII_HANDLE
*HandleBuffer
;
284 HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY
* MapEntry
;
286 HandleBufferLength
= 0;
288 Status
= mHiiDatabase
->ListPackageLists (
290 EFI_HII_PACKAGE_TYPE_ALL
,
295 if (EFI_ERROR (Status
) && (Status
!= EFI_BUFFER_TOO_SMALL
)) {
299 HandleBuffer
= AllocateZeroPool (HandleBufferLength
);
300 Status
= mHiiDatabase
->ListPackageLists (
302 EFI_HII_PACKAGE_TYPE_ALL
,
308 for (Index
= 0; Index
< HandleBufferLength
/ sizeof (EFI_HII_HANDLE
); Index
++) {
309 MapEntry
= UefiHiiHandleToMapDatabaseEntry (Private
, HandleBuffer
[Index
]);
311 // Only register those UEFI HII Handles that are registered using the UEFI HII database interface.
313 if (MapEntry
== NULL
) {
314 Status
= RegisterUefiHiiHandle (Private
, HandleBuffer
[Index
]);
315 ASSERT_EFI_ERROR (Status
);
324 InitializeHiiDatabase (
325 IN EFI_HANDLE ImageHandle
,
326 IN EFI_SYSTEM_TABLE
*SystemTable
331 Initialize HII Database
334 (Standard EFI Image entry - EFI_IMAGE_ENTRY_POINT)
337 EFI_SUCCESS - Setup loaded.
342 EFI_HII_THUNK_PRIVATE_DATA
*HiiData
;
346 ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL
, &gEfiHiiProtocolGuid
);
348 HiiData
= AllocateCopyPool (sizeof (EFI_HII_THUNK_PRIVATE_DATA
), &mHiiThunkPrivateDataTempate
);
349 ASSERT (HiiData
!= NULL
);
350 InitializeListHead (&HiiData
->HiiThunkHandleMappingDBListHead
);
352 mHiiThunkPrivateData
= HiiData
;
354 Status
= gBS
->LocateProtocol (
355 &gEfiHiiDatabaseProtocolGuid
,
357 (VOID
**) &mHiiDatabase
359 ASSERT_EFI_ERROR (Status
);
361 Status
= gBS
->LocateProtocol (
362 &gEfiHiiFontProtocolGuid
,
364 (VOID
**) &mHiiFontProtocol
366 ASSERT_EFI_ERROR (Status
);
368 Status
= gBS
->LocateProtocol (
369 &gEfiHiiImageProtocolGuid
,
371 (VOID
**) &mHiiImageProtocol
373 ASSERT_EFI_ERROR (Status
);
375 Status
= gBS
->LocateProtocol (
376 &gEfiHiiStringProtocolGuid
,
378 (VOID
**) &mHiiStringProtocol
380 ASSERT_EFI_ERROR (Status
);
382 Status
= gBS
->LocateProtocol (
383 &gEfiHiiConfigRoutingProtocolGuid
,
385 (VOID
**) &mHiiConfigRoutingProtocol
387 ASSERT_EFI_ERROR (Status
);
390 // Install protocol interface
393 Status
= gBS
->InstallProtocolInterface (
395 &gEfiHiiProtocolGuid
,
396 EFI_NATIVE_INTERFACE
,
397 (VOID
*) &HiiData
->Hii
399 ASSERT_EFI_ERROR (Status
);
401 Status
= MapUefiHiiHandles (HiiData
);
402 ASSERT_EFI_ERROR (Status
);
404 Status
= mHiiDatabase
->RegisterPackageNotify (
406 EFI_HII_PACKAGE_STRINGS
,
409 EFI_HII_DATABASE_NOTIFY_NEW_PACK
,
410 &HiiData
->NewPackNotifyHandle
412 ASSERT_EFI_ERROR (Status
);
414 Status
= mHiiDatabase
->RegisterPackageNotify (
416 EFI_HII_PACKAGE_STRINGS
,
419 EFI_HII_DATABASE_NOTIFY_ADD_PACK
,
420 &HiiData
->AddPackNotifyHandle
422 ASSERT_EFI_ERROR (Status
);
424 Status
= mHiiDatabase
->RegisterPackageNotify (
426 EFI_HII_PACKAGE_STRINGS
,
429 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
430 &HiiData
->RemovePackNotifyHandle
432 ASSERT_EFI_ERROR (Status
);
440 IN EFI_HII_PROTOCOL
*This
,
441 IN OUT UINT16
*HandleBufferLength
,
442 OUT FRAMEWORK_EFI_HII_HANDLE Handle
[1]
447 Determines the handles that are currently active in the database.
456 LIST_ENTRY
*ListEntry
;
457 HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY
*HandleMapEntry
;
458 EFI_HII_THUNK_PRIVATE_DATA
*Private
;
460 if (HandleBufferLength
== NULL
) {
461 return EFI_INVALID_PARAMETER
;
464 Private
= EFI_HII_THUNK_PRIVATE_DATA_FROM_THIS(This
);
467 for (ListEntry
= Private
->HiiThunkHandleMappingDBListHead
.ForwardLink
;
468 ListEntry
!= &Private
->HiiThunkHandleMappingDBListHead
;
469 ListEntry
= ListEntry
->ForwardLink
474 if (Count
> *HandleBufferLength
) {
475 *HandleBufferLength
= (Count
* sizeof (FRAMEWORK_EFI_HII_HANDLE
));
476 return EFI_BUFFER_TOO_SMALL
;
480 for (ListEntry
= Private
->HiiThunkHandleMappingDBListHead
.ForwardLink
;
481 ListEntry
!= &Private
->HiiThunkHandleMappingDBListHead
;
482 ListEntry
= ListEntry
->ForwardLink
484 HandleMapEntry
= HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY_FROM_LISTENTRY (ListEntry
);
486 Handle
[Count
] = HandleMapEntry
->FrameworkHiiHandle
;
491 *HandleBufferLength
= (Count
* sizeof (FRAMEWORK_EFI_HII_HANDLE
));
497 HiiGetPrimaryLanguages (
498 IN EFI_HII_PROTOCOL
*This
,
499 IN FRAMEWORK_EFI_HII_HANDLE Handle
,
500 OUT EFI_STRING
*LanguageString
506 This function allows a program to determine what the primary languages that are supported on a given handle.
514 EFI_HII_THUNK_PRIVATE_DATA
*Private
;
515 EFI_HII_HANDLE UefiHiiHandle
;
516 CHAR8
*AsciiLanguageCodes
;
517 CHAR16
*UnicodeLanguageCodes
;
519 Private
= EFI_HII_THUNK_PRIVATE_DATA_FROM_THIS(This
);
523 UefiHiiHandle
= FrameworkHiiHandleToUefiHiiHandle (Private
, Handle
);
524 if (UefiHiiHandle
== NULL
) {
525 return EFI_INVALID_PARAMETER
;
528 AsciiLanguageCodes
= HiiLibGetSupportedLanguages (UefiHiiHandle
);
530 if (AsciiLanguageCodes
== NULL
) {
531 return EFI_INVALID_PARAMETER
;
534 UnicodeLanguageCodes
= AllocateZeroPool (AsciiStrSize (AsciiLanguageCodes
) * sizeof (CHAR16
));
535 if (UnicodeLanguageCodes
== NULL
) {
536 return EFI_OUT_OF_RESOURCES
;
540 // The language returned is in RFC 3066 format.
542 *LanguageString
= AsciiStrToUnicodeStr (AsciiLanguageCodes
, UnicodeLanguageCodes
);
549 HiiGetSecondaryLanguages (
550 IN EFI_HII_PROTOCOL
*This
,
551 IN FRAMEWORK_EFI_HII_HANDLE Handle
,
552 IN CHAR16
*PrimaryLanguage
,
553 OUT EFI_STRING
*LanguageString
559 This function allows a program to determine which secondary languages are supported
560 on a given handle for a given primary language.
568 EFI_HII_THUNK_PRIVATE_DATA
*Private
;
569 EFI_HII_HANDLE UefiHiiHandle
;
570 CHAR8
*AsciiPrimaryLanguage
;
571 CHAR8
*AsciiLanguageCodes
;
572 CHAR16
*UnicodeLanguageCodes
;
574 Private
= EFI_HII_THUNK_PRIVATE_DATA_FROM_THIS(This
);
578 UefiHiiHandle
= FrameworkHiiHandleToUefiHiiHandle (Private
, Handle
);
579 if (UefiHiiHandle
== NULL
) {
580 return EFI_INVALID_PARAMETER
;
583 AsciiPrimaryLanguage
= AllocateZeroPool (StrLen (PrimaryLanguage
) + 1);
585 UnicodeStrToAsciiStr (PrimaryLanguage
, AsciiPrimaryLanguage
);
587 AsciiLanguageCodes
= HiiLibGetSupportedSecondaryLanguages (UefiHiiHandle
, AsciiPrimaryLanguage
);
589 if (AsciiLanguageCodes
== NULL
) {
590 return EFI_INVALID_PARAMETER
;
593 UnicodeLanguageCodes
= AllocateZeroPool (AsciiStrSize (AsciiLanguageCodes
) * sizeof (CHAR16
));
594 if (UnicodeLanguageCodes
== NULL
) {
595 return EFI_OUT_OF_RESOURCES
;
599 // The language returned is in RFC 3066 format.
601 *LanguageString
= AsciiStrToUnicodeStr (AsciiLanguageCodes
, UnicodeLanguageCodes
);