]> git.proxmox.com Git - mirror_edk2.git/blame - EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/HiiDatabase.c
Bug fixes for FrameworkHiiToUefiHiiThunk;
[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
79CONST EFI_HII_CONFIG_ROUTING_PROTOCOL *mHiiConfigRoutingProtocol;\r
0368663f 80CONST EFI_FORM_BROWSER2_PROTOCOL *mFormBrowser2Protocol;\r
ebbd2793 81\r
ea58467b 82\r
ea58467b 83\r
ea58467b 84\r
63dd6a96 85\r
4259256b 86\r
87EFI_STATUS\r
88EFIAPI\r
89InitializeHiiDatabase (\r
90 IN EFI_HANDLE ImageHandle,\r
91 IN EFI_SYSTEM_TABLE *SystemTable\r
92 )\r
93/*++\r
94\r
95Routine Description:\r
96 Initialize HII Database\r
97\r
98Arguments:\r
99 (Standard EFI Image entry - EFI_IMAGE_ENTRY_POINT)\r
100\r
101Returns:\r
102 EFI_SUCCESS - Setup loaded.\r
103 other - Setup Error\r
104\r
105--*/\r
106{\r
0368663f 107 HII_THUNK_PRIVATE_DATA *Private;\r
108 EFI_HANDLE Handle;\r
109 EFI_STATUS Status;\r
110 UINTN BufferLength;\r
111 EFI_HII_HANDLE *Buffer;\r
112 UINTN Index;\r
113 \r
4259256b 114\r
115 ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiHiiProtocolGuid);\r
116\r
0368663f 117 Private = AllocateCopyPool (sizeof (HII_THUNK_PRIVATE_DATA), &mHiiThunkPrivateDataTempate);\r
118 ASSERT (Private != NULL);\r
119 InitializeListHead (&Private->ThunkContextListHead);\r
4259256b 120\r
0368663f 121 mHiiThunkPrivateData = Private;\r
ea58467b 122\r
4259256b 123 Status = gBS->LocateProtocol (\r
124 &gEfiHiiDatabaseProtocolGuid,\r
125 NULL,\r
59336178 126 (VOID **) &mHiiDatabase\r
4259256b 127 );\r
128 ASSERT_EFI_ERROR (Status);\r
129\r
130 Status = gBS->LocateProtocol (\r
0368663f 131 &gEfiHiiStringProtocolGuid,\r
4259256b 132 NULL,\r
0368663f 133 (VOID **) &mHiiStringProtocol\r
4259256b 134 );\r
135 ASSERT_EFI_ERROR (Status);\r
136\r
137 Status = gBS->LocateProtocol (\r
0368663f 138 &gEfiHiiConfigRoutingProtocolGuid,\r
4259256b 139 NULL,\r
0368663f 140 (VOID **) &mHiiConfigRoutingProtocol\r
4259256b 141 );\r
142 ASSERT_EFI_ERROR (Status);\r
143\r
4259256b 144\r
ebbd2793 145 Status = gBS->LocateProtocol (\r
0368663f 146 &gEfiFormBrowser2ProtocolGuid,\r
ebbd2793 147 NULL,\r
0368663f 148 (VOID **) &mFormBrowser2Protocol\r
ebbd2793 149 );\r
150 ASSERT_EFI_ERROR (Status);\r
151\r
0368663f 152\r
153 \r
154\r
4259256b 155 //\r
156 // Install protocol interface\r
157 //\r
4259256b 158 Status = gBS->InstallProtocolInterface (\r
0368663f 159 &Private->Handle,\r
4259256b 160 &gEfiHiiProtocolGuid,\r
161 EFI_NATIVE_INTERFACE,\r
0368663f 162 (VOID *) &Private->Hii\r
4259256b 163 );\r
164 ASSERT_EFI_ERROR (Status);\r
165\r
0368663f 166 Status = HiiLibListPackageLists (EFI_HII_PACKAGE_STRINGS, NULL, &BufferLength, &Buffer);\r
167 if (Status == EFI_SUCCESS) {\r
168 for (Index = 0; Index < BufferLength / sizeof (EFI_HII_HANDLE); Index++) {\r
169 CreateThunkContextForUefiHiiHandle (Private, Buffer[Index]);\r
170 ASSERT_EFI_ERROR (Status);\r
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