/** @file\r
Parser for IFR binary encoding.\r
\r
-Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2007 - 2013, 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
UINT16 mExpressionOpCodeIndex;\r
\r
BOOLEAN mInScopeSubtitle;\r
-BOOLEAN mInScopeSuppress;\r
-BOOLEAN mInScopeGrayOut;\r
-BOOLEAN mInScopeDisable;\r
-FORM_EXPRESSION *mSuppressExpression;\r
-FORM_EXPRESSION *mGrayOutExpression;\r
-FORM_EXPRESSION *mDisableExpression;\r
-\r
+extern LIST_ENTRY gBrowserStorageList;\r
/**\r
Initialize Statement header members.\r
\r
{\r
FORM_BROWSER_STATEMENT *Statement;\r
EFI_IFR_STATEMENT_HEADER *StatementHdr;\r
+ INTN ConditionalExprCount; \r
\r
if (Form == NULL) {\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
-\r
- if (mInScopeDisable) {\r
- Statement->DisableExpression = mDisableExpression;\r
+ ConditionalExprCount = GetConditionalExpressionCount(ExpressStatement);\r
+ if (ConditionalExprCount > 0) {\r
+ //\r
+ // Form is inside of suppressif\r
+ //\r
+ \r
+ Statement->Expression = (FORM_EXPRESSION_LIST *) AllocatePool( \r
+ (UINTN) (sizeof(FORM_EXPRESSION_LIST) + ((ConditionalExprCount -1) * sizeof(FORM_EXPRESSION *))));\r
+ ASSERT (Statement->Expression != NULL);\r
+ Statement->Expression->Count = (UINTN) ConditionalExprCount;\r
+ Statement->Expression->Signature = FORM_EXPRESSION_LIST_SIGNATURE;\r
+ CopyMem (Statement->Expression->Expression, GetConditionalExpressionList(ExpressStatement), (UINTN) (sizeof (FORM_EXPRESSION *) * ConditionalExprCount));\r
}\r
\r
Statement->InSubtitle = mInScopeSubtitle;\r
FORMSET_STORAGE *Storage;\r
NAME_VALUE_NODE *NameValueNode;\r
EFI_STATUS Status;\r
+ BOOLEAN Find;\r
\r
Statement = CreateStatement (OpCodeData, FormSet, Form);\r
if (Statement == NULL) {\r
Storage = FORMSET_STORAGE_FROM_LINK (Link);\r
\r
if (Storage->VarStoreId == Statement->VarStoreId) {\r
- Statement->Storage = Storage;\r
+ Statement->Storage = Storage->BrowserStorage;\r
break;\r
}\r
\r
\r
if (Statement->Storage->Type == EFI_HII_VARSTORE_NAME_VALUE) {\r
//\r
- // Insert to Name/Value varstore list\r
+ // Check whether old string node already exist.\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
+ Find = FALSE;\r
+ if (!IsListEmpty(&Statement->Storage->NameValueListHead)) { \r
+ Link = GetFirstNode (&Statement->Storage->NameValueListHead);\r
+ while (!IsNull (&Statement->Storage->NameValueListHead, Link)) {\r
+ NameValueNode = NAME_VALUE_NODE_FROM_LINK (Link);\r
\r
- InsertTailList (&Statement->Storage->NameValueListHead, &NameValueNode->Link);\r
+ if (StrCmp (Statement->VariableName, NameValueNode->Name) == 0) {\r
+ Find = TRUE;\r
+ break;\r
+ }\r
+\r
+ Link = GetNextNode (&Statement->Storage->NameValueListHead, Link);\r
+ }\r
+ }\r
+\r
+ if (!Find) {\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
\r
return Expression;\r
}\r
\r
-\r
-/**\r
- Allocate a FORMSET_STORAGE data structure and insert to FormSet Storage List.\r
-\r
- @param FormSet Pointer of the current FormSet\r
-\r
- @return Pointer to a FORMSET_STORAGE data structure.\r
-\r
-**/\r
-FORMSET_STORAGE *\r
-CreateStorage (\r
- IN FORM_BROWSER_FORMSET *FormSet\r
- )\r
-{\r
- FORMSET_STORAGE *Storage;\r
-\r
- Storage = AllocateZeroPool (sizeof (FORMSET_STORAGE));\r
- ASSERT (Storage != NULL);\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
EFI_STATUS\r
InitializeConfigHdr (\r
IN FORM_BROWSER_FORMSET *FormSet,\r
- IN OUT FORMSET_STORAGE *Storage\r
+ IN OUT BROWSER_STORAGE *Storage\r
)\r
{\r
CHAR16 *Name;\r
\r
- if (Storage->Type == EFI_HII_VARSTORE_BUFFER) {\r
+ if (Storage->Type == EFI_HII_VARSTORE_BUFFER || \r
+ Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER) {\r
Name = Storage->Name;\r
} else {\r
Name = NULL;\r
return EFI_NOT_FOUND;\r
}\r
\r
- Storage->ConfigRequest = AllocateCopyPool (StrSize (Storage->ConfigHdr), Storage->ConfigHdr);\r
- Storage->SpareStrLen = 0;\r
-\r
return EFI_SUCCESS;\r
}\r
\r
+/**\r
+ Find the global storage link base on the input storate type, name and guid.\r
+\r
+ @param StorageType Storage type.\r
+ @param StorageGuid Storage guid.\r
+ @param StorageName Storage Name.\r
+\r
+ @return Pointer to a GLOBAL_STORAGE data structure.\r
+\r
+**/\r
+BROWSER_STORAGE *\r
+FindStorageInList (\r
+ IN UINT8 StorageType,\r
+ IN EFI_GUID *StorageGuid,\r
+ IN CHAR16 *StorageName\r
+ )\r
+{\r
+ LIST_ENTRY *Link;\r
+ BROWSER_STORAGE *BrowserStorage;\r
+\r
+ Link = GetFirstNode (&gBrowserStorageList);\r
+ while (!IsNull (&gBrowserStorageList, Link)) {\r
+ BrowserStorage = BROWSER_STORAGE_FROM_LINK (Link);\r
+\r
+ if ((BrowserStorage->Type == StorageType) && CompareGuid (&BrowserStorage->Guid, StorageGuid)) {\r
+ if (StorageType == EFI_HII_VARSTORE_NAME_VALUE) {\r
+ return BrowserStorage;\r
+ }\r
+\r
+ if (StrCmp (BrowserStorage->Name, StorageName) == 0) {\r
+ return BrowserStorage;\r
+ }\r
+ }\r
+\r
+ //\r
+ // Get Next Storage.\r
+ //\r
+ Link = GetNextNode (&gBrowserStorageList, Link);\r
+ }\r
+\r
+ return NULL;\r
+}\r
+\r
+/**\r
+ Intialize the Global Storage.\r
+\r
+ @param BrowserStorage Pointer to the global storage.\r
+ @param StorageType Storage type.\r
+ @param OpCodeData Binary data for this opcode.\r
+\r
+**/\r
+VOID\r
+IntializeBrowserStorage (\r
+ IN BROWSER_STORAGE *BrowserStorage,\r
+ IN UINT8 StorageType,\r
+ IN UINT8 *OpCodeData\r
+ )\r
+{\r
+ switch (StorageType) {\r
+ case EFI_HII_VARSTORE_BUFFER:\r
+ CopyMem (&BrowserStorage->Guid, &((EFI_IFR_VARSTORE *) OpCodeData)->Guid, sizeof (EFI_GUID));\r
+ CopyMem (&BrowserStorage->Size, &((EFI_IFR_VARSTORE *) OpCodeData)->Size, sizeof (UINT16));\r
+\r
+ BrowserStorage->Buffer = AllocateZeroPool (BrowserStorage->Size);\r
+ BrowserStorage->EditBuffer = AllocateZeroPool (BrowserStorage->Size);\r
+ break;\r
+\r
+ case EFI_HII_VARSTORE_EFI_VARIABLE:\r
+ case EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER:\r
+ CopyMem (&BrowserStorage->Guid, &((EFI_IFR_VARSTORE_EFI *) OpCodeData)->Guid, sizeof (EFI_GUID));\r
+ CopyMem (&BrowserStorage->Attributes, &((EFI_IFR_VARSTORE_EFI *) OpCodeData)->Attributes, sizeof (UINT32));\r
+ CopyMem (&BrowserStorage->Size, &((EFI_IFR_VARSTORE_EFI *) OpCodeData)->Size, sizeof (UINT16));\r
+\r
+ if (StorageType == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER) {\r
+ BrowserStorage->Buffer = AllocateZeroPool (BrowserStorage->Size);\r
+ BrowserStorage->EditBuffer = AllocateZeroPool (BrowserStorage->Size);\r
+ }\r
+ break;\r
+\r
+ case EFI_HII_VARSTORE_NAME_VALUE:\r
+ CopyMem (&BrowserStorage->Guid, &((EFI_IFR_VARSTORE_NAME_VALUE *) OpCodeData)->Guid, sizeof (EFI_GUID));\r
+\r
+ InitializeListHead (&BrowserStorage->NameValueListHead);\r
+ break;\r
+\r
+ default:\r
+ break;\r
+ }\r
+}\r
+\r
+/**\r
+ Allocate a FORMSET_STORAGE data structure and insert to FormSet Storage List.\r
+\r
+ @param FormSet Pointer of the current FormSet\r
+ @param StorageType Storage type.\r
+ @param OpCodeData Binary data for this opcode.\r
+\r
+ @return Pointer to a FORMSET_STORAGE data structure.\r
+\r
+**/\r
+FORMSET_STORAGE *\r
+CreateStorage (\r
+ IN FORM_BROWSER_FORMSET *FormSet,\r
+ IN UINT8 StorageType,\r
+ IN UINT8 *OpCodeData\r
+ )\r
+{\r
+ FORMSET_STORAGE *Storage;\r
+ CHAR16 *UnicodeString;\r
+ UINT16 Index;\r
+ BROWSER_STORAGE *BrowserStorage;\r
+ EFI_GUID *StorageGuid;\r
+ CHAR8 *StorageName;\r
+\r
+ UnicodeString = NULL;\r
+ StorageName = NULL;\r
+ switch (StorageType) {\r
+ case EFI_HII_VARSTORE_BUFFER:\r
+ StorageGuid = (EFI_GUID *) (CHAR8*) &((EFI_IFR_VARSTORE *) OpCodeData)->Guid;\r
+ StorageName = (CHAR8 *) ((EFI_IFR_VARSTORE *) OpCodeData)->Name;\r
+ break;\r
+\r
+ case EFI_HII_VARSTORE_EFI_VARIABLE:\r
+ case EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER:\r
+ StorageGuid = (EFI_GUID *) (CHAR8*) &((EFI_IFR_VARSTORE_EFI *) OpCodeData)->Guid;\r
+ StorageName = (CHAR8 *) ((EFI_IFR_VARSTORE_EFI *) OpCodeData)->Name;\r
+ break;\r
+\r
+ default:\r
+ ASSERT (StorageType == EFI_HII_VARSTORE_NAME_VALUE);\r
+ StorageGuid = &((EFI_IFR_VARSTORE_NAME_VALUE *) OpCodeData)->Guid;\r
+ break;\r
+ }\r
+\r
+ if (StorageType != EFI_HII_VARSTORE_NAME_VALUE) {\r
+ ASSERT (StorageName != NULL);\r
+\r
+ UnicodeString = AllocateZeroPool (AsciiStrSize (StorageName) * 2);\r
+ ASSERT (UnicodeString != NULL);\r
+ for (Index = 0; StorageName[Index] != 0; Index++) {\r
+ UnicodeString[Index] = (CHAR16) StorageName[Index];\r
+ }\r
+ }\r
+\r
+ Storage = AllocateZeroPool (sizeof (FORMSET_STORAGE));\r
+ ASSERT (Storage != NULL);\r
+ Storage->Signature = FORMSET_STORAGE_SIGNATURE;\r
+ InsertTailList (&FormSet->StorageListHead, &Storage->Link);\r
+\r
+ BrowserStorage = FindStorageInList(StorageType, StorageGuid, UnicodeString);\r
+ if (BrowserStorage == NULL) {\r
+ BrowserStorage = AllocateZeroPool (sizeof (BROWSER_STORAGE));\r
+ ASSERT (BrowserStorage != NULL);\r
+\r
+ BrowserStorage->Signature = BROWSER_STORAGE_SIGNATURE;\r
+ InsertTailList (&gBrowserStorageList, &BrowserStorage->Link);\r
+\r
+ IntializeBrowserStorage (BrowserStorage, StorageType, OpCodeData);\r
+ BrowserStorage->Type = StorageType;\r
+ if (StorageType != EFI_HII_VARSTORE_NAME_VALUE) {\r
+ BrowserStorage->Name = UnicodeString;\r
+ }\r
+\r
+ InitializeConfigHdr (FormSet, BrowserStorage);\r
+ }\r
+ //\r
+ // Add count because one formset storage use this global storage.\r
+ //\r
+ BrowserStorage->ReferenceCount++;\r
+\r
+ Storage->BrowserStorage = BrowserStorage;\r
+ Storage->ConfigRequest = AllocateCopyPool (StrSize (BrowserStorage->ConfigHdr), BrowserStorage->ConfigHdr);\r
+ Storage->SpareStrLen = 0;\r
+\r
+ return Storage;\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
+ @param Form Pointer of the current form.\r
\r
@retval EFI_SUCCESS Function success.\r
@retval EFI_INVALID_PARAMETER No storage associated with the Question.\r
EFI_STATUS\r
InitializeRequestElement (\r
IN OUT FORM_BROWSER_FORMSET *FormSet,\r
- IN OUT FORM_BROWSER_STATEMENT *Question\r
+ IN OUT FORM_BROWSER_STATEMENT *Question,\r
+ IN OUT FORM_BROWSER_FORM *Form\r
)\r
{\r
- FORMSET_STORAGE *Storage;\r
+ BROWSER_STORAGE *Storage;\r
+ FORMSET_STORAGE *FormsetStorage;\r
UINTN StrLen;\r
UINTN StringSize;\r
CHAR16 *NewStr;\r
CHAR16 RequestElement[30];\r
+ LIST_ENTRY *Link;\r
+ BOOLEAN Find;\r
+ FORM_BROWSER_CONFIG_REQUEST *ConfigInfo;\r
\r
Storage = Question->Storage;\r
if (Storage == NULL) {\r
//\r
// Prepare <RequestElement>\r
//\r
- if (Storage->Type == EFI_HII_VARSTORE_BUFFER) {\r
+ if (Storage->Type == EFI_HII_VARSTORE_BUFFER || \r
+ Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER) {\r
StrLen = UnicodeSPrint (\r
RequestElement,\r
30 * sizeof (CHAR16),\r
return EFI_SUCCESS;\r
}\r
\r
+ //\r
+ // Find Formset Storage for this Question\r
+ //\r
+ FormsetStorage = NULL;\r
+ Link = GetFirstNode (&FormSet->StorageListHead);\r
+ while (!IsNull (&FormSet->StorageListHead, Link)) {\r
+ FormsetStorage = FORMSET_STORAGE_FROM_LINK (Link);\r
+\r
+ if (FormsetStorage->VarStoreId == Question->VarStoreId) {\r
+ break;\r
+ }\r
+\r
+ Link = GetNextNode (&FormSet->StorageListHead, Link);\r
+ }\r
+ ASSERT (FormsetStorage != NULL);\r
+\r
//\r
// Append <RequestElement> to <ConfigRequest>\r
//\r
- if (StrLen > Storage->SpareStrLen) {\r
+ if (StrLen > FormsetStorage->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
+ StringSize = (FormsetStorage->ConfigRequest != NULL) ? StrSize (FormsetStorage->ConfigRequest) : sizeof (CHAR16);\r
NewStr = AllocateZeroPool (StringSize + CONFIG_REQUEST_STRING_INCREMENTAL * sizeof (CHAR16));\r
ASSERT (NewStr != NULL);\r
- if (Storage->ConfigRequest != NULL) {\r
- CopyMem (NewStr, Storage->ConfigRequest, StringSize);\r
- FreePool (Storage->ConfigRequest);\r
+ if (FormsetStorage->ConfigRequest != NULL) {\r
+ CopyMem (NewStr, FormsetStorage->ConfigRequest, StringSize);\r
+ FreePool (FormsetStorage->ConfigRequest);\r
}\r
- Storage->ConfigRequest = NewStr;\r
- Storage->SpareStrLen = CONFIG_REQUEST_STRING_INCREMENTAL;\r
+ FormsetStorage->ConfigRequest = NewStr;\r
+ FormsetStorage->SpareStrLen = CONFIG_REQUEST_STRING_INCREMENTAL;\r
}\r
\r
- StrCat (Storage->ConfigRequest, RequestElement);\r
- Storage->ElementCount++;\r
- Storage->SpareStrLen -= StrLen;\r
+ StrCat (FormsetStorage->ConfigRequest, RequestElement);\r
+ FormsetStorage->ElementCount++;\r
+ FormsetStorage->SpareStrLen -= StrLen;\r
\r
+ //\r
+ // Update the Config Request info saved in the form.\r
+ //\r
+ ConfigInfo = NULL;\r
+ Find = FALSE;\r
+ Link = GetFirstNode (&Form->ConfigRequestHead);\r
+ while (!IsNull (&Form->ConfigRequestHead, Link)) {\r
+ ConfigInfo = FORM_BROWSER_CONFIG_REQUEST_FROM_LINK (Link);\r
+\r
+ if (ConfigInfo != NULL && ConfigInfo->Storage == Storage) {\r
+ Find = TRUE;\r
+ break;\r
+ }\r
+\r
+ Link = GetNextNode (&Form->ConfigRequestHead, Link);\r
+ }\r
+\r
+ if (!Find) {\r
+ ConfigInfo = AllocateZeroPool(sizeof (FORM_BROWSER_CONFIG_REQUEST));\r
+ ASSERT (ConfigInfo != NULL);\r
+ ConfigInfo->Signature = FORM_BROWSER_CONFIG_REQUEST_SIGNATURE;\r
+ ConfigInfo->ConfigRequest = AllocateCopyPool (StrSize (Storage->ConfigHdr), Storage->ConfigHdr);\r
+ ConfigInfo->SpareStrLen = 0;\r
+ ConfigInfo->Storage = Storage;\r
+ InsertTailList(&Form->ConfigRequestHead, &ConfigInfo->Link);\r
+ }\r
+\r
+ //\r
+ // Append <RequestElement> to <ConfigRequest>\r
+ //\r
+ if (StrLen > ConfigInfo->SpareStrLen) {\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
+ ASSERT (NewStr != NULL);\r
+ if (ConfigInfo->ConfigRequest != NULL) {\r
+ CopyMem (NewStr, ConfigInfo->ConfigRequest, StringSize);\r
+ FreePool (ConfigInfo->ConfigRequest);\r
+ }\r
+ ConfigInfo->ConfigRequest = NewStr;\r
+ ConfigInfo->SpareStrLen = CONFIG_REQUEST_STRING_INCREMENTAL;\r
+ }\r
+\r
+ StrCat (ConfigInfo->ConfigRequest, RequestElement);\r
+ ConfigInfo->ElementCount++;\r
+ ConfigInfo->SpareStrLen -= StrLen;\r
return EFI_SUCCESS;\r
}\r
\r
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
- if (Storage->Name != NULL) {\r
- FreePool (Storage->Name);\r
- }\r
- if (Storage->Buffer != NULL) {\r
- FreePool (Storage->Buffer);\r
- }\r
- if (Storage->EditBuffer != NULL) {\r
- FreePool (Storage->EditBuffer);\r
- }\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
- if (NameValueNode->Name != NULL) {\r
- FreePool (NameValueNode->Name);\r
- }\r
- if (NameValueNode->Value != NULL) {\r
- FreePool (NameValueNode->Value);\r
- }\r
- if (NameValueNode->EditValue != NULL) {\r
- FreePool (NameValueNode->EditValue);\r
- }\r
- FreePool (NameValueNode);\r
- }\r
-\r
- if (Storage->ConfigHdr != NULL) {\r
- FreePool (Storage->ConfigHdr);\r
- }\r
if (Storage->ConfigRequest != NULL) {\r
FreePool (Storage->ConfigRequest);\r
}\r
\r
+ //\r
+ // Minus the reference to the global storage.\r
+ //\r
+ ASSERT (Storage->BrowserStorage->ReferenceCount > 0);\r
+ Storage->BrowserStorage->ReferenceCount--; \r
+\r
FreePool (Storage);\r
}\r
\r
/**\r
Free resources of a Statement.\r
\r
+ @param FormSet Pointer of the FormSet\r
@param Statement Pointer of the Statement\r
\r
**/\r
VOID\r
DestroyStatement (\r
+ IN FORM_BROWSER_FORMSET *FormSet,\r
IN OUT FORM_BROWSER_STATEMENT *Statement\r
)\r
{\r
while (!IsListEmpty (&Statement->OptionListHead)) {\r
Link = GetFirstNode (&Statement->OptionListHead);\r
Option = QUESTION_OPTION_FROM_LINK (Link);\r
+ if (Option->SuppressExpression != NULL) {\r
+ FreePool (Option->SuppressExpression);\r
+ }\r
RemoveEntryList (&Option->Link);\r
\r
FreePool (Option);\r
DestroyExpression (Expression);\r
}\r
\r
+ if (Statement->Expression != NULL) {\r
+ FreePool (Statement->Expression);\r
+ }\r
+\r
if (Statement->VariableName != NULL) {\r
FreePool (Statement->VariableName);\r
}\r
if (Statement->BufferValue != NULL) {\r
FreePool (Statement->BufferValue);\r
}\r
+ if (Statement->Operand == EFI_IFR_STRING_OP || Statement->Operand == EFI_IFR_PASSWORD_OP) {\r
+ DeleteString(Statement->HiiValue.Value.string, FormSet->HiiHandle);\r
+ }\r
}\r
\r
\r
/**\r
Free resources of a Form.\r
\r
+ @param FormSet Pointer of the FormSet\r
@param Form Pointer of the Form.\r
\r
**/\r
VOID\r
DestroyForm (\r
- IN OUT FORM_BROWSER_FORM *Form\r
+ IN FORM_BROWSER_FORMSET *FormSet,\r
+ IN OUT FORM_BROWSER_FORM *Form\r
)\r
{\r
LIST_ENTRY *Link;\r
FORM_EXPRESSION *Expression;\r
FORM_BROWSER_STATEMENT *Statement;\r
+ FORM_BROWSER_CONFIG_REQUEST *ConfigInfo;\r
\r
//\r
// Free Form Expressions\r
Statement = FORM_BROWSER_STATEMENT_FROM_LINK (Link);\r
RemoveEntryList (&Statement->Link);\r
\r
- DestroyStatement (Statement);\r
+ DestroyStatement (FormSet, Statement);\r
+ }\r
+\r
+ //\r
+ // Free ConfigRequest string.\r
+ //\r
+ while (!IsListEmpty (&Form->ConfigRequestHead)) {\r
+ Link = GetFirstNode (&Form->ConfigRequestHead);\r
+ ConfigInfo = FORM_BROWSER_CONFIG_REQUEST_FROM_LINK (Link);\r
+ RemoveEntryList (&ConfigInfo->Link);\r
+\r
+ FreePool (ConfigInfo->ConfigRequest);\r
+ FreePool (ConfigInfo);\r
+ }\r
+\r
+ if (Form->SuppressExpression != NULL) {\r
+ FreePool (Form->SuppressExpression);\r
}\r
\r
//\r
Form = FORM_BROWSER_FORM_FROM_LINK (Link);\r
RemoveEntryList (&Form->Link);\r
\r
- DestroyForm (Form);\r
+ DestroyForm (FormSet, Form);\r
}\r
}\r
\r
)\r
{\r
EFI_STATUS Status;\r
- UINT16 Index;\r
FORM_BROWSER_FORM *CurrentForm;\r
FORM_BROWSER_STATEMENT *CurrentStatement;\r
EXPRESSION_OPCODE *ExpressionOpCode;\r
QUESTION_DEFAULT *CurrentDefault;\r
QUESTION_OPTION *CurrentOption;\r
UINT8 Width;\r
- CHAR8 *AsciiString;\r
UINT16 NumberOfStatement;\r
UINT16 NumberOfExpression;\r
EFI_IMAGE_ID *ImageId;\r
BOOLEAN SuppressForQuestion;\r
BOOLEAN SuppressForOption;\r
- BOOLEAN InScopeOptionSuppress;\r
- FORM_EXPRESSION *OptionSuppressExpression;\r
- BOOLEAN InScopeFormSuppress;\r
- FORM_EXPRESSION *FormSuppressExpression;\r
UINT16 DepthOfDisable;\r
BOOLEAN OpCodeDisabled;\r
BOOLEAN SingleOpCodeExpression;\r
FORMSET_STORAGE *VarStorage;\r
LIST_ENTRY *MapExpressionList;\r
EFI_VARSTORE_ID TempVarstoreId;\r
+ BOOLEAN InScopeDisable;\r
+ INTN ConditionalExprCount;\r
\r
mInScopeSubtitle = FALSE;\r
SuppressForQuestion = FALSE;\r
SuppressForOption = FALSE;\r
- InScopeFormSuppress = FALSE;\r
- mInScopeSuppress = FALSE;\r
- InScopeOptionSuppress = FALSE;\r
- mInScopeGrayOut = FALSE;\r
- mInScopeDisable = FALSE;\r
+ InScopeDisable = FALSE;\r
DepthOfDisable = 0;\r
OpCodeDisabled = FALSE;\r
SingleOpCodeExpression = FALSE;\r
CurrentExpression = NULL;\r
CurrentDefault = NULL;\r
CurrentOption = NULL;\r
- OptionSuppressExpression = NULL;\r
- FormSuppressExpression = NULL;\r
ImageId = NULL;\r
MapMethod = NULL;\r
MapScopeDepth = 0;\r
VarStorage = NULL;\r
MapExpressionList = NULL;\r
TempVarstoreId = 0;\r
+ ConditionalExprCount = 0;\r
\r
//\r
// Get the number of Statements and Expressions\r
InitializeListHead (&FormSet->StorageListHead);\r
InitializeListHead (&FormSet->DefaultStoreListHead);\r
InitializeListHead (&FormSet->FormListHead);\r
+ InitializeListHead (&FormSet->ExpressionListHead);\r
ResetCurrentExpressionStack ();\r
ResetMapExpressionListStack ();\r
\r
\r
if (ScopeOpCode == EFI_IFR_DISABLE_IF_OP) {\r
if (DepthOfDisable == 0) {\r
- mInScopeDisable = FALSE;\r
+ InScopeDisable = FALSE;\r
OpCodeDisabled = FALSE;\r
} else {\r
DepthOfDisable--;\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
+ case EFI_IFR_EQ_ID_VAL_LIST_OP:\r
CopyMem (&ExpressionOpCode->QuestionId, &((EFI_IFR_EQ_ID_VAL_LIST *) OpCodeData)->QuestionId, sizeof (EFI_QUESTION_ID));\r
CopyMem (&ExpressionOpCode->ListLength, &((EFI_IFR_EQ_ID_VAL_LIST *) OpCodeData)->ListLength, sizeof (UINT16));\r
ExpressionOpCode->ValueList = AllocateCopyPool (ExpressionOpCode->ListLength * sizeof (UINT16), &((EFI_IFR_EQ_ID_VAL_LIST *) OpCodeData)->ValueList);\r
while (!IsNull (&FormSet->StorageListHead, Link)) {\r
VarStorage = FORMSET_STORAGE_FROM_LINK (Link);\r
if (VarStorage->VarStoreId == ((EFI_IFR_GET *) OpCodeData)->VarStoreId) {\r
- ExpressionOpCode->VarStorage = VarStorage;\r
+ ExpressionOpCode->VarStorage = VarStorage->BrowserStorage;\r
break;\r
}\r
Link = GetNextNode (&FormSet->StorageListHead, Link);\r
ExpressionOpCode->ValueWidth = (UINT8) sizeof (EFI_IFR_TIME);\r
break;\r
\r
+ case EFI_IFR_TYPE_REF:\r
+ ExpressionOpCode->ValueWidth = (UINT8) sizeof (EFI_IFR_REF);\r
+ break;\r
+\r
case EFI_IFR_TYPE_OTHER:\r
case EFI_IFR_TYPE_UNDEFINED:\r
case EFI_IFR_TYPE_ACTION:\r
//\r
SingleOpCodeExpression = FALSE;\r
\r
- if (mInScopeDisable && CurrentForm == NULL) {\r
+ if (InScopeDisable && CurrentForm == NULL) {\r
//\r
// This is DisableIf expression for Form, it should be a constant expression\r
//\r
FormSet->NumberOfClassGuid = (UINT8) (((EFI_IFR_FORM_SET *) OpCodeData)->Flags & 0x3);\r
CopyMem (FormSet->ClassGuid, OpCodeData + sizeof (EFI_IFR_FORM_SET), FormSet->NumberOfClassGuid * sizeof (EFI_GUID));\r
}\r
-\r
- InitializeListHead (&FormSet->ExpressionListHead);\r
break;\r
\r
case EFI_IFR_FORM_OP:\r
CurrentForm->Signature = FORM_BROWSER_FORM_SIGNATURE;\r
InitializeListHead (&CurrentForm->ExpressionListHead);\r
InitializeListHead (&CurrentForm->StatementListHead);\r
+ InitializeListHead (&CurrentForm->ConfigRequestHead);\r
\r
CurrentForm->FormType = STANDARD_MAP_FORM_TYPE;\r
+ CurrentForm->NvUpdateRequired = FALSE;\r
CopyMem (&CurrentForm->FormId, &((EFI_IFR_FORM *) OpCodeData)->FormId, sizeof (UINT16));\r
CopyMem (&CurrentForm->FormTitle, &((EFI_IFR_FORM *) OpCodeData)->FormTitle, sizeof (EFI_STRING_ID));\r
\r
- if (InScopeFormSuppress) {\r
+ ConditionalExprCount = GetConditionalExpressionCount(ExpressForm);\r
+ if ( ConditionalExprCount > 0) {\r
//\r
// Form is inside of suppressif\r
//\r
- CurrentForm->SuppressExpression = FormSuppressExpression;\r
+ CurrentForm->SuppressExpression = (FORM_EXPRESSION_LIST *) AllocatePool( \r
+ (UINTN) (sizeof(FORM_EXPRESSION_LIST) + ((ConditionalExprCount -1) * sizeof(FORM_EXPRESSION *))));\r
+ ASSERT (CurrentForm->SuppressExpression != NULL);\r
+ CurrentForm->SuppressExpression->Count = (UINTN) ConditionalExprCount;\r
+ CurrentForm->SuppressExpression->Signature = FORM_EXPRESSION_LIST_SIGNATURE;\r
+ CopyMem (CurrentForm->SuppressExpression->Expression, GetConditionalExpressionList(ExpressForm), (UINTN) (sizeof (FORM_EXPRESSION *) * ConditionalExprCount));\r
}\r
\r
if (Scope != 0) {\r
CurrentForm = AllocateZeroPool (sizeof (FORM_BROWSER_FORM));\r
ASSERT (CurrentForm != NULL);\r
CurrentForm->Signature = FORM_BROWSER_FORM_SIGNATURE;\r
+ CurrentForm->NvUpdateRequired = FALSE;\r
InitializeListHead (&CurrentForm->ExpressionListHead);\r
InitializeListHead (&CurrentForm->StatementListHead);\r
+ InitializeListHead (&CurrentForm->ConfigRequestHead);\r
CopyMem (&CurrentForm->FormId, &((EFI_IFR_FORM *) OpCodeData)->FormId, sizeof (UINT16));\r
\r
MapMethod = (EFI_IFR_FORM_MAP_METHOD *) (OpCodeData + sizeof (EFI_IFR_FORM_MAP));\r
CopyMem (&CurrentForm->FormTitle, &MapMethod->MethodTitle, sizeof (EFI_STRING_ID));\r
}\r
\r
- if (InScopeFormSuppress) {\r
+ ConditionalExprCount = GetConditionalExpressionCount(ExpressForm);\r
+ if ( ConditionalExprCount > 0) {\r
//\r
// Form is inside of suppressif\r
//\r
- CurrentForm->SuppressExpression = FormSuppressExpression;\r
+ CurrentForm->SuppressExpression = (FORM_EXPRESSION_LIST *) AllocatePool( \r
+ (UINTN) (sizeof(FORM_EXPRESSION_LIST) + ((ConditionalExprCount -1) * sizeof(FORM_EXPRESSION *))));\r
+ ASSERT (CurrentForm->SuppressExpression != NULL);\r
+ CurrentForm->SuppressExpression->Count = (UINTN) ConditionalExprCount;\r
+ CurrentForm->SuppressExpression->Signature = FORM_EXPRESSION_LIST_SIGNATURE;\r
+ CopyMem (CurrentForm->SuppressExpression->Expression, GetConditionalExpressionList(ExpressForm), (UINTN) (sizeof (FORM_EXPRESSION *) * ConditionalExprCount));\r
}\r
\r
if (Scope != 0) {\r
//\r
// Create a buffer Storage for this FormSet\r
//\r
- Storage = CreateStorage (FormSet);\r
- Storage->Type = EFI_HII_VARSTORE_BUFFER;\r
-\r
+ Storage = CreateStorage (FormSet, EFI_HII_VARSTORE_BUFFER, OpCodeData);\r
CopyMem (&Storage->VarStoreId, &((EFI_IFR_VARSTORE *) OpCodeData)->VarStoreId, sizeof (EFI_VARSTORE_ID));\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
- for (Index = 0; AsciiString[Index] != 0; Index++) {\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
-\r
+ Storage = CreateStorage (FormSet, EFI_HII_VARSTORE_NAME_VALUE, OpCodeData);\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
//\r
// Create a EFI variable Storage for this FormSet\r
//\r
- Storage = CreateStorage (FormSet);\r
- Storage->Type = EFI_HII_VARSTORE_EFI_VARIABLE;\r
-\r
+ if (OpCodeLength < sizeof (EFI_IFR_VARSTORE_EFI)) {\r
+ Storage = CreateStorage (FormSet, EFI_HII_VARSTORE_EFI_VARIABLE, OpCodeData);\r
+ } else {\r
+ Storage = CreateStorage (FormSet, EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER, OpCodeData);\r
+ }\r
CopyMem (&Storage->VarStoreId, &((EFI_IFR_VARSTORE_EFI *) OpCodeData)->VarStoreId, sizeof (EFI_VARSTORE_ID));\r
- CopyMem (&Storage->Guid, &((EFI_IFR_VARSTORE_EFI *) OpCodeData)->Guid, sizeof (EFI_GUID));\r
- CopyMem (&Storage->Attributes, &((EFI_IFR_VARSTORE_EFI *) OpCodeData)->Attributes, sizeof (UINT32));\r
break;\r
\r
//\r
case EFI_IFR_REF_OP:\r
CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
ASSERT (CurrentStatement != NULL);\r
- CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_UNDEFINED;\r
- CopyMem (&CurrentStatement->RefFormId, &((EFI_IFR_REF *) OpCodeData)->FormId, sizeof (EFI_FORM_ID));\r
- if (OpCodeLength >= sizeof (EFI_IFR_REF2)) {\r
- CopyMem (&CurrentStatement->RefQuestionId, &((EFI_IFR_REF2 *) OpCodeData)->QuestionId, sizeof (EFI_QUESTION_ID));\r
+ Value = &CurrentStatement->HiiValue;\r
+ Value->Type = EFI_IFR_TYPE_REF;\r
+ if (OpCodeLength >= sizeof (EFI_IFR_REF)) {\r
+ CopyMem (&Value->Value.ref.FormId, &((EFI_IFR_REF *) OpCodeData)->FormId, sizeof (EFI_FORM_ID));\r
\r
- if (OpCodeLength >= sizeof (EFI_IFR_REF3)) {\r
- CopyMem (&CurrentStatement->RefFormSetId, &((EFI_IFR_REF3 *) OpCodeData)->FormSetId, sizeof (EFI_GUID));\r
+ if (OpCodeLength >= sizeof (EFI_IFR_REF2)) {\r
+ CopyMem (&Value->Value.ref.QuestionId, &((EFI_IFR_REF2 *) OpCodeData)->QuestionId, sizeof (EFI_QUESTION_ID));\r
\r
- if (OpCodeLength >= sizeof (EFI_IFR_REF4)) {\r
- CopyMem (&CurrentStatement->RefDevicePath, &((EFI_IFR_REF4 *) OpCodeData)->DevicePath, sizeof (EFI_STRING_ID));\r
+ if (OpCodeLength >= sizeof (EFI_IFR_REF3)) {\r
+ CopyMem (&Value->Value.ref.FormSetGuid, &((EFI_IFR_REF3 *) OpCodeData)->FormSetId, sizeof (EFI_GUID));\r
+\r
+ if (OpCodeLength >= sizeof (EFI_IFR_REF4)) {\r
+ CopyMem (&Value->Value.ref.DevicePath, &((EFI_IFR_REF4 *) OpCodeData)->DevicePath, sizeof (EFI_STRING_ID));\r
+ }\r
}\r
}\r
}\r
+ CurrentStatement->StorageWidth = (UINT16) sizeof (EFI_HII_REF); \r
+ InitializeRequestElement (FormSet, CurrentStatement, CurrentForm);\r
break;\r
\r
case EFI_IFR_ONE_OF_OP:\r
CurrentStatement->Minimum = ((EFI_IFR_NUMERIC *) OpCodeData)->data.u8.MinValue;\r
CurrentStatement->Maximum = ((EFI_IFR_NUMERIC *) OpCodeData)->data.u8.MaxValue;\r
CurrentStatement->Step = ((EFI_IFR_NUMERIC *) OpCodeData)->data.u8.Step;\r
- CurrentStatement->StorageWidth = sizeof (UINT8);\r
+ CurrentStatement->StorageWidth = (UINT16) sizeof (UINT8);\r
Value->Type = EFI_IFR_TYPE_NUM_SIZE_8;\r
break;\r
\r
CopyMem (&CurrentStatement->Minimum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u16.MinValue, sizeof (UINT16));\r
CopyMem (&CurrentStatement->Maximum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u16.MaxValue, sizeof (UINT16));\r
CopyMem (&CurrentStatement->Step, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u16.Step, sizeof (UINT16));\r
- CurrentStatement->StorageWidth = sizeof (UINT16);\r
+ CurrentStatement->StorageWidth = (UINT16) sizeof (UINT16);\r
Value->Type = EFI_IFR_TYPE_NUM_SIZE_16;\r
break;\r
\r
CopyMem (&CurrentStatement->Minimum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u32.MinValue, sizeof (UINT32));\r
CopyMem (&CurrentStatement->Maximum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u32.MaxValue, sizeof (UINT32));\r
CopyMem (&CurrentStatement->Step, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u32.Step, sizeof (UINT32));\r
- CurrentStatement->StorageWidth = sizeof (UINT32);\r
+ CurrentStatement->StorageWidth = (UINT16) sizeof (UINT32);\r
Value->Type = EFI_IFR_TYPE_NUM_SIZE_32;\r
break;\r
\r
CopyMem (&CurrentStatement->Minimum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u64.MinValue, sizeof (UINT64));\r
CopyMem (&CurrentStatement->Maximum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u64.MaxValue, sizeof (UINT64));\r
CopyMem (&CurrentStatement->Step, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u64.Step, sizeof (UINT64));\r
- CurrentStatement->StorageWidth = sizeof (UINT64);\r
+ CurrentStatement->StorageWidth = (UINT16) sizeof (UINT64);\r
Value->Type = EFI_IFR_TYPE_NUM_SIZE_64;\r
break;\r
\r
break;\r
}\r
\r
- InitializeRequestElement (FormSet, CurrentStatement);\r
+ InitializeRequestElement (FormSet, CurrentStatement, CurrentForm);\r
\r
if ((Operand == EFI_IFR_ONE_OF_OP) && Scope != 0) {\r
SuppressForOption = TRUE;\r
ASSERT(CurrentStatement != NULL);\r
\r
CurrentStatement->Flags = ((EFI_IFR_CHECKBOX *) OpCodeData)->Flags;\r
- CurrentStatement->StorageWidth = sizeof (BOOLEAN);\r
+ CurrentStatement->StorageWidth = (UINT16) sizeof (BOOLEAN);\r
CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_BOOLEAN;\r
\r
- InitializeRequestElement (FormSet, CurrentStatement);\r
+ InitializeRequestElement (FormSet, CurrentStatement, CurrentForm);\r
\r
break;\r
\r
\r
CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_STRING;\r
CurrentStatement->BufferValue = AllocateZeroPool (CurrentStatement->StorageWidth + sizeof (CHAR16));\r
+ CurrentStatement->HiiValue.Value.string = NewString ((CHAR16*) CurrentStatement->BufferValue, FormSet->HiiHandle);\r
\r
- InitializeRequestElement (FormSet, CurrentStatement);\r
+ InitializeRequestElement (FormSet, CurrentStatement, CurrentForm);\r
break;\r
\r
case EFI_IFR_PASSWORD_OP:\r
\r
CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_STRING;\r
CurrentStatement->BufferValue = AllocateZeroPool ((CurrentStatement->StorageWidth + sizeof (CHAR16)));\r
+ CurrentStatement->HiiValue.Value.string = NewString ((CHAR16*) CurrentStatement->BufferValue, FormSet->HiiHandle);\r
\r
- InitializeRequestElement (FormSet, CurrentStatement);\r
+ InitializeRequestElement (FormSet, CurrentStatement, CurrentForm);\r
break;\r
\r
case EFI_IFR_DATE_OP:\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
+ CurrentStatement->StorageWidth = (UINT16) sizeof (EFI_HII_DATE);\r
\r
- InitializeRequestElement (FormSet, CurrentStatement);\r
+ InitializeRequestElement (FormSet, CurrentStatement, CurrentForm);\r
} else {\r
//\r
// Don't assign storage for RTC type of date/time\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
+ CurrentStatement->StorageWidth = (UINT16) sizeof (EFI_HII_TIME);\r
\r
- InitializeRequestElement (FormSet, CurrentStatement);\r
+ InitializeRequestElement (FormSet, CurrentStatement, CurrentForm);\r
} else {\r
//\r
// Don't assign storage for RTC type of date/time\r
\r
CurrentDefault->Value.Type = ((EFI_IFR_DEFAULT *) OpCodeData)->Type;\r
CopyMem (&CurrentDefault->DefaultId, &((EFI_IFR_DEFAULT *) OpCodeData)->DefaultId, sizeof (UINT16));\r
- CopyMem (&CurrentDefault->Value.Value, &((EFI_IFR_DEFAULT *) OpCodeData)->Value, sizeof (EFI_IFR_TYPE_VALUE));\r
- ExtendValueToU64 (&CurrentDefault->Value);\r
+ if (OpCodeLength > OFFSET_OF (EFI_IFR_DEFAULT, Value)) {\r
+ CopyMem (&CurrentDefault->Value.Value, &((EFI_IFR_DEFAULT *) OpCodeData)->Value, OpCodeLength - OFFSET_OF (EFI_IFR_DEFAULT, Value));\r
+ ExtendValueToU64 (&CurrentDefault->Value);\r
+ }\r
\r
//\r
// Insert to Default Value list of current Question\r
CurrentOption->Flags = ((EFI_IFR_ONE_OF_OPTION *) OpCodeData)->Flags;\r
CurrentOption->Value.Type = ((EFI_IFR_ONE_OF_OPTION *) OpCodeData)->Type;\r
CopyMem (&CurrentOption->Text, &((EFI_IFR_ONE_OF_OPTION *) OpCodeData)->Option, sizeof (EFI_STRING_ID));\r
- CopyMem (&CurrentOption->Value.Value, &((EFI_IFR_ONE_OF_OPTION *) OpCodeData)->Value, sizeof (EFI_IFR_TYPE_VALUE));\r
+ CopyMem (&CurrentOption->Value.Value, &((EFI_IFR_ONE_OF_OPTION *) OpCodeData)->Value, OpCodeLength - OFFSET_OF (EFI_IFR_ONE_OF_OPTION, Value));\r
ExtendValueToU64 (&CurrentOption->Value);\r
\r
- if (InScopeOptionSuppress) {\r
- CurrentOption->SuppressExpression = OptionSuppressExpression;\r
+ ConditionalExprCount = GetConditionalExpressionCount(ExpressOption);\r
+ if ( ConditionalExprCount > 0) {\r
+ //\r
+ // Form is inside of suppressif\r
+ //\r
+ CurrentOption->SuppressExpression = (FORM_EXPRESSION_LIST *) AllocatePool( \r
+ (UINTN) (sizeof(FORM_EXPRESSION_LIST) + ((ConditionalExprCount -1) * sizeof(FORM_EXPRESSION *))));\r
+ ASSERT (CurrentOption->SuppressExpression != NULL);\r
+ CurrentOption->SuppressExpression->Count = (UINTN) ConditionalExprCount;\r
+ CurrentOption->SuppressExpression->Signature = FORM_EXPRESSION_LIST_SIGNATURE;\r
+ CopyMem (CurrentOption->SuppressExpression->Expression, GetConditionalExpressionList(ExpressOption), (UINTN) (sizeof (FORM_EXPRESSION *) * ConditionalExprCount));\r
}\r
\r
//\r
CurrentStatement->StorageWidth = (UINT16) (CurrentStatement->MaxContainers * Width);\r
CurrentStatement->BufferValue = AllocateZeroPool (CurrentStatement->StorageWidth);\r
CurrentStatement->ValueType = CurrentOption->Value.Type;\r
+ if (CurrentStatement->HiiValue.Type == EFI_IFR_TYPE_BUFFER) {\r
+ CurrentStatement->HiiValue.Buffer = CurrentStatement->BufferValue;\r
+ CurrentStatement->HiiValue.BufferLen = CurrentStatement->StorageWidth;\r
+ }\r
\r
- InitializeRequestElement (FormSet, CurrentStatement);\r
+ InitializeRequestElement (FormSet, CurrentStatement, CurrentForm);\r
}\r
break;\r
\r
}\r
\r
if (SuppressForOption) {\r
- InScopeOptionSuppress = TRUE;\r
- OptionSuppressExpression = CurrentExpression;\r
+ PushConditionalExpression(CurrentExpression, ExpressOption); \r
} else if (SuppressForQuestion) {\r
- mInScopeSuppress = TRUE;\r
- mSuppressExpression = CurrentExpression;\r
+ PushConditionalExpression(CurrentExpression, ExpressStatement); \r
} else {\r
- InScopeFormSuppress = TRUE;\r
- FormSuppressExpression = CurrentExpression;\r
+ PushConditionalExpression(CurrentExpression, ExpressForm); \r
}\r
\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
+ PushConditionalExpression(CurrentExpression, ExpressStatement);\r
\r
//\r
// Take a look at next OpCode to see whether current expression consists\r
// This is DisableIf for Question, enqueue it to Form expression list\r
//\r
InsertTailList (&CurrentForm->ExpressionListHead, &CurrentExpression->Link);\r
+ PushConditionalExpression(CurrentExpression, ExpressStatement);\r
}\r
\r
- mDisableExpression = CurrentExpression;\r
- mInScopeDisable = TRUE;\r
- OpCodeDisabled = FALSE;\r
-\r
+ OpCodeDisabled = FALSE;\r
+ InScopeDisable = TRUE;\r
//\r
// Take a look at next OpCode to see whether current expression consists\r
// of single OpCode\r
CurrentStatement->RefreshInterval = ((EFI_IFR_REFRESH *) OpCodeData)->RefreshInterval;\r
break;\r
\r
+ //\r
+ // Refresh guid.\r
+ //\r
+ case EFI_IFR_REFRESH_ID_OP:\r
+ ASSERT (CurrentStatement != NULL);\r
+ CopyMem (&CurrentStatement->RefreshGuid, &((EFI_IFR_REFRESH_ID *) OpCodeData)->RefreshEventGroupId, sizeof (EFI_GUID));\r
+ break;\r
+\r
+ //\r
+ // Modal tag\r
+ //\r
+ case EFI_IFR_MODAL_TAG_OP:\r
+ ASSERT (CurrentForm != NULL);\r
+ CurrentForm->ModalForm = TRUE;\r
+ break;\r
+\r
+ //\r
+ // Lock tag, used by form and statement.\r
+ //\r
+ case EFI_IFR_LOCKED_OP:\r
+ //\r
+ // Get ScopeOpcode from top of stack\r
+ //\r
+ PopScope (&ScopeOpCode);\r
+ PushScope (ScopeOpCode);\r
+ switch (ScopeOpCode) {\r
+ case EFI_IFR_FORM_OP:\r
+ case EFI_IFR_FORM_MAP_OP:\r
+ ASSERT (CurrentForm != NULL);\r
+ CurrentForm->Locked = TRUE;\r
+ break;\r
+\r
+ default:\r
+ ASSERT (CurrentStatement != NULL);\r
+ CurrentStatement->Locked = TRUE;\r
+ } \r
+ break;\r
+\r
//\r
// Vendor specific\r
//\r
\r
case EFI_IFR_SUPPRESS_IF_OP:\r
if (SuppressForOption) {\r
- InScopeOptionSuppress = FALSE;\r
+ PopConditionalExpression(ExpressOption); \r
} else if (SuppressForQuestion) {\r
- mInScopeSuppress = FALSE;\r
+ PopConditionalExpression(ExpressStatement);\r
} else {\r
- InScopeFormSuppress = FALSE;\r
+ PopConditionalExpression(ExpressForm);\r
}\r
break;\r
\r
case EFI_IFR_GRAY_OUT_IF_OP:\r
- mInScopeGrayOut = FALSE;\r
+ PopConditionalExpression(ExpressStatement);\r
break;\r
\r
case EFI_IFR_DISABLE_IF_OP:\r
- mInScopeDisable = FALSE;\r
+ if (CurrentForm != NULL) {\r
+ PopConditionalExpression(ExpressStatement);\r
+ }\r
+ InScopeDisable = FALSE;\r
OpCodeDisabled = FALSE;\r
break;\r
\r
\r
default:\r
if (IsExpressionOpCode (ScopeOpCode)) {\r
- if (mInScopeDisable && CurrentForm == NULL) {\r
+ if (InScopeDisable && CurrentForm == NULL) {\r
//\r
// This is DisableIf expression for Form, it should be a constant expression\r
//\r