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