]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Refine the save action for the BdsDxe.
authorEric Dong <eric.dong@intel.com>
Fri, 4 Jul 2014 01:58:48 +0000 (01:58 +0000)
committerydong10 <ydong10@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 4 Jul 2014 01:58:48 +0000 (01:58 +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@15616 6f19259b-4bc3-4df7-8a09-765794883524

IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/BootMaint.c
IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/FE.vfr
IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/FileExplorer.c
IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/FormGuid.h
IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/UpdatePage.c
IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/Variable.c

index 205537f494a556534f8611faa44b89b59ba58a99..9f3f6d3247c6f9abeddcd48eb6ad61f87f27a835 100644 (file)
@@ -428,6 +428,22 @@ BootMaintRouteConfig (
     Var_UpdateBBSOption (Private, FORM_SET_BEV_ORDER_ID);\r
   }\r
 \r
+  //\r
+  // Change for "delete boot option" page need update NewBmmData->BootOptionOrder, so process \r
+  // NewBmmData->BootOptionOrder before NewBmmData->BootOptionDel\r
+  //\r
+  if (CompareMem (NewBmmData->BootOptionOrder, OldBmmData->BootOptionOrder, sizeof (NewBmmData->BootOptionOrder)) != 0) {  \r
+    Status = Var_UpdateBootOrder (Private);\r
+  }\r
+\r
+  //\r
+  // Change for "delete driver option" page need update NewBmmData->DriverOptionOrder, so process \r
+  // NewBmmData->DriverOptionOrder before NewBmmData->DriverOptionDel\r
+  //\r
+  if (CompareMem (NewBmmData->DriverOptionOrder, OldBmmData->DriverOptionOrder, sizeof (NewBmmData->DriverOptionOrder)) != 0) {  \r
+    Status = Var_UpdateDriverOrder (Private);\r
+  }\r
+\r
   //\r
   // Check data which located in Boot Options Menu and save the settings if need\r
   //\r
@@ -438,6 +454,8 @@ BootMaintRouteConfig (
       NewMenuEntry            = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
       NewLoadContext          = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
       NewLoadContext->Deleted = NewBmmData->BootOptionDel[Index];\r
+      NewBmmData->BootOptionDel[Index] = FALSE;\r
+      NewBmmData->BootOptionDelMark[Index] = FALSE;\r
     }\r
 \r
     Var_DelBootOption ();\r
@@ -453,18 +471,12 @@ BootMaintRouteConfig (
       NewMenuEntry            = BOpt_GetMenuEntry (&DriverOptionMenu, Index);\r
       NewLoadContext          = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
       NewLoadContext->Deleted = NewBmmData->DriverOptionDel[Index];\r
+      NewBmmData->DriverOptionDel[Index] = FALSE;\r
+      NewBmmData->DriverOptionDelMark[Index] = FALSE;\r
     }\r
     Var_DelDriverOption ();\r
   }\r
 \r
