]> git.proxmox.com Git - mirror_edk2.git/blame - EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/HiiDatabase.c
Pcd Tools need .Map file when building a EFI binary for EBC tool chain.
[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
962045a2 107 ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiHiiCompatibilityProtocolGuid);\r
108 ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiFormBrowserCompatibilityProtocolGuid);\r
4259256b 109\r
0368663f 110 Private = AllocateCopyPool (sizeof (HII_THUNK_PRIVATE_DATA), &mHiiThunkPrivateDataTempate);\r
111 ASSERT (Private != NULL);\r
112 InitializeListHead (&Private->ThunkContextListHead);\r
4259256b 113\r
d4775f2a 114 InitHiiHandleDatabase ();\r
115\r
0368663f 116 mHiiThunkPrivateData = Private;\r
ea58467b 117\r
4259256b 118 Status = gBS->LocateProtocol (\r
119 &gEfiHiiDatabaseProtocolGuid,\r
120 NULL,\r
59336178 121 (VOID **) &mHiiDatabase\r
4259256b 122 );\r
123 ASSERT_EFI_ERROR (Status);\r
124\r
125 Status = gBS->LocateProtocol (\r
0368663f 126 &gEfiHiiStringProtocolGuid,\r
4259256b 127 NULL,\r
0368663f 128 (VOID **) &mHiiStringProtocol\r
4259256b 129 );\r
130 ASSERT_EFI_ERROR (Status);\r
131\r
133a9dfb 132 Status = gBS->LocateProtocol (\r
133 &gEfiHiiFontProtocolGuid,\r
134 NULL,\r
135 (VOID **) &mHiiFontProtocol\r
136 );\r
137 ASSERT_EFI_ERROR (Status);\r
138\r
4259256b 139 Status = gBS->LocateProtocol (\r
0368663f 140 &gEfiHiiConfigRoutingProtocolGuid,\r
4259256b 141 NULL,\r
0368663f 142 (VOID **) &mHiiConfigRoutingProtocol\r
4259256b 143 );\r
144 ASSERT_EFI_ERROR (Status);\r
145\r
4259256b 146\r
ebbd2793 147 Status = gBS->LocateProtocol (\r
0368663f 148 &gEfiFormBrowser2ProtocolGuid,\r
ebbd2793 149 NULL,\r
0368663f 150 (VOID **) &mFormBrowser2Protocol\r
ebbd2793 151 );\r
152 ASSERT_EFI_ERROR (Status);\r
153\r
0368663f 154\r
155 \r
156\r
4259256b 157 //\r
158 // Install protocol interface\r
159 //\r
4259256b 160 Status = gBS->InstallProtocolInterface (\r
0368663f 161 &Private->Handle,\r
962045a2 162 &gEfiHiiCompatibilityProtocolGuid,\r
4259256b 163 EFI_NATIVE_INTERFACE,\r
0368663f 164 (VOID *) &Private->Hii\r
4259256b 165 );\r
166 ASSERT_EFI_ERROR (Status);\r
167\r
0368663f 168 Status = HiiLibListPackageLists (EFI_HII_PACKAGE_STRINGS, NULL, &BufferLength, &Buffer);\r
169 if (Status == EFI_SUCCESS) {\r
170 for (Index = 0; Index < BufferLength / sizeof (EFI_HII_HANDLE); Index++) {\r
d4775f2a 171 ThunkContext = CreateThunkContextForUefiHiiHandle (Buffer[Index]);\r
172 ASSERT (ThunkContext!= NULL);\r
173 \r
174 InsertTailList (&Private->ThunkContextListHead, &ThunkContext->Link);\r
0368663f 175 }\r
176\r
177 FreePool (Buffer);\r
178 }\r
ea58467b 179\r
180 Status = mHiiDatabase->RegisterPackageNotify (\r
181 mHiiDatabase,\r
182 EFI_HII_PACKAGE_STRINGS,\r
183 NULL,\r
0368663f 184 NewOrAddPackNotify,\r
ea58467b 185 EFI_HII_DATABASE_NOTIFY_NEW_PACK,\r
0368663f 186 &Handle\r
ea58467b 187 );\r
188 ASSERT_EFI_ERROR (Status);\r
189\r
190 Status = mHiiDatabase->RegisterPackageNotify (\r
191 mHiiDatabase,\r
192 EFI_HII_PACKAGE_STRINGS,\r
193 NULL,\r
0368663f 194 NewOrAddPackNotify,\r
195 EFI_HII_DATABASE_NOTIFY_ADD_PACK,\r
196 &Handle\r
197 );\r
198 ASSERT_EFI_ERROR (Status);\r
199\r
200 Status = mHiiDatabase->RegisterPackageNotify (\r
201 mHiiDatabase,\r
4dd76ade 202 EFI_HII_PACKAGE_FORMS,\r
0368663f 203 NULL,\r
204 NewOrAddPackNotify,\r
205 EFI_HII_DATABASE_NOTIFY_NEW_PACK,\r
206 &Handle\r
207 );\r
208 ASSERT_EFI_ERROR (Status);\r
209\r
210 Status = mHiiDatabase->RegisterPackageNotify (\r
211 mHiiDatabase,\r
4dd76ade 212 EFI_HII_PACKAGE_FORMS,\r
0368663f 213 NULL,\r
214 NewOrAddPackNotify,\r
ea58467b 215 EFI_HII_DATABASE_NOTIFY_ADD_PACK,\r
0368663f 216 &Handle\r
ea58467b 217 );\r
218 ASSERT_EFI_ERROR (Status);\r
219\r
220 Status = mHiiDatabase->RegisterPackageNotify (\r
221 mHiiDatabase,\r
222 EFI_HII_PACKAGE_STRINGS,\r
223 NULL,\r
224 RemovePackNotify,\r
225 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK,\r
0368663f 226 &Handle\r
ea58467b 227 );\r
228 ASSERT_EFI_ERROR (Status);\r
229\r
0368663f 230 mBrowserThunkPrivateDataTemplate.ThunkPrivate = Private;\r
137c54ac 231 Status = gBS->InstallProtocolInterface (\r
232 &mBrowserThunkPrivateDataTemplate.Handle,\r
962045a2 233 &gEfiFormBrowserCompatibilityProtocolGuid,\r
137c54ac 234 EFI_NATIVE_INTERFACE,\r
235 (VOID *) &mBrowserThunkPrivateDataTemplate.FormBrowser\r
236 );\r
237 ASSERT_EFI_ERROR (Status);\r
238 \r
4259256b 239 return Status;\r
240}\r
241\r
242EFI_STATUS\r
243EFIAPI\r
244HiiFindHandles (\r
245 IN EFI_HII_PROTOCOL *This,\r
246 IN OUT UINT16 *HandleBufferLength,\r
247 OUT FRAMEWORK_EFI_HII_HANDLE Handle[1]\r
248 )\r
249/*++\r
250\r
251Routine Description:\r
252 Determines the handles that are currently active in the database.\r
253\r
254Arguments:\r
255\r
256Returns:\r
257\r
258--*/\r
259{\r
ea58467b 260 UINT16 Count;\r
0368663f 261 LIST_ENTRY *Link;\r
262 HII_THUNK_CONTEXT *ThunkContext;\r
263 HII_THUNK_PRIVATE_DATA *Private;\r
ea58467b 264\r
265 if (HandleBufferLength == NULL) {\r
266 return EFI_INVALID_PARAMETER;\r
267 }\r
268\r
0368663f 269 Private = HII_THUNK_PRIVATE_DATA_FROM_THIS(This); \r
ea58467b 270\r
0368663f 271 //\r
272 // Count the number of handles.\r
273 //\r
ea58467b 274 Count = 0;\r
0368663f 275 Link = GetFirstNode (&Private->ThunkContextListHead);\r
276 while (!IsNull (&Private->ThunkContextListHead, Link)) {\r
ea58467b 277 Count++;\r
0368663f 278 Link = GetNextNode (&Private->ThunkContextListHead, Link);\r
ea58467b 279 }\r
280\r
281 if (Count > *HandleBufferLength) {\r
282 *HandleBufferLength = (Count * sizeof (FRAMEWORK_EFI_HII_HANDLE));\r
283 return EFI_BUFFER_TOO_SMALL;\r
284 }\r
285\r
0368663f 286 //\r
287 // Output the handles.\r
288 //\r
ea58467b 289 Count = 0;\r
0368663f 290 Link = GetFirstNode (&Private->ThunkContextListHead);\r
291 while (!IsNull (&Private->ThunkContextListHead, Link)) {\r
292\r
293 ThunkContext = HII_THUNK_CONTEXT_FROM_LINK (Link);\r
294 Handle[Count] = ThunkContext->FwHiiHandle;\r
ea58467b 295\r
ea58467b 296 Count++;\r
0368663f 297 Link = GetNextNode (&Private->ThunkContextListHead, Link);\r
298\r
299 }\r
ea58467b 300\r
301 *HandleBufferLength = (Count * sizeof (FRAMEWORK_EFI_HII_HANDLE));\r
4259256b 302 return EFI_SUCCESS;\r
303}\r
304\r
0368663f 305EFI_STATUS\r
306LangCodes3066To639 (\r
307 IN CHAR8 *LangCodes3066,\r
308 IN CHAR8 **LangCodes639\r
309 )\r
310{\r
311 CHAR8 *AsciiLangCodes;\r
312 CHAR8 Lang[RFC_3066_ENTRY_SIZE];\r
313 UINTN Index;\r
314 UINTN Count;\r
315 EFI_STATUS Status;\r
316\r
317 ASSERT (LangCodes3066 != NULL);\r
318 ASSERT (LangCodes639 != NULL);\r
319 \r
320 //\r
321 // Count the number of RFC 3066 language codes.\r
322 //\r
323 Index = 0;\r
324 AsciiLangCodes = LangCodes3066;\r
325 while (AsciiStrLen (AsciiLangCodes) != 0) {\r
326 HiiLibGetNextLanguage (&AsciiLangCodes, Lang);\r
327 Index++;\r
328 }\r
329\r
330 Count = Index;\r
331\r
332 //\r
333 // \r
334 //\r
335 *LangCodes639 = AllocateZeroPool (ISO_639_2_ENTRY_SIZE * Count + 1);\r
336 if (*LangCodes639 == NULL) {\r
337 return EFI_OUT_OF_RESOURCES;\r
338 }\r
339\r
340 AsciiLangCodes = LangCodes3066;\r
341\r
342 for (Index = 0; Index < Count; Index++) {\r
343 HiiLibGetNextLanguage (&AsciiLangCodes, Lang);\r
344 Status = ConvertRfc3066LanguageToIso639Language (Lang, *LangCodes639 + Index * ISO_639_2_ENTRY_SIZE);\r
345 ASSERT_EFI_ERROR (Status);\r
346 }\r
347\r
348 return EFI_SUCCESS;\r
349}\r
350\r
4259256b 351EFI_STATUS\r
352EFIAPI\r
353HiiGetPrimaryLanguages (\r
354 IN EFI_HII_PROTOCOL *This,\r
355 IN FRAMEWORK_EFI_HII_HANDLE Handle,\r
356 OUT EFI_STRING *LanguageString\r
357 )\r
358/*++\r
359\r
360Routine Description:\r
361\r
362 This function allows a program to determine what the primary languages that are supported on a given handle.\r
363\r
364Arguments:\r
365\r
366Returns:\r
367\r
368--*/\r
369{\r
0368663f 370 HII_THUNK_PRIVATE_DATA *Private;\r
ee3428bb 371 EFI_HII_HANDLE UefiHiiHandle;\r
0368663f 372 CHAR8 *LangCodes3066;\r
373 CHAR16 *UnicodeLangCodes639;\r
374 CHAR8 *LangCodes639;\r
375 EFI_STATUS Status;\r
ee3428bb 376\r
0368663f 377 Private = HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
ee3428bb 378\r
0368663f 379 UefiHiiHandle = FwHiiHandleToUefiHiiHandle (Private, Handle);\r
ee3428bb 380 if (UefiHiiHandle == NULL) {\r
381 return EFI_INVALID_PARAMETER;\r
382 }\r
383\r
0368663f 384 LangCodes3066 = HiiLibGetSupportedLanguages (UefiHiiHandle);\r
ee3428bb 385\r
0368663f 386 if (LangCodes3066 == NULL) {\r
ee3428bb 387 return EFI_INVALID_PARAMETER;\r
388 }\r
389\r
0368663f 390\r
391 LangCodes639 = NULL;\r
392 Status = LangCodes3066To639 (LangCodes3066, &LangCodes639);\r
393 if (EFI_ERROR (Status)) {\r
394 goto Done;\r
395 }\r
396 \r
397 UnicodeLangCodes639 = AllocateZeroPool (AsciiStrSize (LangCodes639) * sizeof (CHAR16));\r
398 if (UnicodeLangCodes639 == NULL) {\r
399 Status = EFI_OUT_OF_RESOURCES;\r
400 goto Done;\r
ee3428bb 401 }\r
402\r
403 //\r
0368663f 404 // The language returned is in RFC 639-2 format.\r
ee3428bb 405 //\r
0368663f 406 AsciiStrToUnicodeStr (LangCodes639, UnicodeLangCodes639);\r
407 *LanguageString = UnicodeLangCodes639;\r
ee3428bb 408\r
0368663f 409Done:\r
410 FreePool (LangCodes3066);\r
7001eaf8 411 if (LangCodes639 != NULL) {\r
412 FreePool (LangCodes639);\r
413 }\r
0368663f 414\r
415 return Status;\r
4259256b 416}\r
417\r
0368663f 418\r
419\r
4259256b 420EFI_STATUS\r
421EFIAPI\r
422HiiGetSecondaryLanguages (\r
0368663f 423 IN EFI_HII_PROTOCOL *This,\r
424 IN FRAMEWORK_EFI_HII_HANDLE Handle,\r
425 IN CHAR16 *PrimaryLanguage,\r
426 OUT EFI_STRING *LanguageString\r
4259256b 427 )\r
428/*++\r
429\r
430Routine Description:\r
431\r
432 This function allows a program to determine which secondary languages are supported\r
433 on a given handle for a given primary language.\r
434\r
435 Arguments:\r
436\r
437Returns:\r
438\r
439--*/\r
440{\r
0368663f 441 HII_THUNK_PRIVATE_DATA *Private;\r
ee3428bb 442 EFI_HII_HANDLE UefiHiiHandle;\r
0368663f 443 CHAR8 PrimaryLang3066[RFC_3066_ENTRY_SIZE];\r
444 CHAR8 *PrimaryLang639;\r
445 CHAR8 *SecLangCodes3066;\r
446 CHAR8 *SecLangCodes639;\r
447 CHAR16 *UnicodeSecLangCodes639;\r
448 EFI_STATUS Status;\r
ee3428bb 449\r
0368663f 450 Private = HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
ee3428bb 451\r
0368663f 452 SecLangCodes639 = NULL;\r
453 SecLangCodes3066 = NULL;\r
454 UnicodeSecLangCodes639 = NULL;\r
455\r
456 UefiHiiHandle = FwHiiHandleToUefiHiiHandle (Private, Handle);\r
ee3428bb 457 if (UefiHiiHandle == NULL) {\r
458 return EFI_INVALID_PARAMETER;\r
459 }\r
460\r
0368663f 461 PrimaryLang639 = AllocateZeroPool (StrLen (PrimaryLanguage) + 1);\r
462 if (PrimaryLang639 == NULL) {\r
463 Status = EFI_OUT_OF_RESOURCES;\r
464 goto Done;\r
465 }\r
ee3428bb 466\r
0368663f 467 UnicodeStrToAsciiStr (PrimaryLanguage, PrimaryLang639);\r
ee3428bb 468\r
0368663f 469 Status = ConvertIso639LanguageToRfc3066Language (PrimaryLang639, PrimaryLang3066);\r
470 ASSERT_EFI_ERROR (Status);\r
ee3428bb 471\r
0368663f 472 SecLangCodes3066 = HiiLibGetSupportedSecondaryLanguages (UefiHiiHandle, PrimaryLang3066);\r
473\r
474 if (SecLangCodes3066 == NULL) {\r
475 Status = EFI_INVALID_PARAMETER;\r
476 goto Done;\r
ee3428bb 477 }\r
478\r
0368663f 479 Status = LangCodes3066To639 (SecLangCodes3066, &SecLangCodes639);\r
480 if (EFI_ERROR (Status)) {\r
481 goto Done;\r
482 }\r
483\r
484 UnicodeSecLangCodes639 = AllocateZeroPool (AsciiStrSize (SecLangCodes639) * sizeof (CHAR16));\r
485 if (UnicodeSecLangCodes639 == NULL) {\r
486 Status = EFI_OUT_OF_RESOURCES;\r
487 goto Done;\r
ee3428bb 488 }\r
489\r
490 //\r
491 // The language returned is in RFC 3066 format.\r
492 //\r
0368663f 493 *LanguageString = AsciiStrToUnicodeStr (SecLangCodes639, UnicodeSecLangCodes639);\r
ee3428bb 494\r
0368663f 495Done:\r
7001eaf8 496 if (PrimaryLang639 != NULL) {\r
497 FreePool (PrimaryLang639);\r
498 }\r
499 if (SecLangCodes639 != NULL) {\r
500 FreePool (SecLangCodes639);\r
501 }\r
502 if (SecLangCodes3066 != NULL) {\r
503 FreePool (SecLangCodes3066);\r
504 }\r
505 if (UnicodeSecLangCodes639 != NULL) {\r
506 FreePool (UnicodeSecLangCodes639);\r
507 }\r
0368663f 508 \r
509 return Status;\r
137c54ac 510}\r
4259256b 511\r
0368663f 512 \r