]> git.proxmox.com Git - mirror_edk2.git/blame - EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/HiiDatabase.c
refine code.
[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
ea58467b 18EFI_HII_THUNK_PRIVATE_DATA *mHiiThunkPrivateData;\r
4259256b 19\r
ea58467b 20EFI_HII_THUNK_PRIVATE_DATA mHiiThunkPrivateDataTempate = {\r
d7152a15 21 //Signature\r
22 EFI_HII_THUNK_DRIVER_DATA_SIGNATURE \r
23 ,\r
24 //Handle\r
25 (EFI_HANDLE) NULL\r
26 ,\r
4259256b 27 { //Hii\r
28 HiiNewPack,\r
29 HiiRemovePack,\r
30 HiiFindHandles,\r
31 HiiExportDatabase,\r
32 \r
33 HiiTestString,\r
34 HiiGetGlyph,\r
35 HiiGlyphToBlt,\r
36 \r
37 HiiNewString,\r
38 HiiGetPrimaryLanguages,\r
39 HiiGetSecondaryLanguages,\r
40 HiiGetString,\r
41 HiiResetStrings,\r
42 HiiGetLine,\r
43 HiiGetForms,\r
44 HiiGetDefaultImage,\r
45 HiiUpdateForm,\r
46 \r
47 HiiGetKeyboardLayout\r
48 },\r
d7152a15 49 //StaticHiiHandle\r
50 //The FRAMEWORK_EFI_HII_HANDLE starts from 1 \r
51 // and increase upwords untill reach the value of StaticPureUefiHiiHandle. \r
52 // The code will assert to prevent overflow.\r
53 (FRAMEWORK_EFI_HII_HANDLE) 1 \r
54 ,\r
55 //StaticPureUefiHiiHandle\r
56 //The Static FRAMEWORK_EFI_HII_HANDLE starts from 0xFFFF \r
57 // and decrease downwords untill reach the value of StaticHiiHandle. \r
58 // The code will assert to prevent overflow.\r
59 (FRAMEWORK_EFI_HII_HANDLE) 0xFFFF \r
60 ,\r
4259256b 61 {\r
62 NULL, NULL //HiiHandleLinkList\r
63 },\r
64};\r
65\r
137c54ac 66EFI_FORMBROWSER_THUNK_PRIVATE_DATA mBrowserThunkPrivateDataTemplate = {\r
67 EFI_FORMBROWSER_THUNK_PRIVATE_DATA_SIGNATURE,\r
68 (EFI_HANDLE) NULL,\r
69 {\r
70 ThunkSendForm,\r
71 ThunkCreatePopUp\r
72 }\r
73};\r
74\r
75\r
59336178 76CONST EFI_HII_DATABASE_PROTOCOL *mHiiDatabase;\r
77CONST EFI_HII_FONT_PROTOCOL *mHiiFontProtocol;\r
78CONST EFI_HII_IMAGE_PROTOCOL *mHiiImageProtocol;\r
79CONST EFI_HII_STRING_PROTOCOL *mHiiStringProtocol;\r
80CONST EFI_HII_CONFIG_ROUTING_PROTOCOL *mHiiConfigRoutingProtocol;\r
ebbd2793 81\r
ea58467b 82EFI_STATUS\r
83RegisterUefiHiiHandle (\r
84 EFI_HII_THUNK_PRIVATE_DATA *Private,\r
85 EFI_HII_HANDLE UefiHiiHandle\r
86 )\r
87{\r
88 EFI_STATUS Status;\r
89 EFI_GUID PackageGuid;\r
90 HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *HandleMappingEntry;\r
91\r
92 HandleMappingEntry = AllocateZeroPool (sizeof (*HandleMappingEntry));\r
93 HandleMappingEntry->Signature = HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY_SIGNATURE;\r
94\r
95 Status = AssignPureUefiHiiHandle (Private, &HandleMappingEntry->FrameworkHiiHandle);\r
96 if (EFI_ERROR (Status)) {\r
97 return Status;\r
98 }\r
99 \r
100 HandleMappingEntry->UefiHiiHandle = UefiHiiHandle;\r
101 Status = HiiLibExtractGuidFromHiiHandle (UefiHiiHandle, &PackageGuid);\r
102 ASSERT_EFI_ERROR (Status);\r
103 \r
104 CopyGuid(&HandleMappingEntry->TagGuid, &PackageGuid);\r
105 \r
106 InsertTailList (&Private->HiiThunkHandleMappingDBListHead, &HandleMappingEntry->List);\r
107\r
108 return EFI_SUCCESS;\r
109}\r
110\r
111\r
112EFI_STATUS\r
113UnRegisterUefiHiiHandle (\r
114 EFI_HII_THUNK_PRIVATE_DATA *Private,\r
115 EFI_HII_HANDLE UefiHiiHandle\r
116 )\r
117{\r
118 HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *MapEntry;\r
119\r
120 MapEntry = UefiHiiHandleToMapDatabaseEntry (Private, UefiHiiHandle);\r
121 ASSERT (MapEntry != NULL);\r
122 \r
123 RemoveEntryList (&MapEntry->List);\r
124\r
125 FreePool (MapEntry);\r
126 \r
127 return EFI_SUCCESS;\r
128}\r
129\r
130EFI_STATUS\r
131EFIAPI\r
132AddPackNotify (\r
133 IN UINT8 PackageType,\r
134 IN CONST EFI_GUID *PackageGuid,\r
135 IN CONST EFI_HII_PACKAGE_HEADER *Package,\r
136 IN EFI_HII_HANDLE Handle,\r
137 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType\r
138 )\r
139{\r
140 EFI_STATUS Status;\r
141 EFI_HII_THUNK_PRIVATE_DATA *Private;\r
142\r
143 ASSERT (PackageType == EFI_HII_PACKAGE_STRINGS);\r
144 ASSERT (NotifyType == EFI_HII_DATABASE_NOTIFY_ADD_PACK);\r
145\r
146 Status = EFI_SUCCESS;\r
147 Private = mHiiThunkPrivateData;\r
148\r
63dd6a96 149 if (mInFrameworkHiiNewPack) {\r
150 return EFI_SUCCESS;\r
151 }\r
152\r
ea58467b 153 //\r
154 // We only create a MapEntry if the Uefi Hii Handle is only already registered\r
155 // by the HII Thunk Layer.\r
156 //\r
157 if (UefiHiiHandleToMapDatabaseEntry (Private, Handle) == NULL) {\r
158 Status = RegisterUefiHiiHandle (Private, Handle);\r
159 } \r
160\r
161 return Status; \r
162}\r
163EFI_STATUS\r
164EFIAPI\r
165NewPackNotify (\r
166 IN UINT8 PackageType,\r
167 IN CONST EFI_GUID *PackageGuid,\r
168 IN CONST EFI_HII_PACKAGE_HEADER *Package,\r
169 IN EFI_HII_HANDLE Handle,\r
170 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType\r
171 )\r
172{\r
173 EFI_STATUS Status;\r
174 EFI_HII_THUNK_PRIVATE_DATA *Private;\r
175\r
176 ASSERT (PackageType == EFI_HII_PACKAGE_STRINGS);\r
177 ASSERT (NotifyType == EFI_HII_DATABASE_NOTIFY_NEW_PACK);\r
178\r
179 if (mInFrameworkHiiNewPack) {\r
180 return EFI_SUCCESS;\r
181 }\r
182\r
183 Status = EFI_SUCCESS;\r
184 Private = mHiiThunkPrivateData;\r
185\r
186 //\r
187 // We only\r
188 //\r
189 if (UefiHiiHandleToMapDatabaseEntry (Private, Handle) == NULL) {\r
190 Status = RegisterUefiHiiHandle (Private, Handle);\r
191 } \r
192\r
193 return Status;\r
194}\r
195\r
196BOOLEAN\r
197IsLastStringPack (\r
198 IN CONST EFI_HII_PACKAGE_HEADER *Package,\r
199 IN EFI_HII_HANDLE Handle\r
200 )\r
201{\r
202 EFI_HII_PACKAGE_LIST_HEADER *HiiPackageList;\r
203 UINTN BufferSize;\r
204 EFI_STATUS Status;\r
205 EFI_HII_PACKAGE_HEADER *PackageHdrPtr;\r
206 EFI_HII_PACKAGE_HEADER PackageHeader;\r
207 BOOLEAN Match;\r
208\r
209 Match = FALSE;\r
210 HiiPackageList = NULL;\r
211 BufferSize = 0;\r
212 Status = mHiiDatabase->ExportPackageLists (mHiiDatabase, Handle, &BufferSize, HiiPackageList);\r
213 ASSERT (Status != EFI_NOT_FOUND);\r
214 \r
215 if (Status == EFI_BUFFER_TOO_SMALL) {\r
216 HiiPackageList = AllocateZeroPool (BufferSize);\r
217 ASSERT (HiiPackageList != NULL);\r
218\r
219 Status = mHiiDatabase->ExportPackageLists (mHiiDatabase, Handle, &BufferSize, HiiPackageList);\r
220 }\r
221\r
222 \r
223 PackageHdrPtr = (EFI_HII_PACKAGE_HEADER *) ((UINT8 *) HiiPackageList + sizeof (EFI_HII_PACKAGE_LIST_HEADER));\r
224 CopyMem (&PackageHeader, PackageHdrPtr, sizeof (EFI_HII_PACKAGE_HEADER));\r
225\r
226 Status = EFI_SUCCESS;\r
227\r
228 while (PackageHeader.Type != EFI_HII_PACKAGE_END) {\r
229 switch (PackageHeader.Type) {\r
230 case EFI_HII_PACKAGE_STRINGS:\r
231 if (CompareMem (Package, PackageHdrPtr, Package->Length) != 0) {\r
232 FreePool (HiiPackageList);\r
233 return FALSE;\r
234 }\r
235 break; \r
236 default:\r
237 break;\r
238 }\r
239 //\r
240 // goto header of next package\r
241 //\r
242 PackageHdrPtr = (EFI_HII_PACKAGE_HEADER *) ((UINT8 *) PackageHdrPtr + PackageHeader.Length);\r
243 CopyMem (&PackageHeader, PackageHdrPtr, sizeof (EFI_HII_PACKAGE_HEADER));\r
244 }\r
245\r
246 FreePool (HiiPackageList);\r
247 return TRUE;\r
248}\r
249\r
250EFI_STATUS\r
251EFIAPI\r
252RemovePackNotify (\r
253 IN UINT8 PackageType,\r
254 IN CONST EFI_GUID *PackageGuid,\r
255 IN CONST EFI_HII_PACKAGE_HEADER *Package,\r
256 IN EFI_HII_HANDLE Handle,\r
257 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType\r
258 )\r
259{\r
260 EFI_STATUS Status;\r
261 EFI_HII_THUNK_PRIVATE_DATA *Private;\r
262 HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY * MapEntry;\r
263\r
264 Status = EFI_SUCCESS;\r
265\r
266 ASSERT (PackageType == EFI_HII_PACKAGE_STRINGS);\r
267 ASSERT (NotifyType == EFI_HII_DATABASE_NOTIFY_REMOVE_PACK);\r
268\r
63dd6a96 269 if (mInFrameworkHiiRemovePack) {\r
270 return EFI_SUCCESS;\r
271 }\r
272\r
ea58467b 273 Private = mHiiThunkPrivateData;\r
274\r
275 MapEntry = UefiHiiHandleToMapDatabaseEntry (Private, Handle);\r
276\r
277 if (MapEntry->FrameworkHiiHandle > Private->StaticHiiHandle) {\r
278 //\r
279 // This is a PackageList registered using UEFI HII Protocol Instance.\r
280 // The MapEntry->TagGuid for this type of PackageList is a auto generated GUID\r
281 // to link StringPack with IfrPack.\r
282 // RemovePackNotify is only used to remove PackageList when it is removed by\r
283 // calling mHiiDatabase->RemovePackageList interface.\r
284 if (IsLastStringPack (Package, Handle)) {\r
285 Status = UnRegisterUefiHiiHandle (Private, Handle);\r
286 }\r
287 }\r
288\r
289 return Status;\r
290}\r
291\r
292EFI_STATUS\r
293EFIAPI\r
294MapUefiHiiHandles (\r
295 EFI_HII_THUNK_PRIVATE_DATA *Private\r
296 )\r
297{\r
298 UINTN HandleBufferLength;\r
299 EFI_HII_HANDLE *HandleBuffer;\r
300 EFI_STATUS Status;\r
301 UINTN Index;\r
302 HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY * MapEntry;\r
303\r
304 HandleBufferLength = 0;\r
305 HandleBuffer = NULL;\r
306 Status = mHiiDatabase->ListPackageLists (\r
307 mHiiDatabase,\r
308 EFI_HII_PACKAGE_TYPE_ALL,\r
309 NULL,\r
310 &HandleBufferLength,\r
311 HandleBuffer\r
312 );\r
313 if (EFI_ERROR (Status) && (Status != EFI_BUFFER_TOO_SMALL)) {\r
57cbd269 314 //\r
315 // As no package is registered to UEFI HII Database, EFI_SUCCESS is returned.\r
316 // \r
317 //\r
318 if (Status == EFI_NOT_FOUND) {\r
319 return EFI_SUCCESS;\r
320 } else {\r
321 return Status;\r
322 }\r
ea58467b 323 }\r
324\r
325 HandleBuffer = AllocateZeroPool (HandleBufferLength);\r
326 Status = mHiiDatabase->ListPackageLists (\r
327 mHiiDatabase,\r
328 EFI_HII_PACKAGE_TYPE_ALL,\r
329 NULL,\r
330 &HandleBufferLength,\r
331 HandleBuffer\r
332 );\r
333\r
334 for (Index = 0; Index < HandleBufferLength / sizeof (EFI_HII_HANDLE); Index++) {\r
335 MapEntry = UefiHiiHandleToMapDatabaseEntry (Private, HandleBuffer[Index]);\r
336 //\r
337 // Only register those UEFI HII Handles that are registered using the UEFI HII database interface.\r
338 //\r
339 if (MapEntry == NULL) {\r
340 Status = RegisterUefiHiiHandle (Private, HandleBuffer[Index]);\r
341 ASSERT_EFI_ERROR (Status);\r
342 }\r
343 }\r
344\r
345 return EFI_SUCCESS; \r
346}\r
4259256b 347\r
348EFI_STATUS\r
349EFIAPI\r
350InitializeHiiDatabase (\r
351 IN EFI_HANDLE ImageHandle,\r
352 IN EFI_SYSTEM_TABLE *SystemTable\r
353 )\r
354/*++\r
355\r
356Routine Description:\r
357 Initialize HII Database\r
358\r
359Arguments:\r
360 (Standard EFI Image entry - EFI_IMAGE_ENTRY_POINT)\r
361\r
362Returns:\r
363 EFI_SUCCESS - Setup loaded.\r
364 other - Setup Error\r
365\r
366--*/\r
367{\r
368 EFI_HII_THUNK_PRIVATE_DATA *HiiData;\r
369 EFI_HANDLE Handle;\r
370 EFI_STATUS Status;\r
371\r
372 ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiHiiProtocolGuid);\r
373\r
ea58467b 374 HiiData = AllocateCopyPool (sizeof (EFI_HII_THUNK_PRIVATE_DATA), &mHiiThunkPrivateDataTempate);\r
4259256b 375 ASSERT (HiiData != NULL);\r
376 InitializeListHead (&HiiData->HiiThunkHandleMappingDBListHead);\r
377\r
ea58467b 378 mHiiThunkPrivateData = HiiData;\r
379\r
4259256b 380 Status = gBS->LocateProtocol (\r
381 &gEfiHiiDatabaseProtocolGuid,\r
382 NULL,\r
59336178 383 (VOID **) &mHiiDatabase\r
4259256b 384 );\r
385 ASSERT_EFI_ERROR (Status);\r
386\r
387 Status = gBS->LocateProtocol (\r
388 &gEfiHiiFontProtocolGuid,\r
389 NULL,\r
59336178 390 (VOID **) &mHiiFontProtocol\r
4259256b 391 );\r
392 ASSERT_EFI_ERROR (Status);\r
393\r
394 Status = gBS->LocateProtocol (\r
395 &gEfiHiiImageProtocolGuid,\r
396 NULL,\r
59336178 397 (VOID **) &mHiiImageProtocol\r
4259256b 398 );\r
399 ASSERT_EFI_ERROR (Status);\r
400\r
401 Status = gBS->LocateProtocol (\r
402 &gEfiHiiStringProtocolGuid,\r
403 NULL,\r
59336178 404 (VOID **) &mHiiStringProtocol\r
4259256b 405 );\r
406 ASSERT_EFI_ERROR (Status);\r
407\r
ebbd2793 408 Status = gBS->LocateProtocol (\r
409 &gEfiHiiConfigRoutingProtocolGuid,\r
410 NULL,\r
59336178 411 (VOID **) &mHiiConfigRoutingProtocol\r
ebbd2793 412 );\r
413 ASSERT_EFI_ERROR (Status);\r
414\r
4259256b 415 //\r
416 // Install protocol interface\r
417 //\r
418 Handle = NULL;\r
419 Status = gBS->InstallProtocolInterface (\r
420 &HiiData->Handle,\r
421 &gEfiHiiProtocolGuid,\r
422 EFI_NATIVE_INTERFACE,\r
423 (VOID *) &HiiData->Hii\r
424 );\r
425 ASSERT_EFI_ERROR (Status);\r
426\r
ea58467b 427 Status = MapUefiHiiHandles (HiiData);\r
428 ASSERT_EFI_ERROR (Status);\r
429\r
430 Status = mHiiDatabase->RegisterPackageNotify (\r
431 mHiiDatabase,\r
432 EFI_HII_PACKAGE_STRINGS,\r
433 NULL,\r
434 NewPackNotify,\r
435 EFI_HII_DATABASE_NOTIFY_NEW_PACK,\r
436 &HiiData->NewPackNotifyHandle\r
437 );\r
438 ASSERT_EFI_ERROR (Status);\r
439\r
440 Status = mHiiDatabase->RegisterPackageNotify (\r
441 mHiiDatabase,\r
442 EFI_HII_PACKAGE_STRINGS,\r
443 NULL,\r
444 AddPackNotify,\r
445 EFI_HII_DATABASE_NOTIFY_ADD_PACK,\r
446 &HiiData->AddPackNotifyHandle\r
447 );\r
448 ASSERT_EFI_ERROR (Status);\r
449\r
450 Status = mHiiDatabase->RegisterPackageNotify (\r
451 mHiiDatabase,\r
452 EFI_HII_PACKAGE_STRINGS,\r
453 NULL,\r
454 RemovePackNotify,\r
455 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK,\r
456 &HiiData->RemovePackNotifyHandle\r
457 );\r
458 ASSERT_EFI_ERROR (Status);\r
459\r
137c54ac 460 Status = gBS->InstallProtocolInterface (\r
461 &mBrowserThunkPrivateDataTemplate.Handle,\r
462 &gEfiFormBrowserProtocolGuid,\r
463 EFI_NATIVE_INTERFACE,\r
464 (VOID *) &mBrowserThunkPrivateDataTemplate.FormBrowser\r
465 );\r
466 ASSERT_EFI_ERROR (Status);\r
467 \r
4259256b 468 return Status;\r
469}\r
470\r
471EFI_STATUS\r
472EFIAPI\r
473HiiFindHandles (\r
474 IN EFI_HII_PROTOCOL *This,\r
475 IN OUT UINT16 *HandleBufferLength,\r
476 OUT FRAMEWORK_EFI_HII_HANDLE Handle[1]\r
477 )\r
478/*++\r
479\r
480Routine Description:\r
481 Determines the handles that are currently active in the database.\r
482\r
483Arguments:\r
484\r
485Returns:\r
486\r
487--*/\r
488{\r
ea58467b 489 UINT16 Count;\r
490 LIST_ENTRY *ListEntry;\r
491 HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *HandleMapEntry;\r
492 EFI_HII_THUNK_PRIVATE_DATA *Private;\r
493\r
494 if (HandleBufferLength == NULL) {\r
495 return EFI_INVALID_PARAMETER;\r
496 }\r
497\r
498 Private = EFI_HII_THUNK_PRIVATE_DATA_FROM_THIS(This); \r
499\r
500 Count = 0;\r
501 for (ListEntry = Private->HiiThunkHandleMappingDBListHead.ForwardLink;\r
502 ListEntry != &Private->HiiThunkHandleMappingDBListHead;\r
503 ListEntry = ListEntry->ForwardLink\r
504 ) {\r
505 Count++;\r
506 }\r
507\r
508 if (Count > *HandleBufferLength) {\r
509 *HandleBufferLength = (Count * sizeof (FRAMEWORK_EFI_HII_HANDLE));\r
510 return EFI_BUFFER_TOO_SMALL;\r
511 }\r
512\r
513 Count = 0;\r
514 for (ListEntry = Private->HiiThunkHandleMappingDBListHead.ForwardLink;\r
515 ListEntry != &Private->HiiThunkHandleMappingDBListHead;\r
516 ListEntry = ListEntry->ForwardLink\r
517 ) {\r
518 HandleMapEntry = HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY_FROM_LISTENTRY (ListEntry);\r
519\r
520 Handle[Count] = HandleMapEntry->FrameworkHiiHandle;\r
521 \r
522 Count++;\r
523 } \r
524\r
525 *HandleBufferLength = (Count * sizeof (FRAMEWORK_EFI_HII_HANDLE));\r
4259256b 526 return EFI_SUCCESS;\r
527}\r
528\r
529EFI_STATUS\r
530EFIAPI\r
531HiiGetPrimaryLanguages (\r
532 IN EFI_HII_PROTOCOL *This,\r
533 IN FRAMEWORK_EFI_HII_HANDLE Handle,\r
534 OUT EFI_STRING *LanguageString\r
535 )\r
536/*++\r
537\r
538Routine Description:\r
539\r
540 This function allows a program to determine what the primary languages that are supported on a given handle.\r
541\r
542Arguments:\r
543\r
544Returns:\r
545\r
546--*/\r
547{\r
ee3428bb 548 EFI_HII_THUNK_PRIVATE_DATA *Private;\r
549 EFI_HII_HANDLE UefiHiiHandle;\r
550 CHAR8 *AsciiLanguageCodes;\r
551 CHAR16 *UnicodeLanguageCodes;\r
552\r
553 Private = EFI_HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
554\r
555 \r
556 \r
557 UefiHiiHandle = FrameworkHiiHandleToUefiHiiHandle (Private, Handle);\r
558 if (UefiHiiHandle == NULL) {\r
559 return EFI_INVALID_PARAMETER;\r
560 }\r
561\r
562 AsciiLanguageCodes = HiiLibGetSupportedLanguages (UefiHiiHandle);\r
563\r
564 if (AsciiLanguageCodes == NULL) {\r
565 return EFI_INVALID_PARAMETER;\r
566 }\r
567\r
568 UnicodeLanguageCodes = AllocateZeroPool (AsciiStrSize (AsciiLanguageCodes) * sizeof (CHAR16));\r
569 if (UnicodeLanguageCodes == NULL) {\r
570 return EFI_OUT_OF_RESOURCES;\r
571 }\r
572\r
573 //\r
574 // The language returned is in RFC 3066 format.\r
575 //\r
576 *LanguageString = AsciiStrToUnicodeStr (AsciiLanguageCodes, UnicodeLanguageCodes);\r
577\r
4259256b 578 return EFI_SUCCESS;\r
579}\r
580\r
581EFI_STATUS\r
582EFIAPI\r
583HiiGetSecondaryLanguages (\r
584 IN EFI_HII_PROTOCOL *This,\r
585 IN FRAMEWORK_EFI_HII_HANDLE Handle,\r
586 IN CHAR16 *PrimaryLanguage,\r
587 OUT EFI_STRING *LanguageString\r
588 )\r
589/*++\r
590\r
591Routine Description:\r
592\r
593 This function allows a program to determine which secondary languages are supported\r
594 on a given handle for a given primary language.\r
595\r
596 Arguments:\r
597\r
598Returns:\r
599\r
600--*/\r
601{\r
ee3428bb 602 EFI_HII_THUNK_PRIVATE_DATA *Private;\r
603 EFI_HII_HANDLE UefiHiiHandle;\r
604 CHAR8 *AsciiPrimaryLanguage;\r
605 CHAR8 *AsciiLanguageCodes;\r
606 CHAR16 *UnicodeLanguageCodes;\r
607\r
608 Private = EFI_HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
609\r
610 \r
611 \r
612 UefiHiiHandle = FrameworkHiiHandleToUefiHiiHandle (Private, Handle);\r
613 if (UefiHiiHandle == NULL) {\r
614 return EFI_INVALID_PARAMETER;\r
615 }\r
616\r
617 AsciiPrimaryLanguage = AllocateZeroPool (StrLen (PrimaryLanguage) + 1);\r
618\r
619 UnicodeStrToAsciiStr (PrimaryLanguage, AsciiPrimaryLanguage);\r
620\r
621 AsciiLanguageCodes = HiiLibGetSupportedSecondaryLanguages (UefiHiiHandle, AsciiPrimaryLanguage);\r
622\r
623 if (AsciiLanguageCodes == NULL) {\r
624 return EFI_INVALID_PARAMETER;\r
625 }\r
626\r
627 UnicodeLanguageCodes = AllocateZeroPool (AsciiStrSize (AsciiLanguageCodes) * sizeof (CHAR16));\r
628 if (UnicodeLanguageCodes == NULL) {\r
629 return EFI_OUT_OF_RESOURCES;\r
630 }\r
631\r
632 //\r
633 // The language returned is in RFC 3066 format.\r
634 //\r
635 *LanguageString = AsciiStrToUnicodeStr (AsciiLanguageCodes, UnicodeLanguageCodes);\r
636\r
4259256b 637 return EFI_SUCCESS;\r
638}\r
639\r
137c54ac 640EFI_STATUS\r
641EFIAPI \r
642ThunkSendForm (\r
643 IN EFI_FORM_BROWSER_PROTOCOL *This,\r
644 IN BOOLEAN UseDatabase,\r
645 IN FRAMEWORK_EFI_HII_HANDLE *Handle,\r
646 IN UINTN HandleCount,\r
647 IN FRAMEWORK_EFI_IFR_PACKET *Packet, OPTIONAL\r
648 IN EFI_HANDLE CallbackHandle, OPTIONAL\r
649 IN UINT8 *NvMapOverride, OPTIONAL\r
650 IN FRAMEWORK_EFI_SCREEN_DESCRIPTOR *ScreenDimensions, OPTIONAL\r
651 OUT BOOLEAN *ResetRequired OPTIONAL\r
652 )\r
653{\r
654 ASSERT (FALSE);\r
655 return EFI_UNSUPPORTED;\r
656}\r
657\r
658EFI_STATUS\r
659EFIAPI \r
660ThunkCreatePopUp (\r
661 IN UINTN NumberOfLines,\r
662 IN BOOLEAN HotKey,\r
663 IN UINTN MaximumStringSize,\r
664 OUT CHAR16 *StringBuffer,\r
665 OUT EFI_INPUT_KEY *KeyValue,\r
666 IN CHAR16 *String,\r
667 ...\r
668 )\r
669{\r
670 ASSERT (FALSE);\r
671 return EFI_UNSUPPORTED;\r
672}\r
4259256b 673\r