\r
**/\r
\r
+#include <PiDxe.h>\r
+\r
+#include <Protocol/Print.h>\r
+#include <Protocol/HiiConfigAccess.h>\r
+#include <Protocol/HiiConfigRouting.h>\r
+#include <Protocol/HiiDatabase.h>\r
+#include <Protocol/HiiString.h>\r
+\r
+#include <Library/BaseLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
+#include <Library/DebugLib.h>\r
+#include <Library/HiiLib.h>\r
+#include <Library/IfrSupportLib.h>\r
+#include <Library/MemoryAllocationLib.h>\r
+#include <Library/PrintLib.h>\r
+#include <Library/UefiBootServicesTableLib.h>\r
+\r
+#include <MdeModuleHii.h>\r
+\r
#include "UefiIfrParser.h"\r
-#include "UefiIfrParserExpression.h"\r
-#include "UefiIfrParserInternal.h"\r
-#include "UefiIfrParserCommon.h"\r
\r
+#include "UefiIfrParserExpression.h"\r
\r
UINT16 mStatementIndex;\r
-UINT16 mExpressionOpCodeIndex;\r
\r
BOOLEAN mInScopeSubtitle;\r
BOOLEAN mInScopeSuppress;\r
BOOLEAN mInScopeGrayOut;\r
-FORM_EXPRESSION *mSuppressExpression;\r
-FORM_EXPRESSION *mGrayOutExpression;\r
\r
-EFI_GUID gZeroGuid = {0, 0, 0, {0, 0, 0, 0, 0, 0, 0, 0}};\r
+EFI_GUID mFrameworkHiiCompatibilityGuid = EFI_IFR_FRAMEWORK_GUID;\r
+extern EFI_GUID mTianoHiiIfrGuid;\r
+\r
+LIST_ENTRY *\r
+GetOneOfOptionMapEntryListHead (\r
+ IN CONST FORM_BROWSER_FORMSET *FormSet,\r
+ IN UINT16 QuestionId\r
+ )\r
+{\r
+ LIST_ENTRY *Link;\r
+ ONE_OF_OPTION_MAP *Map;\r
+\r
+ Link = GetFirstNode (&FormSet->OneOfOptionMapListHead);\r
+\r
+ while (!IsNull (&FormSet->OneOfOptionMapListHead, Link)) {\r
+ Map = ONE_OF_OPTION_MAP_FROM_LINK (Link);\r
+ if (QuestionId == Map->QuestionId) {\r
+ return &Map->OneOfOptionMapEntryListHead;\r
+ }\r
+ Link = GetNextNode (&FormSet->OneOfOptionMapListHead, Link);\r
+ }\r
+ \r
+ return NULL;\r
+}\r
+\r
+VOID\r
+DestoryOneOfOptionMap (\r
+ IN LIST_ENTRY *OneOfOptionMapListHead\r
+ )\r
+{\r
+ ONE_OF_OPTION_MAP *Map;\r
+ ONE_OF_OPTION_MAP_ENTRY *MapEntry;\r
+ LIST_ENTRY *Link;\r
+ LIST_ENTRY *Link2;\r
+\r
+ while (!IsListEmpty (OneOfOptionMapListHead)) {\r
+ Link = GetFirstNode (OneOfOptionMapListHead);\r
+ \r
+ Map = ONE_OF_OPTION_MAP_FROM_LINK (Link);\r
+\r
+ while (!IsListEmpty (&Map->OneOfOptionMapEntryListHead)) {\r
+ Link2 = GetFirstNode (&Map->OneOfOptionMapEntryListHead);\r
+ \r
+ MapEntry = ONE_OF_OPTION_MAP_ENTRY_FROM_LINK (Link2);\r
+\r
+ RemoveEntryList (Link2);\r
+\r
+ FreePool (MapEntry);\r
+ }\r
+\r
+ RemoveEntryList (Link);\r
+ FreePool (Map);\r
+ }\r
+}\r
+\r
\r
/**\r
Initialize Statement header members.\r
\r
InitializeListHead (&Statement->DefaultListHead);\r
InitializeListHead (&Statement->OptionListHead);\r
- InitializeListHead (&Statement->InconsistentListHead);\r
- InitializeListHead (&Statement->NoSubmitListHead);\r
\r
Statement->Signature = FORM_BROWSER_STATEMENT_SIGNATURE;\r
\r
CopyMem (&Statement->Prompt, &StatementHdr->Prompt, sizeof (EFI_STRING_ID));\r
CopyMem (&Statement->Help, &StatementHdr->Help, sizeof (EFI_STRING_ID));\r
\r
- if (mInScopeSuppress) {\r
- Statement->SuppressExpression = mSuppressExpression;\r
- }\r
-\r
- if (mInScopeGrayOut) {\r
- Statement->GrayOutExpression = mGrayOutExpression;\r
- }\r
-\r
Statement->InSubtitle = mInScopeSubtitle;\r
\r
//\r
return Statement;\r
}\r
\r
-\r
/**\r
Initialize Question's members.\r
\r
EFI_IFR_QUESTION_HEADER *QuestionHdr;\r
LIST_ENTRY *Link;\r
FORMSET_STORAGE *Storage;\r
- NAME_VALUE_NODE *NameValueNode;\r
\r
Statement = CreateStatement (OpCodeData, FormSet, Form);\r
if (Statement == NULL) {\r
CopyMem (&Statement->VarStoreId, &QuestionHdr->VarStoreId, sizeof (EFI_VARSTORE_ID));\r
CopyMem (&Statement->VarStoreInfo.VarOffset, &QuestionHdr->VarStoreInfo.VarOffset, sizeof (UINT16));\r
\r
+ if (FormSet->MaxQuestionId < QuestionHdr->QuestionId) {\r
+ FormSet->MaxQuestionId = QuestionHdr->QuestionId;\r
+ }\r
+\r
Statement->QuestionFlags = QuestionHdr->Flags;\r
\r
if (Statement->VarStoreId == 0) {\r
}\r
ASSERT (Statement->Storage != NULL);\r
\r
- //\r
- // Initialilze varname for Name/Value or EFI Variable\r
- //\r
- if ((Statement->Storage->Type == EFI_HII_VARSTORE_NAME_VALUE) ||\r
- (Statement->Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE)) {\r
- Statement->VariableName = GetToken (Statement->VarStoreInfo.VarName, FormSet->HiiHandle);\r
- ASSERT (Statement->VariableName != NULL);\r
-\r
- if (Statement->Storage->Type == EFI_HII_VARSTORE_NAME_VALUE) {\r
- //\r
- // Insert to Name/Value varstore list\r
- //\r
- NameValueNode = AllocateZeroPool (sizeof (NAME_VALUE_NODE));\r
- ASSERT (NameValueNode != NULL);\r
- NameValueNode->Signature = NAME_VALUE_NODE_SIGNATURE;\r
- NameValueNode->Name = AllocateCopyPool (StrSize (Statement->VariableName), Statement->VariableName);\r
- ASSERT (NameValueNode->Name != NULL);\r
- NameValueNode->Value = AllocateZeroPool (0x10);\r
- ASSERT (NameValueNode->Value != NULL);\r
- NameValueNode->EditValue = AllocateZeroPool (0x10);\r
- ASSERT (NameValueNode->EditValue != NULL);\r
-\r
- InsertTailList (&Statement->Storage->NameValueListHead, &NameValueNode->Link);\r
- }\r
- }\r
-\r
return Statement;\r
}\r
\r
-\r
-/**\r
- Allocate a FORM_EXPRESSION node.\r
-\r
- @param Form The Form associated with this Expression\r
-\r
- @return Pointer to a FORM_EXPRESSION data structure.\r
-\r
-**/\r
-FORM_EXPRESSION *\r
-CreateExpression (\r
- IN OUT FORM_BROWSER_FORM *Form\r
- )\r
-{\r
- FORM_EXPRESSION *Expression;\r
-\r
- Expression = AllocateZeroPool (sizeof (FORM_EXPRESSION));\r
- Expression->Signature = FORM_EXPRESSION_SIGNATURE;\r
- InitializeListHead (&Expression->OpCodeListHead);\r
-\r
- return Expression;\r
-}\r
-\r
-\r
/**\r
Allocate a FORMSET_STORAGE data structure and insert to FormSet Storage List.\r
\r
\r
Storage = AllocateZeroPool (sizeof (FORMSET_STORAGE));\r
Storage->Signature = FORMSET_STORAGE_SIGNATURE;\r
- InitializeListHead (&Storage->NameValueListHead);\r
InsertTailList (&FormSet->StorageListHead, &Storage->Link);\r
\r
return Storage;\r
}\r
\r
-\r
-/**\r
- Create ConfigHdr string for a storage.\r
-\r
- @param FormSet Pointer of the current FormSet\r
- @param Storage Pointer of the storage\r
-\r
- @retval EFI_SUCCESS Initialize ConfigHdr success\r
-\r
-**/\r
-EFI_STATUS\r
-InitializeConfigHdr (\r
- IN FORM_BROWSER_FORMSET *FormSet,\r
- IN OUT FORMSET_STORAGE *Storage\r
- )\r
-{\r
- EFI_STATUS Status;\r
- UINTN StrBufferLen;\r
- CHAR16 *Name;\r
-\r
- if (Storage->Type == EFI_HII_VARSTORE_BUFFER) {\r
- Name = Storage->Name;\r
- } else {\r
- Name = NULL;\r
- }\r
-\r
- StrBufferLen = 0;\r
- Status = ConstructConfigHdr (\r
- Storage->ConfigHdr,\r
- &StrBufferLen,\r
- &Storage->Guid,\r
- Name,\r
- FormSet->DriverHandle\r
- );\r
- if (Status == EFI_BUFFER_TOO_SMALL) {\r
- Storage->ConfigHdr = AllocateZeroPool (StrBufferLen);\r
- Status = ConstructConfigHdr (\r
- Storage->ConfigHdr,\r
- &StrBufferLen,\r
- &Storage->Guid,\r
- Name,\r
- FormSet->DriverHandle\r
- );\r
- }\r
-\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- Storage->ConfigRequest = AllocateCopyPool (StrBufferLen, Storage->ConfigHdr);\r
- Storage->SpareStrLen = 0;\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-\r
-/**\r
- Initialize Request Element of a Question. <RequestElement> ::= '&'<BlockName> | '&'<Label>\r
-\r
- @param FormSet Pointer of the current FormSet.\r
- @param Question The Question to be initialized.\r
-\r
- @retval EFI_SUCCESS Function success.\r
- @retval EFI_INVALID_PARAMETER No storage associated with the Question.\r
-\r
-**/\r
-EFI_STATUS\r
-InitializeRequestElement (\r
- IN OUT FORM_BROWSER_FORMSET *FormSet,\r
- IN OUT FORM_BROWSER_STATEMENT *Question\r
- )\r
-{\r
- FORMSET_STORAGE *Storage;\r
- UINTN StrLen;\r
- UINTN StringSize;\r
- CHAR16 *NewStr;\r
- CHAR16 RequestElement[30];\r
-\r
- Storage = Question->Storage;\r
- if (Storage == NULL) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- if (Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE) {\r
- //\r
- // <ConfigRequest> is unnecessary for EFI variable storage,\r
- // GetVariable()/SetVariable() will be used to retrieve/save values\r
- //\r
- return EFI_SUCCESS;\r
- }\r
-\r
- //\r
- // Prepare <RequestElement>\r
- //\r
- if (Storage->Type == EFI_HII_VARSTORE_BUFFER) {\r
- StrLen = UnicodeSPrint (\r
- RequestElement,\r
- 30 * sizeof (CHAR16),\r
- L"&OFFSET=%x&WIDTH=%x",\r
- Question->VarStoreInfo.VarOffset,\r
- Question->StorageWidth\r
- );\r
- Question->BlockName = AllocateCopyPool ((StrLen + 1) * sizeof (CHAR16), RequestElement);\r
- } else {\r
- StrLen = UnicodeSPrint (RequestElement, 30 * sizeof (CHAR16), L"&%s", Question->VariableName);\r
- }\r
-\r
- if ((Question->Operand == EFI_IFR_PASSWORD_OP) && (Question->QuestionFlags & EFI_IFR_FLAG_CALLBACK)) {\r
- //\r
- // Password with CALLBACK flag is stored in encoded format,\r
- // so don't need to append it to <ConfigRequest>\r
- //\r
- return EFI_SUCCESS;\r
- }\r
-\r
- //\r
- // Append <RequestElement> to <ConfigRequest>\r
- //\r
- if (StrLen > Storage->SpareStrLen) {\r
- //\r
- // Old String buffer is not sufficient for RequestElement, allocate a new one\r
- //\r
- StringSize = (Storage->ConfigRequest != NULL) ? StrSize (Storage->ConfigRequest) : sizeof (CHAR16);\r
- NewStr = AllocateZeroPool (StringSize + CONFIG_REQUEST_STRING_INCREMENTAL * sizeof (CHAR16));\r
- if (Storage->ConfigRequest != NULL) {\r
- CopyMem (NewStr, Storage->ConfigRequest, StringSize);\r
- gBS->FreePool (Storage->ConfigRequest);\r
- }\r
- Storage->ConfigRequest = NewStr;\r
- Storage->SpareStrLen = CONFIG_REQUEST_STRING_INCREMENTAL;\r
- }\r
-\r
- StrCat (Storage->ConfigRequest, RequestElement);\r
- Storage->ElementCount++;\r
- Storage->SpareStrLen -= StrLen;\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-\r
-/**\r
- Free resources of a Expression\r
-\r
- @param FormSet Pointer of the Expression\r
-\r
- @return None.\r
-\r
-**/\r
-VOID\r
-DestroyExpression (\r
- IN FORM_EXPRESSION *Expression\r
- )\r
-{\r
- LIST_ENTRY *Link;\r
- EXPRESSION_OPCODE *OpCode;\r
-\r
- while (!IsListEmpty (&Expression->OpCodeListHead)) {\r
- Link = GetFirstNode (&Expression->OpCodeListHead);\r
- OpCode = EXPRESSION_OPCODE_FROM_LINK (Link);\r
- RemoveEntryList (&OpCode->Link);\r
-\r
- if (OpCode->ValueList != NULL) {\r
- FreePool (OpCode->ValueList);\r
- }\r
- }\r
-\r
- //\r
- // Free this Expression\r
- //\r
- gBS->FreePool (Expression);\r
-}\r
-\r
-\r
/**\r
Free resources of a storage\r
\r
IN FORMSET_STORAGE *Storage\r
)\r
{\r
- LIST_ENTRY *Link;\r
- NAME_VALUE_NODE *NameValueNode;\r
-\r
if (Storage == NULL) {\r
return;\r
}\r
\r
- FreePool (Storage->Name);\r
- FreePool (Storage->Buffer);\r
- FreePool (Storage->EditBuffer);\r
-\r
- while (!IsListEmpty (&Storage->NameValueListHead)) {\r
- Link = GetFirstNode (&Storage->NameValueListHead);\r
- NameValueNode = NAME_VALUE_NODE_FROM_LINK (Link);\r
- RemoveEntryList (&NameValueNode->Link);\r
-\r
- FreePool (NameValueNode->Name);\r
- FreePool (NameValueNode->Value);\r
- FreePool (NameValueNode->EditValue);\r
- FreePool (NameValueNode);\r
+ if (Storage->Name!= NULL) {\r
+ FreePool (Storage->Name);\r
}\r
\r
- FreePool (Storage->ConfigHdr);\r
- FreePool (Storage->ConfigRequest);\r
-\r
FreePool (Storage);\r
}\r
\r
LIST_ENTRY *Link;\r
QUESTION_DEFAULT *Default;\r
QUESTION_OPTION *Option;\r
- FORM_EXPRESSION *Expression;\r
\r
//\r
// Free Default value List\r
gBS->FreePool (Option);\r
}\r
\r
- //\r
- // Free Inconsistent List\r
- //\r
- while (!IsListEmpty (&Statement->InconsistentListHead)) {\r
- Link = GetFirstNode (&Statement->InconsistentListHead);\r
- Expression = FORM_EXPRESSION_FROM_LINK (Link);\r
- RemoveEntryList (&Expression->Link);\r
-\r
- DestroyExpression (Expression);\r
- }\r
-\r
- //\r
- // Free NoSubmit List\r
- //\r
- while (!IsListEmpty (&Statement->NoSubmitListHead)) {\r
- Link = GetFirstNode (&Statement->NoSubmitListHead);\r
- Expression = FORM_EXPRESSION_FROM_LINK (Link);\r
- RemoveEntryList (&Expression->Link);\r
-\r
- DestroyExpression (Expression);\r
- }\r
-\r
- if (Statement->VariableName != NULL) {\r
- FreePool (Statement->VariableName);\r
- }\r
- if (Statement->BlockName != NULL) {\r
- FreePool (Statement->BlockName);\r
- }\r
}\r
\r
\r
)\r
{\r
LIST_ENTRY *Link;\r
- FORM_EXPRESSION *Expression;\r
FORM_BROWSER_STATEMENT *Statement;\r
\r
- //\r
- // Free Form Expressions\r
- //\r
- while (!IsListEmpty (&Form->ExpressionListHead)) {\r
- Link = GetFirstNode (&Form->ExpressionListHead);\r
- Expression = FORM_EXPRESSION_FROM_LINK (Link);\r
- RemoveEntryList (&Expression->Link);\r
-\r
- DestroyExpression (Expression);\r
- }\r
-\r
//\r
// Free Statements/Questions\r
//\r
if (FormSet->StatementBuffer != NULL) {\r
FreePool (FormSet->StatementBuffer);\r
}\r
- if (FormSet->ExpressionBuffer != NULL) {\r
- FreePool (FormSet->ExpressionBuffer);\r
- }\r
\r
+ DestoryOneOfOptionMap (&FormSet->OneOfOptionMapListHead);\r
+ \r
FreePool (FormSet);\r
}\r
\r
UINT16 Index;\r
FORM_BROWSER_FORM *CurrentForm;\r
FORM_BROWSER_STATEMENT *CurrentStatement;\r
- EXPRESSION_OPCODE *ExpressionOpCode;\r
- FORM_EXPRESSION *CurrentExpression;\r
UINT8 Operand;\r
UINT8 Scope;\r
UINTN OpCodeOffset;\r
EFI_IMAGE_ID *ImageId;\r
BOOLEAN SuppressForOption;\r
BOOLEAN InScopeOptionSuppress;\r
- FORM_EXPRESSION *OptionSuppressExpression;\r
BOOLEAN InScopeDisable;\r
UINT16 DepthOfDisable;\r
BOOLEAN OpCodeDisabled;\r
BOOLEAN SingleOpCodeExpression;\r
BOOLEAN InScopeDefault;\r
EFI_HII_VALUE *Value;\r
+ LIST_ENTRY *OneOfOptinMapEntryListHead;\r
+ EFI_IFR_GUID_OPTIONKEY *OptionMap;\r
+ ONE_OF_OPTION_MAP *OneOfOptionMap;\r
+ ONE_OF_OPTION_MAP_ENTRY *OneOfOptionMapEntry;\r
+ UINT8 OneOfType;\r
+ EFI_IFR_ONE_OF *OneOfOpcode;\r
\r
mInScopeSubtitle = FALSE;\r
SuppressForOption = FALSE;\r
OpCodeDisabled = FALSE;\r
SingleOpCodeExpression = FALSE;\r
InScopeDefault = FALSE;\r
- CurrentExpression = NULL;\r
CurrentDefault = NULL;\r
CurrentOption = NULL;\r
- OptionSuppressExpression = NULL;\r
+\r
+ //\r
+ // Set to a invalid value.\r
+ //\r
+ OneOfType = (UINT8) -1;\r
\r
//\r
// Get the number of Statements and Expressions\r
//\r
CountOpCodes (FormSet, &NumberOfStatement, &NumberOfExpression);\r
+ FormSet->NumberOfStatement = NumberOfStatement;\r
\r
mStatementIndex = 0;\r
FormSet->StatementBuffer = AllocateZeroPool (NumberOfStatement * sizeof (FORM_BROWSER_STATEMENT));\r
return EFI_OUT_OF_RESOURCES;\r
}\r
\r
- mExpressionOpCodeIndex = 0;\r
- FormSet->ExpressionBuffer = AllocateZeroPool (NumberOfExpression * sizeof (EXPRESSION_OPCODE));\r
- if (FormSet->ExpressionBuffer == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
InitializeListHead (&FormSet->StorageListHead);\r
InitializeListHead (&FormSet->DefaultStoreListHead);\r
InitializeListHead (&FormSet->FormListHead);\r
+ InitializeListHead (&FormSet->OneOfOptionMapListHead);\r
\r
CurrentForm = NULL;\r
CurrentStatement = NULL;\r
}\r
\r
if (IsExpressionOpCode (Operand)) {\r
- ExpressionOpCode = &FormSet->ExpressionBuffer[mExpressionOpCodeIndex];\r
- mExpressionOpCodeIndex++;\r
-\r
- ExpressionOpCode->Signature = EXPRESSION_OPCODE_SIGNATURE;\r
- ExpressionOpCode->Operand = Operand;\r
- Value = &ExpressionOpCode->Value;\r
-\r
- switch (Operand) {\r
- case EFI_IFR_EQ_ID_VAL_OP:\r
- CopyMem (&ExpressionOpCode->QuestionId, &((EFI_IFR_EQ_ID_VAL *) OpCodeData)->QuestionId, sizeof (EFI_QUESTION_ID));\r
-\r
- Value->Type = EFI_IFR_TYPE_NUM_SIZE_16;\r
- CopyMem (&Value->Value.u16, &((EFI_IFR_EQ_ID_VAL *) OpCodeData)->Value, sizeof (UINT16));\r
- break;\r
-\r
- case EFI_IFR_EQ_ID_ID_OP:\r
- CopyMem (&ExpressionOpCode->QuestionId, &((EFI_IFR_EQ_ID_ID *) OpCodeData)->QuestionId1, sizeof (EFI_QUESTION_ID));\r
- CopyMem (&ExpressionOpCode->QuestionId2, &((EFI_IFR_EQ_ID_ID *) OpCodeData)->QuestionId2, sizeof (EFI_QUESTION_ID));\r
- break;\r
-\r
- case EFI_IFR_EQ_ID_LIST_OP:\r
- CopyMem (&ExpressionOpCode->QuestionId, &((EFI_IFR_EQ_ID_LIST *) OpCodeData)->QuestionId, sizeof (EFI_QUESTION_ID));\r
- CopyMem (&ExpressionOpCode->ListLength, &((EFI_IFR_EQ_ID_LIST *) OpCodeData)->ListLength, sizeof (UINT16));\r
- ExpressionOpCode->ValueList = AllocateCopyPool (ExpressionOpCode->ListLength * sizeof (UINT16), &((EFI_IFR_EQ_ID_LIST *) OpCodeData)->ValueList);\r
- break;\r
-\r
- case EFI_IFR_TO_STRING_OP:\r
- case EFI_IFR_FIND_OP:\r
- ExpressionOpCode->Format = (( EFI_IFR_TO_STRING *) OpCodeData)->Format;\r
- break;\r
-\r
- case EFI_IFR_STRING_REF1_OP:\r
- Value->Type = EFI_IFR_TYPE_STRING;\r
- CopyMem (&Value->Value.string, &(( EFI_IFR_STRING_REF1 *) OpCodeData)->StringId, sizeof (EFI_STRING_ID));\r
- break;\r
-\r
- case EFI_IFR_RULE_REF_OP:\r
- ExpressionOpCode->RuleId = (( EFI_IFR_RULE_REF *) OpCodeData)->RuleId;\r
- break;\r
-\r
- case EFI_IFR_SPAN_OP:\r
- ExpressionOpCode->Flags = (( EFI_IFR_SPAN *) OpCodeData)->Flags;\r
- break;\r
-\r
- case EFI_IFR_THIS_OP:\r
- ExpressionOpCode->QuestionId = CurrentStatement->QuestionId;\r
- break;\r
-\r
- case EFI_IFR_QUESTION_REF1_OP:\r
- CopyMem (&ExpressionOpCode->QuestionId, &((EFI_IFR_EQ_ID_LIST *) OpCodeData)->QuestionId, sizeof (EFI_QUESTION_ID));\r
- break;\r
-\r
- case EFI_IFR_QUESTION_REF3_OP:\r
- if (OpCodeLength >= sizeof (EFI_IFR_QUESTION_REF3_2)) {\r
- CopyMem (&ExpressionOpCode->DevicePath, &(( EFI_IFR_QUESTION_REF3_2 *) OpCodeData)->DevicePath, sizeof (EFI_STRING_ID));\r
-\r
- if (OpCodeLength >= sizeof (EFI_IFR_QUESTION_REF3_3)) {\r
- CopyMem (&ExpressionOpCode->Guid, &(( EFI_IFR_QUESTION_REF3_3 *) OpCodeData)->Guid, sizeof (EFI_GUID));\r
- }\r
- }\r
- break;\r
-\r
- //\r
- // constant\r
- //\r
- case EFI_IFR_TRUE_OP:\r
- Value->Type = EFI_IFR_TYPE_BOOLEAN;\r
- Value->Value.b = TRUE;\r
- break;\r
-\r
- case EFI_IFR_FALSE_OP:\r
- Value->Type = EFI_IFR_TYPE_BOOLEAN;\r
- Value->Value.b = FALSE;\r
- break;\r
-\r
- case EFI_IFR_ONE_OP:\r
- Value->Type = EFI_IFR_TYPE_NUM_SIZE_8;\r
- Value->Value.u8 = 1;\r
- break;\r
-\r
- case EFI_IFR_ZERO_OP:\r
- Value->Type = EFI_IFR_TYPE_NUM_SIZE_8;\r
- Value->Value.u8 = 0;\r
- break;\r
-\r
- case EFI_IFR_ONES_OP:\r
- Value->Type = EFI_IFR_TYPE_NUM_SIZE_64;\r
- Value->Value.u64 = 0xffffffffffffffffULL;\r
- break;\r
-\r
- case EFI_IFR_UINT8_OP:\r
- Value->Type = EFI_IFR_TYPE_NUM_SIZE_8;\r
- Value->Value.u8 = (( EFI_IFR_UINT8 *) OpCodeData)->Value;\r
- break;\r
-\r
- case EFI_IFR_UINT16_OP:\r
- Value->Type = EFI_IFR_TYPE_NUM_SIZE_16;\r
- CopyMem (&Value->Value.u16, &(( EFI_IFR_UINT16 *) OpCodeData)->Value, sizeof (UINT16));\r
- break;\r
-\r
- case EFI_IFR_UINT32_OP:\r
- Value->Type = EFI_IFR_TYPE_NUM_SIZE_32;\r
- CopyMem (&Value->Value.u32, &(( EFI_IFR_UINT32 *) OpCodeData)->Value, sizeof (UINT32));\r
- break;\r
-\r
- case EFI_IFR_UINT64_OP:\r
- Value->Type = EFI_IFR_TYPE_NUM_SIZE_64;\r
- CopyMem (&Value->Value.u64, &(( EFI_IFR_UINT64 *) OpCodeData)->Value, sizeof (UINT64));\r
- break;\r
-\r
- case EFI_IFR_UNDEFINED_OP:\r
- Value->Type = EFI_IFR_TYPE_OTHER;\r
- break;\r
-\r
- case EFI_IFR_VERSION_OP:\r
- Value->Type = EFI_IFR_TYPE_NUM_SIZE_16;\r
- Value->Value.u16 = EFI_IFR_SPECIFICATION_VERSION;\r
- break;\r
-\r
- default:\r
- break;\r
- }\r
-\r
- InsertTailList (&CurrentExpression->OpCodeListHead, &ExpressionOpCode->Link);\r
-\r
- if (SingleOpCodeExpression) {\r
- //\r
- // There are two cases to indicate the end of an Expression:\r
- // for single OpCode expression: one Expression OpCode\r
- // for expression consists of more than one OpCode: EFI_IFR_END\r
- //\r
- SingleOpCodeExpression = FALSE;\r
-\r
- if (InScopeDisable) {\r
- //\r
- // Evaluate DisableIf expression\r
- //\r
- Status = EvaluateExpression (FormSet, CurrentForm, CurrentExpression);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
- if (CurrentExpression->Result.Type != EFI_IFR_TYPE_BOOLEAN) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- OpCodeDisabled = CurrentExpression->Result.Value.b;\r
- }\r
-\r
- CurrentExpression = NULL;\r
- }\r
-\r
continue;\r
}\r
\r
//\r
CurrentForm = AllocateZeroPool (sizeof (FORM_BROWSER_FORM));\r
CurrentForm->Signature = FORM_BROWSER_FORM_SIGNATURE;\r
- InitializeListHead (&CurrentForm->ExpressionListHead);\r
+\r
InitializeListHead (&CurrentForm->StatementListHead);\r
\r
CopyMem (&CurrentForm->FormId, &((EFI_IFR_FORM *) OpCodeData)->FormId, sizeof (UINT16));\r
CopyMem (&Storage->Guid, &((EFI_IFR_VARSTORE *) OpCodeData)->Guid, sizeof (EFI_GUID));\r
CopyMem (&Storage->Size, &((EFI_IFR_VARSTORE *) OpCodeData)->Size, sizeof (UINT16));\r
\r
- Storage->Buffer = AllocateZeroPool (Storage->Size);\r
- Storage->EditBuffer = AllocateZeroPool (Storage->Size);\r
-\r
AsciiString = (CHAR8 *) ((EFI_IFR_VARSTORE *) OpCodeData)->Name;\r
Storage->Name = AllocateZeroPool (AsciiStrSize (AsciiString) * 2);\r
ASSERT (Storage->Name != NULL);\r
Storage->Name[Index] = (CHAR16) AsciiString[Index];\r
}\r
\r
- //\r
- // Initialize <ConfigHdr>\r
- //\r
- InitializeConfigHdr (FormSet, Storage);\r
break;\r
\r
case EFI_IFR_VARSTORE_NAME_VALUE_OP:\r
- //\r
- // Create a name/value Storage for this FormSet\r
- //\r
- Storage = CreateStorage (FormSet);\r
- Storage->Type = EFI_HII_VARSTORE_NAME_VALUE;\r
+ ASSERT (FALSE);\r
\r
- CopyMem (&Storage->VarStoreId, &((EFI_IFR_VARSTORE_NAME_VALUE *) OpCodeData)->VarStoreId, sizeof (EFI_VARSTORE_ID));\r
- CopyMem (&Storage->Guid, &((EFI_IFR_VARSTORE_NAME_VALUE *) OpCodeData)->Guid, sizeof (EFI_GUID));\r
-\r
- //\r
- // Initialize <ConfigHdr>\r
- //\r
- InitializeConfigHdr (FormSet, Storage);\r
break;\r
\r
case EFI_IFR_VARSTORE_EFI_OP:\r
break;\r
}\r
\r
- InitializeRequestElement (FormSet, CurrentStatement);\r
-\r
if ((Operand == EFI_IFR_ONE_OF_OP) && Scope) {\r
SuppressForOption = TRUE;\r
}\r
+\r
+ if (Operand == EFI_IFR_ONE_OF_OP) {\r
+ OneOfOpcode = (EFI_IFR_ONE_OF *) OpCodeData;\r
+ OneOfType = OneOfOpcode->Flags & EFI_IFR_NUMERIC_SIZE;\r
+ }\r
break;\r
\r
case EFI_IFR_ORDERED_LIST_OP:\r
CurrentStatement->Flags = ((EFI_IFR_ORDERED_LIST *) OpCodeData)->Flags;\r
CurrentStatement->MaxContainers = ((EFI_IFR_ORDERED_LIST *) OpCodeData)->MaxContainers;\r
CurrentStatement->StorageWidth = (UINT16)(CurrentStatement->MaxContainers * sizeof (UINT8));\r
- InitializeRequestElement (FormSet, CurrentStatement);\r
\r
//\r
// No buffer type is defined in EFI_IFR_TYPE_VALUE, so a Configuration Driver\r
CurrentStatement->StorageWidth = sizeof (BOOLEAN);\r
CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_BOOLEAN;\r
\r
- InitializeRequestElement (FormSet, CurrentStatement);\r
break;\r
\r
case EFI_IFR_STRING_OP:\r
CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_STRING;\r
CurrentStatement->BufferValue = AllocateZeroPool (CurrentStatement->StorageWidth);\r
\r
- InitializeRequestElement (FormSet, CurrentStatement);\r
break;\r
\r
case EFI_IFR_PASSWORD_OP:\r
CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_STRING;\r
CurrentStatement->BufferValue = AllocateZeroPool (CurrentStatement->StorageWidth);\r
\r
- InitializeRequestElement (FormSet, CurrentStatement);\r
break;\r
\r
case EFI_IFR_DATE_OP:\r
CurrentStatement->Flags = ((EFI_IFR_DATE *) OpCodeData)->Flags;\r
CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_DATE;\r
\r
- if ((CurrentStatement->Flags & EFI_QF_DATE_STORAGE) == QF_DATE_STORAGE_NORMAL) {\r
- CurrentStatement->StorageWidth = sizeof (EFI_HII_DATE);\r
-\r
- InitializeRequestElement (FormSet, CurrentStatement);\r
- } else {\r
- //\r
- // Don't assign storage for RTC type of date/time\r
- //\r
- CurrentStatement->Storage = NULL;\r
- CurrentStatement->StorageWidth = 0;\r
- }\r
break;\r
\r
case EFI_IFR_TIME_OP:\r
CurrentStatement->Flags = ((EFI_IFR_TIME *) OpCodeData)->Flags;\r
CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_TIME;\r
\r
- if ((CurrentStatement->Flags & QF_TIME_STORAGE) == QF_TIME_STORAGE_NORMAL) {\r
- CurrentStatement->StorageWidth = sizeof (EFI_IFR_TIME);\r
-\r
- InitializeRequestElement (FormSet, CurrentStatement);\r
- } else {\r
- //\r
- // Don't assign storage for RTC type of date/time\r
- //\r
- CurrentStatement->Storage = NULL;\r
- CurrentStatement->StorageWidth = 0;\r
- }\r
break;\r
\r
//\r
CopyMem (&CurrentOption->Value.Value, &((EFI_IFR_ONE_OF_OPTION *) OpCodeData)->Value, sizeof (EFI_IFR_TYPE_VALUE));\r
ExtendValueToU64 (&CurrentOption->Value);\r
\r
- if (InScopeOptionSuppress) {\r
- CurrentOption->SuppressExpression = OptionSuppressExpression;\r
- }\r
-\r
//\r
// Insert to Option list of current Question\r
//\r
//\r
case EFI_IFR_NO_SUBMIT_IF_OP:\r
case EFI_IFR_INCONSISTENT_IF_OP:\r
- //\r
- // Create an Expression node\r
- //\r
- CurrentExpression = CreateExpression (CurrentForm);\r
- CopyMem (&CurrentExpression->Error, &((EFI_IFR_INCONSISTENT_IF *) OpCodeData)->Error, sizeof (EFI_STRING_ID));\r
-\r
- if (Operand == EFI_IFR_NO_SUBMIT_IF_OP) {\r
- CurrentExpression->Type = EFI_HII_EXPRESSION_NO_SUBMIT_IF;\r
- InsertTailList (&CurrentStatement->NoSubmitListHead, &CurrentExpression->Link);\r
- } else {\r
- CurrentExpression->Type = EFI_HII_EXPRESSION_INCONSISTENT_IF;\r
- InsertTailList (&CurrentStatement->InconsistentListHead, &CurrentExpression->Link);\r
- }\r
break;\r
\r
case EFI_IFR_SUPPRESS_IF_OP:\r
- //\r
- // Question and Option will appear in scope of this OpCode\r
- //\r
- CurrentExpression = CreateExpression (CurrentForm);\r
- CurrentExpression->Type = EFI_HII_EXPRESSION_SUPPRESS_IF;\r
- InsertTailList (&CurrentForm->ExpressionListHead, &CurrentExpression->Link);\r
-\r
- if (SuppressForOption) {\r
- InScopeOptionSuppress = TRUE;\r
- OptionSuppressExpression = CurrentExpression;\r
- } else {\r
- mInScopeSuppress = TRUE;\r
- mSuppressExpression = CurrentExpression;\r
- }\r
break;\r
\r
case EFI_IFR_GRAY_OUT_IF_OP:\r
- //\r
- // Questions will appear in scope of this OpCode\r
- //\r
- CurrentExpression = CreateExpression (CurrentForm);\r
- CurrentExpression->Type = EFI_HII_EXPRESSION_GRAY_OUT_IF;\r
- InsertTailList (&CurrentForm->ExpressionListHead, &CurrentExpression->Link);\r
-\r
- mInScopeGrayOut = TRUE;\r
- mGrayOutExpression = CurrentExpression;\r
break;\r
\r
case EFI_IFR_DISABLE_IF_OP:\r
- //\r
- // The DisableIf expression should only rely on constant, so it could be\r
- // evaluated at initialization and it will not be queued\r
- //\r
- CurrentExpression = AllocateZeroPool (sizeof (FORM_EXPRESSION));\r
- CurrentExpression->Signature = FORM_EXPRESSION_SIGNATURE;\r
- CurrentExpression->Type = EFI_HII_EXPRESSION_DISABLE_IF;\r
- InitializeListHead (&CurrentExpression->OpCodeListHead);\r
-\r
- InScopeDisable = TRUE;\r
- OpCodeDisabled = FALSE;\r
+ ASSERT (FALSE);\r
\r
- //\r
- // Take a look at next OpCode to see whether current expression consists\r
- // of single OpCode\r
- //\r
- if (((EFI_IFR_OP_HEADER *) (OpCodeData + OpCodeLength))->Scope == 0) {\r
- SingleOpCodeExpression = TRUE;\r
- }\r
- break;\r
\r
//\r
// Expression\r
//\r
case EFI_IFR_VALUE_OP:\r
- CurrentExpression = CreateExpression (CurrentForm);\r
- CurrentExpression->Type = EFI_HII_EXPRESSION_VALUE;\r
- InsertTailList (&CurrentForm->ExpressionListHead, &CurrentExpression->Link);\r
-\r
- if (InScopeDefault) {\r
- //\r
- // Used for default (EFI_IFR_DEFAULT)\r
- //\r
- CurrentDefault->ValueExpression = CurrentExpression;\r
- } else {\r
- //\r
- // If used for a question, then the question will be read-only\r
- //\r
- CurrentStatement->ValueExpression = CurrentExpression;\r
- }\r
break;\r
\r
case EFI_IFR_RULE_OP:\r
- CurrentExpression = CreateExpression (CurrentForm);\r
- CurrentExpression->Type = EFI_HII_EXPRESSION_RULE;\r
-\r
- CurrentExpression->RuleId = ((EFI_IFR_RULE *) OpCodeData)->RuleId;\r
- InsertTailList (&CurrentForm->ExpressionListHead, &CurrentExpression->Link);\r
break;\r
\r
//\r
// Vendor specific\r
//\r
case EFI_IFR_GUID_OP:\r
- if (CompareGuid (&gTianoHiiIfrGuid, (EFI_GUID *)(OpCodeData + sizeof (EFI_IFR_OP_HEADER)))) {\r
+ OptionMap = (EFI_IFR_GUID_OPTIONKEY *) OpCodeData;\r
+ \r
+ if (CompareGuid (&mTianoHiiIfrGuid, (EFI_GUID *)(OpCodeData + sizeof (EFI_IFR_OP_HEADER)))) {\r
//\r
// Tiano specific GUIDed opcodes\r
//\r
//\r
break;\r
\r
-#if 0\r
- case EFI_IFR_EXTEND_OP_BANNER:\r
- if (FormSet->SubClass == EFI_FRONT_PAGE_SUBCLASS) {\r
- CopyMem (\r
- &BannerData->Banner[((EFI_IFR_GUID_BANNER *) OpCodeData)->LineNumber][\r
- ((EFI_IFR_GUID_BANNER *) OpCodeData)->Alignment],\r
- &((EFI_IFR_GUID_BANNER *) OpCodeData)->Title,\r
- sizeof (EFI_STRING_ID)\r
- );\r
- }\r
- break;\r
-#endif\r
\r
case EFI_IFR_EXTEND_OP_CLASS:\r
CopyMem (&FormSet->Class, &((EFI_IFR_GUID_CLASS *) OpCodeData)->Class, sizeof (UINT16));\r
default:\r
break;\r
}\r
- }\r
+ } \r
+ else if (CompareGuid ((EFI_GUID *)(VOID *)&OptionMap->Guid, &mFrameworkHiiCompatibilityGuid)) {\r
+ if (OptionMap->ExtendOpCode == EFI_IFR_EXTEND_OP_OPTIONKEY) {\r
+ OneOfOptinMapEntryListHead = GetOneOfOptionMapEntryListHead (FormSet, OptionMap->QuestionId);\r
+ if (OneOfOptinMapEntryListHead == NULL) {\r
+ OneOfOptionMap = AllocateZeroPool (sizeof (ONE_OF_OPTION_MAP));\r
+ ASSERT (OneOfOptionMap != NULL);\r
+\r
+ OneOfOptionMap->Signature = ONE_OF_OPTION_MAP_SIGNATURE;\r
+ OneOfOptionMap->QuestionId = OptionMap->QuestionId;\r
+\r
+ //\r
+ // Make sure OneOfType is initialized.\r
+ //\r
+ ASSERT (OneOfType != (UINT8) -1);\r
+ OneOfOptionMap->ValueType = OneOfType;\r
+ InitializeListHead (&OneOfOptionMap->OneOfOptionMapEntryListHead);\r
+ OneOfOptinMapEntryListHead = &OneOfOptionMap->OneOfOptionMapEntryListHead;\r
+ InsertTailList (&FormSet->OneOfOptionMapListHead, &OneOfOptionMap->Link);\r
+ }\r
+ OneOfOptionMapEntry = AllocateZeroPool (sizeof (ONE_OF_OPTION_MAP_ENTRY));\r
+ ASSERT (OneOfOptionMapEntry != NULL);\r
+\r
+ OneOfOptionMapEntry->Signature = ONE_OF_OPTION_MAP_ENTRY_SIGNATURE;\r
+ OneOfOptionMapEntry->FwKey = OptionMap->KeyValue;\r
+ CopyMem (&OneOfOptionMapEntry->Value, &OptionMap->OptionValue, sizeof (EFI_IFR_TYPE_VALUE));\r
+ \r
+ InsertTailList (OneOfOptinMapEntryListHead, &OneOfOptionMapEntry->Link);\r
+ }\r
+ }\r
break;\r
\r
//\r
\r
default:\r
if (IsExpressionOpCode (ScopeOpCode)) {\r
- if (InScopeDisable) {\r
- //\r
- // Evaluate DisableIf expression\r
- //\r
- Status = EvaluateExpression (FormSet, CurrentForm, CurrentExpression);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
- if (CurrentExpression->Result.Type != EFI_IFR_TYPE_BOOLEAN) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- OpCodeDisabled = CurrentExpression->Result.Value.b;\r
- //\r
- // DisableIf Expression is only used once and not quequed, free it\r
- //\r
- DestroyExpression (CurrentExpression);\r
- }\r
-\r
- //\r
- // End of current Expression\r
- //\r
- CurrentExpression = NULL;\r
}\r
break;\r
}\r