]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenanceManagerCustomizedUiSupport.c
BaseTools:Change the path of the file that Binary Cache
[mirror_edk2.git] / MdeModulePkg / Library / BootMaintenanceManagerUiLib / BootMaintenanceManagerCustomizedUiSupport.c
CommitLineData
a85be3ae
ED
1/** @file\r
2The functions for Boot Maintainence Main menu.\r
3\r
4Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.<BR>\r
9d510e61 5SPDX-License-Identifier: BSD-2-Clause-Patent\r
a85be3ae
ED
6\r
7**/\r
8\r
9\r
10#include "BootMaintenanceManager.h"\r
11#include "BootMaintenanceManagerCustomizedUiSupport.h"\r
12\r
13#define UI_HII_DRIVER_LIST_SIZE 0x8\r
14\r
15typedef struct {\r
16 EFI_STRING_ID PromptId;\r
17 EFI_STRING_ID HelpId;\r
18 EFI_STRING_ID DevicePathId;\r
19 EFI_GUID FormSetGuid;\r
20 BOOLEAN EmptyLineAfter;\r
21} UI_HII_DRIVER_INSTANCE;\r
22\r
7b13510f 23STATIC UI_HII_DRIVER_INSTANCE *gHiiDriverList;\r
a85be3ae
ED
24\r
25\r
26/**\r
27 Create the dynamic item to allow user to set the "BootNext" vaule.\r
28\r
8caa3caa
DB
29 @param[in] HiiHandle The hii handle for the Uiapp driver.\r
30 @param[in] StartOpCodeHandle The opcode handle to save the new opcode.\r
a85be3ae
ED
31\r
32**/\r
33VOID\r
34BmmCreateBootNextMenu(\r
35 IN EFI_HII_HANDLE HiiHandle,\r
36 IN VOID *StartOpCodeHandle\r
37 )\r
38{\r
39 BM_MENU_ENTRY *NewMenuEntry;\r
720eea6a 40 BM_LOAD_CONTEXT *NewLoadContext;\r
a85be3ae
ED
41 UINT16 Index;\r
42 VOID *OptionsOpCodeHandle;\r
720eea6a 43 UINT32 BootNextIndex;\r
a85be3ae 44\r
720eea6a 45 if (BootOptionMenu.MenuNumber == 0) {\r
a85be3ae
ED
46 return;\r
47 }\r
48\r
720eea6a
ED
49 BootNextIndex = NONE_BOOTNEXT_VALUE;\r
50\r
a85be3ae
ED
51 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
52 ASSERT (OptionsOpCodeHandle != NULL);\r
53\r
54 for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
55 NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
720eea6a
ED
56 NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
57\r
58 if (NewLoadContext->IsBootNext) {\r
59 HiiCreateOneOfOptionOpCode (\r
60 OptionsOpCodeHandle,\r
61 NewMenuEntry->DisplayStringToken,\r
62 EFI_IFR_OPTION_DEFAULT,\r
63 EFI_IFR_TYPE_NUM_SIZE_32,\r
64 Index\r
65 );\r
66 BootNextIndex = Index;\r
67 } else {\r
68 HiiCreateOneOfOptionOpCode (\r
69 OptionsOpCodeHandle,\r
70 NewMenuEntry->DisplayStringToken,\r
71 0,\r
72 EFI_IFR_TYPE_NUM_SIZE_32,\r
73 Index\r
74 );\r
75 }\r
76 }\r
a85be3ae 77\r
720eea6a
ED
78 if (BootNextIndex == NONE_BOOTNEXT_VALUE) {\r
79 HiiCreateOneOfOptionOpCode (\r
80 OptionsOpCodeHandle,\r
81 STRING_TOKEN (STR_NONE),\r
82 EFI_IFR_OPTION_DEFAULT,\r
83 EFI_IFR_TYPE_NUM_SIZE_32,\r
84 NONE_BOOTNEXT_VALUE\r
85 );\r
86 } else {\r
a85be3ae
ED
87 HiiCreateOneOfOptionOpCode (\r
88 OptionsOpCodeHandle,\r
720eea6a 89 STRING_TOKEN (STR_NONE),\r
a85be3ae 90 0,\r
720eea6a
ED
91 EFI_IFR_TYPE_NUM_SIZE_32,\r
92 NONE_BOOTNEXT_VALUE\r
a85be3ae
ED
93 );\r
94 }\r
95\r
a85be3ae
ED
96 HiiCreateOneOfOpCode (\r
97 StartOpCodeHandle,\r
98 (EFI_QUESTION_ID) BOOT_NEXT_QUESTION_ID,\r
99 VARSTORE_ID_BOOT_MAINT,\r
100 BOOT_NEXT_VAR_OFFSET,\r
101 STRING_TOKEN (STR_BOOT_NEXT),\r
102 STRING_TOKEN (STR_BOOT_NEXT_HELP),\r
103 0,\r
720eea6a 104 EFI_IFR_NUMERIC_SIZE_4,\r
a85be3ae
ED
105 OptionsOpCodeHandle,\r
106 NULL\r
107 );\r
108\r
109 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
110\r
111}\r
112\r
113/**\r
114 Create Time Out Menu in the page.\r
115\r
116 @param[in] HiiHandle The hii handle for the Uiapp driver.\r
117 @param[in] StartOpCodeHandle The opcode handle to save the new opcode.\r
a85be3ae
ED
118\r
119**/\r
120VOID\r
121BmmCreateTimeOutMenu (\r
122 IN EFI_HII_HANDLE HiiHandle,\r
123 IN VOID *StartOpCodeHandle\r
124 )\r
125{\r
126 HiiCreateNumericOpCode (\r
127 StartOpCodeHandle,\r
128 (EFI_QUESTION_ID) FORM_TIME_OUT_ID,\r
129 VARSTORE_ID_BOOT_MAINT,\r
130 BOOT_TIME_OUT_VAR_OFFSET,\r
131 STRING_TOKEN(STR_NUM_AUTO_BOOT),\r
132 STRING_TOKEN(STR_HLP_AUTO_BOOT),\r
133 EFI_IFR_FLAG_CALLBACK,\r
134 EFI_IFR_NUMERIC_SIZE_2 | EFI_IFR_DISPLAY_UINT_DEC,\r
135 0,\r
136 65535,\r
137 0,\r
138 NULL\r
139 );\r
140}\r
141\r
142/**\r
143 Create Boot Option menu in the page.\r
144\r
145 @param[in] HiiHandle The hii handle for the Uiapp driver.\r
146 @param[in] StartOpCodeHandle The opcode handle to save the new opcode.\r
147\r
148**/\r
149VOID\r
150BmmCreateBootOptionMenu (\r
151 IN EFI_HII_HANDLE HiiHandle,\r
152 IN VOID *StartOpCodeHandle\r
153 )\r
154{\r
155 HiiCreateGotoOpCode (\r
156 StartOpCodeHandle,\r
157 FORM_BOOT_SETUP_ID,\r
158 STRING_TOKEN (STR_FORM_BOOT_SETUP_TITLE),\r
159 STRING_TOKEN (STR_FORM_BOOT_SETUP_HELP),\r
160 EFI_IFR_FLAG_CALLBACK,\r
161 FORM_BOOT_SETUP_ID\r
162 );\r
163}\r
164\r
165/**\r
166 Create Driver Option menu in the page.\r
167\r
168 @param[in] HiiHandle The hii handle for the Uiapp driver.\r
169 @param[in] StartOpCodeHandle The opcode handle to save the new opcode.\r
170\r
171**/\r
172VOID\r
173BmmCreateDriverOptionMenu (\r
174 IN EFI_HII_HANDLE HiiHandle,\r
175 IN VOID *StartOpCodeHandle\r
176 )\r
177{\r
178 HiiCreateGotoOpCode (\r
179 StartOpCodeHandle,\r
180 FORM_DRIVER_SETUP_ID,\r
181 STRING_TOKEN (STR_FORM_DRIVER_SETUP_TITLE),\r
182 STRING_TOKEN (STR_FORM_DRIVER_SETUP_HELP),\r
183 EFI_IFR_FLAG_CALLBACK,\r
184 FORM_DRIVER_SETUP_ID\r
185 );\r
186}\r
187\r
188/**\r
189 Create Com Option menu in the page.\r
190\r
191 @param[in] HiiHandle The hii handle for the Uiapp driver.\r
192 @param[in] StartOpCodeHandle The opcode handle to save the new opcode.\r
193\r
194**/\r
195VOID\r
196BmmCreateComOptionMenu (\r
197 IN EFI_HII_HANDLE HiiHandle,\r
198 IN VOID *StartOpCodeHandle\r
199 )\r
200{\r
201 HiiCreateGotoOpCode (\r
202 StartOpCodeHandle,\r
203 FORM_CON_MAIN_ID,\r
204 STRING_TOKEN (STR_FORM_CON_MAIN_TITLE),\r
205 STRING_TOKEN (STR_FORM_CON_MAIN_HELP),\r
206 EFI_IFR_FLAG_CALLBACK,\r
207 FORM_CON_MAIN_ID\r
208 );\r
209}\r
210\r
211/**\r
212 Create Com Option menu in the page.\r
213\r
214 @param[in] HiiHandle The hii handle for the Uiapp driver.\r
215 @param[in] StartOpCodeHandle The opcode handle to save the new opcode.\r
a85be3ae
ED
216\r
217**/\r
218VOID\r
219BmmCreateBootFromFileMenu (\r
220 IN EFI_HII_HANDLE HiiHandle,\r
221 IN VOID *StartOpCodeHandle\r
222 )\r
223{\r
224 HiiCreateGotoOpCode (\r
225 StartOpCodeHandle,\r
226 FORM_MAIN_ID,\r
227 STRING_TOKEN (STR_BOOT_FROM_FILE),\r
228 STRING_TOKEN (STR_BOOT_FROM_FILE_HELP),\r
229 EFI_IFR_FLAG_CALLBACK,\r
230 KEY_VALUE_BOOT_FROM_FILE\r
231 );\r
232}\r
233\r
234/**\r
235 Create empty line menu in the front page.\r
236\r
237 @param HiiHandle The hii handle for the Uiapp driver.\r
238 @param StartOpCodeHandle The opcode handle to save the new opcode.\r
239\r
240**/\r
241VOID\r
242BmmCreateEmptyLine (\r
243 IN EFI_HII_HANDLE HiiHandle,\r
244 IN VOID *StartOpCodeHandle\r
245 )\r
246{\r
247 HiiCreateSubTitleOpCode (StartOpCodeHandle, STRING_TOKEN (STR_NULL_STRING), 0, 0, 0);\r
248}\r
249\r
250/**\r
251 Extract device path for given HII handle and class guid.\r
252\r
253 @param Handle The HII handle.\r
254\r
255 @retval NULL Fail to get the device path string.\r
256 @return PathString Get the device path string.\r
257\r
258**/\r
259CHAR16 *\r
260ExtractDevicePathFromHandle (\r
261 IN EFI_HII_HANDLE Handle\r
262 )\r
263{\r
264 EFI_STATUS Status;\r
265 EFI_HANDLE DriverHandle;\r
266\r
267 ASSERT (Handle != NULL);\r
268\r
269 if (Handle == NULL) {\r
270 return NULL;\r
271 }\r
272\r
273 Status = gHiiDatabase->GetPackageListHandle (gHiiDatabase, Handle, &DriverHandle);\r
274 if (EFI_ERROR (Status)) {\r
275 return NULL;\r
276 }\r
277\r
278 return ConvertDevicePathToText(DevicePathFromHandle (DriverHandle), FALSE, FALSE);\r
279}\r
280\r
281/**\r
282 Check whether this driver need to be shown in the front page.\r
283\r
284 @param HiiHandle The hii handle for the driver.\r
285 @param Guid The special guid for the driver which is the target.\r
286 @param PromptId Return the prompt string id.\r
287 @param HelpId Return the help string id.\r
288 @param FormsetGuid Return the formset guid info.\r
289\r
290 @retval EFI_SUCCESS Search the driver success\r
291\r
292**/\r
293BOOLEAN\r
294IsRequiredDriver (\r
295 IN EFI_HII_HANDLE HiiHandle,\r
296 IN EFI_GUID *Guid,\r
297 OUT EFI_STRING_ID *PromptId,\r
298 OUT EFI_STRING_ID *HelpId,\r
299 OUT VOID *FormsetGuid\r
300 )\r
301{\r
302 EFI_STATUS Status;\r
303 UINT8 ClassGuidNum;\r
304 EFI_GUID *ClassGuid;\r
305 EFI_IFR_FORM_SET *Buffer;\r
306 UINTN BufferSize;\r
307 UINT8 *Ptr;\r
308 UINTN TempSize;\r
309 BOOLEAN RetVal;\r
310\r
311 Status = HiiGetFormSetFromHiiHandle(HiiHandle, &Buffer,&BufferSize);\r
312 if (EFI_ERROR (Status)) {\r
313 return FALSE;\r
314 }\r
315\r
316 RetVal = FALSE;\r
317 TempSize = 0;\r
318 Ptr = (UINT8 *) Buffer;\r
319 while(TempSize < BufferSize) {\r
320 TempSize += ((EFI_IFR_OP_HEADER *) Ptr)->Length;\r
321\r
322 if (((EFI_IFR_OP_HEADER *) Ptr)->Length <= OFFSET_OF (EFI_IFR_FORM_SET, Flags)){\r
323 Ptr += ((EFI_IFR_OP_HEADER *) Ptr)->Length;\r
324 continue;\r
325 }\r
326\r
327 ClassGuidNum = (UINT8) (((EFI_IFR_FORM_SET *)Ptr)->Flags & 0x3);\r
328 ClassGuid = (EFI_GUID *) (VOID *)(Ptr + sizeof (EFI_IFR_FORM_SET));\r
329 while (ClassGuidNum-- > 0) {\r
330 if (!CompareGuid (Guid, ClassGuid)){\r
331 ClassGuid ++;\r
332 continue;\r
333 }\r
334\r
335 *PromptId = ((EFI_IFR_FORM_SET *)Ptr)->FormSetTitle;\r
336 *HelpId = ((EFI_IFR_FORM_SET *)Ptr)->Help;\r
337 CopyMem (FormsetGuid, &((EFI_IFR_FORM_SET *) Ptr)->Guid, sizeof (EFI_GUID));\r
338 RetVal = TRUE;\r
339 }\r
340 }\r
341\r
342 FreePool (Buffer);\r
343\r
344 return RetVal;\r
345}\r
346\r
347/**\r
348 Search the drivers in the system which need to show in the front page\r
349 and insert the menu to the front page.\r
350\r
351 @param HiiHandle The hii handle for the Uiapp driver.\r
352 @param ClassGuid The class guid for the driver which is the target.\r
8caa3caa 353 @param SpecialHandlerFn The pointer to the specail handler function, if any.\r
a85be3ae 354 @param StartOpCodeHandle The opcode handle to save the new opcode.\r
a85be3ae
ED
355\r
356 @retval EFI_SUCCESS Search the driver success\r
357\r
358**/\r
359EFI_STATUS\r
360BmmListThirdPartyDrivers (\r
361 IN EFI_HII_HANDLE HiiHandle,\r
362 IN EFI_GUID *ClassGuid,\r
363 IN DRIVER_SPECIAL_HANDLER SpecialHandlerFn,\r
364 IN VOID *StartOpCodeHandle\r
365 )\r
366{\r
367 UINTN Index;\r
368 EFI_STRING String;\r
369 EFI_STRING_ID Token;\r
370 EFI_STRING_ID TokenHelp;\r
371 EFI_HII_HANDLE *HiiHandles;\r
372 CHAR16 *DevicePathStr;\r
373 UINTN Count;\r
374 UINTN CurrentSize;\r
375 UI_HII_DRIVER_INSTANCE *DriverListPtr;\r
376 EFI_STRING NewName;\r
377 BOOLEAN EmptyLineAfter;\r
378\r
379 if (gHiiDriverList != NULL) {\r
380 FreePool (gHiiDriverList);\r
381 }\r
382\r
383 HiiHandles = HiiGetHiiHandles (NULL);\r
384 ASSERT (HiiHandles != NULL);\r
385\r
386 gHiiDriverList = AllocateZeroPool (UI_HII_DRIVER_LIST_SIZE * sizeof (UI_HII_DRIVER_INSTANCE));\r
387 ASSERT (gHiiDriverList != NULL);\r
388 DriverListPtr = gHiiDriverList;\r
389 CurrentSize = UI_HII_DRIVER_LIST_SIZE;\r
390\r
391 for (Index = 0, Count = 0; HiiHandles[Index] != NULL; Index++) {\r
392 if (!IsRequiredDriver (HiiHandles[Index], ClassGuid, &Token, &TokenHelp, &gHiiDriverList[Count].FormSetGuid)) {\r
393 continue;\r
394 }\r
395\r
396 String = HiiGetString (HiiHandles[Index], Token, NULL);\r
397 if (String == NULL) {\r
398 String = HiiGetString (HiiHandle, STRING_TOKEN (STR_MISSING_STRING), NULL);\r
399 ASSERT (String != NULL);\r
400 } else if (SpecialHandlerFn != NULL) {\r
401 //\r
402 // Check whether need to rename the driver name.\r
403 //\r
404 EmptyLineAfter = FALSE;\r
405 if (SpecialHandlerFn (String, &NewName, &EmptyLineAfter)) {\r
406 FreePool (String);\r
407 String = NewName;\r
408 DriverListPtr[Count].EmptyLineAfter = EmptyLineAfter;\r
409 }\r
410 }\r
411 DriverListPtr[Count].PromptId = HiiSetString (HiiHandle, 0, String, NULL);\r
412 FreePool (String);\r
413\r
414 String = HiiGetString (HiiHandles[Index], TokenHelp, NULL);\r
415 if (String == NULL) {\r
416 String = HiiGetString (HiiHandle, STRING_TOKEN (STR_MISSING_STRING), NULL);\r
417 ASSERT (String != NULL);\r
418 }\r
419 DriverListPtr[Count].HelpId = HiiSetString (HiiHandle, 0, String, NULL);\r
420 FreePool (String);\r
421\r
422 DevicePathStr = ExtractDevicePathFromHandle(HiiHandles[Index]);\r
423 if (DevicePathStr != NULL){\r
424 DriverListPtr[Count].DevicePathId = HiiSetString (HiiHandle, 0, DevicePathStr, NULL);\r
425 FreePool (DevicePathStr);\r
426 } else {\r
427 DriverListPtr[Count].DevicePathId = 0;\r
428 }\r
429\r
430 Count++;\r
431 if (Count >= CurrentSize) {\r
469293f8
JW
432 DriverListPtr = ReallocatePool (\r
433 CurrentSize * sizeof (UI_HII_DRIVER_INSTANCE),\r
434 (Count + UI_HII_DRIVER_LIST_SIZE)\r
435 * sizeof (UI_HII_DRIVER_INSTANCE),\r
436 gHiiDriverList\r
437 );\r
a85be3ae 438 ASSERT (DriverListPtr != NULL);\r
a85be3ae
ED
439 gHiiDriverList = DriverListPtr;\r
440 CurrentSize += UI_HII_DRIVER_LIST_SIZE;\r
441 }\r
442 }\r
443\r
444 FreePool (HiiHandles);\r
445\r
446 Index = 0;\r
447 while (gHiiDriverList[Index].PromptId != 0) {\r
448 HiiCreateGotoExOpCode (\r
449 StartOpCodeHandle,\r
450 0,\r
451 gHiiDriverList[Index].PromptId,\r
452 gHiiDriverList[Index].HelpId,\r
453 0,\r
454 0,\r
455 0,\r
456 &gHiiDriverList[Index].FormSetGuid,\r
457 gHiiDriverList[Index].DevicePathId\r
458 );\r
459\r
460 if (gHiiDriverList[Index].EmptyLineAfter) {\r
461 BmmCreateEmptyLine (HiiHandle, StartOpCodeHandle);\r
462 }\r
463\r
464 Index ++;\r
465 }\r
466\r
467 return EFI_SUCCESS;\r
468}\r
469\r