/** Free OneOfOption map list. @param OneOfOptionMapListHead Pointer to list header of OneOfOptionMap list. **/ VOID DestoryOneOfOptionMap ( IN LIST_ENTRY *OneOfOptionMapListHead ) { ONE_OF_OPTION_MAP *Map; ONE_OF_OPTION_MAP_ENTRY *MapEntry; LIST_ENTRY *Link; LIST_ENTRY *Link2; while (!IsListEmpty (OneOfOptionMapListHead)) { Link = GetFirstNode (OneOfOptionMapListHead); Map = ONE_OF_OPTION_MAP_FROM_LINK (Link); while (!IsListEmpty (&Map->OneOfOptionMapEntryListHead)) { Link2 = GetFirstNode (&Map->OneOfOptionMapEntryListHead); MapEntry = ONE_OF_OPTION_MAP_ENTRY_FROM_LINK (Link2); RemoveEntryList (Link2); FreePool (MapEntry); } RemoveEntryList (Link); FreePool (Map); } }
/** Get the ONE_OF_OPTION_MAP_ENTRY for a QuestionId that invokes the EFI_FORM_CALLBACK_PROTOCOL.Callback. The information is needed as the callback mechanism for EFI_IFR_ONE_OF_OPTION is changed from EFI_IFR_ONE_OF_OPTION in Framework IFR. Check EFI_IFR_GUID_OPTIONKEY for detailed information. @param ThunkContext The Thunk Context. @param QuestionId The Question Id. @param Type The Question Type. @param Value The One Of Option's value. @return The ONE_OF_OPTION_MAP_ENTRY found. @retval NULL If no entry is found. **/ ONE_OF_OPTION_MAP_ENTRY * GetOneOfOptionMapEntry ( IN HII_THUNK_CONTEXT *ThunkContext, IN EFI_QUESTION_ID QuestionId, IN UINT8 Type, IN EFI_IFR_TYPE_VALUE *Value ) { LIST_ENTRY *Link; LIST_ENTRY *Link2; ONE_OF_OPTION_MAP_ENTRY *OneOfOptionMapEntry; ONE_OF_OPTION_MAP *OneOfOptionMap; FORM_BROWSER_FORMSET *FormSet; FormSet = ThunkContext->FormSet; Link = GetFirstNode (&FormSet->OneOfOptionMapListHead); while (!IsNull (&FormSet->OneOfOptionMapListHead, Link)) { OneOfOptionMap = ONE_OF_OPTION_MAP_FROM_LINK(Link); if (OneOfOptionMap->QuestionId == QuestionId) { ASSERT (OneOfOptionMap->ValueType == Type); Link2 = GetFirstNode (&OneOfOptionMap->OneOfOptionMapEntryListHead); while (!IsNull (&OneOfOptionMap->OneOfOptionMapEntryListHead, Link2)) { OneOfOptionMapEntry = ONE_OF_OPTION_MAP_ENTRY_FROM_LINK (Link2); if (CompareMem (Value, &OneOfOptionMapEntry->Value, sizeof (EFI_IFR_TYPE_VALUE)) == 0) { return OneOfOptionMapEntry; } Link2 = GetNextNode (&OneOfOptionMap->OneOfOptionMapEntryListHead, Link2); } } Link = GetNextNode (&FormSet->OneOfOptionMapListHead, Link); } return NULL; }
/** Find the question's OneOfOptionMap list in FormSet based on the input question Id. @param FormSet FormSet context. @param QuestionId Unique ID to specicy the question in FormSet. @return the found OneOfOptionMap list. If not found, NULL will return. **/ LIST_ENTRY * GetOneOfOptionMapEntryListHead ( IN CONST FORM_BROWSER_FORMSET *FormSet, IN UINT16 QuestionId ) { LIST_ENTRY *Link; ONE_OF_OPTION_MAP *Map; Link = GetFirstNode (&FormSet->OneOfOptionMapListHead); while (!IsNull (&FormSet->OneOfOptionMapListHead, Link)) { Map = ONE_OF_OPTION_MAP_FROM_LINK (Link); if (QuestionId == Map->QuestionId) { return &Map->OneOfOptionMapEntryListHead; } Link = GetNextNode (&FormSet->OneOfOptionMapListHead, Link); } return NULL; }