]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Library/BootMaintenanceManagerUiLib/UpdatePage.c
MdeModulePkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / MdeModulePkg / Library / BootMaintenanceManagerUiLib / UpdatePage.c
CommitLineData
4af04335
DB
1/** @file\r
2Dynamically update the pages.\r
3\r
d1102dba 4Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>\r
9d510e61 5SPDX-License-Identifier: BSD-2-Clause-Patent\r
4af04335
DB
6\r
7**/\r
8\r
9#include "BootMaintenanceManager.h"\r
10\r
11/**\r
12 Create the global UpdateData structure.\r
13\r
14**/\r
15VOID\r
16CreateUpdateData (\r
17 VOID\r
18 )\r
19{\r
20 //\r
21 // Init OpCode Handle and Allocate space for creation of Buffer\r
22 //\r
23 mStartOpCodeHandle = HiiAllocateOpCodeHandle ();\r
24 ASSERT (mStartOpCodeHandle != NULL);\r
d1102dba 25\r
4af04335
DB
26 mEndOpCodeHandle = HiiAllocateOpCodeHandle ();\r
27 ASSERT (mEndOpCodeHandle != NULL);\r
d1102dba 28\r
4af04335
DB
29 //\r
30 // Create Hii Extend Label OpCode as the start opcode\r
31 //\r
32 mStartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (mStartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
33 mStartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
d1102dba 34\r
4af04335
DB
35 //\r
36 // Create Hii Extend Label OpCode as the end opcode\r
37 //\r
38 mEndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (mEndOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
39 mEndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
40 mEndLabel->Number = LABEL_END;\r
41}\r
42\r
43/**\r
44 Refresh the global UpdateData structure.\r
45\r
46**/\r
47VOID\r
48RefreshUpdateData (\r
49 VOID\r
50 )\r
51{\r
52 //\r
53 // Free current updated date\r
d1102dba 54 //\r
4af04335
DB
55 if (mStartOpCodeHandle != NULL) {\r
56 HiiFreeOpCodeHandle (mStartOpCodeHandle);\r
57 }\r
58\r
59 //\r
60 // Create new OpCode Handle\r
61 //\r
62 mStartOpCodeHandle = HiiAllocateOpCodeHandle ();\r
63\r
64 //\r
65 // Create Hii Extend Label OpCode as the start opcode\r
66 //\r
67 mStartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (mStartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
68 mStartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
69\r
70}\r
71\r
72/**\r
73 Add a "Go back to main page" tag in front of the form when there are no\r
74 "Apply changes" and "Discard changes" tags in the end of the form.\r
d1102dba 75\r
4af04335
DB
76 @param CallbackData The BMM context data.\r
77\r
78**/\r
79VOID\r
80UpdatePageStart (\r
81 IN BMM_CALLBACK_DATA *CallbackData\r
82 )\r
83{\r
84 RefreshUpdateData ();\r
85 mStartLabel->Number = CallbackData->BmmCurrentPageId;\r
86\r
87 if (!(CallbackData->BmmAskSaveOrNot)) {\r
88 //\r
89 // Add a "Go back to main page" tag in front of the form when there are no\r
90 // "Apply changes" and "Discard changes" tags in the end of the form.\r
91 //\r
92 HiiCreateGotoOpCode (\r
93 mStartOpCodeHandle,\r
94 FORM_MAIN_ID,\r
95 STRING_TOKEN (STR_FORM_GOTO_MAIN),\r
96 STRING_TOKEN (STR_FORM_GOTO_MAIN),\r
97 0,\r
98 FORM_MAIN_ID\r
99 );\r
100 }\r
101}\r
102\r
103/**\r
104 Create the "Apply changes" and "Discard changes" tags. And\r
105 ensure user can return to the main page.\r
106\r
107 @param CallbackData The BMM context data.\r
108\r
109**/\r
110VOID\r
111UpdatePageEnd (\r
112 IN BMM_CALLBACK_DATA *CallbackData\r
113 )\r
114{\r
115 //\r
116 // Create the "Apply changes" and "Discard changes" tags.\r
117 //\r
118 if (CallbackData->BmmAskSaveOrNot) {\r
119 HiiCreateSubTitleOpCode (\r
120 mStartOpCodeHandle,\r
121 STRING_TOKEN (STR_NULL_STRING),\r
122 0,\r
123 0,\r
124 0\r
125 );\r
126\r
127 HiiCreateActionOpCode (\r
128 mStartOpCodeHandle,\r
129 KEY_VALUE_SAVE_AND_EXIT,\r
130 STRING_TOKEN (STR_SAVE_AND_EXIT),\r
131 STRING_TOKEN (STR_NULL_STRING),\r
132 EFI_IFR_FLAG_CALLBACK,\r
133 0\r
134 );\r
135 }\r
136\r
137 //\r
138 // Ensure user can return to the main page.\r
139 //\r
140 HiiCreateActionOpCode (\r
141 mStartOpCodeHandle,\r
142 KEY_VALUE_NO_SAVE_AND_EXIT,\r
143 STRING_TOKEN (STR_NO_SAVE_AND_EXIT),\r
144 STRING_TOKEN (STR_NULL_STRING),\r
145 EFI_IFR_FLAG_CALLBACK,\r
146 0\r
147 );\r
148\r
149 HiiUpdateForm (\r
150 CallbackData->BmmHiiHandle,\r
151 &mBootMaintGuid,\r
152 CallbackData->BmmCurrentPageId,\r
153 mStartOpCodeHandle, // Label CallbackData->BmmCurrentPageId\r
154 mEndOpCodeHandle // LABEL_END\r
155 );\r
156}\r
157\r
158/**\r
d1102dba 159 Clean up the dynamic opcode at label and form specified by both LabelId.\r
4af04335
DB
160\r
161 @param LabelId It is both the Form ID and Label ID for opcode deletion.\r
162 @param CallbackData The BMM context data.\r
163\r
164**/\r
165VOID\r
166CleanUpPage (\r
167 IN UINT16 LabelId,\r
168 IN BMM_CALLBACK_DATA *CallbackData\r
169 )\r
170{\r
171 RefreshUpdateData ();\r
172\r
173 //\r
174 // Remove all op-codes from dynamic page\r
175 //\r
176 mStartLabel->Number = LabelId;\r
177 HiiUpdateForm (\r
178 CallbackData->BmmHiiHandle,\r
179 &mBootMaintGuid,\r
180 LabelId,\r
181 mStartOpCodeHandle, // Label LabelId\r
182 mEndOpCodeHandle // LABEL_END\r
183 );\r
184}\r
185\r
186/**\r
187 Create a list of Goto Opcode for all terminal devices logged\r
188 by TerminaMenu. This list will be inserted to form FORM_CON_COM_SETUP_ID.\r
189\r
190 @param CallbackData The BMM context data.\r
191**/\r
192VOID\r
193UpdateConCOMPage (\r
194 IN BMM_CALLBACK_DATA *CallbackData\r
195 )\r
196{\r
197 BM_MENU_ENTRY *NewMenuEntry;\r
198 UINT16 Index;\r
199\r
200 CallbackData->BmmAskSaveOrNot = TRUE;\r
201\r
202 UpdatePageStart (CallbackData);\r
203\r
204 for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
205 NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
206\r
207 HiiCreateGotoOpCode (\r
208 mStartOpCodeHandle,\r
209 FORM_CON_COM_SETUP_ID,\r
210 NewMenuEntry->DisplayStringToken,\r
211 STRING_TOKEN (STR_NULL_STRING),\r
212 EFI_IFR_FLAG_CALLBACK,\r
213 (UINT16) (TERMINAL_OPTION_OFFSET + Index)\r
214 );\r
215 }\r
216\r
217 UpdatePageEnd (CallbackData);\r
218}\r
219\r
220\r
221/**\r
222 Create a list of boot option from global BootOptionMenu. It\r
223 allow user to delete the boot option.\r
224\r
225 @param CallbackData The BMM context data.\r
226\r
227**/\r
228VOID\r
229UpdateBootDelPage (\r
230 IN BMM_CALLBACK_DATA *CallbackData\r
231 )\r
232{\r
233 BM_MENU_ENTRY *NewMenuEntry;\r
234 BM_LOAD_CONTEXT *NewLoadContext;\r
235 UINT16 Index;\r
236\r
237 CallbackData->BmmAskSaveOrNot = TRUE;\r
238\r
239 UpdatePageStart (CallbackData);\r
240\r
241 ASSERT (BootOptionMenu.MenuNumber <= (sizeof (CallbackData->BmmFakeNvData.BootOptionDel) / sizeof (CallbackData->BmmFakeNvData.BootOptionDel[0])));\r
242 for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
243 NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
244 NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
245 if (NewLoadContext->IsLegacy) {\r
246 continue;\r
247 }\r
248\r
249 NewLoadContext->Deleted = FALSE;\r
250\r
251 if (CallbackData->BmmFakeNvData.BootOptionDel[Index] && !CallbackData->BmmFakeNvData.BootOptionDelMark[Index]) {\r
252 //\r
253 // CallbackData->BmmFakeNvData.BootOptionDel[Index] == TRUE means browser knows this boot option is selected\r
254 // CallbackData->BmmFakeNvData.BootOptionDelMark[Index] = FALSE means BDS knows the selected boot option has\r
255 // deleted, browser maintains old useless info. So clear this info here, and later update this info to browser\r
256 // through HiiSetBrowserData function.\r
257 //\r
258 CallbackData->BmmFakeNvData.BootOptionDel[Index] = FALSE;\r
7880f73a 259 CallbackData->BmmOldFakeNVData.BootOptionDel[Index] = FALSE;\r
4af04335 260 }\r
d1102dba 261\r
4af04335
DB
262 HiiCreateCheckBoxOpCode (\r
263 mStartOpCodeHandle,\r
264 (EFI_QUESTION_ID) (BOOT_OPTION_DEL_QUESTION_ID + Index),\r
265 VARSTORE_ID_BOOT_MAINT,\r
266 (UINT16) (BOOT_OPTION_DEL_VAR_OFFSET + Index),\r
267 NewMenuEntry->DisplayStringToken,\r
268 NewMenuEntry->HelpStringToken,\r
269 EFI_IFR_FLAG_CALLBACK,\r
270 0,\r
271 NULL\r
272 );\r
273 }\r
274 UpdatePageEnd (CallbackData);\r
275}\r
276\r
277/**\r
278 Create a lit of driver option from global DriverMenu.\r
279\r
280 @param CallbackData The BMM context data.\r
281\r
282**/\r
283VOID\r
284UpdateDrvAddHandlePage (\r
285 IN BMM_CALLBACK_DATA *CallbackData\r
286 )\r
287{\r
288 BM_MENU_ENTRY *NewMenuEntry;\r
289 UINT16 Index;\r
290\r
291 CallbackData->BmmAskSaveOrNot = FALSE;\r
292\r
293 UpdatePageStart (CallbackData);\r
294\r
295 for (Index = 0; Index < DriverMenu.MenuNumber; Index++) {\r
296 NewMenuEntry = BOpt_GetMenuEntry (&DriverMenu, Index);\r
297\r
298 HiiCreateGotoOpCode (\r
299 mStartOpCodeHandle,\r
300 FORM_DRV_ADD_HANDLE_DESC_ID,\r
301 NewMenuEntry->DisplayStringToken,\r
302 STRING_TOKEN (STR_NULL_STRING),\r
303 EFI_IFR_FLAG_CALLBACK,\r
304 (UINT16) (HANDLE_OPTION_OFFSET + Index)\r
305 );\r
306 }\r
307\r
308 UpdatePageEnd (CallbackData);\r
309}\r
310\r
311/**\r
312 Create a lit of driver option from global DriverOptionMenu. It\r
313 allow user to delete the driver option.\r
314\r
315 @param CallbackData The BMM context data.\r
316\r
317**/\r
318VOID\r
319UpdateDrvDelPage (\r
320 IN BMM_CALLBACK_DATA *CallbackData\r
321 )\r
322{\r
323 BM_MENU_ENTRY *NewMenuEntry;\r
324 BM_LOAD_CONTEXT *NewLoadContext;\r
325 UINT16 Index;\r
326\r
327 CallbackData->BmmAskSaveOrNot = TRUE;\r
328\r
329 UpdatePageStart (CallbackData);\r
330\r
331 ASSERT (DriverOptionMenu.MenuNumber <= (sizeof (CallbackData->BmmFakeNvData.DriverOptionDel) / sizeof (CallbackData->BmmFakeNvData.DriverOptionDel[0])));\r
332 for (Index = 0; Index < DriverOptionMenu.MenuNumber; Index++) {\r
333 NewMenuEntry = BOpt_GetMenuEntry (&DriverOptionMenu, Index);\r
334\r
335 NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
336 NewLoadContext->Deleted = FALSE;\r
337\r
338 if (CallbackData->BmmFakeNvData.DriverOptionDel[Index] && !CallbackData->BmmFakeNvData.DriverOptionDelMark[Index]) {\r
339 //\r
340 // CallbackData->BmmFakeNvData.BootOptionDel[Index] == TRUE means browser knows this boot option is selected\r
341 // CallbackData->BmmFakeNvData.BootOptionDelMark[Index] = FALSE means BDS knows the selected boot option has\r
342 // deleted, browser maintains old useless info. So clear this info here, and later update this info to browser\r
343 // through HiiSetBrowserData function.\r
344 //\r
345 CallbackData->BmmFakeNvData.DriverOptionDel[Index] = FALSE;\r
7880f73a 346 CallbackData->BmmOldFakeNVData.DriverOptionDel[Index] = FALSE;\r
4af04335
DB
347 }\r
348 HiiCreateCheckBoxOpCode (\r
349 mStartOpCodeHandle,\r
350 (EFI_QUESTION_ID) (DRIVER_OPTION_DEL_QUESTION_ID + Index),\r
351 VARSTORE_ID_BOOT_MAINT,\r
352 (UINT16) (DRIVER_OPTION_DEL_VAR_OFFSET + Index),\r
353 NewMenuEntry->DisplayStringToken,\r
354 NewMenuEntry->HelpStringToken,\r
355 EFI_IFR_FLAG_CALLBACK,\r
356 0,\r
357 NULL\r
358 );\r
359 }\r
360\r
361 UpdatePageEnd (CallbackData);\r
362}\r
363\r
364/**\r
d1102dba 365 Prepare the page to allow user to add description for\r
4af04335
DB
366 a Driver Option.\r
367\r
368 @param CallbackData The BMM context data.\r
369\r
370**/\r
371VOID\r
372UpdateDriverAddHandleDescPage (\r
373 IN BMM_CALLBACK_DATA *CallbackData\r
374 )\r
375{\r
376 BM_MENU_ENTRY *NewMenuEntry;\r
377\r
378 CallbackData->BmmFakeNvData.DriverAddActive = 0x01;\r
379 CallbackData->BmmFakeNvData.DriverAddForceReconnect = 0x00;\r
380 CallbackData->BmmAskSaveOrNot = TRUE;\r
381 NewMenuEntry = CallbackData->MenuEntry;\r
382\r
383 UpdatePageStart (CallbackData);\r
384\r
385 HiiCreateSubTitleOpCode (\r
386 mStartOpCodeHandle,\r
387 NewMenuEntry->DisplayStringToken,\r
388 0,\r
389 0,\r
390 0\r
391 );\r
392\r
393 HiiCreateStringOpCode (\r
394 mStartOpCodeHandle,\r
395 (EFI_QUESTION_ID) DRV_ADD_HANDLE_DESC_QUESTION_ID,\r
396 VARSTORE_ID_BOOT_MAINT,\r
397 DRV_ADD_HANDLE_DESC_VAR_OFFSET,\r
398 STRING_TOKEN (STR_LOAD_OPTION_DESC),\r
399 STRING_TOKEN (STR_NULL_STRING),\r
400 0,\r
401 0,\r
402 6,\r
403 75,\r
404 NULL\r
405 );\r
406\r
407 HiiCreateCheckBoxOpCode (\r
408 mStartOpCodeHandle,\r
409 (EFI_QUESTION_ID) DRV_ADD_RECON_QUESTION_ID,\r
410 VARSTORE_ID_BOOT_MAINT,\r
411 DRV_ADD_RECON_VAR_OFFSET,\r
412 STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON),\r
413 STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON),\r
414 0,\r
415 0,\r
416 NULL\r
417 );\r
418\r
419 HiiCreateStringOpCode (\r
420 mStartOpCodeHandle,\r
421 (EFI_QUESTION_ID) DRIVER_ADD_OPTION_QUESTION_ID,\r
422 VARSTORE_ID_BOOT_MAINT,\r
423 DRIVER_ADD_OPTION_VAR_OFFSET,\r
424 STRING_TOKEN (STR_OPTIONAL_DATA),\r
425 STRING_TOKEN (STR_NULL_STRING),\r
426 0,\r
427 0,\r
428 6,\r
429 75,\r
430 NULL\r
431 );\r
432\r
433 UpdatePageEnd (CallbackData);\r
434}\r
435\r
436/**\r
437 Update console page.\r
438\r
439 @param UpdatePageId The form ID to be updated.\r
440 @param ConsoleMenu The console menu list.\r
441 @param CallbackData The BMM context data.\r
442\r
443**/\r
444VOID\r
445UpdateConsolePage (\r
446 IN UINT16 UpdatePageId,\r
447 IN BM_MENU_OPTION *ConsoleMenu,\r
448 IN BMM_CALLBACK_DATA *CallbackData\r
449 )\r
450{\r
451 BM_MENU_ENTRY *NewMenuEntry;\r
452 BM_CONSOLE_CONTEXT *NewConsoleContext;\r
453 BM_TERMINAL_CONTEXT *NewTerminalContext;\r
454 UINT16 Index;\r
455 UINT16 Index2;\r
456 UINT8 CheckFlags;\r
457 UINT8 *ConsoleCheck;\r
4af04335
DB
458 EFI_QUESTION_ID QuestionIdBase;\r
459 UINT16 VariableOffsetBase;\r
460\r
461 CallbackData->BmmAskSaveOrNot = TRUE;\r
462\r
463 UpdatePageStart (CallbackData);\r
464\r
465 ConsoleCheck = NULL;\r
4af04335
DB
466 QuestionIdBase = 0;\r
467 VariableOffsetBase = 0;\r
4af04335
DB
468\r
469 switch (UpdatePageId) {\r
470 case FORM_CON_IN_ID:\r
471 ConsoleCheck = &CallbackData->BmmFakeNvData.ConsoleInCheck[0];\r
4af04335
DB
472 QuestionIdBase = CON_IN_DEVICE_QUESTION_ID;\r
473 VariableOffsetBase = CON_IN_DEVICE_VAR_OFFSET;\r
474 break;\r
475\r
476 case FORM_CON_OUT_ID:\r
477 ConsoleCheck = &CallbackData->BmmFakeNvData.ConsoleOutCheck[0];\r
4af04335
DB
478 QuestionIdBase = CON_OUT_DEVICE_QUESTION_ID;\r
479 VariableOffsetBase = CON_OUT_DEVICE_VAR_OFFSET;\r
480 break;\r
481\r
482 case FORM_CON_ERR_ID:\r
483 ConsoleCheck = &CallbackData->BmmFakeNvData.ConsoleErrCheck[0];\r
4af04335
DB
484 QuestionIdBase = CON_ERR_DEVICE_QUESTION_ID;\r
485 VariableOffsetBase = CON_ERR_DEVICE_VAR_OFFSET;\r
486 break;\r
487 }\r
488 ASSERT (ConsoleCheck != NULL);\r
489\r
490 for (Index = 0; ((Index < ConsoleMenu->MenuNumber) && \\r
491 (Index < MAX_MENU_NUMBER)) ; Index++) {\r
492 CheckFlags = 0;\r
493 NewMenuEntry = BOpt_GetMenuEntry (ConsoleMenu, Index);\r
494 NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;\r
495 if (NewConsoleContext->IsActive) {\r
496 CheckFlags |= EFI_IFR_CHECKBOX_DEFAULT;\r
497 ConsoleCheck[Index] = TRUE;\r
498 } else {\r
499 ConsoleCheck[Index] = FALSE;\r
500 }\r
501 HiiCreateCheckBoxOpCode (\r
502 mStartOpCodeHandle,\r
503 (EFI_QUESTION_ID) (QuestionIdBase + Index),\r
504 VARSTORE_ID_BOOT_MAINT,\r
505 (UINT16) (VariableOffsetBase + Index),\r
506 NewMenuEntry->DisplayStringToken,\r
507 NewMenuEntry->HelpStringToken,\r
a3475fe0 508 EFI_IFR_FLAG_CALLBACK,\r
4af04335
DB
509 CheckFlags,\r
510 NULL\r
511 );\r
512 }\r
513\r
514 for (Index2 = 0; ((Index2 < TerminalMenu.MenuNumber) && \\r
515 (Index2 < MAX_MENU_NUMBER)); Index2++) {\r
516 CheckFlags = 0;\r
517 NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index2);\r
518 NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
519\r
520 ASSERT (Index < MAX_MENU_NUMBER);\r
521 if (((NewTerminalContext->IsConIn != 0) && (UpdatePageId == FORM_CON_IN_ID)) ||\r
522 ((NewTerminalContext->IsConOut != 0) && (UpdatePageId == FORM_CON_OUT_ID)) ||\r
523 ((NewTerminalContext->IsStdErr != 0) && (UpdatePageId == FORM_CON_ERR_ID))\r
524 ) {\r
525 CheckFlags |= EFI_IFR_CHECKBOX_DEFAULT;\r
526 ConsoleCheck[Index] = TRUE;\r
527 } else {\r
528 ConsoleCheck[Index] = FALSE;\r
529 }\r
530 HiiCreateCheckBoxOpCode (\r
531 mStartOpCodeHandle,\r
532 (EFI_QUESTION_ID) (QuestionIdBase + Index),\r
533 VARSTORE_ID_BOOT_MAINT,\r
534 (UINT16) (VariableOffsetBase + Index),\r
535 NewMenuEntry->DisplayStringToken,\r
536 NewMenuEntry->HelpStringToken,\r
a3475fe0 537 EFI_IFR_FLAG_CALLBACK,\r
4af04335
DB
538 CheckFlags,\r
539 NULL\r
540 );\r
541\r
542 Index++;\r
543 }\r
544\r
4af04335
DB
545 UpdatePageEnd (CallbackData);\r
546}\r
547\r
548/**\r
549 Update the page's NV Map if user has changed the order\r
550 a list. This list can be Boot Order or Driver Order.\r
551\r
552 @param UpdatePageId The form ID to be updated.\r
553 @param OptionMenu The new list.\r
554 @param CallbackData The BMM context data.\r
555\r
556**/\r
557VOID\r
558UpdateOrderPage (\r
559 IN UINT16 UpdatePageId,\r
560 IN BM_MENU_OPTION *OptionMenu,\r
561 IN BMM_CALLBACK_DATA *CallbackData\r
562 )\r
563{\r
564 BM_MENU_ENTRY *NewMenuEntry;\r
565 UINT16 Index;\r
566 UINT16 OptionIndex;\r
567 VOID *OptionsOpCodeHandle;\r
4af04335
DB
568 BOOLEAN BootOptionFound;\r
569 UINT32 *OptionOrder;\r
570 EFI_QUESTION_ID QuestionId;\r
571 UINT16 VarOffset;\r
572\r
573 CallbackData->BmmAskSaveOrNot = TRUE;\r
574 UpdatePageStart (CallbackData);\r
575\r
576 OptionOrder = NULL;\r
577 QuestionId = 0;\r
578 VarOffset = 0;\r
d1102dba
LG
579 switch (UpdatePageId) {\r
580\r
4af04335 581 case FORM_BOOT_CHG_ID:\r
2c30541a
DB
582 //\r
583 // If the BootOptionOrder in the BmmFakeNvData are same with the date in the BmmOldFakeNVData,\r
584 // means all Boot Options has been save in BootOptionMenu, we can get the date from the menu.\r
585 // else means browser maintains some uncommitted date which are not saved in BootOptionMenu,\r
586 // so we should not get the data from BootOptionMenu to show it.\r
587 //\r
588 if (CompareMem (CallbackData->BmmFakeNvData.BootOptionOrder, CallbackData->BmmOldFakeNVData.BootOptionOrder, sizeof (CallbackData->BmmFakeNvData.BootOptionOrder)) == 0) {\r
589 GetBootOrder (CallbackData);\r
590 }\r
4af04335
DB
591 OptionOrder = CallbackData->BmmFakeNvData.BootOptionOrder;\r
592 QuestionId = BOOT_OPTION_ORDER_QUESTION_ID;\r
593 VarOffset = BOOT_OPTION_ORDER_VAR_OFFSET;\r
594 break;\r
d1102dba 595\r
4af04335 596 case FORM_DRV_CHG_ID:\r
2c30541a
DB
597 //\r
598 // If the DriverOptionOrder in the BmmFakeNvData are same with the date in the BmmOldFakeNVData,\r
599 // means all Driver Options has been save in DriverOptionMenu, we can get the DriverOptionOrder from the menu.\r
600 // else means browser maintains some uncommitted date which are not saved in DriverOptionMenu,\r
601 // so we should not get the data from DriverOptionMenu to show it.\r
602 //\r
603 if (CompareMem (CallbackData->BmmFakeNvData.DriverOptionOrder, CallbackData->BmmOldFakeNVData.DriverOptionOrder, sizeof (CallbackData->BmmFakeNvData.DriverOptionOrder)) == 0) {\r
604 GetDriverOrder (CallbackData);\r
605 }\r
4af04335
DB
606 OptionOrder = CallbackData->BmmFakeNvData.DriverOptionOrder;\r
607 QuestionId = DRIVER_OPTION_ORDER_QUESTION_ID;\r
608 VarOffset = DRIVER_OPTION_ORDER_VAR_OFFSET;\r
609 break;\r
d1102dba
LG
610 }\r
611 ASSERT (OptionOrder != NULL);\r
612\r
4af04335
DB
613 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
614 ASSERT (OptionsOpCodeHandle != NULL);\r
d1102dba 615\r
4af04335
DB
616 NewMenuEntry = NULL;\r
617 for (OptionIndex = 0; (OptionOrder[OptionIndex] != 0 && OptionIndex < MAX_MENU_NUMBER); OptionIndex++) {\r
618 BootOptionFound = FALSE;\r
619 for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {\r
620 NewMenuEntry = BOpt_GetMenuEntry (OptionMenu, Index);\r
4af04335
DB
621 if ((UINT32) (NewMenuEntry->OptionNumber + 1) == OptionOrder[OptionIndex]) {\r
622 BootOptionFound = TRUE;\r
623 break;\r
624 }\r
625 }\r
626 if (BootOptionFound) {\r
627 HiiCreateOneOfOptionOpCode (\r
628 OptionsOpCodeHandle,\r
629 NewMenuEntry->DisplayStringToken,\r
630 0,\r
631 EFI_IFR_TYPE_NUM_SIZE_32,\r
632 OptionOrder[OptionIndex]\r
633 );\r
634 }\r
635 }\r
d1102dba 636\r
4af04335 637 if (OptionMenu->MenuNumber > 0) {\r
d1102dba
LG
638 HiiCreateOrderedListOpCode (\r
639 mStartOpCodeHandle, // Container for dynamic created opcodes\r
640 QuestionId, // Question ID\r
641 VARSTORE_ID_BOOT_MAINT, // VarStore ID\r
642 VarOffset, // Offset in Buffer Storage\r
643 STRING_TOKEN (STR_CHANGE_ORDER), // Question prompt text\r
644 STRING_TOKEN (STR_CHANGE_ORDER), // Question help text\r
645 0, // Question flag\r
4af04335 646 0, // Ordered list flag, e.g. EFI_IFR_UNIQUE_SET\r
d1102dba
LG
647 EFI_IFR_TYPE_NUM_SIZE_32, // Data type of Question value\r
648 100, // Maximum container\r
649 OptionsOpCodeHandle, // Option Opcode list\r
650 NULL // Default Opcode is NULL\r
4af04335
DB
651 );\r
652 }\r
653\r
654 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
655\r
656 UpdatePageEnd (CallbackData);\r
657\r
658}\r
659\r
4af04335
DB
660/**\r
661 Refresh the text mode page.\r
662\r
663 @param CallbackData The BMM context data.\r
664\r
665**/\r
666VOID\r
667UpdateConModePage (\r
668 IN BMM_CALLBACK_DATA *CallbackData\r
669 )\r
670{\r
671 UINTN Mode;\r
672 UINTN Index;\r
673 UINTN Col;\r
674 UINTN Row;\r
675 CHAR16 ModeString[50];\r
676 CHAR16 *PStr;\r
677 UINTN MaxMode;\r
678 UINTN ValidMode;\r
679 EFI_STRING_ID *ModeToken;\r
680 EFI_STATUS Status;\r
681 VOID *OptionsOpCodeHandle;\r
682 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *ConOut;\r
683\r
684 ConOut = gST->ConOut;\r
685 Index = 0;\r
686 ValidMode = 0;\r
687 MaxMode = (UINTN) (ConOut->Mode->MaxMode);\r
688\r
689 CallbackData->BmmAskSaveOrNot = TRUE;\r
690\r
691 UpdatePageStart (CallbackData);\r
692\r
693 //\r
694 // Check valid mode\r
695 //\r
696 for (Mode = 0; Mode < MaxMode; Mode++) {\r
697 Status = ConOut->QueryMode (ConOut, Mode, &Col, &Row);\r
698 if (EFI_ERROR (Status)) {\r
699 continue;\r
700 }\r
701 ValidMode++;\r
702 }\r
703\r
704 if (ValidMode == 0) {\r
705 return;\r
706 }\r
707\r
708 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
709 ASSERT (OptionsOpCodeHandle != NULL);\r
710\r
711 ModeToken = AllocateZeroPool (sizeof (EFI_STRING_ID) * ValidMode);\r
712 ASSERT(ModeToken != NULL);\r
713\r
714 //\r
715 // Determin which mode should be the first entry in menu\r
716 //\r
717 GetConsoleOutMode (CallbackData);\r
718\r
719 //\r
720 // Build text mode options\r
721 //\r
722 for (Mode = 0; Mode < MaxMode; Mode++) {\r
723 Status = ConOut->QueryMode (ConOut, Mode, &Col, &Row);\r
724 if (EFI_ERROR (Status)) {\r
725 continue;\r
726 }\r
d1102dba 727\r
4af04335
DB
728 //\r
729 // Build mode string Column x Row\r
730 //\r
9f4048f7 731 UnicodeValueToStringS (ModeString, sizeof (ModeString), 0, Col, 0);\r
4af04335 732 PStr = &ModeString[0];\r
6eeeb288 733 StrnCatS (PStr, ARRAY_SIZE (ModeString), L" x ", StrLen(L" x ") + 1);\r
4af04335 734 PStr = PStr + StrLen (PStr);\r
9f4048f7
HW
735 UnicodeValueToStringS (\r
736 PStr,\r
737 sizeof (ModeString) - ((UINTN)PStr - (UINTN)&ModeString[0]),\r
738 0,\r
739 Row,\r
740 0\r
741 );\r
4af04335
DB
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
d1102dba 845\r
4af04335
DB
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
d1102dba 1010\r
4af04335
DB
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