]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Library/BootMaintenanceManagerUiLib/UpdatePage.c
BootMaintenanceManagerUiLib: change code for customization.
[mirror_edk2.git] / MdeModulePkg / Library / BootMaintenanceManagerUiLib / UpdatePage.c
CommitLineData
4af04335
DB
1/** @file\r
2Dynamically update the pages.\r
3\r
4Copyright (c) 2004 - 2015, Intel Corporation. All rights reserved.<BR>\r
5This program and the accompanying materials\r
6are licensed and made available under the terms and conditions of the BSD License\r
7which accompanies this distribution. The full text of the license may be found at\r
8http://opensource.org/licenses/bsd-license.php\r
9\r
10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14\r
15#include "BootMaintenanceManager.h"\r
16\r
17/**\r
18 Create the global UpdateData structure.\r
19\r
20**/\r
21VOID\r
22CreateUpdateData (\r
23 VOID\r
24 )\r
25{\r
26 //\r
27 // Init OpCode Handle and Allocate space for creation of Buffer\r
28 //\r
29 mStartOpCodeHandle = HiiAllocateOpCodeHandle ();\r
30 ASSERT (mStartOpCodeHandle != NULL);\r
31 \r
32 mEndOpCodeHandle = HiiAllocateOpCodeHandle ();\r
33 ASSERT (mEndOpCodeHandle != NULL);\r
34 \r
35 //\r
36 // Create Hii Extend Label OpCode as the start opcode\r
37 //\r
38 mStartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (mStartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
39 mStartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
40 \r
41 //\r
42 // Create Hii Extend Label OpCode as the end opcode\r
43 //\r
44 mEndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (mEndOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
45 mEndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
46 mEndLabel->Number = LABEL_END;\r
47}\r
48\r
49/**\r
50 Refresh the global UpdateData structure.\r
51\r
52**/\r
53VOID\r
54RefreshUpdateData (\r
55 VOID\r
56 )\r
57{\r
58 //\r
59 // Free current updated date\r
60 // \r
61 if (mStartOpCodeHandle != NULL) {\r
62 HiiFreeOpCodeHandle (mStartOpCodeHandle);\r
63 }\r
64\r
65 //\r
66 // Create new OpCode Handle\r
67 //\r
68 mStartOpCodeHandle = HiiAllocateOpCodeHandle ();\r
69\r
70 //\r
71 // Create Hii Extend Label OpCode as the start opcode\r
72 //\r
73 mStartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (mStartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
74 mStartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
75\r
76}\r
77\r
78/**\r
79 Add a "Go back to main page" tag in front of the form when there are no\r
80 "Apply changes" and "Discard changes" tags in the end of the form.\r
81 \r
82 @param CallbackData The BMM context data.\r
83\r
84**/\r
85VOID\r
86UpdatePageStart (\r
87 IN BMM_CALLBACK_DATA *CallbackData\r
88 )\r
89{\r
90 RefreshUpdateData ();\r
91 mStartLabel->Number = CallbackData->BmmCurrentPageId;\r
92\r
93 if (!(CallbackData->BmmAskSaveOrNot)) {\r
94 //\r
95 // Add a "Go back to main page" tag in front of the form when there are no\r
96 // "Apply changes" and "Discard changes" tags in the end of the form.\r
97 //\r
98 HiiCreateGotoOpCode (\r
99 mStartOpCodeHandle,\r
100 FORM_MAIN_ID,\r
101 STRING_TOKEN (STR_FORM_GOTO_MAIN),\r
102 STRING_TOKEN (STR_FORM_GOTO_MAIN),\r
103 0,\r
104 FORM_MAIN_ID\r
105 );\r
106 }\r
107}\r
108\r
109/**\r
110 Create the "Apply changes" and "Discard changes" tags. And\r
111 ensure user can return to the main page.\r
112\r
113 @param CallbackData The BMM context data.\r
114\r
115**/\r
116VOID\r
117UpdatePageEnd (\r
118 IN BMM_CALLBACK_DATA *CallbackData\r
119 )\r
120{\r
121 //\r
122 // Create the "Apply changes" and "Discard changes" tags.\r
123 //\r
124 if (CallbackData->BmmAskSaveOrNot) {\r
125 HiiCreateSubTitleOpCode (\r
126 mStartOpCodeHandle,\r
127 STRING_TOKEN (STR_NULL_STRING),\r
128 0,\r
129 0,\r
130 0\r
131 );\r
132\r
133 HiiCreateActionOpCode (\r
134 mStartOpCodeHandle,\r
135 KEY_VALUE_SAVE_AND_EXIT,\r
136 STRING_TOKEN (STR_SAVE_AND_EXIT),\r
137 STRING_TOKEN (STR_NULL_STRING),\r
138 EFI_IFR_FLAG_CALLBACK,\r
139 0\r
140 );\r
141 }\r
142\r
143 //\r
144 // Ensure user can return to the main page.\r
145 //\r
146 HiiCreateActionOpCode (\r
147 mStartOpCodeHandle,\r
148 KEY_VALUE_NO_SAVE_AND_EXIT,\r
149 STRING_TOKEN (STR_NO_SAVE_AND_EXIT),\r
150 STRING_TOKEN (STR_NULL_STRING),\r
151 EFI_IFR_FLAG_CALLBACK,\r
152 0\r
153 );\r
154\r
155 HiiUpdateForm (\r
156 CallbackData->BmmHiiHandle,\r
157 &mBootMaintGuid,\r
158 CallbackData->BmmCurrentPageId,\r
159 mStartOpCodeHandle, // Label CallbackData->BmmCurrentPageId\r
160 mEndOpCodeHandle // LABEL_END\r
161 );\r
162}\r
163\r
164/**\r
165 Clean up the dynamic opcode at label and form specified by both LabelId. \r
166\r
167 @param LabelId It is both the Form ID and Label ID for opcode deletion.\r
168 @param CallbackData The BMM context data.\r
169\r
170**/\r
171VOID\r
172CleanUpPage (\r
173 IN UINT16 LabelId,\r
174 IN BMM_CALLBACK_DATA *CallbackData\r
175 )\r
176{\r
177 RefreshUpdateData ();\r
178\r
179 //\r
180 // Remove all op-codes from dynamic page\r
181 //\r
182 mStartLabel->Number = LabelId;\r
183 HiiUpdateForm (\r
184 CallbackData->BmmHiiHandle,\r
185 &mBootMaintGuid,\r
186 LabelId,\r
187 mStartOpCodeHandle, // Label LabelId\r
188 mEndOpCodeHandle // LABEL_END\r
189 );\r
190}\r
191\r
192/**\r
193 Create a list of Goto Opcode for all terminal devices logged\r
194 by TerminaMenu. This list will be inserted to form FORM_CON_COM_SETUP_ID.\r
195\r
196 @param CallbackData The BMM context data.\r
197**/\r
198VOID\r
199UpdateConCOMPage (\r
200 IN BMM_CALLBACK_DATA *CallbackData\r
201 )\r
202{\r
203 BM_MENU_ENTRY *NewMenuEntry;\r
204 UINT16 Index;\r
205\r
206 CallbackData->BmmAskSaveOrNot = TRUE;\r
207\r
208 UpdatePageStart (CallbackData);\r
209\r
210 for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
211 NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
212\r
213 HiiCreateGotoOpCode (\r
214 mStartOpCodeHandle,\r
215 FORM_CON_COM_SETUP_ID,\r
216 NewMenuEntry->DisplayStringToken,\r
217 STRING_TOKEN (STR_NULL_STRING),\r
218 EFI_IFR_FLAG_CALLBACK,\r
219 (UINT16) (TERMINAL_OPTION_OFFSET + Index)\r
220 );\r
221 }\r
222\r
223 UpdatePageEnd (CallbackData);\r
224}\r
225\r
226\r
227/**\r
228 Create a list of boot option from global BootOptionMenu. It\r
229 allow user to delete the boot option.\r
230\r
231 @param CallbackData The BMM context data.\r
232\r
233**/\r
234VOID\r
235UpdateBootDelPage (\r
236 IN BMM_CALLBACK_DATA *CallbackData\r
237 )\r
238{\r
239 BM_MENU_ENTRY *NewMenuEntry;\r
240 BM_LOAD_CONTEXT *NewLoadContext;\r
241 UINT16 Index;\r
242\r
243 CallbackData->BmmAskSaveOrNot = TRUE;\r
244\r
245 UpdatePageStart (CallbackData);\r
246\r
247 ASSERT (BootOptionMenu.MenuNumber <= (sizeof (CallbackData->BmmFakeNvData.BootOptionDel) / sizeof (CallbackData->BmmFakeNvData.BootOptionDel[0])));\r
248 for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
249 NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
250 NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
251 if (NewLoadContext->IsLegacy) {\r
252 continue;\r
253 }\r
254\r
255 NewLoadContext->Deleted = FALSE;\r
256\r
257 if (CallbackData->BmmFakeNvData.BootOptionDel[Index] && !CallbackData->BmmFakeNvData.BootOptionDelMark[Index]) {\r
258 //\r
259 // CallbackData->BmmFakeNvData.BootOptionDel[Index] == TRUE means browser knows this boot option is selected\r
260 // CallbackData->BmmFakeNvData.BootOptionDelMark[Index] = FALSE means BDS knows the selected boot option has\r
261 // deleted, browser maintains old useless info. So clear this info here, and later update this info to browser\r
262 // through HiiSetBrowserData function.\r
263 //\r
264 CallbackData->BmmFakeNvData.BootOptionDel[Index] = FALSE;\r
265 }\r
266 \r
267 HiiCreateCheckBoxOpCode (\r
268 mStartOpCodeHandle,\r
269 (EFI_QUESTION_ID) (BOOT_OPTION_DEL_QUESTION_ID + Index),\r
270 VARSTORE_ID_BOOT_MAINT,\r
271 (UINT16) (BOOT_OPTION_DEL_VAR_OFFSET + Index),\r
272 NewMenuEntry->DisplayStringToken,\r
273 NewMenuEntry->HelpStringToken,\r
274 EFI_IFR_FLAG_CALLBACK,\r
275 0,\r
276 NULL\r
277 );\r
278 }\r
279 UpdatePageEnd (CallbackData);\r
280}\r
281\r
282/**\r
283 Create a lit of driver option from global DriverMenu.\r
284\r
285 @param CallbackData The BMM context data.\r
286\r
287**/\r
288VOID\r
289UpdateDrvAddHandlePage (\r
290 IN BMM_CALLBACK_DATA *CallbackData\r
291 )\r
292{\r
293 BM_MENU_ENTRY *NewMenuEntry;\r
294 UINT16 Index;\r
295\r
296 CallbackData->BmmAskSaveOrNot = FALSE;\r
297\r
298 UpdatePageStart (CallbackData);\r
299\r
300 for (Index = 0; Index < DriverMenu.MenuNumber; Index++) {\r
301 NewMenuEntry = BOpt_GetMenuEntry (&DriverMenu, Index);\r
302\r
303 HiiCreateGotoOpCode (\r
304 mStartOpCodeHandle,\r
305 FORM_DRV_ADD_HANDLE_DESC_ID,\r
306 NewMenuEntry->DisplayStringToken,\r
307 STRING_TOKEN (STR_NULL_STRING),\r
308 EFI_IFR_FLAG_CALLBACK,\r
309 (UINT16) (HANDLE_OPTION_OFFSET + Index)\r
310 );\r
311 }\r
312\r
313 UpdatePageEnd (CallbackData);\r
314}\r
315\r
316/**\r
317 Create a lit of driver option from global DriverOptionMenu. It\r
318 allow user to delete the driver option.\r
319\r
320 @param CallbackData The BMM context data.\r
321\r
322**/\r
323VOID\r
324UpdateDrvDelPage (\r
325 IN BMM_CALLBACK_DATA *CallbackData\r
326 )\r
327{\r
328 BM_MENU_ENTRY *NewMenuEntry;\r
329 BM_LOAD_CONTEXT *NewLoadContext;\r
330 UINT16 Index;\r
331\r
332 CallbackData->BmmAskSaveOrNot = TRUE;\r
333\r
334 UpdatePageStart (CallbackData);\r
335\r
336 ASSERT (DriverOptionMenu.MenuNumber <= (sizeof (CallbackData->BmmFakeNvData.DriverOptionDel) / sizeof (CallbackData->BmmFakeNvData.DriverOptionDel[0])));\r
337 for (Index = 0; Index < DriverOptionMenu.MenuNumber; Index++) {\r
338 NewMenuEntry = BOpt_GetMenuEntry (&DriverOptionMenu, Index);\r
339\r
340 NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
341 NewLoadContext->Deleted = FALSE;\r
342\r
343 if (CallbackData->BmmFakeNvData.DriverOptionDel[Index] && !CallbackData->BmmFakeNvData.DriverOptionDelMark[Index]) {\r
344 //\r
345 // CallbackData->BmmFakeNvData.BootOptionDel[Index] == TRUE means browser knows this boot option is selected\r
346 // CallbackData->BmmFakeNvData.BootOptionDelMark[Index] = FALSE means BDS knows the selected boot option has\r
347 // deleted, browser maintains old useless info. So clear this info here, and later update this info to browser\r
348 // through HiiSetBrowserData function.\r
349 //\r
350 CallbackData->BmmFakeNvData.DriverOptionDel[Index] = FALSE;\r
351 }\r
352 HiiCreateCheckBoxOpCode (\r
353 mStartOpCodeHandle,\r
354 (EFI_QUESTION_ID) (DRIVER_OPTION_DEL_QUESTION_ID + Index),\r
355 VARSTORE_ID_BOOT_MAINT,\r
356 (UINT16) (DRIVER_OPTION_DEL_VAR_OFFSET + Index),\r
357 NewMenuEntry->DisplayStringToken,\r
358 NewMenuEntry->HelpStringToken,\r
359 EFI_IFR_FLAG_CALLBACK,\r
360 0,\r
361 NULL\r
362 );\r
363 }\r
364\r
365 UpdatePageEnd (CallbackData);\r
366}\r
367\r
368/**\r
369 Prepare the page to allow user to add description for \r
370 a Driver Option.\r
371\r
372 @param CallbackData The BMM context data.\r
373\r
374**/\r
375VOID\r
376UpdateDriverAddHandleDescPage (\r
377 IN BMM_CALLBACK_DATA *CallbackData\r
378 )\r
379{\r
380 BM_MENU_ENTRY *NewMenuEntry;\r
381\r
382 CallbackData->BmmFakeNvData.DriverAddActive = 0x01;\r
383 CallbackData->BmmFakeNvData.DriverAddForceReconnect = 0x00;\r
384 CallbackData->BmmAskSaveOrNot = TRUE;\r
385 NewMenuEntry = CallbackData->MenuEntry;\r
386\r
387 UpdatePageStart (CallbackData);\r
388\r
389 HiiCreateSubTitleOpCode (\r
390 mStartOpCodeHandle,\r
391 NewMenuEntry->DisplayStringToken,\r
392 0,\r
393 0,\r
394 0\r
395 );\r
396\r
397 HiiCreateStringOpCode (\r
398 mStartOpCodeHandle,\r
399 (EFI_QUESTION_ID) DRV_ADD_HANDLE_DESC_QUESTION_ID,\r
400 VARSTORE_ID_BOOT_MAINT,\r
401 DRV_ADD_HANDLE_DESC_VAR_OFFSET,\r
402 STRING_TOKEN (STR_LOAD_OPTION_DESC),\r
403 STRING_TOKEN (STR_NULL_STRING),\r
404 0,\r
405 0,\r
406 6,\r
407 75,\r
408 NULL\r
409 );\r
410\r
411 HiiCreateCheckBoxOpCode (\r
412 mStartOpCodeHandle,\r
413 (EFI_QUESTION_ID) DRV_ADD_RECON_QUESTION_ID,\r
414 VARSTORE_ID_BOOT_MAINT,\r
415 DRV_ADD_RECON_VAR_OFFSET,\r
416 STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON),\r
417 STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON),\r
418 0,\r
419 0,\r
420 NULL\r
421 );\r
422\r
423 HiiCreateStringOpCode (\r
424 mStartOpCodeHandle,\r
425 (EFI_QUESTION_ID) DRIVER_ADD_OPTION_QUESTION_ID,\r
426 VARSTORE_ID_BOOT_MAINT,\r
427 DRIVER_ADD_OPTION_VAR_OFFSET,\r
428 STRING_TOKEN (STR_OPTIONAL_DATA),\r
429 STRING_TOKEN (STR_NULL_STRING),\r
430 0,\r
431 0,\r
432 6,\r
433 75,\r
434 NULL\r
435 );\r
436\r
437 UpdatePageEnd (CallbackData);\r
438}\r
439\r
440/**\r
441 Update console page.\r
442\r
443 @param UpdatePageId The form ID to be updated.\r
444 @param ConsoleMenu The console menu list.\r
445 @param CallbackData The BMM context data.\r
446\r
447**/\r
448VOID\r
449UpdateConsolePage (\r
450 IN UINT16 UpdatePageId,\r
451 IN BM_MENU_OPTION *ConsoleMenu,\r
452 IN BMM_CALLBACK_DATA *CallbackData\r
453 )\r
454{\r
455 BM_MENU_ENTRY *NewMenuEntry;\r
456 BM_CONSOLE_CONTEXT *NewConsoleContext;\r
457 BM_TERMINAL_CONTEXT *NewTerminalContext;\r
458 UINT16 Index;\r
459 UINT16 Index2;\r
460 UINT8 CheckFlags;\r
461 UINT8 *ConsoleCheck;\r
462 UINT8 *OldConsoleCheck;\r
463 UINTN ConsoleCheckSize;\r
464 EFI_QUESTION_ID QuestionIdBase;\r
465 UINT16 VariableOffsetBase;\r
466\r
467 CallbackData->BmmAskSaveOrNot = TRUE;\r
468\r
469 UpdatePageStart (CallbackData);\r
470\r
471 ConsoleCheck = NULL;\r
472 OldConsoleCheck = NULL;\r
473 QuestionIdBase = 0;\r
474 VariableOffsetBase = 0;\r
475 ConsoleCheckSize = 0;\r
476\r
477 switch (UpdatePageId) {\r
478 case FORM_CON_IN_ID:\r
479 ConsoleCheck = &CallbackData->BmmFakeNvData.ConsoleInCheck[0];\r
480 OldConsoleCheck = &CallbackData->BmmOldFakeNVData.ConsoleInCheck[0];\r
481 ConsoleCheckSize = sizeof (CallbackData->BmmFakeNvData.ConsoleInCheck);\r
482 QuestionIdBase = CON_IN_DEVICE_QUESTION_ID;\r
483 VariableOffsetBase = CON_IN_DEVICE_VAR_OFFSET;\r
484 break;\r
485\r
486 case FORM_CON_OUT_ID:\r
487 ConsoleCheck = &CallbackData->BmmFakeNvData.ConsoleOutCheck[0];\r
488 OldConsoleCheck = &CallbackData->BmmOldFakeNVData.ConsoleOutCheck[0];\r
489 ConsoleCheckSize = sizeof (CallbackData->BmmFakeNvData.ConsoleOutCheck);\r
490 QuestionIdBase = CON_OUT_DEVICE_QUESTION_ID;\r
491 VariableOffsetBase = CON_OUT_DEVICE_VAR_OFFSET;\r
492 break;\r
493\r
494 case FORM_CON_ERR_ID:\r
495 ConsoleCheck = &CallbackData->BmmFakeNvData.ConsoleErrCheck[0];\r
496 OldConsoleCheck = &CallbackData->BmmOldFakeNVData.ConsoleErrCheck[0];\r
497 ConsoleCheckSize = sizeof (CallbackData->BmmFakeNvData.ConsoleErrCheck);\r
498 QuestionIdBase = CON_ERR_DEVICE_QUESTION_ID;\r
499 VariableOffsetBase = CON_ERR_DEVICE_VAR_OFFSET;\r
500 break;\r
501 }\r
502 ASSERT (ConsoleCheck != NULL);\r
503\r
504 for (Index = 0; ((Index < ConsoleMenu->MenuNumber) && \\r
505 (Index < MAX_MENU_NUMBER)) ; Index++) {\r
506 CheckFlags = 0;\r
507 NewMenuEntry = BOpt_GetMenuEntry (ConsoleMenu, Index);\r
508 NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;\r
509 if (NewConsoleContext->IsActive) {\r
510 CheckFlags |= EFI_IFR_CHECKBOX_DEFAULT;\r
511 ConsoleCheck[Index] = TRUE;\r
512 } else {\r
513 ConsoleCheck[Index] = FALSE;\r
514 }\r
515 HiiCreateCheckBoxOpCode (\r
516 mStartOpCodeHandle,\r
517 (EFI_QUESTION_ID) (QuestionIdBase + Index),\r
518 VARSTORE_ID_BOOT_MAINT,\r
519 (UINT16) (VariableOffsetBase + Index),\r
520 NewMenuEntry->DisplayStringToken,\r
521 NewMenuEntry->HelpStringToken,\r
522 0,\r
523 CheckFlags,\r
524 NULL\r
525 );\r
526 }\r
527\r
528 for (Index2 = 0; ((Index2 < TerminalMenu.MenuNumber) && \\r
529 (Index2 < MAX_MENU_NUMBER)); Index2++) {\r
530 CheckFlags = 0;\r
531 NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index2);\r
532 NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
533\r
534 ASSERT (Index < MAX_MENU_NUMBER);\r
535 if (((NewTerminalContext->IsConIn != 0) && (UpdatePageId == FORM_CON_IN_ID)) ||\r
536 ((NewTerminalContext->IsConOut != 0) && (UpdatePageId == FORM_CON_OUT_ID)) ||\r
537 ((NewTerminalContext->IsStdErr != 0) && (UpdatePageId == FORM_CON_ERR_ID))\r
538 ) {\r
539 CheckFlags |= EFI_IFR_CHECKBOX_DEFAULT;\r
540 ConsoleCheck[Index] = TRUE;\r
541 } else {\r
542 ConsoleCheck[Index] = FALSE;\r
543 }\r
544 HiiCreateCheckBoxOpCode (\r
545 mStartOpCodeHandle,\r
546 (EFI_QUESTION_ID) (QuestionIdBase + Index),\r
547 VARSTORE_ID_BOOT_MAINT,\r
548 (UINT16) (VariableOffsetBase + Index),\r
549 NewMenuEntry->DisplayStringToken,\r
550 NewMenuEntry->HelpStringToken,\r
551 0,\r
552 CheckFlags,\r
553 NULL\r
554 );\r
555\r
556 Index++;\r
557 }\r
558\r
559 CopyMem (OldConsoleCheck, ConsoleCheck, ConsoleCheckSize);\r
560\r
561 UpdatePageEnd (CallbackData);\r
562}\r
563\r
564/**\r
565 Update the page's NV Map if user has changed the order\r
566 a list. This list can be Boot Order or Driver Order.\r
567\r
568 @param UpdatePageId The form ID to be updated.\r
569 @param OptionMenu The new list.\r
570 @param CallbackData The BMM context data.\r
571\r
572**/\r
573VOID\r
574UpdateOrderPage (\r
575 IN UINT16 UpdatePageId,\r
576 IN BM_MENU_OPTION *OptionMenu,\r
577 IN BMM_CALLBACK_DATA *CallbackData\r
578 )\r
579{\r
580 BM_MENU_ENTRY *NewMenuEntry;\r
581 UINT16 Index;\r
582 UINT16 OptionIndex;\r
583 VOID *OptionsOpCodeHandle;\r
4af04335
DB
584 BOOLEAN BootOptionFound;\r
585 UINT32 *OptionOrder;\r
586 EFI_QUESTION_ID QuestionId;\r
587 UINT16 VarOffset;\r
588\r
589 CallbackData->BmmAskSaveOrNot = TRUE;\r
590 UpdatePageStart (CallbackData);\r
591\r
592 OptionOrder = NULL;\r
593 QuestionId = 0;\r
594 VarOffset = 0;\r
595 switch (UpdatePageId) { \r
596 \r
597 case FORM_BOOT_CHG_ID:\r
598 GetBootOrder (CallbackData);\r
599 OptionOrder = CallbackData->BmmFakeNvData.BootOptionOrder;\r
600 QuestionId = BOOT_OPTION_ORDER_QUESTION_ID;\r
601 VarOffset = BOOT_OPTION_ORDER_VAR_OFFSET;\r
602 break;\r
603 \r
604 case FORM_DRV_CHG_ID:\r
605 GetDriverOrder (CallbackData);\r
606 OptionOrder = CallbackData->BmmFakeNvData.DriverOptionOrder;\r
607 QuestionId = DRIVER_OPTION_ORDER_QUESTION_ID;\r
608 VarOffset = DRIVER_OPTION_ORDER_VAR_OFFSET;\r
609 break;\r
610 } \r
611 ASSERT (OptionOrder != NULL); \r
612 \r
613 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
614 ASSERT (OptionsOpCodeHandle != NULL);\r
615 \r
616 NewMenuEntry = NULL;\r
617 for (OptionIndex = 0; (OptionOrder[OptionIndex] != 0 && OptionIndex < MAX_MENU_NUMBER); OptionIndex++) {\r
618 BootOptionFound = FALSE;\r
619 for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {\r
620 NewMenuEntry = BOpt_GetMenuEntry (OptionMenu, Index);\r
4af04335
DB
621 if ((UINT32) (NewMenuEntry->OptionNumber + 1) == OptionOrder[OptionIndex]) {\r
622 BootOptionFound = TRUE;\r
623 break;\r
624 }\r
625 }\r
626 if (BootOptionFound) {\r
627 HiiCreateOneOfOptionOpCode (\r
628 OptionsOpCodeHandle,\r
629 NewMenuEntry->DisplayStringToken,\r
630 0,\r
631 EFI_IFR_TYPE_NUM_SIZE_32,\r
632 OptionOrder[OptionIndex]\r
633 );\r
634 }\r
635 }\r
636 \r
637 if (OptionMenu->MenuNumber > 0) {\r
638 HiiCreateOrderedListOpCode ( \r
639 mStartOpCodeHandle, // Container for dynamic created opcodes \r
640 QuestionId, // Question ID \r
641 VARSTORE_ID_BOOT_MAINT, // VarStore ID \r
642 VarOffset, // Offset in Buffer Storage \r
643 STRING_TOKEN (STR_CHANGE_ORDER), // Question prompt text \r
644 STRING_TOKEN (STR_CHANGE_ORDER), // Question help text \r
645 0, // Question flag \r
646 0, // Ordered list flag, e.g. EFI_IFR_UNIQUE_SET\r
647 EFI_IFR_TYPE_NUM_SIZE_32, // Data type of Question value \r
648 100, // Maximum container \r
649 OptionsOpCodeHandle, // Option Opcode list \r
650 NULL // Default Opcode is NULL \r
651 );\r
652 }\r
653\r
654 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
655\r
656 UpdatePageEnd (CallbackData);\r
657\r
658}\r
659\r
4af04335
DB
660/**\r
661 Refresh the text mode page.\r
662\r
663 @param CallbackData The BMM context data.\r
664\r
665**/\r
666VOID\r
667UpdateConModePage (\r
668 IN BMM_CALLBACK_DATA *CallbackData\r
669 )\r
670{\r
671 UINTN Mode;\r
672 UINTN Index;\r
673 UINTN Col;\r
674 UINTN Row;\r
675 CHAR16 ModeString[50];\r
676 CHAR16 *PStr;\r
677 UINTN MaxMode;\r
678 UINTN ValidMode;\r
679 EFI_STRING_ID *ModeToken;\r
680 EFI_STATUS Status;\r
681 VOID *OptionsOpCodeHandle;\r
682 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *ConOut;\r
683\r
684 ConOut = gST->ConOut;\r
685 Index = 0;\r
686 ValidMode = 0;\r
687 MaxMode = (UINTN) (ConOut->Mode->MaxMode);\r
688\r
689 CallbackData->BmmAskSaveOrNot = TRUE;\r
690\r
691 UpdatePageStart (CallbackData);\r
692\r
693 //\r
694 // Check valid mode\r
695 //\r
696 for (Mode = 0; Mode < MaxMode; Mode++) {\r
697 Status = ConOut->QueryMode (ConOut, Mode, &Col, &Row);\r
698 if (EFI_ERROR (Status)) {\r
699 continue;\r
700 }\r
701 ValidMode++;\r
702 }\r
703\r
704 if (ValidMode == 0) {\r
705 return;\r
706 }\r
707\r
708 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
709 ASSERT (OptionsOpCodeHandle != NULL);\r
710\r
711 ModeToken = AllocateZeroPool (sizeof (EFI_STRING_ID) * ValidMode);\r
712 ASSERT(ModeToken != NULL);\r
713\r
714 //\r
715 // Determin which mode should be the first entry in menu\r
716 //\r
717 GetConsoleOutMode (CallbackData);\r
718\r
719 //\r
720 // Build text mode options\r
721 //\r
722 for (Mode = 0; Mode < MaxMode; Mode++) {\r
723 Status = ConOut->QueryMode (ConOut, Mode, &Col, &Row);\r
724 if (EFI_ERROR (Status)) {\r
725 continue;\r
726 }\r
727 \r
728 //\r
729 // Build mode string Column x Row\r
730 //\r
731 UnicodeValueToString (ModeString, 0, Col, 0);\r
732 PStr = &ModeString[0];\r
733 StrnCatS (PStr, sizeof (ModeString) / sizeof (ModeString[0]), L" x ", StrLen(L" x ") + 1);\r
734 PStr = PStr + StrLen (PStr);\r
735 UnicodeValueToString (PStr , 0, Row, 0);\r
736\r
737 ModeToken[Index] = HiiSetString (CallbackData->BmmHiiHandle, 0, ModeString, NULL);\r
738\r
739 if (Mode == CallbackData->BmmFakeNvData.ConsoleOutMode) {\r
740 HiiCreateOneOfOptionOpCode (\r
741 OptionsOpCodeHandle,\r
742 ModeToken[Index],\r
743 EFI_IFR_OPTION_DEFAULT,\r
744 EFI_IFR_TYPE_NUM_SIZE_16,\r
745 (UINT16) Mode\r
746 );\r
747 } else {\r
748 HiiCreateOneOfOptionOpCode (\r
749 OptionsOpCodeHandle,\r
750 ModeToken[Index],\r
751 0,\r
752 EFI_IFR_TYPE_NUM_SIZE_16,\r
753 (UINT16) Mode\r
754 );\r
755 }\r
756 Index++;\r
757 }\r
758\r
759 HiiCreateOneOfOpCode (\r
760 mStartOpCodeHandle,\r
761 (EFI_QUESTION_ID) CON_MODE_QUESTION_ID,\r
762 VARSTORE_ID_BOOT_MAINT,\r
763 CON_MODE_VAR_OFFSET,\r
764 STRING_TOKEN (STR_CON_MODE_SETUP),\r
765 STRING_TOKEN (STR_CON_MODE_SETUP),\r
766 EFI_IFR_FLAG_RESET_REQUIRED,\r
767 EFI_IFR_NUMERIC_SIZE_2,\r
768 OptionsOpCodeHandle,\r
769 NULL\r
770 );\r
771\r
772 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
773 FreePool (ModeToken);\r
774\r
775 UpdatePageEnd (CallbackData);\r
776}\r
777\r
778 /**\r
779 Create the dynamic page which allows user to set the property such as Baud Rate, Data Bits,\r
780 Parity, Stop Bits, Terminal Type.\r
781\r
782 @param CallbackData The BMM context data.\r
783\r
784**/\r
785VOID\r
786UpdateTerminalPage (\r
787 IN BMM_CALLBACK_DATA *CallbackData\r
788 )\r
789{\r
790 UINT8 Index;\r
791 UINT8 CheckFlags;\r
792 BM_MENU_ENTRY *NewMenuEntry;\r
793 VOID *OptionsOpCodeHandle;\r
794 UINTN CurrentTerminal;\r
795\r
796 CallbackData->BmmAskSaveOrNot = TRUE;\r
797\r
798 UpdatePageStart (CallbackData);\r
799\r
800 CurrentTerminal = CallbackData->CurrentTerminal;\r
801 NewMenuEntry = BOpt_GetMenuEntry (\r
802 &TerminalMenu,\r
803 CurrentTerminal\r
804 );\r
805\r
806 if (NewMenuEntry == NULL) {\r
807 return ;\r
808 }\r
809\r
810 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
811 ASSERT (OptionsOpCodeHandle != NULL);\r
812\r
813 for (Index = 0; Index < sizeof (BaudRateList) / sizeof (BaudRateList [0]); Index++) {\r
814 CheckFlags = 0;\r
815 if (BaudRateList[Index].Value == 115200) {\r
816 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
817 }\r
818 HiiCreateOneOfOptionOpCode (\r
819 OptionsOpCodeHandle,\r
820 BaudRateList[Index].StringToken,\r
821 CheckFlags,\r
822 EFI_IFR_TYPE_NUM_SIZE_8,\r
823 Index\r
824 );\r
825 }\r
826\r
827 HiiCreateOneOfOpCode (\r
828 mStartOpCodeHandle,\r
829 (EFI_QUESTION_ID) (COM_BAUD_RATE_QUESTION_ID + CurrentTerminal),\r
830 VARSTORE_ID_BOOT_MAINT,\r
831 (UINT16) (COM_BAUD_RATE_VAR_OFFSET + CurrentTerminal),\r
832 STRING_TOKEN (STR_COM_BAUD_RATE),\r
833 STRING_TOKEN (STR_COM_BAUD_RATE),\r
834 0,\r
835 EFI_IFR_NUMERIC_SIZE_1,\r
836 OptionsOpCodeHandle,\r
837 NULL\r
838 );\r
839 \r
840 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
841 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
842 ASSERT (OptionsOpCodeHandle != NULL);\r
843\r
844 for (Index = 0; Index < sizeof (DataBitsList) / sizeof (DataBitsList[0]); Index++) {\r
845 CheckFlags = 0;\r
846\r
847 if (DataBitsList[Index].Value == 8) {\r
848 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
849 }\r
850\r
851 HiiCreateOneOfOptionOpCode (\r
852 OptionsOpCodeHandle,\r
853 DataBitsList[Index].StringToken,\r
854 CheckFlags,\r
855 EFI_IFR_TYPE_NUM_SIZE_8,\r
856 Index\r
857 );\r
858 }\r
859\r
860 HiiCreateOneOfOpCode (\r
861 mStartOpCodeHandle,\r
862 (EFI_QUESTION_ID) (COM_DATA_RATE_QUESTION_ID + CurrentTerminal),\r
863 VARSTORE_ID_BOOT_MAINT,\r
864 (UINT16) (COM_DATA_RATE_VAR_OFFSET + CurrentTerminal),\r
865 STRING_TOKEN (STR_COM_DATA_BITS),\r
866 STRING_TOKEN (STR_COM_DATA_BITS),\r
867 0,\r
868 EFI_IFR_NUMERIC_SIZE_1,\r
869 OptionsOpCodeHandle,\r
870 NULL\r
871 );\r
872\r
873 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
874 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
875 ASSERT (OptionsOpCodeHandle != NULL);\r
876\r
877 for (Index = 0; Index < sizeof (ParityList) / sizeof (ParityList[0]); Index++) {\r
878 CheckFlags = 0;\r
879 if (ParityList[Index].Value == NoParity) {\r
880 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
881 }\r
882\r
883 HiiCreateOneOfOptionOpCode (\r
884 OptionsOpCodeHandle,\r
885 ParityList[Index].StringToken,\r
886 CheckFlags,\r
887 EFI_IFR_TYPE_NUM_SIZE_8,\r
888 Index\r
889 );\r
890 }\r
891\r
892 HiiCreateOneOfOpCode (\r
893 mStartOpCodeHandle,\r
894 (EFI_QUESTION_ID) (COM_PARITY_QUESTION_ID + CurrentTerminal),\r
895 VARSTORE_ID_BOOT_MAINT,\r
896 (UINT16) (COM_PARITY_VAR_OFFSET + CurrentTerminal),\r
897 STRING_TOKEN (STR_COM_PARITY),\r
898 STRING_TOKEN (STR_COM_PARITY),\r
899 0,\r
900 EFI_IFR_NUMERIC_SIZE_1,\r
901 OptionsOpCodeHandle,\r
902 NULL\r
903 );\r
904\r
905 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
906 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
907 ASSERT (OptionsOpCodeHandle != NULL);\r
908\r
909 for (Index = 0; Index < sizeof (StopBitsList) / sizeof (StopBitsList[0]); Index++) {\r
910 CheckFlags = 0;\r
911 if (StopBitsList[Index].Value == OneStopBit) {\r
912 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
913 }\r
914\r
915 HiiCreateOneOfOptionOpCode (\r
916 OptionsOpCodeHandle,\r
917 StopBitsList[Index].StringToken,\r
918 CheckFlags,\r
919 EFI_IFR_TYPE_NUM_SIZE_8,\r
920 Index\r
921 );\r
922 }\r
923\r
924 HiiCreateOneOfOpCode (\r
925 mStartOpCodeHandle,\r
926 (EFI_QUESTION_ID) (COM_STOP_BITS_QUESTION_ID + CurrentTerminal),\r
927 VARSTORE_ID_BOOT_MAINT,\r
928 (UINT16) (COM_STOP_BITS_VAR_OFFSET + CurrentTerminal),\r
929 STRING_TOKEN (STR_COM_STOP_BITS),\r
930 STRING_TOKEN (STR_COM_STOP_BITS),\r
931 0,\r
932 EFI_IFR_NUMERIC_SIZE_1,\r
933 OptionsOpCodeHandle,\r
934 NULL\r
935 );\r
936\r
937 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
938 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
939 ASSERT (OptionsOpCodeHandle != NULL);\r
940\r
941 for (Index = 0; Index < sizeof (TerminalType) / sizeof (TerminalType[0]); Index++) {\r
942 CheckFlags = 0;\r
943 if (Index == 0) {\r
944 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
945 }\r
946\r
947 HiiCreateOneOfOptionOpCode (\r
948 OptionsOpCodeHandle,\r
949 (EFI_STRING_ID) TerminalType[Index],\r
950 CheckFlags,\r
951 EFI_IFR_TYPE_NUM_SIZE_8,\r
952 Index\r
953 );\r
954 }\r
955\r
956 HiiCreateOneOfOpCode (\r
957 mStartOpCodeHandle,\r
958 (EFI_QUESTION_ID) (COM_TERMINAL_QUESTION_ID + CurrentTerminal),\r
959 VARSTORE_ID_BOOT_MAINT,\r
960 (UINT16) (COM_TERMINAL_VAR_OFFSET + CurrentTerminal),\r
961 STRING_TOKEN (STR_COM_TERMI_TYPE),\r
962 STRING_TOKEN (STR_COM_TERMI_TYPE),\r
963 0,\r
964 EFI_IFR_NUMERIC_SIZE_1,\r
965 OptionsOpCodeHandle,\r
966 NULL\r
967 );\r
968\r
969 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
970 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
971 ASSERT (OptionsOpCodeHandle != NULL);\r
972\r
973 for (Index = 0; Index < sizeof (mFlowControlType) / sizeof (mFlowControlType[0]); Index++) {\r
974 CheckFlags = 0;\r
975 if (Index == 0) {\r
976 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
977 }\r
978 HiiCreateOneOfOptionOpCode (\r
979 OptionsOpCodeHandle,\r
980 (EFI_STRING_ID) mFlowControlType[Index],\r
981 CheckFlags,\r
982 EFI_IFR_TYPE_NUM_SIZE_8,\r
983 mFlowControlValue[Index]\r
984 );\r
985 }\r
986\r
987 HiiCreateOneOfOpCode (\r
988 mStartOpCodeHandle,\r
989 (EFI_QUESTION_ID) (COM_FLOWCONTROL_QUESTION_ID + CurrentTerminal),\r
990 VARSTORE_ID_BOOT_MAINT,\r
991 (UINT16) (COM_FLOWCONTROL_VAR_OFFSET + CurrentTerminal),\r
992 STRING_TOKEN (STR_COM_FLOW_CONTROL),\r
993 STRING_TOKEN (STR_COM_FLOW_CONTROL),\r
994 0,\r
995 EFI_IFR_NUMERIC_SIZE_1,\r
996 OptionsOpCodeHandle,\r
997 NULL\r
998 );\r
999\r
1000 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
1001\r
1002 UpdatePageEnd (CallbackData);\r
1003}\r
1004 \r
1005/**\r
1006Update add boot/driver option page.\r
1007\r
1008@param CallbackData The BMM context data.\r
1009@param FormId The form ID to be updated.\r
1010@param DevicePath Device path.\r
1011\r
1012**/\r
1013VOID\r
1014UpdateOptionPage(\r
1015 IN BMM_CALLBACK_DATA *CallbackData,\r
1016 IN EFI_FORM_ID FormId,\r
1017 IN EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
1018 )\r
1019{\r
1020 CHAR16 *String;\r
1021 EFI_STRING_ID StringToken;\r
1022\r
1023 if (DevicePath != NULL){\r
1024 String = ExtractFileNameFromDevicePath(DevicePath);\r
1025 StringToken = HiiSetString (CallbackData->BmmHiiHandle, 0, String, NULL);\r
1026 FreePool(String);\r
1027 } else {\r
1028 String = HiiGetString (CallbackData->BmmHiiHandle, STRING_TOKEN (STR_NULL_STRING), NULL);\r
1029 ASSERT (String != NULL);\r
1030 StringToken = HiiSetString (CallbackData->BmmHiiHandle, 0, String, NULL);\r
1031 FreePool (String);\r
1032 }\r
1033\r
1034 if(FormId == FORM_BOOT_ADD_ID){\r
1035 if (!CallbackData->BmmFakeNvData.BootOptionChanged) {\r
1036 ZeroMem (CallbackData->BmmFakeNvData.BootOptionalData, sizeof (CallbackData->BmmFakeNvData.BootOptionalData));\r
1037 ZeroMem (CallbackData->BmmFakeNvData.BootDescriptionData, sizeof (CallbackData->BmmFakeNvData.BootDescriptionData));\r
1038 }\r
1039 } else if (FormId == FORM_DRV_ADD_FILE_ID){\r
1040 if (!CallbackData->BmmFakeNvData.DriverOptionChanged) {\r
1041 ZeroMem (CallbackData->BmmFakeNvData.DriverOptionalData, sizeof (CallbackData->BmmFakeNvData.DriverOptionalData));\r
1042 ZeroMem (CallbackData->BmmFakeNvData.DriverDescriptionData, sizeof (CallbackData->BmmFakeNvData.DriverDescriptionData));\r
1043 }\r
1044 }\r
1045\r
1046 RefreshUpdateData();\r
1047 mStartLabel->Number = FormId;\r
1048\r
1049 HiiCreateSubTitleOpCode (\r
1050 mStartOpCodeHandle,\r
1051 StringToken,\r
1052 0,\r
1053 0,\r
1054 0\r
1055 );\r
1056\r
1057 HiiUpdateForm (\r
1058 CallbackData->BmmHiiHandle,\r
1059 &mBootMaintGuid,\r
1060 FormId,\r
1061 mStartOpCodeHandle,// Label FormId\r
1062 mEndOpCodeHandle // LABEL_END\r
1063 );\r
1064}\r
1065\r
1066/**\r
1067 Dispatch the correct update page function to call based on\r
1068 the UpdatePageId.\r
1069\r
1070 @param UpdatePageId The form ID.\r
1071 @param CallbackData The BMM context data.\r
1072\r
1073**/\r
1074VOID\r
1075UpdatePageBody (\r
1076 IN UINT16 UpdatePageId,\r
1077 IN BMM_CALLBACK_DATA *CallbackData\r
1078 )\r
1079{\r
1080 CleanUpPage (UpdatePageId, CallbackData);\r
1081 switch (UpdatePageId) {\r
1082 case FORM_CON_IN_ID:\r
1083 UpdateConsolePage (UpdatePageId, &ConsoleInpMenu, CallbackData);\r
1084 break;\r
1085\r
1086 case FORM_CON_OUT_ID:\r
1087 UpdateConsolePage (UpdatePageId, &ConsoleOutMenu, CallbackData);\r
1088 break;\r
1089\r
1090 case FORM_CON_ERR_ID:\r
1091 UpdateConsolePage (UpdatePageId, &ConsoleErrMenu, CallbackData);\r
1092 break;\r
1093\r
1094 case FORM_BOOT_CHG_ID:\r
1095 UpdateOrderPage (UpdatePageId, &BootOptionMenu, CallbackData);\r
1096 break;\r
1097\r
1098 case FORM_DRV_CHG_ID:\r
1099 UpdateOrderPage (UpdatePageId, &DriverOptionMenu, CallbackData);\r
1100 break;\r
1101\r
1102 default:\r
1103 break;\r
1104 }\r
1105}\r
1106\r
1107/**\r
1108 Dispatch the display to the next page based on NewPageId.\r
1109\r
1110 @param Private The BMM context data.\r
1111 @param NewPageId The original page ID.\r
1112\r
1113**/\r
1114VOID\r
1115UpdatePageId (\r
1116 BMM_CALLBACK_DATA *Private,\r
1117 UINT16 NewPageId\r
1118 )\r
1119{\r
1120 if ((NewPageId < FILE_OPTION_OFFSET) && (NewPageId >= HANDLE_OPTION_OFFSET)) {\r
1121 //\r
1122 // If we select a handle to add driver option, advance to the add handle description page.\r
1123 //\r
1124 NewPageId = FORM_DRV_ADD_HANDLE_DESC_ID;\r
1125 } else if ((NewPageId == KEY_VALUE_SAVE_AND_EXIT) || (NewPageId == KEY_VALUE_NO_SAVE_AND_EXIT)) {\r
1126 //\r
1127 // Return to main page after "Save Changes" or "Discard Changes".\r
1128 //\r
1129 NewPageId = FORM_MAIN_ID;\r
1130 } else if ((NewPageId >= TERMINAL_OPTION_OFFSET) && (NewPageId < CONSOLE_OPTION_OFFSET)) {\r
1131 NewPageId = FORM_CON_COM_SETUP_ID;\r
1132 }\r
1133\r
1134 if ((NewPageId > 0) && (NewPageId < MAXIMUM_FORM_ID)) {\r
1135 Private->BmmPreviousPageId = Private->BmmCurrentPageId;\r
1136 Private->BmmCurrentPageId = NewPageId;\r
1137 }\r
1138}\r