]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Library/BootMaintenanceManagerUiLib/UpdatePage.c
MdeModulePkg: 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
9f4048f7 4Copyright (c) 2004 - 2017, 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
9f4048f7 737 UnicodeValueToStringS (ModeString, sizeof (ModeString), 0, Col, 0);\r
4af04335 738 PStr = &ModeString[0];\r
6eeeb288 739 StrnCatS (PStr, ARRAY_SIZE (ModeString), L" x ", StrLen(L" x ") + 1);\r
4af04335 740 PStr = PStr + StrLen (PStr);\r
9f4048f7
HW
741 UnicodeValueToStringS (\r
742 PStr,\r
743 sizeof (ModeString) - ((UINTN)PStr - (UINTN)&ModeString[0]),\r
744 0,\r
745 Row,\r
746 0\r
747 );\r
4af04335
DB
748\r
749 ModeToken[Index] = HiiSetString (CallbackData->BmmHiiHandle, 0, ModeString, NULL);\r
750\r
751 if (Mode == CallbackData->BmmFakeNvData.ConsoleOutMode) {\r
752 HiiCreateOneOfOptionOpCode (\r
753 OptionsOpCodeHandle,\r
754 ModeToken[Index],\r
755 EFI_IFR_OPTION_DEFAULT,\r
756 EFI_IFR_TYPE_NUM_SIZE_16,\r
757 (UINT16) Mode\r
758 );\r
759 } else {\r
760 HiiCreateOneOfOptionOpCode (\r
761 OptionsOpCodeHandle,\r
762 ModeToken[Index],\r
763 0,\r
764 EFI_IFR_TYPE_NUM_SIZE_16,\r
765 (UINT16) Mode\r
766 );\r
767 }\r
768 Index++;\r
769 }\r
770\r
771 HiiCreateOneOfOpCode (\r
772 mStartOpCodeHandle,\r
773 (EFI_QUESTION_ID) CON_MODE_QUESTION_ID,\r
774 VARSTORE_ID_BOOT_MAINT,\r
775 CON_MODE_VAR_OFFSET,\r
776 STRING_TOKEN (STR_CON_MODE_SETUP),\r
777 STRING_TOKEN (STR_CON_MODE_SETUP),\r
778 EFI_IFR_FLAG_RESET_REQUIRED,\r
779 EFI_IFR_NUMERIC_SIZE_2,\r
780 OptionsOpCodeHandle,\r
781 NULL\r
782 );\r
783\r
784 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
785 FreePool (ModeToken);\r
786\r
787 UpdatePageEnd (CallbackData);\r
788}\r
789\r
790 /**\r
791 Create the dynamic page which allows user to set the property such as Baud Rate, Data Bits,\r
792 Parity, Stop Bits, Terminal Type.\r
793\r
794 @param CallbackData The BMM context data.\r
795\r
796**/\r
797VOID\r
798UpdateTerminalPage (\r
799 IN BMM_CALLBACK_DATA *CallbackData\r
800 )\r
801{\r
802 UINT8 Index;\r
803 UINT8 CheckFlags;\r
804 BM_MENU_ENTRY *NewMenuEntry;\r
805 VOID *OptionsOpCodeHandle;\r
806 UINTN CurrentTerminal;\r
807\r
808 CallbackData->BmmAskSaveOrNot = TRUE;\r
809\r
810 UpdatePageStart (CallbackData);\r
811\r
812 CurrentTerminal = CallbackData->CurrentTerminal;\r
813 NewMenuEntry = BOpt_GetMenuEntry (\r
814 &TerminalMenu,\r
815 CurrentTerminal\r
816 );\r
817\r
818 if (NewMenuEntry == NULL) {\r
819 return ;\r
820 }\r
821\r
822 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
823 ASSERT (OptionsOpCodeHandle != NULL);\r
824\r
825 for (Index = 0; Index < sizeof (BaudRateList) / sizeof (BaudRateList [0]); Index++) {\r
826 CheckFlags = 0;\r
827 if (BaudRateList[Index].Value == 115200) {\r
828 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
829 }\r
830 HiiCreateOneOfOptionOpCode (\r
831 OptionsOpCodeHandle,\r
832 BaudRateList[Index].StringToken,\r
833 CheckFlags,\r
834 EFI_IFR_TYPE_NUM_SIZE_8,\r
835 Index\r
836 );\r
837 }\r
838\r
839 HiiCreateOneOfOpCode (\r
840 mStartOpCodeHandle,\r
841 (EFI_QUESTION_ID) (COM_BAUD_RATE_QUESTION_ID + CurrentTerminal),\r
842 VARSTORE_ID_BOOT_MAINT,\r
843 (UINT16) (COM_BAUD_RATE_VAR_OFFSET + CurrentTerminal),\r
844 STRING_TOKEN (STR_COM_BAUD_RATE),\r
845 STRING_TOKEN (STR_COM_BAUD_RATE),\r
a3475fe0 846 EFI_IFR_FLAG_CALLBACK,\r
4af04335
DB
847 EFI_IFR_NUMERIC_SIZE_1,\r
848 OptionsOpCodeHandle,\r
849 NULL\r
850 );\r
851 \r
852 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
853 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
854 ASSERT (OptionsOpCodeHandle != NULL);\r
855\r
6eeeb288 856 for (Index = 0; Index < ARRAY_SIZE (DataBitsList); Index++) {\r
4af04335
DB
857 CheckFlags = 0;\r
858\r
859 if (DataBitsList[Index].Value == 8) {\r
860 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
861 }\r
862\r
863 HiiCreateOneOfOptionOpCode (\r
864 OptionsOpCodeHandle,\r
865 DataBitsList[Index].StringToken,\r
866 CheckFlags,\r
867 EFI_IFR_TYPE_NUM_SIZE_8,\r
868 Index\r
869 );\r
870 }\r
871\r
872 HiiCreateOneOfOpCode (\r
873 mStartOpCodeHandle,\r
874 (EFI_QUESTION_ID) (COM_DATA_RATE_QUESTION_ID + CurrentTerminal),\r
875 VARSTORE_ID_BOOT_MAINT,\r
876 (UINT16) (COM_DATA_RATE_VAR_OFFSET + CurrentTerminal),\r
877 STRING_TOKEN (STR_COM_DATA_BITS),\r
878 STRING_TOKEN (STR_COM_DATA_BITS),\r
a3475fe0 879 EFI_IFR_FLAG_CALLBACK,\r
4af04335
DB
880 EFI_IFR_NUMERIC_SIZE_1,\r
881 OptionsOpCodeHandle,\r
882 NULL\r
883 );\r
884\r
885 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
886 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
887 ASSERT (OptionsOpCodeHandle != NULL);\r
888\r
6eeeb288 889 for (Index = 0; Index < ARRAY_SIZE (ParityList); Index++) {\r
4af04335
DB
890 CheckFlags = 0;\r
891 if (ParityList[Index].Value == NoParity) {\r
892 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
893 }\r
894\r
895 HiiCreateOneOfOptionOpCode (\r
896 OptionsOpCodeHandle,\r
897 ParityList[Index].StringToken,\r
898 CheckFlags,\r
899 EFI_IFR_TYPE_NUM_SIZE_8,\r
900 Index\r
901 );\r
902 }\r
903\r
904 HiiCreateOneOfOpCode (\r
905 mStartOpCodeHandle,\r
906 (EFI_QUESTION_ID) (COM_PARITY_QUESTION_ID + CurrentTerminal),\r
907 VARSTORE_ID_BOOT_MAINT,\r
908 (UINT16) (COM_PARITY_VAR_OFFSET + CurrentTerminal),\r
909 STRING_TOKEN (STR_COM_PARITY),\r
910 STRING_TOKEN (STR_COM_PARITY),\r
a3475fe0 911 EFI_IFR_FLAG_CALLBACK,\r
4af04335
DB
912 EFI_IFR_NUMERIC_SIZE_1,\r
913 OptionsOpCodeHandle,\r
914 NULL\r
915 );\r
916\r
917 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
918 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
919 ASSERT (OptionsOpCodeHandle != NULL);\r
920\r
6eeeb288 921 for (Index = 0; Index < ARRAY_SIZE (StopBitsList); Index++) {\r
4af04335
DB
922 CheckFlags = 0;\r
923 if (StopBitsList[Index].Value == OneStopBit) {\r
924 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
925 }\r
926\r
927 HiiCreateOneOfOptionOpCode (\r
928 OptionsOpCodeHandle,\r
929 StopBitsList[Index].StringToken,\r
930 CheckFlags,\r
931 EFI_IFR_TYPE_NUM_SIZE_8,\r
932 Index\r
933 );\r
934 }\r
935\r
936 HiiCreateOneOfOpCode (\r
937 mStartOpCodeHandle,\r
938 (EFI_QUESTION_ID) (COM_STOP_BITS_QUESTION_ID + CurrentTerminal),\r
939 VARSTORE_ID_BOOT_MAINT,\r
940 (UINT16) (COM_STOP_BITS_VAR_OFFSET + CurrentTerminal),\r
941 STRING_TOKEN (STR_COM_STOP_BITS),\r
942 STRING_TOKEN (STR_COM_STOP_BITS),\r
a3475fe0 943 EFI_IFR_FLAG_CALLBACK,\r
4af04335
DB
944 EFI_IFR_NUMERIC_SIZE_1,\r
945 OptionsOpCodeHandle,\r
946 NULL\r
947 );\r
948\r
949 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
950 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
951 ASSERT (OptionsOpCodeHandle != NULL);\r
952\r
6eeeb288 953 for (Index = 0; Index < ARRAY_SIZE (TerminalType); Index++) {\r
4af04335
DB
954 CheckFlags = 0;\r
955 if (Index == 0) {\r
956 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
957 }\r
958\r
959 HiiCreateOneOfOptionOpCode (\r
960 OptionsOpCodeHandle,\r
961 (EFI_STRING_ID) TerminalType[Index],\r
962 CheckFlags,\r
963 EFI_IFR_TYPE_NUM_SIZE_8,\r
964 Index\r
965 );\r
966 }\r
967\r
968 HiiCreateOneOfOpCode (\r
969 mStartOpCodeHandle,\r
970 (EFI_QUESTION_ID) (COM_TERMINAL_QUESTION_ID + CurrentTerminal),\r
971 VARSTORE_ID_BOOT_MAINT,\r
972 (UINT16) (COM_TERMINAL_VAR_OFFSET + CurrentTerminal),\r
973 STRING_TOKEN (STR_COM_TERMI_TYPE),\r
974 STRING_TOKEN (STR_COM_TERMI_TYPE),\r
a3475fe0 975 EFI_IFR_FLAG_CALLBACK,\r
4af04335
DB
976 EFI_IFR_NUMERIC_SIZE_1,\r
977 OptionsOpCodeHandle,\r
978 NULL\r
979 );\r
980\r
981 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
982 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
983 ASSERT (OptionsOpCodeHandle != NULL);\r
984\r
6eeeb288 985 for (Index = 0; Index < ARRAY_SIZE (mFlowControlType); Index++) {\r
4af04335
DB
986 CheckFlags = 0;\r
987 if (Index == 0) {\r
988 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
989 }\r
990 HiiCreateOneOfOptionOpCode (\r
991 OptionsOpCodeHandle,\r
992 (EFI_STRING_ID) mFlowControlType[Index],\r
993 CheckFlags,\r
994 EFI_IFR_TYPE_NUM_SIZE_8,\r
995 mFlowControlValue[Index]\r
996 );\r
997 }\r
998\r
999 HiiCreateOneOfOpCode (\r
1000 mStartOpCodeHandle,\r
1001 (EFI_QUESTION_ID) (COM_FLOWCONTROL_QUESTION_ID + CurrentTerminal),\r
1002 VARSTORE_ID_BOOT_MAINT,\r
1003 (UINT16) (COM_FLOWCONTROL_VAR_OFFSET + CurrentTerminal),\r
1004 STRING_TOKEN (STR_COM_FLOW_CONTROL),\r
1005 STRING_TOKEN (STR_COM_FLOW_CONTROL),\r
a3475fe0 1006 EFI_IFR_FLAG_CALLBACK,\r
4af04335
DB
1007 EFI_IFR_NUMERIC_SIZE_1,\r
1008 OptionsOpCodeHandle,\r
1009 NULL\r
1010 );\r
1011\r
1012 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
1013\r
1014 UpdatePageEnd (CallbackData);\r
1015}\r
1016 \r
1017/**\r
1018Update add boot/driver option page.\r
1019\r
1020@param CallbackData The BMM context data.\r
1021@param FormId The form ID to be updated.\r
1022@param DevicePath Device path.\r
1023\r
1024**/\r
1025VOID\r
1026UpdateOptionPage(\r
1027 IN BMM_CALLBACK_DATA *CallbackData,\r
1028 IN EFI_FORM_ID FormId,\r
1029 IN EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
1030 )\r
1031{\r
1032 CHAR16 *String;\r
1033 EFI_STRING_ID StringToken;\r
1034\r
a91f1a0e
BD
1035 String = NULL;\r
1036\r
4af04335
DB
1037 if (DevicePath != NULL){\r
1038 String = ExtractFileNameFromDevicePath(DevicePath);\r
a91f1a0e
BD
1039 }\r
1040 if (String == NULL) {\r
4af04335
DB
1041 String = HiiGetString (CallbackData->BmmHiiHandle, STRING_TOKEN (STR_NULL_STRING), NULL);\r
1042 ASSERT (String != NULL);\r
4af04335
DB
1043 }\r
1044\r
a91f1a0e
BD
1045 StringToken = HiiSetString (CallbackData->BmmHiiHandle, 0, String, NULL);\r
1046 FreePool (String);\r
1047\r
4af04335
DB
1048 if(FormId == FORM_BOOT_ADD_ID){\r
1049 if (!CallbackData->BmmFakeNvData.BootOptionChanged) {\r
1050 ZeroMem (CallbackData->BmmFakeNvData.BootOptionalData, sizeof (CallbackData->BmmFakeNvData.BootOptionalData));\r
1051 ZeroMem (CallbackData->BmmFakeNvData.BootDescriptionData, sizeof (CallbackData->BmmFakeNvData.BootDescriptionData));\r
7880f73a
DB
1052 ZeroMem (CallbackData->BmmOldFakeNVData.BootOptionalData, sizeof (CallbackData->BmmOldFakeNVData.BootOptionalData));\r
1053 ZeroMem (CallbackData->BmmOldFakeNVData.BootDescriptionData, sizeof (CallbackData->BmmOldFakeNVData.BootDescriptionData));\r
4af04335
DB
1054 }\r
1055 } else if (FormId == FORM_DRV_ADD_FILE_ID){\r
1056 if (!CallbackData->BmmFakeNvData.DriverOptionChanged) {\r
1057 ZeroMem (CallbackData->BmmFakeNvData.DriverOptionalData, sizeof (CallbackData->BmmFakeNvData.DriverOptionalData));\r
1058 ZeroMem (CallbackData->BmmFakeNvData.DriverDescriptionData, sizeof (CallbackData->BmmFakeNvData.DriverDescriptionData));\r
7880f73a
DB
1059 ZeroMem (CallbackData->BmmOldFakeNVData.DriverOptionalData, sizeof (CallbackData->BmmOldFakeNVData.DriverOptionalData));\r
1060 ZeroMem (CallbackData->BmmOldFakeNVData.DriverDescriptionData, sizeof (CallbackData->BmmOldFakeNVData.DriverDescriptionData));\r
4af04335
DB
1061 }\r
1062 }\r
1063\r
1064 RefreshUpdateData();\r
1065 mStartLabel->Number = FormId;\r
1066\r
1067 HiiCreateSubTitleOpCode (\r
1068 mStartOpCodeHandle,\r
1069 StringToken,\r
1070 0,\r
1071 0,\r
1072 0\r
1073 );\r
1074\r
1075 HiiUpdateForm (\r
1076 CallbackData->BmmHiiHandle,\r
1077 &mBootMaintGuid,\r
1078 FormId,\r
1079 mStartOpCodeHandle,// Label FormId\r
1080 mEndOpCodeHandle // LABEL_END\r
1081 );\r
1082}\r
1083\r
1084/**\r
1085 Dispatch the correct update page function to call based on\r
1086 the UpdatePageId.\r
1087\r
1088 @param UpdatePageId The form ID.\r
1089 @param CallbackData The BMM context data.\r
1090\r
1091**/\r
1092VOID\r
1093UpdatePageBody (\r
1094 IN UINT16 UpdatePageId,\r
1095 IN BMM_CALLBACK_DATA *CallbackData\r
1096 )\r
1097{\r
1098 CleanUpPage (UpdatePageId, CallbackData);\r
1099 switch (UpdatePageId) {\r
1100 case FORM_CON_IN_ID:\r
1101 UpdateConsolePage (UpdatePageId, &ConsoleInpMenu, CallbackData);\r
1102 break;\r
1103\r
1104 case FORM_CON_OUT_ID:\r
1105 UpdateConsolePage (UpdatePageId, &ConsoleOutMenu, CallbackData);\r
1106 break;\r
1107\r
1108 case FORM_CON_ERR_ID:\r
1109 UpdateConsolePage (UpdatePageId, &ConsoleErrMenu, CallbackData);\r
1110 break;\r
1111\r
1112 case FORM_BOOT_CHG_ID:\r
1113 UpdateOrderPage (UpdatePageId, &BootOptionMenu, CallbackData);\r
1114 break;\r
1115\r
1116 case FORM_DRV_CHG_ID:\r
1117 UpdateOrderPage (UpdatePageId, &DriverOptionMenu, CallbackData);\r
1118 break;\r
1119\r
1120 default:\r
1121 break;\r
1122 }\r
1123}\r
1124\r
1125/**\r
1126 Dispatch the display to the next page based on NewPageId.\r
1127\r
1128 @param Private The BMM context data.\r
1129 @param NewPageId The original page ID.\r
1130\r
1131**/\r
1132VOID\r
1133UpdatePageId (\r
1134 BMM_CALLBACK_DATA *Private,\r
1135 UINT16 NewPageId\r
1136 )\r
1137{\r
1138 if ((NewPageId < FILE_OPTION_OFFSET) && (NewPageId >= HANDLE_OPTION_OFFSET)) {\r
1139 //\r
1140 // If we select a handle to add driver option, advance to the add handle description page.\r
1141 //\r
1142 NewPageId = FORM_DRV_ADD_HANDLE_DESC_ID;\r
1143 } else if ((NewPageId == KEY_VALUE_SAVE_AND_EXIT) || (NewPageId == KEY_VALUE_NO_SAVE_AND_EXIT)) {\r
1144 //\r
1145 // Return to main page after "Save Changes" or "Discard Changes".\r
1146 //\r
1147 NewPageId = FORM_MAIN_ID;\r
1148 } else if ((NewPageId >= TERMINAL_OPTION_OFFSET) && (NewPageId < CONSOLE_OPTION_OFFSET)) {\r
1149 NewPageId = FORM_CON_COM_SETUP_ID;\r
1150 }\r
1151\r
1152 if ((NewPageId > 0) && (NewPageId < MAXIMUM_FORM_ID)) {\r
1153 Private->BmmPreviousPageId = Private->BmmCurrentPageId;\r
1154 Private->BmmCurrentPageId = NewPageId;\r
1155 }\r
1156}\r