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