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