]> git.proxmox.com Git - mirror_edk2.git/blame - EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Utility.c
Correct module type for library UefiBootServicesTableLib and UefiRuntimeServicesTableLib.
[mirror_edk2.git] / EdkCompatibilityPkg / Compatibility / FrameworkHiiToUefiHiiThunk / Utility.c
CommitLineData
4259256b 1/**@file\r
2\r
3 This file contains the keyboard processing code to the HII database.\r
4\r
5Copyright (c) 2006 - 2008, Intel Corporation\r
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\r
17#include "HiiDatabase.h"\r
d4775f2a 18#include "HiiHandle.h"\r
4259256b 19\r
0368663f 20EFI_GUID gFrameworkHiiCompatbilityGuid = EFI_IFR_FRAMEWORK_GUID;\r
21EFI_GUID gTianoHiiIfrGuid = EFI_IFR_TIANO_GUID;\r
22\r
23\r
ee3428bb 24EFI_HII_HANDLE\r
0368663f 25FwHiiHandleToUefiHiiHandle (\r
26 IN CONST HII_THUNK_PRIVATE_DATA *Private,\r
27 IN FRAMEWORK_EFI_HII_HANDLE FwHiiHandle\r
ee3428bb 28 )\r
29{\r
0368663f 30 HII_THUNK_CONTEXT *ThunkContext;\r
ee3428bb 31\r
0368663f 32 ASSERT (FwHiiHandle != (FRAMEWORK_EFI_HII_HANDLE) 0);\r
ee3428bb 33 ASSERT (Private != NULL);\r
34\r
0368663f 35 ThunkContext = FwHiiHandleToThunkContext (Private, FwHiiHandle);\r
ee3428bb 36\r
0368663f 37 if (ThunkContext != NULL) {\r
38 return ThunkContext->UefiHiiHandle;\r
ee3428bb 39 }\r
40 \r
41 return (EFI_HII_HANDLE) NULL;\r
42}\r
43\r
ebbd2793 44\r
0368663f 45HII_THUNK_CONTEXT *\r
46FwHiiHandleToThunkContext (\r
47 IN CONST HII_THUNK_PRIVATE_DATA *Private,\r
48 IN FRAMEWORK_EFI_HII_HANDLE FwHiiHandle\r
ebbd2793 49 )\r
50{\r
0368663f 51 LIST_ENTRY *Link;\r
52 HII_THUNK_CONTEXT *ThunkContext;\r
53\r
ebbd2793 54\r
0368663f 55 Link = GetFirstNode (&Private->ThunkContextListHead);\r
ebbd2793 56\r
0368663f 57 while (!IsNull (&Private->ThunkContextListHead, Link)) {\r
58 ThunkContext = HII_THUNK_CONTEXT_FROM_LINK (Link);\r
59\r
60 if (FwHiiHandle == ThunkContext->FwHiiHandle) {\r
61 return ThunkContext;\r
ebbd2793 62 }\r
0368663f 63\r
64 Link = GetNextNode (&Private->ThunkContextListHead, Link);\r
ebbd2793 65 }\r
66\r
0368663f 67 return NULL;\r
ebbd2793 68}\r
69\r
0368663f 70HII_THUNK_CONTEXT *\r
71UefiHiiHandleToThunkContext (\r
72 IN CONST HII_THUNK_PRIVATE_DATA *Private,\r
ea58467b 73 IN EFI_HII_HANDLE UefiHiiHandle\r
74 )\r
75{\r
0368663f 76 LIST_ENTRY *Link;\r
77 HII_THUNK_CONTEXT *ThunkContext;\r
ea58467b 78\r
0368663f 79 Link = GetFirstNode (&Private->ThunkContextListHead);\r
ea58467b 80\r
0368663f 81 while (!IsNull (&Private->ThunkContextListHead, Link)) {\r
82 ThunkContext = HII_THUNK_CONTEXT_FROM_LINK (Link);\r
83\r
84 if (UefiHiiHandle == ThunkContext->UefiHiiHandle) {\r
85 return ThunkContext;\r
ea58467b 86 }\r
0368663f 87 Link = GetNextNode (&Private->ThunkContextListHead, Link);\r
ea58467b 88 }\r
89\r
0368663f 90 return NULL;\r
ea58467b 91}\r
99a83b4c 92\r
8ea58c07 93HII_THUNK_CONTEXT *\r
94TagGuidToIfrPackThunkContext (\r
0368663f 95 IN CONST HII_THUNK_PRIVATE_DATA *Private,\r
99a83b4c 96 IN CONST EFI_GUID *Guid\r
97 )\r
98{\r
0368663f 99 LIST_ENTRY *Link;\r
100 HII_THUNK_CONTEXT *ThunkContext;\r
101\r
102 Link = GetFirstNode (&Private->ThunkContextListHead);\r
99a83b4c 103\r
0368663f 104 while (!IsNull (&Private->ThunkContextListHead, Link)) {\r
105 ThunkContext = HII_THUNK_CONTEXT_FROM_LINK (Link);\r
99a83b4c 106\r
8ea58c07 107 if (CompareGuid (Guid, &ThunkContext->TagGuid) && (ThunkContext->IfrPackageCount != 0)) {\r
108 return ThunkContext;\r
99a83b4c 109 }\r
0368663f 110\r
111 Link = GetNextNode (&Private->ThunkContextListHead, Link);\r
99a83b4c 112 }\r
113\r
0368663f 114 return NULL;\r
99a83b4c 115 \r
116}\r
117\r
0368663f 118\r
d4775f2a 119VOID\r
0368663f 120DestroyThunkContextForUefiHiiHandle (\r
121 IN HII_THUNK_PRIVATE_DATA *Private,\r
122 IN EFI_HII_HANDLE UefiHiiHandle\r
123 )\r
124{\r
125 HII_THUNK_CONTEXT *ThunkContext;\r
126\r
127 ThunkContext = UefiHiiHandleToThunkContext (Private, UefiHiiHandle);\r
128 ASSERT (ThunkContext != NULL);\r
129\r
d4775f2a 130 DestroyThunkContext (ThunkContext);\r
0368663f 131}\r
132\r
133\r
134/**\r
135 This function create a HII_THUNK_CONTEXT for a package list registered\r
136 by a module calling EFI_HII_DATABASE_PROTOCOL.NewPackageList. It records\r
137 the PackageListGuid in EFI_HII_PACKAGE_LIST_HEADER in the TagGuid in \r
138 HII_THUNK_CONTEXT created. This TagGuid will be used as a key to s\r
139\r
140**/\r
141HII_THUNK_CONTEXT *\r
142CreateThunkContextForUefiHiiHandle (\r
0368663f 143 IN EFI_HII_HANDLE UefiHiiHandle\r
144 )\r
145{\r
146 EFI_STATUS Status;\r
147 EFI_GUID PackageGuid;\r
148 HII_THUNK_CONTEXT *ThunkContext;\r
149\r
150 ThunkContext = AllocateZeroPool (sizeof (*ThunkContext));\r
151 ASSERT (ThunkContext != NULL);\r
152 \r
153 ThunkContext->Signature = HII_THUNK_CONTEXT_SIGNATURE;\r
154\r
d4775f2a 155 Status = AllocateHiiHandle (&ThunkContext->FwHiiHandle);\r
0368663f 156 if (EFI_ERROR (Status)) {\r
157 return NULL;\r
158 }\r
159 \r
160 ThunkContext->UefiHiiHandle = UefiHiiHandle;\r
161 \r
162 Status = HiiLibExtractGuidFromHiiHandle (UefiHiiHandle, &PackageGuid);\r
163 ASSERT_EFI_ERROR (Status);\r
164 \r
165 CopyGuid(&ThunkContext->TagGuid, &PackageGuid);\r
166\r
167 InitializeListHead (&ThunkContext->QuestionIdMapListHead);\r
168 InitializeListHead (&ThunkContext->OneOfOptionMapListHead);\r
169 \r
0368663f 170 return ThunkContext;\r
171}\r
172\r
173\r
174UINTN\r
175GetPackageCountByType (\r
176 IN CONST EFI_HII_PACKAGE_LIST_HEADER *PackageListHeader,\r
177 IN UINT8 PackageType\r
ea58467b 178 )\r
179{\r
0368663f 180 UINTN Count;\r
181 EFI_HII_PACKAGE_HEADER *PackageHeader;\r
182\r
183 PackageHeader = (EFI_HII_PACKAGE_HEADER *) ((UINT8 *) PackageListHeader + sizeof (EFI_HII_PACKAGE_LIST_HEADER));\r
184 Count = 0;\r
185 \r
186 while (PackageHeader->Type != EFI_HII_PACKAGE_END) {\r
187 if (PackageHeader->Type == PackageType ) {\r
188 Count++;\r
189 }\r
190 PackageHeader = (EFI_HII_PACKAGE_HEADER *) ((UINT8 *) PackageHeader + PackageHeader->Length);\r
191 }\r
192 \r
193 \r
194 return Count;\r
195}\r
196\r
197LIST_ENTRY *\r
198GetOneOfOptionMapEntryListHead (\r
199 IN CONST HII_THUNK_CONTEXT *ThunkContext,\r
200 IN UINT16 QuestionId\r
201 )\r
202{\r
203 LIST_ENTRY *Link;\r
204 ONE_OF_OPTION_MAP *Map;\r
205\r
206 Link = GetFirstNode (&ThunkContext->OneOfOptionMapListHead);\r
207\r
208 while (!IsNull (&ThunkContext->OneOfOptionMapListHead, Link)) {\r
209 Map = ONE_OF_OPTION_MAP_FROM_LINK (Link);\r
210 if (QuestionId == Map->QuestionId) {\r
211 return &Map->OneOfOptionMapEntryListHead;\r
212 }\r
213 Link = GetNextNode (&ThunkContext->OneOfOptionMapListHead, Link);\r
214 }\r
215 \r
216 return NULL;\r
217}\r
99a83b4c 218\r
59930165 219VOID\r
220GetAttributesOfFirstFormSet (\r
221 IN OUT HII_THUNK_CONTEXT *ThunkContext\r
222 )\r
223{\r
224 EFI_STATUS Status;\r
225 EFI_HII_PACKAGE_LIST_HEADER *List;\r
226 EFI_HII_PACKAGE_HEADER *Package;\r
227 UINTN Size;\r
228 EFI_IFR_OP_HEADER *OpCode;\r
229 UINTN Offset;\r
230 EFI_IFR_GUID_CLASS *Class;\r
231 EFI_IFR_FORM_SET *FormSet;\r
232 EFI_IFR_GUID_SUBCLASS *SubClass;\r
233\r
234 Status = HiiLibExportPackageLists (ThunkContext->UefiHiiHandle, &List, &Size);\r
235 ASSERT_EFI_ERROR (Status);\r
236\r
237 //\r
238 // There must be at least one EFI_HII_PACKAGE_FORM in the package list.\r
239 //\r
240 ASSERT (GetPackageCountByType (List, EFI_HII_PACKAGE_FORM) >= 1);\r
241\r
242 //\r
243 // Skip the package list header.\r
244 //\r
245 Package = (EFI_HII_PACKAGE_HEADER *) (List + 1);\r
246\r
247 while (Package->Type != EFI_HII_PACKAGE_END) {\r
248\r
249 if (Package->Type == EFI_HII_PACKAGE_FORM) {\r
250\r
251 //\r
252 // Skip the package header\r
253 //\r
254 Offset = sizeof (EFI_HII_PACKAGE_HEADER);\r
255 while (Offset < Package->Length) {\r
256 OpCode = (EFI_IFR_OP_HEADER *)((UINT8 *) Package + Offset);\r
257\r
258 switch (OpCode->OpCode) {\r
259 case EFI_IFR_FORM_SET_OP:\r
260 FormSet = (EFI_IFR_FORM_SET *) OpCode;\r
261 ThunkContext->FormSetTitle = FormSet->FormSetTitle;\r
262 ThunkContext->FormSetHelp = FormSet->Help;\r
263 break;\r
264 \r
265\r
266 case EFI_IFR_GUID_OP:\r
267 Class = (EFI_IFR_GUID_CLASS*) OpCode;\r
64bdb454 268 if (CompareMem (&Class->Guid, &gTianoHiiIfrGuid, sizeof (EFI_GUID)) == 0) {\r
59930165 269 Class = (EFI_IFR_GUID_CLASS *) OpCode;\r
270\r
271 switch (Class->ExtendOpCode) {\r
272 case EFI_IFR_EXTEND_OP_CLASS:\r
273 ThunkContext->FormSetClass = Class->Class;\r
274 break;\r
275 case EFI_IFR_EXTEND_OP_SUBCLASS:\r
276 SubClass = (EFI_IFR_GUID_SUBCLASS *) OpCode;\r
277 ThunkContext->FormSetSubClass = SubClass->SubClass;\r
278 break;\r
279\r
280 default:\r
281 break;\r
282 }\r
283 }\r
284 break;\r
285 \r
286 default:\r
287 break;\r
288 \r
289 }\r
290\r
291 Offset += OpCode->Length;\r
292 }\r
293 //\r
294 // The attributes of first FormSet is ready now.\r
295 //\r
296 FreePool (List);\r
297 return;\r
298 \r
299 break;\r
300 }\r
301\r
2755d4dd 302 Package = (EFI_HII_PACKAGE_HEADER *) ((UINT8 *) Package + Package->Length);\r
59930165 303 }\r
304\r
305}\r
306\r
99a83b4c 307\r
0368663f 308EFI_STATUS\r
309CreateQuestionIdMap (\r
310 IN OUT HII_THUNK_CONTEXT *ThunkContext\r
311 )\r
312{\r
313 EFI_STATUS Status;\r
314 EFI_HII_PACKAGE_LIST_HEADER *List;\r
315 EFI_HII_PACKAGE_HEADER *Package;\r
316 UINTN Size;\r
317 EFI_IFR_OP_HEADER *OpCode;\r
318 UINTN Offset;\r
319 QUESTION_ID_MAP *IdMap;\r
320 EFI_IFR_VARSTORE *VarStore;\r
321 EFI_IFR_FORM_SET *FormSet;\r
322 EFI_IFR_QUESTION_HEADER *Question;\r
323 LIST_ENTRY *QuestionIdMapEntryListHead;\r
324 LIST_ENTRY *OneOfOptinMapEntryListHead;\r
325 QUESTION_ID_MAP_ENTRY *IdMapEntry;\r
326 EFI_IFR_GUID_OPTIONKEY *OptionMap;\r
327 ONE_OF_OPTION_MAP *OneOfOptionMap;\r
328 ONE_OF_OPTION_MAP_ENTRY *OneOfOptionMapEntry;\r
329 EFI_IFR_GUID_CLASS *Class;\r
59930165 330 EFI_IFR_GUID_SUBCLASS *SubClass;\r
59e87364 331 UINT8 OneOfType;\r
332 EFI_IFR_ONE_OF *OneOfOpcode;\r
333\r
334 //\r
335 // Set to a invalid value.\r
336 //\r
337 OneOfType = (UINT8) -1;\r
0368663f 338 \r
339\r
340 Status = HiiLibExportPackageLists (ThunkContext->UefiHiiHandle, &List, &Size);\r
341 if (EFI_ERROR (Status)) {\r
342 return Status;\r
ea58467b 343 }\r
99a83b4c 344\r
0368663f 345 //\r
346 // Get all VarStoreId and build the the QuestionId map.\r
347 // EFI_IFR_QUESTION_HEADER.VarStoreInfo.VarOffset -> Framework Question ID\r
348 // EFI_IFR_QUESTION_HEADER.QuestionId -> UEFI Question ID\r
349 //\r
350\r
351 //\r
352 // Skip the package list header.\r
353 //\r
354 Package = (EFI_HII_PACKAGE_HEADER *) (List + 1);\r
355\r
356 while (Package->Type != EFI_HII_PACKAGE_END) {\r
357\r
358 if (Package->Type == EFI_HII_PACKAGE_FORM) {\r
359\r
360 //\r
361 // Skip the package header\r
362 //\r
363 Offset = sizeof (EFI_HII_PACKAGE_HEADER);\r
364 while (Offset < Package->Length) {\r
365 OpCode = (EFI_IFR_OP_HEADER *)((UINT8 *) Package + Offset);\r
366\r
367 switch (OpCode->OpCode) {\r
368 case EFI_IFR_FORM_SET_OP:\r
369 FormSet = (EFI_IFR_FORM_SET *) OpCode;\r
370 ThunkContext->FormSetTitle = FormSet->FormSetTitle;\r
371 ThunkContext->FormSetHelp = FormSet->Help;\r
372 break;\r
373 \r
374 case EFI_IFR_VARSTORE_OP:\r
375 //\r
376 // IFR built from Framework VFR only has UEFI Buffer Type Storage\r
377 //\r
378 VarStore = (EFI_IFR_VARSTORE *) OpCode;\r
379 IdMap = AllocateZeroPool (sizeof (QUESTION_ID_MAP));\r
380 ASSERT (IdMap != NULL);\r
381 \r
382 IdMap->Signature = QUESTION_ID_MAP_SIGNATURE;\r
383 IdMap->VarStoreId = VarStore->VarStoreId;\r
384 IdMap->VarSize = VarStore->Size;\r
385 InitializeListHead (&IdMap->MapEntryListHead);\r
386 InsertTailList (&ThunkContext->QuestionIdMapListHead, &IdMap->Link);\r
387 break;\r
388\r
389 case EFI_IFR_NUMERIC_OP:\r
390 case EFI_IFR_CHECKBOX_OP:\r
391 case EFI_IFR_ONE_OF_OP:\r
392 case EFI_IFR_ORDERED_LIST_OP:\r
393 case EFI_IFR_STRING_OP:\r
394 //case EFI_IFR_PASSWORD_OP:\r
395 Question = (EFI_IFR_QUESTION_HEADER *)(OpCode + 1);\r
396 QuestionIdMapEntryListHead = GetMapEntryListHead (ThunkContext, Question->VarStoreId);\r
397\r
398 if (QuestionIdMapEntryListHead != NULL) {\r
399 //\r
400 // If the Question is using Buffer (EFI_IFR_VARSTORE_OP) type VarStore.\r
401 //\r
402 IdMapEntry = AllocateZeroPool (sizeof (QUESTION_ID_MAP_ENTRY));\r
403 ASSERT (IdMapEntry != NULL);\r
404\r
405 IdMapEntry->FwQId = Question->VarStoreInfo.VarOffset;\r
406 IdMapEntry->UefiQid = Question->QuestionId;\r
407 IdMapEntry->Signature = QUESTION_ID_MAP_ENTRY_SIGNATURE;\r
408\r
409 InsertTailList (QuestionIdMapEntryListHead, &IdMapEntry->Link);\r
410 }\r
411\r
59e87364 412 if (OpCode->OpCode == EFI_IFR_ONE_OF_OP) {\r
413 OneOfOpcode = (EFI_IFR_ONE_OF *) OpCode;\r
414 OneOfType = OneOfOpcode->Flags & EFI_IFR_NUMERIC_SIZE;\r
415 }\r
416\r
0368663f 417 break;\r
418 \r
419 case EFI_IFR_GUID_OP:\r
420 OptionMap = (EFI_IFR_GUID_OPTIONKEY *) OpCode;\r
64bdb454 421 if (CompareMem (&OptionMap->Guid, &gFrameworkHiiCompatbilityGuid, sizeof (EFI_GUID)) == 0) {\r
0368663f 422 if (OptionMap->ExtendOpCode == EFI_IFR_EXTEND_OP_OPTIONKEY) {\r
423 OneOfOptinMapEntryListHead = GetOneOfOptionMapEntryListHead (ThunkContext, OptionMap->QuestionId);\r
424 if (OneOfOptinMapEntryListHead == NULL) {\r
425 OneOfOptionMap = AllocateZeroPool (sizeof (ONE_OF_OPTION_MAP));\r
426 ASSERT (OneOfOptionMap != NULL);\r
427\r
428 OneOfOptionMap->Signature = ONE_OF_OPTION_MAP_SIGNATURE;\r
429 OneOfOptionMap->QuestionId = OptionMap->QuestionId;\r
59e87364 430\r
431 //\r
432 // Make sure OneOfType is initialized.\r
433 //\r
434 ASSERT (OneOfType != (UINT8) -1);\r
435 OneOfOptionMap->ValueType = OneOfType;\r
0368663f 436 InitializeListHead (&OneOfOptionMap->OneOfOptionMapEntryListHead);\r
437 OneOfOptinMapEntryListHead = &OneOfOptionMap->OneOfOptionMapEntryListHead;\r
438 InsertTailList (&ThunkContext->OneOfOptionMapListHead, &OneOfOptionMap->Link);\r
439 }\r
440 OneOfOptionMapEntry = AllocateZeroPool (sizeof (ONE_OF_OPTION_MAP_ENTRY));\r
441 ASSERT (OneOfOptionMapEntry != NULL);\r
442\r
443 OneOfOptionMapEntry->Signature = ONE_OF_OPTION_MAP_ENTRY_SIGNATURE;\r
444 OneOfOptionMapEntry->FwKey = OptionMap->KeyValue;\r
445 CopyMem (&OneOfOptionMapEntry->Value, &OptionMap->OptionValue, sizeof (EFI_IFR_TYPE_VALUE));\r
446 \r
447 InsertTailList (OneOfOptinMapEntryListHead, &OneOfOptionMapEntry->Link);\r
448 }\r
64bdb454 449 } else if (CompareMem (&OptionMap->Guid, &gTianoHiiIfrGuid, sizeof (EFI_GUID)) == 0) {\r
0368663f 450 Class = (EFI_IFR_GUID_CLASS *) OpCode;\r
451\r
452 switch (Class->ExtendOpCode) {\r
453 case EFI_IFR_EXTEND_OP_CLASS:\r
454 ThunkContext->FormSetClass = Class->Class;\r
455 break;\r
456 case EFI_IFR_EXTEND_OP_SUBCLASS:\r
59930165 457 SubClass = (EFI_IFR_GUID_SUBCLASS *) OpCode;\r
458 ThunkContext->FormSetSubClass = SubClass->SubClass;\r
0368663f 459 break;\r
460\r
461 default:\r
462 break;\r
463 }\r
464 }\r
465 break;\r
466 \r
467 default:\r
468 break;\r
469 \r
470 }\r
471\r
472 Offset += OpCode->Length;\r
473 }\r
474 //\r
475 // Only Form Package is in a Package List.\r
476 //\r
477 break;\r
478 }\r
479\r
480 Package = (EFI_HII_PACKAGE_HEADER *) (UINT8 *) Package + Package->Length;\r
481 }\r
482\r
483 FreePool (List);\r
ea58467b 484 return EFI_SUCCESS;\r
485}\r
99a83b4c 486\r
0368663f 487\r
488LIST_ENTRY *\r
489GetMapEntryListHead (\r
490 IN CONST HII_THUNK_CONTEXT *ThunkContext,\r
491 IN UINT16 VarStoreId\r
492 )\r
493{\r
494 LIST_ENTRY *Link;\r
495 QUESTION_ID_MAP *Map;\r
496\r
497 Link = GetFirstNode (&ThunkContext->QuestionIdMapListHead);\r
498\r
499 while (!IsNull (&ThunkContext->QuestionIdMapListHead, Link)) {\r
500 Map = QUESTION_ID_MAP_FROM_LINK (Link);\r
501 if (VarStoreId == Map->VarStoreId) {\r
502 return &Map->MapEntryListHead;\r
503 }\r
504 Link = GetNextNode (&ThunkContext->QuestionIdMapListHead, Link);\r
505 }\r
506 return NULL;\r
507}\r
508\r
509\r
d4775f2a 510HII_THUNK_CONTEXT *\r
511CreateThunkContext (\r
512 IN HII_THUNK_PRIVATE_DATA *Private,\r
513 IN UINTN StringPackageCount,\r
514 IN UINTN IfrPackageCount\r
515 )\r
516{\r
517 EFI_STATUS Status;\r
518 HII_THUNK_CONTEXT *ThunkContext;\r
519\r
520 ThunkContext = AllocateZeroPool (sizeof (HII_THUNK_CONTEXT));\r
521 ASSERT (ThunkContext != NULL);\r
522 \r
523 ThunkContext->Signature = HII_THUNK_CONTEXT_SIGNATURE;\r
524 ThunkContext->IfrPackageCount = IfrPackageCount;\r
525 ThunkContext->StringPackageCount = StringPackageCount;\r
526 Status = AllocateHiiHandle (&ThunkContext->FwHiiHandle);\r
527 if (EFI_ERROR (Status)) {\r
528 return NULL;\r
529 }\r
530\r
531 InitializeListHead (&ThunkContext->QuestionIdMapListHead);\r
532 InitializeListHead (&ThunkContext->OneOfOptionMapListHead);\r
533\r
534\r
535 return ThunkContext;\r
536 \r
537}\r
538\r
539VOID\r
540DestroyThunkContext (\r
541 IN HII_THUNK_CONTEXT *ThunkContext\r
542 )\r
543{\r
544 ASSERT (ThunkContext != NULL);\r
545\r
546 FreeHiiHandle (ThunkContext->FwHiiHandle);\r
547\r
548 DestroyQuestionIdMap (&ThunkContext->QuestionIdMapListHead);\r
549\r
550 DestoryOneOfOptionMap (&ThunkContext->OneOfOptionMapListHead);\r
551\r
552 RemoveEntryList (&ThunkContext->Link);\r
553\r
554 FreePool (ThunkContext);\r
555}\r
556\r
557\r
558VOID\r
559DestroyQuestionIdMap (\r
560 IN LIST_ENTRY *QuestionIdMapListHead\r
561 )\r
562{\r
563 QUESTION_ID_MAP *IdMap;\r
564 QUESTION_ID_MAP_ENTRY *IdMapEntry;\r
565 LIST_ENTRY *Link;\r
566 LIST_ENTRY *Link2;\r
567\r
568 while (!IsListEmpty (QuestionIdMapListHead)) {\r
569 Link = GetFirstNode (QuestionIdMapListHead);\r
570 \r
571 IdMap = QUESTION_ID_MAP_FROM_LINK (Link);\r
572\r
573 while (!IsListEmpty (&IdMap->MapEntryListHead)) {\r
574 Link2 = GetFirstNode (&IdMap->MapEntryListHead);\r
575 \r
59930165 576 IdMapEntry = QUESTION_ID_MAP_ENTRY_FROM_LINK (Link2);\r
d4775f2a 577\r
578 RemoveEntryList (Link2);\r
579\r
580 FreePool (IdMapEntry);\r
581 }\r
582\r
583 RemoveEntryList (Link);\r
584 FreePool (IdMap);\r
585 }\r
586}\r
587\r
588VOID\r
589DestoryOneOfOptionMap (\r
590 IN LIST_ENTRY *OneOfOptionMapListHead\r
591 )\r
592{\r
593 ONE_OF_OPTION_MAP *Map;\r
594 ONE_OF_OPTION_MAP_ENTRY *MapEntry;\r
595 LIST_ENTRY *Link;\r
596 LIST_ENTRY *Link2;\r
597\r
598 while (!IsListEmpty (OneOfOptionMapListHead)) {\r
599 Link = GetFirstNode (OneOfOptionMapListHead);\r
600 \r
601 Map = ONE_OF_OPTION_MAP_FROM_LINK (Link);\r
602\r
603 while (!IsListEmpty (&Map->OneOfOptionMapEntryListHead)) {\r
604 Link2 = GetFirstNode (&Map->OneOfOptionMapEntryListHead);\r
605 \r
59930165 606 MapEntry = ONE_OF_OPTION_MAP_ENTRY_FROM_LINK (Link2);\r
d4775f2a 607\r
608 RemoveEntryList (Link2);\r
609\r
610 FreePool (MapEntry);\r
611 }\r
612\r
613 RemoveEntryList (Link);\r
614 FreePool (Map);\r
615 }\r
616}\r
617\r
618\r
619\r
620\r