]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/SetupBrowserDxe/Presentation.c
Remove SafeFreePool from MemoryAllocationLib as this API's name is misleading. Its...
[mirror_edk2.git] / MdeModulePkg / Universal / SetupBrowserDxe / Presentation.c
index a35ca35df9426a7af7435459c4a03c1697fd96c1..ba6927c7193e2667ac3bdc6564e1f9a9d86ab198 100644 (file)
@@ -597,6 +597,7 @@ InitializeBrowserStrings (
   gPlusString           = GetToken (STRING_TOKEN (PLUS_STRING), gHiiHandle);\r
   gMinusString          = GetToken (STRING_TOKEN (MINUS_STRING), gHiiHandle);\r
   gAdjustNumber         = GetToken (STRING_TOKEN (ADJUST_NUMBER), gHiiHandle);\r
+  gSaveChanges          = GetToken (STRING_TOKEN (SAVE_CHANGES), gHiiHandle);\r
   return ;\r
 }\r
 \r
@@ -610,33 +611,34 @@ FreeBrowserStrings (
   VOID\r
   )\r
 {\r
-  SafeFreePool (gFunctionOneString);\r
-  SafeFreePool (gFunctionTwoString);\r
-  SafeFreePool (gFunctionNineString);\r
-  SafeFreePool (gFunctionTenString);\r
-  SafeFreePool (gEnterString);\r
-  SafeFreePool (gEnterCommitString);\r
-  SafeFreePool (gEscapeString);\r
-  SafeFreePool (gMoveHighlight);\r
-  SafeFreePool (gMakeSelection);\r
-  SafeFreePool (gDecNumericInput);\r
-  SafeFreePool (gHexNumericInput);\r
-  SafeFreePool (gToggleCheckBox);\r
-  SafeFreePool (gPromptForData);\r
-  SafeFreePool (gPromptForPassword);\r
-  SafeFreePool (gPromptForNewPassword);\r
-  SafeFreePool (gConfirmPassword);\r
-  SafeFreePool (gPassowordInvalid);\r
-  SafeFreePool (gConfirmError);\r
-  SafeFreePool (gPressEnter);\r
-  SafeFreePool (gEmptyString);\r
-  SafeFreePool (gAreYouSure);\r
-  SafeFreePool (gYesResponse);\r
-  SafeFreePool (gNoResponse);\r
-  SafeFreePool (gMiniString);\r
-  SafeFreePool (gPlusString);\r
-  SafeFreePool (gMinusString);\r
-  SafeFreePool (gAdjustNumber);\r
+  FreePool (gFunctionOneString);\r
+  FreePool (gFunctionTwoString);\r
+  FreePool (gFunctionNineString);\r
+  FreePool (gFunctionTenString);\r
+  FreePool (gEnterString);\r
+  FreePool (gEnterCommitString);\r
+  FreePool (gEscapeString);\r
+  FreePool (gMoveHighlight);\r
+  FreePool (gMakeSelection);\r
+  FreePool (gDecNumericInput);\r
+  FreePool (gHexNumericInput);\r
+  FreePool (gToggleCheckBox);\r
+  FreePool (gPromptForData);\r
+  FreePool (gPromptForPassword);\r
+  FreePool (gPromptForNewPassword);\r
+  FreePool (gConfirmPassword);\r
+  FreePool (gPassowordInvalid);\r
+  FreePool (gConfirmError);\r
+  FreePool (gPressEnter);\r
+  FreePool (gEmptyString);\r
+  FreePool (gAreYouSure);\r
+  FreePool (gYesResponse);\r
+  FreePool (gNoResponse);\r
+  FreePool (gMiniString);\r
+  FreePool (gPlusString);\r
+  FreePool (gMinusString);\r
+  FreePool (gAdjustNumber);\r
+  FreePool (gSaveChanges);\r
   return ;\r
 }\r
 \r
@@ -857,6 +859,9 @@ SetupBrowser (
   EFI_HII_VALUE                   *HiiValue;\r
   FORM_BROWSER_STATEMENT          *Statement;\r
   EFI_HII_CONFIG_ACCESS_PROTOCOL  *ConfigAccess;\r
+  EFI_INPUT_KEY                   Key;\r
+  CHAR16                          YesResponse;\r
+  CHAR16                          NoResponse;\r
 \r
   gMenuRefreshHead = NULL;\r
   gResetRequired = FALSE;\r
@@ -990,6 +995,32 @@ SetupBrowser (
         // Force to reparse IFR binary of target Formset\r
         //\r
         Selection->Action = UI_ACTION_REFRESH_FORMSET;\r
+\r
+        //\r
+        // Uncommitted data will be lost after IFR binary re-pasing, so confirm on whether to save\r
+        //\r
+        if (gNvUpdateRequired) {\r
+          Status      = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);\r
+\r
+          YesResponse = gYesResponse[0];\r
+          NoResponse  = gNoResponse[0];\r
+\r
+          do {\r
+            CreateDialog (3, TRUE, 0, NULL, &Key, gEmptyString, gSaveChanges, gEmptyString);\r
+          } while\r
+          (\r
+            (Key.ScanCode != SCAN_ESC) &&\r
+            ((Key.UnicodeChar | UPPER_LOWER_CASE_OFFSET) != (NoResponse | UPPER_LOWER_CASE_OFFSET)) &&\r
+            ((Key.UnicodeChar | UPPER_LOWER_CASE_OFFSET) != (YesResponse | UPPER_LOWER_CASE_OFFSET))\r
+          );\r
+\r
+          if ((Key.UnicodeChar | UPPER_LOWER_CASE_OFFSET) == (YesResponse | UPPER_LOWER_CASE_OFFSET)) {\r
+            //\r
+            // If the user hits the YesResponse key\r
+            //\r
+            SubmitForm (Selection->FormSet, Selection->Form);\r
+          }\r
+        }\r
       }\r
     }\r
   } while (Selection->Action == UI_ACTION_REFRESH_FORM);\r