Revision: 14290
          http://edk2.svn.sourceforge.net/edk2/?rev=14290&view=rev
Author:   vanjeff
Date:     2013-04-18 06:29:34 +0000 (Thu, 18 Apr 2013)
Log Message:
-----------
Sync patch r14280 from main trunk.
Update the browser logic, make the storage as browser level instead of form set 
level.

Revision Links:
--------------
    http://edk2.svn.sourceforge.net/edk2/?rev=14280&view=rev

Modified Paths:
--------------
    branches/UDK2010.SR1/MdeModulePkg/Universal/SetupBrowserDxe/IfrParse.c
    branches/UDK2010.SR1/MdeModulePkg/Universal/SetupBrowserDxe/Setup.c
    branches/UDK2010.SR1/MdeModulePkg/Universal/SetupBrowserDxe/Setup.h

Modified: branches/UDK2010.SR1/MdeModulePkg/Universal/SetupBrowserDxe/IfrParse.c
===================================================================
--- branches/UDK2010.SR1/MdeModulePkg/Universal/SetupBrowserDxe/IfrParse.c      
2013-04-18 05:56:04 UTC (rev 14289)
+++ branches/UDK2010.SR1/MdeModulePkg/Universal/SetupBrowserDxe/IfrParse.c      
2013-04-18 06:29:34 UTC (rev 14290)
@@ -18,6 +18,7 @@
 UINT16           mExpressionOpCodeIndex;
 
 BOOLEAN          mInScopeSubtitle;
