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"
17 #include "HiiHandle.h"
19 HII_THUNK_PRIVATE_DATA
*mHiiThunkPrivateData
;
21 HII_THUNK_PRIVATE_DATA mHiiThunkPrivateDataTempate
= {
22 HII_THUNK_PRIVATE_DATA_SIGNATURE
,
35 HiiGetPrimaryLanguages
,
36 HiiGetSecondaryLanguages
,
55 EFI_FORMBROWSER_THUNK_PRIVATE_DATA mBrowserThunkPrivateDataTemplate
= {
56 EFI_FORMBROWSER_THUNK_PRIVATE_DATA_SIGNATURE
,
58 (HII_THUNK_PRIVATE_DATA
*) NULL
,
66 CONST EFI_HII_DATABASE_PROTOCOL
*mHiiDatabase
;
67 CONST EFI_HII_IMAGE_PROTOCOL
*mHiiImageProtocol
;
68 CONST EFI_HII_STRING_PROTOCOL
*mHiiStringProtocol
;
69 CONST EFI_HII_FONT_PROTOCOL
*mHiiFontProtocol
;
70 CONST EFI_HII_CONFIG_ROUTING_PROTOCOL
*mHiiConfigRoutingProtocol
;
71 CONST EFI_FORM_BROWSER2_PROTOCOL
*mFormBrowser2Protocol
;
80 InitializeHiiDatabase (
81 IN EFI_HANDLE ImageHandle
,
82 IN EFI_SYSTEM_TABLE
*SystemTable
87 Initialize HII Database
90 (Standard EFI Image entry - EFI_IMAGE_ENTRY_POINT)
93 EFI_SUCCESS - Setup loaded.
98 HII_THUNK_PRIVATE_DATA
*Private
;
102 EFI_HII_HANDLE
*Buffer
;
104 HII_THUNK_CONTEXT
*ThunkContext
;
107 ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL
, &gEfiHiiProtocolGuid
);
109 Private
= AllocateCopyPool (sizeof (HII_THUNK_PRIVATE_DATA
), &mHiiThunkPrivateDataTempate
);
110 ASSERT (Private
!= NULL
);
111 InitializeListHead (&Private
->ThunkContextListHead
);
113 InitHiiHandleDatabase ();
115 mHiiThunkPrivateData
= Private
;
117 Status
= gBS
->LocateProtocol (
118 &gEfiHiiDatabaseProtocolGuid
,
120 (VOID
**) &mHiiDatabase
122 ASSERT_EFI_ERROR (Status
);
124 Status
= gBS
->LocateProtocol (
125 &gEfiHiiStringProtocolGuid
,
127 (VOID
**) &mHiiStringProtocol
129 ASSERT_EFI_ERROR (Status
);
131 Status
= gBS
->LocateProtocol (
132 &gEfiHiiFontProtocolGuid
,
134 (VOID
**) &mHiiFontProtocol
136 ASSERT_EFI_ERROR (Status
);
138 Status
= gBS
->LocateProtocol (
139 &gEfiHiiConfigRoutingProtocolGuid
,
141 (VOID
**) &mHiiConfigRoutingProtocol
143 ASSERT_EFI_ERROR (Status
);
146 Status
= gBS
->LocateProtocol (
147 &gEfiFormBrowser2ProtocolGuid
,
149 (VOID
**) &mFormBrowser2Protocol
151 ASSERT_EFI_ERROR (Status
);
157 // Install protocol interface
159 Status
= gBS
->InstallProtocolInterface (
161 &gEfiHiiProtocolGuid
,
162 EFI_NATIVE_INTERFACE
,
163 (VOID
*) &Private
->Hii
165 ASSERT_EFI_ERROR (Status
);
167 Status
= HiiLibListPackageLists (EFI_HII_PACKAGE_STRINGS
, NULL
, &BufferLength
, &Buffer
);
168 if (Status
== EFI_SUCCESS
) {
169 for (Index
= 0; Index
< BufferLength
/ sizeof (EFI_HII_HANDLE
); Index
++) {
170 ThunkContext
= CreateThunkContextForUefiHiiHandle (Buffer
[Index
]);
171 ASSERT (ThunkContext
!= NULL
);
173 InsertTailList (&Private
->ThunkContextListHead
, &ThunkContext
->Link
);
179 Status
= mHiiDatabase
->RegisterPackageNotify (
181 EFI_HII_PACKAGE_STRINGS
,
184 EFI_HII_DATABASE_NOTIFY_NEW_PACK
,
187 ASSERT_EFI_ERROR (Status
);
189 Status
= mHiiDatabase
->RegisterPackageNotify (
191 EFI_HII_PACKAGE_STRINGS
,
194 EFI_HII_DATABASE_NOTIFY_ADD_PACK
,
197 ASSERT_EFI_ERROR (Status
);
199 Status
= mHiiDatabase
->RegisterPackageNotify (
201 EFI_HII_PACKAGE_FORM
,
204 EFI_HII_DATABASE_NOTIFY_NEW_PACK
,
207 ASSERT_EFI_ERROR (Status
);
209 Status
= mHiiDatabase
->RegisterPackageNotify (
211 EFI_HII_PACKAGE_FORM
,
214 EFI_HII_DATABASE_NOTIFY_ADD_PACK
,
217 ASSERT_EFI_ERROR (Status
);
219 Status
= mHiiDatabase
->RegisterPackageNotify (
221 EFI_HII_PACKAGE_STRINGS
,
224 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
227 ASSERT_EFI_ERROR (Status
);
229 mBrowserThunkPrivateDataTemplate
.ThunkPrivate
= Private
;
230 Status
= gBS
->InstallProtocolInterface (
231 &mBrowserThunkPrivateDataTemplate
.Handle
,
232 &gEfiFormBrowserProtocolGuid
,
233 EFI_NATIVE_INTERFACE
,
234 (VOID
*) &mBrowserThunkPrivateDataTemplate
.FormBrowser
236 ASSERT_EFI_ERROR (Status
);
244 IN EFI_HII_PROTOCOL
*This
,
245 IN OUT UINT16
*HandleBufferLength
,
246 OUT FRAMEWORK_EFI_HII_HANDLE Handle
[1]
251 Determines the handles that are currently active in the database.
261 HII_THUNK_CONTEXT
*ThunkContext
;
262 HII_THUNK_PRIVATE_DATA
*Private
;
264 if (HandleBufferLength
== NULL
) {
265 return EFI_INVALID_PARAMETER
;
268 Private
= HII_THUNK_PRIVATE_DATA_FROM_THIS(This
);
271 // Count the number of handles.
274 Link
= GetFirstNode (&Private
->ThunkContextListHead
);
275 while (!IsNull (&Private
->ThunkContextListHead
, Link
)) {
277 Link
= GetNextNode (&Private
->ThunkContextListHead
, Link
);
280 if (Count
> *HandleBufferLength
) {
281 *HandleBufferLength
= (Count
* sizeof (FRAMEWORK_EFI_HII_HANDLE
));
282 return EFI_BUFFER_TOO_SMALL
;
286 // Output the handles.
289 Link
= GetFirstNode (&Private
->ThunkContextListHead
);
290 while (!IsNull (&Private
->ThunkContextListHead
, Link
)) {
292 ThunkContext
= HII_THUNK_CONTEXT_FROM_LINK (Link
);
293 Handle
[Count
] = ThunkContext
->FwHiiHandle
;
296 Link
= GetNextNode (&Private
->ThunkContextListHead
, Link
);
300 *HandleBufferLength
= (Count
* sizeof (FRAMEWORK_EFI_HII_HANDLE
));
306 IN CHAR8
*LangCodes3066
,
307 IN CHAR8
**LangCodes639
310 CHAR8
*AsciiLangCodes
;
311 CHAR8 Lang
[RFC_3066_ENTRY_SIZE
];
316 ASSERT (LangCodes3066
!= NULL
);
317 ASSERT (LangCodes639
!= NULL
);
320 // Count the number of RFC 3066 language codes.
323 AsciiLangCodes
= LangCodes3066
;
324 while (AsciiStrLen (AsciiLangCodes
) != 0) {
325 HiiLibGetNextLanguage (&AsciiLangCodes
, Lang
);
334 *LangCodes639
= AllocateZeroPool (ISO_639_2_ENTRY_SIZE
* Count
+ 1);
335 if (*LangCodes639
== NULL
) {
336 return EFI_OUT_OF_RESOURCES
;
339 AsciiLangCodes
= LangCodes3066
;
341 for (Index
= 0; Index
< Count
; Index
++) {
342 HiiLibGetNextLanguage (&AsciiLangCodes
, Lang
);
343 Status
= ConvertRfc3066LanguageToIso639Language (Lang
, *LangCodes639
+ Index
* ISO_639_2_ENTRY_SIZE
);
344 ASSERT_EFI_ERROR (Status
);
352 HiiGetPrimaryLanguages (
353 IN EFI_HII_PROTOCOL
*This
,
354 IN FRAMEWORK_EFI_HII_HANDLE Handle
,
355 OUT EFI_STRING
*LanguageString
361 This function allows a program to determine what the primary languages that are supported on a given handle.
369 HII_THUNK_PRIVATE_DATA
*Private
;
370 EFI_HII_HANDLE UefiHiiHandle
;
371 CHAR8
*LangCodes3066
;
372 CHAR16
*UnicodeLangCodes639
;
376 Private
= HII_THUNK_PRIVATE_DATA_FROM_THIS(This
);
378 UefiHiiHandle
= FwHiiHandleToUefiHiiHandle (Private
, Handle
);
379 if (UefiHiiHandle
== NULL
) {
380 return EFI_INVALID_PARAMETER
;
383 LangCodes3066
= HiiLibGetSupportedLanguages (UefiHiiHandle
);
385 if (LangCodes3066
== NULL
) {
386 return EFI_INVALID_PARAMETER
;
391 Status
= LangCodes3066To639 (LangCodes3066
, &LangCodes639
);
392 if (EFI_ERROR (Status
)) {
396 UnicodeLangCodes639
= AllocateZeroPool (AsciiStrSize (LangCodes639
) * sizeof (CHAR16
));
397 if (UnicodeLangCodes639
== NULL
) {
398 Status
= EFI_OUT_OF_RESOURCES
;
403 // The language returned is in RFC 639-2 format.
405 AsciiStrToUnicodeStr (LangCodes639
, UnicodeLangCodes639
);
406 *LanguageString
= UnicodeLangCodes639
;
409 FreePool (LangCodes3066
);
410 SafeFreePool (LangCodes639
);
419 HiiGetSecondaryLanguages (
420 IN EFI_HII_PROTOCOL
*This
,
421 IN FRAMEWORK_EFI_HII_HANDLE Handle
,
422 IN CHAR16
*PrimaryLanguage
,
423 OUT EFI_STRING
*LanguageString
429 This function allows a program to determine which secondary languages are supported
430 on a given handle for a given primary language.
438 HII_THUNK_PRIVATE_DATA
*Private
;
439 EFI_HII_HANDLE UefiHiiHandle
;
440 CHAR8 PrimaryLang3066
[RFC_3066_ENTRY_SIZE
];
441 CHAR8
*PrimaryLang639
;
442 CHAR8
*SecLangCodes3066
;
443 CHAR8
*SecLangCodes639
;
444 CHAR16
*UnicodeSecLangCodes639
;
447 Private
= HII_THUNK_PRIVATE_DATA_FROM_THIS(This
);
449 SecLangCodes639
= NULL
;
450 SecLangCodes3066
= NULL
;
451 UnicodeSecLangCodes639
= NULL
;
453 UefiHiiHandle
= FwHiiHandleToUefiHiiHandle (Private
, Handle
);
454 if (UefiHiiHandle
== NULL
) {
455 return EFI_INVALID_PARAMETER
;
458 PrimaryLang639
= AllocateZeroPool (StrLen (PrimaryLanguage
) + 1);
459 if (PrimaryLang639
== NULL
) {
460 Status
= EFI_OUT_OF_RESOURCES
;
464 UnicodeStrToAsciiStr (PrimaryLanguage
, PrimaryLang639
);
466 Status
= ConvertIso639LanguageToRfc3066Language (PrimaryLang639
, PrimaryLang3066
);
467 ASSERT_EFI_ERROR (Status
);
469 SecLangCodes3066
= HiiLibGetSupportedSecondaryLanguages (UefiHiiHandle
, PrimaryLang3066
);
471 if (SecLangCodes3066
== NULL
) {
472 Status
= EFI_INVALID_PARAMETER
;
476 Status
= LangCodes3066To639 (SecLangCodes3066
, &SecLangCodes639
);
477 if (EFI_ERROR (Status
)) {
481 UnicodeSecLangCodes639
= AllocateZeroPool (AsciiStrSize (SecLangCodes639
) * sizeof (CHAR16
));
482 if (UnicodeSecLangCodes639
== NULL
) {
483 Status
= EFI_OUT_OF_RESOURCES
;
488 // The language returned is in RFC 3066 format.
490 *LanguageString
= AsciiStrToUnicodeStr (SecLangCodes639
, UnicodeSecLangCodes639
);
494 SafeFreePool (PrimaryLang639
);
495 SafeFreePool (SecLangCodes639
);
496 SafeFreePool (SecLangCodes3066
);
497 SafeFreePool (UnicodeSecLangCodes639
);