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