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_CONFIG_ROUTING_PROTOCOL
*mHiiConfigRoutingProtocol
;
80 CONST EFI_FORM_BROWSER2_PROTOCOL
*mFormBrowser2Protocol
;
89 InitializeHiiDatabase (
90 IN EFI_HANDLE ImageHandle
,
91 IN EFI_SYSTEM_TABLE
*SystemTable
96 Initialize HII Database
99 (Standard EFI Image entry - EFI_IMAGE_ENTRY_POINT)
102 EFI_SUCCESS - Setup loaded.
107 HII_THUNK_PRIVATE_DATA
*Private
;
111 EFI_HII_HANDLE
*Buffer
;
115 ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL
, &gEfiHiiProtocolGuid
);
117 Private
= AllocateCopyPool (sizeof (HII_THUNK_PRIVATE_DATA
), &mHiiThunkPrivateDataTempate
);
118 ASSERT (Private
!= NULL
);
119 InitializeListHead (&Private
->ThunkContextListHead
);
121 mHiiThunkPrivateData
= Private
;
123 Status
= gBS
->LocateProtocol (
124 &gEfiHiiDatabaseProtocolGuid
,
126 (VOID
**) &mHiiDatabase
128 ASSERT_EFI_ERROR (Status
);
130 Status
= gBS
->LocateProtocol (
131 &gEfiHiiStringProtocolGuid
,
133 (VOID
**) &mHiiStringProtocol
135 ASSERT_EFI_ERROR (Status
);
137 Status
= gBS
->LocateProtocol (
138 &gEfiHiiConfigRoutingProtocolGuid
,
140 (VOID
**) &mHiiConfigRoutingProtocol
142 ASSERT_EFI_ERROR (Status
);
145 Status
= gBS
->LocateProtocol (
146 &gEfiFormBrowser2ProtocolGuid
,
148 (VOID
**) &mFormBrowser2Protocol
150 ASSERT_EFI_ERROR (Status
);
156 // Install protocol interface
158 Status
= gBS
->InstallProtocolInterface (
160 &gEfiHiiProtocolGuid
,
161 EFI_NATIVE_INTERFACE
,
162 (VOID
*) &Private
->Hii
164 ASSERT_EFI_ERROR (Status
);
166 Status
= HiiLibListPackageLists (EFI_HII_PACKAGE_STRINGS
, NULL
, &BufferLength
, &Buffer
);
167 if (Status
== EFI_SUCCESS
) {
168 for (Index
= 0; Index
< BufferLength
/ sizeof (EFI_HII_HANDLE
); Index
++) {
169 CreateThunkContextForUefiHiiHandle (Private
, Buffer
[Index
]);
170 ASSERT_EFI_ERROR (Status
);
176 Status
= mHiiDatabase
->RegisterPackageNotify (
178 EFI_HII_PACKAGE_STRINGS
,
181 EFI_HII_DATABASE_NOTIFY_NEW_PACK
,
184 ASSERT_EFI_ERROR (Status
);
186 Status
= mHiiDatabase
->RegisterPackageNotify (
188 EFI_HII_PACKAGE_STRINGS
,
191 EFI_HII_DATABASE_NOTIFY_ADD_PACK
,
194 ASSERT_EFI_ERROR (Status
);
196 Status
= mHiiDatabase
->RegisterPackageNotify (
198 EFI_HII_PACKAGE_FORM
,
201 EFI_HII_DATABASE_NOTIFY_NEW_PACK
,
204 ASSERT_EFI_ERROR (Status
);
206 Status
= mHiiDatabase
->RegisterPackageNotify (
208 EFI_HII_PACKAGE_FORM
,
211 EFI_HII_DATABASE_NOTIFY_ADD_PACK
,
214 ASSERT_EFI_ERROR (Status
);
216 Status
= mHiiDatabase
->RegisterPackageNotify (
218 EFI_HII_PACKAGE_STRINGS
,
221 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
224 ASSERT_EFI_ERROR (Status
);
226 mBrowserThunkPrivateDataTemplate
.ThunkPrivate
= Private
;
227 Status
= gBS
->InstallProtocolInterface (
228 &mBrowserThunkPrivateDataTemplate
.Handle
,
229 &gEfiFormBrowserProtocolGuid
,
230 EFI_NATIVE_INTERFACE
,
231 (VOID
*) &mBrowserThunkPrivateDataTemplate
.FormBrowser
233 ASSERT_EFI_ERROR (Status
);
241 IN EFI_HII_PROTOCOL
*This
,
242 IN OUT UINT16
*HandleBufferLength
,
243 OUT FRAMEWORK_EFI_HII_HANDLE Handle
[1]
248 Determines the handles that are currently active in the database.
258 HII_THUNK_CONTEXT
*ThunkContext
;
259 HII_THUNK_PRIVATE_DATA
*Private
;
261 if (HandleBufferLength
== NULL
) {
262 return EFI_INVALID_PARAMETER
;
265 Private
= HII_THUNK_PRIVATE_DATA_FROM_THIS(This
);
268 // Count the number of handles.
271 Link
= GetFirstNode (&Private
->ThunkContextListHead
);
272 while (!IsNull (&Private
->ThunkContextListHead
, Link
)) {
274 Link
= GetNextNode (&Private
->ThunkContextListHead
, Link
);
277 if (Count
> *HandleBufferLength
) {
278 *HandleBufferLength
= (Count
* sizeof (FRAMEWORK_EFI_HII_HANDLE
));
279 return EFI_BUFFER_TOO_SMALL
;
283 // Output the handles.
286 Link
= GetFirstNode (&Private
->ThunkContextListHead
);
287 while (!IsNull (&Private
->ThunkContextListHead
, Link
)) {
289 ThunkContext
= HII_THUNK_CONTEXT_FROM_LINK (Link
);
290 Handle
[Count
] = ThunkContext
->FwHiiHandle
;
293 Link
= GetNextNode (&Private
->ThunkContextListHead
, Link
);
297 *HandleBufferLength
= (Count
* sizeof (FRAMEWORK_EFI_HII_HANDLE
));
303 IN CHAR8
*LangCodes3066
,
304 IN CHAR8
**LangCodes639
307 CHAR8
*AsciiLangCodes
;
308 CHAR8 Lang
[RFC_3066_ENTRY_SIZE
];
313 ASSERT (LangCodes3066
!= NULL
);
314 ASSERT (LangCodes639
!= NULL
);
317 // Count the number of RFC 3066 language codes.
320 AsciiLangCodes
= LangCodes3066
;
321 while (AsciiStrLen (AsciiLangCodes
) != 0) {
322 HiiLibGetNextLanguage (&AsciiLangCodes
, Lang
);
331 *LangCodes639
= AllocateZeroPool (ISO_639_2_ENTRY_SIZE
* Count
+ 1);
332 if (*LangCodes639
== NULL
) {
333 return EFI_OUT_OF_RESOURCES
;
336 AsciiLangCodes
= LangCodes3066
;
338 for (Index
= 0; Index
< Count
; Index
++) {
339 HiiLibGetNextLanguage (&AsciiLangCodes
, Lang
);
340 Status
= ConvertRfc3066LanguageToIso639Language (Lang
, *LangCodes639
+ Index
* ISO_639_2_ENTRY_SIZE
);
341 ASSERT_EFI_ERROR (Status
);
349 HiiGetPrimaryLanguages (
350 IN EFI_HII_PROTOCOL
*This
,
351 IN FRAMEWORK_EFI_HII_HANDLE Handle
,
352 OUT EFI_STRING
*LanguageString
358 This function allows a program to determine what the primary languages that are supported on a given handle.
366 HII_THUNK_PRIVATE_DATA
*Private
;
367 EFI_HII_HANDLE UefiHiiHandle
;
368 CHAR8
*LangCodes3066
;
369 CHAR16
*UnicodeLangCodes639
;
373 Private
= HII_THUNK_PRIVATE_DATA_FROM_THIS(This
);
375 UefiHiiHandle
= FwHiiHandleToUefiHiiHandle (Private
, Handle
);
376 if (UefiHiiHandle
== NULL
) {
377 return EFI_INVALID_PARAMETER
;
380 LangCodes3066
= HiiLibGetSupportedLanguages (UefiHiiHandle
);
382 if (LangCodes3066
== NULL
) {
383 return EFI_INVALID_PARAMETER
;
388 Status
= LangCodes3066To639 (LangCodes3066
, &LangCodes639
);
389 if (EFI_ERROR (Status
)) {
393 UnicodeLangCodes639
= AllocateZeroPool (AsciiStrSize (LangCodes639
) * sizeof (CHAR16
));
394 if (UnicodeLangCodes639
== NULL
) {
395 Status
= EFI_OUT_OF_RESOURCES
;
400 // The language returned is in RFC 639-2 format.
402 AsciiStrToUnicodeStr (LangCodes639
, UnicodeLangCodes639
);
403 *LanguageString
= UnicodeLangCodes639
;
406 FreePool (LangCodes3066
);
407 SafeFreePool (LangCodes639
);
416 HiiGetSecondaryLanguages (
417 IN EFI_HII_PROTOCOL
*This
,
418 IN FRAMEWORK_EFI_HII_HANDLE Handle
,
419 IN CHAR16
*PrimaryLanguage
,
420 OUT EFI_STRING
*LanguageString
426 This function allows a program to determine which secondary languages are supported
427 on a given handle for a given primary language.
435 HII_THUNK_PRIVATE_DATA
*Private
;
436 EFI_HII_HANDLE UefiHiiHandle
;
437 CHAR8 PrimaryLang3066
[RFC_3066_ENTRY_SIZE
];
438 CHAR8
*PrimaryLang639
;
439 CHAR8
*SecLangCodes3066
;
440 CHAR8
*SecLangCodes639
;
441 CHAR16
*UnicodeSecLangCodes639
;
444 Private
= HII_THUNK_PRIVATE_DATA_FROM_THIS(This
);
446 SecLangCodes639
= NULL
;
447 SecLangCodes3066
= NULL
;
448 UnicodeSecLangCodes639
= NULL
;
450 UefiHiiHandle
= FwHiiHandleToUefiHiiHandle (Private
, Handle
);
451 if (UefiHiiHandle
== NULL
) {
452 return EFI_INVALID_PARAMETER
;
455 PrimaryLang639
= AllocateZeroPool (StrLen (PrimaryLanguage
) + 1);
456 if (PrimaryLang639
== NULL
) {
457 Status
= EFI_OUT_OF_RESOURCES
;
461 UnicodeStrToAsciiStr (PrimaryLanguage
, PrimaryLang639
);
463 Status
= ConvertIso639LanguageToRfc3066Language (PrimaryLang639
, PrimaryLang3066
);
464 ASSERT_EFI_ERROR (Status
);
466 SecLangCodes3066
= HiiLibGetSupportedSecondaryLanguages (UefiHiiHandle
, PrimaryLang3066
);
468 if (SecLangCodes3066
== NULL
) {
469 Status
= EFI_INVALID_PARAMETER
;
473 Status
= LangCodes3066To639 (SecLangCodes3066
, &SecLangCodes639
);
474 if (EFI_ERROR (Status
)) {
478 UnicodeSecLangCodes639
= AllocateZeroPool (AsciiStrSize (SecLangCodes639
) * sizeof (CHAR16
));
479 if (UnicodeSecLangCodes639
== NULL
) {
480 Status
= EFI_OUT_OF_RESOURCES
;
485 // The language returned is in RFC 3066 format.
487 *LanguageString
= AsciiStrToUnicodeStr (SecLangCodes639
, UnicodeSecLangCodes639
);
491 SafeFreePool (PrimaryLang639
);
492 SafeFreePool (SecLangCodes639
);
493 SafeFreePool (SecLangCodes3066
);
494 SafeFreePool (UnicodeSecLangCodes639
);