/** @file\r
Parser for IFR binary encoding.\r
\r
-Copyright (c) 2007 - 2012, 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
\r
UINT16 mStatementIndex;\r
UINT16 mExpressionOpCodeIndex;\r
-\r
+EFI_QUESTION_ID mUsedQuestionId;\r
BOOLEAN mInScopeSubtitle;\r
+extern LIST_ENTRY gBrowserStorageList;\r
/**\r
Initialize Statement header members.\r
\r
\r
if (Form == NULL) {\r
//\r
- // We are currently not in a Form Scope, so just skip this Statement\r
+ // Only guid op may out side the form level.\r
//\r
- return NULL;\r
+ ASSERT (((EFI_IFR_OP_HEADER *) OpCodeData)->OpCode == EFI_IFR_GUID_OP);\r
}\r
\r
Statement = &FormSet->StatementBuffer[mStatementIndex];\r
Statement->Signature = FORM_BROWSER_STATEMENT_SIGNATURE;\r
\r
Statement->Operand = ((EFI_IFR_OP_HEADER *) OpCodeData)->OpCode;\r
+ Statement->OpCode = (EFI_IFR_OP_HEADER *) OpCodeData;\r
\r
StatementHdr = (EFI_IFR_STATEMENT_HEADER *) (OpCodeData + sizeof (EFI_IFR_OP_HEADER));\r
CopyMem (&Statement->Prompt, &StatementHdr->Prompt, sizeof (EFI_STRING_ID));\r
//\r
// Insert this Statement into current Form\r
//\r
- InsertTailList (&Form->StatementListHead, &Statement->Link);\r
-\r
+ if (Form == NULL) {\r
+ InsertTailList (&FormSet->StatementListOSF, &Statement->Link);\r
+ } else {\r
+ InsertTailList (&Form->StatementListHead, &Statement->Link);\r
+ }\r
return Statement;\r
}\r
\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
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
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
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
while (!IsNull (&Form->ConfigRequestHead, Link)) {\r
ConfigInfo = FORM_BROWSER_CONFIG_REQUEST_FROM_LINK (Link);\r
\r
- if (ConfigInfo != NULL && ConfigInfo->Storage->VarStoreId == Storage->VarStoreId) {\r
+ if (ConfigInfo != NULL && ConfigInfo->Storage == Storage) {\r
Find = TRUE;\r
break;\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
{\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
CountOpCodes (FormSet, &NumberOfStatement, &NumberOfExpression);\r
\r
mStatementIndex = 0;\r
+ mUsedQuestionId = 1;\r
FormSet->StatementBuffer = AllocateZeroPool (NumberOfStatement * sizeof (FORM_BROWSER_STATEMENT));\r
if (FormSet->StatementBuffer == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
return EFI_OUT_OF_RESOURCES;\r
}\r
\r
+ InitializeListHead (&FormSet->StatementListOSF);\r
InitializeListHead (&FormSet->StorageListHead);\r
InitializeListHead (&FormSet->DefaultStoreListHead);\r
InitializeListHead (&FormSet->FormListHead);\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
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
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
//\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
-\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
- CopyMem (&Storage->Size, &((EFI_IFR_VARSTORE_EFI *) OpCodeData)->Size, sizeof (UINT16));\r
-\r
if (OpCodeLength < sizeof (EFI_IFR_VARSTORE_EFI)) {\r
- Storage->Type = EFI_HII_VARSTORE_EFI_VARIABLE;\r
- break;\r
- } \r
-\r
- Storage->Type = EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER;\r
- Storage->Buffer = AllocateZeroPool (Storage->Size);\r
- Storage->EditBuffer = AllocateZeroPool (Storage->Size);\r
-\r
- AsciiString = (CHAR8 *) ((EFI_IFR_VARSTORE_EFI *) 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
+ Storage = CreateStorage (FormSet, EFI_HII_VARSTORE_EFI_VARIABLE, OpCodeData);\r
+ } else {\r
+ Storage = CreateStorage (FormSet, EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER, OpCodeData);\r
}\r
-\r
- //\r
- // Initialize <ConfigHdr>\r
- //\r
- InitializeConfigHdr (FormSet, Storage);\r
+ CopyMem (&Storage->VarStoreId, &((EFI_IFR_VARSTORE_EFI *) OpCodeData)->VarStoreId, sizeof (EFI_VARSTORE_ID));\r
break;\r
\r
//\r
ASSERT (CurrentStatement != NULL);\r
\r
CurrentStatement->Flags = ((EFI_IFR_SUBTITLE *) OpCodeData)->Flags;\r
-\r
+ CurrentStatement->FakeQuestionId = mUsedQuestionId++;\r
if (Scope != 0) {\r
mInScopeSubtitle = TRUE;\r
}\r
case EFI_IFR_TEXT_OP:\r
CurrentStatement = CreateStatement (OpCodeData, FormSet, CurrentForm);\r
ASSERT (CurrentStatement != NULL);\r
-\r
+ CurrentStatement->FakeQuestionId = mUsedQuestionId++;\r
CopyMem (&CurrentStatement->TextTwo, &((EFI_IFR_TEXT *) OpCodeData)->TextTwo, sizeof (EFI_STRING_ID));\r
break;\r
\r
case EFI_IFR_RESET_BUTTON_OP:\r
CurrentStatement = CreateStatement (OpCodeData, FormSet, CurrentForm);\r
ASSERT (CurrentStatement != NULL);\r
+ CurrentStatement->FakeQuestionId = mUsedQuestionId++;\r
CopyMem (&CurrentStatement->DefaultId, &((EFI_IFR_RESET_BUTTON *) OpCodeData)->DefaultId, sizeof (EFI_DEFAULT_ID));\r
break;\r
\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 = AllocateZeroPool (sizeof (QUESTION_OPTION));\r
ASSERT (CurrentOption != NULL);\r
CurrentOption->Signature = QUESTION_OPTION_SIGNATURE;\r
+ CurrentOption->OpCode = (EFI_IFR_ONE_OF_OPTION *) OpCodeData;\r
\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
ConditionalExprCount = GetConditionalExpressionCount(ExpressOption);\r
//\r
// Vendor specific\r
//\r
- case EFI_IFR_GUID_OP:\r
- if (CompareGuid (&gEfiIfrTianoGuid, (EFI_GUID *)(OpCodeData + sizeof (EFI_IFR_OP_HEADER)))) {\r
- //\r
- // Tiano specific GUIDed opcodes\r
- //\r
- switch (((EFI_IFR_GUID_LABEL *) OpCodeData)->ExtendOpCode) {\r
- case EFI_IFR_EXTEND_OP_LABEL:\r
- //\r
- // just ignore label\r
- //\r
- break;\r
-\r
- case EFI_IFR_EXTEND_OP_BANNER:\r
- //\r
- // By SubClass to get Banner Data from Front Page\r
- //\r
- if (FormSet->SubClass == EFI_FRONT_PAGE_SUBCLASS) {\r
- CopyMem (\r
- &gBannerData->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
-\r
- case EFI_IFR_EXTEND_OP_CLASS:\r
- CopyMem (&FormSet->Class, &((EFI_IFR_GUID_CLASS *) OpCodeData)->Class, sizeof (UINT16));\r
- break;\r
-\r
- case EFI_IFR_EXTEND_OP_SUBCLASS:\r
- CopyMem (&FormSet->SubClass, &((EFI_IFR_GUID_SUBCLASS *) OpCodeData)->SubClass, sizeof (UINT16));\r
- break;\r
-\r
- default:\r
- break;\r
- }\r
- }\r
-\r
+ case EFI_IFR_GUID_OP: \r
+ CurrentStatement = CreateStatement (OpCodeData, FormSet, CurrentForm);\r
break;\r
\r
//\r