-  if (CompareMem (NewBmmData->BootOptionOrder, OldBmmData->BootOptionOrder, sizeof (NewBmmData->BootOptionOrder)) != 0) {  \r
-    Status = Var_UpdateBootOrder (Private);\r
-  }\r
-\r
-  if (CompareMem (NewBmmData->DriverOptionOrder, OldBmmData->DriverOptionOrder, sizeof (NewBmmData->DriverOptionOrder)) != 0) {  \r
-    Status = Var_UpdateDriverOrder (Private);\r
-  }\r
-\r
   if (CompareMem (&NewBmmData->BootTimeOut, &OldBmmData->BootTimeOut, sizeof (NewBmmData->BootTimeOut)) != 0) {\r
     Status = gRT->SetVariable (\r
                     L"Timeout",\r
@@ -837,13 +849,28 @@ BootMaintCallback (
     if ((Value == NULL) || (ActionRequest == NULL)) {\r
       return EFI_INVALID_PARAMETER;\r
     }\r
-    \r
-    //\r
-    // need to be subtituded.\r
-    //\r
-    // Update Select FD/HD/CD/NET/BEV Order Form\r
-    //\r
-    if ((QuestionId >= LEGACY_FD_QUESTION_ID) && (QuestionId < LEGACY_BEV_QUESTION_ID + MAX_MENU_NUMBER)) {\r
+    if ((QuestionId >= BOOT_OPTION_DEL_QUESTION_ID) && (QuestionId < BOOT_OPTION_DEL_QUESTION_ID + MAX_MENU_NUMBER)) {\r
+      if (Value->b){\r
+        //\r
+        // Means user try to delete this boot option but not press F10 or "Commit Changes and Exit" menu.\r
+        //\r
+        CurrentFakeNVMap->BootOptionDelMark[QuestionId - BOOT_OPTION_DEL_QUESTION_ID] = TRUE;\r
+      } else {\r
+        //\r
+        // Means user remove the old check status.\r
+        //\r
+        CurrentFakeNVMap->BootOptionDelMark[QuestionId - BOOT_OPTION_DEL_QUESTION_ID] = FALSE;\r
+      }\r
+    } else if ((QuestionId >= DRIVER_OPTION_DEL_QUESTION_ID) && (QuestionId < DRIVER_OPTION_DEL_QUESTION_ID + MAX_MENU_NUMBER)) {\r
+      if (Value->b){\r
+        CurrentFakeNVMap->DriverOptionDelMark[QuestionId - DRIVER_OPTION_DEL_QUESTION_ID] = TRUE;\r
+      } else {\r
+        CurrentFakeNVMap->DriverOptionDelMark[QuestionId - DRIVER_OPTION_DEL_QUESTION_ID] = FALSE;\r
+      }\r
+    } else if ((QuestionId >= LEGACY_FD_QUESTION_ID) && (QuestionId < LEGACY_BEV_QUESTION_ID + MAX_MENU_NUMBER)) {\r
+      //\r
+      // Update Select FD/HD/CD/NET/BEV Order Form\r
+      //\r
 \r
       DisMap  = Private->BmmOldFakeNVData.DisableMap;\r
 \r
@@ -991,21 +1018,15 @@ BootMaintCallback (
     } else {\r
       switch (QuestionId) {\r
       case KEY_VALUE_SAVE_AND_EXIT:\r
-      case KEY_VALUE_NO_SAVE_AND_EXIT:\r
-        if (QuestionId == KEY_VALUE_SAVE_AND_EXIT) {\r
-          Status = ApplyChangeHandler (Private, CurrentFakeNVMap, Private->BmmPreviousPageId);\r
-          if (EFI_ERROR (Status)) {\r
-            return Status;\r
-          }\r
-        } else if (QuestionId == KEY_VALUE_NO_SAVE_AND_EXIT) {\r
-          DiscardChangeHandler (Private, CurrentFakeNVMap);\r
-        }\r
+        *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_SUBMIT_EXIT;\r
+        break;\r
 \r
+      case KEY_VALUE_NO_SAVE_AND_EXIT:\r
         //\r
-        // Tell browser not to ask for confirmation of changes,\r
-        // since we have already applied or discarded.\r
+        // Restore local maintain data.\r
         //\r
-        *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_SUBMIT_EXIT;\r
+        DiscardChangeHandler (Private, CurrentFakeNVMap);\r
+        *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_DISCARD_EXIT;\r
         break;  \r
 \r
       case FORM_RESET:\r
@@ -1025,205 +1046,6 @@ BootMaintCallback (
   return EFI_SUCCESS;\r
 }\r
 \r
-/**\r
-  Function handling request to apply changes for BMM pages.\r
-\r
-  @param Private            Pointer to callback data buffer.\r
-  @param CurrentFakeNVMap   Pointer to buffer holding data of various values used by BMM\r
-  @param FormId             ID of the form which has sent the request to apply change.\r
-\r
-  @retval  EFI_SUCCESS       Change successfully applied.\r
-  @retval  Other             Error occurs while trying to apply changes.\r
-\r
-**/\r
-EFI_STATUS\r
-ApplyChangeHandler (\r
-  IN  BMM_CALLBACK_DATA               *Private,\r
-  IN  BMM_FAKE_NV_DATA                *CurrentFakeNVMap,\r
-  IN  EFI_FORM_ID                     FormId\r
-  )\r
-{\r
-  BM_CONSOLE_CONTEXT  *NewConsoleContext;\r
-  BM_TERMINAL_CONTEXT *NewTerminalContext;\r
-  BM_LOAD_CONTEXT     *NewLoadContext;\r
-  BM_MENU_ENTRY       *NewMenuEntry;\r
-  EFI_STATUS          Status;\r
-  UINT16              Index;\r
-\r
-  Status = EFI_SUCCESS;\r
-\r
-  switch (FormId) {\r
-  case FORM_SET_FD_ORDER_ID:\r
-  case FORM_SET_HD_ORDER_ID:\r
-  case FORM_SET_CD_ORDER_ID:\r
-  case FORM_SET_NET_ORDER_ID:\r
-  case FORM_SET_BEV_ORDER_ID:\r
-    Var_UpdateBBSOption (Private, FormId);\r
-    break;\r
-\r
-  case FORM_BOOT_DEL_ID:\r
-    for (Index = 0; \r
-         ((Index < BootOptionMenu.MenuNumber) && (Index < (sizeof (CurrentFakeNVMap->BootOptionDel) / sizeof (CurrentFakeNVMap->BootOptionDel[0])))); \r
-         Index ++) {\r
-      NewMenuEntry            = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
-      NewLoadContext          = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
-      NewLoadContext->Deleted = CurrentFakeNVMap->BootOptionDel[Index];\r
-    }\r
-\r
-    Var_DelBootOption ();\r
-    break;\r
-\r
-  case FORM_DRV_DEL_ID:\r
-    for (Index = 0; \r
-         ((Index < DriverOptionMenu.MenuNumber) && (Index < (sizeof (CurrentFakeNVMap->DriverOptionDel) / sizeof (CurrentFakeNVMap->DriverOptionDel[0])))); \r
-         Index++) {\r
-      NewMenuEntry            = BOpt_GetMenuEntry (&DriverOptionMenu, Index);\r
-      NewLoadContext          = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
-      NewLoadContext->Deleted = CurrentFakeNVMap->DriverOptionDel[Index];\r
-    }\r
-\r
-    Var_DelDriverOption ();\r
-    break;\r
-\r
-  case FORM_BOOT_CHG_ID:\r
-    Status = Var_UpdateBootOrder (Private);\r
-    break;\r
-\r
-  case FORM_DRV_CHG_ID:\r
-    Status = Var_UpdateDriverOrder (Private);\r
-    break;\r
-\r
-  case FORM_TIME_OUT_ID:\r
-    BdsDxeSetVariableAndReportStatusCodeOnError (\r
-      L"Timeout",\r
-      &gEfiGlobalVariableGuid,\r
-      EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,\r
-      sizeof (UINT16),\r
-      &(CurrentFakeNVMap->BootTimeOut)\r
-      );\r
-\r
-    Private->BmmOldFakeNVData.BootTimeOut = CurrentFakeNVMap->BootTimeOut;\r
-    break;\r
-\r
-  case FORM_BOOT_NEXT_ID:\r
-    Status = Var_UpdateBootNext (Private);\r
-    break;\r
-\r
-  case FORM_CON_MODE_ID:\r
-    Status = Var_UpdateConMode (Private);\r
-    break;\r
-\r
-  case FORM_CON_COM_SETUP_ID:\r
-    Index         = (UINT16)Private->CurrentTerminal;\r
-    NewMenuEntry                      = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
-\r
-    ASSERT (NewMenuEntry != NULL);\r
-\r
-    NewTerminalContext                = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
-\r
-    NewTerminalContext->BaudRateIndex = CurrentFakeNVMap->COMBaudRate[Index];\r
-    ASSERT (CurrentFakeNVMap->COMBaudRate[Index] < (sizeof (BaudRateList) / sizeof (BaudRateList[0])));\r
-    NewTerminalContext->BaudRate      = BaudRateList[CurrentFakeNVMap->COMBaudRate[Index]].Value;\r
-    NewTerminalContext->DataBitsIndex = CurrentFakeNVMap->COMDataRate[Index];\r
-    ASSERT (CurrentFakeNVMap->COMDataRate[Index] < (sizeof (DataBitsList) / sizeof (DataBitsList[0])));\r
-    NewTerminalContext->DataBits      = (UINT8) DataBitsList[CurrentFakeNVMap->COMDataRate[Index]].Value;\r
-    NewTerminalContext->StopBitsIndex = CurrentFakeNVMap->COMStopBits[Index];\r
-    ASSERT (CurrentFakeNVMap->COMStopBits[Index] < (sizeof (StopBitsList) / sizeof (StopBitsList[0])));\r
-    NewTerminalContext->StopBits      = (UINT8) StopBitsList[CurrentFakeNVMap->COMStopBits[Index]].Value;\r
-    NewTerminalContext->ParityIndex   = CurrentFakeNVMap->COMParity[Index];\r
-    ASSERT (CurrentFakeNVMap->COMParity[Index] < (sizeof (ParityList) / sizeof (ParityList[0])));\r
-    NewTerminalContext->Parity        = (UINT8) ParityList[CurrentFakeNVMap->COMParity[Index]].Value;\r
-    NewTerminalContext->TerminalType  = CurrentFakeNVMap->COMTerminalType[Index];\r
-    NewTerminalContext->FlowControl   = CurrentFakeNVMap->COMFlowControl[Index];\r
-\r
-    ChangeTerminalDevicePath (\r
-      &(NewTerminalContext->DevicePath),\r
-      FALSE\r
-      );\r
-\r
-    Var_UpdateConsoleInpOption ();\r
-    Var_UpdateConsoleOutOption ();\r
-    Var_UpdateErrorOutOption ();\r
-    break;\r
-\r
-  case FORM_CON_IN_ID:\r
-    for (Index = 0; Index < ConsoleInpMenu.MenuNumber; Index++) {\r
-      NewMenuEntry                = BOpt_GetMenuEntry (&ConsoleInpMenu, Index);\r
-      NewConsoleContext           = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;\r
-      ASSERT (Index < MAX_MENU_NUMBER);\r
-      NewConsoleContext->IsActive = CurrentFakeNVMap->ConsoleInCheck[Index];\r
-    }\r
-\r
-    for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
-      NewMenuEntry                = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
-      NewTerminalContext          = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
-      ASSERT (Index + ConsoleInpMenu.MenuNumber < MAX_MENU_NUMBER);\r
-      NewTerminalContext->IsConIn = CurrentFakeNVMap->ConsoleInCheck[Index + ConsoleInpMenu.MenuNumber];\r
-    }\r
-\r
-    Var_UpdateConsoleInpOption ();\r
-    break;\r
-\r
-  case FORM_CON_OUT_ID:\r
-    for (Index = 0; Index < ConsoleOutMenu.MenuNumber; Index++) {\r
-      NewMenuEntry                = BOpt_GetMenuEntry (&ConsoleOutMenu, Index);\r
-      NewConsoleContext           = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;\r
-      ASSERT (Index < MAX_MENU_NUMBER);\r
-      NewConsoleContext->IsActive = CurrentFakeNVMap->ConsoleOutCheck[Index];\r
-    }\r
-\r
-    for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
-      NewMenuEntry                  = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
-      NewTerminalContext            = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
-      ASSERT (Index + ConsoleOutMenu.MenuNumber < MAX_MENU_NUMBER);\r
-      NewTerminalContext->IsConOut  = CurrentFakeNVMap->ConsoleOutCheck[Index + ConsoleOutMenu.MenuNumber];\r
-    }\r
-\r
-    Var_UpdateConsoleOutOption ();\r
-    break;\r
-\r
-  case FORM_CON_ERR_ID:\r
-    for (Index = 0; Index < ConsoleErrMenu.MenuNumber; Index++) {\r
-      NewMenuEntry                = BOpt_GetMenuEntry (&ConsoleErrMenu, Index);\r
-      NewConsoleContext           = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;\r
-      ASSERT (Index < MAX_MENU_NUMBER);\r
-      NewConsoleContext->IsActive = CurrentFakeNVMap->ConsoleErrCheck[Index];\r
-    }\r
-\r
-    for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
-      NewMenuEntry                  = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
-      NewTerminalContext            = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
-      ASSERT (Index + ConsoleErrMenu.MenuNumber < MAX_MENU_NUMBER);\r
-      NewTerminalContext->IsStdErr  = CurrentFakeNVMap->ConsoleErrCheck[Index + ConsoleErrMenu.MenuNumber];\r
-    }\r
-\r
-    Var_UpdateErrorOutOption ();\r
-    break;\r
-\r
-  case FORM_DRV_ADD_HANDLE_DESC_ID:\r
-    Status = Var_UpdateDriverOption (\r
-               Private,\r
-               Private->BmmHiiHandle,\r
-               CurrentFakeNVMap->DriverAddHandleDesc,\r
-               CurrentFakeNVMap->DriverAddHandleOptionalData,\r
-               CurrentFakeNVMap->DriverAddForceReconnect\r
-               );\r
-    if (EFI_ERROR (Status)) {\r
-      goto Error;\r
-    }\r
-\r
-    BOpt_GetDriverOptions (Private);\r
-    CreateMenuStringToken (Private, Private->BmmHiiHandle, &DriverOptionMenu);\r
-    break;\r
-\r
-  default:\r
-    break;\r
-  }\r
-\r
-Error:\r
-  return Status;\r
-}\r
-\r
 /**\r
   Discard all changes done to the BMM pages such as Boot Order change,\r
   Driver order change.\r
@@ -1253,6 +1075,7 @@ DiscardChangeHandler (
     ASSERT (BootOptionMenu.MenuNumber <= (sizeof (CurrentFakeNVMap->BootOptionDel) / sizeof (CurrentFakeNVMap->BootOptionDel[0])));\r
     for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
       CurrentFakeNVMap->BootOptionDel[Index] = FALSE;\r
+      CurrentFakeNVMap->BootOptionDelMark[Index] = FALSE;\r
     }\r
     break;\r
 \r
@@ -1260,6 +1083,7 @@ DiscardChangeHandler (
     ASSERT (DriverOptionMenu.MenuNumber <= (sizeof (CurrentFakeNVMap->DriverOptionDel) / sizeof (CurrentFakeNVMap->DriverOptionDel[0])));\r
     for (Index = 0; Index < DriverOptionMenu.MenuNumber; Index++) {\r
       CurrentFakeNVMap->DriverOptionDel[Index] = FALSE;\r
+      CurrentFakeNVMap->DriverOptionDelMark[Index] = FALSE;\r
     }\r
     break;\r
 \r
index ee181babca96b22cbd52141e8bd6d94884e935fd..c4ccc578a76b6a3c8eedf7ea90902f6b61c4adb1 100644 (file)
@@ -44,17 +44,21 @@ formset
        subtitle text = STRING_TOKEN(STR_NULL_STRING);\r
 \r
        string    varid    = FeData.BootDescriptionData,\r
+                 questionid = KEY_VALUE_BOOT_DESCRIPTION,\r
                  prompt   = STRING_TOKEN(STR_LOAD_OPTION_DESC),\r
                  help     = STRING_TOKEN(STR_NULL_STRING),\r
+                 flags    = INTERACTIVE,\r
                  minsize  = 6,\r
                  maxsize  = 75,\r
        endstring;\r
 \r
        string    varid    = FeData.BootOptionalData,\r
-                       prompt   = STRING_TOKEN(STR_OPTIONAL_DATA),\r
-                       help     = STRING_TOKEN(STR_NULL_STRING),\r
-                       minsize  = 0,\r
-                       maxsize  = 120,\r
+                 questionid = KEY_VALUE_BOOT_OPTION,\r
+                 prompt   = STRING_TOKEN(STR_OPTIONAL_DATA),\r
+                 help     = STRING_TOKEN(STR_NULL_STRING),\r
+                 flags    = INTERACTIVE,\r
+                 minsize  = 0,\r
+                 maxsize  = 120,\r
        endstring;\r
 \r
        subtitle text = STRING_TOKEN(STR_NULL_STRING);\r
@@ -84,15 +88,19 @@ formset
        subtitle text = STRING_TOKEN(STR_NULL_STRING);\r
 \r
        string    varid    = FeData.DriverDescriptionData,\r
+                 questionid = KEY_VALUE_DRIVER_DESCRIPTION,\r
                  prompt   = STRING_TOKEN(STR_LOAD_OPTION_DESC),\r
                  help     = STRING_TOKEN(STR_NULL_STRING),\r
+                 flags    = INTERACTIVE,\r
                  minsize  = 6,\r
                  maxsize  = 75,\r
        endstring;\r
 \r
        string    varid    = FeData.DriverOptionalData,\r
+                 questionid = KEY_VALUE_DRIVER_OPTION,\r
                  prompt   = STRING_TOKEN(STR_OPTIONAL_DATA),\r
                  help     = STRING_TOKEN(STR_NULL_STRING),\r
+                 flags    = INTERACTIVE,\r
                  minsize  = 0,\r
                  maxsize  = 120,\r
        endstring;\r
index 69bcb94535ad401ccd1f39fdf269308ce316c3db..f804984fa918477e5805e569ced1019b9e56992f 100644 (file)
@@ -177,8 +177,16 @@ UpdateFileExplorer (
       case FileExplorerStateAddDriverOptionState:\r
         if (FileExplorerStateAddBootOption == CallbackData->FeCurrentState) {\r
           FormId = FORM_BOOT_ADD_DESCRIPTION_ID;\r
+          if (!CallbackData->FeFakeNvData.BootOptionChanged) {\r
+            ZeroMem (CallbackData->FeFakeNvData.BootOptionalData, sizeof (CallbackData->FeFakeNvData.BootOptionalData));\r
+            ZeroMem (CallbackData->FeFakeNvData.BootDescriptionData, sizeof (CallbackData->FeFakeNvData.BootDescriptionData));\r
+          }\r
         } else {\r
           FormId = FORM_DRIVER_ADD_FILE_DESCRIPTION_ID;\r
+          if (!CallbackData->FeFakeNvData.DriverOptionChanged) {\r
+            ZeroMem (CallbackData->FeFakeNvData.DriverOptionalData, sizeof (CallbackData->FeFakeNvData.DriverOptionalData));\r
+            ZeroMem (CallbackData->FeFakeNvData.DriverDescriptionData, sizeof (CallbackData->FeFakeNvData.DriverDescriptionData));\r
+          }\r
         }\r
 \r
         CallbackData->MenuEntry = NewMenuEntry;\r
@@ -400,41 +408,19 @@ FileExplorerCallback (
       return EFI_INVALID_PARAMETER;\r
     }\r
     \r
-    if (QuestionId == KEY_VALUE_SAVE_AND_EXIT_BOOT || QuestionId == KEY_VALUE_SAVE_AND_EXIT_DRIVER) {\r
-      //\r
-      // Apply changes and exit formset\r
-      //\r
-      if (FileExplorerStateAddBootOption == Private->FeCurrentState) {\r
-        Status = Var_UpdateBootOption (Private, NvRamMap);\r
-        if (EFI_ERROR (Status)) {\r
-          return Status;\r
-        }\r
-\r
-        BOpt_GetBootOptions (Private);\r
-        CreateMenuStringToken (Private, Private->FeHiiHandle, &BootOptionMenu);\r
-      } else if (FileExplorerStateAddDriverOptionState == Private->FeCurrentState) {\r
-        Status = Var_UpdateDriverOption (\r
-                  Private,\r
-                  Private->FeHiiHandle,\r
-                  NvRamMap->DriverDescriptionData,\r
-                  NvRamMap->DriverOptionalData,\r
-                  NvRamMap->ForceReconnect\r
-                  );\r
-        if (EFI_ERROR (Status)) {\r
-          return Status;\r
-        }\r
-\r
-        BOpt_GetDriverOptions (Private);\r
-        CreateMenuStringToken (Private, Private->FeHiiHandle, &DriverOptionMenu);\r
-      }\r
-\r
-      *ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;\r
+    if (QuestionId == KEY_VALUE_SAVE_AND_EXIT_BOOT) {\r
+      NvRamMap->BootOptionChanged = FALSE;\r
+      *ActionRequest = EFI_BROWSER_ACTION_REQUEST_SUBMIT;\r
+    } else if (QuestionId == KEY_VALUE_SAVE_AND_EXIT_DRIVER) {\r
+      NvRamMap->DriverOptionChanged = FALSE;\r
+      *ActionRequest = EFI_BROWSER_ACTION_REQUEST_SUBMIT;\r
     } else if (QuestionId == KEY_VALUE_NO_SAVE_AND_EXIT_DRIVER) {\r
       //\r
       // Discard changes and exit formset\r
       //\r
       NvRamMap->DriverOptionalData[0]     = 0x0000;\r
       NvRamMap->DriverDescriptionData[0]  = 0x0000;\r
+      NvRamMap->DriverOptionChanged = FALSE;\r
       *ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;\r
     } else if (QuestionId == KEY_VALUE_NO_SAVE_AND_EXIT_BOOT) {\r
       //\r
@@ -442,8 +428,13 @@ FileExplorerCallback (
       //\r
       NvRamMap->BootOptionalData[0]     = 0x0000;\r
       NvRamMap->BootDescriptionData[0]  = 0x0000;\r
+      NvRamMap->BootOptionChanged = FALSE;\r
       *ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;\r
-    }else if (QuestionId < FILE_OPTION_OFFSET) {\r
+    } else if (QuestionId == KEY_VALUE_BOOT_DESCRIPTION || QuestionId == KEY_VALUE_BOOT_OPTION) {\r
+      NvRamMap->BootOptionChanged = TRUE;\r
+    } else if (QuestionId == KEY_VALUE_DRIVER_DESCRIPTION || QuestionId == KEY_VALUE_DRIVER_OPTION) {\r
+      NvRamMap->DriverOptionChanged = TRUE;\r
+    } else if (QuestionId < FILE_OPTION_OFFSET) {\r
       //\r
       // Exit File Explorer formset\r
       //\r
@@ -469,5 +460,10 @@ FileExplorerCallback (
     }\r
   }\r
 \r
+  //\r
+  // Pass changed uncommitted data back to Form Browser\r
+  //\r
+  HiiSetBrowserData (&gFileExploreFormSetGuid, mFileExplorerStorageName, sizeof (FILE_EXPLORER_NV_DATA), (UINT8 *) NvRamMap, NULL);\r
+\r
   return Status;\r
 }\r
index 6f65307d061089710cc1f2657442a0d2b8529735..f2e1866845b8741bfcc2f6f1e6b03b992210033a 100644 (file)
@@ -66,6 +66,10 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #define KEY_VALUE_SAVE_AND_EXIT              0x110B\r
 #define KEY_VALUE_NO_SAVE_AND_EXIT           0x110C\r
 #define KEY_VALUE_BOOT_FROM_FILE             0x110D\r
+#define KEY_VALUE_BOOT_DESCRIPTION           0x110E\r
+#define KEY_VALUE_BOOT_OPTION                0x110F\r
+#define KEY_VALUE_DRIVER_DESCRIPTION         0x1110\r
+#define KEY_VALUE_DRIVER_OPTION              0x1111\r
 \r
 #define MAXIMUM_NORMAL_KEY_VALUE             0x11FF\r
 \r
@@ -162,11 +166,13 @@ typedef struct {
   // Boot Option Delete storage\r
   //\r
   BOOLEAN BootOptionDel[MAX_MENU_NUMBER];\r
+  BOOLEAN BootOptionDelMark[MAX_MENU_NUMBER];\r
 \r
   //\r
   // Driver Option Delete storage\r
   //\r
   BOOLEAN DriverOptionDel[MAX_MENU_NUMBER];\r
+  BOOLEAN DriverOptionDelMark[MAX_MENU_NUMBER];\r
 \r
   //\r
   // This is the Terminal Attributes value storage\r
@@ -221,6 +227,8 @@ typedef struct {
   UINT16  BootOptionalData[127];\r
   UINT16  DriverDescriptionData[75];\r
   UINT16  DriverOptionalData[127];\r
+  BOOLEAN BootOptionChanged;\r
+  BOOLEAN DriverOptionChanged;\r
   UINT8   Active;\r
   UINT8   ForceReconnect;\r
 } FILE_EXPLORER_NV_DATA;\r
index 91a38ec702a1e56e0c366db0e4a08d68a924a92e..febfc054ee89c66df606e5f386927d9bcdf7b1cd 100644 (file)
@@ -263,7 +263,16 @@ UpdateBootDelPage (
     }\r
 \r
     NewLoadContext->Deleted = FALSE;\r
-    //CallbackData->BmmFakeNvData.BootOptionDel[Index] = FALSE;\r
+\r
+    if (CallbackData->BmmFakeNvData.BootOptionDel[Index] && !CallbackData->BmmFakeNvData.BootOptionDelMark[Index]) {\r
+      //\r
+      // CallbackData->BmmFakeNvData.BootOptionDel[Index] == TRUE means browser knows this boot option is selected\r
+      // CallbackData->BmmFakeNvData.BootOptionDelMark[Index] = FALSE means BDS knows the selected boot option has\r
+      // deleted, browser maintains old useless info. So clear this info here, and later update this info to browser\r
+      // through HiiSetBrowserData function.\r
+      //\r
+      CallbackData->BmmFakeNvData.BootOptionDel[Index] = FALSE;\r
+    }\r
 \r
     HiiCreateCheckBoxOpCode (\r
       mStartOpCodeHandle,\r
@@ -272,7 +281,7 @@ UpdateBootDelPage (
       (UINT16) (BOOT_OPTION_DEL_VAR_OFFSET + Index),\r
       NewMenuEntry->DisplayStringToken,\r
       NewMenuEntry->HelpStringToken,\r
-      0,\r
+      EFI_IFR_FLAG_CALLBACK,\r
       0,\r
       NULL\r
       );\r
@@ -343,7 +352,16 @@ UpdateDrvDelPage (
 \r
     NewLoadContext          = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
     NewLoadContext->Deleted = FALSE;\r
-    //CallbackData->BmmFakeNvData.DriverOptionDel[Index] = FALSE;\r
+\r
+    if (CallbackData->BmmFakeNvData.DriverOptionDel[Index] && !CallbackData->BmmFakeNvData.DriverOptionDelMark[Index]) {\r
+      //\r
+      // CallbackData->BmmFakeNvData.BootOptionDel[Index] == TRUE means browser knows this boot option is selected\r
+      // CallbackData->BmmFakeNvData.BootOptionDelMark[Index] = FALSE means BDS knows the selected boot option has\r
+      // deleted, browser maintains old useless info. So clear this info here, and later update this info to browser\r
+      // through HiiSetBrowserData function.\r
+      //\r
+      CallbackData->BmmFakeNvData.DriverOptionDel[Index] = FALSE;\r
+    }\r
 \r
     HiiCreateCheckBoxOpCode (\r
       mStartOpCodeHandle,\r
@@ -352,7 +370,7 @@ UpdateDrvDelPage (
       (UINT16) (DRIVER_OPTION_DEL_VAR_OFFSET + Index),\r
       NewMenuEntry->DisplayStringToken,\r
       NewMenuEntry->HelpStringToken,\r
-      0,\r
+      EFI_IFR_FLAG_CALLBACK,\r
       0,\r
       NULL\r
       );\r
@@ -1349,6 +1367,14 @@ UpdatePageId (
   UINT16                         NewPageId\r
   )\r
 {\r
+  //\r
+  // For the question don't impact the page update, just ignore it.\r
+  //\r
+  if (((NewPageId >= BOOT_OPTION_DEL_QUESTION_ID) && (NewPageId < BOOT_OPTION_DEL_QUESTION_ID + MAX_MENU_NUMBER)) ||\r
+      ((NewPageId >= DRIVER_OPTION_DEL_QUESTION_ID) && (NewPageId < DRIVER_OPTION_DEL_QUESTION_ID + MAX_MENU_NUMBER))) {\r
+    return;\r
+  }\r
+\r
   if ((NewPageId < FILE_OPTION_OFFSET) && (NewPageId >= HANDLE_OPTION_OFFSET)) {\r
     //\r
     // If we select a handle to add driver option, advance to the add handle description page.\r
index 63eeb54ccf886bacc2ebf4e0e709ee44ea178634..0e9dbda66707fe9ca02e97f6a2c765d6ba7ae5a3 100644 (file)
@@ -708,6 +708,16 @@ Var_UpdateDriverOption (
       InsertTailList (&DriverOptionMenu.Head, &NewMenuEntry->Link);\r
       DriverOptionMenu.MenuNumber++;\r
 \r
+      //\r
+      // Update "change boot order" page used data, append the new add boot\r
+      // option at the end.\r
+      //\r
+      Index = 0;\r
+      while (CallbackData->BmmFakeNvData.DriverOptionOrder[Index] != 0) {\r
+        Index++;\r
+      }\r
+      CallbackData->BmmFakeNvData.DriverOptionOrder[Index] = (UINT32) (NewMenuEntry->OptionNumber + 1);\r
+\r
       *DescriptionData  = 0x0000;\r
       *OptionalData     = 0x0000;\r
     }\r
@@ -879,6 +889,16 @@ Var_UpdateBootOption (
       InsertTailList (&BootOptionMenu.Head, &NewMenuEntry->Link);\r
       BootOptionMenu.MenuNumber++;\r
 \r
+      //\r
+      // Update "change driver order" page used data, append the new add driver\r
+      // option at the end.\r
+      //\r
+      Index = 0;\r
+      while (CallbackData->BmmFakeNvData.BootOptionOrder[Index] != 0) {\r
+        Index++;\r
+      }\r
+      CallbackData->BmmFakeNvData.BootOptionOrder[Index] = (UINT32) (NewMenuEntry->OptionNumber + 1);\r
+\r
       NvRamMap->BootDescriptionData[0]  = 0x0000;\r
       NvRamMap->BootOptionalData[0]     = 0x0000;\r
     }\r