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