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