UINT16 mExpressionOpCodeIndex;\r
\r
BOOLEAN mInScopeSubtitle;\r
+extern LIST_ENTRY gBrowserStorageList;\r
/**\r
Initialize Statement header members.\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
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
//\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
LIST_ENTRY gBrowserContextList = INITIALIZE_LIST_HEAD_VARIABLE (gBrowserContextList);\r
LIST_ENTRY gBrowserFormSetList = INITIALIZE_LIST_HEAD_VARIABLE (gBrowserFormSetList);\r
LIST_ENTRY gBrowserHotKeyList = INITIALIZE_LIST_HEAD_VARIABLE (gBrowserHotKeyList);\r
+LIST_ENTRY gBrowserStorageList = INITIALIZE_LIST_HEAD_VARIABLE (gBrowserStorageList);\r
\r
BANNER_DATA *gBannerData;\r
EFI_HII_HANDLE gFrontPageHandle;\r
Storage = FORMSET_STORAGE_FROM_LINK (Link);\r
Link = GetNextNode (&FormSet->StorageListHead, Link);\r
\r
- if (CompareGuid (&Storage->Guid, (EFI_GUID *) VariableGuid)) {\r
- if (Storage->Type == EFI_HII_VARSTORE_BUFFER ||\r
- Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER) {\r
+ if (CompareGuid (&Storage->BrowserStorage->Guid, (EFI_GUID *) VariableGuid)) {\r
+ if (Storage->BrowserStorage->Type == EFI_HII_VARSTORE_BUFFER ||\r
+ Storage->BrowserStorage->Type == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER) {\r
//\r
// Buffer storage require both GUID and Name\r
//\r
return EFI_NOT_FOUND;\r
}\r
\r
- if (StrCmp (Storage->Name, (CHAR16 *) VariableName) != 0) {\r
+ if (StrCmp (Storage->BrowserStorage->Name, (CHAR16 *) VariableName) != 0) {\r
continue;\r
}\r
}\r
//\r
// Generate <ConfigResp>\r
//\r
- Status = StorageToConfigResp (Storage, &ConfigResp, FALSE);\r
+ Status = StorageToConfigResp (Storage->BrowserStorage, &ConfigResp, Storage->ConfigRequest);\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
//\r
// Skip <ConfigHdr> and '&' to point to <ConfigBody>\r
//\r
- StrPtr = ConfigResp + StrLen (Storage->ConfigHdr) + 1;\r
+ StrPtr = ConfigResp + StrLen (Storage->BrowserStorage->ConfigHdr) + 1;\r
\r
BufferSize = StrSize (StrPtr);\r
if (*ResultsDataSize < BufferSize) {\r
// Prepare <ConfigResp>\r
//\r
TmpSize = StrLen (ResultsData);\r
- BufferSize = (TmpSize + StrLen (Storage->ConfigHdr) + 2) * sizeof (CHAR16);\r
+ BufferSize = (TmpSize + StrLen (Storage->BrowserStorage->ConfigHdr) + 2) * sizeof (CHAR16);\r
ConfigResp = AllocateZeroPool (BufferSize);\r
ASSERT (ConfigResp != NULL);\r
\r
- StrCpy (ConfigResp, Storage->ConfigHdr);\r
+ StrCpy (ConfigResp, Storage->BrowserStorage->ConfigHdr);\r
StrCat (ConfigResp, L"&");\r
StrCat (ConfigResp, ResultsData);\r
\r
//\r
// Update Browser uncommited data\r
//\r
- Status = ConfigRespToStorage (Storage, ConfigResp);\r
+ Status = ConfigRespToStorage (Storage->BrowserStorage, ConfigResp);\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
**/\r
VOID\r
SynchronizeStorage (\r
- IN FORMSET_STORAGE *Storage,\r
+ IN BROWSER_STORAGE *Storage,\r
IN BOOLEAN SyncOrRestore\r
)\r
{\r
**/\r
EFI_STATUS\r
GetValueByName (\r
- IN FORMSET_STORAGE *Storage,\r
+ IN BROWSER_STORAGE *Storage,\r
IN CHAR16 *Name,\r
IN OUT CHAR16 **Value,\r
IN GET_SET_QUESTION_VALUE_WITH GetValueFrom\r
**/\r
EFI_STATUS\r
SetValueByName (\r
- IN FORMSET_STORAGE *Storage,\r
+ IN BROWSER_STORAGE *Storage,\r
IN CHAR16 *Name,\r
IN CHAR16 *Value,\r
IN GET_SET_QUESTION_VALUE_WITH SetValueTo\r
/**\r
Convert setting of Buffer Storage or NameValue Storage to <ConfigResp>.\r
\r
- @param Buffer The Storage to be conveted.\r
+ @param Storage The Storage to be conveted.\r
@param ConfigResp The returned <ConfigResp>.\r
- @param SingleForm Whether update data for single form or formset level.\r
+ @param ConfigRequest The ConfigRequest string.\r
\r
@retval EFI_SUCCESS Convert success.\r
@retval EFI_INVALID_PARAMETER Incorrect storage type.\r
**/\r
EFI_STATUS\r
StorageToConfigResp (\r
- IN VOID *Buffer,\r
+ IN BROWSER_STORAGE *Storage,\r
IN CHAR16 **ConfigResp,\r
- IN BOOLEAN SingleForm\r
+ IN CHAR16 *ConfigRequest\r
)\r
{\r
- EFI_STATUS Status;\r
- EFI_STRING Progress;\r
+ EFI_STATUS Status;\r
+ EFI_STRING Progress;\r
LIST_ENTRY *Link;\r
NAME_VALUE_NODE *Node;\r
- CHAR16 *ConfigRequest;\r
- FORMSET_STORAGE *Storage;\r
- FORM_BROWSER_CONFIG_REQUEST *ConfigInfo;\r
\r
Status = EFI_SUCCESS;\r
- if (SingleForm) {\r
- ConfigInfo = (FORM_BROWSER_CONFIG_REQUEST *) Buffer;\r
- Storage = ConfigInfo->Storage;\r
- ConfigRequest = ConfigInfo->ConfigRequest;\r
- } else {\r
- Storage = (FORMSET_STORAGE *) Buffer;\r
- ConfigRequest = Storage->ConfigRequest;\r
- }\r
\r
switch (Storage->Type) {\r
case EFI_HII_VARSTORE_BUFFER:\r
**/\r
EFI_STATUS\r
ConfigRespToStorage (\r
- IN FORMSET_STORAGE *Storage,\r
+ IN BROWSER_STORAGE *Storage,\r
IN CHAR16 *ConfigResp\r
)\r
{\r
UINT8 *Dst;\r
UINTN StorageWidth;\r
EFI_TIME EfiTime;\r
- FORMSET_STORAGE *Storage;\r
+ BROWSER_STORAGE *Storage;\r
EFI_IFR_TYPE_VALUE *QuestionValue;\r
CHAR16 *ConfigRequest;\r
CHAR16 *Progress;\r
EFI_TIME EfiTime;\r
UINTN BufferLen;\r
UINTN StorageWidth;\r
- FORMSET_STORAGE *Storage;\r
+ BROWSER_STORAGE *Storage;\r
EFI_IFR_TYPE_VALUE *QuestionValue;\r
CHAR16 *ConfigResp;\r
CHAR16 *Progress;\r
Storage = FORMSET_STORAGE_FROM_LINK (Link);\r
Link = GetNextNode (&FormSet->StorageListHead, Link);\r
\r
- if (Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE) {\r
+ if (Storage->BrowserStorage->Type == EFI_HII_VARSTORE_EFI_VARIABLE) {\r
continue;\r
}\r
\r
continue;\r
}\r
\r
- SynchronizeStorage(Storage, FALSE);\r
+ SynchronizeStorage(Storage->BrowserStorage, FALSE);\r
}\r
\r
Link = GetFirstNode (&FormSet->FormListHead);\r
LIST_ENTRY *Link;\r
EFI_STRING ConfigResp;\r
EFI_STRING Progress;\r
- FORMSET_STORAGE *Storage;\r
+ BROWSER_STORAGE *Storage;\r
+ FORMSET_STORAGE *FormSetStorage;\r
UINTN BufferSize;\r
UINT8 *TmpBuf; \r
FORM_BROWSER_FORMSET *LocalFormSet;\r
//\r
// 1. Prepare <ConfigResp>\r
//\r
- Status = StorageToConfigResp (ConfigInfo, &ConfigResp, TRUE);\r
+ Status = StorageToConfigResp (ConfigInfo->Storage, &ConfigResp, ConfigInfo->ConfigRequest);\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
//\r
Link = GetFirstNode (&FormSet->StorageListHead);\r
while (!IsNull (&FormSet->StorageListHead, Link)) {\r
- Storage = FORMSET_STORAGE_FROM_LINK (Link);\r
+ FormSetStorage = (FORMSET_STORAGE_FROM_LINK (Link));\r
+ Storage = FormSetStorage->BrowserStorage;\r
Link = GetNextNode (&FormSet->StorageListHead, Link);\r
\r
if (Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE) {\r
//\r
// Skip if there is no RequestElement\r
//\r
- if (Storage->ElementCount == 0) {\r
+ if (FormSetStorage->ElementCount == 0) {\r
continue;\r
}\r
\r
//\r
// 1. Prepare <ConfigResp>\r
//\r
- Status = StorageToConfigResp (Storage, &ConfigResp, FALSE);\r
+ Status = StorageToConfigResp (Storage, &ConfigResp, FormSetStorage->ConfigRequest);\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
BOOLEAN IsBufferStorage;\r
BOOLEAN IsString; \r
UINTN Length;\r
- FORMSET_STORAGE *Storage;\r
+ BROWSER_STORAGE *Storage;\r
CHAR16 *ConfigRequest;\r
CHAR16 *Progress;\r
CHAR16 *Result;\r
IN UINT16 DefaultId,\r
IN BROWSER_SETTING_SCOPE SettingScope,\r
IN BROWSER_GET_DEFAULT_VALUE GetDefaultValueScope,\r
- IN FORMSET_STORAGE *Storage OPTIONAL,\r
+ IN BROWSER_STORAGE *Storage OPTIONAL,\r
IN BOOLEAN RetrieveValueFirst\r
)\r
{\r
EFI_STRING Result;\r
CHAR16 *StrPtr;\r
\r
- if (Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE) {\r
+ if (Storage->BrowserStorage->Type == EFI_HII_VARSTORE_EFI_VARIABLE) {\r
return EFI_SUCCESS;\r
}\r
\r
- if (Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER) {\r
+ if (Storage->BrowserStorage->Type == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER) {\r
Status = gRT->GetVariable (\r
- Storage->Name,\r
- &Storage->Guid,\r
+ Storage->BrowserStorage->Name,\r
+ &Storage->BrowserStorage->Guid,\r
NULL,\r
- (UINTN*)&Storage->Size,\r
- Storage->EditBuffer\r
+ (UINTN*)&Storage->BrowserStorage->Size,\r
+ Storage->BrowserStorage->EditBuffer\r
);\r
return Status;\r
}\r
*StrPtr = L'\0';\r
}\r
\r
- Status = ConfigRespToStorage (Storage, Result);\r
+ Status = ConfigRespToStorage (Storage->BrowserStorage, Result);\r
FreePool (Result);\r
return Status;\r
}\r
\r
-\r
-/**\r
- Copy uncommitted data from source Storage to destination Storage.\r
-\r
- @param Dst Target Storage for uncommitted data.\r
- @param Src Source Storage for uncommitted data.\r
-\r
- @retval EFI_SUCCESS The function completed successfully.\r
- @retval EFI_INVALID_PARAMETER Source and destination Storage is not the same type.\r
-\r
-**/\r
-EFI_STATUS\r
-CopyStorage (\r
- IN OUT FORMSET_STORAGE *Dst,\r
- IN FORMSET_STORAGE *Src\r
- )\r
-{\r
- LIST_ENTRY *Link;\r
- NAME_VALUE_NODE *Node;\r
-\r
- if ((Dst->Type != Src->Type) || (Dst->Size != Src->Size)) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- switch (Src->Type) {\r
- case EFI_HII_VARSTORE_BUFFER:\r
- case EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER:\r
- CopyMem (Dst->EditBuffer, Src->EditBuffer, Src->Size);\r
- CopyMem (Dst->Buffer, Src->Buffer, Src->Size);\r
- break;\r
-\r
- case EFI_HII_VARSTORE_NAME_VALUE:\r
- Link = GetFirstNode (&Src->NameValueListHead);\r
- while (!IsNull (&Src->NameValueListHead, Link)) {\r
- Node = NAME_VALUE_NODE_FROM_LINK (Link);\r
-\r
- SetValueByName (Dst, Node->Name, Node->EditValue, GetSetValueWithEditBuffer);\r
- SetValueByName (Dst, Node->Name, Node->Value, GetSetValueWithBuffer);\r
-\r
- Link = GetNextNode (&Src->NameValueListHead, Link);\r
- }\r
- break;\r
-\r
- case EFI_HII_VARSTORE_EFI_VARIABLE:\r
- default:\r
- break;\r
- }\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- Get old question value from the saved formset.\r
-\r
- @param Statement The question which need to get old question value.\r
- @param OldFormSet FormSet data structure saved in the list.\r
-\r
-**/\r
-VOID \r
-GetOldQuestionValue (\r
- IN OUT FORM_BROWSER_STATEMENT *Statement,\r
- IN FORM_BROWSER_FORMSET *OldFormSet\r
- )\r
-{\r
- LIST_ENTRY *FormLink;\r
- LIST_ENTRY *Link;\r
- FORM_BROWSER_STATEMENT *Question;\r
- FORM_BROWSER_FORM *Form;\r
-\r
- FormLink = GetFirstNode (&OldFormSet->FormListHead);\r
- while (!IsNull (&OldFormSet->FormListHead, FormLink)) {\r
- Form = FORM_BROWSER_FORM_FROM_LINK (FormLink);\r
- FormLink = GetNextNode (&OldFormSet->FormListHead, FormLink);\r
-\r
- Link = GetFirstNode (&Form->StatementListHead);\r
- while (!IsNull (&Form->StatementListHead, Link)) {\r
- Question = FORM_BROWSER_STATEMENT_FROM_LINK (Link);\r
- Link = GetNextNode (&Form->StatementListHead, Link);\r
-\r
- if (Question->QuestionId != Statement->QuestionId) {\r
- continue;\r
- }\r
-\r
- CopyMem (&Statement->HiiValue, &Question->HiiValue, sizeof (EFI_HII_VALUE));\r
- return;\r
- }\r
- }\r
-}\r
-\r
-/**\r
- Get old question value from the saved formset, all these questions not have\r
- storage.\r
-\r
- @param FormSet FormSet data structure which is used now.\r
- @param OldFormSet FormSet data structure saved in the list.\r
-\r
-**/\r
-VOID\r
-CopyOldValueForNoStorageQst (\r
- IN OUT FORM_BROWSER_FORMSET *FormSet,\r
- IN FORM_BROWSER_FORMSET *OldFormSet\r
- )\r
-{\r
- LIST_ENTRY *FormLink;\r
- LIST_ENTRY *Link;\r
- FORM_BROWSER_STATEMENT *Question;\r
- FORM_BROWSER_FORM *Form;\r
-\r
- FormLink = GetFirstNode (&FormSet->FormListHead);\r
- while (!IsNull (&FormSet->FormListHead, FormLink)) {\r
- Form = FORM_BROWSER_FORM_FROM_LINK (FormLink);\r
- FormLink = GetNextNode (&FormSet->FormListHead, FormLink);\r
-\r
- Link = GetFirstNode (&Form->StatementListHead);\r
- while (!IsNull (&Form->StatementListHead, Link)) {\r
- Question = FORM_BROWSER_STATEMENT_FROM_LINK (Link);\r
- Link = GetNextNode (&Form->StatementListHead, Link);\r
-\r
- if (Question->Storage == NULL) {\r
- GetOldQuestionValue (Question, OldFormSet);\r
- }\r
- }\r
- }\r
-}\r
-\r
/**\r
Get current setting of Questions.\r
\r
}\r
}\r
\r
- if (OldStorage == NULL) {\r
- //\r
- // Storage is not found in backup formset, request it from ConfigDriver\r
- //\r
+ //\r
+ // Storage is not found in backup formset and current global storage not has other driver used,\r
+ // request it from ConfigDriver\r
+ //\r
+ if (OldStorage == NULL && Storage->BrowserStorage->ReferenceCount == 1) {\r
Status = LoadStorage (FormSet, Storage);\r
\r
if (EFI_ERROR (Status)) {\r
//\r
// If get last time changed value failed, extract default from IFR binary\r
//\r
- ExtractDefault (FormSet, NULL, EFI_HII_DEFAULT_CLASS_STANDARD, FormSetLevel, GetDefaultForStorage, Storage, TRUE);\r
+ ExtractDefault (FormSet, NULL, EFI_HII_DEFAULT_CLASS_STANDARD, FormSetLevel, GetDefaultForStorage, Storage->BrowserStorage, TRUE);\r
//\r
// ExtractDefault will set the NV flag to TRUE, so need this function to clean the flag\r
// in current situation.\r
// Now Edit Buffer is filled with default values(lower priority) or current\r
// settings(higher priority), sychronize it to shadow Buffer\r
//\r
- SynchronizeStorage (Storage, TRUE);\r
- } else {\r
- //\r
- // Storage found in backup formset, use it\r
- //\r
- Status = CopyStorage (Storage, OldStorage);\r
+ SynchronizeStorage (Storage->BrowserStorage, TRUE);\r
}\r
\r
Link = GetNextNode (&FormSet->StorageListHead, Link);\r
\r
#define NAME_VALUE_NODE_FROM_LINK(a) CR (a, NAME_VALUE_NODE, Link, NAME_VALUE_NODE_SIGNATURE)\r
\r
-#define FORMSET_STORAGE_SIGNATURE SIGNATURE_32 ('F', 'S', 'T', 'G')\r
+#define BROWSER_STORAGE_SIGNATURE SIGNATURE_32 ('B', 'S', 'T', 'G')\r
\r
typedef struct {\r
UINTN Signature;\r
\r
UINT8 Type; // Storage type\r
\r
- UINT16 VarStoreId;\r
EFI_GUID Guid;\r
\r
CHAR16 *Name; // For EFI_IFR_VARSTORE\r
UINT32 Attributes; // For EFI_IFR_VARSTORE_EFI: EFI Variable attribute\r
\r
CHAR16 *ConfigHdr; // <ConfigHdr>\r
+ UINT8 ReferenceCount; // How many form set storage refrence this storage.\r
+} BROWSER_STORAGE;\r
+\r
+#define BROWSER_STORAGE_FROM_LINK(a) CR (a, BROWSER_STORAGE, Link, BROWSER_STORAGE_SIGNATURE)\r
+\r
+#define FORMSET_STORAGE_SIGNATURE SIGNATURE_32 ('F', 'S', 'T', 'G')\r
+\r
+typedef struct {\r
+ UINTN Signature;\r
+ LIST_ENTRY Link;\r
+\r
+ UINT16 VarStoreId;\r
+\r
+ BROWSER_STORAGE *BrowserStorage;\r
+\r
CHAR16 *ConfigRequest; // <ConfigRequest> = <ConfigHdr> + <RequestElement>\r
UINTN ElementCount; // Number of <RequestElement> in the <ConfigRequest>\r
UINTN SpareStrLen; // Spare length of ConfigRequest string buffer\r
EFI_STRING_ID DevicePath; // For EFI_IFR_QUESTION_REF3_2, EFI_IFR_QUESTION_REF3_3\r
EFI_GUID Guid;\r
\r
- FORMSET_STORAGE *VarStorage; // For EFI_IFR_SET, EFI_IFR_GET\r
+ BROWSER_STORAGE *VarStorage; // For EFI_IFR_SET, EFI_IFR_GET\r
VAR_STORE_INFO VarStoreInfo;// For EFI_IFR_SET, EFI_IFR_GET\r
UINT8 ValueType; // For EFI_IFR_SET, EFI_IFR_GET\r
UINT8 ValueWidth; // For EFI_IFR_SET, EFI_IFR_GET\r
//\r
EFI_QUESTION_ID QuestionId; // The value of zero is reserved\r
EFI_VARSTORE_ID VarStoreId; // A value of zero indicates no variable storage\r
- FORMSET_STORAGE *Storage;\r
+ BROWSER_STORAGE *Storage;\r
VAR_STORE_INFO VarStoreInfo;\r
UINT16 StorageWidth;\r
UINT8 QuestionFlags;\r
UINTN ElementCount; // Number of <RequestElement> in the <ConfigRequest> \r
UINTN SpareStrLen;\r
\r
- FORMSET_STORAGE *Storage;\r
+ BROWSER_STORAGE *Storage;\r
} FORM_BROWSER_CONFIG_REQUEST;\r
#define FORM_BROWSER_CONFIG_REQUEST_FROM_LINK(a) CR (a, FORM_BROWSER_CONFIG_REQUEST, Link, FORM_BROWSER_CONFIG_REQUEST_SIGNATURE)\r
\r
**/\r
EFI_STATUS\r
GetValueByName (\r
- IN FORMSET_STORAGE *Storage,\r
+ IN BROWSER_STORAGE *Storage,\r
IN CHAR16 *Name,\r
IN OUT CHAR16 **Value,\r
IN GET_SET_QUESTION_VALUE_WITH GetValueFrom\r
**/\r
EFI_STATUS\r
SetValueByName (\r
- IN FORMSET_STORAGE *Storage,\r
+ IN BROWSER_STORAGE *Storage,\r
IN CHAR16 *Name,\r
IN CHAR16 *Value,\r
IN GET_SET_QUESTION_VALUE_WITH SetValueTo\r
IN UINT16 DefaultId,\r
IN BROWSER_SETTING_SCOPE SettingScope,\r
IN BROWSER_GET_DEFAULT_VALUE GetDefaultValueScope,\r
- IN FORMSET_STORAGE *Storage,\r
+ IN BROWSER_STORAGE *Storage,\r
IN BOOLEAN RetrieveValueFirst\r
);\r
\r
/**\r
Convert setting of Buffer Storage or NameValue Storage to <ConfigResp>.\r
\r
- @param Buffer The Storage to be conveted.\r
+ @param Storage The Storage to be conveted.\r
@param ConfigResp The returned <ConfigResp>.\r
- @param SingleForm Whether update data for single form or formset level.\r
+ @param ConfigRequest The ConfigRequest string.\r
\r
@retval EFI_SUCCESS Convert success.\r
@retval EFI_INVALID_PARAMETER Incorrect storage type.\r
**/\r
EFI_STATUS\r
StorageToConfigResp (\r
- IN VOID *Buffer,\r
+ IN BROWSER_STORAGE *Storage,\r
IN CHAR16 **ConfigResp,\r
- IN BOOLEAN SingleForm\r
+ IN CHAR16 *ConfigRequest\r
);\r
\r
/**\r
**/\r
EFI_STATUS\r
ConfigRespToStorage (\r
- IN FORMSET_STORAGE *Storage,\r
+ IN BROWSER_STORAGE *Storage,\r
IN CHAR16 *ConfigResp\r
);\r
\r