]> git.proxmox.com Git - mirror_edk2.git/blame - EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Utility.c
clean up for IPF ICC tool chain.
[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
a9d85320 19#include <Library/DebugLib.h>\r
4259256b 20\r
a9d85320 21CONST EFI_GUID gZeroGuid = {0, 0, 0, {0, 0, 0, 0, 0, 0, 0, 0}};\r
0368663f 22\r
a9d85320 23/**\r
24 Find the corressponding UEFI HII Handle from a Framework HII Handle given.\r
25\r
26 @param Private The HII Thunk Module Private context.\r
27 @param FwHiiHandle The Framemwork HII Handle.\r
0368663f 28\r
a9d85320 29 @return NULL If Framework HII Handle is invalid.\r
30 @return The corresponding UEFI HII Handle.\r
31**/\r
ee3428bb 32EFI_HII_HANDLE\r
0368663f 33FwHiiHandleToUefiHiiHandle (\r
34 IN CONST HII_THUNK_PRIVATE_DATA *Private,\r
35 IN FRAMEWORK_EFI_HII_HANDLE FwHiiHandle\r
ee3428bb 36 )\r
37{\r
0368663f 38 HII_THUNK_CONTEXT *ThunkContext;\r
ee3428bb 39\r
0368663f 40 ASSERT (FwHiiHandle != (FRAMEWORK_EFI_HII_HANDLE) 0);\r
ee3428bb 41 ASSERT (Private != NULL);\r
42\r
0368663f 43 ThunkContext = FwHiiHandleToThunkContext (Private, FwHiiHandle);\r
ee3428bb 44\r
0368663f 45 if (ThunkContext != NULL) {\r
46 return ThunkContext->UefiHiiHandle;\r
ee3428bb 47 }\r
48 \r
49 return (EFI_HII_HANDLE) NULL;\r
50}\r
51\r
ebbd2793 52\r
a9d85320 53/**\r
54 Find the corressponding HII Thunk Context from a Framework HII Handle given.\r
55\r
56 @param Private The HII Thunk Module Private context.\r
57 @param FwHiiHandle The Framemwork HII Handle.\r
58\r
59 @return NULL If Framework HII Handle is invalid.\r
60 @return The corresponding HII Thunk Context.\r
61**/\r
0368663f 62HII_THUNK_CONTEXT *\r
63FwHiiHandleToThunkContext (\r
64 IN CONST HII_THUNK_PRIVATE_DATA *Private,\r
65 IN FRAMEWORK_EFI_HII_HANDLE FwHiiHandle\r
ebbd2793 66 )\r
67{\r
0368663f 68 LIST_ENTRY *Link;\r
69 HII_THUNK_CONTEXT *ThunkContext;\r
70\r
ebbd2793 71\r
0368663f 72 Link = GetFirstNode (&Private->ThunkContextListHead);\r
ebbd2793 73\r
0368663f 74 while (!IsNull (&Private->ThunkContextListHead, Link)) {\r
75 ThunkContext = HII_THUNK_CONTEXT_FROM_LINK (Link);\r
76\r
77 if (FwHiiHandle == ThunkContext->FwHiiHandle) {\r
78 return ThunkContext;\r
ebbd2793 79 }\r
0368663f 80\r
81 Link = GetNextNode (&Private->ThunkContextListHead, Link);\r
ebbd2793 82 }\r
83\r
0368663f 84 return NULL;\r
ebbd2793 85}\r
86\r
a9d85320 87/**\r
88 Find the corressponding HII Thunk Context from a UEFI HII Handle given.\r
89\r
90 @param Private The HII Thunk Module Private context.\r
91 @param UEFIHiiHandle The UEFI HII Handle.\r
92\r
93 @return NULL If UEFI HII Handle is invalid.\r
94 @return The corresponding HII Thunk Context.\r
95**/\r
0368663f 96HII_THUNK_CONTEXT *\r
97UefiHiiHandleToThunkContext (\r
98 IN CONST HII_THUNK_PRIVATE_DATA *Private,\r
ea58467b 99 IN EFI_HII_HANDLE UefiHiiHandle\r
100 )\r
101{\r
0368663f 102 LIST_ENTRY *Link;\r
103 HII_THUNK_CONTEXT *ThunkContext;\r
ea58467b 104\r
0368663f 105 Link = GetFirstNode (&Private->ThunkContextListHead);\r
ea58467b 106\r
0368663f 107 while (!IsNull (&Private->ThunkContextListHead, Link)) {\r
108 ThunkContext = HII_THUNK_CONTEXT_FROM_LINK (Link);\r
109\r
110 if (UefiHiiHandle == ThunkContext->UefiHiiHandle) {\r
111 return ThunkContext;\r
ea58467b 112 }\r
0368663f 113 Link = GetNextNode (&Private->ThunkContextListHead, Link);\r
ea58467b 114 }\r
115\r
0368663f 116 return NULL;\r
ea58467b 117}\r
99a83b4c 118\r
a9d85320 119/**\r
120 Find the corressponding HII Thunk Context from a Tag GUID.\r
121\r
122 @param Private The HII Thunk Module Private context.\r
123 @param Guid The Tag GUID.\r
124\r
125 @return NULL No HII Thunk Context matched the Tag GUID.\r
126 @return The corresponding HII Thunk Context.\r
127**/\r
8ea58c07 128HII_THUNK_CONTEXT *\r
129TagGuidToIfrPackThunkContext (\r
0368663f 130 IN CONST HII_THUNK_PRIVATE_DATA *Private,\r
99a83b4c 131 IN CONST EFI_GUID *Guid\r
132 )\r
133{\r
0368663f 134 LIST_ENTRY *Link;\r
135 HII_THUNK_CONTEXT *ThunkContext;\r
136\r
137 Link = GetFirstNode (&Private->ThunkContextListHead);\r
99a83b4c 138\r
0368663f 139 while (!IsNull (&Private->ThunkContextListHead, Link)) {\r
140 ThunkContext = HII_THUNK_CONTEXT_FROM_LINK (Link);\r
99a83b4c 141\r
8ea58c07 142 if (CompareGuid (Guid, &ThunkContext->TagGuid) && (ThunkContext->IfrPackageCount != 0)) {\r
143 return ThunkContext;\r
99a83b4c 144 }\r
0368663f 145\r
146 Link = GetNextNode (&Private->ThunkContextListHead, Link);\r
99a83b4c 147 }\r
148\r
0368663f 149 return NULL;\r
99a83b4c 150 \r
151}\r
152\r
a9d85320 153/**\r
154 Clean up the HII Thunk Context for a UEFI HII Handle.\r
155\r
156 @param Private The HII Thunk Module Private context.\r
157 @param UEFIHiiHandle The UEFI HII Handle.\r
0368663f 158\r
a9d85320 159**/\r
d4775f2a 160VOID\r
0368663f 161DestroyThunkContextForUefiHiiHandle (\r
162 IN HII_THUNK_PRIVATE_DATA *Private,\r
163 IN EFI_HII_HANDLE UefiHiiHandle\r
164 )\r
165{\r
166 HII_THUNK_CONTEXT *ThunkContext;\r
167\r
168 ThunkContext = UefiHiiHandleToThunkContext (Private, UefiHiiHandle);\r
169 ASSERT (ThunkContext != NULL);\r
170\r
d4775f2a 171 DestroyThunkContext (ThunkContext);\r
0368663f 172}\r
173\r
174\r
175/**\r
176 This function create a HII_THUNK_CONTEXT for a package list registered\r
177 by a module calling EFI_HII_DATABASE_PROTOCOL.NewPackageList. It records\r
178 the PackageListGuid in EFI_HII_PACKAGE_LIST_HEADER in the TagGuid in \r
179 HII_THUNK_CONTEXT created. This TagGuid will be used as a key to s\r
180\r
181**/\r
182HII_THUNK_CONTEXT *\r
183CreateThunkContextForUefiHiiHandle (\r
0368663f 184 IN EFI_HII_HANDLE UefiHiiHandle\r
185 )\r
186{\r
187 EFI_STATUS Status;\r
188 EFI_GUID PackageGuid;\r
189 HII_THUNK_CONTEXT *ThunkContext;\r
190\r
191 ThunkContext = AllocateZeroPool (sizeof (*ThunkContext));\r
192 ASSERT (ThunkContext != NULL);\r
193 \r
194 ThunkContext->Signature = HII_THUNK_CONTEXT_SIGNATURE;\r
195\r
d4775f2a 196 Status = AllocateHiiHandle (&ThunkContext->FwHiiHandle);\r
0368663f 197 if (EFI_ERROR (Status)) {\r
198 return NULL;\r
199 }\r
200 \r
201 ThunkContext->UefiHiiHandle = UefiHiiHandle;\r
202 \r
203 Status = HiiLibExtractGuidFromHiiHandle (UefiHiiHandle, &PackageGuid);\r
204 ASSERT_EFI_ERROR (Status);\r
205 \r
206 CopyGuid(&ThunkContext->TagGuid, &PackageGuid);\r
207\r
0368663f 208 return ThunkContext;\r
209}\r
210\r
211\r
a9d85320 212/**\r
213 Get the number of HII Package for a Package type.\r
214\r
215 @param PackageListHeader The Package List.\r
216 @param PackageType The Package Type.\r
217\r
218 @return The number of Package for given type.\r
219**/\r
0368663f 220UINTN\r
221GetPackageCountByType (\r
222 IN CONST EFI_HII_PACKAGE_LIST_HEADER *PackageListHeader,\r
223 IN UINT8 PackageType\r
ea58467b 224 )\r
225{\r
0368663f 226 UINTN Count;\r
227 EFI_HII_PACKAGE_HEADER *PackageHeader;\r
228\r
229 PackageHeader = (EFI_HII_PACKAGE_HEADER *) ((UINT8 *) PackageListHeader + sizeof (EFI_HII_PACKAGE_LIST_HEADER));\r
230 Count = 0;\r
231 \r
232 while (PackageHeader->Type != EFI_HII_PACKAGE_END) {\r
233 if (PackageHeader->Type == PackageType ) {\r
234 Count++;\r
235 }\r
236 PackageHeader = (EFI_HII_PACKAGE_HEADER *) ((UINT8 *) PackageHeader + PackageHeader->Length);\r
237 }\r
238 \r
239 \r
240 return Count;\r
241}\r
242\r
a9d85320 243/**\r
244 Get the Form Package from a Framework Package List.\r
0368663f 245\r
a9d85320 246 @param Packages Framework Package List.\r
99a83b4c 247\r
a9d85320 248 @return The Form Package Header found.\r
249**/\r
bc226416 250EFI_HII_PACKAGE_HEADER *\r
251GetIfrPackage (\r
252 IN CONST EFI_HII_PACKAGES *Packages\r
253 )\r
254{\r
255 UINTN Index;\r
256 TIANO_AUTOGEN_PACKAGES_HEADER **TianoAutogenPackageHdrArray;\r
257\r
258 ASSERT (Packages != NULL);\r
259\r
260 TianoAutogenPackageHdrArray = (TIANO_AUTOGEN_PACKAGES_HEADER **) (((UINT8 *) &Packages->GuidId) + sizeof (Packages->GuidId));\r
261 \r
262 for (Index = 0; Index < Packages->NumberOfPackages; Index++) {\r
263 //\r
264 // The current UEFI HII build tool generate a binary in the format defined by \r
265 // TIANO_AUTOGEN_PACKAGES_HEADER. We assume that all packages generated in\r
266 // this binary is with same package type. So the returned IfrPackageCount and StringPackageCount\r
267 // may not be the exact number of valid package number in the binary generated \r
268 // by HII Build tool.\r
269 //\r
270 switch (TianoAutogenPackageHdrArray[Index]->PackageHeader.Type) {\r
4dd76ade 271 case EFI_HII_PACKAGE_FORMS:\r
bc226416 272 return &TianoAutogenPackageHdrArray[Index]->PackageHeader;\r
273 break;\r
274 case EFI_HII_PACKAGE_STRINGS:\r
275 case EFI_HII_PACKAGE_SIMPLE_FONTS:\r
276 break;\r
277\r
278 //\r
279 // The following fonts are invalid for a module that using Framework to UEFI thunk layer.\r
280 //\r
281 case EFI_HII_PACKAGE_KEYBOARD_LAYOUT:\r
282 case EFI_HII_PACKAGE_FONTS:\r
283 case EFI_HII_PACKAGE_IMAGES:\r
284 default:\r
285 ASSERT (FALSE);\r
286 return NULL;\r
287 break;\r
288 }\r
289 }\r
290\r
291 return NULL;\r
292}\r
293\r
a9d85320 294/**\r
295 Get FormSet GUID.\r
296\r
297 ASSERT if no FormSet Opcode is found.\r
298\r
299 @param Packages Form Framework Package.\r
300 @param FormSetGuid Return the FormSet Guid.\r
301\r
302**/\r
bc226416 303VOID\r
304GetFormSetGuid (\r
305 IN EFI_HII_PACKAGE_HEADER *Package,\r
306 OUT EFI_GUID *FormSetGuid\r
307 )\r
308{\r
309 UINTN Offset;\r
310 EFI_IFR_OP_HEADER *OpCode;\r
311 EFI_IFR_FORM_SET *FormSet;\r
312\r
313 Offset = sizeof (EFI_HII_PACKAGE_HEADER);\r
314 while (Offset < Package->Length) {\r
315 OpCode = (EFI_IFR_OP_HEADER *)((UINT8 *) Package + Offset);\r
316\r
317 switch (OpCode->OpCode) {\r
318 case EFI_IFR_FORM_SET_OP:\r
319 FormSet = (EFI_IFR_FORM_SET *) OpCode;\r
66df2531 320 CopyGuid (FormSetGuid, (EFI_GUID *)(VOID *)&FormSet->Guid);\r
bc226416 321 return;\r
322 \r
323 default:\r
324 break;\r
325 \r
326 }\r
327 Offset += OpCode->Length;\r
328 }\r
329\r
330 //\r
331 // A proper IFR must have a formset opcode.\r
332 //\r
333 ASSERT (FALSE);\r
334\r
335}\r
336\r
a9d85320 337/**\r
338 Creat a Thunk Context.\r
339\r
340 ASSERT if no FormSet Opcode is found.\r
341\r
342 @param Private The HII Thunk Private Context.\r
343 @param StringPackageCount The String package count.\r
344 @param FormSetGuid The IFR Package count.\r
345\r
346 @return A newly created Thunk Context.\r
347 @retval NULL No resource to create a new Thunk Context.\r
348**/\r
349HII_THUNK_CONTEXT *\r
350CreateThunkContext (\r
351 IN HII_THUNK_PRIVATE_DATA *Private,\r
352 IN UINTN StringPackageCount,\r
353 IN UINTN IfrPackageCount\r
354 )\r
355{\r
356 EFI_STATUS Status;\r
357 HII_THUNK_CONTEXT *ThunkContext;\r
358\r
359 ThunkContext = AllocateZeroPool (sizeof (HII_THUNK_CONTEXT));\r
360 ASSERT (ThunkContext != NULL);\r
361 \r
362 ThunkContext->Signature = HII_THUNK_CONTEXT_SIGNATURE;\r
363 ThunkContext->IfrPackageCount = IfrPackageCount;\r
364 ThunkContext->StringPackageCount = StringPackageCount;\r
365 Status = AllocateHiiHandle (&ThunkContext->FwHiiHandle);\r
366 if (EFI_ERROR (Status)) {\r
367 return NULL;\r
368 }\r
369\r
370 return ThunkContext;\r
371 \r
372}\r
373\r
374/**\r
375 Destroy the Thunk Context and free up all resource.\r
bc226416 376\r
a9d85320 377 @param ThunkContext The HII Thunk Private Context to be freed.\r
378\r
379**/\r
59930165 380VOID\r
a9d85320 381DestroyThunkContext (\r
382 IN HII_THUNK_CONTEXT *ThunkContext\r
59930165 383 )\r
384{\r
a9d85320 385 ASSERT (ThunkContext != NULL);\r
59930165 386\r
a9d85320 387 FreeHiiHandle (ThunkContext->FwHiiHandle);\r
59930165 388\r
a9d85320 389 RemoveEntryList (&ThunkContext->Link);\r
390\r
391 if (ThunkContext->FormSet != NULL) {\r
392 DestroyFormSet (ThunkContext->FormSet);\r
393 }\r
394\r
395 FreePool (ThunkContext);\r
396}\r
397\r
398/**\r
399 Get the FormSet's Default Varstore ID based on the rule (Descending Priority):\r
400\r
401 1) Var Store ID of FRAMEWORK_RESERVED_VARSTORE_ID (0x01).\r
402 2) First Var Store ID.\r
403\r
404 @param FormSet The Form Set.\r
405 \r
406**/\r
407VOID\r
408GetFormsetDefaultVarstoreId (\r
409 IN OUT FORM_BROWSER_FORMSET * FormSet\r
410 )\r
411{\r
412 LIST_ENTRY *StorageList;\r
413 FORMSET_STORAGE *Storage;\r
59930165 414\r
415 //\r
a9d85320 416 // VarStoreId 0 is invalid in UEFI IFR.\r
59930165 417 //\r
a9d85320 418 FormSet->DefaultVarStoreId = 0;\r
419 StorageList = GetFirstNode (&FormSet->StorageListHead);\r
59930165 420\r
a9d85320 421 while (!IsNull (&FormSet->StorageListHead, StorageList)) {\r
422 Storage = FORMSET_STORAGE_FROM_LINK (StorageList);\r
59930165 423\r
a9d85320 424 DEBUG ((EFI_D_INFO, "FormSet %g: Found Varstore ID %x\n", &FormSet->Guid, Storage->VarStoreId));\r
59930165 425\r
a9d85320 426 if (Storage->VarStoreId == FRAMEWORK_RESERVED_VARSTORE_ID) {\r
427 FormSet->DefaultVarStoreId = FRAMEWORK_RESERVED_VARSTORE_ID;\r
59930165 428 break;\r
429 }\r
430\r
a9d85320 431 StorageList = GetNextNode (&FormSet->StorageListHead, StorageList);\r
432 }\r
433\r
434 if (FormSet->DefaultVarStoreId != FRAMEWORK_RESERVED_VARSTORE_ID) {\r
435 StorageList = GetFirstNode (&FormSet->StorageListHead);\r
436 if (!IsNull (&FormSet->StorageListHead, StorageList)) {\r
437 Storage = FORMSET_STORAGE_FROM_LINK (StorageList);\r
98b16b9d 438 FormSet->DefaultVarStoreId = Storage->VarStoreId;\r
a9d85320 439 }\r
440 \r
59930165 441 }\r
442\r
a9d85320 443 DEBUG_CODE_BEGIN ();\r
444 if (FormSet->DefaultVarStoreId == 0) {\r
445 DEBUG ((EFI_D_INFO, "FormSet %g: No Varstore Found\n", &FormSet->Guid));\r
446 } else {\r
447 DEBUG ((EFI_D_INFO, "FormSet %g: Default Varstore ID is %x\n", &FormSet->Guid, FormSet->DefaultVarStoreId));\r
448 }\r
449 DEBUG_CODE_END ();\r
450 \r
451 return;\r
59930165 452}\r
453\r
a9d85320 454/**\r
455 Fetch the Ifr binary data of a FormSet.\r
456\r
457 @param Handle PackageList Handle\r
458 @param FormSetGuid GUID of a formset. If not specified (NULL or zero\r
459 GUID), take the first FormSet found in package\r
460 list.\r
461 @param BinaryLength The length of the FormSet IFR binary.\r
462 @param BinaryData The buffer designed to receive the FormSet.\r
99a83b4c 463\r
a9d85320 464 @retval EFI_SUCCESS Buffer filled with the requested FormSet.\r
465 BufferLength was updated.\r
466 @retval EFI_INVALID_PARAMETER The handle is unknown.\r
467 @retval EFI_NOT_FOUND A form or FormSet on the requested handle cannot\r
468 be found with the requested FormId.\r
469\r
470**/\r
0368663f 471EFI_STATUS\r
a9d85320 472GetIfrBinaryData (\r
473 IN EFI_HII_HANDLE Handle,\r
474 IN OUT EFI_GUID *FormSetGuid,\r
475 OUT UINTN *BinaryLength,\r
476 OUT UINT8 **BinaryData\r
0368663f 477 )\r
478{\r
a9d85320 479 EFI_STATUS Status;\r
480 EFI_HII_PACKAGE_LIST_HEADER *HiiPackageList;\r
481 UINTN BufferSize;\r
482 UINT8 *Package;\r
483 UINT8 *OpCodeData;\r
484 UINT32 Offset;\r
485 UINT32 Offset2;\r
486 BOOLEAN ReturnDefault;\r
487 UINT32 PackageListLength;\r
488 EFI_HII_PACKAGE_HEADER PackageHeader;\r
489\r
490 OpCodeData = NULL;\r
491 Package = NULL;\r
492 ZeroMem (&PackageHeader, sizeof (EFI_HII_PACKAGE_HEADER));;\r
59e87364 493\r
494 //\r
a9d85320 495 // if FormSetGuid is NULL or zero GUID, return first FormSet in the package list\r
59e87364 496 //\r
a9d85320 497 if (FormSetGuid == NULL || CompareGuid (FormSetGuid, &gZeroGuid)) {\r
498 ReturnDefault = TRUE;\r
499 } else {\r
500 ReturnDefault = FALSE;\r
ea58467b 501 }\r
99a83b4c 502\r
0368663f 503 //\r
a9d85320 504 // Get HII PackageList\r
0368663f 505 //\r
a9d85320 506 BufferSize = 0;\r
507 HiiPackageList = NULL;\r
508 Status = mHiiDatabase->ExportPackageLists (mHiiDatabase, Handle, &BufferSize, HiiPackageList);\r
509 if (Status == EFI_BUFFER_TOO_SMALL) {\r
510 HiiPackageList = AllocatePool (BufferSize);\r
511 ASSERT (HiiPackageList != NULL);\r
512\r
513 Status = mHiiDatabase->ExportPackageLists (mHiiDatabase, Handle, &BufferSize, HiiPackageList);\r
514 }\r
515 if (EFI_ERROR (Status)) {\r
516 return Status;\r
517 }\r
0368663f 518\r
519 //\r
a9d85320 520 // Get Form package from this HII package List\r
0368663f 521 //\r
a9d85320 522 Offset = sizeof (EFI_HII_PACKAGE_LIST_HEADER);\r
523 Offset2 = 0;\r
524 CopyMem (&PackageListLength, &HiiPackageList->PackageLength, sizeof (UINT32));\r
0368663f 525\r
a9d85320 526 while (Offset < PackageListLength) {\r
527 Package = ((UINT8 *) HiiPackageList) + Offset;\r
528 CopyMem (&PackageHeader, Package, sizeof (EFI_HII_PACKAGE_HEADER));\r
0368663f 529\r
a9d85320 530 if (PackageHeader.Type == EFI_HII_PACKAGE_FORMS) {\r
0368663f 531 //\r
a9d85320 532 // Search FormSet in this Form Package\r
0368663f 533 //\r
a9d85320 534 Offset2 = sizeof (EFI_HII_PACKAGE_HEADER);\r
535 while (Offset2 < PackageHeader.Length) {\r
536 OpCodeData = Package + Offset2;\r
537\r
538 if (((EFI_IFR_OP_HEADER *) OpCodeData)->OpCode == EFI_IFR_FORM_SET_OP) {\r
0368663f 539 //\r
a9d85320 540 // Check whether return default FormSet\r
0368663f 541 //\r
a9d85320 542 if (ReturnDefault) {\r
543 break;\r
59e87364 544 }\r
545\r
a9d85320 546 //\r
547 // FormSet GUID is specified, check it\r
548 //\r
549 if (CompareGuid (FormSetGuid, (EFI_GUID *)(OpCodeData + sizeof (EFI_IFR_OP_HEADER)))) {\r
550 break;\r
0368663f 551 }\r
0368663f 552 }\r
553\r
a9d85320 554 Offset2 += ((EFI_IFR_OP_HEADER *) OpCodeData)->Length;\r
555 }\r
556\r
557 if (Offset2 < PackageHeader.Length) {\r
558 //\r
559 // Target formset found\r
560 //\r
561 break;\r
0368663f 562 }\r
0368663f 563 }\r
564\r
a9d85320 565 Offset += PackageHeader.Length;\r
0368663f 566 }\r
567\r
a9d85320 568 if (Offset >= PackageListLength) {\r
569 //\r
570 // Form package not found in this Package List\r
571 //\r
572 gBS->FreePool (HiiPackageList);\r
573 return EFI_NOT_FOUND;\r
574 }\r
0368663f 575\r
a9d85320 576 if (ReturnDefault && FormSetGuid != NULL) {\r
577 //\r
578 // Return the default FormSet GUID\r
579 //\r
580 CopyMem (FormSetGuid, &((EFI_IFR_FORM_SET *) OpCodeData)->Guid, sizeof (EFI_GUID));\r
0368663f 581 }\r
0368663f 582\r
a9d85320 583 //\r
584 // To determine the length of a whole FormSet IFR binary, one have to parse all the Opcodes\r
585 // in this FormSet; So, here just simply copy the data from start of a FormSet to the end\r
586 // of the Form Package.\r
587 //\r
588 *BinaryLength = PackageHeader.Length - Offset2;\r
589 *BinaryData = AllocateCopyPool (*BinaryLength, OpCodeData);\r
0368663f 590\r
a9d85320 591 gBS->FreePool (HiiPackageList);\r
d4775f2a 592\r
a9d85320 593 if (*BinaryData == NULL) {\r
594 return EFI_OUT_OF_RESOURCES;\r
d4775f2a 595 }\r
596\r
a9d85320 597 return EFI_SUCCESS;\r
d4775f2a 598}\r
599\r
a9d85320 600/**\r
601 Initialize the internal data structure of a FormSet.\r
d4775f2a 602\r
a9d85320 603 @param Handle PackageList Handle\r
604 @param FormSetGuid GUID of a formset. If not specified (NULL or zero\r
605 GUID), take the first FormSet found in package\r
606 list.\r
607 @param FormSet FormSet data structure.\r
d4775f2a 608\r
a9d85320 609 @retval EFI_SUCCESS The function completed successfully.\r
610 @retval EFI_NOT_FOUND The specified FormSet could not be found.\r
d4775f2a 611\r
a9d85320 612**/\r
613EFI_STATUS\r
614InitializeFormSet (\r
615 IN EFI_HII_HANDLE Handle,\r
616 IN OUT EFI_GUID *FormSetGuid,\r
617 OUT FORM_BROWSER_FORMSET *FormSet\r
d4775f2a 618 )\r
619{\r
a9d85320 620 EFI_STATUS Status;\r
d4775f2a 621\r
a9d85320 622 Status = GetIfrBinaryData (Handle, FormSetGuid, &FormSet->IfrBinaryLength, &FormSet->IfrBinaryData);\r
623 if (EFI_ERROR (Status)) {\r
624 return Status;\r
625 }\r
d4775f2a 626\r
a9d85320 627 FormSet->HiiHandle = Handle;\r
628 CopyMem (&FormSet->Guid, FormSetGuid, sizeof (EFI_GUID));\r
d4775f2a 629\r
a9d85320 630 //\r
631 // Parse the IFR binary OpCodes\r
632 //\r
633 Status = ParseOpCodes (FormSet);\r
634 if (EFI_ERROR (Status)) {\r
635 return Status;\r
d4775f2a 636 }\r
a9d85320 637\r
638 GetFormsetDefaultVarstoreId (FormSet);\r
639 return Status;\r
d4775f2a 640}\r
641\r
a9d85320 642/**\r
643 Parse the Form Package and build a FORM_BROWSER_FORMSET structure.\r
d4775f2a 644\r
a9d85320 645 @param UefiHiiHandle PackageList Handle\r
d4775f2a 646\r
a9d85320 647 @return A pointer to FORM_BROWSER_FORMSET.\r
d4775f2a 648\r
a9d85320 649**/\r
650FORM_BROWSER_FORMSET *\r
651ParseFormSet (\r
652 IN EFI_HII_HANDLE UefiHiiHandle\r
653 )\r
654{\r
655 FORM_BROWSER_FORMSET *FormSet;\r
656 EFI_GUID FormSetGuid;\r
657 EFI_STATUS Status;\r
658 \r
659 FormSet = AllocateZeroPool (sizeof (FORM_BROWSER_FORMSET)); \r
660 ASSERT (FormSet != NULL);\r
d4775f2a 661\r
a9d85320 662 CopyGuid (&FormSetGuid, &gZeroGuid);\r
663 Status = InitializeFormSet (UefiHiiHandle, &FormSetGuid, FormSet);\r
664 ASSERT_EFI_ERROR (Status);\r
d4775f2a 665\r
a9d85320 666 return FormSet;\r
d4775f2a 667}\r
668\r