]> git.proxmox.com Git - mirror_edk2.git/commitdiff
MdeModulePkg: Enable reconnect request from action request or question flag.
authorEric Dong <eric.dong@intel.com>
Wed, 27 May 2015 02:32:59 +0000 (02:32 +0000)
committerydong10 <ydong10@Edk2>
Wed, 27 May 2015 02:32:59 +0000 (02:32 +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@17516 6f19259b-4bc3-4df7-8a09-765794883524

MdeModulePkg/Include/Protocol/DisplayProtocol.h
MdeModulePkg/Universal/DisplayEngineDxe/FormDisplay.c
MdeModulePkg/Universal/DisplayEngineDxe/FormDisplayStr.uni
MdeModulePkg/Universal/SetupBrowserDxe/Presentation.c
MdeModulePkg/Universal/SetupBrowserDxe/Setup.c
MdeModulePkg/Universal/SetupBrowserDxe/Setup.h

index d49c625cfd8df7664840b5680c189b71a811ec2e..8ea9350419582bca50c749617da94fb62ec2dbe1 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   FormDiplay protocol to show Form\r
 \r
-Copyright (c) 2013 - 2014, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2013 - 2015, Intel Corporation. All rights reserved.<BR>\r
 This program and the accompanying materials are licensed and made available under \r
 the terms and conditions of the BSD License that accompanies this distribution.  \r
 The full text of the license may be found at\r
@@ -39,6 +39,9 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #define BROWSER_INCONSISTENT_IF           BROWSER_ERROR | 0x06\r
 #define BROWSER_WARNING_IF                BROWSER_ERROR | 0x07\r
 #define BROWSER_SUBMIT_FAIL_NO_SUBMIT_IF  BROWSER_ERROR | 0x08\r
+#define BROWSER_RECONNECT_REQUIRED        BROWSER_ERROR | 0x09\r
+#define BROWSER_RECONNECT_FAIL            BROWSER_ERROR | 0x0A\r
+#define BROWSER_RECONNECT_SAVE_CHANGES    BROWSER_ERROR | 0x0B\r
 \r
 #define FORM_DISPLAY_ENGINE_STATEMENT_VERSION_1  0x10000\r
 #define FORM_DISPLAY_ENGINE_VERSION_1            0x10000\r
index df39e9f28da0285ec9c27aa3daa8c8ab8a6c3271..e198a5e9570f34c5f9974f1b454fcfdfac3f4a3b 100644 (file)
@@ -113,9 +113,13 @@ FORM_ENTRY_INFO               gOldFormEntry = {0};
 //\r
 // Browser Global Strings\r
 //\r
+CHAR16            *gReconnectConfirmChanges;\r
+CHAR16            *gReconnectFail;\r
+CHAR16            *gReconnectRequired;\r
+CHAR16            *gChangesOpt;\r
 CHAR16            *gFormNotFound;\r
 CHAR16            *gNoSubmitIf;\r
-CHAR16            *gBrwoserError;\r
+CHAR16            *gBrowserError;\r
 CHAR16            *gSaveFailed;\r
 CHAR16            *gNoSubmitIfFailed;\r
 CHAR16            *gSaveProcess;\r
@@ -203,9 +207,13 @@ InitializeDisplayStrings (
   VOID\r
   )\r
 {\r
+  gReconnectConfirmChanges = GetToken (STRING_TOKEN (RECONNECT_CONFIRM_CHANGES), gHiiHandle);\r
   mUnknownString        = GetToken (STRING_TOKEN (UNKNOWN_STRING), gHiiHandle);\r
   gSaveFailed           = GetToken (STRING_TOKEN (SAVE_FAILED), gHiiHandle);\r
   gNoSubmitIfFailed     = GetToken (STRING_TOKEN (NO_SUBMIT_IF_CHECK_FAILED), gHiiHandle);\r
+  gReconnectFail        = GetToken (STRING_TOKEN (RECONNECT_FAILED), gHiiHandle);\r
+  gReconnectRequired    = GetToken (STRING_TOKEN (RECONNECT_REQUIRED), gHiiHandle);\r
+  gChangesOpt           = GetToken (STRING_TOKEN (RECONNECT_CHANGES_OPTIONS), gHiiHandle);\r
   gSaveProcess          = GetToken (STRING_TOKEN (DISCARD_OR_JUMP), gHiiHandle);\r
   gSaveNoSubmitProcess  = GetToken (STRING_TOKEN (DISCARD_OR_CHECK), gHiiHandle);\r
   gDiscardChange        = GetToken (STRING_TOKEN (DISCARD_OR_JUMP_DISCARD), gHiiHandle);\r
@@ -225,7 +233,7 @@ InitializeDisplayStrings (
   gProtocolNotFound     = GetToken (STRING_TOKEN (PROTOCOL_NOT_FOUND), gHiiHandle);\r
   gFormNotFound         = GetToken (STRING_TOKEN (STATUS_BROWSER_FORM_NOT_FOUND), gHiiHandle);\r
   gNoSubmitIf           = GetToken (STRING_TOKEN (STATUS_BROWSER_NO_SUBMIT_IF), gHiiHandle);\r
-  gBrwoserError         = GetToken (STRING_TOKEN (STATUS_BROWSER_ERROR), gHiiHandle);\r
+  gBrowserError         = GetToken (STRING_TOKEN (STATUS_BROWSER_ERROR), gHiiHandle);\r
   gConfirmDefaultMsg    = GetToken (STRING_TOKEN (CONFIRM_DEFAULT_MESSAGE), gHiiHandle);\r
   gConfirmDiscardMsg    = GetToken (STRING_TOKEN (CONFIRM_DISCARD_MESSAGE), gHiiHandle);\r
   gConfirmSubmitMsg     = GetToken (STRING_TOKEN (CONFIRM_SUBMIT_MESSAGE), gHiiHandle);\r
@@ -256,6 +264,10 @@ FreeDisplayStrings (
   FreePool (gEmptyString);\r
   FreePool (gSaveFailed);\r
   FreePool (gNoSubmitIfFailed);\r
+  FreePool (gReconnectFail);\r
+  FreePool (gReconnectRequired);\r
+  FreePool (gChangesOpt);\r
+  FreePool (gReconnectConfirmChanges);\r
   FreePool (gSaveProcess);\r
   FreePool (gSaveNoSubmitProcess);\r
   FreePool (gDiscardChange);\r
@@ -272,7 +284,7 @@ FreeDisplayStrings (
   FreePool (gOptionMismatch);\r
   FreePool (gFormSuppress);\r
   FreePool (gProtocolNotFound);\r
-  FreePool (gBrwoserError);\r
+  FreePool (gBrowserError);\r
   FreePool (gNoSubmitIf);\r
   FreePool (gFormNotFound);\r
   FreePool (gConfirmDefaultMsg);\r
@@ -3776,8 +3788,20 @@ BrowserStatusProcess (
       ErrorInfo = gNoSubmitIfFailed;\r
       break;\r
 \r
+    case BROWSER_RECONNECT_FAIL:\r
+      ErrorInfo = gReconnectFail;\r
+      break;\r
+\r
+    case BROWSER_RECONNECT_SAVE_CHANGES:\r
+      ErrorInfo = gReconnectConfirmChanges;\r
+      break;\r
+\r
+    case BROWSER_RECONNECT_REQUIRED:\r
+      ErrorInfo = gReconnectRequired;\r
+      break;\r
+\r
     default:\r
-      ErrorInfo = gBrwoserError;\r
+      ErrorInfo = gBrowserError;\r
       break;\r
     }\r
   }\r
@@ -3785,15 +3809,21 @@ BrowserStatusProcess (
   switch (gFormData->BrowserStatus) {\r
   case BROWSER_SUBMIT_FAIL:\r
   case BROWSER_SUBMIT_FAIL_NO_SUBMIT_IF:\r
+  case BROWSER_RECONNECT_SAVE_CHANGES:\r
     ASSERT (gUserInput != NULL);\r
     if (gFormData->BrowserStatus == (BROWSER_SUBMIT_FAIL)) {\r
       PrintString = gSaveProcess;\r
       JumpToFormSet = gJumpToFormSet[0];\r
+      DiscardChange = gDiscardChange[0];\r
+    } else if (gFormData->BrowserStatus == (BROWSER_RECONNECT_SAVE_CHANGES)){\r
+      PrintString = gChangesOpt;\r
+      JumpToFormSet = gConfirmOptYes[0];\r
+      DiscardChange = gConfirmOptNo[0];\r
     } else {\r
       PrintString = gSaveNoSubmitProcess;\r
       JumpToFormSet = gCheckError[0];\r
+      DiscardChange = gDiscardChange[0];\r
     }\r
-    DiscardChange = gDiscardChange[0];\r
 \r
     do {\r
       CreateDialog (&Key, gEmptyString, ErrorInfo, PrintString, gEmptyString, NULL);\r
index cf6ed3f4f474759388be90fd370fb876457cd329..2a06c3d495b308b7b41767f408b72b62594a4c67 100644 (file)
Binary files a/MdeModulePkg/Universal/DisplayEngineDxe/FormDisplayStr.uni and b/MdeModulePkg/Universal/DisplayEngineDxe/FormDisplayStr.uni differ
index b8c5a3919ef1629a11d8127a3143fd1850efba5c..002a86a9b5ddc10d1be95329b22f3a3cf30ffcb8 100644 (file)
@@ -1884,6 +1884,30 @@ FindNextMenu (
   return TRUE;\r
 }\r
 \r
+/**\r
+  Reconnect the controller.\r
+\r
+  @param DriverHandle          The controller handle which need to be reconnect.\r
+\r
+  @retval   TRUE     do the reconnect behavior success.\r
+  @retval   FALSE    do the reconnect behavior failed.\r
+  \r
+**/\r
+BOOLEAN\r
+ReconnectController (\r
+  IN EFI_HANDLE   DriverHandle\r
+  )\r
+{\r
+  EFI_STATUS                      Status;\r
+\r
+  Status = gBS->DisconnectController(DriverHandle, NULL, NULL);\r
+  if (!EFI_ERROR (Status)) {\r
+    Status = gBS->ConnectController(DriverHandle, NULL, NULL, TRUE);\r
+  }\r
+\r
+  return Status == EFI_SUCCESS;\r
+}\r
+\r
 /**\r
   Call the call back function for the question and process the return action.\r
 \r
@@ -2055,6 +2079,10 @@ ProcessCallBackFunction (
           SettingLevel          = FormLevel;\r
           break;\r
 \r
+        case EFI_BROWSER_ACTION_REQUEST_RECONNECT:\r
+          gCallbackReconnect    = TRUE;\r
+          break;\r
+\r
         default:\r
           break;\r
         }\r
@@ -2155,6 +2183,28 @@ ProcessCallBackFunction (
     }\r
   }\r
 \r
+  if (gCallbackReconnect && (EFI_BROWSER_ACTION_CHANGED == Action)) {\r
+    //\r
+    // Confirm changes with user first.\r
+    //\r
+    if (IsNvUpdateRequiredForFormSet(FormSet)) {\r
+      if (BROWSER_ACTION_DISCARD == PopupErrorMessage(BROWSER_RECONNECT_SAVE_CHANGES, NULL, NULL, NULL)) {\r
+        gCallbackReconnect = FALSE;\r
+        DiscardFormIsRequired = TRUE;\r
+      } else {\r
+        SubmitFormIsRequired = TRUE;\r
+      }\r
+    } else {\r
+      PopupErrorMessage(BROWSER_RECONNECT_REQUIRED, NULL, NULL, NULL);\r
+    }\r
+\r
+    //\r
+    // Exit current formset before do the reconnect.\r
+    //\r
+    NeedExit = TRUE;\r
+    SettingLevel = FormSetLevel;\r
+  }\r
+\r
   if (SubmitFormIsRequired && !SkipSaveOrDiscard) {\r
     SubmitForm (FormSet, Form, SettingLevel);\r
   }\r
@@ -2476,13 +2526,18 @@ SetupBrowser (
       }\r
 \r
       //\r
-      // If question has EFI_IFR_FLAG_RESET_REQUIRED flag and without storage and process question success till here, \r
-      // trig the gResetFlag.\r
+      // If question has EFI_IFR_FLAG_RESET_REQUIRED/EFI_IFR_FLAG_RECONNECT_REQUIRED flag and without storage \r
+      // and process question success till here, trig the gResetFlag/gFlagReconnect.\r
       //\r
       if ((Status == EFI_SUCCESS) && \r
-          (Statement->Storage == NULL) && \r
-          ((Statement->QuestionFlags & EFI_IFR_FLAG_RESET_REQUIRED) != 0)) {\r
-        gResetRequired = TRUE;\r
+          (Statement->Storage == NULL)) { \r
+        if ((Statement->QuestionFlags & EFI_IFR_FLAG_RESET_REQUIRED) != 0) {\r
+          gResetRequired = TRUE;\r
+        }\r
+\r
+        if ((Statement->QuestionFlags & EFI_IFR_FLAG_RECONNECT_REQUIRED) != 0) {\r
+          gFlagReconnect = TRUE;\r
+        }\r
       }\r
     }\r
 \r
index ea9205a2528fb1ae922388620b8d428387ade494..4d286179e7874161a423ba7e4f9eab2af91e42e5 100644 (file)
@@ -55,6 +55,8 @@ LIST_ENTRY      gBrowserSaveFailFormSetList = INITIALIZE_LIST_HEAD_VARIABLE (gBr
 BOOLEAN               mSystemSubmit = FALSE;\r
 BOOLEAN               gResetRequired;\r
 BOOLEAN               gExitRequired;\r
+BOOLEAN               gFlagReconnect;\r
+BOOLEAN               gCallbackReconnect;\r
 BROWSER_SETTING_SCOPE gBrowserSettingScope = FormSetLevel;\r
 BOOLEAN               mBrowserScopeFirstSet = TRUE;\r
 EXIT_HANDLER          ExitHandlerFunction = NULL;\r
@@ -483,6 +485,7 @@ SendForm (
   UINTN                         Index;\r
   FORM_BROWSER_FORMSET          *FormSet;\r
   FORM_ENTRY_INFO               *MenuList;\r
+  BOOLEAN                       RetVal;\r
 \r
   //\r
   // If EDKII_FORM_DISPLAY_ENGINE_PROTOCOL not found, return EFI_UNSUPPORTED.\r
@@ -496,8 +499,10 @@ SendForm (
   //\r
   SaveBrowserContext ();\r
 \r
+  gFlagReconnect = FALSE;\r
   gResetRequired = FALSE;\r
   gExitRequired  = FALSE;\r
+  gCallbackReconnect = FALSE;\r
   Status         = EFI_SUCCESS;\r
   gEmptyString   = L"";\r
   gDisplayFormData.ScreenDimensions = (EFI_SCREEN_DESCRIPTOR *) ScreenDimensions;\r
@@ -547,6 +552,15 @@ SendForm (
       gCurrentSelection = NULL;\r
       mSystemLevelFormSet = NULL;\r
 \r
+      if (gFlagReconnect || gCallbackReconnect) {\r
+        RetVal = ReconnectController (FormSet->DriverHandle);\r
+        if (!RetVal) {\r
+          PopupErrorMessage(BROWSER_RECONNECT_FAIL, NULL, NULL, NULL);\r
+        }\r
+        gFlagReconnect = FALSE;\r
+        gCallbackReconnect = FALSE;\r
+      }\r
+\r
       //\r
       // If no data is changed, don't need to save current FormSet into the maintain list.\r
       //\r
@@ -2523,8 +2537,14 @@ UpdateFlagForForm (
     //\r
     // Only the changed data has been saved, then need to set the reset flag.\r
     //\r
-    if (SetFlag && OldValue && !Question->ValueChanged && ((Question->QuestionFlags & EFI_IFR_FLAG_RESET_REQUIRED) != 0)) {\r
-      gResetRequired = TRUE;\r
+    if (SetFlag && OldValue && !Question->ValueChanged) {\r
+      if ((Question->QuestionFlags & EFI_IFR_FLAG_RESET_REQUIRED) != 0) {\r
+        gResetRequired = TRUE;\r
+      }\r
+\r
+      if ((Question->QuestionFlags & EFI_IFR_FLAG_RECONNECT_REQUIRED) != 0) {\r
+        gFlagReconnect = TRUE;\r
+      }\r
     } \r
   }\r
 }\r
@@ -5524,6 +5544,8 @@ SaveBrowserContext (
   //\r
   Context->Selection            = gCurrentSelection;\r
   Context->ResetRequired        = gResetRequired;\r
+  Context->FlagReconnect        = gFlagReconnect;\r
+  Context->CallbackReconnect    = gCallbackReconnect;\r
   Context->ExitRequired         = gExitRequired;\r
   Context->HiiHandle            = mCurrentHiiHandle;\r
   Context->FormId               = mCurrentFormId;\r
@@ -5579,6 +5601,8 @@ RestoreBrowserContext (
   //\r
   gCurrentSelection     = Context->Selection;\r
   gResetRequired        = Context->ResetRequired;\r
+  gFlagReconnect        = Context->FlagReconnect;\r
+  gCallbackReconnect    = Context->CallbackReconnect;\r
   gExitRequired         = Context->ExitRequired;\r
   mCurrentHiiHandle     = Context->HiiHandle;\r
   mCurrentFormId        = Context->FormId;\r
index 8fabf6f3c6b560c17854fd76907ecb5ffb30edd6..c8aa9dde44646e013d6f2d0a8c80f095daf190f5 100644 (file)
@@ -528,6 +528,8 @@ typedef struct {
   //\r
   // Globals defined in Setup.c\r
   //\r
+  BOOLEAN                  FlagReconnect;\r
+  BOOLEAN                  CallbackReconnect;\r
   BOOLEAN                  ResetRequired;\r
   BOOLEAN                  ExitRequired;\r
   EFI_HII_HANDLE           HiiHandle;\r
@@ -566,6 +568,8 @@ extern EFI_HII_CONFIG_ROUTING_PROTOCOL   *mHiiConfigRouting;
 extern EFI_DEVICE_PATH_FROM_TEXT_PROTOCOL *mPathFromText;\r
 extern EDKII_FORM_DISPLAY_ENGINE_PROTOCOL *mFormDisplay;\r
 \r
+extern BOOLEAN               gCallbackReconnect;\r
+extern BOOLEAN               gFlagReconnect;\r
 extern BOOLEAN               gResetRequired;\r
 extern BOOLEAN               gExitRequired;\r
 extern LIST_ENTRY            gBrowserFormSetList;\r
@@ -1831,4 +1835,18 @@ GetFstStgFromBrsStg (
   IN BROWSER_STORAGE       *Storage\r
   );\r
 \r
+/**\r
+  Reconnect the controller.\r
+\r
+  @param DriverHandle          The controller handle which need to be reconnect.\r
+\r
+  @retval   TRUE     do the reconnect behavior success.\r
+  @retval   FALSE    do the reconnect behavior failed.\r
+  \r
+**/\r
+BOOLEAN\r
+ReconnectController (\r
+  IN EFI_HANDLE   DriverHandle\r
+  );\r
+\r
 #endif\r