]> git.proxmox.com Git - mirror_edk2.git/commitdiff
When need to find varstore in the storage list, based on the extra HiiHandle to find...
authorEric Dong <eric.dong@intel.com>
Mon, 25 Nov 2013 02:55:45 +0000 (02:55 +0000)
committerydong10 <ydong10@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 25 Nov 2013 02:55:45 +0000 (02:55 +0000)
Signed-off-by: Eric Dong <eric.dong@intel.com>
Reviewed-by: Liming Gao <liming.gao@intel.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@14895 6f19259b-4bc3-4df7-8a09-765794883524

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

index 4006fcd6fc80ed4a6de56f48caee6e7d6b3f4e01..ce2ba6fab27d3f5c66f4a616f391bf8a1bde1737 100644 (file)
@@ -348,9 +348,19 @@ InitializeConfigHdr (
 /**\r
   Find the global storage link base on the input storate type, name and guid.\r
 \r
+  For EFI_HII_VARSTORE_EFI_VARIABLE and EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER,\r
+  same guid + name = same storage\r
+\r
+  For EFI_HII_VARSTORE_NAME_VALUE:\r
+  same guid + HiiHandle = same storage\r
+\r
+  For EFI_HII_VARSTORE_BUFFER:\r
+  same guid + name + HiiHandle = same storage\r
+\r
   @param  StorageType                Storage type.\r
   @param  StorageGuid                Storage guid.\r
   @param  StorageName                Storage Name.\r
+  @param  HiiHandle                  HiiHandle for this varstore.\r
 \r
   @return Pointer to a GLOBAL_STORAGE data structure.\r
 \r
@@ -359,7 +369,8 @@ BROWSER_STORAGE *
 FindStorageInList (\r
   IN UINT8                 StorageType,\r
   IN EFI_GUID              *StorageGuid,\r
-  IN CHAR16                *StorageName\r
+  IN CHAR16                *StorageName,\r
+  IN EFI_HII_HANDLE        HiiHandle\r
   )\r
 {\r
   LIST_ENTRY       *Link;\r
@@ -370,12 +381,16 @@ FindStorageInList (
     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
+      if (StorageType == EFI_HII_VARSTORE_NAME_VALUE && BrowserStorage->HiiHandle == HiiHandle) {\r
         return BrowserStorage;\r
       }\r
 \r
       if (StrCmp (BrowserStorage->Name, StorageName) == 0) {\r
-        return BrowserStorage;\r
+        if (StorageType == EFI_HII_VARSTORE_EFI_VARIABLE || StorageType == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER) {\r
+          return BrowserStorage;\r
+        } else if (StorageType == EFI_HII_VARSTORE_BUFFER && BrowserStorage->HiiHandle == HiiHandle) {\r
+          return BrowserStorage;\r
+        }\r
       }\r
     }\r
 \r
@@ -494,7 +509,7 @@ CreateStorage (
   Storage->Signature = FORMSET_STORAGE_SIGNATURE;\r
   InsertTailList (&FormSet->StorageListHead, &Storage->Link);\r
 \r
-  BrowserStorage = FindStorageInList(StorageType, StorageGuid, UnicodeString);\r
+  BrowserStorage = FindStorageInList(StorageType, StorageGuid, UnicodeString, FormSet->HiiHandle);\r
   if (BrowserStorage == NULL) {\r
     BrowserStorage = AllocateZeroPool (sizeof (BROWSER_STORAGE));\r
     ASSERT (BrowserStorage != NULL);\r
@@ -508,7 +523,10 @@ CreateStorage (
       BrowserStorage->Name = UnicodeString;\r
     }\r
 \r
+    BrowserStorage->HiiHandle = FormSet->HiiHandle;\r
     InitializeConfigHdr (FormSet, BrowserStorage);\r
+\r
+    BrowserStorage->Initialized = FALSE;\r
   }\r
 \r
   Storage->BrowserStorage = BrowserStorage;\r
index 7975a1df19c9579fb050110d1b541a8161c2f24b..f8ea4ff01b367403857cb060c013ee5c2b753a73 100644 (file)
@@ -645,6 +645,17 @@ BrowserCallback (
         }\r
       }\r
 \r
+      if (Storage->Type == EFI_HII_VARSTORE_NAME_VALUE ||\r
+          Storage->Type == EFI_HII_VARSTORE_BUFFER) {\r
+        if (mSystemLevelFormSet == NULL || mSystemLevelFormSet->HiiHandle == NULL) {\r
+          return EFI_NOT_FOUND;\r
+        }\r
+\r
+        if (Storage->HiiHandle != mSystemLevelFormSet->HiiHandle) {\r
+          continue;\r
+        }\r
+      }\r
+\r
       Status = ProcessStorage (&TotalSize, &ResultsData, RetrieveData, Storage);\r
       if (EFI_ERROR (Status)) {\r
         return Status;\r
@@ -3880,18 +3891,20 @@ CleanBrowserStorage (
     Storage = FORMSET_STORAGE_FROM_LINK (Link);\r
     Link = GetNextNode (&FormSet->StorageListHead, Link);\r
 \r
-    if ((Storage->BrowserStorage->Type != EFI_HII_VARSTORE_BUFFER) && \r
-        (Storage->BrowserStorage->Type != EFI_HII_VARSTORE_NAME_VALUE) && \r
-        (Storage->BrowserStorage->Type != EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER)) {\r
-      continue;\r
-    }\r
+    if (Storage->BrowserStorage->Type == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER) {\r
+      if (Storage->ConfigRequest == NULL || Storage->BrowserStorage->ConfigRequest == NULL) {\r
+        continue;\r
+      }\r
 \r
-    if (Storage->ConfigRequest == NULL || Storage->BrowserStorage->ConfigRequest == NULL) {\r
-      continue;\r
+      ConfigRequest = FormSet->QuestionInited ? Storage->ConfigRequest : Storage->ConfigElements;\r
+      RemoveConfigRequest (Storage->BrowserStorage, ConfigRequest);\r
+    } else if (Storage->BrowserStorage->Type == EFI_HII_VARSTORE_BUFFER ||\r
+               Storage->BrowserStorage->Type == EFI_HII_VARSTORE_NAME_VALUE) {\r
+      if (Storage->BrowserStorage->ConfigRequest != NULL) { \r
+        FreePool (Storage->BrowserStorage->ConfigRequest);\r
+      }\r
+      Storage->BrowserStorage->Initialized = FALSE;\r
     }\r
-\r
-    ConfigRequest = FormSet->QuestionInited ? Storage->ConfigRequest : Storage->ConfigElements;\r
-    RemoveConfigRequest (Storage->BrowserStorage, ConfigRequest);\r
   }\r
 }\r
 \r
@@ -4269,22 +4282,12 @@ LoadStorage (
     case EFI_HII_VARSTORE_BUFFER:\r
     case EFI_HII_VARSTORE_NAME_VALUE:\r
       //\r
-      // Skip if there is no RequestElement\r
+      // Skip if there is no RequestElement or data has initilized.\r
       //\r
-      if (Storage->ElementCount == 0) {\r
+      if (Storage->ElementCount == 0 || Storage->BrowserStorage->Initialized) {\r
         return;\r
       }\r
 \r
-      //\r
-      // Adjust the ConfigRequest string, only the field not saved in BrowserStorage->AllConfig\r
-      // will used to call ExtractConfig.\r
-      // If not elements need to udpate, return.\r
-      //\r
-      if (!ConfigRequestAdjust(Storage)) {\r
-        return;\r
-      }\r
-      ASSERT (Storage->ConfigElements != NULL);\r
-\r
       Status = EFI_NOT_FOUND;\r
       if (FormSet->ConfigAccess != NULL) { \r
         //\r
@@ -4292,7 +4295,7 @@ LoadStorage (
         //\r
         Status = FormSet->ConfigAccess->ExtractConfig (\r
                                           FormSet->ConfigAccess,\r
-                                          Storage->ConfigElements,\r
+                                          Storage->ConfigRequest,\r
                                           &Progress,\r
                                           &Result\r
                                           );\r
@@ -4315,10 +4318,13 @@ LoadStorage (
         //\r
         // Base on the configRequest string to get default value.\r
         //\r
-        GetDefaultForFormset (FormSet, Storage->BrowserStorage, Storage->ConfigElements);\r
+        GetDefaultForFormset (FormSet, Storage->BrowserStorage, Storage->ConfigRequest);\r
       }\r
 \r
-      SynchronizeStorage(FormSet, Storage->BrowserStorage, Storage->ConfigElements, TRUE);\r
+      SynchronizeStorage(FormSet, Storage->BrowserStorage, Storage->ConfigRequest, TRUE);\r
+\r
+      Storage->BrowserStorage->ConfigRequest = AllocateCopyPool (StrSize (Storage->ConfigRequest), Storage->ConfigRequest);\r
+      Storage->BrowserStorage->Initialized = TRUE;\r
       break;\r
 \r
     default:\r
index d6ee71d8d4d1231c60532e12377e54915db16ff5..9cb4653c82567bf379cbd7e97314e0272672575d 100644 (file)
@@ -136,6 +136,9 @@ typedef struct {
 \r
   UINT8            Type;           // Storage type\r
 \r
+  BOOLEAN          Initialized;    // Whether this varstore is initialized, efi varstore not used.\r
+\r
+  EFI_HII_HANDLE   HiiHandle;      // HiiHandle for this varstore, efi varstore not used.\r
   EFI_GUID         Guid;\r
 \r
   CHAR16           *Name;          // For EFI_IFR_VARSTORE\r