]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - MdeModulePkg/Library/BootMaintenanceManagerUiLib/UpdatePage.c
MdeModulePkg: Unify the definitions of size_t
[mirror_edk2.git] / MdeModulePkg / Library / BootMaintenanceManagerUiLib / UpdatePage.c
... / ...
CommitLineData
1/** @file\r
2Dynamically update the pages.\r
3\r
4Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>\r
5SPDX-License-Identifier: BSD-2-Clause-Patent\r
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
25\r
26 mEndOpCodeHandle = HiiAllocateOpCodeHandle ();\r
27 ASSERT (mEndOpCodeHandle != NULL);\r
28\r
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
34\r
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
54 //\r
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
75\r
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
159 Clean up the dynamic opcode at label and form specified by both LabelId.\r
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
259 CallbackData->BmmOldFakeNVData.BootOptionDel[Index] = FALSE;\r
260 }\r
261\r
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
346 CallbackData->BmmOldFakeNVData.DriverOptionDel[Index] = FALSE;\r
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
365 Prepare the page to allow user to add description for\r
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
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
466 QuestionIdBase = 0;\r
467 VariableOffsetBase = 0;\r
468\r
469 switch (UpdatePageId) {\r
470 case FORM_CON_IN_ID:\r
471 ConsoleCheck = &CallbackData->BmmFakeNvData.ConsoleInCheck[0];\r
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
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
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
508 EFI_IFR_FLAG_CALLBACK,\r
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
537 EFI_IFR_FLAG_CALLBACK,\r
538 CheckFlags,\r
539 NULL\r
540 );\r
541\r
542 Index++;\r
543 }\r
544\r
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
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
579 switch (UpdatePageId) {\r
580\r
581 case FORM_BOOT_CHG_ID:\r
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
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
595\r
596 case FORM_DRV_CHG_ID:\r
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
606 OptionOrder = CallbackData->BmmFakeNvData.DriverOptionOrder;\r
607 QuestionId = DRIVER_OPTION_ORDER_QUESTION_ID;\r
608 VarOffset = DRIVER_OPTION_ORDER_VAR_OFFSET;\r
609 break;\r
610 }\r
611 ASSERT (OptionOrder != NULL);\r
612\r
613 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
614 ASSERT (OptionsOpCodeHandle != NULL);\r
615\r
616 NewMenuEntry = NULL;\r
617 for (OptionIndex = 0; (OptionOrder[OptionIndex] != 0 && OptionIndex < MAX_MENU_NUMBER); OptionIndex++) {\r
618 BootOptionFound = FALSE;\r
619 for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {\r
620 NewMenuEntry = BOpt_GetMenuEntry (OptionMenu, Index);\r
621 if ((UINT32) (NewMenuEntry->OptionNumber + 1) == OptionOrder[OptionIndex]) {\r
622 BootOptionFound = TRUE;\r
623 break;\r
624 }\r
625 }\r
626 if (BootOptionFound) {\r
627 HiiCreateOneOfOptionOpCode (\r
628 OptionsOpCodeHandle,\r
629 NewMenuEntry->DisplayStringToken,\r
630 0,\r
631 EFI_IFR_TYPE_NUM_SIZE_32,\r
632 OptionOrder[OptionIndex]\r
633 );\r
634 }\r
635 }\r
636\r
637 if (OptionMenu->MenuNumber > 0) {\r
638 HiiCreateOrderedListOpCode (\r
639 mStartOpCodeHandle, // Container for dynamic created opcodes\r
640 QuestionId, // Question ID\r
641 VARSTORE_ID_BOOT_MAINT, // VarStore ID\r
642 VarOffset, // Offset in Buffer Storage\r
643 STRING_TOKEN (STR_CHANGE_ORDER), // Question prompt text\r
644 STRING_TOKEN (STR_CHANGE_ORDER), // Question help text\r
645 0, // Question flag\r
646 0, // Ordered list flag, e.g. EFI_IFR_UNIQUE_SET\r
647 EFI_IFR_TYPE_NUM_SIZE_32, // Data type of Question value\r
648 100, // Maximum container\r
649 OptionsOpCodeHandle, // Option Opcode list\r
650 NULL // Default Opcode is NULL\r
651 );\r
652 }\r
653\r
654 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
655\r
656 UpdatePageEnd (CallbackData);\r
657\r
658}\r
659\r
660/**\r
661 Refresh the text mode page.\r
662\r
663 @param CallbackData The BMM context data.\r
664\r
665**/\r
666VOID\r
667UpdateConModePage (\r
668 IN BMM_CALLBACK_DATA *CallbackData\r
669 )\r
670{\r
671 UINTN Mode;\r
672 UINTN Index;\r
673 UINTN Col;\r
674 UINTN Row;\r
675 CHAR16 ModeString[50];\r
676 CHAR16 *PStr;\r
677 UINTN MaxMode;\r
678 UINTN ValidMode;\r
679 EFI_STRING_ID *ModeToken;\r
680 EFI_STATUS Status;\r
681 VOID *OptionsOpCodeHandle;\r
682 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *ConOut;\r
683\r
684 ConOut = gST->ConOut;\r
685 Index = 0;\r
686 ValidMode = 0;\r
687 MaxMode = (UINTN) (ConOut->Mode->MaxMode);\r
688\r
689 CallbackData->BmmAskSaveOrNot = TRUE;\r
690\r
691 UpdatePageStart (CallbackData);\r
692\r
693 //\r
694 // Check valid mode\r
695 //\r
696 for (Mode = 0; Mode < MaxMode; Mode++) {\r
697 Status = ConOut->QueryMode (ConOut, Mode, &Col, &Row);\r
698 if (EFI_ERROR (Status)) {\r
699 continue;\r
700 }\r
701 ValidMode++;\r
702 }\r
703\r
704 if (ValidMode == 0) {\r
705 return;\r
706 }\r
707\r
708 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
709 ASSERT (OptionsOpCodeHandle != NULL);\r
710\r
711 ModeToken = AllocateZeroPool (sizeof (EFI_STRING_ID) * ValidMode);\r
712 ASSERT(ModeToken != NULL);\r
713\r
714 //\r
715 // Determin which mode should be the first entry in menu\r
716 //\r
717 GetConsoleOutMode (CallbackData);\r
718\r
719 //\r
720 // Build text mode options\r
721 //\r
722 for (Mode = 0; Mode < MaxMode; Mode++) {\r
723 Status = ConOut->QueryMode (ConOut, Mode, &Col, &Row);\r
724 if (EFI_ERROR (Status)) {\r
725 continue;\r
726 }\r
727\r
728 //\r
729 // Build mode string Column x Row\r
730 //\r
731 UnicodeValueToStringS (ModeString, sizeof (ModeString), 0, Col, 0);\r
732 PStr = &ModeString[0];\r
733 StrnCatS (PStr, ARRAY_SIZE (ModeString), L" x ", StrLen(L" x ") + 1);\r
734 PStr = PStr + StrLen (PStr);\r
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
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
840 EFI_IFR_FLAG_CALLBACK,\r
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
850 for (Index = 0; Index < ARRAY_SIZE (DataBitsList); Index++) {\r
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
873 EFI_IFR_FLAG_CALLBACK,\r
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
883 for (Index = 0; Index < ARRAY_SIZE (ParityList); Index++) {\r
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
905 EFI_IFR_FLAG_CALLBACK,\r
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
915 for (Index = 0; Index < ARRAY_SIZE (StopBitsList); Index++) {\r
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
937 EFI_IFR_FLAG_CALLBACK,\r
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
947 for (Index = 0; Index < ARRAY_SIZE (TerminalType); Index++) {\r
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
969 EFI_IFR_FLAG_CALLBACK,\r
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
979 for (Index = 0; Index < ARRAY_SIZE (mFlowControlType); Index++) {\r
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
1000 EFI_IFR_FLAG_CALLBACK,\r
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
1029 String = NULL;\r
1030\r
1031 if (DevicePath != NULL){\r
1032 String = ExtractFileNameFromDevicePath(DevicePath);\r
1033 }\r
1034 if (String == NULL) {\r
1035 String = HiiGetString (CallbackData->BmmHiiHandle, STRING_TOKEN (STR_NULL_STRING), NULL);\r
1036 ASSERT (String != NULL);\r
1037 }\r
1038\r
1039 StringToken = HiiSetString (CallbackData->BmmHiiHandle, 0, String, NULL);\r
1040 FreePool (String);\r
1041\r
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
1046 ZeroMem (CallbackData->BmmOldFakeNVData.BootOptionalData, sizeof (CallbackData->BmmOldFakeNVData.BootOptionalData));\r
1047 ZeroMem (CallbackData->BmmOldFakeNVData.BootDescriptionData, sizeof (CallbackData->BmmOldFakeNVData.BootDescriptionData));\r
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
1053 ZeroMem (CallbackData->BmmOldFakeNVData.DriverOptionalData, sizeof (CallbackData->BmmOldFakeNVData.DriverOptionalData));\r
1054 ZeroMem (CallbackData->BmmOldFakeNVData.DriverDescriptionData, sizeof (CallbackData->BmmOldFakeNVData.DriverDescriptionData));\r
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