]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Application/UiApp/FrontPageCustomizedUiSupport.c
MdeModulePkg/UiApp: Retrieve the value of language menu
[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
262 CHAR8 *CurrentLang;\r
263 UINTN OptionCount;\r
264 CHAR16 *StringBuffer;\r
265 VOID *OptionsOpCodeHandle;\r
266 UINTN StringSize;\r
267 EFI_STATUS Status;\r
268 EFI_HII_STRING_PROTOCOL *HiiString;\r
269\r
270 Lang = NULL;\r
271 StringBuffer = NULL;\r
272\r
273 //\r
274 // Init OpCode Handle and Allocate space for creation of UpdateData Buffer\r
275 //\r
276 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
277 ASSERT (OptionsOpCodeHandle != NULL);\r
278\r
279 GetEfiGlobalVariable2 (L"PlatformLang", (VOID**)&CurrentLang, NULL);\r
280\r
281 //\r
282 // Get Support language list from variable.\r
283 //\r
284 GetEfiGlobalVariable2 (L"PlatformLangCodes", (VOID**)&gLanguageString, NULL);\r
285 if (gLanguageString == NULL) {\r
286 gLanguageString = AllocateCopyPool (\r
287 AsciiStrSize ((CHAR8 *) PcdGetPtr (PcdUefiVariableDefaultPlatformLangCodes)),\r
288 (CHAR8 *) PcdGetPtr (PcdUefiVariableDefaultPlatformLangCodes)\r
289 );\r
290 ASSERT (gLanguageString != NULL);\r
291 }\r
292\r
293 if (gLanguageToken == NULL) {\r
294 //\r
295 // Count the language list number.\r
296 //\r
297 LangCode = gLanguageString;\r
298 Lang = AllocatePool (AsciiStrSize (gLanguageString));\r
299 ASSERT (Lang != NULL);\r
300\r
301 OptionCount = 0;\r
302 while (*LangCode != 0) {\r
303 GetNextLanguage (&LangCode, Lang);\r
304 OptionCount ++;\r
305 }\r
306\r
307 //\r
308 // Allocate extra 1 as the end tag.\r
309 //\r
310 gLanguageToken = AllocateZeroPool ((OptionCount + 1) * sizeof (EFI_STRING_ID));\r
311 ASSERT (gLanguageToken != NULL);\r
312\r
313 Status = gBS->LocateProtocol (&gEfiHiiStringProtocolGuid, NULL, (VOID **) &HiiString);\r
314 ASSERT_EFI_ERROR (Status);\r
315\r
316 LangCode = gLanguageString;\r
317 OptionCount = 0;\r
318 while (*LangCode != 0) {\r
319 GetNextLanguage (&LangCode, Lang);\r
320\r
321 StringSize = 0;\r
322 Status = HiiString->GetString (HiiString, Lang, HiiHandle, PRINTABLE_LANGUAGE_NAME_STRING_ID, StringBuffer, &StringSize, NULL);\r
323 if (Status == EFI_BUFFER_TOO_SMALL) {\r
324 StringBuffer = AllocateZeroPool (StringSize);\r
325 ASSERT (StringBuffer != NULL);\r
326 Status = HiiString->GetString (HiiString, Lang, HiiHandle, PRINTABLE_LANGUAGE_NAME_STRING_ID, StringBuffer, &StringSize, NULL);\r
327 ASSERT_EFI_ERROR (Status);\r
328 }\r
329\r
330 if (EFI_ERROR (Status)) {\r
331 StringBuffer = AllocatePool (AsciiStrSize (Lang) * sizeof (CHAR16));\r
332 ASSERT (StringBuffer != NULL);\r
333 AsciiStrToUnicodeStr (Lang, StringBuffer);\r
334 }\r
335\r
336 ASSERT (StringBuffer != NULL);\r
337 gLanguageToken[OptionCount] = HiiSetString (HiiHandle, 0, StringBuffer, NULL);\r
338 FreePool (StringBuffer);\r
339\r
340 OptionCount++;\r
341 }\r
342 }\r
343\r
344 ASSERT (gLanguageToken != NULL);\r
345 LangCode = gLanguageString;\r
346 OptionCount = 0;\r
347 if (Lang == NULL) {\r
348 Lang = AllocatePool (AsciiStrSize (gLanguageString));\r
349 ASSERT (Lang != NULL);\r
350 }\r
351 while (*LangCode != 0) {\r
352 GetNextLanguage (&LangCode, Lang);\r
353\r
354 if (CurrentLang != NULL && AsciiStrCmp (Lang, CurrentLang) == 0) {\r
355 HiiCreateOneOfOptionOpCode (\r
356 OptionsOpCodeHandle,\r
357 gLanguageToken[OptionCount],\r
358 EFI_IFR_OPTION_DEFAULT,\r
359 EFI_IFR_NUMERIC_SIZE_1,\r
360 (UINT8) OptionCount\r
361 );\r
e4260252 362 gCurrentLanguageIndex = (UINT8) OptionCount;\r
c9802c45
ED
363 } else {\r
364 HiiCreateOneOfOptionOpCode (\r
365 OptionsOpCodeHandle,\r
366 gLanguageToken[OptionCount],\r
367 0,\r
368 EFI_IFR_NUMERIC_SIZE_1,\r
369 (UINT8) OptionCount\r
370 );\r
371 }\r
372\r
373 OptionCount++;\r
374 }\r
375\r
376 if (CurrentLang != NULL) {\r
377 FreePool (CurrentLang);\r
378 }\r
379 FreePool (Lang);\r
380\r
381 HiiCreateOneOfOpCode (\r
382 StartOpCodeHandle,\r
383 FRONT_PAGE_KEY_LANGUAGE,\r
384 0,\r
385 0,\r
386 STRING_TOKEN (STR_LANGUAGE_SELECT),\r
387 STRING_TOKEN (STR_LANGUAGE_SELECT_HELP),\r
388 EFI_IFR_FLAG_CALLBACK,\r
389 EFI_IFR_NUMERIC_SIZE_1,\r
390 OptionsOpCodeHandle,\r
391 NULL\r
392 );\r
393}\r
394\r
395/**\r
396 Create continue menu in the front page.\r
397\r
398 @param[in] HiiHandle The hii handle for the Uiapp driver.\r
399 @param[in] StartOpCodeHandle The opcode handle to save the new opcode.\r
400\r
401**/\r
402VOID\r
403UiCreateContinueMenu (\r
404 IN EFI_HII_HANDLE HiiHandle,\r
405 IN VOID *StartOpCodeHandle\r
406 )\r
407{\r
408 HiiCreateActionOpCode (\r
409 StartOpCodeHandle,\r
410 FRONT_PAGE_KEY_CONTINUE,\r
411 STRING_TOKEN (STR_CONTINUE_PROMPT),\r
412 STRING_TOKEN (STR_CONTINUE_PROMPT),\r
413 EFI_IFR_FLAG_CALLBACK,\r
414 0\r
415 );\r
416}\r
417\r
418/**\r
419 Create empty line menu in the front page.\r
420\r
421 @param HiiHandle The hii handle for the Uiapp driver.\r
422 @param StartOpCodeHandle The opcode handle to save the new opcode.\r
423\r
424**/\r
425VOID\r
426UiCreateEmptyLine (\r
427 IN EFI_HII_HANDLE HiiHandle,\r
428 IN VOID *StartOpCodeHandle\r
429 )\r
430{\r
431 HiiCreateSubTitleOpCode (StartOpCodeHandle, STRING_TOKEN (STR_NULL_STRING), 0, 0, 0);\r
432}\r
433\r
434/**\r
435 Create Reset menu in the front page.\r
436\r
437 @param[in] HiiHandle The hii handle for the Uiapp driver.\r
438 @param[in] StartOpCodeHandle The opcode handle to save the new opcode.\r
439\r
440**/\r
441VOID\r
442UiCreateResetMenu (\r
443 IN EFI_HII_HANDLE HiiHandle,\r
444 IN VOID *StartOpCodeHandle\r
445 )\r
446{\r
447 HiiCreateActionOpCode (\r
448 StartOpCodeHandle,\r
449 FRONT_PAGE_KEY_RESET,\r
450 STRING_TOKEN (STR_RESET_STRING),\r
451 STRING_TOKEN (STR_RESET_STRING),\r
452 EFI_IFR_FLAG_CALLBACK,\r
453 0\r
454 );\r
455}\r
456\r
457/**\r
458 Extract device path for given HII handle and class guid.\r
459\r
460 @param Handle The HII handle.\r
461\r
462 @retval NULL Fail to get the device path string.\r
463 @return PathString Get the device path string.\r
464\r
465**/\r
466CHAR16 *\r
467ExtractDevicePathFromHiiHandle (\r
468 IN EFI_HII_HANDLE Handle\r
469 )\r
470{\r
471 EFI_STATUS Status;\r
472 EFI_HANDLE DriverHandle;\r
473\r
474 ASSERT (Handle != NULL);\r
475\r
476 if (Handle == NULL) {\r
477 return NULL;\r
478 }\r
479\r
480 Status = gHiiDatabase->GetPackageListHandle (gHiiDatabase, Handle, &DriverHandle);\r
481 if (EFI_ERROR (Status)) {\r
482 return NULL;\r
483 }\r
484\r
485 return ConvertDevicePathToText(DevicePathFromHandle (DriverHandle), FALSE, FALSE);\r
486}\r
487\r
488/**\r
489 Check whether this driver need to be shown in the front page.\r
490\r
491 @param HiiHandle The hii handle for the driver.\r
492 @param Guid The special guid for the driver which is the target.\r
493 @param PromptId Return the prompt string id.\r
494 @param HelpId Return the help string id.\r
495 @param FormsetGuid Return the formset guid info.\r
496\r
497 @retval EFI_SUCCESS Search the driver success\r
498\r
499**/\r
500BOOLEAN\r
501RequiredDriver (\r
502 IN EFI_HII_HANDLE HiiHandle,\r
503 IN EFI_GUID *Guid,\r
504 OUT EFI_STRING_ID *PromptId,\r
505 OUT EFI_STRING_ID *HelpId,\r
506 OUT VOID *FormsetGuid\r
507 )\r
508{\r
509 EFI_STATUS Status;\r
510 UINT8 ClassGuidNum;\r
511 EFI_GUID *ClassGuid;\r
512 EFI_IFR_FORM_SET *Buffer;\r
513 UINTN BufferSize;\r
514 UINT8 *Ptr;\r
515 UINTN TempSize;\r
516 BOOLEAN RetVal;\r
517\r
518 Status = HiiGetFormSetFromHiiHandle(HiiHandle, &Buffer,&BufferSize);\r
519 if (EFI_ERROR (Status)) {\r
520 return FALSE;\r
521 }\r
522\r
523 RetVal = FALSE;\r
524 TempSize = 0;\r
525 Ptr = (UINT8 *) Buffer;\r
526 while(TempSize < BufferSize) {\r
527 TempSize += ((EFI_IFR_OP_HEADER *) Ptr)->Length;\r
528\r
529 if (((EFI_IFR_OP_HEADER *) Ptr)->Length <= OFFSET_OF (EFI_IFR_FORM_SET, Flags)){\r
530 Ptr += ((EFI_IFR_OP_HEADER *) Ptr)->Length;\r
531 continue;\r
532 }\r
533\r
534 ClassGuidNum = (UINT8) (((EFI_IFR_FORM_SET *)Ptr)->Flags & 0x3);\r
535 ClassGuid = (EFI_GUID *) (VOID *)(Ptr + sizeof (EFI_IFR_FORM_SET));\r
536 while (ClassGuidNum-- > 0) {\r
537 if (!CompareGuid (Guid, ClassGuid)){\r
538 ClassGuid ++;\r
539 continue;\r
540 }\r
541\r
542 *PromptId = ((EFI_IFR_FORM_SET *)Ptr)->FormSetTitle;\r
543 *HelpId = ((EFI_IFR_FORM_SET *)Ptr)->Help;\r
544 CopyMem (FormsetGuid, &((EFI_IFR_FORM_SET *) Ptr)->Guid, sizeof (EFI_GUID));\r
545 RetVal = TRUE;\r
546 }\r
547 }\r
548\r
549 FreePool (Buffer);\r
550\r
551 return RetVal;\r
552}\r
553\r
554/**\r
555 Search the drivers in the system which need to show in the front page\r
556 and insert the menu to the front page.\r
557\r
558 @param HiiHandle The hii handle for the Uiapp driver.\r
559 @param ClassGuid The class guid for the driver which is the target.\r
8caa3caa 560 @param SpecialHandlerFn The pointer to the specail handler function, if any.\r
c9802c45 561 @param StartOpCodeHandle The opcode handle to save the new opcode.\r
c9802c45
ED
562\r
563 @retval EFI_SUCCESS Search the driver success\r
564\r
565**/\r
566EFI_STATUS\r
567UiListThirdPartyDrivers (\r
568 IN EFI_HII_HANDLE HiiHandle,\r
569 IN EFI_GUID *ClassGuid,\r
570 IN DRIVER_SPECIAL_HANDLER SpecialHandlerFn,\r
571 IN VOID *StartOpCodeHandle\r
572 )\r
573{\r
574 UINTN Index;\r
575 EFI_STRING String;\r
576 EFI_STRING_ID Token;\r
577 EFI_STRING_ID TokenHelp;\r
578 EFI_HII_HANDLE *HiiHandles;\r
579 CHAR16 *DevicePathStr;\r
580 UINTN Count;\r
581 UINTN CurrentSize;\r
582 UI_HII_DRIVER_INSTANCE *DriverListPtr;\r
583 EFI_STRING NewName;\r
584 BOOLEAN EmptyLineAfter;\r
585\r
586 if (gHiiDriverList != NULL) {\r
587 FreePool (gHiiDriverList);\r
588 }\r
589\r
590 HiiHandles = HiiGetHiiHandles (NULL);\r
591 ASSERT (HiiHandles != NULL);\r
592\r
593 gHiiDriverList = AllocateZeroPool (UI_HII_DRIVER_LIST_SIZE * sizeof (UI_HII_DRIVER_INSTANCE));\r
594 ASSERT (gHiiDriverList != NULL);\r
595 DriverListPtr = gHiiDriverList;\r
596 CurrentSize = UI_HII_DRIVER_LIST_SIZE;\r
597\r
598 for (Index = 0, Count = 0; HiiHandles[Index] != NULL; Index++) {\r
599 if (!RequiredDriver (HiiHandles[Index], ClassGuid, &Token, &TokenHelp, &gHiiDriverList[Count].FormSetGuid)) {\r
600 continue;\r
601 }\r
602\r
603 String = HiiGetString (HiiHandles[Index], Token, NULL);\r
604 if (String == NULL) {\r
7258076b 605 String = HiiGetString (gStringPackHandle, STRING_TOKEN (STR_MISSING_STRING), NULL);\r
c9802c45
ED
606 ASSERT (String != NULL);\r
607 } else if (SpecialHandlerFn != NULL) {\r
608 //\r
609 // Check whether need to rename the driver name.\r
610 //\r
611 EmptyLineAfter = FALSE;\r
612 if (SpecialHandlerFn (String, &NewName, &EmptyLineAfter)) {\r
613 FreePool (String);\r
614 String = NewName;\r
615 DriverListPtr[Count].EmptyLineAfter = EmptyLineAfter;\r
616 }\r
617 }\r
618 DriverListPtr[Count].PromptId = HiiSetString (HiiHandle, 0, String, NULL);\r
619 FreePool (String);\r
620\r
621 String = HiiGetString (HiiHandles[Index], TokenHelp, NULL);\r
622 if (String == NULL) {\r
7258076b 623 String = HiiGetString (gStringPackHandle, STRING_TOKEN (STR_MISSING_STRING), NULL);\r
c9802c45
ED
624 ASSERT (String != NULL);\r
625 }\r
626 DriverListPtr[Count].HelpId = HiiSetString (HiiHandle, 0, String, NULL);\r
627 FreePool (String);\r
628\r
629 DevicePathStr = ExtractDevicePathFromHiiHandle(HiiHandles[Index]);\r
630 if (DevicePathStr != NULL){\r
631 DriverListPtr[Count].DevicePathId = HiiSetString (HiiHandle, 0, DevicePathStr, NULL);\r
632 FreePool (DevicePathStr);\r
633 } else {\r
634 DriverListPtr[Count].DevicePathId = 0;\r
635 }\r
636\r
637 Count++;\r
638 if (Count >= CurrentSize) {\r
639 DriverListPtr = AllocateCopyPool ((Count + UI_HII_DRIVER_LIST_SIZE) * sizeof (UI_HII_DRIVER_INSTANCE), gHiiDriverList);\r
640 ASSERT (DriverListPtr != NULL);\r
641 FreePool (gHiiDriverList);\r
642 gHiiDriverList = DriverListPtr;\r
643 CurrentSize += UI_HII_DRIVER_LIST_SIZE;\r
644 }\r
645 }\r
646\r
647 FreePool (HiiHandles);\r
648\r
649 Index = 0;\r
650 while (gHiiDriverList[Index].PromptId != 0) {\r
651 HiiCreateGotoExOpCode (\r
652 StartOpCodeHandle,\r
653 0,\r
654 gHiiDriverList[Index].PromptId,\r
655 gHiiDriverList[Index].HelpId,\r
656 0,\r
657 0,\r
658 0,\r
659 &gHiiDriverList[Index].FormSetGuid,\r
660 gHiiDriverList[Index].DevicePathId\r
661 );\r
662\r
663 if (gHiiDriverList[Index].EmptyLineAfter) {\r
664 UiCreateEmptyLine (HiiHandle, StartOpCodeHandle);\r
665 }\r
666\r
667 Index ++;\r
668 }\r
669\r
670 return EFI_SUCCESS;\r
671}\r