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