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