]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/SetupBrowserDxe/Setup.c
Sync value for string opcode after call the Callback function.
[mirror_edk2.git] / MdeModulePkg / Universal / SetupBrowserDxe / Setup.c
index cf1d57549a69d9d851c75bb00afdd475dbd16f69..d7536e7ba539f26ed5a100aa00f971d923b67e0b 100644 (file)
@@ -417,7 +417,7 @@ SendForm (
       //\r
       // If no data is changed, don't need to save current FormSet into the maintain list.\r
       //\r
-      if (!IsNvUpdateRequiredForFormSet (FormSet) && !IsStorageDataChangedForFormSet(FormSet)) {\r
+      if (!IsNvUpdateRequiredForFormSet (FormSet)) {\r
         CleanBrowserStorage(FormSet);\r
         RemoveEntryList (&FormSet->Link);\r
         DestroyFormSet (FormSet);\r
@@ -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
@@ -2132,6 +2128,10 @@ SendDiscardInfoToDriver (
   EFI_IFR_TYPE_VALUE          *TypeValue;\r
   EFI_BROWSER_ACTION_REQUEST  ActionRequest;\r
 \r
+  if (FormSet->ConfigAccess == NULL) {\r
+    return;\r
+  }\r
+\r
   Link = GetFirstNode (&Form->StatementListHead);\r
   while (!IsNull (&Form->StatementListHead, Link)) {\r
     Question = FORM_BROWSER_STATEMENT_FROM_LINK (Link);\r
@@ -2993,6 +2993,7 @@ GetQuestionDefault (
   EFI_HII_CONFIG_ACCESS_PROTOCOL  *ConfigAccess;\r
   EFI_BROWSER_ACTION_REQUEST      ActionRequest;\r
   INTN                            Action;\r
+  CHAR16                          *NewString;\r
 \r
   Status   = EFI_NOT_FOUND;\r
   StrValue = NULL;\r
@@ -3030,6 +3031,19 @@ GetQuestionDefault (
                              &ActionRequest\r
                              );\r
     if (!EFI_ERROR (Status)) {\r
+      if (HiiValue->Type == EFI_IFR_TYPE_STRING) {\r
+        NewString = GetToken (Question->HiiValue.Value.string, FormSet->HiiHandle);\r
+        ASSERT (NewString != NULL);\r
+\r
+        ASSERT (StrLen (NewString) * sizeof (CHAR16) <= Question->StorageWidth);\r
+        if (StrLen (NewString) * sizeof (CHAR16) <= Question->StorageWidth) {\r
+          CopyMem (Question->BufferValue, NewString, StrSize (NewString));\r
+        } else {\r
+          CopyMem (Question->BufferValue, NewString, Question->StorageWidth);\r
+        }\r
+\r
+        FreePool (NewString);\r
+      }\r
       return Status;\r
     }\r
   }\r
@@ -3307,7 +3321,7 @@ ExtractDefault (
         //\r
         // Call the Retrieve call back to get the initial question value.\r
         //\r
-        Status = ProcessRetrieveForQuestion(FormSet->ConfigAccess, Question);\r
+        Status = ProcessRetrieveForQuestion(FormSet->ConfigAccess, Question, FormSet);\r
       }\r
 \r
       //\r
@@ -3703,7 +3717,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
@@ -3715,12 +3728,12 @@ 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
         FreePool (Storage->BrowserStorage->ConfigRequest);\r
+        Storage->BrowserStorage->ConfigRequest = NULL;\r
       }\r
       Storage->BrowserStorage->Initialized = FALSE;\r
     }\r
@@ -3794,6 +3807,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
@@ -3801,30 +3816,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
@@ -3834,26 +3856,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
@@ -3863,18 +3881,32 @@ 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
+        ASSERT (NextRequestElement != NULL);\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
+        ASSERT (NextRequestElement != NULL);\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
@@ -3885,16 +3917,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
@@ -4077,42 +4104,54 @@ 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
-\r
-      //\r
-      // Create the config request string to get all fields for this storage.\r
-      // Allocate and fill a buffer large enough to hold the <ConfigHdr> template\r
-      // followed by "&OFFSET=0&WIDTH=WWWW"followed by a Null-terminator\r
-      //\r
-      StrLen = StrSize (Storage->BrowserStorage->ConfigHdr) + 20 * sizeof (CHAR16);\r
-      ConfigRequest = AllocateZeroPool (StrLen);\r
-      ASSERT (ConfigRequest != NULL);\r
-      UnicodeSPrint (\r
-                 ConfigRequest, \r
-                 StrLen, \r
-                 L"%s&OFFSET=0&WIDTH=%04x", \r
-                 Storage->BrowserStorage->ConfigHdr,\r
-                 Storage->BrowserStorage->Size);\r
       break;\r
 \r
     case EFI_HII_VARSTORE_BUFFER:\r
     case EFI_HII_VARSTORE_NAME_VALUE:\r
       //\r
-      // Skip if there is no RequestElement or data has initilized.\r
+      // Skip if there is no RequestElement.\r
       //\r
-      if (Storage->ElementCount == 0 || Storage->BrowserStorage->Initialized) {\r
+      if (Storage->ElementCount == 0) {\r
         return;\r
       }\r
+\r
+      //\r
+      // Just update the ConfigRequest, if storage already initialized. \r
+      //\r
+      if (Storage->BrowserStorage->Initialized) {\r
+        ConfigRequestAdjust(Storage->BrowserStorage, Storage->ConfigRequest, FALSE);\r
+        return;\r
+      }\r
+\r
       Storage->BrowserStorage->Initialized = TRUE;\r
-      ConfigRequest = Storage->ConfigRequest;\r
       break;\r
 \r
     default:\r
       return;\r
   }\r
 \r
+  if (Storage->BrowserStorage->Type != EFI_HII_VARSTORE_NAME_VALUE) {\r
+    //\r
+    // Create the config request string to get all fields for this storage.\r
+    // Allocate and fill a buffer large enough to hold the <ConfigHdr> template\r
+    // followed by "&OFFSET=0&WIDTH=WWWW"followed by a Null-terminator\r
+    //\r
+    StrLen = StrSize (Storage->BrowserStorage->ConfigHdr) + 20 * sizeof (CHAR16);\r
+    ConfigRequest = AllocateZeroPool (StrLen);\r
+    ASSERT (ConfigRequest != NULL);\r
+    UnicodeSPrint (\r
+               ConfigRequest, \r
+               StrLen, \r
+               L"%s&OFFSET=0&WIDTH=%04x", \r
+               Storage->BrowserStorage->ConfigHdr,\r
+               Storage->BrowserStorage->Size);\r
+  } else {\r
+    ConfigRequest = Storage->ConfigRequest;\r
+  }\r
+\r
   //\r
   // Request current settings from Configuration Driver\r
   //\r
@@ -4148,7 +4187,7 @@ LoadStorage (
   //\r
   SynchronizeStorage(FormSet, Storage->BrowserStorage, NULL, TRUE);\r
 \r
-  if (Storage->BrowserStorage->Type == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER) {\r
+  if (Storage->BrowserStorage->Type != EFI_HII_VARSTORE_NAME_VALUE) {\r
     if (ConfigRequest != NULL) {\r
       FreePool (ConfigRequest);\r
     }\r