EFI_GUID gTianoHiiIfrGuid = EFI_IFR_TIANO_GUID;\r
\r
\r
-EFI_GUID *\r
-GetGuidOfFirstFormset (\r
- CONST EFI_HII_FORM_PACKAGE * FormPackage\r
-) \r
-{\r
- UINT8 *StartOfNextPackage;\r
- EFI_IFR_OP_HEADER *OpCodeData;\r
-\r
- StartOfNextPackage = (UINT8 *) FormPackage + FormPackage->Header.Length;\r
- OpCodeData = (EFI_IFR_OP_HEADER *) (FormPackage + 1);\r
-\r
- while ((UINT8 *) OpCodeData < StartOfNextPackage) {\r
- if (OpCodeData->OpCode == EFI_IFR_FORM_SET_OP) {\r
- return AllocateCopyPool (sizeof(EFI_GUID), &(((EFI_IFR_FORM_SET *) OpCodeData)->Guid));\r
- }\r
- OpCodeData = (EFI_IFR_OP_HEADER *) ((UINT8 *) OpCodeData + OpCodeData->Length);\r
- }\r
-\r
- ASSERT (FALSE);\r
-\r
- return NULL;\r
-}\r
-\r
EFI_HII_HANDLE\r
FwHiiHandleToUefiHiiHandle (\r
IN CONST HII_THUNK_PRIVATE_DATA *Private,\r
return NULL;\r
}\r
\r
+VOID\r
+GetAttributesOfFirstFormSet (\r
+ IN OUT HII_THUNK_CONTEXT *ThunkContext\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_HII_PACKAGE_LIST_HEADER *List;\r
+ EFI_HII_PACKAGE_HEADER *Package;\r
+ UINTN Size;\r
+ EFI_IFR_OP_HEADER *OpCode;\r
+ UINTN Offset;\r
+ EFI_IFR_GUID_CLASS *Class;\r
+ EFI_IFR_FORM_SET *FormSet;\r
+ EFI_IFR_GUID_SUBCLASS *SubClass;\r
+\r
+ Status = HiiLibExportPackageLists (ThunkContext->UefiHiiHandle, &List, &Size);\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ //\r
+ // There must be at least one EFI_HII_PACKAGE_FORM in the package list.\r
+ //\r
+ ASSERT (GetPackageCountByType (List, EFI_HII_PACKAGE_FORM) >= 1);\r
+\r
+ //\r
+ // Skip the package list header.\r
+ //\r
+ Package = (EFI_HII_PACKAGE_HEADER *) (List + 1);\r
+\r
+ while (Package->Type != EFI_HII_PACKAGE_END) {\r
+\r
+ if (Package->Type == EFI_HII_PACKAGE_FORM) {\r
+\r
+ //\r
+ // Skip the package header\r
+ //\r
+ Offset = sizeof (EFI_HII_PACKAGE_HEADER);\r
+ while (Offset < Package->Length) {\r
+ OpCode = (EFI_IFR_OP_HEADER *)((UINT8 *) Package + Offset);\r
+\r
+ switch (OpCode->OpCode) {\r
+ case EFI_IFR_FORM_SET_OP:\r
+ FormSet = (EFI_IFR_FORM_SET *) OpCode;\r
+ ThunkContext->FormSetTitle = FormSet->FormSetTitle;\r
+ ThunkContext->FormSetHelp = FormSet->Help;\r
+ break;\r
+ \r
+\r
+ case EFI_IFR_GUID_OP:\r
+ Class = (EFI_IFR_GUID_CLASS*) OpCode;\r
+ if (CompareGuid (&Class->Guid, &gTianoHiiIfrGuid)) {\r
+ Class = (EFI_IFR_GUID_CLASS *) OpCode;\r
+\r
+ switch (Class->ExtendOpCode) {\r
+ case EFI_IFR_EXTEND_OP_CLASS:\r
+ ThunkContext->FormSetClass = Class->Class;\r
+ break;\r
+ case EFI_IFR_EXTEND_OP_SUBCLASS:\r
+ SubClass = (EFI_IFR_GUID_SUBCLASS *) OpCode;\r
+ ThunkContext->FormSetSubClass = SubClass->SubClass;\r
+ break;\r
+\r
+ default:\r
+ break;\r
+ }\r
+ }\r
+ break;\r
+ \r
+ default:\r
+ break;\r
+ \r
+ }\r
+\r
+ Offset += OpCode->Length;\r
+ }\r
+ //\r
+ // The attributes of first FormSet is ready now.\r
+ //\r
+ FreePool (List);\r
+ return;\r
+ \r
+ break;\r
+ }\r
+\r
+ Package = (EFI_HII_PACKAGE_HEADER *) (UINT8 *) Package + Package->Length;\r
+ }\r
+\r
+}\r
+\r
\r
EFI_STATUS\r
CreateQuestionIdMap (\r
ONE_OF_OPTION_MAP *OneOfOptionMap;\r
ONE_OF_OPTION_MAP_ENTRY *OneOfOptionMapEntry;\r
EFI_IFR_GUID_CLASS *Class;\r
+ EFI_IFR_GUID_SUBCLASS *SubClass;\r
\r
\r
Status = HiiLibExportPackageLists (ThunkContext->UefiHiiHandle, &List, &Size);\r
ThunkContext->FormSetClass = Class->Class;\r
break;\r
case EFI_IFR_EXTEND_OP_SUBCLASS:\r
- ThunkContext->FormSetSubClass = ((EFI_IFR_GUID_SUBCLASS *) Class)->SubClass;\r
+ SubClass = (EFI_IFR_GUID_SUBCLASS *) OpCode;\r
+ ThunkContext->FormSetSubClass = SubClass->SubClass;\r
break;\r
\r
default:\r
while (!IsListEmpty (&IdMap->MapEntryListHead)) {\r
Link2 = GetFirstNode (&IdMap->MapEntryListHead);\r
\r
- IdMapEntry = QUESTION_ID_MAP_ENTRY_FROM_LINK (Link);\r
+ IdMapEntry = QUESTION_ID_MAP_ENTRY_FROM_LINK (Link2);\r
\r
RemoveEntryList (Link2);\r
\r
while (!IsListEmpty (&Map->OneOfOptionMapEntryListHead)) {\r
Link2 = GetFirstNode (&Map->OneOfOptionMapEntryListHead);\r
\r
- MapEntry = ONE_OF_OPTION_MAP_ENTRY_FROM_LINK (Link);\r
+ MapEntry = ONE_OF_OPTION_MAP_ENTRY_FROM_LINK (Link2);\r
\r
RemoveEntryList (Link2);\r
\r