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