/** @file\r
Parser for IFR binary encoding.\r
\r
-Copyright (c) 2007 - 2015, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2007 - 2017, Intel Corporation. All rights reserved.<BR>\r
This program and the accompanying materials\r
are licensed and made available under the terms and conditions of the BSD License\r
which accompanies this distribution. The full text of the license may be found at\r
Initialize Statement header members.\r
\r
@param OpCodeData Pointer of the raw OpCode data.\r
- @param FormSet Pointer of the current FormSe.\r
+ @param FormSet Pointer of the current FormSet.\r
@param Form Pointer of the current Form.\r
\r
@return The Statement.\r
ASSERT (Statement != NULL);\r
ASSERT (Statement->Operand == EFI_IFR_NUMERIC_OP);\r
\r
- UnicodeValueToString (Str, 0, Statement->VarStoreInfo.VarName, MAXIMUM_VALUE_CHARACTERS - 1);\r
+ UnicodeValueToStringS (Str, sizeof (Str), 0, Statement->VarStoreInfo.VarName, MAXIMUM_VALUE_CHARACTERS - 1);\r
\r
Id = HiiSetString (FormSet->HiiHandle, 0, Str, NULL);\r
if (Id == 0) {\r
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
INTN ConditionalExprCount;\r
BOOLEAN InUnknownScope;\r
UINT8 UnknownDepth;\r
+ FORMSET_DEFAULTSTORE *PreDefaultStore;\r
+ LIST_ENTRY *DefaultLink;\r
+ BOOLEAN HaveInserted;\r
\r
SuppressForQuestion = FALSE;\r
SuppressForOption = FALSE;\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
// DefaultStore\r
//\r
case EFI_IFR_DEFAULTSTORE_OP:\r
+ HaveInserted = FALSE;\r
DefaultStore = AllocateZeroPool (sizeof (FORMSET_DEFAULTSTORE));\r
ASSERT (DefaultStore != NULL);\r
DefaultStore->Signature = FORMSET_DEFAULTSTORE_SIGNATURE;\r
\r
CopyMem (&DefaultStore->DefaultId, &((EFI_IFR_DEFAULTSTORE *) OpCodeData)->DefaultId, sizeof (UINT16));\r
CopyMem (&DefaultStore->DefaultName, &((EFI_IFR_DEFAULTSTORE *) OpCodeData)->DefaultName, sizeof (EFI_STRING_ID));\r
-\r
//\r
- // Insert to DefaultStore list of this Formset\r
+ // Insert it to the DefaultStore list of this Formset with ascending order.\r
//\r
- InsertTailList (&FormSet->DefaultStoreListHead, &DefaultStore->Link);\r
+ if (!IsListEmpty (&FormSet->DefaultStoreListHead)) {\r
+ DefaultLink = GetFirstNode (&FormSet->DefaultStoreListHead);\r
+ while (!IsNull (&FormSet->DefaultStoreListHead, DefaultLink)) {\r
+ PreDefaultStore = FORMSET_DEFAULTSTORE_FROM_LINK(DefaultLink);\r
+ DefaultLink = GetNextNode (&FormSet->DefaultStoreListHead, DefaultLink);\r
+ if (DefaultStore->DefaultId < PreDefaultStore->DefaultId) {\r
+ InsertTailList (&PreDefaultStore->Link, &DefaultStore->Link);\r
+ HaveInserted = TRUE;\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ if (!HaveInserted) {\r
+ InsertTailList (&FormSet->DefaultStoreListHead, &DefaultStore->Link);\r
+ }\r
break;\r
\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