+extern LIST_ENTRY      gBrowserStorageList;
 /**
   Initialize Statement header members.
 
@@ -179,6 +180,7 @@
   FORMSET_STORAGE          *Storage;
   NAME_VALUE_NODE          *NameValueNode;
   EFI_STATUS               Status;
+  BOOLEAN                  Find;
 
   Statement = CreateStatement (OpCodeData, FormSet, Form);
   if (Statement == NULL) {
@@ -220,7 +222,7 @@
     Storage = FORMSET_STORAGE_FROM_LINK (Link);
 
     if (Storage->VarStoreId == Statement->VarStoreId) {
-      Statement->Storage = Storage;
+      Statement->Storage = Storage->BrowserStorage;
       break;
     }
 
@@ -238,19 +240,39 @@
 
     if (Statement->Storage->Type == EFI_HII_VARSTORE_NAME_VALUE) {
       //
-      // Insert to Name/Value varstore list
+      // Check whether old string node already exist.
       //
-      NameValueNode = AllocateZeroPool (sizeof (NAME_VALUE_NODE));
-      ASSERT (NameValueNode != NULL);
-      NameValueNode->Signature = NAME_VALUE_NODE_SIGNATURE;
-      NameValueNode->Name = AllocateCopyPool (StrSize 
(Statement->VariableName), Statement->VariableName);
-      ASSERT (NameValueNode->Name != NULL);
-      NameValueNode->Value = AllocateZeroPool (0x10);
-      ASSERT (NameValueNode->Value != NULL);
-      NameValueNode->EditValue = AllocateZeroPool (0x10);
-      ASSERT (NameValueNode->EditValue != NULL);
+      Find = FALSE;
+      if (!IsListEmpty(&Statement->Storage->NameValueListHead)) {  
+        Link = GetFirstNode (&Statement->Storage->NameValueListHead);
+        while (!IsNull (&Statement->Storage->NameValueListHead, Link)) {
+          NameValueNode = NAME_VALUE_NODE_FROM_LINK (Link);
 
-      InsertTailList (&Statement->Storage->NameValueListHead, 
&NameValueNode->Link);
+          if (StrCmp (Statement->VariableName, NameValueNode->Name) == 0) {
+            Find = TRUE;
+            break;
+          }
+
+          Link = GetNextNode (&Statement->Storage->NameValueListHead, Link);
+        }
+      }
+
+      if (!Find) {
+        //
+        // Insert to Name/Value varstore list
+        //
+        NameValueNode = AllocateZeroPool (sizeof (NAME_VALUE_NODE));
+        ASSERT (NameValueNode != NULL);
+        NameValueNode->Signature = NAME_VALUE_NODE_SIGNATURE;
+        NameValueNode->Name = AllocateCopyPool (StrSize 
(Statement->VariableName), Statement->VariableName);
+        ASSERT (NameValueNode->Name != NULL);
+        NameValueNode->Value = AllocateZeroPool (0x10);
+        ASSERT (NameValueNode->Value != NULL);
+        NameValueNode->EditValue = AllocateZeroPool (0x10);
+        ASSERT (NameValueNode->EditValue != NULL);
+
+        InsertTailList (&Statement->Storage->NameValueListHead, 
&NameValueNode->Link);
+      }
     }
   }
 
@@ -281,33 +303,7 @@
   return Expression;
 }
 
-
 /**
-  Allocate a FORMSET_STORAGE data structure and insert to FormSet Storage List.
-
-  @param  FormSet                Pointer of the current FormSet
-
-  @return Pointer to a FORMSET_STORAGE data structure.
-
-**/
-FORMSET_STORAGE *
-CreateStorage (
-  IN FORM_BROWSER_FORMSET  *FormSet
-  )
-{
-  FORMSET_STORAGE  *Storage;
-
-  Storage = AllocateZeroPool (sizeof (FORMSET_STORAGE));
-  ASSERT (Storage != NULL);
-  Storage->Signature = FORMSET_STORAGE_SIGNATURE;
-  InitializeListHead (&Storage->NameValueListHead);
-  InsertTailList (&FormSet->StorageListHead, &Storage->Link);
-
-  return Storage;
-}
-
-
-/**
   Create ConfigHdr string for a storage.
 
   @param  FormSet                Pointer of the current FormSet
@@ -319,7 +315,7 @@
 EFI_STATUS
 InitializeConfigHdr (
   IN FORM_BROWSER_FORMSET  *FormSet,
-  IN OUT FORMSET_STORAGE   *Storage
+  IN OUT BROWSER_STORAGE   *Storage
   )
 {
   CHAR16      *Name;
@@ -341,14 +337,187 @@
     return EFI_NOT_FOUND;
   }
 
-  Storage->ConfigRequest = AllocateCopyPool (StrSize (Storage->ConfigHdr), 
Storage->ConfigHdr);
-  Storage->SpareStrLen = 0;
-
   return EFI_SUCCESS;
 }
 
+/**
+  Find the global storage link base on the input storate type, name and guid.
 
+  @param  StorageType                Storage type.
+  @param  StorageGuid                Storage guid.
+  @param  StorageName                Storage Name.
+
+  @return Pointer to a GLOBAL_STORAGE data structure.
+
+**/
+BROWSER_STORAGE *
+FindStorageInList (
+  IN UINT8                 StorageType,
+  IN EFI_GUID              *StorageGuid,
+  IN CHAR16                *StorageName
+  )
+{
+  LIST_ENTRY       *Link;
+  BROWSER_STORAGE  *BrowserStorage;
+
+  Link  = GetFirstNode (&gBrowserStorageList);
+  while (!IsNull (&gBrowserStorageList, Link)) {
+    BrowserStorage = BROWSER_STORAGE_FROM_LINK (Link);
+
+    if ((BrowserStorage->Type == StorageType) && CompareGuid 
(&BrowserStorage->Guid, StorageGuid)) {
+      if (StorageType == EFI_HII_VARSTORE_NAME_VALUE) {
+        return BrowserStorage;
+      }
+
+      if (StrCmp (BrowserStorage->Name, StorageName) == 0) {
+        return BrowserStorage;
+      }
+    }
+
+    //
+    // Get Next Storage.
+    //
+    Link = GetNextNode (&gBrowserStorageList, Link);
+  }
+
+  return NULL;
+}
+
 /**
+  Intialize the Global Storage.
+
+  @param  BrowserStorage              Pointer to the global storage.
+  @param  StorageType                Storage type.
+  @param  OpCodeData                 Binary data for this opcode.
+
+**/
+VOID
+IntializeBrowserStorage (
+  IN BROWSER_STORAGE       *BrowserStorage,
+  IN UINT8                 StorageType,
+  IN UINT8                 *OpCodeData
+  )
+{
+  switch (StorageType) {
+    case EFI_HII_VARSTORE_BUFFER:
+      CopyMem (&BrowserStorage->Guid, &((EFI_IFR_VARSTORE *) 
OpCodeData)->Guid, sizeof (EFI_GUID));
+      CopyMem (&BrowserStorage->Size, &((EFI_IFR_VARSTORE *) 
OpCodeData)->Size, sizeof (UINT16));
+
+      BrowserStorage->Buffer     = AllocateZeroPool (BrowserStorage->Size);
+      BrowserStorage->EditBuffer = AllocateZeroPool (BrowserStorage->Size);
+      break;
+
+    case EFI_HII_VARSTORE_EFI_VARIABLE:
+    case EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER:
+      CopyMem (&BrowserStorage->Guid,       &((EFI_IFR_VARSTORE_EFI *) 
OpCodeData)->Guid,       sizeof (EFI_GUID));
+      CopyMem (&BrowserStorage->Attributes, &((EFI_IFR_VARSTORE_EFI *) 
OpCodeData)->Attributes, sizeof (UINT32));
+      CopyMem (&BrowserStorage->Size,       &((EFI_IFR_VARSTORE_EFI *) 
OpCodeData)->Size,       sizeof (UINT16));
+
+      if (StorageType ==  EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER) {
+        BrowserStorage->Buffer     = AllocateZeroPool (BrowserStorage->Size);
+        BrowserStorage->EditBuffer = AllocateZeroPool (BrowserStorage->Size);
+      }
+      break;
+
+    case EFI_HII_VARSTORE_NAME_VALUE:
+      CopyMem (&BrowserStorage->Guid, &((EFI_IFR_VARSTORE_NAME_VALUE *) 
OpCodeData)->Guid, sizeof (EFI_GUID));
+
+      InitializeListHead (&BrowserStorage->NameValueListHead);
+      break;
+
+    default:
+      break;
+  }
+}
+
+/**
+  Allocate a FORMSET_STORAGE data structure and insert to FormSet Storage List.
+
+  @param  FormSet                    Pointer of the current FormSet
+  @param  StorageType                Storage type.
+  @param  OpCodeData                 Binary data for this opcode.
+
+  @return Pointer to a FORMSET_STORAGE data structure.
+
+**/
+FORMSET_STORAGE *
+CreateStorage (
+  IN FORM_BROWSER_FORMSET  *FormSet,
+  IN UINT8                 StorageType,
+  IN UINT8                 *OpCodeData
+  )
+{
+  FORMSET_STORAGE         *Storage;
+  CHAR16                  *UnicodeString;
+  UINT16                  Index;
+  BROWSER_STORAGE         *BrowserStorage;
+  EFI_GUID                *StorageGuid;
+  CHAR8                   *StorageName;
+
+  UnicodeString = NULL;
+  StorageName   = NULL;
+  switch (StorageType) {
+    case EFI_HII_VARSTORE_BUFFER:
+      StorageGuid = (EFI_GUID *) (CHAR8*) &((EFI_IFR_VARSTORE *) 
OpCodeData)->Guid;
+      StorageName = (CHAR8 *) ((EFI_IFR_VARSTORE *) OpCodeData)->Name;
+      break;
+
+    case EFI_HII_VARSTORE_EFI_VARIABLE:
+    case EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER:
+      StorageGuid = (EFI_GUID *) (CHAR8*) &((EFI_IFR_VARSTORE_EFI *) 
OpCodeData)->Guid;
+      StorageName = (CHAR8 *) ((EFI_IFR_VARSTORE_EFI *) OpCodeData)->Name;
+      break;
+
+    default:
+      ASSERT (StorageType == EFI_HII_VARSTORE_NAME_VALUE);
+      StorageGuid = &((EFI_IFR_VARSTORE_NAME_VALUE *) OpCodeData)->Guid;
+      break;
+  }
+
+  if (StorageType != EFI_HII_VARSTORE_NAME_VALUE) {
+    ASSERT (StorageName != NULL);
+
+    UnicodeString = AllocateZeroPool (AsciiStrSize (StorageName) * 2);
+    ASSERT (UnicodeString != NULL);
+    for (Index = 0; StorageName[Index] != 0; Index++) {
+      UnicodeString[Index] = (CHAR16) StorageName[Index];
+    }
+  }
+
+  Storage = AllocateZeroPool (sizeof (FORMSET_STORAGE));
+  ASSERT (Storage != NULL);
+  Storage->Signature = FORMSET_STORAGE_SIGNATURE;
+  InsertTailList (&FormSet->StorageListHead, &Storage->Link);
+
+  BrowserStorage = FindStorageInList(StorageType, StorageGuid, UnicodeString);
+  if (BrowserStorage == NULL) {
+    BrowserStorage = AllocateZeroPool (sizeof (BROWSER_STORAGE));
+    ASSERT (BrowserStorage != NULL);
+
+    BrowserStorage->Signature = BROWSER_STORAGE_SIGNATURE;
+    InsertTailList (&gBrowserStorageList, &BrowserStorage->Link);
+
+    IntializeBrowserStorage (BrowserStorage, StorageType, OpCodeData);
+    BrowserStorage->Type = StorageType;
+    if (StorageType != EFI_HII_VARSTORE_NAME_VALUE) {
+      BrowserStorage->Name = UnicodeString;
+    }
+
+    InitializeConfigHdr (FormSet, BrowserStorage);
+  }
+  //
+  // Add count because one formset storage use this global storage.
+  //
+  BrowserStorage->ReferenceCount++;
+
+  Storage->BrowserStorage = BrowserStorage;
+  Storage->ConfigRequest = AllocateCopyPool (StrSize 
(BrowserStorage->ConfigHdr), BrowserStorage->ConfigHdr);
+  Storage->SpareStrLen = 0;
+
+  return Storage;
+}
+
+/**
   Initialize Request Element of a Question. <RequestElement> ::= 
'&'<BlockName> | '&'<Label>
 
   @param  FormSet                Pointer of the current FormSet.
@@ -366,7 +535,8 @@
   IN OUT FORM_BROWSER_FORM        *Form
   )
 {
-  FORMSET_STORAGE  *Storage;
+  BROWSER_STORAGE  *Storage;
+  FORMSET_STORAGE  *FormsetStorage;
   UINTN            StrLen;
   UINTN            StringSize;
   CHAR16           *NewStr;
@@ -414,26 +584,42 @@
   }
 
   //
+  // Find Formset Storage for this Question
+  //
+  FormsetStorage = NULL;
+  Link = GetFirstNode (&FormSet->StorageListHead);
+  while (!IsNull (&FormSet->StorageListHead, Link)) {
+    FormsetStorage = FORMSET_STORAGE_FROM_LINK (Link);
+
+    if (FormsetStorage->VarStoreId == Question->VarStoreId) {
+      break;
+    }
+
+    Link = GetNextNode (&FormSet->StorageListHead, Link);
+  }
+  ASSERT (FormsetStorage != NULL);
+
+  //
   // Append <RequestElement> to <ConfigRequest>
   //
-  if (StrLen > Storage->SpareStrLen) {
+  if (StrLen > FormsetStorage->SpareStrLen) {
     //
     // Old String buffer is not sufficient for RequestElement, allocate a new 
one
     //
-    StringSize = (Storage->ConfigRequest != NULL) ? StrSize 
(Storage->ConfigRequest) : sizeof (CHAR16);
+    StringSize = (FormsetStorage->ConfigRequest != NULL) ? StrSize 
(FormsetStorage->ConfigRequest) : sizeof (CHAR16);
     NewStr = AllocateZeroPool (StringSize + CONFIG_REQUEST_STRING_INCREMENTAL 
* sizeof (CHAR16));
     ASSERT (NewStr != NULL);
-    if (Storage->ConfigRequest != NULL) {
-      CopyMem (NewStr, Storage->ConfigRequest, StringSize);
-      FreePool (Storage->ConfigRequest);
+    if (FormsetStorage->ConfigRequest != NULL) {
+      CopyMem (NewStr, FormsetStorage->ConfigRequest, StringSize);
+      FreePool (FormsetStorage->ConfigRequest);
     }
-    Storage->ConfigRequest = NewStr;
-    Storage->SpareStrLen   = CONFIG_REQUEST_STRING_INCREMENTAL;
+    FormsetStorage->ConfigRequest = NewStr;
+    FormsetStorage->SpareStrLen   = CONFIG_REQUEST_STRING_INCREMENTAL;
   }
 
-  StrCat (Storage->ConfigRequest, RequestElement);
-  Storage->ElementCount++;
-  Storage->SpareStrLen -= StrLen;
+  StrCat (FormsetStorage->ConfigRequest, RequestElement);
+  FormsetStorage->ElementCount++;
+  FormsetStorage->SpareStrLen -= StrLen;
 
   //
   // Update the Config Request info saved in the form.
@@ -444,7 +630,7 @@
   while (!IsNull (&Form->ConfigRequestHead, Link)) {
     ConfigInfo = FORM_BROWSER_CONFIG_REQUEST_FROM_LINK (Link);
 
-    if (ConfigInfo != NULL && ConfigInfo->Storage->VarStoreId == 
Storage->VarStoreId) {
+    if (ConfigInfo != NULL && ConfigInfo->Storage == Storage) {
       Find = TRUE;
       break;
     }
@@ -532,7 +718,6 @@
   FreePool (Expression);
 }
 
-
 /**
   Free resources of a storage.
 
@@ -544,47 +729,20 @@
   IN FORMSET_STORAGE   *Storage
   )
 {
-  LIST_ENTRY         *Link;
-  NAME_VALUE_NODE    *NameValueNode;
-
   if (Storage == NULL) {
     return;
   }
 
-  if (Storage->Name != NULL) {
-    FreePool (Storage->Name);
-  }
-  if (Storage->Buffer != NULL) {
-    FreePool (Storage->Buffer);
-  }
-  if (Storage->EditBuffer != NULL) {
-    FreePool (Storage->EditBuffer);
-  }
-
-  while (!IsListEmpty (&Storage->NameValueListHead)) {
-    Link = GetFirstNode (&Storage->NameValueListHead);
-    NameValueNode = NAME_VALUE_NODE_FROM_LINK (Link);
-    RemoveEntryList (&NameValueNode->Link);
-
-    if (NameValueNode->Name != NULL) {
-      FreePool (NameValueNode->Name);
-    }
-    if (NameValueNode->Value != NULL) {
-      FreePool (NameValueNode->Value);
-    }
-    if (NameValueNode->EditValue != NULL) {
-      FreePool (NameValueNode->EditValue);
-    }
-    FreePool (NameValueNode);
-  }
-
-  if (Storage->ConfigHdr != NULL) {
-    FreePool (Storage->ConfigHdr);
-  }
   if (Storage->ConfigRequest != NULL) {
     FreePool (Storage->ConfigRequest);
   }
 
+  //
+  // Minus the reference to the global storage.
+  //
+  ASSERT (Storage->BrowserStorage->ReferenceCount > 0);
+  Storage->BrowserStorage->ReferenceCount--; 
+
   FreePool (Storage);
 }
 
@@ -915,7 +1073,6 @@
   )
 {
   EFI_STATUS              Status;
-  UINT16                  Index;
   FORM_BROWSER_FORM       *CurrentForm;
   FORM_BROWSER_STATEMENT  *CurrentStatement;
   EXPRESSION_OPCODE       *ExpressionOpCode;
@@ -931,7 +1088,6 @@
   QUESTION_DEFAULT        *CurrentDefault;
   QUESTION_OPTION         *CurrentOption;
   UINT8                   Width;
-  CHAR8                   *AsciiString;
   UINT16                  NumberOfStatement;
   UINT16                  NumberOfExpression;
   EFI_IMAGE_ID            *ImageId;
@@ -1104,7 +1260,7 @@
             while (!IsNull (&FormSet->StorageListHead, Link)) {
               VarStorage = FORMSET_STORAGE_FROM_LINK (Link);
               if (VarStorage->VarStoreId == ((EFI_IFR_GET *) 
OpCodeData)->VarStoreId) {
-                ExpressionOpCode->VarStorage = VarStorage;
+                ExpressionOpCode->VarStorage = VarStorage->BrowserStorage;
                 break;
               }
               Link = GetNextNode (&FormSet->StorageListHead, Link);
@@ -1448,76 +1604,28 @@
       //
       // Create a buffer Storage for this FormSet
       //
-      Storage = CreateStorage (FormSet);
-      Storage->Type = EFI_HII_VARSTORE_BUFFER;
-
+      Storage = CreateStorage (FormSet, EFI_HII_VARSTORE_BUFFER, OpCodeData);
       CopyMem (&Storage->VarStoreId, &((EFI_IFR_VARSTORE *) 
OpCodeData)->VarStoreId, sizeof (EFI_VARSTORE_ID));
-      CopyMem (&Storage->Guid,       &((EFI_IFR_VARSTORE *) OpCodeData)->Guid, 
      sizeof (EFI_GUID));
-      CopyMem (&Storage->Size,       &((EFI_IFR_VARSTORE *) OpCodeData)->Size, 
      sizeof (UINT16));
-
-      Storage->Buffer = AllocateZeroPool (Storage->Size);
-      Storage->EditBuffer = AllocateZeroPool (Storage->Size);
-
-      AsciiString = (CHAR8 *) ((EFI_IFR_VARSTORE *) OpCodeData)->Name;
-      Storage->Name = AllocateZeroPool (AsciiStrSize (AsciiString) * 2);
-      ASSERT (Storage->Name != NULL);
-      for (Index = 0; AsciiString[Index] != 0; Index++) {
-        Storage->Name[Index] = (CHAR16) AsciiString[Index];
-      }
-
-      //
-      // Initialize <ConfigHdr>
-      //
-      InitializeConfigHdr (FormSet, Storage);
       break;
 
     case EFI_IFR_VARSTORE_NAME_VALUE_OP:
       //
       // Create a name/value Storage for this FormSet
       //
-      Storage = CreateStorage (FormSet);
-      Storage->Type = EFI_HII_VARSTORE_NAME_VALUE;
-
+      Storage = CreateStorage (FormSet, EFI_HII_VARSTORE_NAME_VALUE, 
OpCodeData);
       CopyMem (&Storage->VarStoreId, &((EFI_IFR_VARSTORE_NAME_VALUE *) 
OpCodeData)->VarStoreId, sizeof (EFI_VARSTORE_ID));
-      CopyMem (&Storage->Guid,       &((EFI_IFR_VARSTORE_NAME_VALUE *) 
OpCodeData)->Guid,       sizeof (EFI_GUID));
-
-      //
-      // Initialize <ConfigHdr>
-      //
-      InitializeConfigHdr (FormSet, Storage);
       break;
 
     case EFI_IFR_VARSTORE_EFI_OP:
       //
       // Create a EFI variable Storage for this FormSet
       //
-      Storage = CreateStorage (FormSet);
-
-      CopyMem (&Storage->VarStoreId, &((EFI_IFR_VARSTORE_EFI *) 
OpCodeData)->VarStoreId, sizeof (EFI_VARSTORE_ID));
-      CopyMem (&Storage->Guid,       &((EFI_IFR_VARSTORE_EFI *) 
OpCodeData)->Guid,       sizeof (EFI_GUID));
-      CopyMem (&Storage->Attributes, &((EFI_IFR_VARSTORE_EFI *) 
OpCodeData)->Attributes, sizeof (UINT32));
-      CopyMem (&Storage->Size,       &((EFI_IFR_VARSTORE_EFI *) 
OpCodeData)->Size,       sizeof (UINT16));
-
       if (OpCodeLength < sizeof (EFI_IFR_VARSTORE_EFI)) {
-        Storage->Type = EFI_HII_VARSTORE_EFI_VARIABLE;
-        break;
-      } 
-
-      Storage->Type = EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER;
-      Storage->Buffer = AllocateZeroPool (Storage->Size);
-      Storage->EditBuffer = AllocateZeroPool (Storage->Size);
-
-      AsciiString = (CHAR8 *) ((EFI_IFR_VARSTORE_EFI *) OpCodeData)->Name;
-      Storage->Name = AllocateZeroPool (AsciiStrSize (AsciiString) * 2);
-      ASSERT (Storage->Name != NULL);
-      for (Index = 0; AsciiString[Index] != 0; Index++) {
-        Storage->Name[Index] = (CHAR16) AsciiString[Index];
+        Storage = CreateStorage (FormSet, EFI_HII_VARSTORE_EFI_VARIABLE, 
OpCodeData);
+      } else {
+        Storage = CreateStorage (FormSet, 
EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER, OpCodeData);
       }
-
-      //
-      // Initialize <ConfigHdr>
-      //
-      InitializeConfigHdr (FormSet, Storage);
+      CopyMem (&Storage->VarStoreId, &((EFI_IFR_VARSTORE_EFI *) 
OpCodeData)->VarStoreId, sizeof (EFI_VARSTORE_ID));
       break;
 
     //

Modified: branches/UDK2010.SR1/MdeModulePkg/Universal/SetupBrowserDxe/Setup.c
===================================================================
--- branches/UDK2010.SR1/MdeModulePkg/Universal/SetupBrowserDxe/Setup.c 
2013-04-18 05:56:04 UTC (rev 14289)
+++ branches/UDK2010.SR1/MdeModulePkg/Universal/SetupBrowserDxe/Setup.c 
2013-04-18 06:29:34 UTC (rev 14290)
@@ -38,6 +38,7 @@
 LIST_ENTRY      gBrowserContextList = INITIALIZE_LIST_HEAD_VARIABLE 
(gBrowserContextList);
 LIST_ENTRY      gBrowserFormSetList = INITIALIZE_LIST_HEAD_VARIABLE 
(gBrowserFormSetList);
 LIST_ENTRY      gBrowserHotKeyList  = INITIALIZE_LIST_HEAD_VARIABLE 
(gBrowserHotKeyList);
+LIST_ENTRY      gBrowserStorageList  = INITIALIZE_LIST_HEAD_VARIABLE 
(gBrowserStorageList);
 
 BANNER_DATA           *gBannerData;
 EFI_HII_HANDLE        gFrontPageHandle;
@@ -471,9 +472,9 @@
       Storage = FORMSET_STORAGE_FROM_LINK (Link);
       Link = GetNextNode (&FormSet->StorageListHead, Link);
 
-      if (CompareGuid (&Storage->Guid, (EFI_GUID *) VariableGuid)) {
-        if (Storage->Type == EFI_HII_VARSTORE_BUFFER ||
-            Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER) {
+      if (CompareGuid (&Storage->BrowserStorage->Guid, (EFI_GUID *) 
VariableGuid)) {
+        if (Storage->BrowserStorage->Type == EFI_HII_VARSTORE_BUFFER ||
+            Storage->BrowserStorage->Type == 
EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER) {
           //
           // Buffer storage require both GUID and Name
           //
@@ -481,7 +482,7 @@
             return EFI_NOT_FOUND;
           }
 
-          if (StrCmp (Storage->Name, (CHAR16 *) VariableName) != 0) {
+          if (StrCmp (Storage->BrowserStorage->Name, (CHAR16 *) VariableName) 
!= 0) {
             continue;
           }
         }
@@ -511,7 +512,7 @@
     //
     // Generate <ConfigResp>
     //
-    Status = StorageToConfigResp (Storage, &ConfigResp, FALSE);
+    Status = StorageToConfigResp (Storage->BrowserStorage, &ConfigResp, 
Storage->ConfigRequest);
     if (EFI_ERROR (Status)) {
       return Status;
     }
@@ -519,7 +520,7 @@
     //
     // Skip <ConfigHdr> and '&' to point to <ConfigBody>
     //
-    StrPtr = ConfigResp + StrLen (Storage->ConfigHdr) + 1;
+    StrPtr = ConfigResp + StrLen (Storage->BrowserStorage->ConfigHdr) + 1;
 
     BufferSize = StrSize (StrPtr);
     if (*ResultsDataSize < BufferSize) {
@@ -538,18 +539,18 @@
     // Prepare <ConfigResp>
     //
     TmpSize = StrLen (ResultsData);
-    BufferSize = (TmpSize + StrLen (Storage->ConfigHdr) + 2) * sizeof (CHAR16);
+    BufferSize = (TmpSize + StrLen (Storage->BrowserStorage->ConfigHdr) + 2) * 
sizeof (CHAR16);
     ConfigResp = AllocateZeroPool (BufferSize);
     ASSERT (ConfigResp != NULL);
 
-    StrCpy (ConfigResp, Storage->ConfigHdr);
+    StrCpy (ConfigResp, Storage->BrowserStorage->ConfigHdr);
     StrCat (ConfigResp, L"&");
     StrCat (ConfigResp, ResultsData);
 
     //
     // Update Browser uncommited data
     //
-    Status = ConfigRespToStorage (Storage, ConfigResp);
+    Status = ConfigRespToStorage (Storage->BrowserStorage, ConfigResp);
     if (EFI_ERROR (Status)) {
       return Status;
     }
@@ -822,7 +823,7 @@
 **/
 VOID
 SynchronizeStorage (
-  IN FORMSET_STORAGE         *Storage,
+  IN BROWSER_STORAGE         *Storage,
   IN BOOLEAN                 SyncOrRestore
   )
 {
@@ -875,7 +876,7 @@
 **/
 EFI_STATUS
 GetValueByName (
-  IN FORMSET_STORAGE             *Storage,
+  IN BROWSER_STORAGE             *Storage,
   IN CHAR16                      *Name,
   IN OUT CHAR16                  **Value,
   IN GET_SET_QUESTION_VALUE_WITH GetValueFrom
@@ -924,7 +925,7 @@
 **/
 EFI_STATUS
 SetValueByName (
-  IN FORMSET_STORAGE         *Storage,
+  IN BROWSER_STORAGE         *Storage,
   IN CHAR16                  *Name,
   IN CHAR16                  *Value,
   IN GET_SET_QUESTION_VALUE_WITH SetValueTo
@@ -971,9 +972,9 @@
 /**
   Convert setting of Buffer Storage or NameValue Storage to <ConfigResp>.
 
-  @param  Buffer                 The Storage to be conveted.
+  @param  Storage                The Storage to be conveted.
   @param  ConfigResp             The returned <ConfigResp>.
-  @param  SingleForm             Whether update data for single form or 
formset level.
+  @param  ConfigRequest          The ConfigRequest string.
 
   @retval EFI_SUCCESS            Convert success.
   @retval EFI_INVALID_PARAMETER  Incorrect storage type.
@@ -981,28 +982,17 @@
 **/
 EFI_STATUS
 StorageToConfigResp (
-  IN VOID                    *Buffer,
+  IN BROWSER_STORAGE         *Storage,
   IN CHAR16                  **ConfigResp,
-  IN BOOLEAN                 SingleForm
+  IN CHAR16                  *ConfigRequest
   )
 {
-  EFI_STATUS  Status;
-  EFI_STRING  Progress;
+  EFI_STATUS              Status;
+  EFI_STRING              Progress;
   LIST_ENTRY              *Link;
   NAME_VALUE_NODE         *Node;
-  CHAR16                  *ConfigRequest;
-  FORMSET_STORAGE         *Storage;
-  FORM_BROWSER_CONFIG_REQUEST  *ConfigInfo;
 
   Status = EFI_SUCCESS;
-  if (SingleForm) {
-    ConfigInfo    = (FORM_BROWSER_CONFIG_REQUEST *) Buffer;
-    Storage       = ConfigInfo->Storage;
-    ConfigRequest = ConfigInfo->ConfigRequest;
-  } else {
-    Storage       = (FORMSET_STORAGE *) Buffer;
-    ConfigRequest = Storage->ConfigRequest;
-  }
 
   switch (Storage->Type) {
   case EFI_HII_VARSTORE_BUFFER:
@@ -1057,7 +1047,7 @@
 **/
 EFI_STATUS
 ConfigRespToStorage (
-  IN FORMSET_STORAGE         *Storage,
+  IN BROWSER_STORAGE         *Storage,
   IN CHAR16                  *ConfigResp
   )
 {
@@ -1149,7 +1139,7 @@
   UINT8               *Dst;
   UINTN               StorageWidth;
   EFI_TIME            EfiTime;
-  FORMSET_STORAGE     *Storage;
+  BROWSER_STORAGE     *Storage;
   EFI_IFR_TYPE_VALUE  *QuestionValue;
   CHAR16              *ConfigRequest;
   CHAR16              *Progress;
@@ -1574,7 +1564,7 @@
   EFI_TIME            EfiTime;
   UINTN               BufferLen;
   UINTN               StorageWidth;
-  FORMSET_STORAGE     *Storage;
+  BROWSER_STORAGE     *Storage;
   EFI_IFR_TYPE_VALUE  *QuestionValue;
   CHAR16              *ConfigResp;
   CHAR16              *Progress;
@@ -2300,7 +2290,7 @@
       Storage = FORMSET_STORAGE_FROM_LINK (Link);
       Link = GetNextNode (&FormSet->StorageListHead, Link);
 
-      if (Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE) {
+      if (Storage->BrowserStorage->Type == EFI_HII_VARSTORE_EFI_VARIABLE) {
         continue;
       }
 
@@ -2311,7 +2301,7 @@
         continue;
       }
 
-      SynchronizeStorage(Storage, FALSE);
+      SynchronizeStorage(Storage->BrowserStorage, FALSE);
     }
 
     Link = GetFirstNode (&FormSet->FormListHead);
@@ -2377,7 +2367,8 @@
   LIST_ENTRY              *Link;
   EFI_STRING              ConfigResp;
   EFI_STRING              Progress;
-  FORMSET_STORAGE         *Storage;
+  BROWSER_STORAGE         *Storage;
+  FORMSET_STORAGE         *FormSetStorage;
   UINTN                   BufferSize;
   UINT8                   *TmpBuf;  
   FORM_BROWSER_FORMSET    *LocalFormSet;
@@ -2425,7 +2416,7 @@
       //
       // 1. Prepare <ConfigResp>
       //
-      Status = StorageToConfigResp (ConfigInfo, &ConfigResp, TRUE);
+      Status = StorageToConfigResp (ConfigInfo->Storage, &ConfigResp, 
ConfigInfo->ConfigRequest);
       if (EFI_ERROR (Status)) {
         return Status;
       }
@@ -2514,7 +2505,8 @@
     //
     Link = GetFirstNode (&FormSet->StorageListHead);
     while (!IsNull (&FormSet->StorageListHead, Link)) {
-      Storage = FORMSET_STORAGE_FROM_LINK (Link);
+      FormSetStorage = (FORMSET_STORAGE_FROM_LINK (Link));
+      Storage        = FormSetStorage->BrowserStorage;
       Link = GetNextNode (&FormSet->StorageListHead, Link);
 
       if (Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE) {
@@ -2524,14 +2516,14 @@
       //
       // Skip if there is no RequestElement
       //
-      if (Storage->ElementCount == 0) {
+      if (FormSetStorage->ElementCount == 0) {
         continue;
       }
 
       //
       // 1. Prepare <ConfigResp>
       //
-      Status = StorageToConfigResp (Storage, &ConfigResp, FALSE);
+      Status = StorageToConfigResp (Storage, &ConfigResp, 
FormSetStorage->ConfigRequest);
       if (EFI_ERROR (Status)) {
         return Status;
       }
@@ -2659,7 +2651,7 @@
   BOOLEAN             IsBufferStorage;
   BOOLEAN             IsString;  
   UINTN               Length;
-  FORMSET_STORAGE     *Storage;
+  BROWSER_STORAGE     *Storage;
   CHAR16              *ConfigRequest;
   CHAR16              *Progress;
   CHAR16              *Result;
@@ -3131,7 +3123,7 @@
   IN UINT16                           DefaultId,
   IN BROWSER_SETTING_SCOPE            SettingScope,
   IN BROWSER_GET_DEFAULT_VALUE        GetDefaultValueScope,
-  IN FORMSET_STORAGE                  *Storage OPTIONAL,
+  IN BROWSER_STORAGE                  *Storage OPTIONAL,
   IN BOOLEAN                          RetrieveValueFirst
   )
 {
@@ -3444,17 +3436,17 @@
   EFI_STRING  Result;
   CHAR16      *StrPtr;
 
-  if (Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE) {
+  if (Storage->BrowserStorage->Type == EFI_HII_VARSTORE_EFI_VARIABLE) {
     return EFI_SUCCESS;
   }
 
-  if (Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER) {
+  if (Storage->BrowserStorage->Type == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER) {
     Status = gRT->GetVariable (
-                     Storage->Name,
-                     &Storage->Guid,
+                     Storage->BrowserStorage->Name,
+                     &Storage->BrowserStorage->Guid,
                      NULL,
-                     (UINTN*)&Storage->Size,
-                     Storage->EditBuffer
+                     (UINTN*)&Storage->BrowserStorage->Size,
+                     Storage->BrowserStorage->EditBuffer
                      );
     return Status;
   }
@@ -3491,137 +3483,12 @@
     *StrPtr = L'\0';
   }
 
-  Status = ConfigRespToStorage (Storage, Result);
+  Status = ConfigRespToStorage (Storage->BrowserStorage, Result);
   FreePool (Result);
   return Status;
 }
 
-
 /**
-  Copy uncommitted data from source Storage to destination Storage.
-
-  @param  Dst                    Target Storage for uncommitted data.
-  @param  Src                    Source Storage for uncommitted data.
-
-  @retval EFI_SUCCESS            The function completed successfully.
-  @retval EFI_INVALID_PARAMETER  Source and destination Storage is not the 
same type.
-
-**/
-EFI_STATUS
-CopyStorage (
-  IN OUT FORMSET_STORAGE     *Dst,
-  IN FORMSET_STORAGE         *Src
-  )
-{
-  LIST_ENTRY          *Link;
-  NAME_VALUE_NODE     *Node;
-
-  if ((Dst->Type != Src->Type) || (Dst->Size != Src->Size)) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  switch (Src->Type) {
-  case EFI_HII_VARSTORE_BUFFER:
-  case EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER:
-    CopyMem (Dst->EditBuffer, Src->EditBuffer, Src->Size);
-    CopyMem (Dst->Buffer, Src->Buffer, Src->Size);
-    break;
-
-  case EFI_HII_VARSTORE_NAME_VALUE:
-    Link = GetFirstNode (&Src->NameValueListHead);
-    while (!IsNull (&Src->NameValueListHead, Link)) {
-      Node = NAME_VALUE_NODE_FROM_LINK (Link);
-
-      SetValueByName (Dst, Node->Name, Node->EditValue, 
GetSetValueWithEditBuffer);
-      SetValueByName (Dst, Node->Name, Node->Value, GetSetValueWithBuffer);
-
-      Link = GetNextNode (&Src->NameValueListHead, Link);
-    }
-    break;
-
-  case EFI_HII_VARSTORE_EFI_VARIABLE:
-  default:
-    break;
-  }
-
-  return EFI_SUCCESS;
-}
-
-/**
-  Get old question value from the saved formset.
-
-  @param  Statement              The question which need to get old question 
value.
-  @param  OldFormSet             FormSet data structure saved in the list.
-
-**/
-VOID 
-GetOldQuestionValue (
-  IN OUT FORM_BROWSER_STATEMENT  *Statement,
-  IN     FORM_BROWSER_FORMSET    *OldFormSet
-  )
-{
-  LIST_ENTRY              *FormLink;
-  LIST_ENTRY              *Link;
-  FORM_BROWSER_STATEMENT  *Question;
-  FORM_BROWSER_FORM       *Form;
-
-  FormLink = GetFirstNode (&OldFormSet->FormListHead);
-  while (!IsNull (&OldFormSet->FormListHead, FormLink)) {
-    Form = FORM_BROWSER_FORM_FROM_LINK (FormLink);
-    FormLink = GetNextNode (&OldFormSet->FormListHead, FormLink);
-
-    Link = GetFirstNode (&Form->StatementListHead);
-    while (!IsNull (&Form->StatementListHead, Link)) {
-      Question = FORM_BROWSER_STATEMENT_FROM_LINK (Link);
-      Link = GetNextNode (&Form->StatementListHead, Link);
-
-      if (Question->QuestionId != Statement->QuestionId) {
-        continue;
-      }
-
-      CopyMem (&Statement->HiiValue, &Question->HiiValue, sizeof 
(EFI_HII_VALUE));
-      return;
-    }
-  }
-}
-
-/**
-  Get old question value from the saved formset, all these questions not have
-  storage.
-
-  @param  FormSet                FormSet data structure which is used now.
-  @param  OldFormSet             FormSet data structure saved in the list.
-
-**/
-VOID
-CopyOldValueForNoStorageQst (
-  IN OUT FORM_BROWSER_FORMSET             *FormSet,
-  IN     FORM_BROWSER_FORMSET             *OldFormSet
-  )
-{
-  LIST_ENTRY              *FormLink;
-  LIST_ENTRY              *Link;
-  FORM_BROWSER_STATEMENT  *Question;
-  FORM_BROWSER_FORM       *Form;
-
-  FormLink = GetFirstNode (&FormSet->FormListHead);
-  while (!IsNull (&FormSet->FormListHead, FormLink)) {
-    Form = FORM_BROWSER_FORM_FROM_LINK (FormLink);
-    FormLink = GetNextNode (&FormSet->FormListHead, FormLink);
-
-    Link = GetFirstNode (&Form->StatementListHead);
-    while (!IsNull (&Form->StatementListHead, Link)) {
-      Question = FORM_BROWSER_STATEMENT_FROM_LINK (Link);
-      Link = GetNextNode (&Form->StatementListHead, Link);
-
-      if (Question->Storage == NULL) {
-        GetOldQuestionValue (Question, OldFormSet);
-      }
-    }
-  }
-}
-
-/**
   Get current setting of Questions.
 
   @param  FormSet                FormSet data structure.
@@ -3673,17 +3540,18 @@
       }
     }
 
-    if (OldStorage == NULL) {
-      //
-      // Storage is not found in backup formset, request it from ConfigDriver
-      //
+    //
+    // Storage is not found in backup formset and current global storage not 
has other driver used,
+    // request it from ConfigDriver
+    //
+    if (OldStorage == NULL && Storage->BrowserStorage->ReferenceCount == 1) {
       Status = LoadStorage (FormSet, Storage);
 
       if (EFI_ERROR (Status)) {
         //
         // If get last time changed value failed, extract default from IFR 
binary
         //
-        ExtractDefault (FormSet, NULL, EFI_HII_DEFAULT_CLASS_STANDARD, 
FormSetLevel, GetDefaultForStorage, Storage, TRUE);
+        ExtractDefault (FormSet, NULL, EFI_HII_DEFAULT_CLASS_STANDARD, 
FormSetLevel, GetDefaultForStorage, Storage->BrowserStorage, TRUE);
         //
         // ExtractDefault will set the NV flag to TRUE, so need this function 
to clean the flag
         // in current situation.
@@ -3695,12 +3563,7 @@
       // Now Edit Buffer is filled with default values(lower priority) or 
current
       // settings(higher priority), sychronize it to shadow Buffer
       //
-      SynchronizeStorage (Storage, TRUE);
-    } else {
-      //
-      // Storage found in backup formset, use it
-      //
-      Status = CopyStorage (Storage, OldStorage);
+      SynchronizeStorage (Storage->BrowserStorage, TRUE);
     }
 
     Link = GetNextNode (&FormSet->StorageListHead, Link);

Modified: branches/UDK2010.SR1/MdeModulePkg/Universal/SetupBrowserDxe/Setup.h
===================================================================
--- branches/UDK2010.SR1/MdeModulePkg/Universal/SetupBrowserDxe/Setup.h 
2013-04-18 05:56:04 UTC (rev 14289)
+++ branches/UDK2010.SR1/MdeModulePkg/Universal/SetupBrowserDxe/Setup.h 
2013-04-18 06:29:34 UTC (rev 14290)
@@ -216,7 +216,7 @@
 
 #define NAME_VALUE_NODE_FROM_LINK(a)  CR (a, NAME_VALUE_NODE, Link, 
NAME_VALUE_NODE_SIGNATURE)
 
-#define FORMSET_STORAGE_SIGNATURE  SIGNATURE_32 ('F', 'S', 'T', 'G')
+#define BROWSER_STORAGE_SIGNATURE  SIGNATURE_32 ('B', 'S', 'T', 'G')
 
 typedef struct {
   UINTN            Signature;
@@ -224,7 +224,6 @@
 
   UINT8            Type;           // Storage type
 
-  UINT16           VarStoreId;
   EFI_GUID         Guid;
 
   CHAR16           *Name;          // For EFI_IFR_VARSTORE
@@ -237,6 +236,21 @@
   UINT32           Attributes;     // For EFI_IFR_VARSTORE_EFI: EFI Variable 
attribute
 
   CHAR16           *ConfigHdr;     // <ConfigHdr>
+  UINT8            ReferenceCount; // How many form set storage refrence this 
storage.
+} BROWSER_STORAGE;
+
+#define BROWSER_STORAGE_FROM_LINK(a)  CR (a, BROWSER_STORAGE, Link, 
BROWSER_STORAGE_SIGNATURE)
+
+#define FORMSET_STORAGE_SIGNATURE  SIGNATURE_32 ('F', 'S', 'T', 'G')
+
+typedef struct {
+  UINTN            Signature;
+  LIST_ENTRY       Link;
+
+  UINT16           VarStoreId;
+
+  BROWSER_STORAGE  *BrowserStorage;
+
   CHAR16           *ConfigRequest; // <ConfigRequest> = <ConfigHdr> + 
<RequestElement>
   UINTN            ElementCount;   // Number of <RequestElement> in the 
<ConfigRequest>
   UINTN            SpareStrLen;    // Spare length of ConfigRequest string 
buffer
@@ -272,7 +286,7 @@
   EFI_STRING_ID     DevicePath;  // For EFI_IFR_QUESTION_REF3_2, 
EFI_IFR_QUESTION_REF3_3
   EFI_GUID          Guid;
 
-  FORMSET_STORAGE   *VarStorage; // For EFI_IFR_SET, EFI_IFR_GET
+  BROWSER_STORAGE   *VarStorage; // For EFI_IFR_SET, EFI_IFR_GET
   VAR_STORE_INFO    VarStoreInfo;// For EFI_IFR_SET, EFI_IFR_GET
   UINT8             ValueType;   // For EFI_IFR_SET, EFI_IFR_GET
   UINT8             ValueWidth;  // For EFI_IFR_SET, EFI_IFR_GET
@@ -372,7 +386,7 @@
   //
   EFI_QUESTION_ID       QuestionId;       // The value of zero is reserved
   EFI_VARSTORE_ID       VarStoreId;       // A value of zero indicates no 
variable storage
-  FORMSET_STORAGE       *Storage;
+  BROWSER_STORAGE       *Storage;
   VAR_STORE_INFO        VarStoreInfo;
   UINT16                StorageWidth;
   UINT8                 QuestionFlags;
@@ -430,7 +444,7 @@
   UINTN                 ElementCount;   // Number of <RequestElement> in the 
<ConfigRequest>  
   UINTN                 SpareStrLen;
 
-  FORMSET_STORAGE       *Storage;
+  BROWSER_STORAGE       *Storage;
 } FORM_BROWSER_CONFIG_REQUEST;
 #define FORM_BROWSER_CONFIG_REQUEST_FROM_LINK(a)  CR (a, 
FORM_BROWSER_CONFIG_REQUEST, Link, FORM_BROWSER_CONFIG_REQUEST_SIGNATURE)
 
@@ -909,7 +923,7 @@
 **/
 EFI_STATUS
 GetValueByName (
-  IN FORMSET_STORAGE             *Storage,
+  IN BROWSER_STORAGE             *Storage,
   IN CHAR16                      *Name,
   IN OUT CHAR16                  **Value,
   IN GET_SET_QUESTION_VALUE_WITH GetValueFrom
@@ -929,7 +943,7 @@
 **/
 EFI_STATUS
 SetValueByName (
-  IN FORMSET_STORAGE             *Storage,
+  IN BROWSER_STORAGE             *Storage,
   IN CHAR16                      *Name,
   IN CHAR16                      *Value,
   IN GET_SET_QUESTION_VALUE_WITH SetValueTo
@@ -1111,7 +1125,7 @@
   IN UINT16                           DefaultId,
   IN BROWSER_SETTING_SCOPE            SettingScope,
   IN BROWSER_GET_DEFAULT_VALUE        GetDefaultValueScope,
-  IN FORMSET_STORAGE                  *Storage,
+  IN BROWSER_STORAGE                  *Storage,
   IN BOOLEAN                          RetrieveValueFirst
   );
 
@@ -1156,9 +1170,9 @@
 /**
   Convert setting of Buffer Storage or NameValue Storage to <ConfigResp>.
 
-  @param  Buffer                 The Storage to be conveted.
+  @param  Storage                The Storage to be conveted.
   @param  ConfigResp             The returned <ConfigResp>.
-  @param  SingleForm             Whether update data for single form or 
formset level.
+  @param  ConfigRequest          The ConfigRequest string.
 
   @retval EFI_SUCCESS            Convert success.
   @retval EFI_INVALID_PARAMETER  Incorrect storage type.
@@ -1166,9 +1180,9 @@
 **/
 EFI_STATUS
 StorageToConfigResp (
-  IN VOID                    *Buffer,
+  IN BROWSER_STORAGE         *Storage,
   IN CHAR16                  **ConfigResp,
-  IN BOOLEAN                 SingleForm
+  IN CHAR16                  *ConfigRequest
   );
 
 /**
@@ -1183,7 +1197,7 @@
 **/
 EFI_STATUS
 ConfigRespToStorage (
-  IN FORMSET_STORAGE         *Storage,
+  IN BROWSER_STORAGE         *Storage,
   IN CHAR16                  *ConfigResp
   );
 

This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.


------------------------------------------------------------------------------
Precog is a next-generation analytics platform capable of advanced
analytics on semi-structured data. The platform includes APIs for building
apps and a phenomenal toolset for data science. Developers can use
our toolset for easy data analysis & visualization. Get a free account!
http://www2.precog.com/precogplatform/slashdotnewsletter
_______________________________________________
edk2-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-commits

Reply via email to