LIST_ENTRY *Link;\r
BOOLEAN Find;\r
FORM_BROWSER_CONFIG_REQUEST *ConfigInfo;\r
+ UINTN MaxLen;\r
\r
Storage = Question->Storage;\r
if (Storage == NULL) {\r
Question->VarStoreInfo.VarOffset,\r
Question->StorageWidth\r
);\r
+ HiiToLower(RequestElement);\r
Question->BlockName = AllocateCopyPool ((StrLen + 1) * sizeof (CHAR16), RequestElement);\r
} else {\r
StrLen = UnicodeSPrint (RequestElement, 30 * sizeof (CHAR16), L"&%s", Question->VariableName);\r
//\r
FormsetStorage = GetFstStgFromVarId(FormSet, Question->VarStoreId);\r
ASSERT (FormsetStorage != NULL);\r
+ StringSize = (FormsetStorage->ConfigRequest != NULL) ? StrSize (FormsetStorage->ConfigRequest) : sizeof (CHAR16);\r
+ MaxLen = StringSize / sizeof (CHAR16) + FormsetStorage->SpareStrLen;\r
\r
//\r
// Append <RequestElement> to <ConfigRequest>\r
//\r
// Old String buffer is not sufficient for RequestElement, allocate a new one\r
//\r
- StringSize = (FormsetStorage->ConfigRequest != NULL) ? StrSize (FormsetStorage->ConfigRequest) : sizeof (CHAR16);\r
- NewStr = AllocateZeroPool (StringSize + CONFIG_REQUEST_STRING_INCREMENTAL * sizeof (CHAR16));\r
+ MaxLen = StringSize / sizeof (CHAR16) + CONFIG_REQUEST_STRING_INCREMENTAL;\r
+ NewStr = AllocateZeroPool (MaxLen * sizeof (CHAR16));\r
ASSERT (NewStr != NULL);\r
if (FormsetStorage->ConfigRequest != NULL) {\r
CopyMem (NewStr, FormsetStorage->ConfigRequest, StringSize);\r
FormsetStorage->SpareStrLen = CONFIG_REQUEST_STRING_INCREMENTAL;\r
}\r
\r
- StrCat (FormsetStorage->ConfigRequest, RequestElement);\r
+ StrCatS (FormsetStorage->ConfigRequest, MaxLen, RequestElement);\r
FormsetStorage->ElementCount++;\r
FormsetStorage->SpareStrLen -= StrLen;\r
\r
ConfigInfo->Storage = FormsetStorage->BrowserStorage;\r
InsertTailList(&Form->ConfigRequestHead, &ConfigInfo->Link);\r
}\r
+ StringSize = (ConfigInfo->ConfigRequest != NULL) ? StrSize (ConfigInfo->ConfigRequest) : sizeof (CHAR16);\r
+ MaxLen = StringSize / sizeof (CHAR16) + ConfigInfo->SpareStrLen;\r
\r
//\r
// Append <RequestElement> to <ConfigRequest>\r
//\r
// Old String buffer is not sufficient for RequestElement, allocate a new one\r
//\r
- StringSize = (ConfigInfo->ConfigRequest != NULL) ? StrSize (ConfigInfo->ConfigRequest) : sizeof (CHAR16);\r
- NewStr = AllocateZeroPool (StringSize + CONFIG_REQUEST_STRING_INCREMENTAL * sizeof (CHAR16));\r
+ MaxLen = StringSize / sizeof (CHAR16) + CONFIG_REQUEST_STRING_INCREMENTAL;\r
+ NewStr = AllocateZeroPool (MaxLen * sizeof (CHAR16));\r
ASSERT (NewStr != NULL);\r
if (ConfigInfo->ConfigRequest != NULL) {\r
CopyMem (NewStr, ConfigInfo->ConfigRequest, StringSize);\r
ConfigInfo->SpareStrLen = CONFIG_REQUEST_STRING_INCREMENTAL;\r
}\r
\r
- StrCat (ConfigInfo->ConfigRequest, RequestElement);\r
+ StrCatS (ConfigInfo->ConfigRequest, MaxLen, RequestElement);\r
ConfigInfo->ElementCount++;\r
ConfigInfo->SpareStrLen -= StrLen;\r
return EFI_SUCCESS;\r
Default = QUESTION_DEFAULT_FROM_LINK (Link);\r
RemoveEntryList (&Default->Link);\r
\r
+ if (Default->Value.Buffer != NULL) {\r
+ FreePool (Default->Value.Buffer);\r
+ }\r
FreePool (Default);\r
}\r
\r
(Operand == EFI_IFR_TO_UPPER_OP) ||\r
(Operand == EFI_IFR_MAP_OP) ||\r
(Operand == EFI_IFR_VERSION_OP) ||\r
- (Operand == EFI_IFR_SECURITY_OP)) {\r
+ (Operand == EFI_IFR_SECURITY_OP) ||\r
+ (Operand == EFI_IFR_MATCH2_OP)) {\r
return TRUE;\r
} else {\r
return FALSE;\r
IN UINT8 Operand\r
)\r
{\r
- return Operand > EFI_IFR_WARNING_IF_OP ? TRUE : FALSE;\r
+ return Operand > EFI_IFR_MATCH2_OP ? TRUE : FALSE;\r
}\r
\r
/**\r
CopyMem (&ExpressionOpCode->Guid, &((EFI_IFR_SECURITY *) OpCodeData)->Permissions, sizeof (EFI_GUID));\r
break;\r
\r
+ case EFI_IFR_MATCH2_OP:\r
+ CopyMem (&ExpressionOpCode->Guid, &((EFI_IFR_MATCH2 *) OpCodeData)->SyntaxType, sizeof (EFI_GUID));\r
+ break;\r
+\r
case EFI_IFR_GET_OP:\r
case EFI_IFR_SET_OP:\r
CopyMem (&TempVarstoreId, &((EFI_IFR_GET *) OpCodeData)->VarStoreId, sizeof (TempVarstoreId));\r
\r
CopyMem (&FormSet->FormSetTitle, &((EFI_IFR_FORM_SET *) OpCodeData)->FormSetTitle, sizeof (EFI_STRING_ID));\r
CopyMem (&FormSet->Help, &((EFI_IFR_FORM_SET *) OpCodeData)->Help, sizeof (EFI_STRING_ID));\r
+ FormSet->OpCode = (EFI_IFR_OP_HEADER *) OpCodeData;//save the opcode address of formset\r
\r
if (OpCodeLength > OFFSET_OF (EFI_IFR_FORM_SET, Flags)) {\r
//\r
\r
CurrentDefault->Value.Type = ((EFI_IFR_DEFAULT *) OpCodeData)->Type;\r
CopyMem (&CurrentDefault->DefaultId, &((EFI_IFR_DEFAULT *) OpCodeData)->DefaultId, sizeof (UINT16));\r
- if (OpCodeLength > OFFSET_OF (EFI_IFR_DEFAULT, Value)) {\r
+ if (CurrentDefault->Value.Type == EFI_IFR_TYPE_BUFFER) {\r
+ CurrentDefault->Value.BufferLen = (UINT16) (OpCodeLength - OFFSET_OF (EFI_IFR_DEFAULT, Value));\r
+ CurrentDefault->Value.Buffer = AllocateCopyPool (CurrentDefault->Value.BufferLen, &((EFI_IFR_DEFAULT *) OpCodeData)->Value);\r
+ ASSERT (CurrentDefault->Value.Buffer != NULL);\r
+ } else {\r
CopyMem (&CurrentDefault->Value.Value, &((EFI_IFR_DEFAULT *) OpCodeData)->Value, OpCodeLength - OFFSET_OF (EFI_IFR_DEFAULT, Value));\r
ExtendValueToU64 (&CurrentDefault->Value);\r
}\r
// Option\r
//\r
case EFI_IFR_ONE_OF_OPTION_OP:\r
+ ASSERT (ParentStatement != NULL);\r
+ if (ParentStatement->Operand == EFI_IFR_ORDERED_LIST_OP && ((((EFI_IFR_ONE_OF_OPTION *) OpCodeData)->Flags & (EFI_IFR_OPTION_DEFAULT | EFI_IFR_OPTION_DEFAULT_MFG)) != 0)) {\r
+ //\r
+ // It's keep the default value for ordered list opcode.\r
+ //\r
+ CurrentDefault = AllocateZeroPool (sizeof (QUESTION_DEFAULT));\r
+ ASSERT (CurrentDefault != NULL);\r
+ CurrentDefault->Signature = QUESTION_DEFAULT_SIGNATURE;\r
+\r
+ CurrentDefault->Value.Type = EFI_IFR_TYPE_BUFFER;\r
+ if ((((EFI_IFR_ONE_OF_OPTION *) OpCodeData)->Flags & EFI_IFR_OPTION_DEFAULT) != 0) {\r
+ CurrentDefault->DefaultId = EFI_HII_DEFAULT_CLASS_STANDARD;\r
+ } else {\r
+ CurrentDefault->DefaultId = EFI_HII_DEFAULT_CLASS_MANUFACTURING;\r
+ }\r
+\r
+ CurrentDefault->Value.BufferLen = (UINT16) (OpCodeLength - OFFSET_OF (EFI_IFR_ONE_OF_OPTION, Value));\r
+ CurrentDefault->Value.Buffer = AllocateCopyPool (CurrentDefault->Value.BufferLen, &((EFI_IFR_ONE_OF_OPTION *) OpCodeData)->Value);\r
+ ASSERT (CurrentDefault->Value.Buffer != NULL);\r
+\r
+ //\r
+ // Insert to Default Value list of current Question\r
+ //\r
+ InsertTailList (&ParentStatement->DefaultListHead, &CurrentDefault->Link);\r
+ break;\r
+ }\r
+\r
//\r
// EFI_IFR_ONE_OF_OPTION appear in scope of a Question.\r
// It create a selection for use in current Question.\r
CopyMem (CurrentOption->SuppressExpression->Expression, GetConditionalExpressionList(ExpressOption), (UINTN) (sizeof (FORM_EXPRESSION *) * ConditionalExprCount));\r
}\r
\r
- ASSERT (ParentStatement != NULL);\r
//\r
// Insert to Option list of current Question\r
//\r