]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Refine the load form sets process for BrowserCallback function.
authorEric Dong <eric.dong@intel.com>
Tue, 8 Apr 2014 06:17:33 +0000 (06:17 +0000)
committerydong10 <ydong10@6f19259b-4bc3-4df7-8a09-765794883524>
Tue, 8 Apr 2014 06:17:33 +0000 (06:17 +0000)
Contributed-under: TianoCore Contribution Agreement 1.0
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@15434 6f19259b-4bc3-4df7-8a09-765794883524

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

index f86f369ff28c7c27b257db6cdbf3d0f89ebb0328..a456a2b21dbafc07cd8242a7b220ea9dd3a32fd6 100644 (file)
@@ -608,14 +608,6 @@ BrowserCallback (
   Found     = FALSE;\r
   Status    = EFI_SUCCESS;\r
 \r
-  //\r
-  // If set browser data, pre load all hii formset to avoid set the varstore which is not \r
-  // saved in browser.\r
-  //\r
-  if (!RetrieveData && (gBrowserSettingScope == SystemLevel)) {\r
-    LoadAllHiiFormset();\r
-  }\r
-\r
   if (VariableGuid != NULL) {\r
     //\r
     // Try to find target storage in the current formset.\r
@@ -661,6 +653,10 @@ BrowserCallback (
         return Status;\r
       }\r
 \r
+      if (Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER) {\r
+        ConfigRequestAdjust (Storage, ResultsData, TRUE);\r
+      }\r
+\r
       //\r
       // Different formsets may have same varstore, so here just set the flag\r
       // not exit the circle.\r
@@ -3707,7 +3703,6 @@ CleanBrowserStorage (
 {\r
   LIST_ENTRY            *Link;\r
   FORMSET_STORAGE       *Storage;\r
-  CHAR16                *ConfigRequest;\r
 \r
   Link = GetFirstNode (&FormSet->StorageListHead);\r
   while (!IsNull (&FormSet->StorageListHead, Link)) {\r
@@ -3719,8 +3714,7 @@ CleanBrowserStorage (
         continue;\r
       }\r
 \r
-      ConfigRequest = FormSet->QuestionInited ? Storage->ConfigRequest : Storage->ConfigElements;\r
-      RemoveConfigRequest (Storage->BrowserStorage, ConfigRequest);\r
+      RemoveConfigRequest (Storage->BrowserStorage, Storage->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
@@ -3799,6 +3793,8 @@ AppendConfigRequest (
   Adjust the config request info, remove the request elements which already in AllConfigRequest string.\r
 \r
   @param  Storage                Form set Storage.\r
+  @param  Request                The input request string.\r
+  @param  RespString             Whether the input is ConfigRequest or ConfigResp format.\r
 \r
   @retval TRUE                   Has element not covered by current used elements, need to continue to call ExtractConfig\r
   @retval FALSE                  All elements covered by current used elements.\r
@@ -3806,30 +3802,37 @@ AppendConfigRequest (
 **/\r
 BOOLEAN \r
 ConfigRequestAdjust (\r
-  IN  FORMSET_STORAGE         *Storage\r
+  IN  BROWSER_STORAGE         *Storage,\r
+  IN  CHAR16                  *Request,\r
+  IN  BOOLEAN                 RespString\r
   )\r
 {\r
   CHAR16       *RequestElement;\r
   CHAR16       *NextRequestElement;\r
-  CHAR16       *RetBuf;\r
+  CHAR16       *NextElementBakup;\r
   UINTN        SpareBufLen;\r
   CHAR16       *SearchKey;\r
+  CHAR16       *ValueKey;\r
   BOOLEAN      RetVal;\r
+  CHAR16       *ConfigRequest;\r
 \r
   SpareBufLen    = 0;\r
-  RetBuf         = NULL;\r
   RetVal         = FALSE;\r
+  NextElementBakup = NULL;\r
+  ValueKey         = NULL;\r
 \r
-  if (Storage->BrowserStorage->ConfigRequest == NULL) {\r
-    Storage->BrowserStorage->ConfigRequest = AllocateCopyPool (StrSize (Storage->ConfigRequest), Storage->ConfigRequest);\r
-    if (Storage->ConfigElements != NULL) {\r
-      FreePool (Storage->ConfigElements);\r
-    }\r
-    Storage->ConfigElements = AllocateCopyPool (StrSize (Storage->ConfigRequest), Storage->ConfigRequest);\r
+  if (Request != NULL) {\r
+    ConfigRequest = Request;\r
+  } else {\r
+    ConfigRequest = Storage->ConfigRequest;\r
+  }\r
+\r
+  if (Storage->ConfigRequest == NULL) {\r
+    Storage->ConfigRequest = AllocateCopyPool (StrSize (ConfigRequest), ConfigRequest);\r
     return TRUE;\r
   }\r
 \r
-  if (Storage->BrowserStorage->Type == EFI_HII_VARSTORE_NAME_VALUE) {\r
+  if (Storage->Type == EFI_HII_VARSTORE_NAME_VALUE) {\r
     //\r
     // "&Name1&Name2" section for EFI_HII_VARSTORE_NAME_VALUE storage\r
     //\r
@@ -3839,26 +3842,22 @@ ConfigRequestAdjust (
     // "&OFFSET=####&WIDTH=####" section for EFI_HII_VARSTORE_BUFFER storage\r
     //\r
     SearchKey = L"&OFFSET";\r
+    ValueKey  = L"&VALUE";\r
   }\r
 \r
-  //\r
-  // Prepare the config header.\r
-  // \r
-  RetBuf = AllocateCopyPool(StrSize (Storage->BrowserStorage->ConfigHdr), Storage->BrowserStorage->ConfigHdr);\r
-  ASSERT (RetBuf != NULL);\r
-\r
   //\r
   // Find SearchKey storage\r
   //\r
-  if (Storage->BrowserStorage->Type == EFI_HII_VARSTORE_NAME_VALUE) {\r
-    RequestElement = StrStr (Storage->ConfigRequest, L"PATH");\r
+  if (Storage->Type == EFI_HII_VARSTORE_NAME_VALUE) {\r
+    RequestElement = StrStr (ConfigRequest, L"PATH");\r
     ASSERT (RequestElement != NULL);\r
     RequestElement = StrStr (RequestElement, SearchKey);    \r
   } else {\r
-    RequestElement = StrStr (Storage->ConfigRequest, SearchKey);\r
+    RequestElement = StrStr (ConfigRequest, SearchKey);\r
   }\r
 \r
   while (RequestElement != NULL) {\r
+\r
     //\r
     // +1 to avoid find header itself.\r
     //\r
@@ -3868,18 +3867,30 @@ ConfigRequestAdjust (
     // The last Request element in configRequest string.\r
     //\r
     if (NextRequestElement != NULL) {\r
+      if (RespString && (Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER)) {\r
+        NextElementBakup = NextRequestElement;\r
+        NextRequestElement = StrStr (RequestElement, ValueKey);\r
+      }\r
       //\r
       // Replace "&" with '\0'.\r
       //\r
       *NextRequestElement = L'\0';\r
+    } else {\r
+      if (RespString && (Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER)) {\r
+        NextElementBakup = NextRequestElement;\r
+        NextRequestElement = StrStr (RequestElement, ValueKey);\r
+        //\r
+        // Replace "&" with '\0'.\r
+        //\r
+        *NextRequestElement = L'\0';\r
+      }\r
     }\r
  \r
-    if (!ElementValidation (Storage->BrowserStorage, RequestElement)) {\r
+    if (!ElementValidation (Storage, RequestElement)) {\r
       //\r
       // Add this element to the Storage->BrowserStorage->AllRequestElement.\r
       //\r
-      AppendConfigRequest(&Storage->BrowserStorage->ConfigRequest, &Storage->BrowserStorage->SpareStrLen, RequestElement);\r
-      AppendConfigRequest (&RetBuf, &SpareBufLen, RequestElement);\r
+      AppendConfigRequest(&Storage->ConfigRequest, &Storage->SpareStrLen, RequestElement);\r
       RetVal = TRUE;\r
     }\r
 \r
@@ -3890,16 +3901,11 @@ ConfigRequestAdjust (
       *NextRequestElement = L'&';\r
     }\r
 \r
-    RequestElement = NextRequestElement;\r
-  }\r
-\r
-  if (RetVal) {\r
-    if (Storage->ConfigElements != NULL) {\r
-      FreePool (Storage->ConfigElements);\r
+    if (RespString && (Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER)) {\r
+      RequestElement = NextElementBakup;\r
+    } else {\r
+      RequestElement = NextRequestElement;\r
     }\r
-    Storage->ConfigElements = RetBuf;\r
-  } else {\r
-    FreePool (RetBuf);\r
   }\r
 \r
   return RetVal;\r
@@ -4082,7 +4088,7 @@ LoadStorage (
 \r
     case EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER:\r
       if (Storage->BrowserStorage->ConfigRequest != NULL) {\r
-        ConfigRequestAdjust(Storage);\r
+        ConfigRequestAdjust(Storage->BrowserStorage, Storage->ConfigRequest, FALSE);\r
         return;\r
       }\r
       break;\r
@@ -4100,7 +4106,7 @@ LoadStorage (
       // Just update the ConfigRequest, if storage already initialized. \r
       //\r
       if (Storage->BrowserStorage->Initialized) {\r
-        ConfigRequestAdjust(Storage);\r
+        ConfigRequestAdjust(Storage->BrowserStorage, Storage->ConfigRequest, FALSE);\r
         return;\r
       }\r
 \r
index cfbe348d61ff2ec2c3be69eb34b472e647467e10..50ab1fa6fd2a77392431bd902b46bc8148789227 100644 (file)
@@ -169,7 +169,6 @@ typedef struct {
   BROWSER_STORAGE  *BrowserStorage;\r
 \r
   CHAR16           *ConfigRequest; // <ConfigRequest> = <ConfigHdr> + <RequestElement>\r
-  CHAR16           *ConfigElements;// Elements need to load initial data.\r
   UINTN            ElementCount;   // Number of <RequestElement> in the <ConfigRequest>\r
   UINTN            SpareStrLen;    // Spare length of ConfigRequest string buffer\r
 } FORMSET_STORAGE;\r
@@ -1657,4 +1656,22 @@ DevicePathToHiiHandle (
   IN EFI_GUID                   *FormsetGuid\r
   );\r
 \r
+/**\r
+  Adjust the config request info, remove the request elements which already in AllConfigRequest string.\r
+\r
+  @param  Storage                Form set Storage.\r
+  @param  Request                The input request string.\r
+  @param  RespString             Whether the input is ConfigRequest or ConfigResp format.\r
+\r
+  @retval TRUE                   Has element not covered by current used elements, need to continue to call ExtractConfig\r
+  @retval FALSE                  All elements covered by current used elements.\r
+\r
+**/\r
+BOOLEAN \r
+ConfigRequestAdjust (\r
+  IN  BROWSER_STORAGE         *Storage,\r
+  IN  CHAR16                  *Request,\r
+  IN  BOOLEAN                 RespString\r
+  );\r
+\r
 #endif\r