]> git.proxmox.com Git - mirror_edk2.git/blame - EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/HiiDatabase.c
Code scrub for Universal\Console\GraphicsConsoleDxe.
[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
a3318eaf 48 ///\r
49 /// HiiHandleLinkList\r
50 ///\r
51 NULL, NULL \r
4259256b 52 },\r
53};\r
54\r
137c54ac 55EFI_FORMBROWSER_THUNK_PRIVATE_DATA mBrowserThunkPrivateDataTemplate = {\r
56 EFI_FORMBROWSER_THUNK_PRIVATE_DATA_SIGNATURE,\r
57 (EFI_HANDLE) NULL,\r
0368663f 58 (HII_THUNK_PRIVATE_DATA *) NULL,\r
137c54ac 59 {\r
60 ThunkSendForm,\r
61 ThunkCreatePopUp\r
62 }\r
63};\r
64\r
65\r
59336178 66CONST EFI_HII_DATABASE_PROTOCOL *mHiiDatabase;\r
59336178 67CONST EFI_HII_IMAGE_PROTOCOL *mHiiImageProtocol;\r
68CONST EFI_HII_STRING_PROTOCOL *mHiiStringProtocol;\r
133a9dfb 69CONST EFI_HII_FONT_PROTOCOL *mHiiFontProtocol;\r
59336178 70CONST EFI_HII_CONFIG_ROUTING_PROTOCOL *mHiiConfigRoutingProtocol;\r
0368663f 71CONST EFI_FORM_BROWSER2_PROTOCOL *mFormBrowser2Protocol;\r
ebbd2793 72\r
ea58467b 73\r
3321fa09 74/**\r
75 This routine initializes the HII Database.\r
76 \r
77 @param ImageHandle Image handle for PCD DXE driver.\r
78 @param SystemTable Pointer to SystemTable.\r
ea58467b 79\r
3321fa09 80 @retval EFI_SUCCESS The entry point alwasy return successfully.\r
81**/\r
4259256b 82EFI_STATUS\r
83EFIAPI\r
84InitializeHiiDatabase (\r
85 IN EFI_HANDLE ImageHandle,\r
86 IN EFI_SYSTEM_TABLE *SystemTable\r
87 )\r
4259256b 88{\r
0368663f 89 HII_THUNK_PRIVATE_DATA *Private;\r
90 EFI_HANDLE Handle;\r
91 EFI_STATUS Status;\r
92 UINTN BufferLength;\r
93 EFI_HII_HANDLE *Buffer;\r
94 UINTN Index;\r
d4775f2a 95 HII_THUNK_CONTEXT *ThunkContext;\r
0368663f 96 \r
4259256b 97\r
962045a2 98 ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiHiiCompatibilityProtocolGuid);\r
99 ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiFormBrowserCompatibilityProtocolGuid);\r
4259256b 100\r
0368663f 101 Private = AllocateCopyPool (sizeof (HII_THUNK_PRIVATE_DATA), &mHiiThunkPrivateDataTempate);\r
102 ASSERT (Private != NULL);\r
103 InitializeListHead (&Private->ThunkContextListHead);\r
4259256b 104\r
d4775f2a 105 InitHiiHandleDatabase ();\r
106\r
0368663f 107 mHiiThunkPrivateData = Private;\r
ea58467b 108\r
4259256b 109 Status = gBS->LocateProtocol (\r
110 &gEfiHiiDatabaseProtocolGuid,\r
111 NULL,\r
59336178 112 (VOID **) &mHiiDatabase\r
4259256b 113 );\r
114 ASSERT_EFI_ERROR (Status);\r
115\r
116 Status = gBS->LocateProtocol (\r
0368663f 117 &gEfiHiiStringProtocolGuid,\r
4259256b 118 NULL,\r
0368663f 119 (VOID **) &mHiiStringProtocol\r
4259256b 120 );\r
121 ASSERT_EFI_ERROR (Status);\r
122\r
133a9dfb 123 Status = gBS->LocateProtocol (\r
124 &gEfiHiiFontProtocolGuid,\r
125 NULL,\r
126 (VOID **) &mHiiFontProtocol\r
127 );\r
128 ASSERT_EFI_ERROR (Status);\r
129\r
4259256b 130 Status = gBS->LocateProtocol (\r
0368663f 131 &gEfiHiiConfigRoutingProtocolGuid,\r
4259256b 132 NULL,\r
0368663f 133 (VOID **) &mHiiConfigRoutingProtocol\r
4259256b 134 );\r
135 ASSERT_EFI_ERROR (Status);\r
136\r
4259256b 137\r
ebbd2793 138 Status = gBS->LocateProtocol (\r
0368663f 139 &gEfiFormBrowser2ProtocolGuid,\r
ebbd2793 140 NULL,\r
0368663f 141 (VOID **) &mFormBrowser2Protocol\r
ebbd2793 142 );\r
143 ASSERT_EFI_ERROR (Status);\r
144\r
0368663f 145\r
146 \r
147\r
4259256b 148 //\r
149 // Install protocol interface\r
150 //\r
4259256b 151 Status = gBS->InstallProtocolInterface (\r
0368663f 152 &Private->Handle,\r
962045a2 153 &gEfiHiiCompatibilityProtocolGuid,\r
4259256b 154 EFI_NATIVE_INTERFACE,\r
0368663f 155 (VOID *) &Private->Hii\r
4259256b 156 );\r
157 ASSERT_EFI_ERROR (Status);\r
158\r
0368663f 159 Status = HiiLibListPackageLists (EFI_HII_PACKAGE_STRINGS, NULL, &BufferLength, &Buffer);\r
160 if (Status == EFI_SUCCESS) {\r
161 for (Index = 0; Index < BufferLength / sizeof (EFI_HII_HANDLE); Index++) {\r
d4775f2a 162 ThunkContext = CreateThunkContextForUefiHiiHandle (Buffer[Index]);\r
163 ASSERT (ThunkContext!= NULL);\r
164 \r
165 InsertTailList (&Private->ThunkContextListHead, &ThunkContext->Link);\r
0368663f 166 }\r
167\r
168 FreePool (Buffer);\r
169 }\r
ea58467b 170\r
171 Status = mHiiDatabase->RegisterPackageNotify (\r
172 mHiiDatabase,\r
173 EFI_HII_PACKAGE_STRINGS,\r
174 NULL,\r
0368663f 175 NewOrAddPackNotify,\r
ea58467b 176 EFI_HII_DATABASE_NOTIFY_NEW_PACK,\r
0368663f 177 &Handle\r
ea58467b 178 );\r
179 ASSERT_EFI_ERROR (Status);\r
180\r
181 Status = mHiiDatabase->RegisterPackageNotify (\r
182 mHiiDatabase,\r
183 EFI_HII_PACKAGE_STRINGS,\r
184 NULL,\r
0368663f 185 NewOrAddPackNotify,\r
186 EFI_HII_DATABASE_NOTIFY_ADD_PACK,\r
187 &Handle\r
188 );\r
189 ASSERT_EFI_ERROR (Status);\r
190\r
191 Status = mHiiDatabase->RegisterPackageNotify (\r
192 mHiiDatabase,\r
4dd76ade 193 EFI_HII_PACKAGE_FORMS,\r
0368663f 194 NULL,\r
195 NewOrAddPackNotify,\r
196 EFI_HII_DATABASE_NOTIFY_NEW_PACK,\r
197 &Handle\r
198 );\r
199 ASSERT_EFI_ERROR (Status);\r
200\r
201 Status = mHiiDatabase->RegisterPackageNotify (\r
202 mHiiDatabase,\r
4dd76ade 203 EFI_HII_PACKAGE_FORMS,\r
0368663f 204 NULL,\r
205 NewOrAddPackNotify,\r
ea58467b 206 EFI_HII_DATABASE_NOTIFY_ADD_PACK,\r
0368663f 207 &Handle\r
ea58467b 208 );\r
209 ASSERT_EFI_ERROR (Status);\r
210\r
211 Status = mHiiDatabase->RegisterPackageNotify (\r
212 mHiiDatabase,\r
213 EFI_HII_PACKAGE_STRINGS,\r
214 NULL,\r
215 RemovePackNotify,\r
216 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK,\r
0368663f 217 &Handle\r
ea58467b 218 );\r
219 ASSERT_EFI_ERROR (Status);\r
220\r
0368663f 221 mBrowserThunkPrivateDataTemplate.ThunkPrivate = Private;\r
137c54ac 222 Status = gBS->InstallProtocolInterface (\r
223 &mBrowserThunkPrivateDataTemplate.Handle,\r
962045a2 224 &gEfiFormBrowserCompatibilityProtocolGuid,\r
137c54ac 225 EFI_NATIVE_INTERFACE,\r
226 (VOID *) &mBrowserThunkPrivateDataTemplate.FormBrowser\r
227 );\r
228 ASSERT_EFI_ERROR (Status);\r
229 \r
4259256b 230 return Status;\r
231}\r
232\r
3321fa09 233/**\r
234 Determines the handles that are currently active in the database.\r
235\r
236 This function determines the handles that are currently active in the database. \r
237 For example, a program wishing to create a Setup-like configuration utility would use this call \r
238 to determine the handles that are available. It would then use calls defined in the forms section \r
239 below to extract forms and then interpret them.\r
240\r
241 @param This A pointer to the EFI_HII_PROTOCOL instance.\r
242 @param HandleBufferLength On input, a pointer to the length of the handle buffer. \r
243 On output, the length of the handle buffer that is required for the handles found.\r
244 @param Handle An array of EFI_HII_HANDLE instances returned. \r
245 Type EFI_HII_HANDLE is defined in EFI_HII_PROTOCOL.NewPack() in the Packages section.\r
246\r
247 @retval EFI_SUCCESS Handle was updated successfully.\r
248 \r
249 @retval EFI_BUFFER_TOO_SMALL The HandleBufferLength parameter indicates that Handle is too small \r
250 to support the number of handles. HandleBufferLength is updated with a value that \r
251 will enable the data to fit.\r
252**/\r
4259256b 253EFI_STATUS\r
254EFIAPI\r
255HiiFindHandles (\r
256 IN EFI_HII_PROTOCOL *This,\r
257 IN OUT UINT16 *HandleBufferLength,\r
258 OUT FRAMEWORK_EFI_HII_HANDLE Handle[1]\r
259 )\r
4259256b 260{\r
ea58467b 261 UINT16 Count;\r
0368663f 262 LIST_ENTRY *Link;\r
263 HII_THUNK_CONTEXT *ThunkContext;\r
264 HII_THUNK_PRIVATE_DATA *Private;\r
ea58467b 265\r
266 if (HandleBufferLength == NULL) {\r
267 return EFI_INVALID_PARAMETER;\r
268 }\r
269\r
0368663f 270 Private = HII_THUNK_PRIVATE_DATA_FROM_THIS(This); \r
ea58467b 271\r
0368663f 272 //\r
273 // Count the number of handles.\r
274 //\r
ea58467b 275 Count = 0;\r
0368663f 276 Link = GetFirstNode (&Private->ThunkContextListHead);\r
277 while (!IsNull (&Private->ThunkContextListHead, Link)) {\r
ea58467b 278 Count++;\r
0368663f 279 Link = GetNextNode (&Private->ThunkContextListHead, Link);\r
ea58467b 280 }\r
281\r
282 if (Count > *HandleBufferLength) {\r
5990ace9 283 *HandleBufferLength = (UINT16) (Count * sizeof (FRAMEWORK_EFI_HII_HANDLE));\r
ea58467b 284 return EFI_BUFFER_TOO_SMALL;\r
285 }\r
286\r
0368663f 287 //\r
288 // Output the handles.\r
289 //\r
ea58467b 290 Count = 0;\r
0368663f 291 Link = GetFirstNode (&Private->ThunkContextListHead);\r
292 while (!IsNull (&Private->ThunkContextListHead, Link)) {\r
293\r
294 ThunkContext = HII_THUNK_CONTEXT_FROM_LINK (Link);\r
295 Handle[Count] = ThunkContext->FwHiiHandle;\r
ea58467b 296\r
ea58467b 297 Count++;\r
0368663f 298 Link = GetNextNode (&Private->ThunkContextListHead, Link);\r
299\r
300 }\r
ea58467b 301\r
5990ace9 302 *HandleBufferLength = (UINT16) (Count * sizeof (FRAMEWORK_EFI_HII_HANDLE));\r
4259256b 303 return EFI_SUCCESS;\r
304}\r
305\r
0368663f 306EFI_STATUS\r
307LangCodes3066To639 (\r
308 IN CHAR8 *LangCodes3066,\r
309 IN CHAR8 **LangCodes639\r
310 )\r
311{\r
312 CHAR8 *AsciiLangCodes;\r
313 CHAR8 Lang[RFC_3066_ENTRY_SIZE];\r
314 UINTN Index;\r
315 UINTN Count;\r
316 EFI_STATUS Status;\r
317\r
318 ASSERT (LangCodes3066 != NULL);\r
319 ASSERT (LangCodes639 != NULL);\r
320 \r
321 //\r
322 // Count the number of RFC 3066 language codes.\r
323 //\r
324 Index = 0;\r
325 AsciiLangCodes = LangCodes3066;\r
326 while (AsciiStrLen (AsciiLangCodes) != 0) {\r
327 HiiLibGetNextLanguage (&AsciiLangCodes, Lang);\r
328 Index++;\r
329 }\r
330\r
331 Count = Index;\r
332\r
333 //\r
334 // \r
335 //\r
336 *LangCodes639 = AllocateZeroPool (ISO_639_2_ENTRY_SIZE * Count + 1);\r
337 if (*LangCodes639 == NULL) {\r
338 return EFI_OUT_OF_RESOURCES;\r
339 }\r
340\r
341 AsciiLangCodes = LangCodes3066;\r
342\r
343 for (Index = 0; Index < Count; Index++) {\r
344 HiiLibGetNextLanguage (&AsciiLangCodes, Lang);\r
345 Status = ConvertRfc3066LanguageToIso639Language (Lang, *LangCodes639 + Index * ISO_639_2_ENTRY_SIZE);\r
346 ASSERT_EFI_ERROR (Status);\r
347 }\r
348\r
349 return EFI_SUCCESS;\r
350}\r
351\r
3321fa09 352/**\r
353 Allows a program to determine the primary languages that are supported on a given handle.\r
354\r
355 This routine is intended to be used by drivers to query the interface database for supported languages. \r
356 This routine returns a string of concatenated 3-byte language identifiers, one per string package associated with the handle.\r
357\r
358 @param This A pointer to the EFI_HII_PROTOCOL instance.\r
359 @param Handle The handle on which the strings reside. Type EFI_HII_HANDLE is defined in EFI_HII_PROTOCOL.NewPack() \r
360 in the Packages section.\r
361 @param LanguageString A string allocated by GetPrimaryLanguages() that contains a list of all primary languages \r
362 registered on the handle. The routine will not return the three-spaces language identifier used in \r
363 other functions to indicate non-language-specific strings.\r
364\r
365 @reval EFI_SUCCESS LanguageString was correctly returned.\r
366 \r
367 @reval EFI_INVALID_PARAMETER The Handle was unknown.\r
368**/\r
4259256b 369EFI_STATUS\r
370EFIAPI\r
371HiiGetPrimaryLanguages (\r
3321fa09 372 IN EFI_HII_PROTOCOL *This,\r
373 IN FRAMEWORK_EFI_HII_HANDLE Handle,\r
374 OUT EFI_STRING *LanguageString\r
4259256b 375 )\r
4259256b 376{\r
0368663f 377 HII_THUNK_PRIVATE_DATA *Private;\r
ee3428bb 378 EFI_HII_HANDLE UefiHiiHandle;\r
0368663f 379 CHAR8 *LangCodes3066;\r
380 CHAR16 *UnicodeLangCodes639;\r
381 CHAR8 *LangCodes639;\r
382 EFI_STATUS Status;\r
ee3428bb 383\r
0368663f 384 Private = HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
ee3428bb 385\r
0368663f 386 UefiHiiHandle = FwHiiHandleToUefiHiiHandle (Private, Handle);\r
ee3428bb 387 if (UefiHiiHandle == NULL) {\r
388 return EFI_INVALID_PARAMETER;\r
389 }\r
390\r
0368663f 391 LangCodes3066 = HiiLibGetSupportedLanguages (UefiHiiHandle);\r
ee3428bb 392\r
0368663f 393 if (LangCodes3066 == NULL) {\r
ee3428bb 394 return EFI_INVALID_PARAMETER;\r
395 }\r
396\r
0368663f 397\r
398 LangCodes639 = NULL;\r
399 Status = LangCodes3066To639 (LangCodes3066, &LangCodes639);\r
400 if (EFI_ERROR (Status)) {\r
401 goto Done;\r
402 }\r
403 \r
404 UnicodeLangCodes639 = AllocateZeroPool (AsciiStrSize (LangCodes639) * sizeof (CHAR16));\r
405 if (UnicodeLangCodes639 == NULL) {\r
406 Status = EFI_OUT_OF_RESOURCES;\r
407 goto Done;\r
ee3428bb 408 }\r
409\r
410 //\r
0368663f 411 // The language returned is in RFC 639-2 format.\r
ee3428bb 412 //\r
0368663f 413 AsciiStrToUnicodeStr (LangCodes639, UnicodeLangCodes639);\r
414 *LanguageString = UnicodeLangCodes639;\r
ee3428bb 415\r
0368663f 416Done:\r
417 FreePool (LangCodes3066);\r
7001eaf8 418 if (LangCodes639 != NULL) {\r
419 FreePool (LangCodes639);\r
420 }\r
0368663f 421\r
422 return Status;\r
4259256b 423}\r
424\r
0368663f 425\r
3321fa09 426/**\r
427 Allows a program to determine which secondary languages are supported on a given handle for a given primary language\r
0368663f 428\r
3321fa09 429 This routine is intended to be used by drivers to query the interface database for supported languages. \r
430 This routine returns a string of concatenated 3-byte language identifiers, one per string package associated with the handle.\r
431\r
432 @param This A pointer to the EFI_HII_PROTOCOL instance.\r
433 @param Handle The handle on which the strings reside. Type EFI_HII_HANDLE is defined in EFI_HII_PROTOCOL.NewPack() \r
434 in the Packages section.\r
435 @param PrimaryLanguage Pointer to a NULL-terminated string containing a single ISO 639-2 language identifier, indicating \r
436 the primary language.\r
437 @param LanguageString A string allocated by GetSecondaryLanguages() containing a list of all secondary languages registered \r
438 on the handle. The routine will not return the three-spaces language identifier used in other functions \r
439 to indicate non-language-specific strings, nor will it return the primary language. This function succeeds \r
440 but returns a NULL LanguageString if there are no secondary languages associated with the input Handle and \r
441 PrimaryLanguage pair. Type EFI_STRING is defined in String.\r
442 \r
443 @reval EFI_SUCCESS LanguageString was correctly returned.\r
444 @reval EFI_INVALID_PARAMETER The Handle was unknown.\r
445**/\r
4259256b 446EFI_STATUS\r
447EFIAPI\r
448HiiGetSecondaryLanguages (\r
0368663f 449 IN EFI_HII_PROTOCOL *This,\r
450 IN FRAMEWORK_EFI_HII_HANDLE Handle,\r
451 IN CHAR16 *PrimaryLanguage,\r
452 OUT EFI_STRING *LanguageString\r
4259256b 453 )\r
4259256b 454{\r
0368663f 455 HII_THUNK_PRIVATE_DATA *Private;\r
ee3428bb 456 EFI_HII_HANDLE UefiHiiHandle;\r
0368663f 457 CHAR8 PrimaryLang3066[RFC_3066_ENTRY_SIZE];\r
458 CHAR8 *PrimaryLang639;\r
459 CHAR8 *SecLangCodes3066;\r
460 CHAR8 *SecLangCodes639;\r
461 CHAR16 *UnicodeSecLangCodes639;\r
462 EFI_STATUS Status;\r
ee3428bb 463\r
0368663f 464 Private = HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
ee3428bb 465\r
0368663f 466 SecLangCodes639 = NULL;\r
467 SecLangCodes3066 = NULL;\r
468 UnicodeSecLangCodes639 = NULL;\r
469\r
470 UefiHiiHandle = FwHiiHandleToUefiHiiHandle (Private, Handle);\r
ee3428bb 471 if (UefiHiiHandle == NULL) {\r
472 return EFI_INVALID_PARAMETER;\r
473 }\r
474\r
0368663f 475 PrimaryLang639 = AllocateZeroPool (StrLen (PrimaryLanguage) + 1);\r
476 if (PrimaryLang639 == NULL) {\r
477 Status = EFI_OUT_OF_RESOURCES;\r
478 goto Done;\r
479 }\r
ee3428bb 480\r
0368663f 481 UnicodeStrToAsciiStr (PrimaryLanguage, PrimaryLang639);\r
ee3428bb 482\r
0368663f 483 Status = ConvertIso639LanguageToRfc3066Language (PrimaryLang639, PrimaryLang3066);\r
484 ASSERT_EFI_ERROR (Status);\r
ee3428bb 485\r
0368663f 486 SecLangCodes3066 = HiiLibGetSupportedSecondaryLanguages (UefiHiiHandle, PrimaryLang3066);\r
487\r
488 if (SecLangCodes3066 == NULL) {\r
489 Status = EFI_INVALID_PARAMETER;\r
490 goto Done;\r
ee3428bb 491 }\r
492\r
0368663f 493 Status = LangCodes3066To639 (SecLangCodes3066, &SecLangCodes639);\r
494 if (EFI_ERROR (Status)) {\r
495 goto Done;\r
496 }\r
497\r
498 UnicodeSecLangCodes639 = AllocateZeroPool (AsciiStrSize (SecLangCodes639) * sizeof (CHAR16));\r
499 if (UnicodeSecLangCodes639 == NULL) {\r
500 Status = EFI_OUT_OF_RESOURCES;\r
501 goto Done;\r
ee3428bb 502 }\r
503\r
504 //\r
505 // The language returned is in RFC 3066 format.\r
506 //\r
0368663f 507 *LanguageString = AsciiStrToUnicodeStr (SecLangCodes639, UnicodeSecLangCodes639);\r
ee3428bb 508\r
0368663f 509Done:\r
7001eaf8 510 if (PrimaryLang639 != NULL) {\r
511 FreePool (PrimaryLang639);\r
512 }\r
513 if (SecLangCodes639 != NULL) {\r
514 FreePool (SecLangCodes639);\r
515 }\r
516 if (SecLangCodes3066 != NULL) {\r
517 FreePool (SecLangCodes3066);\r
518 }\r
519 if (UnicodeSecLangCodes639 != NULL) {\r
520 FreePool (UnicodeSecLangCodes639);\r
521 }\r
0368663f 522 \r
523 return Status;\r
137c54ac 524}\r
4259256b 525\r
0368663f 526 \r