2 The functions for Boot Maintainence Main menu.
4 Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
16 #include "BootMaintenanceManager.h"
17 #include "BootMaintenanceManagerCustomizedUiSupport.h"
19 #define UI_HII_DRIVER_LIST_SIZE 0x8
22 EFI_STRING_ID PromptId
;
24 EFI_STRING_ID DevicePathId
;
26 BOOLEAN EmptyLineAfter
;
27 } UI_HII_DRIVER_INSTANCE
;
29 STATIC UI_HII_DRIVER_INSTANCE
*gHiiDriverList
;
33 Create the dynamic item to allow user to set the "BootNext" vaule.
35 @param[in] HiiHandle The hii handle for the Uiapp driver.
36 @param[in] StartOpCodeHandle The opcode handle to save the new opcode.
40 BmmCreateBootNextMenu(
41 IN EFI_HII_HANDLE HiiHandle
,
42 IN VOID
*StartOpCodeHandle
45 BM_MENU_ENTRY
*NewMenuEntry
;
46 BM_LOAD_CONTEXT
*NewLoadContext
;
48 VOID
*OptionsOpCodeHandle
;
51 if (BootOptionMenu
.MenuNumber
== 0) {
55 BootNextIndex
= NONE_BOOTNEXT_VALUE
;
57 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
58 ASSERT (OptionsOpCodeHandle
!= NULL
);
60 for (Index
= 0; Index
< BootOptionMenu
.MenuNumber
; Index
++) {
61 NewMenuEntry
= BOpt_GetMenuEntry (&BootOptionMenu
, Index
);
62 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
64 if (NewLoadContext
->IsBootNext
) {
65 HiiCreateOneOfOptionOpCode (
67 NewMenuEntry
->DisplayStringToken
,
68 EFI_IFR_OPTION_DEFAULT
,
69 EFI_IFR_TYPE_NUM_SIZE_32
,
72 BootNextIndex
= Index
;
74 HiiCreateOneOfOptionOpCode (
76 NewMenuEntry
->DisplayStringToken
,
78 EFI_IFR_TYPE_NUM_SIZE_32
,
84 if (BootNextIndex
== NONE_BOOTNEXT_VALUE
) {
85 HiiCreateOneOfOptionOpCode (
87 STRING_TOKEN (STR_NONE
),
88 EFI_IFR_OPTION_DEFAULT
,
89 EFI_IFR_TYPE_NUM_SIZE_32
,
93 HiiCreateOneOfOptionOpCode (
95 STRING_TOKEN (STR_NONE
),
97 EFI_IFR_TYPE_NUM_SIZE_32
,
102 HiiCreateOneOfOpCode (
104 (EFI_QUESTION_ID
) BOOT_NEXT_QUESTION_ID
,
105 VARSTORE_ID_BOOT_MAINT
,
106 BOOT_NEXT_VAR_OFFSET
,
107 STRING_TOKEN (STR_BOOT_NEXT
),
108 STRING_TOKEN (STR_BOOT_NEXT_HELP
),
110 EFI_IFR_NUMERIC_SIZE_4
,
115 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
120 Create Time Out Menu in the page.
122 @param[in] HiiHandle The hii handle for the Uiapp driver.
123 @param[in] StartOpCodeHandle The opcode handle to save the new opcode.
127 BmmCreateTimeOutMenu (
128 IN EFI_HII_HANDLE HiiHandle
,
129 IN VOID
*StartOpCodeHandle
132 HiiCreateNumericOpCode (
134 (EFI_QUESTION_ID
) FORM_TIME_OUT_ID
,
135 VARSTORE_ID_BOOT_MAINT
,
136 BOOT_TIME_OUT_VAR_OFFSET
,
137 STRING_TOKEN(STR_NUM_AUTO_BOOT
),
138 STRING_TOKEN(STR_HLP_AUTO_BOOT
),
139 EFI_IFR_FLAG_CALLBACK
,
140 EFI_IFR_NUMERIC_SIZE_2
| EFI_IFR_DISPLAY_UINT_DEC
,
149 Create Boot Option menu in the page.
151 @param[in] HiiHandle The hii handle for the Uiapp driver.
152 @param[in] StartOpCodeHandle The opcode handle to save the new opcode.
156 BmmCreateBootOptionMenu (
157 IN EFI_HII_HANDLE HiiHandle
,
158 IN VOID
*StartOpCodeHandle
161 HiiCreateGotoOpCode (
164 STRING_TOKEN (STR_FORM_BOOT_SETUP_TITLE
),
165 STRING_TOKEN (STR_FORM_BOOT_SETUP_HELP
),
166 EFI_IFR_FLAG_CALLBACK
,
172 Create Driver Option menu in the page.
174 @param[in] HiiHandle The hii handle for the Uiapp driver.
175 @param[in] StartOpCodeHandle The opcode handle to save the new opcode.
179 BmmCreateDriverOptionMenu (
180 IN EFI_HII_HANDLE HiiHandle
,
181 IN VOID
*StartOpCodeHandle
184 HiiCreateGotoOpCode (
186 FORM_DRIVER_SETUP_ID
,
187 STRING_TOKEN (STR_FORM_DRIVER_SETUP_TITLE
),
188 STRING_TOKEN (STR_FORM_DRIVER_SETUP_HELP
),
189 EFI_IFR_FLAG_CALLBACK
,
195 Create Com Option menu in the page.
197 @param[in] HiiHandle The hii handle for the Uiapp driver.
198 @param[in] StartOpCodeHandle The opcode handle to save the new opcode.
202 BmmCreateComOptionMenu (
203 IN EFI_HII_HANDLE HiiHandle
,
204 IN VOID
*StartOpCodeHandle
207 HiiCreateGotoOpCode (
210 STRING_TOKEN (STR_FORM_CON_MAIN_TITLE
),
211 STRING_TOKEN (STR_FORM_CON_MAIN_HELP
),
212 EFI_IFR_FLAG_CALLBACK
,
218 Create Com Option menu in the page.
220 @param[in] HiiHandle The hii handle for the Uiapp driver.
221 @param[in] StartOpCodeHandle The opcode handle to save the new opcode.
225 BmmCreateBootFromFileMenu (
226 IN EFI_HII_HANDLE HiiHandle
,
227 IN VOID
*StartOpCodeHandle
230 HiiCreateGotoOpCode (
233 STRING_TOKEN (STR_BOOT_FROM_FILE
),
234 STRING_TOKEN (STR_BOOT_FROM_FILE_HELP
),
235 EFI_IFR_FLAG_CALLBACK
,
236 KEY_VALUE_BOOT_FROM_FILE
241 Create empty line menu in the front page.
243 @param HiiHandle The hii handle for the Uiapp driver.
244 @param StartOpCodeHandle The opcode handle to save the new opcode.
249 IN EFI_HII_HANDLE HiiHandle
,
250 IN VOID
*StartOpCodeHandle
253 HiiCreateSubTitleOpCode (StartOpCodeHandle
, STRING_TOKEN (STR_NULL_STRING
), 0, 0, 0);
257 Extract device path for given HII handle and class guid.
259 @param Handle The HII handle.
261 @retval NULL Fail to get the device path string.
262 @return PathString Get the device path string.
266 ExtractDevicePathFromHandle (
267 IN EFI_HII_HANDLE Handle
271 EFI_HANDLE DriverHandle
;
273 ASSERT (Handle
!= NULL
);
275 if (Handle
== NULL
) {
279 Status
= gHiiDatabase
->GetPackageListHandle (gHiiDatabase
, Handle
, &DriverHandle
);
280 if (EFI_ERROR (Status
)) {
284 return ConvertDevicePathToText(DevicePathFromHandle (DriverHandle
), FALSE
, FALSE
);
288 Check whether this driver need to be shown in the front page.
290 @param HiiHandle The hii handle for the driver.
291 @param Guid The special guid for the driver which is the target.
292 @param PromptId Return the prompt string id.
293 @param HelpId Return the help string id.
294 @param FormsetGuid Return the formset guid info.
296 @retval EFI_SUCCESS Search the driver success
301 IN EFI_HII_HANDLE HiiHandle
,
303 OUT EFI_STRING_ID
*PromptId
,
304 OUT EFI_STRING_ID
*HelpId
,
305 OUT VOID
*FormsetGuid
311 EFI_IFR_FORM_SET
*Buffer
;
317 Status
= HiiGetFormSetFromHiiHandle(HiiHandle
, &Buffer
,&BufferSize
);
318 if (EFI_ERROR (Status
)) {
324 Ptr
= (UINT8
*) Buffer
;
325 while(TempSize
< BufferSize
) {
326 TempSize
+= ((EFI_IFR_OP_HEADER
*) Ptr
)->Length
;
328 if (((EFI_IFR_OP_HEADER
*) Ptr
)->Length
<= OFFSET_OF (EFI_IFR_FORM_SET
, Flags
)){
329 Ptr
+= ((EFI_IFR_OP_HEADER
*) Ptr
)->Length
;
333 ClassGuidNum
= (UINT8
) (((EFI_IFR_FORM_SET
*)Ptr
)->Flags
& 0x3);
334 ClassGuid
= (EFI_GUID
*) (VOID
*)(Ptr
+ sizeof (EFI_IFR_FORM_SET
));
335 while (ClassGuidNum
-- > 0) {
336 if (!CompareGuid (Guid
, ClassGuid
)){
341 *PromptId
= ((EFI_IFR_FORM_SET
*)Ptr
)->FormSetTitle
;
342 *HelpId
= ((EFI_IFR_FORM_SET
*)Ptr
)->Help
;
343 CopyMem (FormsetGuid
, &((EFI_IFR_FORM_SET
*) Ptr
)->Guid
, sizeof (EFI_GUID
));
354 Search the drivers in the system which need to show in the front page
355 and insert the menu to the front page.
357 @param HiiHandle The hii handle for the Uiapp driver.
358 @param ClassGuid The class guid for the driver which is the target.
359 @param SpecialHandlerFn The pointer to the specail handler function, if any.
360 @param StartOpCodeHandle The opcode handle to save the new opcode.
362 @retval EFI_SUCCESS Search the driver success
366 BmmListThirdPartyDrivers (
367 IN EFI_HII_HANDLE HiiHandle
,
368 IN EFI_GUID
*ClassGuid
,
369 IN DRIVER_SPECIAL_HANDLER SpecialHandlerFn
,
370 IN VOID
*StartOpCodeHandle
376 EFI_STRING_ID TokenHelp
;
377 EFI_HII_HANDLE
*HiiHandles
;
378 CHAR16
*DevicePathStr
;
381 UI_HII_DRIVER_INSTANCE
*DriverListPtr
;
383 BOOLEAN EmptyLineAfter
;
385 if (gHiiDriverList
!= NULL
) {
386 FreePool (gHiiDriverList
);
389 HiiHandles
= HiiGetHiiHandles (NULL
);
390 ASSERT (HiiHandles
!= NULL
);
392 gHiiDriverList
= AllocateZeroPool (UI_HII_DRIVER_LIST_SIZE
* sizeof (UI_HII_DRIVER_INSTANCE
));
393 ASSERT (gHiiDriverList
!= NULL
);
394 DriverListPtr
= gHiiDriverList
;
395 CurrentSize
= UI_HII_DRIVER_LIST_SIZE
;
397 for (Index
= 0, Count
= 0; HiiHandles
[Index
] != NULL
; Index
++) {
398 if (!IsRequiredDriver (HiiHandles
[Index
], ClassGuid
, &Token
, &TokenHelp
, &gHiiDriverList
[Count
].FormSetGuid
)) {
402 String
= HiiGetString (HiiHandles
[Index
], Token
, NULL
);
403 if (String
== NULL
) {
404 String
= HiiGetString (HiiHandle
, STRING_TOKEN (STR_MISSING_STRING
), NULL
);
405 ASSERT (String
!= NULL
);
406 } else if (SpecialHandlerFn
!= NULL
) {
408 // Check whether need to rename the driver name.
410 EmptyLineAfter
= FALSE
;
411 if (SpecialHandlerFn (String
, &NewName
, &EmptyLineAfter
)) {
414 DriverListPtr
[Count
].EmptyLineAfter
= EmptyLineAfter
;
417 DriverListPtr
[Count
].PromptId
= HiiSetString (HiiHandle
, 0, String
, NULL
);
420 String
= HiiGetString (HiiHandles
[Index
], TokenHelp
, NULL
);
421 if (String
== NULL
) {
422 String
= HiiGetString (HiiHandle
, STRING_TOKEN (STR_MISSING_STRING
), NULL
);
423 ASSERT (String
!= NULL
);
425 DriverListPtr
[Count
].HelpId
= HiiSetString (HiiHandle
, 0, String
, NULL
);
428 DevicePathStr
= ExtractDevicePathFromHandle(HiiHandles
[Index
]);
429 if (DevicePathStr
!= NULL
){
430 DriverListPtr
[Count
].DevicePathId
= HiiSetString (HiiHandle
, 0, DevicePathStr
, NULL
);
431 FreePool (DevicePathStr
);
433 DriverListPtr
[Count
].DevicePathId
= 0;
437 if (Count
>= CurrentSize
) {
438 DriverListPtr
= ReallocatePool (
439 CurrentSize
* sizeof (UI_HII_DRIVER_INSTANCE
),
440 (Count
+ UI_HII_DRIVER_LIST_SIZE
)
441 * sizeof (UI_HII_DRIVER_INSTANCE
),
444 ASSERT (DriverListPtr
!= NULL
);
445 gHiiDriverList
= DriverListPtr
;
446 CurrentSize
+= UI_HII_DRIVER_LIST_SIZE
;
450 FreePool (HiiHandles
);
453 while (gHiiDriverList
[Index
].PromptId
!= 0) {
454 HiiCreateGotoExOpCode (
457 gHiiDriverList
[Index
].PromptId
,
458 gHiiDriverList
[Index
].HelpId
,
462 &gHiiDriverList
[Index
].FormSetGuid
,
463 gHiiDriverList
[Index
].DevicePathId
466 if (gHiiDriverList
[Index
].EmptyLineAfter
) {
467 BmmCreateEmptyLine (HiiHandle
, StartOpCodeHandle
);