]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Library/BootMaintenanceManagerUiLib/UpdatePage.c
IntelFrameworkModulePkg: Replace [Ascii|Unicode]ValueToString
[mirror_edk2.git] / MdeModulePkg / Library / BootMaintenanceManagerUiLib / UpdatePage.c
CommitLineData
4af04335
DB
1/** @file\r
2Dynamically update the pages.\r
3\r
a91f1a0e 4Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.<BR>\r
4af04335
DB
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
7880f73a 265 CallbackData->BmmOldFakeNVData.BootOptionDel[Index] = FALSE;\r
4af04335
DB
266 }\r
267 \r
268 HiiCreateCheckBoxOpCode (\r
269 mStartOpCodeHandle,\r
270 (EFI_QUESTION_ID) (BOOT_OPTION_DEL_QUESTION_ID + Index),\r
271 VARSTORE_ID_BOOT_MAINT,\r
272 (UINT16) (BOOT_OPTION_DEL_VAR_OFFSET + Index),\r
273 NewMenuEntry->DisplayStringToken,\r
274 NewMenuEntry->HelpStringToken,\r
275 EFI_IFR_FLAG_CALLBACK,\r
276 0,\r
277 NULL\r
278 );\r
279 }\r
280 UpdatePageEnd (CallbackData);\r
281}\r
282\r
283/**\r
284 Create a lit of driver option from global DriverMenu.\r
285\r
286 @param CallbackData The BMM context data.\r
287\r
288**/\r
289VOID\r
290UpdateDrvAddHandlePage (\r
291 IN BMM_CALLBACK_DATA *CallbackData\r
292 )\r
293{\r
294 BM_MENU_ENTRY *NewMenuEntry;\r
295 UINT16 Index;\r
296\r
297 CallbackData->BmmAskSaveOrNot = FALSE;\r
298\r
299 UpdatePageStart (CallbackData);\r
300\r
301 for (Index = 0; Index < DriverMenu.MenuNumber; Index++) {\r
302 NewMenuEntry = BOpt_GetMenuEntry (&DriverMenu, Index);\r
303\r
304 HiiCreateGotoOpCode (\r
305 mStartOpCodeHandle,\r
306 FORM_DRV_ADD_HANDLE_DESC_ID,\r
307 NewMenuEntry->DisplayStringToken,\r
308 STRING_TOKEN (STR_NULL_STRING),\r
309 EFI_IFR_FLAG_CALLBACK,\r
310 (UINT16) (HANDLE_OPTION_OFFSET + Index)\r
311 );\r
312 }\r
313\r
314 UpdatePageEnd (CallbackData);\r
315}\r
316\r
317/**\r
318 Create a lit of driver option from global DriverOptionMenu. It\r
319 allow user to delete the driver option.\r
320\r
321 @param CallbackData The BMM context data.\r
322\r
323**/\r
324VOID\r
325UpdateDrvDelPage (\r
326 IN BMM_CALLBACK_DATA *CallbackData\r
327 )\r
328{\r
329 BM_MENU_ENTRY *NewMenuEntry;\r
330 BM_LOAD_CONTEXT *NewLoadContext;\r
331 UINT16 Index;\r
332\r
333 CallbackData->BmmAskSaveOrNot = TRUE;\r
334\r
335 UpdatePageStart (CallbackData);\r
336\r
337 ASSERT (DriverOptionMenu.MenuNumber <= (sizeof (CallbackData->BmmFakeNvData.DriverOptionDel) / sizeof (CallbackData->BmmFakeNvData.DriverOptionDel[0])));\r
338 for (Index = 0; Index < DriverOptionMenu.MenuNumber; Index++) {\r
339 NewMenuEntry = BOpt_GetMenuEntry (&DriverOptionMenu, Index);\r
340\r
341 NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
342 NewLoadContext->Deleted = FALSE;\r
343\r
344 if (CallbackData->BmmFakeNvData.DriverOptionDel[Index] && !CallbackData->BmmFakeNvData.DriverOptionDelMark[Index]) {\r
345 //\r
346 // CallbackData->BmmFakeNvData.BootOptionDel[Index] == TRUE means browser knows this boot option is selected\r
347 // CallbackData->BmmFakeNvData.BootOptionDelMark[Index] = FALSE means BDS knows the selected boot option has\r
348 // deleted, browser maintains old useless info. So clear this info here, and later update this info to browser\r
349 // through HiiSetBrowserData function.\r
350 //\r
351 CallbackData->BmmFakeNvData.DriverOptionDel[Index] = FALSE;\r
7880f73a 352 CallbackData->BmmOldFakeNVData.DriverOptionDel[Index] = FALSE;\r
4af04335
DB
353 }\r
354 HiiCreateCheckBoxOpCode (\r
355 mStartOpCodeHandle,\r
356 (EFI_QUESTION_ID) (DRIVER_OPTION_DEL_QUESTION_ID + Index),\r
357 VARSTORE_ID_BOOT_MAINT,\r
358 (UINT16) (DRIVER_OPTION_DEL_VAR_OFFSET + Index),\r
359 NewMenuEntry->DisplayStringToken,\r
360 NewMenuEntry->HelpStringToken,\r
361 EFI_IFR_FLAG_CALLBACK,\r
362 0,\r
363 NULL\r
364 );\r
365 }\r
366\r
367 UpdatePageEnd (CallbackData);\r
368}\r
369\r
370/**\r
371 Prepare the page to allow user to add description for \r
372 a Driver Option.\r
373\r
374 @param CallbackData The BMM context data.\r
375\r
376**/\r
377VOID\r
378UpdateDriverAddHandleDescPage (\r
379 IN BMM_CALLBACK_DATA *CallbackData\r
380 )\r
381{\r
382 BM_MENU_ENTRY *NewMenuEntry;\r
383\r
384 CallbackData->BmmFakeNvData.DriverAddActive = 0x01;\r
385 CallbackData->BmmFakeNvData.DriverAddForceReconnect = 0x00;\r
386 CallbackData->BmmAskSaveOrNot = TRUE;\r
387 NewMenuEntry = CallbackData->MenuEntry;\r
388\r
389 UpdatePageStart (CallbackData);\r
390\r
391 HiiCreateSubTitleOpCode (\r
392 mStartOpCodeHandle,\r
393 NewMenuEntry->DisplayStringToken,\r
394 0,\r
395 0,\r
396 0\r
397 );\r
398\r
399 HiiCreateStringOpCode (\r
400 mStartOpCodeHandle,\r
401 (EFI_QUESTION_ID) DRV_ADD_HANDLE_DESC_QUESTION_ID,\r
402 VARSTORE_ID_BOOT_MAINT,\r
403 DRV_ADD_HANDLE_DESC_VAR_OFFSET,\r
404 STRING_TOKEN (STR_LOAD_OPTION_DESC),\r
405 STRING_TOKEN (STR_NULL_STRING),\r
406 0,\r
407 0,\r
408 6,\r
409 75,\r
410 NULL\r
411 );\r
412\r
413 HiiCreateCheckBoxOpCode (\r
414 mStartOpCodeHandle,\r
415 (EFI_QUESTION_ID) DRV_ADD_RECON_QUESTION_ID,\r
416 VARSTORE_ID_BOOT_MAINT,\r
417 DRV_ADD_RECON_VAR_OFFSET,\r
418 STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON),\r
419 STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON),\r
420 0,\r
421 0,\r
422 NULL\r
423 );\r
424\r
425 HiiCreateStringOpCode (\r
426 mStartOpCodeHandle,\r
427 (EFI_QUESTION_ID) DRIVER_ADD_OPTION_QUESTION_ID,\r
428 VARSTORE_ID_BOOT_MAINT,\r
429 DRIVER_ADD_OPTION_VAR_OFFSET,\r
430 STRING_TOKEN (STR_OPTIONAL_DATA),\r
431 STRING_TOKEN (STR_NULL_STRING),\r
432 0,\r
433 0,\r
434 6,\r
435 75,\r
436 NULL\r
437 );\r
438\r
439 UpdatePageEnd (CallbackData);\r
440}\r
441\r
442/**\r
443 Update console page.\r
444\r
445 @param UpdatePageId The form ID to be updated.\r
446 @param ConsoleMenu The console menu list.\r
447 @param CallbackData The BMM context data.\r
448\r
449**/\r
450VOID\r
451UpdateConsolePage (\r
452 IN UINT16 UpdatePageId,\r
453 IN BM_MENU_OPTION *ConsoleMenu,\r
454 IN BMM_CALLBACK_DATA *CallbackData\r
455 )\r
456{\r
457 BM_MENU_ENTRY *NewMenuEntry;\r
458 BM_CONSOLE_CONTEXT *NewConsoleContext;\r
459 BM_TERMINAL_CONTEXT *NewTerminalContext;\r
460 UINT16 Index;\r
461 UINT16 Index2;\r
462 UINT8 CheckFlags;\r
463 UINT8 *ConsoleCheck;\r
4af04335
DB
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
4af04335
DB
472 QuestionIdBase = 0;\r
473 VariableOffsetBase = 0;\r
4af04335
DB
474\r
475 switch (UpdatePageId) {\r
476 case FORM_CON_IN_ID:\r
477 ConsoleCheck = &CallbackData->BmmFakeNvData.ConsoleInCheck[0];\r
4af04335
DB
478 QuestionIdBase = CON_IN_DEVICE_QUESTION_ID;\r
479 VariableOffsetBase = CON_IN_DEVICE_VAR_OFFSET;\r
480 break;\r
481\r
482 case FORM_CON_OUT_ID:\r
483 ConsoleCheck = &CallbackData->BmmFakeNvData.ConsoleOutCheck[0];\r
4af04335
DB
484 QuestionIdBase = CON_OUT_DEVICE_QUESTION_ID;\r
485 VariableOffsetBase = CON_OUT_DEVICE_VAR_OFFSET;\r
486 break;\r
487\r
488 case FORM_CON_ERR_ID:\r
489 ConsoleCheck = &CallbackData->BmmFakeNvData.ConsoleErrCheck[0];\r
4af04335
DB
490 QuestionIdBase = CON_ERR_DEVICE_QUESTION_ID;\r
491 VariableOffsetBase = CON_ERR_DEVICE_VAR_OFFSET;\r
492 break;\r
493 }\r
494 ASSERT (ConsoleCheck != NULL);\r
495\r
496 for (Index = 0; ((Index < ConsoleMenu->MenuNumber) && \\r
497 (Index < MAX_MENU_NUMBER)) ; Index++) {\r
498 CheckFlags = 0;\r
499 NewMenuEntry = BOpt_GetMenuEntry (ConsoleMenu, Index);\r
500 NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;\r
501 if (NewConsoleContext->IsActive) {\r
502 CheckFlags |= EFI_IFR_CHECKBOX_DEFAULT;\r
503 ConsoleCheck[Index] = TRUE;\r
504 } else {\r
505 ConsoleCheck[Index] = FALSE;\r
506 }\r
507 HiiCreateCheckBoxOpCode (\r
508 mStartOpCodeHandle,\r
509 (EFI_QUESTION_ID) (QuestionIdBase + Index),\r
510 VARSTORE_ID_BOOT_MAINT,\r
511 (UINT16) (VariableOffsetBase + Index),\r
512 NewMenuEntry->DisplayStringToken,\r
513 NewMenuEntry->HelpStringToken,\r
a3475fe0 514 EFI_IFR_FLAG_CALLBACK,\r
4af04335
DB
515 CheckFlags,\r
516 NULL\r
517 );\r
518 }\r
519\r
520 for (Index2 = 0; ((Index2 < TerminalMenu.MenuNumber) && \\r
521 (Index2 < MAX_MENU_NUMBER)); Index2++) {\r
522 CheckFlags = 0;\r
523 NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index2);\r
524 NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
525\r
526 ASSERT (Index < MAX_MENU_NUMBER);\r
527 if (((NewTerminalContext->IsConIn != 0) && (UpdatePageId == FORM_CON_IN_ID)) ||\r
528 ((NewTerminalContext->IsConOut != 0) && (UpdatePageId == FORM_CON_OUT_ID)) ||\r
529 ((NewTerminalContext->IsStdErr != 0) && (UpdatePageId == FORM_CON_ERR_ID))\r
530 ) {\r
531 CheckFlags |= EFI_IFR_CHECKBOX_DEFAULT;\r
532 ConsoleCheck[Index] = TRUE;\r
533 } else {\r
534 ConsoleCheck[Index] = FALSE;\r
535 }\r
536 HiiCreateCheckBoxOpCode (\r
537 mStartOpCodeHandle,\r
538 (EFI_QUESTION_ID) (QuestionIdBase + Index),\r
539 VARSTORE_ID_BOOT_MAINT,\r
540 (UINT16) (VariableOffsetBase + Index),\r
541 NewMenuEntry->DisplayStringToken,\r
542 NewMenuEntry->HelpStringToken,\r
a3475fe0 543 EFI_IFR_FLAG_CALLBACK,\r
4af04335
DB
544 CheckFlags,\r
545 NULL\r
546 );\r
547\r
548 Index++;\r
549 }\r
550\r
4af04335
DB
551 UpdatePageEnd (CallbackData);\r
552}\r
553\r
554/**\r
555 Update the page's NV Map if user has changed the order\r
556 a list. This list can be Boot Order or Driver Order.\r
557\r
558 @param UpdatePageId The form ID to be updated.\r
559 @param OptionMenu The new list.\r
560 @param CallbackData The BMM context data.\r
561\r
562**/\r
563VOID\r
564UpdateOrderPage (\r
565 IN UINT16 UpdatePageId,\r
566 IN BM_MENU_OPTION *OptionMenu,\r
567 IN BMM_CALLBACK_DATA *CallbackData\r
568 )\r
569{\r
570 BM_MENU_ENTRY *NewMenuEntry;\r
571 UINT16 Index;\r
572 UINT16 OptionIndex;\r
573 VOID *OptionsOpCodeHandle;\r
4af04335
DB
574 BOOLEAN BootOptionFound;\r
575 UINT32 *OptionOrder;\r
576 EFI_QUESTION_ID QuestionId;\r
577 UINT16 VarOffset;\r
578\r
579 CallbackData->BmmAskSaveOrNot = TRUE;\r
580 UpdatePageStart (CallbackData);\r
581\r
582 OptionOrder = NULL;\r
583 QuestionId = 0;\r
584 VarOffset = 0;\r
585 switch (UpdatePageId) { \r
586 \r
587 case FORM_BOOT_CHG_ID:\r
2c30541a
DB
588 //\r
589 // If the BootOptionOrder in the BmmFakeNvData are same with the date in the BmmOldFakeNVData,\r
590 // means all Boot Options has been save in BootOptionMenu, we can get the date from the menu.\r
591 // else means browser maintains some uncommitted date which are not saved in BootOptionMenu,\r
592 // so we should not get the data from BootOptionMenu to show it.\r
593 //\r
594 if (CompareMem (CallbackData->BmmFakeNvData.BootOptionOrder, CallbackData->BmmOldFakeNVData.BootOptionOrder, sizeof (CallbackData->BmmFakeNvData.BootOptionOrder)) == 0) {\r
595 GetBootOrder (CallbackData);\r
596 }\r
4af04335
DB
597 OptionOrder = CallbackData->BmmFakeNvData.BootOptionOrder;\r
598 QuestionId = BOOT_OPTION_ORDER_QUESTION_ID;\r
599 VarOffset = BOOT_OPTION_ORDER_VAR_OFFSET;\r
600 break;\r
601 \r
602 case FORM_DRV_CHG_ID:\r
2c30541a
DB
603 //\r
604 // If the DriverOptionOrder in the BmmFakeNvData are same with the date in the BmmOldFakeNVData,\r
605 // means all Driver Options has been save in DriverOptionMenu, we can get the DriverOptionOrder from the menu.\r
606 // else means browser maintains some uncommitted date which are not saved in DriverOptionMenu,\r
607 // so we should not get the data from DriverOptionMenu to show it.\r
608 //\r
609 if (CompareMem (CallbackData->BmmFakeNvData.DriverOptionOrder, CallbackData->BmmOldFakeNVData.DriverOptionOrder, sizeof (CallbackData->BmmFakeNvData.DriverOptionOrder)) == 0) {\r
610 GetDriverOrder (CallbackData);\r
611 }\r
4af04335
DB
612 OptionOrder = CallbackData->BmmFakeNvData.DriverOptionOrder;\r
613 QuestionId = DRIVER_OPTION_ORDER_QUESTION_ID;\r
614 VarOffset = DRIVER_OPTION_ORDER_VAR_OFFSET;\r
615 break;\r
616 } \r
617 ASSERT (OptionOrder != NULL); \r
618 \r
619 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
620 ASSERT (OptionsOpCodeHandle != NULL);\r
621 \r
622 NewMenuEntry = NULL;\r
623 for (OptionIndex = 0; (OptionOrder[OptionIndex] != 0 && OptionIndex < MAX_MENU_NUMBER); OptionIndex++) {\r
624 BootOptionFound = FALSE;\r
625 for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {\r
626 NewMenuEntry = BOpt_GetMenuEntry (OptionMenu, Index);\r
4af04335
DB
627 if ((UINT32) (NewMenuEntry->OptionNumber + 1) == OptionOrder[OptionIndex]) {\r
628 BootOptionFound = TRUE;\r
629 break;\r
630 }\r
631 }\r
632 if (BootOptionFound) {\r
633 HiiCreateOneOfOptionOpCode (\r
634 OptionsOpCodeHandle,\r
635 NewMenuEntry->DisplayStringToken,\r
636 0,\r
637 EFI_IFR_TYPE_NUM_SIZE_32,\r
638 OptionOrder[OptionIndex]\r
639 );\r
640 }\r
641 }\r
642 \r
643 if (OptionMenu->MenuNumber > 0) {\r
644 HiiCreateOrderedListOpCode ( \r
645 mStartOpCodeHandle, // Container for dynamic created opcodes \r
646 QuestionId, // Question ID \r
647 VARSTORE_ID_BOOT_MAINT, // VarStore ID \r
648 VarOffset, // Offset in Buffer Storage \r
649 STRING_TOKEN (STR_CHANGE_ORDER), // Question prompt text \r
650 STRING_TOKEN (STR_CHANGE_ORDER), // Question help text \r
651 0, // Question flag \r
652 0, // Ordered list flag, e.g. EFI_IFR_UNIQUE_SET\r
653 EFI_IFR_TYPE_NUM_SIZE_32, // Data type of Question value \r
654 100, // Maximum container \r
655 OptionsOpCodeHandle, // Option Opcode list \r
656 NULL // Default Opcode is NULL \r
657 );\r
658 }\r
659\r
660 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
661\r
662 UpdatePageEnd (CallbackData);\r
663\r
664}\r
665\r
4af04335
DB
666/**\r
667 Refresh the text mode page.\r
668\r
669 @param CallbackData The BMM context data.\r
670\r
671**/\r
672VOID\r
673UpdateConModePage (\r
674 IN BMM_CALLBACK_DATA *CallbackData\r
675 )\r
676{\r
677 UINTN Mode;\r
678 UINTN Index;\r
679 UINTN Col;\r
680 UINTN Row;\r
681 CHAR16 ModeString[50];\r
682 CHAR16 *PStr;\r
683 UINTN MaxMode;\r
684 UINTN ValidMode;\r
685 EFI_STRING_ID *ModeToken;\r
686 EFI_STATUS Status;\r
687 VOID *OptionsOpCodeHandle;\r
688 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *ConOut;\r
689\r
690 ConOut = gST->ConOut;\r
691 Index = 0;\r
692 ValidMode = 0;\r
693 MaxMode = (UINTN) (ConOut->Mode->MaxMode);\r
694\r
695 CallbackData->BmmAskSaveOrNot = TRUE;\r
696\r
697 UpdatePageStart (CallbackData);\r
698\r
699 //\r
700 // Check valid mode\r
701 //\r
702 for (Mode = 0; Mode < MaxMode; Mode++) {\r
703 Status = ConOut->QueryMode (ConOut, Mode, &Col, &Row);\r
704 if (EFI_ERROR (Status)) {\r
705 continue;\r
706 }\r
707 ValidMode++;\r
708 }\r
709\r
710 if (ValidMode == 0) {\r
711 return;\r
712 }\r
713\r
714 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
715 ASSERT (OptionsOpCodeHandle != NULL);\r
716\r
717 ModeToken = AllocateZeroPool (sizeof (EFI_STRING_ID) * ValidMode);\r
718 ASSERT(ModeToken != NULL);\r
719\r
720 //\r
721 // Determin which mode should be the first entry in menu\r
722 //\r
723 GetConsoleOutMode (CallbackData);\r
724\r
725 //\r
726 // Build text mode options\r
727 //\r
728 for (Mode = 0; Mode < MaxMode; Mode++) {\r
729 Status = ConOut->QueryMode (ConOut, Mode, &Col, &Row);\r
730 if (EFI_ERROR (Status)) {\r
731 continue;\r
732 }\r
733 \r
734 //\r
735 // Build mode string Column x Row\r
736 //\r
737 UnicodeValueToString (ModeString, 0, Col, 0);\r
738 PStr = &ModeString[0];\r
6eeeb288 739 StrnCatS (PStr, ARRAY_SIZE (ModeString), L" x ", StrLen(L" x ") + 1);\r
4af04335
DB
740 PStr = PStr + StrLen (PStr);\r
741 UnicodeValueToString (PStr , 0, Row, 0);\r
742\r
743 ModeToken[Index] = HiiSetString (CallbackData->BmmHiiHandle, 0, ModeString, NULL);\r
744\r
745 if (Mode == CallbackData->BmmFakeNvData.ConsoleOutMode) {\r
746 HiiCreateOneOfOptionOpCode (\r
747 OptionsOpCodeHandle,\r
748 ModeToken[Index],\r
749 EFI_IFR_OPTION_DEFAULT,\r
750 EFI_IFR_TYPE_NUM_SIZE_16,\r
751 (UINT16) Mode\r
752 );\r
753 } else {\r
754 HiiCreateOneOfOptionOpCode (\r
755 OptionsOpCodeHandle,\r
756 ModeToken[Index],\r
757 0,\r
758 EFI_IFR_TYPE_NUM_SIZE_16,\r
759 (UINT16) Mode\r
760 );\r
761 }\r
762 Index++;\r
763 }\r
764\r
765 HiiCreateOneOfOpCode (\r
766 mStartOpCodeHandle,\r
767 (EFI_QUESTION_ID) CON_MODE_QUESTION_ID,\r
768 VARSTORE_ID_BOOT_MAINT,\r
769 CON_MODE_VAR_OFFSET,\r
770 STRING_TOKEN (STR_CON_MODE_SETUP),\r
771 STRING_TOKEN (STR_CON_MODE_SETUP),\r
772 EFI_IFR_FLAG_RESET_REQUIRED,\r
773 EFI_IFR_NUMERIC_SIZE_2,\r
774 OptionsOpCodeHandle,\r
775 NULL\r
776 );\r
777\r
778 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
779 FreePool (ModeToken);\r
780\r
781 UpdatePageEnd (CallbackData);\r
782}\r
783\r
784 /**\r
785 Create the dynamic page which allows user to set the property such as Baud Rate, Data Bits,\r
786 Parity, Stop Bits, Terminal Type.\r
787\r
788 @param CallbackData The BMM context data.\r
789\r
790**/\r
791VOID\r
792UpdateTerminalPage (\r
793 IN BMM_CALLBACK_DATA *CallbackData\r
794 )\r
795{\r
796 UINT8 Index;\r
797 UINT8 CheckFlags;\r
798 BM_MENU_ENTRY *NewMenuEntry;\r
799 VOID *OptionsOpCodeHandle;\r
800 UINTN CurrentTerminal;\r
801\r
802 CallbackData->BmmAskSaveOrNot = TRUE;\r
803\r
804 UpdatePageStart (CallbackData);\r
805\r
806 CurrentTerminal = CallbackData->CurrentTerminal;\r
807 NewMenuEntry = BOpt_GetMenuEntry (\r
808 &TerminalMenu,\r
809 CurrentTerminal\r
810 );\r
811\r
812 if (NewMenuEntry == NULL) {\r
813 return ;\r
814 }\r
815\r
816 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
817 ASSERT (OptionsOpCodeHandle != NULL);\r
818\r
819 for (Index = 0; Index < sizeof (BaudRateList) / sizeof (BaudRateList [0]); Index++) {\r
820 CheckFlags = 0;\r
821 if (BaudRateList[Index].Value == 115200) {\r
822 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
823 }\r
824 HiiCreateOneOfOptionOpCode (\r
825 OptionsOpCodeHandle,\r
826 BaudRateList[Index].StringToken,\r
827 CheckFlags,\r
828 EFI_IFR_TYPE_NUM_SIZE_8,\r
829 Index\r
830 );\r
831 }\r
832\r
833 HiiCreateOneOfOpCode (\r
834 mStartOpCodeHandle,\r
835 (EFI_QUESTION_ID) (COM_BAUD_RATE_QUESTION_ID + CurrentTerminal),\r
836 VARSTORE_ID_BOOT_MAINT,\r
837 (UINT16) (COM_BAUD_RATE_VAR_OFFSET + CurrentTerminal),\r
838 STRING_TOKEN (STR_COM_BAUD_RATE),\r
839 STRING_TOKEN (STR_COM_BAUD_RATE),\r
a3475fe0 840 EFI_IFR_FLAG_CALLBACK,\r
4af04335
DB
841 EFI_IFR_NUMERIC_SIZE_1,\r
842 OptionsOpCodeHandle,\r
843 NULL\r
844 );\r
845 \r
846 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
847 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
848 ASSERT (OptionsOpCodeHandle != NULL);\r
849\r
6eeeb288 850 for (Index = 0; Index < ARRAY_SIZE (DataBitsList); Index++) {\r
4af04335
DB
851 CheckFlags = 0;\r
852\r
853 if (DataBitsList[Index].Value == 8) {\r
854 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
855 }\r
856\r
857 HiiCreateOneOfOptionOpCode (\r
858 OptionsOpCodeHandle,\r
859 DataBitsList[Index].StringToken,\r
860 CheckFlags,\r
861 EFI_IFR_TYPE_NUM_SIZE_8,\r
862 Index\r
863 );\r
864 }\r
865\r
866 HiiCreateOneOfOpCode (\r
867 mStartOpCodeHandle,\r
868 (EFI_QUESTION_ID) (COM_DATA_RATE_QUESTION_ID + CurrentTerminal),\r
869 VARSTORE_ID_BOOT_MAINT,\r
870 (UINT16) (COM_DATA_RATE_VAR_OFFSET + CurrentTerminal),\r
871 STRING_TOKEN (STR_COM_DATA_BITS),\r
872 STRING_TOKEN (STR_COM_DATA_BITS),\r
a3475fe0 873 EFI_IFR_FLAG_CALLBACK,\r
4af04335
DB
874 EFI_IFR_NUMERIC_SIZE_1,\r
875 OptionsOpCodeHandle,\r
876 NULL\r
877 );\r
878\r
879 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
880 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
881 ASSERT (OptionsOpCodeHandle != NULL);\r
882\r
6eeeb288 883 for (Index = 0; Index < ARRAY_SIZE (ParityList); Index++) {\r
4af04335
DB
884 CheckFlags = 0;\r
885 if (ParityList[Index].Value == NoParity) {\r
886 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
887 }\r
888\r
889 HiiCreateOneOfOptionOpCode (\r
890 OptionsOpCodeHandle,\r
891 ParityList[Index].StringToken,\r
892 CheckFlags,\r
893 EFI_IFR_TYPE_NUM_SIZE_8,\r
894 Index\r
895 );\r
896 }\r
897\r
898 HiiCreateOneOfOpCode (\r
899 mStartOpCodeHandle,\r
900 (EFI_QUESTION_ID) (COM_PARITY_QUESTION_ID + CurrentTerminal),\r
901 VARSTORE_ID_BOOT_MAINT,\r
902 (UINT16) (COM_PARITY_VAR_OFFSET + CurrentTerminal),\r
903 STRING_TOKEN (STR_COM_PARITY),\r
904 STRING_TOKEN (STR_COM_PARITY),\r
a3475fe0 905 EFI_IFR_FLAG_CALLBACK,\r
4af04335
DB
906 EFI_IFR_NUMERIC_SIZE_1,\r
907 OptionsOpCodeHandle,\r
908 NULL\r
909 );\r
910\r
911 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
912 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
913 ASSERT (OptionsOpCodeHandle != NULL);\r
914\r
6eeeb288 915 for (Index = 0; Index < ARRAY_SIZE (StopBitsList); Index++) {\r
4af04335
DB
916 CheckFlags = 0;\r
917 if (StopBitsList[Index].Value == OneStopBit) {\r
918 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
919 }\r
920\r
921 HiiCreateOneOfOptionOpCode (\r
922 OptionsOpCodeHandle,\r
923 StopBitsList[Index].StringToken,\r
924 CheckFlags,\r
925 EFI_IFR_TYPE_NUM_SIZE_8,\r
926 Index\r
927 );\r
928 }\r
929\r
930 HiiCreateOneOfOpCode (\r
931 mStartOpCodeHandle,\r
932 (EFI_QUESTION_ID) (COM_STOP_BITS_QUESTION_ID + CurrentTerminal),\r
933 VARSTORE_ID_BOOT_MAINT,\r
934 (UINT16) (COM_STOP_BITS_VAR_OFFSET + CurrentTerminal),\r
935 STRING_TOKEN (STR_COM_STOP_BITS),\r
936 STRING_TOKEN (STR_COM_STOP_BITS),\r
a3475fe0 937 EFI_IFR_FLAG_CALLBACK,\r
4af04335
DB
938 EFI_IFR_NUMERIC_SIZE_1,\r
939 OptionsOpCodeHandle,\r
940 NULL\r
941 );\r
942\r
943 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
944 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
945 ASSERT (OptionsOpCodeHandle != NULL);\r
946\r
6eeeb288 947 for (Index = 0; Index < ARRAY_SIZE (TerminalType); Index++) {\r
4af04335
DB
948 CheckFlags = 0;\r
949 if (Index == 0) {\r
950 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
951 }\r
952\r
953 HiiCreateOneOfOptionOpCode (\r
954 OptionsOpCodeHandle,\r
955 (EFI_STRING_ID) TerminalType[Index],\r
956 CheckFlags,\r
957 EFI_IFR_TYPE_NUM_SIZE_8,\r
958 Index\r
959 );\r
960 }\r
961\r
962 HiiCreateOneOfOpCode (\r
963 mStartOpCodeHandle,\r
964 (EFI_QUESTION_ID) (COM_TERMINAL_QUESTION_ID + CurrentTerminal),\r
965 VARSTORE_ID_BOOT_MAINT,\r
966 (UINT16) (COM_TERMINAL_VAR_OFFSET + CurrentTerminal),\r
967 STRING_TOKEN (STR_COM_TERMI_TYPE),\r
968 STRING_TOKEN (STR_COM_TERMI_TYPE),\r
a3475fe0 969 EFI_IFR_FLAG_CALLBACK,\r
4af04335
DB
970 EFI_IFR_NUMERIC_SIZE_1,\r
971 OptionsOpCodeHandle,\r
972 NULL\r
973 );\r
974\r
975 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
976 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
977 ASSERT (OptionsOpCodeHandle != NULL);\r
978\r
6eeeb288 979 for (Index = 0; Index < ARRAY_SIZE (mFlowControlType); Index++) {\r
4af04335
DB
980 CheckFlags = 0;\r
981 if (Index == 0) {\r
982 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
983 }\r
984 HiiCreateOneOfOptionOpCode (\r
985 OptionsOpCodeHandle,\r
986 (EFI_STRING_ID) mFlowControlType[Index],\r
987 CheckFlags,\r
988 EFI_IFR_TYPE_NUM_SIZE_8,\r
989 mFlowControlValue[Index]\r
990 );\r
991 }\r
992\r
993 HiiCreateOneOfOpCode (\r
994 mStartOpCodeHandle,\r
995 (EFI_QUESTION_ID) (COM_FLOWCONTROL_QUESTION_ID + CurrentTerminal),\r
996 VARSTORE_ID_BOOT_MAINT,\r
997 (UINT16) (COM_FLOWCONTROL_VAR_OFFSET + CurrentTerminal),\r
998 STRING_TOKEN (STR_COM_FLOW_CONTROL),\r
999 STRING_TOKEN (STR_COM_FLOW_CONTROL),\r
a3475fe0 1000 EFI_IFR_FLAG_CALLBACK,\r
4af04335
DB
1001 EFI_IFR_NUMERIC_SIZE_1,\r
1002 OptionsOpCodeHandle,\r
1003 NULL\r
1004 );\r
1005\r
1006 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
1007\r
1008 UpdatePageEnd (CallbackData);\r
1009}\r
1010 \r
1011/**\r
1012Update add boot/driver option page.\r
1013\r
1014@param CallbackData The BMM context data.\r
1015@param FormId The form ID to be updated.\r
1016@param DevicePath Device path.\r
1017\r
1018**/\r
1019VOID\r
1020UpdateOptionPage(\r
1021 IN BMM_CALLBACK_DATA *CallbackData,\r
1022 IN EFI_FORM_ID FormId,\r
1023 IN EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
1024 )\r
1025{\r
1026 CHAR16 *String;\r
1027 EFI_STRING_ID StringToken;\r
1028\r
a91f1a0e
BD
1029 String = NULL;\r
1030\r
4af04335
DB
1031 if (DevicePath != NULL){\r
1032 String = ExtractFileNameFromDevicePath(DevicePath);\r
a91f1a0e
BD
1033 }\r
1034 if (String == NULL) {\r
4af04335
DB
1035 String = HiiGetString (CallbackData->BmmHiiHandle, STRING_TOKEN (STR_NULL_STRING), NULL);\r
1036 ASSERT (String != NULL);\r
4af04335
DB
1037 }\r
1038\r
a91f1a0e
BD
1039 StringToken = HiiSetString (CallbackData->BmmHiiHandle, 0, String, NULL);\r
1040 FreePool (String);\r
1041\r
4af04335
DB
1042 if(FormId == FORM_BOOT_ADD_ID){\r
1043 if (!CallbackData->BmmFakeNvData.BootOptionChanged) {\r
1044 ZeroMem (CallbackData->BmmFakeNvData.BootOptionalData, sizeof (CallbackData->BmmFakeNvData.BootOptionalData));\r
1045 ZeroMem (CallbackData->BmmFakeNvData.BootDescriptionData, sizeof (CallbackData->BmmFakeNvData.BootDescriptionData));\r
7880f73a
DB
1046 ZeroMem (CallbackData->BmmOldFakeNVData.BootOptionalData, sizeof (CallbackData->BmmOldFakeNVData.BootOptionalData));\r
1047 ZeroMem (CallbackData->BmmOldFakeNVData.BootDescriptionData, sizeof (CallbackData->BmmOldFakeNVData.BootDescriptionData));\r
4af04335
DB
1048 }\r
1049 } else if (FormId == FORM_DRV_ADD_FILE_ID){\r
1050 if (!CallbackData->BmmFakeNvData.DriverOptionChanged) {\r
1051 ZeroMem (CallbackData->BmmFakeNvData.DriverOptionalData, sizeof (CallbackData->BmmFakeNvData.DriverOptionalData));\r
1052 ZeroMem (CallbackData->BmmFakeNvData.DriverDescriptionData, sizeof (CallbackData->BmmFakeNvData.DriverDescriptionData));\r
7880f73a
DB
1053 ZeroMem (CallbackData->BmmOldFakeNVData.DriverOptionalData, sizeof (CallbackData->BmmOldFakeNVData.DriverOptionalData));\r
1054 ZeroMem (CallbackData->BmmOldFakeNVData.DriverDescriptionData, sizeof (CallbackData->BmmOldFakeNVData.DriverDescriptionData));\r
4af04335
DB
1055 }\r
1056 }\r
1057\r
1058 RefreshUpdateData();\r
1059 mStartLabel->Number = FormId;\r
1060\r
1061 HiiCreateSubTitleOpCode (\r
1062 mStartOpCodeHandle,\r
1063 StringToken,\r
1064 0,\r
1065 0,\r
1066 0\r
1067 );\r
1068\r
1069 HiiUpdateForm (\r
1070 CallbackData->BmmHiiHandle,\r
1071 &mBootMaintGuid,\r
1072 FormId,\r
1073 mStartOpCodeHandle,// Label FormId\r
1074 mEndOpCodeHandle // LABEL_END\r
1075 );\r
1076}\r
1077\r
1078/**\r
1079 Dispatch the correct update page function to call based on\r
1080 the UpdatePageId.\r
1081\r
1082 @param UpdatePageId The form ID.\r
1083 @param CallbackData The BMM context data.\r
1084\r
1085**/\r
1086VOID\r
1087UpdatePageBody (\r
1088 IN UINT16 UpdatePageId,\r
1089 IN BMM_CALLBACK_DATA *CallbackData\r
1090 )\r
1091{\r
1092 CleanUpPage (UpdatePageId, CallbackData);\r
1093 switch (UpdatePageId) {\r
1094 case FORM_CON_IN_ID:\r
1095 UpdateConsolePage (UpdatePageId, &ConsoleInpMenu, CallbackData);\r
1096 break;\r
1097\r
1098 case FORM_CON_OUT_ID:\r
1099 UpdateConsolePage (UpdatePageId, &ConsoleOutMenu, CallbackData);\r
1100 break;\r
1101\r
1102 case FORM_CON_ERR_ID:\r
1103 UpdateConsolePage (UpdatePageId, &ConsoleErrMenu, CallbackData);\r
1104 break;\r
1105\r
1106 case FORM_BOOT_CHG_ID:\r
1107 UpdateOrderPage (UpdatePageId, &BootOptionMenu, CallbackData);\r
1108 break;\r
1109\r
1110 case FORM_DRV_CHG_ID:\r
1111 UpdateOrderPage (UpdatePageId, &DriverOptionMenu, CallbackData);\r
1112 break;\r
1113\r
1114 default:\r
1115 break;\r
1116 }\r
1117}\r
1118\r
1119/**\r
1120 Dispatch the display to the next page based on NewPageId.\r
1121\r
1122 @param Private The BMM context data.\r
1123 @param NewPageId The original page ID.\r
1124\r
1125**/\r
1126VOID\r
1127UpdatePageId (\r
1128 BMM_CALLBACK_DATA *Private,\r
1129 UINT16 NewPageId\r
1130 )\r
1131{\r
1132 if ((NewPageId < FILE_OPTION_OFFSET) && (NewPageId >= HANDLE_OPTION_OFFSET)) {\r
1133 //\r
1134 // If we select a handle to add driver option, advance to the add handle description page.\r
1135 //\r
1136 NewPageId = FORM_DRV_ADD_HANDLE_DESC_ID;\r
1137 } else if ((NewPageId == KEY_VALUE_SAVE_AND_EXIT) || (NewPageId == KEY_VALUE_NO_SAVE_AND_EXIT)) {\r
1138 //\r
1139 // Return to main page after "Save Changes" or "Discard Changes".\r
1140 //\r
1141 NewPageId = FORM_MAIN_ID;\r
1142 } else if ((NewPageId >= TERMINAL_OPTION_OFFSET) && (NewPageId < CONSOLE_OPTION_OFFSET)) {\r
1143 NewPageId = FORM_CON_COM_SETUP_ID;\r
1144 }\r
1145\r
1146 if ((NewPageId > 0) && (NewPageId < MAXIMUM_FORM_ID)) {\r
1147 Private->BmmPreviousPageId = Private->BmmCurrentPageId;\r
1148 Private->BmmCurrentPageId = NewPageId;\r
1149 }\r
1150}\r