]> git.proxmox.com Git - mirror_edk2.git/blame - EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/HiiDatabase.c
Remove SafeFreePool from MemoryAllocationLib as this API's name is misleading. Its...
[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
202 EFI_HII_PACKAGE_FORM,\r
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
212 EFI_HII_PACKAGE_FORM,\r
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
411 SafeFreePool (LangCodes639);\r
412\r
413 return Status;\r
4259256b 414}\r
415\r
0368663f 416\r
417\r
4259256b 418EFI_STATUS\r
419EFIAPI\r
420HiiGetSecondaryLanguages (\r
0368663f 421 IN EFI_HII_PROTOCOL *This,\r
422 IN FRAMEWORK_EFI_HII_HANDLE Handle,\r
423 IN CHAR16 *PrimaryLanguage,\r
424 OUT EFI_STRING *LanguageString\r
4259256b 425 )\r
426/*++\r
427\r
428Routine Description:\r
429\r
430 This function allows a program to determine which secondary languages are supported\r
431 on a given handle for a given primary language.\r
432\r
433 Arguments:\r
434\r
435Returns:\r
436\r
437--*/\r
438{\r
0368663f 439 HII_THUNK_PRIVATE_DATA *Private;\r
ee3428bb 440 EFI_HII_HANDLE UefiHiiHandle;\r
0368663f 441 CHAR8 PrimaryLang3066[RFC_3066_ENTRY_SIZE];\r
442 CHAR8 *PrimaryLang639;\r
443 CHAR8 *SecLangCodes3066;\r
444 CHAR8 *SecLangCodes639;\r
445 CHAR16 *UnicodeSecLangCodes639;\r
446 EFI_STATUS Status;\r
ee3428bb 447\r
0368663f 448 Private = HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
ee3428bb 449\r
0368663f 450 SecLangCodes639 = NULL;\r
451 SecLangCodes3066 = NULL;\r
452 UnicodeSecLangCodes639 = NULL;\r
453\r
454 UefiHiiHandle = FwHiiHandleToUefiHiiHandle (Private, Handle);\r
ee3428bb 455 if (UefiHiiHandle == NULL) {\r
456 return EFI_INVALID_PARAMETER;\r
457 }\r
458\r
0368663f 459 PrimaryLang639 = AllocateZeroPool (StrLen (PrimaryLanguage) + 1);\r
460 if (PrimaryLang639 == NULL) {\r
461 Status = EFI_OUT_OF_RESOURCES;\r
462 goto Done;\r
463 }\r
ee3428bb 464\r
0368663f 465 UnicodeStrToAsciiStr (PrimaryLanguage, PrimaryLang639);\r
ee3428bb 466\r
0368663f 467 Status = ConvertIso639LanguageToRfc3066Language (PrimaryLang639, PrimaryLang3066);\r
468 ASSERT_EFI_ERROR (Status);\r
ee3428bb 469\r
0368663f 470 SecLangCodes3066 = HiiLibGetSupportedSecondaryLanguages (UefiHiiHandle, PrimaryLang3066);\r
471\r
472 if (SecLangCodes3066 == NULL) {\r
473 Status = EFI_INVALID_PARAMETER;\r
474 goto Done;\r
ee3428bb 475 }\r
476\r
0368663f 477 Status = LangCodes3066To639 (SecLangCodes3066, &SecLangCodes639);\r
478 if (EFI_ERROR (Status)) {\r
479 goto Done;\r
480 }\r
481\r
482 UnicodeSecLangCodes639 = AllocateZeroPool (AsciiStrSize (SecLangCodes639) * sizeof (CHAR16));\r
483 if (UnicodeSecLangCodes639 == NULL) {\r
484 Status = EFI_OUT_OF_RESOURCES;\r
485 goto Done;\r
ee3428bb 486 }\r
487\r
488 //\r
489 // The language returned is in RFC 3066 format.\r
490 //\r
0368663f 491 *LanguageString = AsciiStrToUnicodeStr (SecLangCodes639, UnicodeSecLangCodes639);\r
ee3428bb 492\r
0368663f 493Done:\r
494 \r
495 SafeFreePool (PrimaryLang639);\r
496 SafeFreePool (SecLangCodes639);\r
497 SafeFreePool (SecLangCodes3066);\r
498 SafeFreePool (UnicodeSecLangCodes639);\r
499 \r
500 return Status;\r
137c54ac 501}\r
4259256b 502\r
0368663f 503 \r