]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Application/UiApp/BootMaint/UpdatePage.c
MdeModulePkg:Create Boot Maintenance Manager Library
[mirror_edk2.git] / MdeModulePkg / Application / UiApp / BootMaint / UpdatePage.c
index 938912bfbea2dd12e0ac2f5854d95f01272ca996..c9df7baeb642041574edb60cfe6f257830baa934 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
 Dynamically update the pages.\r
 \r
-Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2004 - 2015, Intel Corporation. All rights reserved.<BR>\r
 This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
 which accompanies this distribution.  The full text of the license may be found at\r
@@ -214,6 +214,8 @@ UpdateConCOMPage (
   BM_MENU_ENTRY       *NewMenuEntry;\r
   UINT16              Index;\r
 \r
+  CallbackData->BmmAskSaveOrNot = TRUE;\r
+\r
   UpdatePageStart (CallbackData);\r
 \r
   for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
@@ -249,7 +251,7 @@ UpdateBootDelPage (
   BM_LOAD_CONTEXT *NewLoadContext;\r
   UINT16          Index;\r
 \r
-  //CallbackData->BmmAskSaveOrNot = TRUE;\r
+  CallbackData->BmmAskSaveOrNot = TRUE;\r
 \r
   UpdatePageStart (CallbackData);\r
   CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, &BootOptionMenu);\r
@@ -262,6 +264,18 @@ UpdateBootDelPage (
       continue;\r
     }\r
 \r
+    NewLoadContext->Deleted = 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
     //\r
     // Check to see if the current boot option devicepath is the ShellDevice \r
     // path. If it is keep only UEFI Shell in the delete boot option list \r
@@ -278,7 +292,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
@@ -351,8 +365,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
     HiiCreateCheckBoxOpCode (\r
       mStartOpCodeHandle,\r
       (EFI_QUESTION_ID) (DRIVER_OPTION_DEL_QUESTION_ID + Index),\r
@@ -360,7 +382,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
@@ -462,28 +484,65 @@ UpdateConsolePage (
   UINT16              Index;\r
   UINT16              Index2;\r
   UINT8               CheckFlags;\r
\r
+  UINT8               *ConsoleCheck;\r
+  UINT8               *OldConsoleCheck;\r
+  UINTN               ConsoleCheckSize;\r
+  EFI_QUESTION_ID     QuestionIdBase;\r
+  UINT16              VariableOffsetBase;\r
+\r
   CallbackData->BmmAskSaveOrNot = TRUE;\r
 \r
   UpdatePageStart (CallbackData);\r
 \r
+  ConsoleCheck       = NULL;\r
+  OldConsoleCheck    = NULL;\r
+  QuestionIdBase     = 0;\r
+  VariableOffsetBase = 0;\r
+  ConsoleCheckSize   = 0;\r
+\r
+  switch (UpdatePageId) {\r
+  case FORM_CON_IN_ID:\r
+    ConsoleCheck       = &CallbackData->BmmFakeNvData.ConsoleInCheck[0];\r
+    OldConsoleCheck    = &CallbackData->BmmOldFakeNVData.ConsoleInCheck[0];\r
+    ConsoleCheckSize   = sizeof (CallbackData->BmmFakeNvData.ConsoleInCheck);\r
+    QuestionIdBase     = CON_IN_DEVICE_QUESTION_ID;\r
+    VariableOffsetBase = CON_IN_DEVICE_VAR_OFFSET;\r
+    break;\r
+\r
+  case FORM_CON_OUT_ID:\r
+    ConsoleCheck       = &CallbackData->BmmFakeNvData.ConsoleOutCheck[0];\r
+    OldConsoleCheck    = &CallbackData->BmmOldFakeNVData.ConsoleOutCheck[0];\r
+    ConsoleCheckSize   = sizeof (CallbackData->BmmFakeNvData.ConsoleOutCheck);\r
+    QuestionIdBase     = CON_OUT_DEVICE_QUESTION_ID;\r
+    VariableOffsetBase = CON_OUT_DEVICE_VAR_OFFSET;\r
+    break;\r
+\r
+  case FORM_CON_ERR_ID:\r
+    ConsoleCheck       = &CallbackData->BmmFakeNvData.ConsoleErrCheck[0];\r
+    OldConsoleCheck    = &CallbackData->BmmOldFakeNVData.ConsoleErrCheck[0];\r
+    ConsoleCheckSize   = sizeof (CallbackData->BmmFakeNvData.ConsoleErrCheck);\r
+    QuestionIdBase     = CON_ERR_DEVICE_QUESTION_ID;\r
+    VariableOffsetBase = CON_ERR_DEVICE_VAR_OFFSET;\r
+    break;\r
+  }\r
+  ASSERT (ConsoleCheck != NULL);\r
+\r
   for (Index = 0; ((Index < ConsoleMenu->MenuNumber) && \\r
-       (Index < (sizeof (CallbackData->BmmFakeNvData.ConsoleCheck) / sizeof (UINT8)))) ; Index++) {\r
-    NewMenuEntry      = BOpt_GetMenuEntry (ConsoleMenu, Index);\r
+       (Index < MAX_MENU_NUMBER)) ; Index++) {\r
+    CheckFlags = 0;\r
+    NewMenuEntry = BOpt_GetMenuEntry (ConsoleMenu, Index);\r
     NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;\r
-    CheckFlags        = 0;\r
     if (NewConsoleContext->IsActive) {\r
       CheckFlags |= EFI_IFR_CHECKBOX_DEFAULT;\r
-      CallbackData->BmmFakeNvData.ConsoleCheck[Index] = TRUE;\r
+      ConsoleCheck[Index] = TRUE;\r
     } else {\r
-      CallbackData->BmmFakeNvData.ConsoleCheck[Index] = FALSE;\r
+      ConsoleCheck[Index] = FALSE;\r
     }\r
-\r
     HiiCreateCheckBoxOpCode (\r
       mStartOpCodeHandle,\r
-      (EFI_QUESTION_ID) (CON_DEVICE_QUESTION_ID + Index),\r
+      (EFI_QUESTION_ID) (QuestionIdBase + Index),\r
       VARSTORE_ID_BOOT_MAINT,\r
-      (UINT16) (CON_DEVICE_VAR_OFFSET + Index),\r
+      (UINT16) (VariableOffsetBase + Index),\r
       NewMenuEntry->DisplayStringToken,\r
       NewMenuEntry->HelpStringToken,\r
       0,\r
@@ -493,7 +552,7 @@ UpdateConsolePage (
   }\r
 \r
   for (Index2 = 0; ((Index2 < TerminalMenu.MenuNumber) && \\r
-       (Index2 < (sizeof (CallbackData->BmmFakeNvData.ConsoleCheck) / sizeof (UINT8)))); Index2++) {\r
+       (Index2 < MAX_MENU_NUMBER)); Index2++) {\r
     CheckFlags          = 0;\r
     NewMenuEntry        = BOpt_GetMenuEntry (&TerminalMenu, Index2);\r
     NewTerminalContext  = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
@@ -504,16 +563,15 @@ UpdateConsolePage (
         ((NewTerminalContext->IsStdErr != 0) && (UpdatePageId == FORM_CON_ERR_ID))\r
         ) {\r
       CheckFlags |= EFI_IFR_CHECKBOX_DEFAULT;\r
-      CallbackData->BmmFakeNvData.ConsoleCheck[Index] = TRUE;\r
+      ConsoleCheck[Index] = TRUE;\r
     } else {\r
-      CallbackData->BmmFakeNvData.ConsoleCheck[Index] = FALSE;\r
+      ConsoleCheck[Index] = FALSE;\r
     }\r
-\r
     HiiCreateCheckBoxOpCode (\r
       mStartOpCodeHandle,\r
-      (EFI_QUESTION_ID) (CON_DEVICE_QUESTION_ID + Index),\r
+      (EFI_QUESTION_ID) (QuestionIdBase + Index),\r
       VARSTORE_ID_BOOT_MAINT,\r
-      (UINT16) (CON_DEVICE_VAR_OFFSET + Index),\r
+      (UINT16) (VariableOffsetBase + Index),\r
       NewMenuEntry->DisplayStringToken,\r
       NewMenuEntry->HelpStringToken,\r
       0,\r
@@ -524,6 +582,8 @@ UpdateConsolePage (
     Index++;\r
   }\r
 \r
+  CopyMem (OldConsoleCheck, ConsoleCheck, ConsoleCheckSize);\r
+\r
   UpdatePageEnd (CallbackData);\r
 }\r
 \r
@@ -838,7 +898,7 @@ UpdateConModePage (
     //\r
     UnicodeValueToString (ModeString, 0, Col, 0);\r
     PStr = &ModeString[0];\r
-    StrnCat (PStr, L" x ", StrLen(L" x ") + 1);\r
+    StrnCatS (PStr, sizeof (ModeString) / sizeof (ModeString[0]), L" x ", StrLen(L" x ") + 1);\r
     PStr = PStr + StrLen (PStr);\r
     UnicodeValueToString (PStr , 0, Row, 0);\r
 \r
@@ -883,7 +943,7 @@ UpdateConModePage (
   UpdatePageEnd (CallbackData);\r
 }\r
 \r
-/**\r
+ /**\r
   Create the dynamic page which allows user to set the property such as Baud Rate, Data Bits,\r
   Parity, Stop Bits, Terminal Type.\r
 \r
@@ -898,35 +958,31 @@ UpdateTerminalPage (
   UINT8               Index;\r
   UINT8               CheckFlags;\r
   BM_MENU_ENTRY       *NewMenuEntry;\r
-  BM_TERMINAL_CONTEXT *NewTerminalContext;\r
   VOID                *OptionsOpCodeHandle;\r
+  UINTN               CurrentTerminal;\r
 \r
   CallbackData->BmmAskSaveOrNot = TRUE;\r
 \r
   UpdatePageStart (CallbackData);\r
 \r
+  CurrentTerminal = CallbackData->CurrentTerminal;\r
   NewMenuEntry = BOpt_GetMenuEntry (\r
                   &TerminalMenu,\r
-                  CallbackData->CurrentTerminal\r
+                  CurrentTerminal\r
                   );\r
 \r
   if (NewMenuEntry == NULL) {\r
     return ;\r
   }\r
 \r
-  NewTerminalContext  = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
-\r
   OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
   ASSERT (OptionsOpCodeHandle != NULL);\r
 \r
   for (Index = 0; Index < sizeof (BaudRateList) / sizeof (BaudRateList [0]); Index++) {\r
     CheckFlags = 0;\r
-    if (NewTerminalContext->BaudRate == (UINT64) (BaudRateList[Index].Value)) {\r
+    if (BaudRateList[Index].Value == 115200) {\r
       CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
-      NewTerminalContext->BaudRateIndex         = Index;\r
-      CallbackData->BmmFakeNvData.COMBaudRate  = NewTerminalContext->BaudRateIndex;\r
     }\r
-\r
     HiiCreateOneOfOptionOpCode (\r
       OptionsOpCodeHandle,\r
       BaudRateList[Index].StringToken,\r
@@ -938,9 +994,9 @@ UpdateTerminalPage (
 \r
   HiiCreateOneOfOpCode (\r
     mStartOpCodeHandle,\r
-    (EFI_QUESTION_ID) COM_BAUD_RATE_QUESTION_ID,\r
+    (EFI_QUESTION_ID) (COM_BAUD_RATE_QUESTION_ID + CurrentTerminal),\r
     VARSTORE_ID_BOOT_MAINT,\r
-    COM_BAUD_RATE_VAR_OFFSET,\r
+    (UINT16) (COM_BAUD_RATE_VAR_OFFSET + CurrentTerminal),\r
     STRING_TOKEN (STR_COM_BAUD_RATE),\r
     STRING_TOKEN (STR_COM_BAUD_RATE),\r
     0,\r
@@ -956,9 +1012,7 @@ UpdateTerminalPage (
   for (Index = 0; Index < sizeof (DataBitsList) / sizeof (DataBitsList[0]); Index++) {\r
     CheckFlags = 0;\r
 \r
-    if (NewTerminalContext->DataBits == DataBitsList[Index].Value) {\r
-      NewTerminalContext->DataBitsIndex         = Index;\r
-      CallbackData->BmmFakeNvData.COMDataRate  = NewTerminalContext->DataBitsIndex;\r
+    if (DataBitsList[Index].Value == 8) {\r
       CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
     }\r
 \r
@@ -973,9 +1027,9 @@ UpdateTerminalPage (
 \r
   HiiCreateOneOfOpCode (\r
     mStartOpCodeHandle,\r
-    (EFI_QUESTION_ID) COM_DATA_RATE_QUESTION_ID,\r
+    (EFI_QUESTION_ID) (COM_DATA_RATE_QUESTION_ID + CurrentTerminal),\r
     VARSTORE_ID_BOOT_MAINT,\r
-    COM_DATA_RATE_VAR_OFFSET,\r
+    (UINT16) (COM_DATA_RATE_VAR_OFFSET + CurrentTerminal),\r
     STRING_TOKEN (STR_COM_DATA_BITS),\r
     STRING_TOKEN (STR_COM_DATA_BITS),\r
     0,\r
@@ -990,10 +1044,8 @@ UpdateTerminalPage (
 \r
   for (Index = 0; Index < sizeof (ParityList) / sizeof (ParityList[0]); Index++) {\r
     CheckFlags = 0;\r
-    if (NewTerminalContext->Parity == ParityList[Index].Value) {\r
+    if (ParityList[Index].Value ==  NoParity) {\r
       CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
-      NewTerminalContext->ParityIndex         = (UINT8) Index;\r
-      CallbackData->BmmFakeNvData.COMParity  = NewTerminalContext->ParityIndex;\r
     }\r
 \r
     HiiCreateOneOfOptionOpCode (\r
@@ -1007,9 +1059,9 @@ UpdateTerminalPage (
 \r
   HiiCreateOneOfOpCode (\r
     mStartOpCodeHandle,\r
-    (EFI_QUESTION_ID) COM_PARITY_QUESTION_ID,\r
+    (EFI_QUESTION_ID) (COM_PARITY_QUESTION_ID + CurrentTerminal),\r
     VARSTORE_ID_BOOT_MAINT,\r
-    COM_PARITY_VAR_OFFSET,\r
+    (UINT16) (COM_PARITY_VAR_OFFSET + CurrentTerminal),\r
     STRING_TOKEN (STR_COM_PARITY),\r
     STRING_TOKEN (STR_COM_PARITY),\r
     0,\r
@@ -1024,10 +1076,8 @@ UpdateTerminalPage (
 \r
   for (Index = 0; Index < sizeof (StopBitsList) / sizeof (StopBitsList[0]); Index++) {\r
     CheckFlags = 0;\r
-    if (NewTerminalContext->StopBits == StopBitsList[Index].Value) {\r
+    if (StopBitsList[Index].Value == OneStopBit) {\r
       CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
-      NewTerminalContext->StopBitsIndex         = (UINT8) Index;\r
-      CallbackData->BmmFakeNvData.COMStopBits  = NewTerminalContext->StopBitsIndex;\r
     }\r
 \r
     HiiCreateOneOfOptionOpCode (\r
@@ -1041,9 +1091,9 @@ UpdateTerminalPage (
 \r
   HiiCreateOneOfOpCode (\r
     mStartOpCodeHandle,\r
-    (EFI_QUESTION_ID) COM_STOP_BITS_QUESTION_ID,\r
+    (EFI_QUESTION_ID) (COM_STOP_BITS_QUESTION_ID + CurrentTerminal),\r
     VARSTORE_ID_BOOT_MAINT,\r
-    COM_STOP_BITS_VAR_OFFSET,\r
+    (UINT16) (COM_STOP_BITS_VAR_OFFSET + CurrentTerminal),\r
     STRING_TOKEN (STR_COM_STOP_BITS),\r
     STRING_TOKEN (STR_COM_STOP_BITS),\r
     0,\r
@@ -1056,11 +1106,10 @@ UpdateTerminalPage (
   OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
   ASSERT (OptionsOpCodeHandle != NULL);\r
 \r
-  for (Index = 0; Index < 4; Index++) {\r
+  for (Index = 0; Index < sizeof (TerminalType) / sizeof (TerminalType[0]); Index++) {\r
     CheckFlags = 0;\r
-    if (NewTerminalContext->TerminalType == Index) {\r
+    if (Index == 0) {\r
       CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
-      CallbackData->BmmFakeNvData.COMTerminalType = NewTerminalContext->TerminalType;\r
     }\r
 \r
     HiiCreateOneOfOptionOpCode (\r
@@ -1074,9 +1123,9 @@ UpdateTerminalPage (
 \r
   HiiCreateOneOfOpCode (\r
     mStartOpCodeHandle,\r
-    (EFI_QUESTION_ID) COM_TERMINAL_QUESTION_ID,\r
+    (EFI_QUESTION_ID) (COM_TERMINAL_QUESTION_ID + CurrentTerminal),\r
     VARSTORE_ID_BOOT_MAINT,\r
-    COM_TERMINAL_VAR_OFFSET,\r
+    (UINT16) (COM_TERMINAL_VAR_OFFSET + CurrentTerminal),\r
     STRING_TOKEN (STR_COM_TERMI_TYPE),\r
     STRING_TOKEN (STR_COM_TERMI_TYPE),\r
     0,\r
@@ -1085,6 +1134,37 @@ UpdateTerminalPage (
     NULL\r
     );\r
 \r
+  HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
+  OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+  ASSERT (OptionsOpCodeHandle != NULL);\r
+\r
+  for (Index = 0; Index < sizeof (mFlowControlType) / sizeof (mFlowControlType[0]); Index++) {\r
+  CheckFlags = 0;\r
+    if (Index == 0) {\r
+      CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
+    }\r
+    HiiCreateOneOfOptionOpCode (\r
+      OptionsOpCodeHandle,\r
+      (EFI_STRING_ID) mFlowControlType[Index],\r
+      CheckFlags,\r
+      EFI_IFR_TYPE_NUM_SIZE_8,\r
+      mFlowControlValue[Index]\r
+      );\r
+  }\r
+\r
+  HiiCreateOneOfOpCode (\r
+    mStartOpCodeHandle,\r
+    (EFI_QUESTION_ID) (COM_FLOWCONTROL_QUESTION_ID + CurrentTerminal),\r
+    VARSTORE_ID_BOOT_MAINT,\r
+    (UINT16) (COM_FLOWCONTROL_VAR_OFFSET + CurrentTerminal),\r
+    STRING_TOKEN (STR_COM_FLOW_CONTROL),\r
+    STRING_TOKEN (STR_COM_FLOW_CONTROL),\r
+    0,\r
+    EFI_IFR_NUMERIC_SIZE_1,\r
+    OptionsOpCodeHandle,\r
+    NULL\r
+    );\r
+\r
   HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
 \r
   UpdatePageEnd (CallbackData);\r