]> git.proxmox.com Git - mirror_edk2.git/blame - EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/HiiDatabase.c
Updated EFI_FVB_ATTRIBUTES to EFI_FVB_ATTRIBUTES_2.
[mirror_edk2.git] / EdkCompatibilityPkg / Compatibility / FrameworkHiiToUefiHiiThunk / HiiDatabase.c
CommitLineData
4259256b 1/**@file\r
ee3428bb 2Framework to UEFI 2.1 HII Thunk. The driver consume UEFI HII protocols\r
3to produce a Framework HII protocol.\r
4259256b 4\r
ee3428bb 5Copyright (c) 2008, Intel Corporation\r
4259256b 6All rights reserved. This program and the accompanying materials\r
7are licensed and made available under the terms and conditions of the BSD License\r
8which accompanies this distribution. The full text of the license may be found at\r
9http://opensource.org/licenses/bsd-license.php\r
10\r
11THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
12WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13\r
14**/\r
15\r
16#include "HiiDatabase.h"\r
d4775f2a 17#include "HiiHandle.h"\r
4259256b 18\r
0368663f 19HII_THUNK_PRIVATE_DATA *mHiiThunkPrivateData;\r
20\r
21HII_THUNK_PRIVATE_DATA mHiiThunkPrivateDataTempate = {\r
22 HII_THUNK_PRIVATE_DATA_SIGNATURE,\r
23 (EFI_HANDLE) NULL,\r
24 {\r
4259256b 25 HiiNewPack,\r
26 HiiRemovePack,\r
27 HiiFindHandles,\r
28 HiiExportDatabase,\r
29 \r
30 HiiTestString,\r
31 HiiGetGlyph,\r
32 HiiGlyphToBlt,\r
33 \r
34 HiiNewString,\r
35 HiiGetPrimaryLanguages,\r
36 HiiGetSecondaryLanguages,\r
37 HiiGetString,\r
38 HiiResetStrings,\r
39 HiiGetLine,\r
40 HiiGetForms,\r
41 HiiGetDefaultImage,\r
42 HiiUpdateForm,\r
43 \r
44 HiiGetKeyboardLayout\r
45 },\r
0368663f 46\r
4259256b 47 {\r
a3318eaf 48 ///\r
49 /// HiiHandleLinkList\r
50 ///\r
51 NULL, NULL \r
4259256b 52 },\r
53};\r
54\r
137c54ac 55EFI_FORMBROWSER_THUNK_PRIVATE_DATA mBrowserThunkPrivateDataTemplate = {\r
56 EFI_FORMBROWSER_THUNK_PRIVATE_DATA_SIGNATURE,\r
57 (EFI_HANDLE) NULL,\r
0368663f 58 (HII_THUNK_PRIVATE_DATA *) NULL,\r
137c54ac 59 {\r
60 ThunkSendForm,\r
61 ThunkCreatePopUp\r
62 }\r
63};\r
64\r
65\r
59336178 66CONST EFI_HII_DATABASE_PROTOCOL *mHiiDatabase;\r
59336178 67CONST EFI_HII_IMAGE_PROTOCOL *mHiiImageProtocol;\r
68CONST EFI_HII_STRING_PROTOCOL *mHiiStringProtocol;\r
133a9dfb 69CONST EFI_HII_FONT_PROTOCOL *mHiiFontProtocol;\r
59336178 70CONST EFI_HII_CONFIG_ROUTING_PROTOCOL *mHiiConfigRoutingProtocol;\r
0368663f 71CONST EFI_FORM_BROWSER2_PROTOCOL *mFormBrowser2Protocol;\r
ebbd2793 72\r
ea58467b 73\r
ea58467b 74\r
ea58467b 75\r
63dd6a96 76\r
4259256b 77\r
78EFI_STATUS\r
79EFIAPI\r
80InitializeHiiDatabase (\r
81 IN EFI_HANDLE ImageHandle,\r
82 IN EFI_SYSTEM_TABLE *SystemTable\r
83 )\r
84/*++\r
85\r
86Routine Description:\r
87 Initialize HII Database\r
88\r
89Arguments:\r
90 (Standard EFI Image entry - EFI_IMAGE_ENTRY_POINT)\r
91\r
92Returns:\r
93 EFI_SUCCESS - Setup loaded.\r
94 other - Setup Error\r
95\r
96--*/\r
97{\r
0368663f 98 HII_THUNK_PRIVATE_DATA *Private;\r
99 EFI_HANDLE Handle;\r
100 EFI_STATUS Status;\r
101 UINTN BufferLength;\r
102 EFI_HII_HANDLE *Buffer;\r
103 UINTN Index;\r
d4775f2a 104 HII_THUNK_CONTEXT *ThunkContext;\r
0368663f 105 \r
4259256b 106\r
107 ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiHiiProtocolGuid);\r
108\r
0368663f 109 Private = AllocateCopyPool (sizeof (HII_THUNK_PRIVATE_DATA), &mHiiThunkPrivateDataTempate);\r
110 ASSERT (Private != NULL);\r
111 InitializeListHead (&Private->ThunkContextListHead);\r
4259256b 112\r
d4775f2a 113 InitHiiHandleDatabase ();\r
114\r
0368663f 115 mHiiThunkPrivateData = Private;\r
ea58467b 116\r
4259256b 117 Status = gBS->LocateProtocol (\r
118 &gEfiHiiDatabaseProtocolGuid,\r
119 NULL,\r
59336178 120 (VOID **) &mHiiDatabase\r
4259256b 121 );\r
122 ASSERT_EFI_ERROR (Status);\r
123\r
124 Status = gBS->LocateProtocol (\r
0368663f 125 &gEfiHiiStringProtocolGuid,\r
4259256b 126 NULL,\r
0368663f 127 (VOID **) &mHiiStringProtocol\r
4259256b 128 );\r
129 ASSERT_EFI_ERROR (Status);\r
130\r
133a9dfb 131 Status = gBS->LocateProtocol (\r
132 &gEfiHiiFontProtocolGuid,\r
133 NULL,\r
134 (VOID **) &mHiiFontProtocol\r
135 );\r
136 ASSERT_EFI_ERROR (Status);\r
137\r
4259256b 138 Status = gBS->LocateProtocol (\r
0368663f 139 &gEfiHiiConfigRoutingProtocolGuid,\r
4259256b 140 NULL,\r
0368663f 141 (VOID **) &mHiiConfigRoutingProtocol\r
4259256b 142 );\r
143 ASSERT_EFI_ERROR (Status);\r
144\r
4259256b 145\r
ebbd2793 146 Status = gBS->LocateProtocol (\r
0368663f 147 &gEfiFormBrowser2ProtocolGuid,\r
ebbd2793 148 NULL,\r
0368663f 149 (VOID **) &mFormBrowser2Protocol\r
ebbd2793 150 );\r
151 ASSERT_EFI_ERROR (Status);\r
152\r
0368663f 153\r
154 \r
155\r
4259256b 156 //\r
157 // Install protocol interface\r
158 //\r
4259256b 159 Status = gBS->InstallProtocolInterface (\r
0368663f 160 &Private->Handle,\r
4259256b 161 &gEfiHiiProtocolGuid,\r
162 EFI_NATIVE_INTERFACE,\r
0368663f 163 (VOID *) &Private->Hii\r
4259256b 164 );\r
165 ASSERT_EFI_ERROR (Status);\r
166\r
0368663f 167 Status = HiiLibListPackageLists (EFI_HII_PACKAGE_STRINGS, NULL, &BufferLength, &Buffer);\r
168 if (Status == EFI_SUCCESS) {\r
169 for (Index = 0; Index < BufferLength / sizeof (EFI_HII_HANDLE); Index++) {\r
d4775f2a 170 ThunkContext = CreateThunkContextForUefiHiiHandle (Buffer[Index]);\r
171 ASSERT (ThunkContext!= NULL);\r
172 \r
173 InsertTailList (&Private->ThunkContextListHead, &ThunkContext->Link);\r
0368663f 174 }\r
175\r
176 FreePool (Buffer);\r
177 }\r
ea58467b 178\r
179 Status = mHiiDatabase->RegisterPackageNotify (\r
180 mHiiDatabase,\r
181 EFI_HII_PACKAGE_STRINGS,\r
182 NULL,\r
0368663f 183 NewOrAddPackNotify,\r
ea58467b 184 EFI_HII_DATABASE_NOTIFY_NEW_PACK,\r
0368663f 185 &Handle\r
ea58467b 186 );\r
187 ASSERT_EFI_ERROR (Status);\r
188\r
189 Status = mHiiDatabase->RegisterPackageNotify (\r
190 mHiiDatabase,\r
191 EFI_HII_PACKAGE_STRINGS,\r
192 NULL,\r
0368663f 193 NewOrAddPackNotify,\r
194 EFI_HII_DATABASE_NOTIFY_ADD_PACK,\r
195 &Handle\r
196 );\r
197 ASSERT_EFI_ERROR (Status);\r
198\r
199 Status = mHiiDatabase->RegisterPackageNotify (\r
200 mHiiDatabase,\r
201 EFI_HII_PACKAGE_FORM,\r
202 NULL,\r
203 NewOrAddPackNotify,\r
204 EFI_HII_DATABASE_NOTIFY_NEW_PACK,\r
205 &Handle\r
206 );\r
207 ASSERT_EFI_ERROR (Status);\r
208\r
209 Status = mHiiDatabase->RegisterPackageNotify (\r
210 mHiiDatabase,\r
211 EFI_HII_PACKAGE_FORM,\r
212 NULL,\r
213 NewOrAddPackNotify,\r
ea58467b 214 EFI_HII_DATABASE_NOTIFY_ADD_PACK,\r
0368663f 215 &Handle\r
ea58467b 216 );\r
217 ASSERT_EFI_ERROR (Status);\r
218\r
219 Status = mHiiDatabase->RegisterPackageNotify (\r
220 mHiiDatabase,\r
221 EFI_HII_PACKAGE_STRINGS,\r
222 NULL,\r
223 RemovePackNotify,\r
224 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK,\r
0368663f 225 &Handle\r
ea58467b 226 );\r
227 ASSERT_EFI_ERROR (Status);\r
228\r
0368663f 229 mBrowserThunkPrivateDataTemplate.ThunkPrivate = Private;\r
137c54ac 230 Status = gBS->InstallProtocolInterface (\r
231 &mBrowserThunkPrivateDataTemplate.Handle,\r
232 &gEfiFormBrowserProtocolGuid,\r
233 EFI_NATIVE_INTERFACE,\r
234 (VOID *) &mBrowserThunkPrivateDataTemplate.FormBrowser\r
235 );\r
236 ASSERT_EFI_ERROR (Status);\r
237 \r
4259256b 238 return Status;\r
239}\r
240\r
241EFI_STATUS\r
242EFIAPI\r
243HiiFindHandles (\r
244 IN EFI_HII_PROTOCOL *This,\r
245 IN OUT UINT16 *HandleBufferLength,\r
246 OUT FRAMEWORK_EFI_HII_HANDLE Handle[1]\r
247 )\r
248/*++\r
249\r
250Routine Description:\r
251 Determines the handles that are currently active in the database.\r
252\r
253Arguments:\r
254\r
255Returns:\r
256\r
257--*/\r
258{\r
ea58467b 259 UINT16 Count;\r
0368663f 260 LIST_ENTRY *Link;\r
261 HII_THUNK_CONTEXT *ThunkContext;\r
262 HII_THUNK_PRIVATE_DATA *Private;\r
ea58467b 263\r
264 if (HandleBufferLength == NULL) {\r
265 return EFI_INVALID_PARAMETER;\r
266 }\r
267\r
0368663f 268 Private = HII_THUNK_PRIVATE_DATA_FROM_THIS(This); \r
ea58467b 269\r
0368663f 270 //\r
271 // Count the number of handles.\r
272 //\r
ea58467b 273 Count = 0;\r
0368663f 274 Link = GetFirstNode (&Private->ThunkContextListHead);\r
275 while (!IsNull (&Private->ThunkContextListHead, Link)) {\r
ea58467b 276 Count++;\r
0368663f 277 Link = GetNextNode (&Private->ThunkContextListHead, Link);\r
ea58467b 278 }\r
279\r
280 if (Count > *HandleBufferLength) {\r
281 *HandleBufferLength = (Count * sizeof (FRAMEWORK_EFI_HII_HANDLE));\r
282 return EFI_BUFFER_TOO_SMALL;\r
283 }\r
284\r
0368663f 285 //\r
286 // Output the handles.\r
287 //\r
ea58467b 288 Count = 0;\r
0368663f 289 Link = GetFirstNode (&Private->ThunkContextListHead);\r
290 while (!IsNull (&Private->ThunkContextListHead, Link)) {\r
291\r
292 ThunkContext = HII_THUNK_CONTEXT_FROM_LINK (Link);\r
293 Handle[Count] = ThunkContext->FwHiiHandle;\r
ea58467b 294\r
ea58467b 295 Count++;\r
0368663f 296 Link = GetNextNode (&Private->ThunkContextListHead, Link);\r
297\r
298 }\r
ea58467b 299\r
300 *HandleBufferLength = (Count * sizeof (FRAMEWORK_EFI_HII_HANDLE));\r
4259256b 301 return EFI_SUCCESS;\r
302}\r
303\r
0368663f 304EFI_STATUS\r
305LangCodes3066To639 (\r
306 IN CHAR8 *LangCodes3066,\r
307 IN CHAR8 **LangCodes639\r
308 )\r
309{\r
310 CHAR8 *AsciiLangCodes;\r
311 CHAR8 Lang[RFC_3066_ENTRY_SIZE];\r
312 UINTN Index;\r
313 UINTN Count;\r
314 EFI_STATUS Status;\r
315\r
316 ASSERT (LangCodes3066 != NULL);\r
317 ASSERT (LangCodes639 != NULL);\r
318 \r
319 //\r
320 // Count the number of RFC 3066 language codes.\r
321 //\r
322 Index = 0;\r
323 AsciiLangCodes = LangCodes3066;\r
324 while (AsciiStrLen (AsciiLangCodes) != 0) {\r
325 HiiLibGetNextLanguage (&AsciiLangCodes, Lang);\r
326 Index++;\r
327 }\r
328\r
329 Count = Index;\r
330\r
331 //\r
332 // \r
333 //\r
334 *LangCodes639 = AllocateZeroPool (ISO_639_2_ENTRY_SIZE * Count + 1);\r
335 if (*LangCodes639 == NULL) {\r
336 return EFI_OUT_OF_RESOURCES;\r
337 }\r
338\r
339 AsciiLangCodes = LangCodes3066;\r
340\r
341 for (Index = 0; Index < Count; Index++) {\r
342 HiiLibGetNextLanguage (&AsciiLangCodes, Lang);\r
343 Status = ConvertRfc3066LanguageToIso639Language (Lang, *LangCodes639 + Index * ISO_639_2_ENTRY_SIZE);\r
344 ASSERT_EFI_ERROR (Status);\r
345 }\r
346\r
347 return EFI_SUCCESS;\r
348}\r
349\r
4259256b 350EFI_STATUS\r
351EFIAPI\r
352HiiGetPrimaryLanguages (\r
353 IN EFI_HII_PROTOCOL *This,\r
354 IN FRAMEWORK_EFI_HII_HANDLE Handle,\r
355 OUT EFI_STRING *LanguageString\r
356 )\r
357/*++\r
358\r
359Routine Description:\r
360\r
361 This function allows a program to determine what the primary languages that are supported on a given handle.\r
362\r
363Arguments:\r
364\r
365Returns:\r
366\r
367--*/\r
368{\r
0368663f 369 HII_THUNK_PRIVATE_DATA *Private;\r
ee3428bb 370 EFI_HII_HANDLE UefiHiiHandle;\r
0368663f 371 CHAR8 *LangCodes3066;\r
372 CHAR16 *UnicodeLangCodes639;\r
373 CHAR8 *LangCodes639;\r
374 EFI_STATUS Status;\r
ee3428bb 375\r
0368663f 376 Private = HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
ee3428bb 377\r
0368663f 378 UefiHiiHandle = FwHiiHandleToUefiHiiHandle (Private, Handle);\r
ee3428bb 379 if (UefiHiiHandle == NULL) {\r
380 return EFI_INVALID_PARAMETER;\r
381 }\r
382\r
0368663f 383 LangCodes3066 = HiiLibGetSupportedLanguages (UefiHiiHandle);\r
ee3428bb 384\r
0368663f 385 if (LangCodes3066 == NULL) {\r
ee3428bb 386 return EFI_INVALID_PARAMETER;\r
387 }\r
388\r
0368663f 389\r
390 LangCodes639 = NULL;\r
391 Status = LangCodes3066To639 (LangCodes3066, &LangCodes639);\r
392 if (EFI_ERROR (Status)) {\r
393 goto Done;\r
394 }\r
395 \r
396 UnicodeLangCodes639 = AllocateZeroPool (AsciiStrSize (LangCodes639) * sizeof (CHAR16));\r
397 if (UnicodeLangCodes639 == NULL) {\r
398 Status = EFI_OUT_OF_RESOURCES;\r
399 goto Done;\r
ee3428bb 400 }\r
401\r
402 //\r
0368663f 403 // The language returned is in RFC 639-2 format.\r
ee3428bb 404 //\r
0368663f 405 AsciiStrToUnicodeStr (LangCodes639, UnicodeLangCodes639);\r
406 *LanguageString = UnicodeLangCodes639;\r
ee3428bb 407\r
0368663f 408Done:\r
409 FreePool (LangCodes3066);\r
410 SafeFreePool (LangCodes639);\r
411\r
412 return Status;\r
4259256b 413}\r
414\r
0368663f 415\r
416\r
4259256b 417EFI_STATUS\r
418EFIAPI\r
419HiiGetSecondaryLanguages (\r
0368663f 420 IN EFI_HII_PROTOCOL *This,\r
421 IN FRAMEWORK_EFI_HII_HANDLE Handle,\r
422 IN CHAR16 *PrimaryLanguage,\r
423 OUT EFI_STRING *LanguageString\r
4259256b 424 )\r
425/*++\r
426\r
427Routine Description:\r
428\r
429 This function allows a program to determine which secondary languages are supported\r
430 on a given handle for a given primary language.\r
431\r
432 Arguments:\r
433\r
434Returns:\r
435\r
436--*/\r
437{\r
0368663f 438 HII_THUNK_PRIVATE_DATA *Private;\r
ee3428bb 439 EFI_HII_HANDLE UefiHiiHandle;\r
0368663f 440 CHAR8 PrimaryLang3066[RFC_3066_ENTRY_SIZE];\r
441 CHAR8 *PrimaryLang639;\r
442 CHAR8 *SecLangCodes3066;\r
443 CHAR8 *SecLangCodes639;\r
444 CHAR16 *UnicodeSecLangCodes639;\r
445 EFI_STATUS Status;\r
ee3428bb 446\r
0368663f 447 Private = HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
ee3428bb 448\r
0368663f 449 SecLangCodes639 = NULL;\r
450 SecLangCodes3066 = NULL;\r
451 UnicodeSecLangCodes639 = NULL;\r
452\r
453 UefiHiiHandle = FwHiiHandleToUefiHiiHandle (Private, Handle);\r
ee3428bb 454 if (UefiHiiHandle == NULL) {\r
455 return EFI_INVALID_PARAMETER;\r
456 }\r
457\r
0368663f 458 PrimaryLang639 = AllocateZeroPool (StrLen (PrimaryLanguage) + 1);\r
459 if (PrimaryLang639 == NULL) {\r
460 Status = EFI_OUT_OF_RESOURCES;\r
461 goto Done;\r
462 }\r
ee3428bb 463\r
0368663f 464 UnicodeStrToAsciiStr (PrimaryLanguage, PrimaryLang639);\r
ee3428bb 465\r
0368663f 466 Status = ConvertIso639LanguageToRfc3066Language (PrimaryLang639, PrimaryLang3066);\r
467 ASSERT_EFI_ERROR (Status);\r
ee3428bb 468\r
0368663f 469 SecLangCodes3066 = HiiLibGetSupportedSecondaryLanguages (UefiHiiHandle, PrimaryLang3066);\r
470\r
471 if (SecLangCodes3066 == NULL) {\r
472 Status = EFI_INVALID_PARAMETER;\r
473 goto Done;\r
ee3428bb 474 }\r
475\r
0368663f 476 Status = LangCodes3066To639 (SecLangCodes3066, &SecLangCodes639);\r
477 if (EFI_ERROR (Status)) {\r
478 goto Done;\r
479 }\r
480\r
481 UnicodeSecLangCodes639 = AllocateZeroPool (AsciiStrSize (SecLangCodes639) * sizeof (CHAR16));\r
482 if (UnicodeSecLangCodes639 == NULL) {\r
483 Status = EFI_OUT_OF_RESOURCES;\r
484 goto Done;\r
ee3428bb 485 }\r
486\r
487 //\r
488 // The language returned is in RFC 3066 format.\r
489 //\r
0368663f 490 *LanguageString = AsciiStrToUnicodeStr (SecLangCodes639, UnicodeSecLangCodes639);\r
ee3428bb 491\r
0368663f 492Done:\r
493 \r
494 SafeFreePool (PrimaryLang639);\r
495 SafeFreePool (SecLangCodes639);\r
496 SafeFreePool (SecLangCodes3066);\r
497 SafeFreePool (UnicodeSecLangCodes639);\r
498 \r
499 return Status;\r
137c54ac 500}\r
4259256b 501\r
0368663f 502 \r