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