]> git.proxmox.com Git - mirror_edk2.git/blame - IntelFrameworkPkg/Library/FrameworkIfrSupportLib/IfrOnTheFly.c
Fix FreePoll() bugs in some places.
[mirror_edk2.git] / IntelFrameworkPkg / Library / FrameworkIfrSupportLib / IfrOnTheFly.c
CommitLineData
cf7e50f8 1/** @file\r
2ec4d269 2 Library Routines to create IFR on-the-fly\r
3 \r
5d01b0f7 4Copyright (c) 2006, Intel Corporation \r
5All rights reserved. This program and the accompanying materials \r
6are licensed and made available under the terms and conditions of the BSD License \r
7which accompanies this distribution. The full text of the license may be found at \r
8http://opensource.org/licenses/bsd-license.php \r
9 \r
10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
11WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
12\r
cf7e50f8 13**/\r
5d01b0f7 14\r
82096802 15#include "IfrSupportLibInternal.h"\r
5d01b0f7 16\r
2ec4d269 17/**\r
409f118c 18 Create a formset.\r
2ec4d269 19 \r
20 The form package is a collection of forms that are intended to describe the pages that will be\r
21 displayed to the user.\r
22 \r
49a049e6 23 @param FormSetTitle Title of formset\r
24 @param Guid Guid of formset\r
25 @param Class Class of formset\r
26 @param SubClass Sub class of formset\r
27 @param FormBuffer Pointer of the formset created\r
28 @param StringBuffer Pointer of FormSetTitile string created\r
2ec4d269 29 \r
49a049e6 30 @retval EFI_OUT_OF_RESOURCES No enough buffer to allocate\r
31 @retval EFI_SUCCESS Formset successfully created \r
2ec4d269 32**/\r
5d01b0f7 33EFI_STATUS\r
409f118c 34EFIAPI\r
5d01b0f7 35CreateFormSet (\r
49a049e6 36 IN CHAR16 *FormSetTitle,\r
37 IN EFI_GUID *Guid,\r
38 IN UINT8 Class,\r
39 IN UINT8 SubClass,\r
40 IN OUT VOID **FormBuffer,\r
41 IN OUT VOID **StringBuffer\r
5d01b0f7 42 )\r
5d01b0f7 43{\r
49a049e6 44 EFI_STATUS Status;\r
45 EFI_HII_IFR_PACK IfrPack;\r
46 FRAMEWORK_EFI_IFR_FORM_SET FormSet;\r
47 FRAMEWORK_EFI_IFR_END_FORM_SET EndFormSet;\r
48 UINT8 *Destination;\r
49 CHAR16 CurrentLanguage[4];\r
50 STRING_REF StringToken;\r
5d01b0f7 51\r
52 //\r
53 // Pre-allocate a buffer sufficient for us to work from.\r
54 //\r
55 FormBuffer = AllocateZeroPool (DEFAULT_FORM_BUFFER_SIZE);\r
56 if (FormBuffer == NULL) {\r
57 return EFI_OUT_OF_RESOURCES;\r
58 }\r
59\r
60 //\r
61 // Pre-allocate a buffer sufficient for us to work from.\r
62 //\r
63 StringBuffer = AllocateZeroPool (DEFAULT_STRING_BUFFER_SIZE);\r
64 if (StringBuffer == NULL) {\r
409f118c 65 FreePool (FormBuffer);\r
5d01b0f7 66 return EFI_OUT_OF_RESOURCES;\r
67 }\r
68\r
69 //\r
409f118c 70 // Add FormSetTitle to the StringBuffer, get FormSetTitle's token\r
5d01b0f7 71 //\r
72 GetCurrentLanguage (CurrentLanguage);\r
5d01b0f7 73 Status = AddString (*StringBuffer, CurrentLanguage, FormSetTitle, &StringToken);\r
5d01b0f7 74 if (EFI_ERROR (Status)) {\r
1b74e1c7 75 FreePool (FormBuffer);\r
76 FreePool (StringBuffer);\r
5d01b0f7 77 return Status;\r
78 }\r
79\r
80 //\r
81 // Initialize the Ifr Package header data\r
82 //\r
dc7b4a5c 83 IfrPack.Header.Length = sizeof (EFI_HII_PACK_HEADER) + sizeof (FRAMEWORK_EFI_IFR_FORM_SET) + sizeof (FRAMEWORK_EFI_IFR_END_FORM_SET);\r
5d01b0f7 84 IfrPack.Header.Type = EFI_HII_IFR;\r
85\r
86 //\r
87 // Initialize FormSet with the appropriate information\r
88 //\r
dc7b4a5c 89 FormSet.Header.OpCode = FRAMEWORK_EFI_IFR_FORM_SET_OP;\r
90 FormSet.Header.Length = sizeof (FRAMEWORK_EFI_IFR_FORM_SET);\r
5d01b0f7 91 FormSet.FormSetTitle = StringToken;\r
92 FormSet.Class = Class;\r
93 FormSet.SubClass = SubClass;\r
77980854 94 CopyGuid ((GUID *)(VOID *)&FormSet.Guid, Guid);\r
409f118c 95 \r
5d01b0f7 96 //\r
97 // Initialize the end formset data\r
98 //\r
dc7b4a5c 99 EndFormSet.Header.Length = sizeof (FRAMEWORK_EFI_IFR_END_FORM_SET);\r
100 EndFormSet.Header.OpCode = FRAMEWORK_EFI_IFR_END_FORM_SET_OP;\r
5d01b0f7 101\r
5d01b0f7 102 //\r
103 // Copy the formset/endformset data to the form buffer\r
104 //\r
409f118c 105 Destination = (UINT8 *) *FormBuffer;\r
5d01b0f7 106 CopyMem (Destination, &IfrPack, sizeof (EFI_HII_PACK_HEADER));\r
107\r
108 Destination = Destination + sizeof (EFI_HII_PACK_HEADER);\r
dc7b4a5c 109 CopyMem (Destination, &FormSet, sizeof (FRAMEWORK_EFI_IFR_FORM_SET));\r
5d01b0f7 110\r
dc7b4a5c 111 Destination = Destination + sizeof (FRAMEWORK_EFI_IFR_FORM_SET);\r
dc7b4a5c 112 CopyMem (Destination, &EndFormSet, sizeof (FRAMEWORK_EFI_IFR_END_FORM_SET));\r
409f118c 113 \r
5d01b0f7 114 return EFI_SUCCESS;\r
115}\r
116\r
2ec4d269 117/**\r
49a049e6 118 Create a form.\r
2ec4d269 119 A form is the encapsulation of what amounts to a browser page. The header defines a FormId,\r
120 which is referenced by the form package, among others. It also defines a FormTitle, which is a\r
121 string to be used as the title for the form\r
122 \r
49a049e6 123 @param FormTitle Title of the form\r
124 @param FormId Id of the form\r
125 @param FormBuffer Pointer of the form created\r
126 @param StringBuffer Pointer of FormTitil string created\r
2ec4d269 127 \r
49a049e6 128 @retval EFI_SUCCESS Form successfully created\r
2ec4d269 129**/\r
5d01b0f7 130EFI_STATUS\r
409f118c 131EFIAPI\r
5d01b0f7 132CreateForm (\r
49a049e6 133 IN CHAR16 *FormTitle,\r
134 IN UINT16 FormId,\r
135 IN OUT VOID *FormBuffer,\r
136 IN OUT VOID *StringBuffer\r
5d01b0f7 137 )\r
5d01b0f7 138{\r
49a049e6 139 EFI_STATUS Status;\r
140 FRAMEWORK_EFI_IFR_FORM Form;\r
141 FRAMEWORK_EFI_IFR_END_FORM EndForm;\r
142 CHAR16 CurrentLanguage[4];\r
143 STRING_REF StringToken;\r
5d01b0f7 144\r
145 //\r
409f118c 146 // Add FormTitle to the StringBuffer, get FormTitle's token\r
5d01b0f7 147 //\r
148 GetCurrentLanguage (CurrentLanguage);\r
5d01b0f7 149 Status = AddString (StringBuffer, CurrentLanguage, FormTitle, &StringToken);\r
5d01b0f7 150 if (EFI_ERROR (Status)) {\r
151 return Status;\r
152 }\r
153\r
dc7b4a5c 154 Form.Header.OpCode = FRAMEWORK_EFI_IFR_FORM_OP;\r
155 Form.Header.Length = sizeof (FRAMEWORK_EFI_IFR_FORM);\r
5d01b0f7 156 Form.FormId = FormId;\r
157 Form.FormTitle = StringToken;\r
158\r
409f118c 159 Status = AddOpCode (FormBuffer, &Form);\r
5d01b0f7 160 if (EFI_ERROR (Status)) {\r
161 return Status;\r
162 }\r
163\r
dc7b4a5c 164 EndForm.Header.OpCode = FRAMEWORK_EFI_IFR_END_FORM_OP;\r
165 EndForm.Header.Length = sizeof (FRAMEWORK_EFI_IFR_END_FORM);\r
5d01b0f7 166\r
167 Status = AddOpCode (FormBuffer, &EndForm);\r
409f118c 168 \r
2ec4d269 169 return Status;\r
5d01b0f7 170}\r
171\r
2ec4d269 172/**\r
409f118c 173 Create a SubTitle.\r
2ec4d269 174 \r
175 Subtitle strings are intended to be used by authors to separate sections of questions into semantic\r
176 groups.\r
177 \r
49a049e6 178 @param SubTitle Sub title to be created\r
179 @param FormBuffer Where this subtitle to add to\r
180 @param StringBuffer String buffer created for subtitle\r
2ec4d269 181 \r
182 @retval EFI_SUCCESS Subtitle successfully created\r
183**/\r
5d01b0f7 184EFI_STATUS\r
409f118c 185EFIAPI\r
5d01b0f7 186CreateSubTitle (\r
49a049e6 187 IN CHAR16 *SubTitle,\r
188 IN OUT VOID *FormBuffer,\r
189 IN OUT VOID *StringBuffer\r
5d01b0f7 190 )\r
5d01b0f7 191{\r
49a049e6 192 EFI_STATUS Status;\r
193 FRAMEWORK_EFI_IFR_SUBTITLE Subtitle;\r
194 CHAR16 CurrentLanguage[4];\r
195 STRING_REF StringToken;\r
5d01b0f7 196\r
197 //\r
409f118c 198 // Add SubTitle to the StringBuffer, get SubTitle's token\r
5d01b0f7 199 //\r
200 GetCurrentLanguage (CurrentLanguage);\r
5d01b0f7 201 Status = AddString (StringBuffer, CurrentLanguage, SubTitle, &StringToken);\r
5d01b0f7 202 if (EFI_ERROR (Status)) {\r
203 return Status;\r
204 }\r
205\r
dc7b4a5c 206 Subtitle.Header.OpCode = FRAMEWORK_EFI_IFR_SUBTITLE_OP;\r
207 Subtitle.Header.Length = sizeof (FRAMEWORK_EFI_IFR_SUBTITLE);\r
5d01b0f7 208 Subtitle.SubTitle = StringToken;\r
209\r
210 Status = AddOpCode (FormBuffer, &Subtitle);\r
211\r
2ec4d269 212 return Status;\r
5d01b0f7 213}\r
214\r
2ec4d269 215/**\r
409f118c 216 Create a line of text.\r
2ec4d269 217 Unlike HTML, text is simply another tag. \r
218 This tag type enables IFR to be more easily localized.\r
219 \r
49a049e6 220 @param String First string of the text\r
221 @param String2 Second string of the text\r
222 @param String3 Help string of the text\r
223 @param Flags Flag of the text\r
224 @param Key Key of the text\r
225 @param FormBuffer The form where this text adds to\r
226 @param StringBuffer String buffer created for String, String2 and String3\r
2ec4d269 227 \r
49a049e6 228 @retval EFI_SUCCESS Text successfully created\r
2ec4d269 229**/\r
5d01b0f7 230EFI_STATUS\r
409f118c 231EFIAPI\r
5d01b0f7 232CreateText (\r
49a049e6 233 IN CHAR16 *String,\r
234 IN CHAR16 *String2,\r
235 IN CHAR16 *String3,\r
236 IN UINT8 Flags,\r
237 IN UINT16 Key,\r
238 IN OUT VOID *FormBuffer,\r
239 IN OUT VOID *StringBuffer\r
5d01b0f7 240 )\r
5d01b0f7 241{\r
49a049e6 242 EFI_STATUS Status;\r
243 FRAMEWORK_EFI_IFR_TEXT Text;\r
244 CHAR16 CurrentLanguage[4];\r
245 STRING_REF StringToken;\r
5d01b0f7 246\r
247 //\r
409f118c 248 // Add first string to the StringBuffer, get first string's token\r
5d01b0f7 249 //\r
250 GetCurrentLanguage (CurrentLanguage);\r
5d01b0f7 251 Status = AddString (StringBuffer, CurrentLanguage, String, &StringToken);\r
5d01b0f7 252 if (EFI_ERROR (Status)) {\r
253 return Status;\r
254 }\r
255\r
dc7b4a5c 256 Text.Header.OpCode = FRAMEWORK_EFI_IFR_TEXT_OP;\r
257 Text.Header.Length = sizeof (FRAMEWORK_EFI_IFR_TEXT);\r
5d01b0f7 258 Text.Text = StringToken;\r
259\r
260 //\r
261 // Add second string, get first string's token\r
262 //\r
263 Status = AddString (StringBuffer, CurrentLanguage, String2, &StringToken);\r
5d01b0f7 264 if (EFI_ERROR (Status)) {\r
265 return Status;\r
266 }\r
267\r
268 Text.TextTwo = StringToken;\r
dc7b4a5c 269 Text.Flags = (UINT8) (Flags | FRAMEWORK_EFI_IFR_FLAG_CREATED);\r
5d01b0f7 270 Text.Key = Key;\r
271\r
272 //\r
273 // Add second string, get first string's token\r
274 //\r
275 Status = AddString (StringBuffer, CurrentLanguage, String3, &StringToken);\r
5d01b0f7 276 if (EFI_ERROR (Status)) {\r
277 return Status;\r
278 }\r
279\r
280 Text.Help = StringToken;\r
281\r
282 Status = AddOpCode (FormBuffer, &Text);\r
283\r
2ec4d269 284 return Status;\r
5d01b0f7 285}\r
286\r
2ec4d269 287/**\r
49a049e6 288 Create a hyperlink.\r
2ec4d269 289 \r
49a049e6 290 @param FormId Form ID of the hyperlink\r
291 @param Prompt Prompt of the hyperlink\r
292 @param FormBuffer The form where this hyperlink adds to\r
293 @param StringBuffer String buffer created for Prompt\r
2ec4d269 294 \r
49a049e6 295 @retval EFI_SUCCESS Hyperlink successfully created \r
2ec4d269 296**/\r
5d01b0f7 297EFI_STATUS\r
409f118c 298EFIAPI\r
5d01b0f7 299CreateGoto (\r
49a049e6 300 IN UINT16 FormId,\r
301 IN CHAR16 *Prompt,\r
302 IN OUT VOID *FormBuffer,\r
303 IN OUT VOID *StringBuffer\r
5d01b0f7 304 )\r
5d01b0f7 305{\r
49a049e6 306 EFI_STATUS Status;\r
307 FRAMEWORK_EFI_IFR_REF Hyperlink;\r
308 CHAR16 CurrentLanguage[4];\r
309 STRING_REF StringToken;\r
5d01b0f7 310\r
311 //\r
409f118c 312 // Add Prompt string to the StringBuffer, get Prompt string's token\r
5d01b0f7 313 //\r
314 GetCurrentLanguage (CurrentLanguage);\r
5d01b0f7 315 Status = AddString (StringBuffer, CurrentLanguage, Prompt, &StringToken);\r
5d01b0f7 316 if (EFI_ERROR (Status)) {\r
317 return Status;\r
318 }\r
319\r
dc7b4a5c 320 Hyperlink.Header.OpCode = FRAMEWORK_EFI_IFR_REF_OP;\r
321 Hyperlink.Header.Length = sizeof (FRAMEWORK_EFI_IFR_REF);\r
5d01b0f7 322 Hyperlink.FormId = FormId;\r
323 Hyperlink.Prompt = StringToken;\r
324\r
325 Status = AddOpCode (FormBuffer, &Hyperlink);\r
326\r
2ec4d269 327 return Status;\r
5d01b0f7 328}\r
329\r
2ec4d269 330/**\r
331 Create a one-of question with a set of options to choose from. The\r
332 OptionsList is a pointer to a null-terminated list of option descriptions.\r
5d01b0f7 333\r
49a049e6 334 @param QuestionId Question ID of the one-of box\r
335 @param DataWidth DataWidth of the one-of box\r
336 @param Prompt Prompt of the one-of box\r
337 @param Help Help of the one-of box\r
338 @param OptionsList Each string in it is an option of the one-of box\r
339 @param OptionCount Option string count\r
340 @param FormBuffer The form where this one-of box adds to\r
341 @param StringBuffer String buffer created for Prompt, Help and Option strings\r
2ec4d269 342 \r
49a049e6 343 @retval EFI_DEVICE_ERROR DataWidth > 2\r
344 @retval EFI_SUCCESS One-Of box successfully created.\r
2ec4d269 345**/\r
5d01b0f7 346EFI_STATUS\r
409f118c 347EFIAPI\r
5d01b0f7 348CreateOneOf (\r
49a049e6 349 IN UINT16 QuestionId,\r
350 IN UINT8 DataWidth,\r
351 IN CHAR16 *Prompt,\r
352 IN CHAR16 *Help,\r
353 IN IFR_OPTION *OptionsList,\r
354 IN UINTN OptionCount,\r
355 IN OUT VOID *FormBuffer,\r
356 IN OUT VOID *StringBuffer\r
5d01b0f7 357 )\r
5d01b0f7 358{\r
49a049e6 359 EFI_STATUS Status;\r
360 UINTN Index;\r
361 FRAMEWORK_EFI_IFR_ONE_OF OneOf;\r
362 FRAMEWORK_EFI_IFR_ONE_OF_OPTION OneOfOption;\r
363 FRAMEWORK_EFI_IFR_END_ONE_OF EndOneOf;\r
364 CHAR16 CurrentLanguage[4];\r
365 STRING_REF StringToken;\r
5d01b0f7 366\r
367 //\r
368 // We do not create op-code storage widths for one-of in excess of 16 bits for now\r
369 //\r
370 if (DataWidth > 2) {\r
371 return EFI_DEVICE_ERROR;\r
372 }\r
373\r
374 //\r
409f118c 375 // Add Prompt string to the StringBuffer, get Prompt string's token\r
5d01b0f7 376 //\r
377 GetCurrentLanguage (CurrentLanguage);\r
5d01b0f7 378 Status = AddString (StringBuffer, CurrentLanguage, Prompt, &StringToken);\r
5d01b0f7 379 if (EFI_ERROR (Status)) {\r
380 return Status;\r
381 }\r
382\r
dc7b4a5c 383 OneOf.Header.OpCode = FRAMEWORK_EFI_IFR_ONE_OF_OP;\r
384 OneOf.Header.Length = sizeof (FRAMEWORK_EFI_IFR_ONE_OF);\r
5d01b0f7 385 OneOf.QuestionId = QuestionId;\r
386 OneOf.Width = DataWidth;\r
387 OneOf.Prompt = StringToken;\r
388\r
389 //\r
409f118c 390 // Add Help string to the StringBuffer, get Help string's token\r
5d01b0f7 391 //\r
392 Status = AddString (StringBuffer, CurrentLanguage, Help, &StringToken);\r
5d01b0f7 393 if (EFI_ERROR (Status)) {\r
394 return Status;\r
395 }\r
396\r
397 OneOf.Help = StringToken;\r
398\r
409f118c 399 Status = AddOpCode (FormBuffer, &OneOf);\r
5d01b0f7 400 if (EFI_ERROR (Status)) {\r
401 return Status;\r
402 }\r
403\r
404 for (Index = 0; Index < OptionCount; Index++) {\r
dc7b4a5c 405 OneOfOption.Header.OpCode = FRAMEWORK_EFI_IFR_ONE_OF_OPTION_OP;\r
406 OneOfOption.Header.Length = sizeof (FRAMEWORK_EFI_IFR_ONE_OF_OPTION);\r
5d01b0f7 407\r
408 //\r
409f118c 409 // Add OptionString string to the StringBuffer, get OptionString string's token\r
5d01b0f7 410 //\r
409f118c 411 Status = AddString (StringBuffer, CurrentLanguage, OptionsList[Index].OptionString, &StringToken);\r
5d01b0f7 412\r
413 OneOfOption.Option = StringToken;\r
414 OneOfOption.Value = OptionsList[Index].Value;\r
dc7b4a5c 415 OneOfOption.Flags = (UINT8) (OptionsList[Index].Flags | FRAMEWORK_EFI_IFR_FLAG_CREATED);\r
5d01b0f7 416 OneOfOption.Key = OptionsList[Index].Key;\r
417\r
409f118c 418 Status = AddOpCode (FormBuffer, &OneOfOption);\r
5d01b0f7 419 if (EFI_ERROR (Status)) {\r
420 return Status;\r
421 }\r
422 }\r
423\r
dc7b4a5c 424 EndOneOf.Header.Length = sizeof (FRAMEWORK_EFI_IFR_END_ONE_OF);\r
425 EndOneOf.Header.OpCode = FRAMEWORK_EFI_IFR_END_ONE_OF_OP;\r
5d01b0f7 426\r
409f118c 427 Status = AddOpCode (FormBuffer, &EndOneOf);\r
5d01b0f7 428 if (EFI_ERROR (Status)) {\r
429 return Status;\r
430 }\r
431\r
432 return EFI_SUCCESS;\r
433}\r
434\r
2ec4d269 435/**\r
436 Create a one-of question with a set of options to choose from. The\r
437 OptionsList is a pointer to a null-terminated list of option descriptions.\r
438 \r
49a049e6 439 @param QuestionId Question ID of the ordered list\r
440 @param MaxEntries MaxEntries of the ordered list\r
441 @param Prompt Prompt of the ordered list\r
442 @param Help Help of the ordered list\r
443 @param OptionsList Each string in it is an option of the ordered list\r
444 @param OptionCount Option string count\r
445 @param FormBuffer The form where this ordered list adds to\r
446 @param StringBuffer String buffer created for Prompt, Help and Option strings\r
2ec4d269 447 \r
49a049e6 448 @retval EFI_SUCCESS Ordered list successfully created.\r
2ec4d269 449**/\r
5d01b0f7 450EFI_STATUS\r
409f118c 451EFIAPI\r
5d01b0f7 452CreateOrderedList (\r
49a049e6 453 IN UINT16 QuestionId,\r
454 IN UINT8 MaxEntries,\r
455 IN CHAR16 *Prompt,\r
456 IN CHAR16 *Help,\r
457 IN IFR_OPTION *OptionsList,\r
458 IN UINTN OptionCount,\r
459 IN OUT VOID *FormBuffer,\r
460 IN OUT VOID *StringBuffer\r
5d01b0f7 461 )\r
5d01b0f7 462{\r
49a049e6 463 EFI_STATUS Status;\r
464 UINTN Index;\r
465 FRAMEWORK_EFI_IFR_ORDERED_LIST OrderedList;\r
466 FRAMEWORK_EFI_IFR_ONE_OF_OPTION OrderedListOption;\r
467 FRAMEWORK_EFI_IFR_END_ONE_OF EndOrderedList;\r
468 CHAR16 CurrentLanguage[4];\r
469 STRING_REF StringToken;\r
5d01b0f7 470\r
471 //\r
409f118c 472 // Add Prompt string to the StringBuffer, get Prompt string's token\r
5d01b0f7 473 //\r
474 GetCurrentLanguage (CurrentLanguage);\r
5d01b0f7 475 Status = AddString (StringBuffer, CurrentLanguage, Prompt, &StringToken);\r
5d01b0f7 476 if (EFI_ERROR (Status)) {\r
477 return Status;\r
478 }\r
479\r
dc7b4a5c 480 OrderedList.Header.OpCode = FRAMEWORK_EFI_IFR_ORDERED_LIST_OP;\r
481 OrderedList.Header.Length = sizeof (FRAMEWORK_EFI_IFR_ORDERED_LIST);\r
5d01b0f7 482 OrderedList.QuestionId = QuestionId;\r
483 OrderedList.MaxEntries = MaxEntries;\r
484 OrderedList.Prompt = StringToken;\r
485\r
486 //\r
409f118c 487 // Add Help string to the StringBuffer, get Help string's token\r
5d01b0f7 488 //\r
489 Status = AddString (StringBuffer, CurrentLanguage, Help, &StringToken);\r
5d01b0f7 490 if (EFI_ERROR (Status)) {\r
491 return Status;\r
492 }\r
493\r
494 OrderedList.Help = StringToken;\r
495\r
409f118c 496 Status = AddOpCode (FormBuffer, &OrderedList);\r
5d01b0f7 497 if (EFI_ERROR (Status)) {\r
498 return Status;\r
499 }\r
500\r
501 for (Index = 0; Index < OptionCount; Index++) {\r
dc7b4a5c 502 OrderedListOption.Header.OpCode = FRAMEWORK_EFI_IFR_ONE_OF_OPTION_OP;\r
503 OrderedListOption.Header.Length = sizeof (FRAMEWORK_EFI_IFR_ONE_OF_OPTION);\r
5d01b0f7 504\r
505 //\r
409f118c 506 // Add OptionString string to the StringBuffer, get OptionString string's token\r
5d01b0f7 507 //\r
409f118c 508 Status = AddString (StringBuffer, CurrentLanguage, OptionsList[Index].OptionString, &StringToken);\r
5d01b0f7 509\r
510 OrderedListOption.Option = StringToken;\r
511 OrderedListOption.Value = OptionsList[Index].Value;\r
dc7b4a5c 512 OrderedListOption.Flags = (UINT8) (OptionsList[Index].Flags | FRAMEWORK_EFI_IFR_FLAG_CREATED);\r
5d01b0f7 513 OrderedListOption.Key = OptionsList[Index].Key;\r
514\r
409f118c 515 Status = AddOpCode (FormBuffer, &OrderedListOption);\r
5d01b0f7 516 if (EFI_ERROR (Status)) {\r
517 return Status;\r
518 }\r
519 }\r
520\r
dc7b4a5c 521 EndOrderedList.Header.Length = sizeof (FRAMEWORK_EFI_IFR_END_ONE_OF);\r
522 EndOrderedList.Header.OpCode = FRAMEWORK_EFI_IFR_END_ONE_OF_OP;\r
5d01b0f7 523\r
524 Status = AddOpCode (FormBuffer, &EndOrderedList);\r
525\r
2ec4d269 526 return Status;\r
5d01b0f7 527}\r
528\r
2ec4d269 529/**\r
49a049e6 530 Create a checkbox.\r
2ec4d269 531 \r
49a049e6 532 @param QuestionId Question ID of the check box\r
533 @param DataWidth DataWidth of the check box\r
534 @param Prompt Prompt of the check box\r
535 @param Help Help of the check box \r
536 @param Flags Flags of the check box\r
537 @param FormBuffer The form where this check box adds to\r
538 @param StringBuffer String buffer created for Prompt and Help.\r
2ec4d269 539 \r
49a049e6 540 @retval EFI_DEVICE_ERROR DataWidth > 1\r
541 @retval EFI_SUCCESS Check box successfully created\r
2ec4d269 542**/\r
5d01b0f7 543EFI_STATUS\r
409f118c 544EFIAPI\r
5d01b0f7 545CreateCheckBox (\r
49a049e6 546 IN UINT16 QuestionId,\r
547 IN UINT8 DataWidth,\r
548 IN CHAR16 *Prompt,\r
549 IN CHAR16 *Help,\r
550 IN UINT8 Flags,\r
551 IN OUT VOID *FormBuffer,\r
552 IN OUT VOID *StringBuffer\r
5d01b0f7 553 )\r
5d01b0f7 554{\r
49a049e6 555 EFI_STATUS Status;\r
556 FRAMEWORK_EFI_IFR_CHECKBOX CheckBox;\r
557 CHAR16 CurrentLanguage[4];\r
558 STRING_REF StringToken;\r
5d01b0f7 559\r
560 //\r
561 // We do not create op-code storage widths for checkbox in excess of 8 bits for now\r
562 //\r
563 if (DataWidth > 1) {\r
564 return EFI_DEVICE_ERROR;\r
565 }\r
566\r
567 //\r
409f118c 568 // Add Prompt string to the StringBuffer, get Prompt string's token\r
5d01b0f7 569 //\r
570 GetCurrentLanguage (CurrentLanguage);\r
5d01b0f7 571 Status = AddString (StringBuffer, CurrentLanguage, Prompt, &StringToken);\r
5d01b0f7 572 if (EFI_ERROR (Status)) {\r
573 return Status;\r
574 }\r
575\r
dc7b4a5c 576 CheckBox.Header.OpCode = FRAMEWORK_EFI_IFR_CHECKBOX_OP;\r
577 CheckBox.Header.Length = sizeof (FRAMEWORK_EFI_IFR_CHECKBOX);\r
5d01b0f7 578 CheckBox.QuestionId = QuestionId;\r
579 CheckBox.Width = DataWidth;\r
580 CheckBox.Prompt = StringToken;\r
581\r
582 //\r
409f118c 583 // Add Help string to the StringBuffer, get Help string's token\r
5d01b0f7 584 //\r
585 Status = AddString (StringBuffer, CurrentLanguage, Help, &StringToken);\r
5d01b0f7 586 if (EFI_ERROR (Status)) {\r
587 return Status;\r
588 }\r
589\r
590 CheckBox.Help = StringToken;\r
dc7b4a5c 591 CheckBox.Flags = (UINT8) (Flags | FRAMEWORK_EFI_IFR_FLAG_CREATED);\r
5d01b0f7 592\r
593 Status = AddOpCode (FormBuffer, &CheckBox);\r
2ec4d269 594 \r
595 return Status;\r
5d01b0f7 596}\r
597\r
2ec4d269 598/**\r
409f118c 599 Create a numeric.\r
2ec4d269 600 \r
49a049e6 601 @param QuestionId Question ID of the numeric\r
602 @param DataWidth DataWidth of the numeric\r
603 @param Prompt Prompt of the numeric\r
604 @param Help Help of the numeric\r
605 @param Minimum Minumun boundary of the numeric\r
606 @param Maximum Maximum boundary of the numeric\r
607 @param Step Step of the numeric\r
608 @param Default Default value\r
609 @param Flags Flags of the numeric\r
610 @param Key Key of the numeric\r
611 @param FormBuffer The form where this numeric adds to\r
612 @param StringBuffer String buffer created for Prompt and Help.\r
613\r
614 @retval EFI_DEVICE_ERROR DataWidth > 2\r
615 @retval EFI_SUCCESS Numeric is successfully created \r
2ec4d269 616**/\r
5d01b0f7 617EFI_STATUS\r
409f118c 618EFIAPI\r
5d01b0f7 619CreateNumeric (\r
49a049e6 620 IN UINT16 QuestionId,\r
621 IN UINT8 DataWidth,\r
622 IN CHAR16 *Prompt,\r
623 IN CHAR16 *Help,\r
624 IN UINT16 Minimum,\r
625 IN UINT16 Maximum,\r
626 IN UINT16 Step,\r
627 IN UINT16 Default,\r
628 IN UINT8 Flags,\r
629 IN UINT16 Key,\r
630 IN OUT VOID *FormBuffer,\r
631 IN OUT VOID *StringBuffer\r
5d01b0f7 632 )\r
5d01b0f7 633{\r
49a049e6 634 EFI_STATUS Status;\r
635 FRAMEWORK_EFI_IFR_NUMERIC Numeric;\r
636 CHAR16 CurrentLanguage[4];\r
637 STRING_REF StringToken;\r
5d01b0f7 638\r
639 //\r
640 // We do not create op-code storage widths for numerics in excess of 16 bits for now\r
641 //\r
642 if (DataWidth > 2) {\r
643 return EFI_DEVICE_ERROR;\r
644 }\r
645\r
646 //\r
409f118c 647 // Add Prompt string to the StringBuffer, get Prompt string's token\r
5d01b0f7 648 //\r
649 GetCurrentLanguage (CurrentLanguage);\r
5d01b0f7 650 Status = AddString (StringBuffer, CurrentLanguage, Prompt, &StringToken);\r
5d01b0f7 651 if (EFI_ERROR (Status)) {\r
652 return Status;\r
653 }\r
654\r
dc7b4a5c 655 Numeric.Header.OpCode = FRAMEWORK_EFI_IFR_NUMERIC_OP;\r
656 Numeric.Header.Length = sizeof (FRAMEWORK_EFI_IFR_NUMERIC);\r
5d01b0f7 657 Numeric.QuestionId = QuestionId;\r
658 Numeric.Width = DataWidth;\r
659 Numeric.Prompt = StringToken;\r
660\r
661 //\r
409f118c 662 // Add Help string to the StringBuffer, get Help string's token\r
5d01b0f7 663 //\r
664 Status = AddString (StringBuffer, CurrentLanguage, Help, &StringToken);\r
5d01b0f7 665 if (EFI_ERROR (Status)) {\r
666 return Status;\r
667 }\r
668\r
669 Numeric.Help = StringToken;\r
670 Numeric.Minimum = Minimum;\r
671 Numeric.Maximum = Maximum;\r
672 Numeric.Step = Step;\r
673 Numeric.Default = Default;\r
dc7b4a5c 674 Numeric.Flags = (UINT8) (Flags | FRAMEWORK_EFI_IFR_FLAG_CREATED);\r
5d01b0f7 675 Numeric.Key = Key;\r
676\r
677 Status = AddOpCode (FormBuffer, &Numeric);\r
678\r
2ec4d269 679 return Status;\r
5d01b0f7 680}\r
681\r
2ec4d269 682/**\r
49a049e6 683 Create a string.\r
2ec4d269 684 \r
49a049e6 685 @param QuestionId Question ID of the string\r
686 @param DataWidth DataWidth of the string\r
687 @param Prompt Prompt of the string\r
688 @param Help Help of the string\r
689 @param MinSize Min size boundary of the string\r
690 @param MaxSize Max size boundary of the string\r
691 @param Flags Flags of the string\r
692 @param Key Key of the string\r
693 @param FormBuffer The form where this string adds to\r
694 @param StringBuffer String buffer created for Prompt and Help.\r
695 \r
696 @retval EFI_SUCCESS String successfully created. \r
2ec4d269 697**/\r
5d01b0f7 698EFI_STATUS\r
409f118c 699EFIAPI\r
5d01b0f7 700CreateString (\r
49a049e6 701 IN UINT16 QuestionId,\r
702 IN UINT8 DataWidth,\r
703 IN CHAR16 *Prompt,\r
704 IN CHAR16 *Help,\r
705 IN UINT8 MinSize,\r
706 IN UINT8 MaxSize,\r
707 IN UINT8 Flags,\r
708 IN UINT16 Key,\r
709 IN OUT VOID *FormBuffer,\r
710 IN OUT VOID *StringBuffer\r
5d01b0f7 711 )\r
5d01b0f7 712{\r
49a049e6 713 EFI_STATUS Status;\r
714 FRAMEWORK_EFI_IFR_STRING String;\r
715 CHAR16 CurrentLanguage[4];\r
716 STRING_REF StringToken;\r
5d01b0f7 717\r
718 //\r
409f118c 719 // Add Prompt string to the StringBuffer, get Prompt string's token\r
5d01b0f7 720 //\r
721 GetCurrentLanguage (CurrentLanguage);\r
5d01b0f7 722 Status = AddString (StringBuffer, CurrentLanguage, Prompt, &StringToken);\r
5d01b0f7 723 if (EFI_ERROR (Status)) {\r
724 return Status;\r
725 }\r
726\r
dc7b4a5c 727 String.Header.OpCode = FRAMEWORK_EFI_IFR_STRING_OP;\r
728 String.Header.Length = sizeof (FRAMEWORK_EFI_IFR_STRING);\r
5d01b0f7 729 String.QuestionId = QuestionId;\r
730 String.Width = DataWidth;\r
731 String.Prompt = StringToken;\r
732\r
733 //\r
409f118c 734 // Add Help string to the StringBuffer, get Help string's token\r
5d01b0f7 735 //\r
736 Status = AddString (StringBuffer, CurrentLanguage, Help, &StringToken);\r
5d01b0f7 737 if (EFI_ERROR (Status)) {\r
738 return Status;\r
739 }\r
740\r
741 String.Help = StringToken;\r
742 String.MinSize = MinSize;\r
743 String.MaxSize = MaxSize;\r
dc7b4a5c 744 String.Flags = (UINT8) (Flags | FRAMEWORK_EFI_IFR_FLAG_CREATED);\r
5d01b0f7 745 String.Key = Key;\r
746\r
747 Status = AddOpCode (FormBuffer, &String);\r
748\r
2ec4d269 749 return Status;\r
5d01b0f7 750}\r
2ec4d269 751\r