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