]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Application/UiApp/FrontPageCustomizedUiSupport.c
IntelSiliconPkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / MdeModulePkg / Application / UiApp / FrontPageCustomizedUiSupport.c
CommitLineData
c9802c45
ED
1/** @file\r
2\r
3 This library class defines a set of interfaces to customize Ui module\r
4\r
5Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>\r
6This program and the accompanying materials are licensed and made available under\r
7the terms and conditions of the BSD License that accompanies this distribution.\r
8The full text of the license may be found at\r
9http://opensource.org/licenses/bsd-license.php.\r
10\r
11THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
12WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13\r
14**/\r
15#include <Uefi.h>\r
16\r
17#include <Guid/MdeModuleHii.h>\r
18#include <Guid/GlobalVariable.h>\r
19\r
20#include <Protocol/HiiConfigAccess.h>\r
21#include <Protocol/HiiString.h>\r
22\r
23#include <Library/HiiLib.h>\r
24#include <Library/DebugLib.h>\r
25#include <Library/UefiLib.h>\r
26#include <Library/BaseMemoryLib.h>\r
27#include <Library/PcdLib.h>\r
28#include <Library/MemoryAllocationLib.h>\r
29#include <Library/UefiRuntimeServicesTableLib.h>\r
30#include <Library/UefiHiiServicesLib.h>\r
31#include <Library/DevicePathLib.h>\r
32#include <Library/UefiBootServicesTableLib.h>\r
33#include "FrontPageCustomizedUiSupport.h"\r
34\r
35//\r
36// This is the VFR compiler generated header file which defines the\r
37// string identifiers.\r
38//\r
39#define PRINTABLE_LANGUAGE_NAME_STRING_ID 0x0001\r
40\r
41#define UI_HII_DRIVER_LIST_SIZE 0x8\r
42\r
43#define FRONT_PAGE_KEY_CONTINUE 0x1000\r
44#define FRONT_PAGE_KEY_RESET 0x1001\r
45#define FRONT_PAGE_KEY_LANGUAGE 0x1002\r
7d467158 46#define FRONT_PAGE_KEY_DRIVER 0x2000\r
c9802c45
ED
47\r
48typedef struct {\r
49 EFI_STRING_ID PromptId;\r
50 EFI_STRING_ID HelpId;\r
51 EFI_STRING_ID DevicePathId;\r
52 EFI_GUID FormSetGuid;\r
53 BOOLEAN EmptyLineAfter;\r
54} UI_HII_DRIVER_INSTANCE;\r
55\r
56CHAR8 *gLanguageString;\r
57EFI_STRING_ID *gLanguageToken;\r
58UI_HII_DRIVER_INSTANCE *gHiiDriverList;\r
7258076b 59extern EFI_HII_HANDLE gStringPackHandle;\r
e4260252 60UINT8 gCurrentLanguageIndex;\r
c9802c45
ED
61\r
62\r
63/**\r
64 Get next language from language code list (with separator ';').\r
65\r
66 If LangCode is NULL, then ASSERT.\r
67 If Lang is NULL, then ASSERT.\r
68\r
69 @param LangCode On input: point to first language in the list. On\r
70 output: point to next language in the list, or\r
71 NULL if no more language in the list.\r
72 @param Lang The first language in the list.\r
73\r
74**/\r
75VOID\r
76GetNextLanguage (\r
77 IN OUT CHAR8 **LangCode,\r
78 OUT CHAR8 *Lang\r
79 )\r
80{\r
81 UINTN Index;\r
82 CHAR8 *StringPtr;\r
83\r
84 ASSERT (LangCode != NULL);\r
85 ASSERT (*LangCode != NULL);\r
86 ASSERT (Lang != NULL);\r
87\r
88 Index = 0;\r
89 StringPtr = *LangCode;\r
90 while (StringPtr[Index] != 0 && StringPtr[Index] != ';') {\r
91 Index++;\r
92 }\r
93\r
94 CopyMem (Lang, StringPtr, Index);\r
95 Lang[Index] = 0;\r
96\r
97 if (StringPtr[Index] == ';') {\r
98 Index++;\r
99 }\r
100 *LangCode = StringPtr + Index;\r
101}\r
102\r
103/**\r
104 This function processes the language changes in configuration.\r
105\r
106 @param Value A pointer to the data being sent to the original exporting driver.\r
107\r
108\r
109 @retval TRUE The callback successfully handled the action.\r
110 @retval FALSE The callback not supported in this handler.\r
111\r
112**/\r
113EFI_STATUS\r
114LanguageChangeHandler (\r
115 IN EFI_IFR_TYPE_VALUE *Value\r
116 )\r
117{\r
118 CHAR8 *LangCode;\r
119 CHAR8 *Lang;\r
120 UINTN Index;\r
121 EFI_STATUS Status;\r
122\r
123 //\r
124 // Allocate working buffer for RFC 4646 language in supported LanguageString.\r
125 //\r
126 Lang = AllocatePool (AsciiStrSize (gLanguageString));\r
127 ASSERT (Lang != NULL);\r
128\r
129 Index = 0;\r
130 LangCode = gLanguageString;\r
131 while (*LangCode != 0) {\r
132 GetNextLanguage (&LangCode, Lang);\r
133\r
134 if (Index == Value->u8) {\r
e4260252 135 gCurrentLanguageIndex = Value->u8;\r
c9802c45
ED
136 break;\r
137 }\r
138\r
139 Index++;\r
140 }\r
141\r
142 if (Index == Value->u8) {\r
143 Status = gRT->SetVariable (\r
144 L"PlatformLang",\r
145 &gEfiGlobalVariableGuid,\r
146 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
147 AsciiStrSize (Lang),\r
148 Lang\r
149 );\r
150 if (EFI_ERROR (Status)) {\r
151 FreePool (Lang);\r
152 return EFI_DEVICE_ERROR;\r
153 }\r
154 } else {\r
155 ASSERT (FALSE);\r
156 }\r
157 FreePool (Lang);\r
158\r
159 return EFI_SUCCESS;\r
160}\r
161\r
162/**\r
163 This function processes the results of changes in configuration.\r
164\r
165\r
166 @param HiiHandle Points to the hii handle for this formset.\r
167 @param Action Specifies the type of action taken by the browser.\r
168 @param QuestionId A unique value which is sent to the original exporting driver\r
169 so that it can identify the type of data to expect.\r
170 @param Type The type of value for the question.\r
171 @param Value A pointer to the data being sent to the original exporting driver.\r
172 @param ActionRequest On return, points to the action requested by the callback function.\r
173 @param Status Return the handle status.\r
174\r
175 @retval TRUE The callback successfully handled the action.\r
176 @retval FALSE The callback not supported in this handler.\r
177\r
178**/\r
179BOOLEAN\r
180UiSupportLibCallbackHandler (\r
181 IN EFI_HII_HANDLE HiiHandle,\r
182 IN EFI_BROWSER_ACTION Action,\r
183 IN EFI_QUESTION_ID QuestionId,\r
184 IN UINT8 Type,\r
185 IN EFI_IFR_TYPE_VALUE *Value,\r
186 OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest,\r
187 OUT EFI_STATUS *Status\r
188 )\r
189{\r
190 if (QuestionId != FRONT_PAGE_KEY_CONTINUE &&\r
191 QuestionId != FRONT_PAGE_KEY_RESET &&\r
192 QuestionId != FRONT_PAGE_KEY_LANGUAGE) {\r
193 return FALSE;\r
194 }\r
195\r
e4260252
DB
196 if (Action == EFI_BROWSER_ACTION_RETRIEVE) {\r
197 if (QuestionId == FRONT_PAGE_KEY_LANGUAGE) {\r
198 Value->u8 = gCurrentLanguageIndex;\r
199 *Status = EFI_SUCCESS;\r
200 } else {\r
201 *Status = EFI_UNSUPPORTED;\r
202 }\r
203 return TRUE;\r
204 }\r
205\r
c9802c45
ED
206 if (Action != EFI_BROWSER_ACTION_CHANGED) {\r
207 //\r
208 // Do nothing for other UEFI Action. Only do call back when data is changed.\r
209 //\r
210 *Status = EFI_UNSUPPORTED;\r
81c14606 211 return TRUE;\r
c9802c45
ED
212 }\r
213\r
214 if (Action == EFI_BROWSER_ACTION_CHANGED) {\r
215 if ((Value == NULL) || (ActionRequest == NULL)) {\r
216 *Status = EFI_INVALID_PARAMETER;\r
81c14606 217 return TRUE;\r
c9802c45
ED
218 }\r
219\r
220 *Status = EFI_SUCCESS;\r
221 switch (QuestionId) {\r
222 case FRONT_PAGE_KEY_CONTINUE:\r
223 //\r
224 // This is the continue - clear the screen and return an error to get out of FrontPage loop\r
225 //\r
226 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;\r
227 break;\r
228\r
229 case FRONT_PAGE_KEY_LANGUAGE:\r
230 *Status = LanguageChangeHandler(Value);\r
231 break;\r
232\r
233 case FRONT_PAGE_KEY_RESET:\r
234 //\r
235 // Reset\r
236 //\r
237 gRT->ResetSystem (EfiResetCold, EFI_SUCCESS, 0, NULL);\r
238 *Status = EFI_UNSUPPORTED;\r
239\r
240 default:\r
241 break;\r
242 }\r
243 }\r
244\r
245 return TRUE;\r
246}\r
247\r
248/**\r
249 Create Select language menu in the front page with oneof opcode.\r
250\r
251 @param[in] HiiHandle The hii handle for the Uiapp driver.\r
c9802c45
ED
252 @param[in] StartOpCodeHandle The opcode handle to save the new opcode.\r
253\r
c9802c45
ED
254**/\r
255VOID\r
256UiCreateLanguageMenu (\r
257 IN EFI_HII_HANDLE HiiHandle,\r
258 IN VOID *StartOpCodeHandle\r
259 )\r
260{\r
261 CHAR8 *LangCode;\r
262 CHAR8 *Lang;\r
b68ccac1 263 UINTN LangSize;\r
c9802c45
ED
264 CHAR8 *CurrentLang;\r
265 UINTN OptionCount;\r
266 CHAR16 *StringBuffer;\r
267 VOID *OptionsOpCodeHandle;\r
268 UINTN StringSize;\r
269 EFI_STATUS Status;\r
270 EFI_HII_STRING_PROTOCOL *HiiString;\r
271\r
272 Lang = NULL;\r
273 StringBuffer = NULL;\r
274\r
275 //\r
276 // Init OpCode Handle and Allocate space for creation of UpdateData Buffer\r
277 //\r
278 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
279 ASSERT (OptionsOpCodeHandle != NULL);\r
280\r
281 GetEfiGlobalVariable2 (L"PlatformLang", (VOID**)&CurrentLang, NULL);\r
282\r
283 //\r
284 // Get Support language list from variable.\r
285 //\r
286 GetEfiGlobalVariable2 (L"PlatformLangCodes", (VOID**)&gLanguageString, NULL);\r
287 if (gLanguageString == NULL) {\r
288 gLanguageString = AllocateCopyPool (\r
289 AsciiStrSize ((CHAR8 *) PcdGetPtr (PcdUefiVariableDefaultPlatformLangCodes)),\r
290 (CHAR8 *) PcdGetPtr (PcdUefiVariableDefaultPlatformLangCodes)\r
291 );\r
292 ASSERT (gLanguageString != NULL);\r
293 }\r
294\r
295 if (gLanguageToken == NULL) {\r
296 //\r
297 // Count the language list number.\r
298 //\r
299 LangCode = gLanguageString;\r
300 Lang = AllocatePool (AsciiStrSize (gLanguageString));\r
301 ASSERT (Lang != NULL);\r
302\r
303 OptionCount = 0;\r
304 while (*LangCode != 0) {\r
305 GetNextLanguage (&LangCode, Lang);\r
306 OptionCount ++;\r
307 }\r
308\r
309 //\r
310 // Allocate extra 1 as the end tag.\r
311 //\r
312 gLanguageToken = AllocateZeroPool ((OptionCount + 1) * sizeof (EFI_STRING_ID));\r
313 ASSERT (gLanguageToken != NULL);\r
314\r
315 Status = gBS->LocateProtocol (&gEfiHiiStringProtocolGuid, NULL, (VOID **) &HiiString);\r
316 ASSERT_EFI_ERROR (Status);\r
317\r
318 LangCode = gLanguageString;\r
319 OptionCount = 0;\r
320 while (*LangCode != 0) {\r
321 GetNextLanguage (&LangCode, Lang);\r
322\r
323 StringSize = 0;\r
324 Status = HiiString->GetString (HiiString, Lang, HiiHandle, PRINTABLE_LANGUAGE_NAME_STRING_ID, StringBuffer, &StringSize, NULL);\r
325 if (Status == EFI_BUFFER_TOO_SMALL) {\r
326 StringBuffer = AllocateZeroPool (StringSize);\r
327 ASSERT (StringBuffer != NULL);\r
328 Status = HiiString->GetString (HiiString, Lang, HiiHandle, PRINTABLE_LANGUAGE_NAME_STRING_ID, StringBuffer, &StringSize, NULL);\r
329 ASSERT_EFI_ERROR (Status);\r
330 }\r
331\r
332 if (EFI_ERROR (Status)) {\r
b68ccac1
SZ
333 LangSize = AsciiStrSize (Lang);\r
334 StringBuffer = AllocatePool (LangSize * sizeof (CHAR16));\r
c9802c45 335 ASSERT (StringBuffer != NULL);\r
b68ccac1 336 AsciiStrToUnicodeStrS (Lang, StringBuffer, LangSize);\r
c9802c45
ED
337 }\r
338\r
339 ASSERT (StringBuffer != NULL);\r
340 gLanguageToken[OptionCount] = HiiSetString (HiiHandle, 0, StringBuffer, NULL);\r
341 FreePool (StringBuffer);\r
342\r
343 OptionCount++;\r
344 }\r
345 }\r
346\r
347 ASSERT (gLanguageToken != NULL);\r
348 LangCode = gLanguageString;\r
349 OptionCount = 0;\r
350 if (Lang == NULL) {\r
351 Lang = AllocatePool (AsciiStrSize (gLanguageString));\r
352 ASSERT (Lang != NULL);\r
353 }\r
354 while (*LangCode != 0) {\r
355 GetNextLanguage (&LangCode, Lang);\r
356\r
357 if (CurrentLang != NULL && AsciiStrCmp (Lang, CurrentLang) == 0) {\r
358 HiiCreateOneOfOptionOpCode (\r
359 OptionsOpCodeHandle,\r
360 gLanguageToken[OptionCount],\r
361 EFI_IFR_OPTION_DEFAULT,\r
362 EFI_IFR_NUMERIC_SIZE_1,\r
363 (UINT8) OptionCount\r
364 );\r
e4260252 365 gCurrentLanguageIndex = (UINT8) OptionCount;\r
c9802c45
ED
366 } else {\r
367 HiiCreateOneOfOptionOpCode (\r
368 OptionsOpCodeHandle,\r
369 gLanguageToken[OptionCount],\r
370 0,\r
371 EFI_IFR_NUMERIC_SIZE_1,\r
372 (UINT8) OptionCount\r
373 );\r
374 }\r
375\r
376 OptionCount++;\r
377 }\r
378\r
379 if (CurrentLang != NULL) {\r
380 FreePool (CurrentLang);\r
381 }\r
382 FreePool (Lang);\r
383\r
384 HiiCreateOneOfOpCode (\r
385 StartOpCodeHandle,\r
386 FRONT_PAGE_KEY_LANGUAGE,\r
387 0,\r
388 0,\r
389 STRING_TOKEN (STR_LANGUAGE_SELECT),\r
390 STRING_TOKEN (STR_LANGUAGE_SELECT_HELP),\r
391 EFI_IFR_FLAG_CALLBACK,\r
392 EFI_IFR_NUMERIC_SIZE_1,\r
393 OptionsOpCodeHandle,\r
394 NULL\r
395 );\r
396}\r
397\r
398/**\r
399 Create continue menu in the front page.\r
400\r
401 @param[in] HiiHandle The hii handle for the Uiapp driver.\r
402 @param[in] StartOpCodeHandle The opcode handle to save the new opcode.\r
403\r
404**/\r
405VOID\r
406UiCreateContinueMenu (\r
407 IN EFI_HII_HANDLE HiiHandle,\r
408 IN VOID *StartOpCodeHandle\r
409 )\r
410{\r
411 HiiCreateActionOpCode (\r
412 StartOpCodeHandle,\r
413 FRONT_PAGE_KEY_CONTINUE,\r
414 STRING_TOKEN (STR_CONTINUE_PROMPT),\r
415 STRING_TOKEN (STR_CONTINUE_PROMPT),\r
416 EFI_IFR_FLAG_CALLBACK,\r
417 0\r
418 );\r
419}\r
420\r
421/**\r
422 Create empty line menu in the front page.\r
423\r
424 @param HiiHandle The hii handle for the Uiapp driver.\r
425 @param StartOpCodeHandle The opcode handle to save the new opcode.\r
426\r
427**/\r
428VOID\r
429UiCreateEmptyLine (\r
430 IN EFI_HII_HANDLE HiiHandle,\r
431 IN VOID *StartOpCodeHandle\r
432 )\r
433{\r
434 HiiCreateSubTitleOpCode (StartOpCodeHandle, STRING_TOKEN (STR_NULL_STRING), 0, 0, 0);\r
435}\r
436\r
437/**\r
438 Create Reset menu in the front page.\r
439\r
440 @param[in] HiiHandle The hii handle for the Uiapp driver.\r
441 @param[in] StartOpCodeHandle The opcode handle to save the new opcode.\r
442\r
443**/\r
444VOID\r
445UiCreateResetMenu (\r
446 IN EFI_HII_HANDLE HiiHandle,\r
447 IN VOID *StartOpCodeHandle\r
448 )\r
449{\r
450 HiiCreateActionOpCode (\r
451 StartOpCodeHandle,\r
452 FRONT_PAGE_KEY_RESET,\r
453 STRING_TOKEN (STR_RESET_STRING),\r
454 STRING_TOKEN (STR_RESET_STRING),\r
455 EFI_IFR_FLAG_CALLBACK,\r
456 0\r
457 );\r
458}\r
459\r
460/**\r
461 Extract device path for given HII handle and class guid.\r
462\r
463 @param Handle The HII handle.\r
464\r
465 @retval NULL Fail to get the device path string.\r
466 @return PathString Get the device path string.\r
467\r
468**/\r
469CHAR16 *\r
470ExtractDevicePathFromHiiHandle (\r
471 IN EFI_HII_HANDLE Handle\r
472 )\r
473{\r
474 EFI_STATUS Status;\r
475 EFI_HANDLE DriverHandle;\r
476\r
477 ASSERT (Handle != NULL);\r
478\r
479 if (Handle == NULL) {\r
480 return NULL;\r
481 }\r
482\r
483 Status = gHiiDatabase->GetPackageListHandle (gHiiDatabase, Handle, &DriverHandle);\r
484 if (EFI_ERROR (Status)) {\r
485 return NULL;\r
486 }\r
487\r
488 return ConvertDevicePathToText(DevicePathFromHandle (DriverHandle), FALSE, FALSE);\r
489}\r
490\r
491/**\r
492 Check whether this driver need to be shown in the front page.\r
493\r
494 @param HiiHandle The hii handle for the driver.\r
495 @param Guid The special guid for the driver which is the target.\r
496 @param PromptId Return the prompt string id.\r
497 @param HelpId Return the help string id.\r
498 @param FormsetGuid Return the formset guid info.\r
499\r
500 @retval EFI_SUCCESS Search the driver success\r
501\r
502**/\r
503BOOLEAN\r
504RequiredDriver (\r
505 IN EFI_HII_HANDLE HiiHandle,\r
506 IN EFI_GUID *Guid,\r
507 OUT EFI_STRING_ID *PromptId,\r
508 OUT EFI_STRING_ID *HelpId,\r
509 OUT VOID *FormsetGuid\r
510 )\r
511{\r
512 EFI_STATUS Status;\r
513 UINT8 ClassGuidNum;\r
514 EFI_GUID *ClassGuid;\r
515 EFI_IFR_FORM_SET *Buffer;\r
516 UINTN BufferSize;\r
517 UINT8 *Ptr;\r
518 UINTN TempSize;\r
519 BOOLEAN RetVal;\r
520\r
521 Status = HiiGetFormSetFromHiiHandle(HiiHandle, &Buffer,&BufferSize);\r
522 if (EFI_ERROR (Status)) {\r
523 return FALSE;\r
524 }\r
525\r
526 RetVal = FALSE;\r
527 TempSize = 0;\r
528 Ptr = (UINT8 *) Buffer;\r
529 while(TempSize < BufferSize) {\r
530 TempSize += ((EFI_IFR_OP_HEADER *) Ptr)->Length;\r
531\r
532 if (((EFI_IFR_OP_HEADER *) Ptr)->Length <= OFFSET_OF (EFI_IFR_FORM_SET, Flags)){\r
533 Ptr += ((EFI_IFR_OP_HEADER *) Ptr)->Length;\r
534 continue;\r
535 }\r
536\r
537 ClassGuidNum = (UINT8) (((EFI_IFR_FORM_SET *)Ptr)->Flags & 0x3);\r
538 ClassGuid = (EFI_GUID *) (VOID *)(Ptr + sizeof (EFI_IFR_FORM_SET));\r
539 while (ClassGuidNum-- > 0) {\r
540 if (!CompareGuid (Guid, ClassGuid)){\r
541 ClassGuid ++;\r
542 continue;\r
543 }\r
544\r
545 *PromptId = ((EFI_IFR_FORM_SET *)Ptr)->FormSetTitle;\r
546 *HelpId = ((EFI_IFR_FORM_SET *)Ptr)->Help;\r
547 CopyMem (FormsetGuid, &((EFI_IFR_FORM_SET *) Ptr)->Guid, sizeof (EFI_GUID));\r
548 RetVal = TRUE;\r
549 }\r
550 }\r
551\r
552 FreePool (Buffer);\r
553\r
554 return RetVal;\r
555}\r
556\r
557/**\r
558 Search the drivers in the system which need to show in the front page\r
559 and insert the menu to the front page.\r
560\r
561 @param HiiHandle The hii handle for the Uiapp driver.\r
562 @param ClassGuid The class guid for the driver which is the target.\r
8caa3caa 563 @param SpecialHandlerFn The pointer to the specail handler function, if any.\r
c9802c45 564 @param StartOpCodeHandle The opcode handle to save the new opcode.\r
c9802c45
ED
565\r
566 @retval EFI_SUCCESS Search the driver success\r
567\r
568**/\r
569EFI_STATUS\r
570UiListThirdPartyDrivers (\r
571 IN EFI_HII_HANDLE HiiHandle,\r
572 IN EFI_GUID *ClassGuid,\r
573 IN DRIVER_SPECIAL_HANDLER SpecialHandlerFn,\r
574 IN VOID *StartOpCodeHandle\r
575 )\r
576{\r
577 UINTN Index;\r
578 EFI_STRING String;\r
579 EFI_STRING_ID Token;\r
580 EFI_STRING_ID TokenHelp;\r
581 EFI_HII_HANDLE *HiiHandles;\r
582 CHAR16 *DevicePathStr;\r
583 UINTN Count;\r
584 UINTN CurrentSize;\r
585 UI_HII_DRIVER_INSTANCE *DriverListPtr;\r
586 EFI_STRING NewName;\r
587 BOOLEAN EmptyLineAfter;\r
588\r
589 if (gHiiDriverList != NULL) {\r
590 FreePool (gHiiDriverList);\r
591 }\r
592\r
593 HiiHandles = HiiGetHiiHandles (NULL);\r
594 ASSERT (HiiHandles != NULL);\r
595\r
596 gHiiDriverList = AllocateZeroPool (UI_HII_DRIVER_LIST_SIZE * sizeof (UI_HII_DRIVER_INSTANCE));\r
597 ASSERT (gHiiDriverList != NULL);\r
598 DriverListPtr = gHiiDriverList;\r
599 CurrentSize = UI_HII_DRIVER_LIST_SIZE;\r
600\r
601 for (Index = 0, Count = 0; HiiHandles[Index] != NULL; Index++) {\r
602 if (!RequiredDriver (HiiHandles[Index], ClassGuid, &Token, &TokenHelp, &gHiiDriverList[Count].FormSetGuid)) {\r
603 continue;\r
604 }\r
605\r
606 String = HiiGetString (HiiHandles[Index], Token, NULL);\r
607 if (String == NULL) {\r
7258076b 608 String = HiiGetString (gStringPackHandle, STRING_TOKEN (STR_MISSING_STRING), NULL);\r
c9802c45
ED
609 ASSERT (String != NULL);\r
610 } else if (SpecialHandlerFn != NULL) {\r
611 //\r
612 // Check whether need to rename the driver name.\r
613 //\r
614 EmptyLineAfter = FALSE;\r
615 if (SpecialHandlerFn (String, &NewName, &EmptyLineAfter)) {\r
616 FreePool (String);\r
617 String = NewName;\r
618 DriverListPtr[Count].EmptyLineAfter = EmptyLineAfter;\r
619 }\r
620 }\r
621 DriverListPtr[Count].PromptId = HiiSetString (HiiHandle, 0, String, NULL);\r
622 FreePool (String);\r
623\r
624 String = HiiGetString (HiiHandles[Index], TokenHelp, NULL);\r
625 if (String == NULL) {\r
7258076b 626 String = HiiGetString (gStringPackHandle, STRING_TOKEN (STR_MISSING_STRING), NULL);\r
c9802c45
ED
627 ASSERT (String != NULL);\r
628 }\r
629 DriverListPtr[Count].HelpId = HiiSetString (HiiHandle, 0, String, NULL);\r
630 FreePool (String);\r
631\r
632 DevicePathStr = ExtractDevicePathFromHiiHandle(HiiHandles[Index]);\r
633 if (DevicePathStr != NULL){\r
634 DriverListPtr[Count].DevicePathId = HiiSetString (HiiHandle, 0, DevicePathStr, NULL);\r
635 FreePool (DevicePathStr);\r
636 } else {\r
637 DriverListPtr[Count].DevicePathId = 0;\r
638 }\r
639\r
640 Count++;\r
641 if (Count >= CurrentSize) {\r
469293f8
JW
642 DriverListPtr = ReallocatePool (\r
643 CurrentSize * sizeof (UI_HII_DRIVER_INSTANCE),\r
644 (Count + UI_HII_DRIVER_LIST_SIZE)\r
645 * sizeof (UI_HII_DRIVER_INSTANCE),\r
646 gHiiDriverList\r
647 );\r
c9802c45 648 ASSERT (DriverListPtr != NULL);\r
c9802c45
ED
649 gHiiDriverList = DriverListPtr;\r
650 CurrentSize += UI_HII_DRIVER_LIST_SIZE;\r
651 }\r
652 }\r
653\r
654 FreePool (HiiHandles);\r
655\r
656 Index = 0;\r
657 while (gHiiDriverList[Index].PromptId != 0) {\r
658 HiiCreateGotoExOpCode (\r
659 StartOpCodeHandle,\r
660 0,\r
661 gHiiDriverList[Index].PromptId,\r
662 gHiiDriverList[Index].HelpId,\r
663 0,\r
7d467158 664 (EFI_QUESTION_ID) (Index + FRONT_PAGE_KEY_DRIVER),\r
c9802c45
ED
665 0,\r
666 &gHiiDriverList[Index].FormSetGuid,\r
667 gHiiDriverList[Index].DevicePathId\r
668 );\r
669\r
670 if (gHiiDriverList[Index].EmptyLineAfter) {\r
671 UiCreateEmptyLine (HiiHandle, StartOpCodeHandle);\r
672 }\r
673\r
674 Index ++;\r
675 }\r
676\r
677 return EFI_SUCCESS;\r
678}\r