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