for (Link = BlockData->DefaultValueEntry.ForwardLink; Link != &BlockData->DefaultValueEntry; Link = Link->ForwardLink) {\r
DefaultValueArray = BASE_CR (Link, IFR_DEFAULT_DATA, Entry);\r
if (DefaultValueArray->DefaultId == DefaultValueData->DefaultId) {\r
- if (DefaultValueData->OpCode == EFI_IFR_DEFAULT_OP) {\r
- //\r
- // Update the default value array in BlockData.\r
- //\r
- DefaultValueArray->Value = DefaultValueData->Value;\r
- } else if (DefaultValueArray->OpCode != EFI_IFR_DEFAULT_OP) {\r
+ //\r
+ // DEFAULT_VALUE_FROM_OPCODE has high priority, DEFAULT_VALUE_FROM_DEFAULT has low priority.\r
+ //\r
+ if (DefaultValueData->Type > DefaultValueArray->Type) {\r
//\r
// Update the default value array in BlockData.\r
//\r
DefaultValueArray->Value = DefaultValueData->Value;\r
+ DefaultValueArray->Type = DefaultValueData->Type;\r
+ DefaultValueArray->Cleaned = DefaultValueData->Cleaned;\r
}\r
- FreePool (DefaultValueData);\r
- return;\r
- } else if (DefaultValueArray->DefaultId > DefaultValueData->DefaultId) {\r
- //\r
- // Insert new default value data in the front of this default value array.\r
- //\r
- InsertTailList (Link, &DefaultValueData->Entry);\r
return;\r
- }\r
+ } \r
}\r
\r
//\r
// Insert new default value data in tail.\r
//\r
- InsertTailList (Link, &DefaultValueData->Entry);\r
- return;\r
+ DefaultValueArray = AllocateZeroPool (sizeof (IFR_DEFAULT_DATA));\r
+ ASSERT (DefaultValueArray != NULL);\r
+ CopyMem (DefaultValueArray, DefaultValueData, sizeof (IFR_DEFAULT_DATA));\r
+ InsertTailList (Link, &DefaultValueArray->Entry);\r
}\r
\r
/**\r
EFI_IFR_CHECKBOX *IfrCheckBox;\r
EFI_IFR_PASSWORD *IfrPassword;\r
EFI_IFR_STRING *IfrString;\r
- IFR_DEFAULT_DATA *DefaultData;\r
+ IFR_DEFAULT_DATA DefaultData;\r
+ IFR_DEFAULT_DATA *DefaultDataPtr;\r
IFR_BLOCK_DATA *BlockData;\r
CHAR16 *VarStoreName;\r
UINT16 VarOffset;\r
UINT16 VarWidth;\r
- EFI_STRING_ID VarDefaultName;\r
UINT16 VarDefaultId;\r
EFI_STRING GuidStr;\r
EFI_STRING NameStr;\r
EFI_STRING TempStr;\r
UINTN LengthString;\r
BOOLEAN FirstOneOfOption;\r
+ LIST_ENTRY *LinkData;\r
+ LIST_ENTRY *LinkDefault;\r
\r
LengthString = 0;\r
Status = EFI_SUCCESS;\r
NameStr = NULL;\r
TempStr = NULL;\r
BlockData = NULL;\r
- DefaultData = NULL;\r
- VarDefaultName = 0;\r
+ DefaultDataPtr = NULL;\r
FirstOneOfOption = FALSE;\r
+ ZeroMem (&DefaultData, sizeof (IFR_DEFAULT_DATA));\r
\r
//\r
// Go through the form package to parse OpCode one by one.\r
//\r
// Add new the map between default id and default name.\r
//\r
- DefaultData = (IFR_DEFAULT_DATA *) AllocateZeroPool (sizeof (IFR_DEFAULT_DATA));\r
- if (DefaultData == NULL) {\r
+ DefaultDataPtr = (IFR_DEFAULT_DATA *) AllocateZeroPool (sizeof (IFR_DEFAULT_DATA));\r
+ if (DefaultDataPtr == NULL) {\r
Status = EFI_OUT_OF_RESOURCES;\r
goto Done;\r
}\r
- DefaultData->DefaultId = ((EFI_IFR_DEFAULTSTORE *) IfrOpHdr)->DefaultId;\r
- InsertTailList (&DefaultIdArray->Entry, &DefaultData->Entry);\r
- DefaultData = NULL;\r
+ DefaultDataPtr->DefaultId = ((EFI_IFR_DEFAULTSTORE *) IfrOpHdr)->DefaultId;\r
+ InsertTailList (&DefaultIdArray->Entry, &DefaultDataPtr->Entry);\r
+ DefaultDataPtr = NULL;\r
break;\r
\r
case EFI_IFR_FORM_OP:\r
//\r
// Numeric minimum value will be used as default value when no default is specified. \r
//\r
-\r
- //\r
- // Set standard ID\r
- //\r
- VarDefaultId = EFI_HII_DEFAULT_CLASS_STANDARD;\r
- //\r
- // Prepare new DefaultValue\r
- //\r
- DefaultData = (IFR_DEFAULT_DATA *) AllocateZeroPool (sizeof (IFR_DEFAULT_DATA));\r
- if (DefaultData == NULL) {\r
- Status = EFI_OUT_OF_RESOURCES;\r
- goto Done;\r
- }\r
- DefaultData->OpCode = IfrOpHdr->OpCode;\r
- DefaultData->DefaultId = VarDefaultId;\r
-\r
+ DefaultData.Type = DefaultValueFromDefault;\r
switch (IfrOneOf->Flags & EFI_IFR_NUMERIC_SIZE) {\r
case EFI_IFR_NUMERIC_SIZE_1:\r
- DefaultData->Value = (UINT64) IfrOneOf->data.u8.MinValue;\r
+ DefaultData.Value = (UINT64) IfrOneOf->data.u8.MinValue;\r
break;\r
\r
case EFI_IFR_NUMERIC_SIZE_2:\r
- CopyMem (&DefaultData->Value, &IfrOneOf->data.u16.MinValue, sizeof (UINT16));\r
+ CopyMem (&DefaultData.Value, &IfrOneOf->data.u16.MinValue, sizeof (UINT16));\r
break;\r
\r
case EFI_IFR_NUMERIC_SIZE_4:\r
- CopyMem (&DefaultData->Value, &IfrOneOf->data.u32.MinValue, sizeof (UINT32));\r
+ CopyMem (&DefaultData.Value, &IfrOneOf->data.u32.MinValue, sizeof (UINT32));\r
break;\r
\r
case EFI_IFR_NUMERIC_SIZE_8:\r
- CopyMem (&DefaultData->Value, &IfrOneOf->data.u64.MinValue, sizeof (UINT64));\r
+ CopyMem (&DefaultData.Value, &IfrOneOf->data.u64.MinValue, sizeof (UINT64));\r
break;\r
}\r
//\r
- // Add DefaultValue into current BlockData\r
- //\r
- InsertDefaultValue (BlockData, DefaultData); \r
+ // Set default value base on the DefaultId list get from IFR data.\r
+ // \r
+ for (LinkData = DefaultIdArray->Entry.ForwardLink; LinkData != &DefaultIdArray->Entry; LinkData = LinkData->ForwardLink) {\r
+ DefaultDataPtr = BASE_CR (LinkData, IFR_DEFAULT_DATA, Entry); \r
+ DefaultData.DefaultId = DefaultDataPtr->DefaultId;\r
+ InsertDefaultValue (BlockData, &DefaultData);\r
+ }\r
}\r
break;\r
\r
//\r
// Prepare new DefaultValue\r
//\r
- DefaultData = (IFR_DEFAULT_DATA *) AllocateZeroPool (sizeof (IFR_DEFAULT_DATA));\r
- if (DefaultData == NULL) {\r
- Status = EFI_OUT_OF_RESOURCES;\r
- goto Done;\r
- }\r
- DefaultData->OpCode = IfrOpHdr->OpCode;\r
- DefaultData->DefaultId = VarDefaultId;\r
+ DefaultData.DefaultId = VarDefaultId;\r
if ((IfrCheckBox->Flags & EFI_IFR_CHECKBOX_DEFAULT) == EFI_IFR_CHECKBOX_DEFAULT) {\r
//\r
// When flag is set, defautl value is TRUE.\r
//\r
- DefaultData->Value = 1;\r
+ DefaultData.Type = DefaultValueFromFlag;\r
+ DefaultData.Value = 1;\r
} else {\r
//\r
// When flag is not set, defautl value is FASLE.\r
//\r
- DefaultData->Value = 0;\r
+ DefaultData.Type = DefaultValueFromDefault;\r
+ DefaultData.Value = 0;\r
}\r
//\r
// Add DefaultValue into current BlockData\r
//\r
- InsertDefaultValue (BlockData, DefaultData);\r
+ InsertDefaultValue (BlockData, &DefaultData);\r
\r
//\r
// Add default value for Manufacture ID by CheckBox Flag\r
//\r
// Prepare new DefaultValue\r
//\r
- DefaultData = (IFR_DEFAULT_DATA *) AllocateZeroPool (sizeof (IFR_DEFAULT_DATA));\r
- if (DefaultData == NULL) {\r
- Status = EFI_OUT_OF_RESOURCES;\r
- goto Done;\r
- }\r
- DefaultData->OpCode = IfrOpHdr->OpCode;\r
- DefaultData->DefaultId = VarDefaultId;\r
+ DefaultData.DefaultId = VarDefaultId;\r
if ((IfrCheckBox->Flags & EFI_IFR_CHECKBOX_DEFAULT_MFG) == EFI_IFR_CHECKBOX_DEFAULT_MFG) {\r
//\r
// When flag is set, defautl value is TRUE.\r
//\r
- DefaultData->Value = 1;\r
+ DefaultData.Type = DefaultValueFromFlag;\r
+ DefaultData.Value = 1;\r
} else {\r
//\r
// When flag is not set, defautl value is FASLE.\r
//\r
- DefaultData->Value = 0;\r
+ DefaultData.Type = DefaultValueFromDefault; \r
+ DefaultData.Value = 0;\r
}\r
//\r
// Add DefaultValue into current BlockData\r
//\r
- InsertDefaultValue (BlockData, DefaultData);\r
+ InsertDefaultValue (BlockData, &DefaultData);\r
break;\r
\r
case EFI_IFR_STRING_OP:\r
break;\r
}\r
\r
+ //\r
+ // 1. Set default value for OneOf option when flag field has default attribute.\r
+ //\r
if (((IfrOneOfOption->Flags & EFI_IFR_OPTION_DEFAULT) == EFI_IFR_OPTION_DEFAULT) ||\r
- (BlockData->OpCode == EFI_IFR_ONE_OF_OP && FirstOneOfOption)) {\r
+ ((IfrOneOfOption->Flags & EFI_IFR_OPTION_DEFAULT_MFG) == EFI_IFR_OPTION_DEFAULT_MFG)) {\r
//\r
// This flag is used to specify whether this option is the first. Set it to FALSE for the following options. \r
// The first oneof option value will be used as default value when no default value is specified. \r
//\r
FirstOneOfOption = FALSE;\r
- //\r
- // Set standard ID to Manufacture ID\r
- //\r
- VarDefaultId = EFI_HII_DEFAULT_CLASS_STANDARD;\r
- //\r
+ \r
// Prepare new DefaultValue\r
//\r
- DefaultData = (IFR_DEFAULT_DATA *) AllocateZeroPool (sizeof (IFR_DEFAULT_DATA));\r
- if (DefaultData == NULL) {\r
- Status = EFI_OUT_OF_RESOURCES;\r
- goto Done;\r
+ DefaultData.Type = DefaultValueFromFlag;\r
+ DefaultData.Value = IfrOneOfOption->Value.u64;\r
+ if ((IfrOneOfOption->Flags & EFI_IFR_OPTION_DEFAULT) == EFI_IFR_OPTION_DEFAULT) {\r
+ DefaultData.DefaultId = EFI_HII_DEFAULT_CLASS_STANDARD;\r
+ InsertDefaultValue (BlockData, &DefaultData);\r
+ } \r
+ if ((IfrOneOfOption->Flags & EFI_IFR_OPTION_DEFAULT_MFG) == EFI_IFR_OPTION_DEFAULT_MFG) {\r
+ DefaultData.DefaultId = EFI_HII_DEFAULT_CLASS_MANUFACTURING;\r
+ InsertDefaultValue (BlockData, &DefaultData);\r
}\r
- DefaultData->OpCode = IfrOpHdr->OpCode;\r
- DefaultData->DefaultId = VarDefaultId;\r
- DefaultData->Value = IfrOneOfOption->Value.u64;\r
- //\r
- // Add DefaultValue into current BlockData\r
- //\r
- InsertDefaultValue (BlockData, DefaultData);\r
- }\r
\r
- if ((IfrOneOfOption->Flags & EFI_IFR_OPTION_DEFAULT_MFG) == EFI_IFR_OPTION_DEFAULT_MFG) {\r
- //\r
- // Set default ID to Manufacture ID\r
- //\r
- VarDefaultId = EFI_HII_DEFAULT_CLASS_MANUFACTURING;\r
+ \r
+ }\r
+ \r
+ //\r
+ // 2. Set as the default value when this is the first option.\r
+ // The first oneof option value will be used as default value when no default value is specified. \r
+ //\r
+ if (FirstOneOfOption) {\r
+ // This flag is used to specify whether this option is the first. Set it to FALSE for the following options. \r
+ FirstOneOfOption = FALSE;\r
+ \r
//\r
// Prepare new DefaultValue\r
- //\r
- DefaultData = (IFR_DEFAULT_DATA *) AllocateZeroPool (sizeof (IFR_DEFAULT_DATA));\r
- if (DefaultData == NULL) {\r
- Status = EFI_OUT_OF_RESOURCES;\r
- goto Done;\r
- }\r
- DefaultData->OpCode = IfrOpHdr->OpCode;\r
- DefaultData->DefaultId = VarDefaultId;\r
- DefaultData->Value = IfrOneOfOption->Value.u64;\r
- //\r
- // Add DefaultValue into current BlockData\r
- //\r
- InsertDefaultValue (BlockData, DefaultData);\r
+ // \r
+ DefaultData.Type = DefaultValueFromDefault;\r
+ DefaultData.Value = IfrOneOfOption->Value.u64; \r
+ for (LinkData = DefaultIdArray->Entry.ForwardLink; LinkData != &DefaultIdArray->Entry; LinkData = LinkData->ForwardLink) {\r
+ DefaultDataPtr = BASE_CR (LinkData, IFR_DEFAULT_DATA, Entry); \r
+ DefaultData.DefaultId = DefaultDataPtr->DefaultId;\r
+ InsertDefaultValue (BlockData, &DefaultData);\r
+ } \r
}\r
break;\r
\r
//\r
// Prepare new DefaultValue\r
//\r
- DefaultData = (IFR_DEFAULT_DATA *) AllocateZeroPool (sizeof (IFR_DEFAULT_DATA));\r
- if (DefaultData == NULL) {\r
- Status = EFI_OUT_OF_RESOURCES;\r
- goto Done;\r
+ DefaultData.Type = DefaultValueFromOpcode;\r
+ DefaultData.DefaultId = VarDefaultId;\r
+ DefaultData.Value = IfrDefault->Value.u64; \r
+ \r
+ // If the value field is expression, set the cleaned flag.\r
+ if (IfrDefault->Type == EFI_IFR_TYPE_OTHER) {\r
+ DefaultData.Cleaned = TRUE;\r
}\r
- DefaultData->OpCode = IfrOpHdr->OpCode;\r
- DefaultData->DefaultId = VarDefaultId;\r
- DefaultData->Value = IfrDefault->Value.u64;\r
//\r
// Add DefaultValue into current BlockData\r
//\r
- InsertDefaultValue (BlockData, DefaultData);\r
+ InsertDefaultValue (BlockData, &DefaultData);\r
+ \r
+ //\r
+ // After insert the default value, reset the cleaned value for next \r
+ // time used. If not set here, need to set the value before everytime \r
+ // use it.\r
+ //\r
+ DefaultData.Cleaned = FALSE;\r
break;\r
case EFI_IFR_END_OP:\r
//\r
}\r
\r
Done:\r
+ for (LinkData = VarStorageData->BlockEntry.ForwardLink; LinkData != &VarStorageData->BlockEntry; LinkData = LinkData->ForwardLink) {\r
+ BlockData = BASE_CR (LinkData, IFR_BLOCK_DATA, Entry);\r
+ for (LinkDefault = BlockData->DefaultValueEntry.ForwardLink; LinkDefault != &BlockData->DefaultValueEntry; ) {\r
+ DefaultDataPtr = BASE_CR (LinkDefault, IFR_DEFAULT_DATA, Entry);\r
+ LinkDefault = LinkDefault->ForwardLink;\r
+ if (DefaultDataPtr->Cleaned == TRUE) {\r
+ RemoveEntryList (&DefaultDataPtr->Entry);\r
+ FreePool (DefaultDataPtr);\r
+ }\r
+ }\r
+ }\r
+\r
return Status; \r
}\r
\r
EFI_STATUS Status;\r
UINT8 *HiiFormPackage;\r
UINTN PackageSize;\r
- UINTN ResultSize;\r
IFR_BLOCK_DATA *RequestBlockArray;\r
IFR_BLOCK_DATA *BlockData;\r
IFR_BLOCK_DATA *NextBlockData;\r
NameStr = NULL;\r
PathStr = NULL;\r
HiiFormPackage = NULL;\r
- ResultSize = 0;\r
PackageSize = 0;\r
DataExist = FALSE;\r
Progress = *Request;\r