]> git.proxmox.com Git - mirror_edk2.git/blame - EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Utility.c
Fix the build bugs for these three files.
[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
bc226416 219EFI_HII_PACKAGE_HEADER *\r
220GetIfrPackage (\r
221 IN CONST EFI_HII_PACKAGES *Packages\r
222 )\r
223{\r
224 UINTN Index;\r
225 TIANO_AUTOGEN_PACKAGES_HEADER **TianoAutogenPackageHdrArray;\r
226\r
227 ASSERT (Packages != NULL);\r
228\r
229 TianoAutogenPackageHdrArray = (TIANO_AUTOGEN_PACKAGES_HEADER **) (((UINT8 *) &Packages->GuidId) + sizeof (Packages->GuidId));\r
230 \r
231 for (Index = 0; Index < Packages->NumberOfPackages; Index++) {\r
232 //\r
233 // The current UEFI HII build tool generate a binary in the format defined by \r
234 // TIANO_AUTOGEN_PACKAGES_HEADER. We assume that all packages generated in\r
235 // this binary is with same package type. So the returned IfrPackageCount and StringPackageCount\r
236 // may not be the exact number of valid package number in the binary generated \r
237 // by HII Build tool.\r
238 //\r
239 switch (TianoAutogenPackageHdrArray[Index]->PackageHeader.Type) {\r
240 case EFI_HII_PACKAGE_FORM:\r
241 return &TianoAutogenPackageHdrArray[Index]->PackageHeader;\r
242 break;\r
243 case EFI_HII_PACKAGE_STRINGS:\r
244 case EFI_HII_PACKAGE_SIMPLE_FONTS:\r
245 break;\r
246\r
247 //\r
248 // The following fonts are invalid for a module that using Framework to UEFI thunk layer.\r
249 //\r
250 case EFI_HII_PACKAGE_KEYBOARD_LAYOUT:\r
251 case EFI_HII_PACKAGE_FONTS:\r
252 case EFI_HII_PACKAGE_IMAGES:\r
253 default:\r
254 ASSERT (FALSE);\r
255 return NULL;\r
256 break;\r
257 }\r
258 }\r
259\r
260 return NULL;\r
261}\r
262\r
263VOID\r
264GetFormSetGuid (\r
265 IN EFI_HII_PACKAGE_HEADER *Package,\r
266 OUT EFI_GUID *FormSetGuid\r
267 )\r
268{\r
269 UINTN Offset;\r
270 EFI_IFR_OP_HEADER *OpCode;\r
271 EFI_IFR_FORM_SET *FormSet;\r
272\r
273 Offset = sizeof (EFI_HII_PACKAGE_HEADER);\r
274 while (Offset < Package->Length) {\r
275 OpCode = (EFI_IFR_OP_HEADER *)((UINT8 *) Package + Offset);\r
276\r
277 switch (OpCode->OpCode) {\r
278 case EFI_IFR_FORM_SET_OP:\r
279 FormSet = (EFI_IFR_FORM_SET *) OpCode;\r
14085cf0 280 CopyMem (FormSetGuid, &FormSet->Guid, sizeof (EFI_GUID));\r
bc226416 281 return;\r
282 \r
283 default:\r
284 break;\r
285 \r
286 }\r
287 Offset += OpCode->Length;\r
288 }\r
289\r
290 //\r
291 // A proper IFR must have a formset opcode.\r
292 //\r
293 ASSERT (FALSE);\r
294\r
295}\r
296\r
297\r
59930165 298VOID\r
299GetAttributesOfFirstFormSet (\r
300 IN OUT HII_THUNK_CONTEXT *ThunkContext\r
301 )\r
302{\r
303 EFI_STATUS Status;\r
304 EFI_HII_PACKAGE_LIST_HEADER *List;\r
305 EFI_HII_PACKAGE_HEADER *Package;\r
306 UINTN Size;\r
307 EFI_IFR_OP_HEADER *OpCode;\r
308 UINTN Offset;\r
309 EFI_IFR_GUID_CLASS *Class;\r
310 EFI_IFR_FORM_SET *FormSet;\r
311 EFI_IFR_GUID_SUBCLASS *SubClass;\r
312\r
313 Status = HiiLibExportPackageLists (ThunkContext->UefiHiiHandle, &List, &Size);\r
314 ASSERT_EFI_ERROR (Status);\r
315\r
316 //\r
317 // There must be at least one EFI_HII_PACKAGE_FORM in the package list.\r
318 //\r
319 ASSERT (GetPackageCountByType (List, EFI_HII_PACKAGE_FORM) >= 1);\r
320\r
321 //\r
322 // Skip the package list header.\r
323 //\r
324 Package = (EFI_HII_PACKAGE_HEADER *) (List + 1);\r
325\r
326 while (Package->Type != EFI_HII_PACKAGE_END) {\r
327\r
328 if (Package->Type == EFI_HII_PACKAGE_FORM) {\r
329\r
330 //\r
331 // Skip the package header\r
332 //\r
333 Offset = sizeof (EFI_HII_PACKAGE_HEADER);\r
334 while (Offset < Package->Length) {\r
335 OpCode = (EFI_IFR_OP_HEADER *)((UINT8 *) Package + Offset);\r
336\r
337 switch (OpCode->OpCode) {\r
338 case EFI_IFR_FORM_SET_OP:\r
339 FormSet = (EFI_IFR_FORM_SET *) OpCode;\r
340 ThunkContext->FormSetTitle = FormSet->FormSetTitle;\r
341 ThunkContext->FormSetHelp = FormSet->Help;\r
342 break;\r
343 \r
344\r
345 case EFI_IFR_GUID_OP:\r
346 Class = (EFI_IFR_GUID_CLASS*) OpCode;\r
64bdb454 347 if (CompareMem (&Class->Guid, &gTianoHiiIfrGuid, sizeof (EFI_GUID)) == 0) {\r
59930165 348 Class = (EFI_IFR_GUID_CLASS *) OpCode;\r
349\r
350 switch (Class->ExtendOpCode) {\r
351 case EFI_IFR_EXTEND_OP_CLASS:\r
352 ThunkContext->FormSetClass = Class->Class;\r
353 break;\r
354 case EFI_IFR_EXTEND_OP_SUBCLASS:\r
355 SubClass = (EFI_IFR_GUID_SUBCLASS *) OpCode;\r
356 ThunkContext->FormSetSubClass = SubClass->SubClass;\r
357 break;\r
358\r
359 default:\r
360 break;\r
361 }\r
362 }\r
363 break;\r
364 \r
365 default:\r
366 break;\r
367 \r
368 }\r
369\r
370 Offset += OpCode->Length;\r
371 }\r
372 //\r
373 // The attributes of first FormSet is ready now.\r
374 //\r
375 FreePool (List);\r
376 return;\r
377 \r
378 break;\r
379 }\r
380\r
2755d4dd 381 Package = (EFI_HII_PACKAGE_HEADER *) ((UINT8 *) Package + Package->Length);\r
59930165 382 }\r
383\r
384}\r
385\r
99a83b4c 386\r
0368663f 387EFI_STATUS\r
388CreateQuestionIdMap (\r
389 IN OUT HII_THUNK_CONTEXT *ThunkContext\r
390 )\r
391{\r
392 EFI_STATUS Status;\r
393 EFI_HII_PACKAGE_LIST_HEADER *List;\r
394 EFI_HII_PACKAGE_HEADER *Package;\r
395 UINTN Size;\r
396 EFI_IFR_OP_HEADER *OpCode;\r
397 UINTN Offset;\r
398 QUESTION_ID_MAP *IdMap;\r
399 EFI_IFR_VARSTORE *VarStore;\r
400 EFI_IFR_FORM_SET *FormSet;\r
401 EFI_IFR_QUESTION_HEADER *Question;\r
402 LIST_ENTRY *QuestionIdMapEntryListHead;\r
403 LIST_ENTRY *OneOfOptinMapEntryListHead;\r
404 QUESTION_ID_MAP_ENTRY *IdMapEntry;\r
405 EFI_IFR_GUID_OPTIONKEY *OptionMap;\r
406 ONE_OF_OPTION_MAP *OneOfOptionMap;\r
407 ONE_OF_OPTION_MAP_ENTRY *OneOfOptionMapEntry;\r
408 EFI_IFR_GUID_CLASS *Class;\r
59930165 409 EFI_IFR_GUID_SUBCLASS *SubClass;\r
59e87364 410 UINT8 OneOfType;\r
411 EFI_IFR_ONE_OF *OneOfOpcode;\r
412\r
413 //\r
414 // Set to a invalid value.\r
415 //\r
416 OneOfType = (UINT8) -1;\r
0368663f 417 \r
418\r
419 Status = HiiLibExportPackageLists (ThunkContext->UefiHiiHandle, &List, &Size);\r
420 if (EFI_ERROR (Status)) {\r
421 return Status;\r
ea58467b 422 }\r
99a83b4c 423\r
0368663f 424 //\r
425 // Get all VarStoreId and build the the QuestionId map.\r
426 // EFI_IFR_QUESTION_HEADER.VarStoreInfo.VarOffset -> Framework Question ID\r
427 // EFI_IFR_QUESTION_HEADER.QuestionId -> UEFI Question ID\r
428 //\r
429\r
430 //\r
431 // Skip the package list header.\r
432 //\r
433 Package = (EFI_HII_PACKAGE_HEADER *) (List + 1);\r
434\r
435 while (Package->Type != EFI_HII_PACKAGE_END) {\r
436\r
437 if (Package->Type == EFI_HII_PACKAGE_FORM) {\r
438\r
439 //\r
440 // Skip the package header\r
441 //\r
442 Offset = sizeof (EFI_HII_PACKAGE_HEADER);\r
443 while (Offset < Package->Length) {\r
444 OpCode = (EFI_IFR_OP_HEADER *)((UINT8 *) Package + Offset);\r
445\r
446 switch (OpCode->OpCode) {\r
447 case EFI_IFR_FORM_SET_OP:\r
448 FormSet = (EFI_IFR_FORM_SET *) OpCode;\r
449 ThunkContext->FormSetTitle = FormSet->FormSetTitle;\r
450 ThunkContext->FormSetHelp = FormSet->Help;\r
451 break;\r
452 \r
453 case EFI_IFR_VARSTORE_OP:\r
454 //\r
455 // IFR built from Framework VFR only has UEFI Buffer Type Storage\r
456 //\r
457 VarStore = (EFI_IFR_VARSTORE *) OpCode;\r
458 IdMap = AllocateZeroPool (sizeof (QUESTION_ID_MAP));\r
459 ASSERT (IdMap != NULL);\r
460 \r
461 IdMap->Signature = QUESTION_ID_MAP_SIGNATURE;\r
462 IdMap->VarStoreId = VarStore->VarStoreId;\r
463 IdMap->VarSize = VarStore->Size;\r
464 InitializeListHead (&IdMap->MapEntryListHead);\r
465 InsertTailList (&ThunkContext->QuestionIdMapListHead, &IdMap->Link);\r
466 break;\r
467\r
468 case EFI_IFR_NUMERIC_OP:\r
469 case EFI_IFR_CHECKBOX_OP:\r
470 case EFI_IFR_ONE_OF_OP:\r
471 case EFI_IFR_ORDERED_LIST_OP:\r
472 case EFI_IFR_STRING_OP:\r
473 //case EFI_IFR_PASSWORD_OP:\r
474 Question = (EFI_IFR_QUESTION_HEADER *)(OpCode + 1);\r
475 QuestionIdMapEntryListHead = GetMapEntryListHead (ThunkContext, Question->VarStoreId);\r
476\r
477 if (QuestionIdMapEntryListHead != NULL) {\r
478 //\r
479 // If the Question is using Buffer (EFI_IFR_VARSTORE_OP) type VarStore.\r
480 //\r
481 IdMapEntry = AllocateZeroPool (sizeof (QUESTION_ID_MAP_ENTRY));\r
482 ASSERT (IdMapEntry != NULL);\r
483\r
484 IdMapEntry->FwQId = Question->VarStoreInfo.VarOffset;\r
485 IdMapEntry->UefiQid = Question->QuestionId;\r
486 IdMapEntry->Signature = QUESTION_ID_MAP_ENTRY_SIGNATURE;\r
487\r
488 InsertTailList (QuestionIdMapEntryListHead, &IdMapEntry->Link);\r
489 }\r
490\r
59e87364 491 if (OpCode->OpCode == EFI_IFR_ONE_OF_OP) {\r
492 OneOfOpcode = (EFI_IFR_ONE_OF *) OpCode;\r
493 OneOfType = OneOfOpcode->Flags & EFI_IFR_NUMERIC_SIZE;\r
494 }\r
495\r
0368663f 496 break;\r
497 \r
498 case EFI_IFR_GUID_OP:\r
499 OptionMap = (EFI_IFR_GUID_OPTIONKEY *) OpCode;\r
64bdb454 500 if (CompareMem (&OptionMap->Guid, &gFrameworkHiiCompatbilityGuid, sizeof (EFI_GUID)) == 0) {\r
0368663f 501 if (OptionMap->ExtendOpCode == EFI_IFR_EXTEND_OP_OPTIONKEY) {\r
502 OneOfOptinMapEntryListHead = GetOneOfOptionMapEntryListHead (ThunkContext, OptionMap->QuestionId);\r
503 if (OneOfOptinMapEntryListHead == NULL) {\r
504 OneOfOptionMap = AllocateZeroPool (sizeof (ONE_OF_OPTION_MAP));\r
505 ASSERT (OneOfOptionMap != NULL);\r
506\r
507 OneOfOptionMap->Signature = ONE_OF_OPTION_MAP_SIGNATURE;\r
508 OneOfOptionMap->QuestionId = OptionMap->QuestionId;\r
59e87364 509\r
510 //\r
511 // Make sure OneOfType is initialized.\r
512 //\r
513 ASSERT (OneOfType != (UINT8) -1);\r
514 OneOfOptionMap->ValueType = OneOfType;\r
0368663f 515 InitializeListHead (&OneOfOptionMap->OneOfOptionMapEntryListHead);\r
516 OneOfOptinMapEntryListHead = &OneOfOptionMap->OneOfOptionMapEntryListHead;\r
517 InsertTailList (&ThunkContext->OneOfOptionMapListHead, &OneOfOptionMap->Link);\r
518 }\r
519 OneOfOptionMapEntry = AllocateZeroPool (sizeof (ONE_OF_OPTION_MAP_ENTRY));\r
520 ASSERT (OneOfOptionMapEntry != NULL);\r
521\r
522 OneOfOptionMapEntry->Signature = ONE_OF_OPTION_MAP_ENTRY_SIGNATURE;\r
523 OneOfOptionMapEntry->FwKey = OptionMap->KeyValue;\r
524 CopyMem (&OneOfOptionMapEntry->Value, &OptionMap->OptionValue, sizeof (EFI_IFR_TYPE_VALUE));\r
525 \r
526 InsertTailList (OneOfOptinMapEntryListHead, &OneOfOptionMapEntry->Link);\r
527 }\r
64bdb454 528 } else if (CompareMem (&OptionMap->Guid, &gTianoHiiIfrGuid, sizeof (EFI_GUID)) == 0) {\r
0368663f 529 Class = (EFI_IFR_GUID_CLASS *) OpCode;\r
530\r
531 switch (Class->ExtendOpCode) {\r
532 case EFI_IFR_EXTEND_OP_CLASS:\r
533 ThunkContext->FormSetClass = Class->Class;\r
534 break;\r
535 case EFI_IFR_EXTEND_OP_SUBCLASS:\r
59930165 536 SubClass = (EFI_IFR_GUID_SUBCLASS *) OpCode;\r
537 ThunkContext->FormSetSubClass = SubClass->SubClass;\r
0368663f 538 break;\r
539\r
540 default:\r
541 break;\r
542 }\r
543 }\r
544 break;\r
545 \r
546 default:\r
547 break;\r
548 \r
549 }\r
550\r
551 Offset += OpCode->Length;\r
552 }\r
553 //\r
554 // Only Form Package is in a Package List.\r
555 //\r
556 break;\r
557 }\r
558\r
559 Package = (EFI_HII_PACKAGE_HEADER *) (UINT8 *) Package + Package->Length;\r
560 }\r
561\r
562 FreePool (List);\r
ea58467b 563 return EFI_SUCCESS;\r
564}\r
99a83b4c 565\r
0368663f 566\r
567LIST_ENTRY *\r
568GetMapEntryListHead (\r
569 IN CONST HII_THUNK_CONTEXT *ThunkContext,\r
570 IN UINT16 VarStoreId\r
571 )\r
572{\r
573 LIST_ENTRY *Link;\r
574 QUESTION_ID_MAP *Map;\r
575\r
576 Link = GetFirstNode (&ThunkContext->QuestionIdMapListHead);\r
577\r
578 while (!IsNull (&ThunkContext->QuestionIdMapListHead, Link)) {\r
579 Map = QUESTION_ID_MAP_FROM_LINK (Link);\r
580 if (VarStoreId == Map->VarStoreId) {\r
581 return &Map->MapEntryListHead;\r
582 }\r
583 Link = GetNextNode (&ThunkContext->QuestionIdMapListHead, Link);\r
584 }\r
585 return NULL;\r
586}\r
587\r
588\r
d4775f2a 589HII_THUNK_CONTEXT *\r
590CreateThunkContext (\r
591 IN HII_THUNK_PRIVATE_DATA *Private,\r
592 IN UINTN StringPackageCount,\r
593 IN UINTN IfrPackageCount\r
594 )\r
595{\r
596 EFI_STATUS Status;\r
597 HII_THUNK_CONTEXT *ThunkContext;\r
598\r
599 ThunkContext = AllocateZeroPool (sizeof (HII_THUNK_CONTEXT));\r
600 ASSERT (ThunkContext != NULL);\r
601 \r
602 ThunkContext->Signature = HII_THUNK_CONTEXT_SIGNATURE;\r
603 ThunkContext->IfrPackageCount = IfrPackageCount;\r
604 ThunkContext->StringPackageCount = StringPackageCount;\r
605 Status = AllocateHiiHandle (&ThunkContext->FwHiiHandle);\r
606 if (EFI_ERROR (Status)) {\r
607 return NULL;\r
608 }\r
609\r
610 InitializeListHead (&ThunkContext->QuestionIdMapListHead);\r
611 InitializeListHead (&ThunkContext->OneOfOptionMapListHead);\r
612\r
613\r
614 return ThunkContext;\r
615 \r
616}\r
617\r
618VOID\r
619DestroyThunkContext (\r
620 IN HII_THUNK_CONTEXT *ThunkContext\r
621 )\r
622{\r
623 ASSERT (ThunkContext != NULL);\r
624\r
625 FreeHiiHandle (ThunkContext->FwHiiHandle);\r
626\r
627 DestroyQuestionIdMap (&ThunkContext->QuestionIdMapListHead);\r
628\r
629 DestoryOneOfOptionMap (&ThunkContext->OneOfOptionMapListHead);\r
630\r
631 RemoveEntryList (&ThunkContext->Link);\r
632\r
633 FreePool (ThunkContext);\r
634}\r
635\r
636\r
637VOID\r
638DestroyQuestionIdMap (\r
639 IN LIST_ENTRY *QuestionIdMapListHead\r
640 )\r
641{\r
642 QUESTION_ID_MAP *IdMap;\r
643 QUESTION_ID_MAP_ENTRY *IdMapEntry;\r
644 LIST_ENTRY *Link;\r
645 LIST_ENTRY *Link2;\r
646\r
647 while (!IsListEmpty (QuestionIdMapListHead)) {\r
648 Link = GetFirstNode (QuestionIdMapListHead);\r
649 \r
650 IdMap = QUESTION_ID_MAP_FROM_LINK (Link);\r
651\r
652 while (!IsListEmpty (&IdMap->MapEntryListHead)) {\r
653 Link2 = GetFirstNode (&IdMap->MapEntryListHead);\r
654 \r
59930165 655 IdMapEntry = QUESTION_ID_MAP_ENTRY_FROM_LINK (Link2);\r
d4775f2a 656\r
657 RemoveEntryList (Link2);\r
658\r
659 FreePool (IdMapEntry);\r
660 }\r
661\r
662 RemoveEntryList (Link);\r
663 FreePool (IdMap);\r
664 }\r
665}\r
666\r
667VOID\r
668DestoryOneOfOptionMap (\r
669 IN LIST_ENTRY *OneOfOptionMapListHead\r
670 )\r
671{\r
672 ONE_OF_OPTION_MAP *Map;\r
673 ONE_OF_OPTION_MAP_ENTRY *MapEntry;\r
674 LIST_ENTRY *Link;\r
675 LIST_ENTRY *Link2;\r
676\r
677 while (!IsListEmpty (OneOfOptionMapListHead)) {\r
678 Link = GetFirstNode (OneOfOptionMapListHead);\r
679 \r
680 Map = ONE_OF_OPTION_MAP_FROM_LINK (Link);\r
681\r
682 while (!IsListEmpty (&Map->OneOfOptionMapEntryListHead)) {\r
683 Link2 = GetFirstNode (&Map->OneOfOptionMapEntryListHead);\r
684 \r
59930165 685 MapEntry = ONE_OF_OPTION_MAP_ENTRY_FROM_LINK (Link2);\r
d4775f2a 686\r
687 RemoveEntryList (Link2);\r
688\r
689 FreePool (MapEntry);\r
690 }\r
691\r
692 RemoveEntryList (Link);\r
693 FreePool (Map);\r
694 }\r
695}\r
696\r
697\r
698\r
699\r