]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Update the browser logic, make the storage as browser level instead of form set level.
authorydong10 <ydong10@6f19259b-4bc3-4df7-8a09-765794883524>
Tue, 16 Apr 2013 10:53:22 +0000 (10:53 +0000)
committerydong10 <ydong10@6f19259b-4bc3-4df7-8a09-765794883524>
Tue, 16 Apr 2013 10:53:22 +0000 (10:53 +0000)
Signed-off-by: Eric Dong <eric.dong@intel.com>
Reviewed-by: Liming Gao <liming.gao@intel.com>
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@14280 6f19259b-4bc3-4df7-8a09-765794883524

MdeModulePkg/Universal/SetupBrowserDxe/IfrParse.c
MdeModulePkg/Universal/SetupBrowserDxe/Setup.c
MdeModulePkg/Universal/SetupBrowserDxe/Setup.h

index cc3823f0efd4573001697ad48bb5e9f2f8a11fbb..2464aebd095b0b561a2c9f302d52ae1dfabde546 100644 (file)
@@ -18,6 +18,7 @@ UINT16           mStatementIndex;
 UINT16           mExpressionOpCodeIndex;\r
 \r
 BOOLEAN          mInScopeSubtitle;\r
+extern LIST_ENTRY      gBrowserStorageList;\r
 /**\r
   Initialize Statement header members.\r
 \r
@@ -179,6 +180,7 @@ CreateQuestion (
   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
@@ -220,7 +222,7 @@ CreateQuestion (
     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
@@ -238,19 +240,39 @@ CreateQuestion (
 \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
@@ -281,32 +303,6 @@ CreateExpression (
   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
@@ -319,7 +315,7 @@ CreateStorage (
 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
@@ -341,12 +337,185 @@ InitializeConfigHdr (
     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
@@ -366,7 +535,8 @@ InitializeRequestElement (
   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
@@ -413,27 +583,43 @@ InitializeRequestElement (
     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
@@ -444,7 +630,7 @@ InitializeRequestElement (
   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
@@ -532,7 +718,6 @@ DestroyExpression (
   FreePool (Expression);\r
 }\r
 \r
-\r
 /**\r
   Free resources of a storage.\r
 \r
@@ -544,47 +729,20 @@ DestroyStorage (
   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
@@ -915,7 +1073,6 @@ ParseOpCodes (
   )\r
 {\r
   EFI_STATUS              Status;\r
-  UINT16                  Index;\r
   FORM_BROWSER_FORM       *CurrentForm;\r
   FORM_BROWSER_STATEMENT  *CurrentStatement;\r
   EXPRESSION_OPCODE       *ExpressionOpCode;\r
@@ -931,7 +1088,6 @@ ParseOpCodes (
   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
@@ -1104,7 +1260,7 @@ ParseOpCodes (
             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
@@ -1448,76 +1604,28 @@ ParseOpCodes (
       //\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
index 6c019f045483890425b87844fafd7cb3e2a1ecc9..b077a3c0a0335d29ee62788629e478ab777d0b51 100644 (file)
@@ -38,6 +38,7 @@ UINTN           gBrowserContextCount = 0;
 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
@@ -475,9 +476,9 @@ BrowserCallback (
       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
@@ -485,7 +486,7 @@ BrowserCallback (
             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
@@ -515,7 +516,7 @@ BrowserCallback (
     //\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
@@ -523,7 +524,7 @@ BrowserCallback (
     //\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
@@ -542,18 +543,18 @@ BrowserCallback (
     // 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
@@ -826,7 +827,7 @@ NewStringCat (
 **/\r
 VOID\r
 SynchronizeStorage (\r
-  IN FORMSET_STORAGE         *Storage,\r
+  IN BROWSER_STORAGE         *Storage,\r
   IN BOOLEAN                 SyncOrRestore\r
   )\r
 {\r
@@ -879,7 +880,7 @@ SynchronizeStorage (
 **/\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
@@ -928,7 +929,7 @@ GetValueByName (
 **/\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
@@ -975,9 +976,9 @@ SetValueByName (
 /**\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
@@ -985,28 +986,17 @@ SetValueByName (
 **/\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
@@ -1061,7 +1051,7 @@ StorageToConfigResp (
 **/\r
 EFI_STATUS\r
 ConfigRespToStorage (\r
-  IN FORMSET_STORAGE         *Storage,\r
+  IN BROWSER_STORAGE         *Storage,\r
   IN CHAR16                  *ConfigResp\r
   )\r
 {\r
@@ -1153,7 +1143,7 @@ GetQuestionValue (
   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
@@ -1578,7 +1568,7 @@ SetQuestionValue (
   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
@@ -2304,7 +2294,7 @@ DiscardForm (
       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
@@ -2315,7 +2305,7 @@ DiscardForm (
         continue;\r
       }\r
 \r
-      SynchronizeStorage(Storage, FALSE);\r
+      SynchronizeStorage(Storage->BrowserStorage, FALSE);\r
     }\r
 \r
     Link = GetFirstNode (&FormSet->FormListHead);\r
@@ -2381,7 +2371,8 @@ SubmitForm (
   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
@@ -2429,7 +2420,7 @@ SubmitForm (
       //\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
@@ -2518,7 +2509,8 @@ SubmitForm (
     //\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
@@ -2528,14 +2520,14 @@ SubmitForm (
       //\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
@@ -2663,7 +2655,7 @@ GetDefaultValueFromAltCfg (
   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
@@ -3151,7 +3143,7 @@ ExtractDefault (
   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
@@ -3464,17 +3456,17 @@ LoadStorage (
   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
@@ -3511,136 +3503,11 @@ LoadStorage (
     *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
@@ -3693,17 +3560,18 @@ InitializeCurrentSetting (
       }\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
@@ -3715,12 +3583,7 @@ InitializeCurrentSetting (
       // 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
index 8e32cb4e4a992bc47b7bfb54852298979e4af2f1..09fc54afeb3ad865d2c3b36a736a9eddca01cc16 100644 (file)
@@ -216,7 +216,7 @@ typedef struct {
 \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
@@ -224,7 +224,6 @@ typedef struct {
 \r
   UINT8            Type;           // Storage type\r
 \r
-  UINT16           VarStoreId;\r
   EFI_GUID         Guid;\r
 \r
   CHAR16           *Name;          // For EFI_IFR_VARSTORE\r
@@ -237,6 +236,21 @@ typedef struct {
   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
@@ -272,7 +286,7 @@ typedef struct {
   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
@@ -372,7 +386,7 @@ typedef struct {
   //\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
@@ -430,7 +444,7 @@ typedef struct {
   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
@@ -909,7 +923,7 @@ CreateDialog (
 **/\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
@@ -929,7 +943,7 @@ GetValueByName (
 **/\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
@@ -1111,7 +1125,7 @@ ExtractDefault (
   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
@@ -1156,9 +1170,9 @@ LoadFormSetConfig (
 /**\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
@@ -1166,9 +1180,9 @@ LoadFormSetConfig (
 **/\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
@@ -1183,7 +1197,7 @@ StorageToConfigResp (
 **/\r
 EFI_STATUS\r
 ConfigRespToStorage (\r
-  IN FORMSET_STORAGE         *Storage,\r
+  IN BROWSER_STORAGE         *Storage,\r
   IN CHAR16                  *ConfigResp\r
   );\r
 \r