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 HII_THUNK_PRIVATE_DATA
*mHiiThunkPrivateData
;
20 HII_THUNK_PRIVATE_DATA mHiiThunkPrivateDataTempate
= {
21 HII_THUNK_PRIVATE_DATA_SIGNATURE
,
34 HiiGetPrimaryLanguages
,
35 HiiGetSecondaryLanguages
,
48 //The FRAMEWORK_EFI_HII_HANDLE starts from 1
49 // and increase upwords untill reach the value of StaticPureUefiHiiHandle.
50 // The code will assert to prevent overflow.
51 (FRAMEWORK_EFI_HII_HANDLE
) 1,
54 //StaticPureUefiHiiHandle
55 //The Static FRAMEWORK_EFI_HII_HANDLE starts from 0xFFFF
56 // and decrease downwords untill reach the value of StaticHiiHandle.
57 // The code will assert to prevent overflow.
59 (FRAMEWORK_EFI_HII_HANDLE
) 0xFFFF,
61 NULL
, NULL
//HiiHandleLinkList
65 EFI_FORMBROWSER_THUNK_PRIVATE_DATA mBrowserThunkPrivateDataTemplate
= {
66 EFI_FORMBROWSER_THUNK_PRIVATE_DATA_SIGNATURE
,
68 (HII_THUNK_PRIVATE_DATA
*) NULL
,
76 CONST EFI_HII_DATABASE_PROTOCOL
*mHiiDatabase
;
77 CONST EFI_HII_IMAGE_PROTOCOL
*mHiiImageProtocol
;
78 CONST EFI_HII_STRING_PROTOCOL
*mHiiStringProtocol
;
79 CONST EFI_HII_FONT_PROTOCOL
*mHiiFontProtocol
;
80 CONST EFI_HII_CONFIG_ROUTING_PROTOCOL
*mHiiConfigRoutingProtocol
;
81 CONST EFI_FORM_BROWSER2_PROTOCOL
*mFormBrowser2Protocol
;
90 InitializeHiiDatabase (
91 IN EFI_HANDLE ImageHandle
,
92 IN EFI_SYSTEM_TABLE
*SystemTable
97 Initialize HII Database
100 (Standard EFI Image entry - EFI_IMAGE_ENTRY_POINT)
103 EFI_SUCCESS - Setup loaded.
108 HII_THUNK_PRIVATE_DATA
*Private
;
112 EFI_HII_HANDLE
*Buffer
;
116 ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL
, &gEfiHiiProtocolGuid
);
118 Private
= AllocateCopyPool (sizeof (HII_THUNK_PRIVATE_DATA
), &mHiiThunkPrivateDataTempate
);
119 ASSERT (Private
!= NULL
);
120 InitializeListHead (&Private
->ThunkContextListHead
);
122 mHiiThunkPrivateData
= Private
;
124 Status
= gBS
->LocateProtocol (
125 &gEfiHiiDatabaseProtocolGuid
,
127 (VOID
**) &mHiiDatabase
129 ASSERT_EFI_ERROR (Status
);
131 Status
= gBS
->LocateProtocol (
132 &gEfiHiiStringProtocolGuid
,
134 (VOID
**) &mHiiStringProtocol
136 ASSERT_EFI_ERROR (Status
);
138 Status
= gBS
->LocateProtocol (
139 &gEfiHiiFontProtocolGuid
,
141 (VOID
**) &mHiiFontProtocol
143 ASSERT_EFI_ERROR (Status
);
145 Status
= gBS
->LocateProtocol (
146 &gEfiHiiConfigRoutingProtocolGuid
,
148 (VOID
**) &mHiiConfigRoutingProtocol
150 ASSERT_EFI_ERROR (Status
);
153 Status
= gBS
->LocateProtocol (
154 &gEfiFormBrowser2ProtocolGuid
,
156 (VOID
**) &mFormBrowser2Protocol
158 ASSERT_EFI_ERROR (Status
);
164 // Install protocol interface
166 Status
= gBS
->InstallProtocolInterface (
168 &gEfiHiiProtocolGuid
,
169 EFI_NATIVE_INTERFACE
,
170 (VOID
*) &Private
->Hii
172 ASSERT_EFI_ERROR (Status
);
174 Status
= HiiLibListPackageLists (EFI_HII_PACKAGE_STRINGS
, NULL
, &BufferLength
, &Buffer
);
175 if (Status
== EFI_SUCCESS
) {
176 for (Index
= 0; Index
< BufferLength
/ sizeof (EFI_HII_HANDLE
); Index
++) {
177 CreateThunkContextForUefiHiiHandle (Private
, Buffer
[Index
]);
178 ASSERT_EFI_ERROR (Status
);
184 Status
= mHiiDatabase
->RegisterPackageNotify (
186 EFI_HII_PACKAGE_STRINGS
,
189 EFI_HII_DATABASE_NOTIFY_NEW_PACK
,
192 ASSERT_EFI_ERROR (Status
);
194 Status
= mHiiDatabase
->RegisterPackageNotify (
196 EFI_HII_PACKAGE_STRINGS
,
199 EFI_HII_DATABASE_NOTIFY_ADD_PACK
,
202 ASSERT_EFI_ERROR (Status
);
204 Status
= mHiiDatabase
->RegisterPackageNotify (
206 EFI_HII_PACKAGE_FORM
,
209 EFI_HII_DATABASE_NOTIFY_NEW_PACK
,
212 ASSERT_EFI_ERROR (Status
);
214 Status
= mHiiDatabase
->RegisterPackageNotify (
216 EFI_HII_PACKAGE_FORM
,
219 EFI_HII_DATABASE_NOTIFY_ADD_PACK
,
222 ASSERT_EFI_ERROR (Status
);
224 Status
= mHiiDatabase
->RegisterPackageNotify (
226 EFI_HII_PACKAGE_STRINGS
,
229 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
232 ASSERT_EFI_ERROR (Status
);
234 mBrowserThunkPrivateDataTemplate
.ThunkPrivate
= Private
;
235 Status
= gBS
->InstallProtocolInterface (
236 &mBrowserThunkPrivateDataTemplate
.Handle
,
237 &gEfiFormBrowserProtocolGuid
,
238 EFI_NATIVE_INTERFACE
,
239 (VOID
*) &mBrowserThunkPrivateDataTemplate
.FormBrowser
241 ASSERT_EFI_ERROR (Status
);
249 IN EFI_HII_PROTOCOL
*This
,
250 IN OUT UINT16
*HandleBufferLength
,
251 OUT FRAMEWORK_EFI_HII_HANDLE Handle
[1]
256 Determines the handles that are currently active in the database.
266 HII_THUNK_CONTEXT
*ThunkContext
;
267 HII_THUNK_PRIVATE_DATA
*Private
;
269 if (HandleBufferLength
== NULL
) {
270 return EFI_INVALID_PARAMETER
;
273 Private
= HII_THUNK_PRIVATE_DATA_FROM_THIS(This
);
276 // Count the number of handles.
279 Link
= GetFirstNode (&Private
->ThunkContextListHead
);
280 while (!IsNull (&Private
->ThunkContextListHead
, Link
)) {
282 Link
= GetNextNode (&Private
->ThunkContextListHead
, Link
);
285 if (Count
> *HandleBufferLength
) {
286 *HandleBufferLength
= (Count
* sizeof (FRAMEWORK_EFI_HII_HANDLE
));
287 return EFI_BUFFER_TOO_SMALL
;
291 // Output the handles.
294 Link
= GetFirstNode (&Private
->ThunkContextListHead
);
295 while (!IsNull (&Private
->ThunkContextListHead
, Link
)) {
297 ThunkContext
= HII_THUNK_CONTEXT_FROM_LINK (Link
);
298 Handle
[Count
] = ThunkContext
->FwHiiHandle
;
301 Link
= GetNextNode (&Private
->ThunkContextListHead
, Link
);
305 *HandleBufferLength
= (Count
* sizeof (FRAMEWORK_EFI_HII_HANDLE
));
311 IN CHAR8
*LangCodes3066
,
312 IN CHAR8
**LangCodes639
315 CHAR8
*AsciiLangCodes
;
316 CHAR8 Lang
[RFC_3066_ENTRY_SIZE
];
321 ASSERT (LangCodes3066
!= NULL
);
322 ASSERT (LangCodes639
!= NULL
);
325 // Count the number of RFC 3066 language codes.
328 AsciiLangCodes
= LangCodes3066
;
329 while (AsciiStrLen (AsciiLangCodes
) != 0) {
330 HiiLibGetNextLanguage (&AsciiLangCodes
, Lang
);
339 *LangCodes639
= AllocateZeroPool (ISO_639_2_ENTRY_SIZE
* Count
+ 1);
340 if (*LangCodes639
== NULL
) {
341 return EFI_OUT_OF_RESOURCES
;
344 AsciiLangCodes
= LangCodes3066
;
346 for (Index
= 0; Index
< Count
; Index
++) {
347 HiiLibGetNextLanguage (&AsciiLangCodes
, Lang
);
348 Status
= ConvertRfc3066LanguageToIso639Language (Lang
, *LangCodes639
+ Index
* ISO_639_2_ENTRY_SIZE
);
349 ASSERT_EFI_ERROR (Status
);
357 HiiGetPrimaryLanguages (
358 IN EFI_HII_PROTOCOL
*This
,
359 IN FRAMEWORK_EFI_HII_HANDLE Handle
,
360 OUT EFI_STRING
*LanguageString
366 This function allows a program to determine what the primary languages that are supported on a given handle.
374 HII_THUNK_PRIVATE_DATA
*Private
;
375 EFI_HII_HANDLE UefiHiiHandle
;
376 CHAR8
*LangCodes3066
;
377 CHAR16
*UnicodeLangCodes639
;
381 Private
= HII_THUNK_PRIVATE_DATA_FROM_THIS(This
);
383 UefiHiiHandle
= FwHiiHandleToUefiHiiHandle (Private
, Handle
);
384 if (UefiHiiHandle
== NULL
) {
385 return EFI_INVALID_PARAMETER
;
388 LangCodes3066
= HiiLibGetSupportedLanguages (UefiHiiHandle
);
390 if (LangCodes3066
== NULL
) {
391 return EFI_INVALID_PARAMETER
;
396 Status
= LangCodes3066To639 (LangCodes3066
, &LangCodes639
);
397 if (EFI_ERROR (Status
)) {
401 UnicodeLangCodes639
= AllocateZeroPool (AsciiStrSize (LangCodes639
) * sizeof (CHAR16
));
402 if (UnicodeLangCodes639
== NULL
) {
403 Status
= EFI_OUT_OF_RESOURCES
;
408 // The language returned is in RFC 639-2 format.
410 AsciiStrToUnicodeStr (LangCodes639
, UnicodeLangCodes639
);
411 *LanguageString
= UnicodeLangCodes639
;
414 FreePool (LangCodes3066
);
415 SafeFreePool (LangCodes639
);
424 HiiGetSecondaryLanguages (
425 IN EFI_HII_PROTOCOL
*This
,
426 IN FRAMEWORK_EFI_HII_HANDLE Handle
,
427 IN CHAR16
*PrimaryLanguage
,
428 OUT EFI_STRING
*LanguageString
434 This function allows a program to determine which secondary languages are supported
435 on a given handle for a given primary language.
443 HII_THUNK_PRIVATE_DATA
*Private
;
444 EFI_HII_HANDLE UefiHiiHandle
;
445 CHAR8 PrimaryLang3066
[RFC_3066_ENTRY_SIZE
];
446 CHAR8
*PrimaryLang639
;
447 CHAR8
*SecLangCodes3066
;
448 CHAR8
*SecLangCodes639
;
449 CHAR16
*UnicodeSecLangCodes639
;
452 Private
= HII_THUNK_PRIVATE_DATA_FROM_THIS(This
);
454 SecLangCodes639
= NULL
;
455 SecLangCodes3066
= NULL
;
456 UnicodeSecLangCodes639
= NULL
;
458 UefiHiiHandle
= FwHiiHandleToUefiHiiHandle (Private
, Handle
);
459 if (UefiHiiHandle
== NULL
) {
460 return EFI_INVALID_PARAMETER
;
463 PrimaryLang639
= AllocateZeroPool (StrLen (PrimaryLanguage
) + 1);
464 if (PrimaryLang639
== NULL
) {
465 Status
= EFI_OUT_OF_RESOURCES
;
469 UnicodeStrToAsciiStr (PrimaryLanguage
, PrimaryLang639
);
471 Status
= ConvertIso639LanguageToRfc3066Language (PrimaryLang639
, PrimaryLang3066
);
472 ASSERT_EFI_ERROR (Status
);
474 SecLangCodes3066
= HiiLibGetSupportedSecondaryLanguages (UefiHiiHandle
, PrimaryLang3066
);
476 if (SecLangCodes3066
== NULL
) {
477 Status
= EFI_INVALID_PARAMETER
;
481 Status
= LangCodes3066To639 (SecLangCodes3066
, &SecLangCodes639
);
482 if (EFI_ERROR (Status
)) {
486 UnicodeSecLangCodes639
= AllocateZeroPool (AsciiStrSize (SecLangCodes639
) * sizeof (CHAR16
));
487 if (UnicodeSecLangCodes639
== NULL
) {
488 Status
= EFI_OUT_OF_RESOURCES
;
493 // The language returned is in RFC 3066 format.
495 *LanguageString
= AsciiStrToUnicodeStr (SecLangCodes639
, UnicodeSecLangCodes639
);
499 SafeFreePool (PrimaryLang639
);
500 SafeFreePool (SecLangCodes639
);
501 SafeFreePool (SecLangCodes3066
);
502 SafeFreePool (UnicodeSecLangCodes639
);