]> git.proxmox.com Git - mirror_edk2.git/blame - EdkCompatibilityPkg/Foundation/Library/Dxe/EfiIfrSupportLib/IfrOnTheFly.c
Add in the 1st version of ECP.
[mirror_edk2.git] / EdkCompatibilityPkg / Foundation / Library / Dxe / EfiIfrSupportLib / IfrOnTheFly.c
CommitLineData
3eb9473e 1/*++\r
2Copyright (c) 2004, Intel Corporation \r
3All rights reserved. This program and the accompanying materials \r
4are licensed and made available under the terms and conditions of the BSD License \r
5which accompanies this distribution. The full text of the license may be found at \r
6http://opensource.org/licenses/bsd-license.php \r
7 \r
8THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
9WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
10\r
11Module Name:\r
12 IfrOnTheFly.c\r
13\r
14Abstract:\r
15\r
16 Library Routines to create IFR on-the-fly\r
17\r
18Revision History:\r
19\r
20--*/\r
21\r
22#include "IfrLibrary.h"\r
23\r
24EFI_STATUS\r
25CreateFormSet (\r
26 IN CHAR16 *FormSetTitle,\r
27 IN EFI_GUID *Guid,\r
28 IN UINT8 Class,\r
29 IN UINT8 SubClass,\r
30 IN OUT VOID **FormBuffer,\r
31 IN OUT VOID **StringBuffer\r
32 )\r
33/*++\r
34\r
35Routine Description:\r
36\r
37 Create a formset\r
38 \r
39Arguments:\r
40 \r
41 FormSetTitle - Title of formset\r
42 \r
43 Guid - Guid of formset\r
44 \r
45 Class - Class of formset\r
46 \r
47 SubClass - Sub class of formset\r
48 \r
49 FormBuffer - Pointer of the formset created\r
50 \r
51 StringBuffer - Pointer of FormSetTitile string created\r
52 \r
53Returns: \r
54\r
55 EFI_OUT_OF_RESOURCES - No enough buffer to allocate\r
56 \r
57 EFI_SUCCESS - Formset successfully created\r
58\r
59--*/\r
60{\r
61 EFI_STATUS Status;\r
62 EFI_HII_IFR_PACK IfrPack;\r
63 EFI_IFR_FORM_SET FormSet;\r
64 EFI_IFR_END_FORM_SET EndFormSet;\r
65 UINT8 *Destination;\r
66 CHAR16 CurrentLanguage[4];\r
67 STRING_REF StringToken;\r
68\r
69 //\r
70 // Pre-allocate a buffer sufficient for us to work from.\r
71 //\r
72 FormBuffer = EfiLibAllocateZeroPool (DEFAULT_FORM_BUFFER_SIZE);\r
73 if (FormBuffer == NULL) {\r
74 return EFI_OUT_OF_RESOURCES;\r
75 }\r
76\r
77 //\r
78 // Pre-allocate a buffer sufficient for us to work from.\r
79 //\r
80 StringBuffer = EfiLibAllocateZeroPool (DEFAULT_STRING_BUFFER_SIZE);\r
81 if (StringBuffer == NULL) {\r
82 gBS->FreePool (FormBuffer);\r
83 return EFI_OUT_OF_RESOURCES;\r
84 }\r
85\r
86 //\r
87 // Obtain current language value\r
88 //\r
89 GetCurrentLanguage (CurrentLanguage);\r
90\r
91 //\r
92 // Add the FormSetTitle to the string buffer and get the StringToken\r
93 //\r
94 Status = AddString (*StringBuffer, CurrentLanguage, FormSetTitle, &StringToken);\r
95\r
96 if (EFI_ERROR (Status)) {\r
97 return Status;\r
98 }\r
99\r
100 //\r
101 // Initialize the Ifr Package header data\r
102 //\r
103 IfrPack.Header.Length = sizeof (EFI_HII_PACK_HEADER) + sizeof (EFI_IFR_FORM_SET) + sizeof (EFI_IFR_END_FORM_SET);\r
104 IfrPack.Header.Type = EFI_HII_IFR;\r
105\r
106 //\r
107 // Initialize FormSet with the appropriate information\r
108 //\r
109 FormSet.Header.OpCode = EFI_IFR_FORM_SET_OP;\r
110 FormSet.Header.Length = sizeof (EFI_IFR_FORM_SET);\r
111 FormSet.FormSetTitle = StringToken;\r
112 FormSet.Class = Class;\r
113 FormSet.SubClass = SubClass;\r
114 EfiCopyMem (&FormSet.Guid, Guid, sizeof (EFI_GUID));\r
115\r
116 //\r
117 // Initialize the end formset data\r
118 //\r
119 EndFormSet.Header.Length = sizeof (EFI_IFR_END_FORM_SET);\r
120 EndFormSet.Header.OpCode = EFI_IFR_END_FORM_SET_OP;\r
121\r
122 Destination = (CHAR8 *) *FormBuffer;\r
123\r
124 //\r
125 // Copy the formset/endformset data to the form buffer\r
126 //\r
127 EfiCopyMem (Destination, &IfrPack, sizeof (EFI_HII_PACK_HEADER));\r
128\r
129 Destination = Destination + sizeof (EFI_HII_PACK_HEADER);\r
130\r
131 EfiCopyMem (Destination, &FormSet, sizeof (EFI_IFR_FORM_SET));\r
132\r
133 Destination = Destination + sizeof (EFI_IFR_FORM_SET);\r
134\r
135 EfiCopyMem (Destination, &EndFormSet, sizeof (EFI_IFR_END_FORM_SET));\r
136 return EFI_SUCCESS;\r
137}\r
138\r
139\r
140EFI_STATUS\r
141CreateForm (\r
142 IN CHAR16 *FormTitle,\r
143 IN UINT16 FormId,\r
144 IN OUT VOID *FormBuffer,\r
145 IN OUT VOID *StringBuffer\r
146 )\r
147/*++\r
148\r
149Routine Description:\r
150\r
151 Create a form\r
152 \r
153Arguments:\r
154 \r
155 FormTitle - Title of the form\r
156 \r
157 FormId - Id of the form\r
158 \r
159 FormBuffer - Pointer of the form created\r
160 \r
161 StringBuffer - Pointer of FormTitil string created\r
162 \r
163Returns: \r
164\r
165 EFI_SUCCESS - Form successfully created\r
166\r
167--*/\r
168{\r
169 EFI_STATUS Status;\r
170 EFI_IFR_FORM Form;\r
171 EFI_IFR_END_FORM EndForm;\r
172 CHAR16 CurrentLanguage[4];\r
173 STRING_REF StringToken;\r
174\r
175 //\r
176 // Obtain current language value\r
177 //\r
178 GetCurrentLanguage (CurrentLanguage);\r
179\r
180 Status = AddString (StringBuffer, CurrentLanguage, FormTitle, &StringToken);\r
181\r
182 if (EFI_ERROR (Status)) {\r
183 return Status;\r
184 }\r
185\r
186 Form.Header.OpCode = EFI_IFR_FORM_OP;\r
187 Form.Header.Length = sizeof (EFI_IFR_FORM);\r
188 Form.FormId = FormId;\r
189 Form.FormTitle = StringToken;\r
190\r
191 Status = AddOpCode (FormBuffer, &Form);\r
192\r
193 if (EFI_ERROR (Status)) {\r
194 return Status;\r
195 }\r
196\r
197 EndForm.Header.OpCode = EFI_IFR_END_FORM_OP;\r
198 EndForm.Header.Length = sizeof (EFI_IFR_END_FORM);\r
199\r
200 Status = AddOpCode (FormBuffer, &EndForm);\r
201\r
202 if (EFI_ERROR (Status)) {\r
203 return Status;\r
204 }\r
205\r
206 return EFI_SUCCESS;\r
207}\r
208\r
209\r
210EFI_STATUS\r
211CreateSubTitle (\r
212 IN CHAR16 *SubTitle,\r
213 IN OUT VOID *FormBuffer,\r
214 IN OUT VOID *StringBuffer\r
215 )\r
216/*++\r
217\r
218Routine Description:\r
219\r
220 Create a SubTitle\r
221 \r
222Arguments:\r
223 \r
224 SubTitle - Sub title to be created\r
225 \r
226 FormBuffer - Where this subtitle to add to\r
227 \r
228 StringBuffer - String buffer created for subtitle\r
229 \r
230Returns: \r
231\r
232 EFI_SUCCESS - Subtitle successfully created\r
233\r
234--*/\r
235{\r
236 EFI_STATUS Status;\r
237 EFI_IFR_SUBTITLE Subtitle;\r
238 CHAR16 CurrentLanguage[4];\r
239 STRING_REF StringToken;\r
240\r
241 //\r
242 // Obtain current language value\r
243 //\r
244 GetCurrentLanguage (CurrentLanguage);\r
245\r
246 Status = AddString (StringBuffer, CurrentLanguage, SubTitle, &StringToken);\r
247\r
248 if (EFI_ERROR (Status)) {\r
249 return Status;\r
250 }\r
251\r
252 Subtitle.Header.OpCode = EFI_IFR_SUBTITLE_OP;\r
253 Subtitle.Header.Length = sizeof (EFI_IFR_SUBTITLE);\r
254 Subtitle.SubTitle = StringToken;\r
255\r
256 Status = AddOpCode (FormBuffer, &Subtitle);\r
257\r
258 if (EFI_ERROR (Status)) {\r
259 return Status;\r
260 }\r
261\r
262 return EFI_SUCCESS;\r
263}\r
264\r
265\r
266EFI_STATUS\r
267CreateText (\r
268 IN CHAR16 *String,\r
269 IN CHAR16 *String2,\r
270 IN CHAR16 *String3,\r
271 IN UINT8 Flags,\r
272 IN UINT16 Key,\r
273 IN OUT VOID *FormBuffer,\r
274 IN OUT VOID *StringBuffer\r
275 )\r
276/*++\r
277\r
278Routine Description:\r
279\r
280 Create a line of text\r
281 \r
282Arguments:\r
283 \r
284 String - First string of the text\r
285 \r
286 String2 - Second string of the text\r
287 \r
288 String3 - Help string of the text\r
289 \r
290 Flags - Flag of the text\r
291 \r
292 Key - Key of the text\r
293 \r
294 FormBuffer - The form where this text adds to\r
295 \r
296 StringBuffer - String buffer created for String, String2 and String3\r
297 \r
298Returns: \r
299\r
300 EFI_SUCCESS - Text successfully created\r
301\r
302--*/\r
303{\r
304 EFI_STATUS Status;\r
305 EFI_IFR_TEXT Text;\r
306 CHAR16 CurrentLanguage[4];\r
307 STRING_REF StringToken;\r
308\r
309 //\r
310 // Obtain current language value\r
311 //\r
312 GetCurrentLanguage (CurrentLanguage);\r
313\r
314 //\r
315 // Add first string, get first string's token\r
316 //\r
317 Status = AddString (StringBuffer, CurrentLanguage, String, &StringToken);\r
318\r
319 if (EFI_ERROR (Status)) {\r
320 return Status;\r
321 }\r
322\r
323 Text.Header.OpCode = EFI_IFR_TEXT_OP;\r
324 Text.Header.Length = sizeof (EFI_IFR_TEXT);\r
325 Text.Text = StringToken;\r
326\r
327 //\r
328 // Add second string, get first string's token\r
329 //\r
330 Status = AddString (StringBuffer, CurrentLanguage, String2, &StringToken);\r
331\r
332 if (EFI_ERROR (Status)) {\r
333 return Status;\r
334 }\r
335\r
336 Text.TextTwo = StringToken;\r
337\r
338 Text.Flags = (UINT8) (Flags | EFI_IFR_FLAG_CREATED);\r
339 Text.Key = Key;\r
340\r
341 //\r
342 // Add second string, get first string's token\r
343 //\r
344 Status = AddString (StringBuffer, CurrentLanguage, String3, &StringToken);\r
345\r
346 if (EFI_ERROR (Status)) {\r
347 return Status;\r
348 }\r
349\r
350 Text.Help = StringToken;\r
351\r
352 Status = AddOpCode (FormBuffer, &Text);\r
353\r
354 if (EFI_ERROR (Status)) {\r
355 return Status;\r
356 }\r
357\r
358 return EFI_SUCCESS;\r
359}\r
360\r
361\r
362EFI_STATUS\r
363CreateGoto (\r
364 IN UINT16 FormId,\r
365 IN CHAR16 *Prompt,\r
366 IN OUT VOID *FormBuffer,\r
367 IN OUT VOID *StringBuffer\r
368 )\r
369/*++\r
370\r
371Routine Description:\r
372\r
373 Create a hyperlink\r
374 \r
375Arguments:\r
376 \r
377 FormId - Form ID of the hyperlink\r
378 \r
379 Prompt - Prompt of the hyperlink\r
380 \r
381 FormBuffer - The form where this hyperlink adds to\r
382 \r
383 StringBuffer - String buffer created for Prompt\r
384 \r
385Returns: \r
386\r
387 EFI_SUCCESS - Hyperlink successfully created\r
388\r
389--*/\r
390{\r
391 EFI_STATUS Status;\r
392 EFI_IFR_REF Hyperlink;\r
393 CHAR16 CurrentLanguage[4];\r
394 STRING_REF StringToken;\r
395\r
396 //\r
397 // Obtain current language value\r
398 //\r
399 GetCurrentLanguage (CurrentLanguage);\r
400\r
401 Status = AddString (StringBuffer, CurrentLanguage, Prompt, &StringToken);\r
402\r
403 if (EFI_ERROR (Status)) {\r
404 return Status;\r
405 }\r
406\r
407 Hyperlink.Header.OpCode = EFI_IFR_REF_OP;\r
408 Hyperlink.Header.Length = sizeof (EFI_IFR_REF);\r
409 Hyperlink.FormId = FormId;\r
410 Hyperlink.Prompt = StringToken;\r
411\r
412 Status = AddOpCode (FormBuffer, &Hyperlink);\r
413\r
414 if (EFI_ERROR (Status)) {\r
415 return Status;\r
416 }\r
417\r
418 return EFI_SUCCESS;\r
419}\r
420\r
421\r
422EFI_STATUS\r
423CreateOneOf (\r
424 IN UINT16 QuestionId,\r
425 IN UINT8 DataWidth,\r
426 IN CHAR16 *Prompt,\r
427 IN CHAR16 *Help,\r
428 IN IFR_OPTION *OptionsList,\r
429 IN UINTN OptionCount,\r
430 IN OUT VOID *FormBuffer,\r
431 IN OUT VOID *StringBuffer\r
432 )\r
433/*++\r
434\r
435Routine Description:\r
436\r
437 Create a one-of question with a set of options to choose from. The\r
438 OptionsList is a pointer to a null-terminated list of option descriptions.\r
439 \r
440Arguments:\r
441 \r
442 QuestionId - Question ID of the one-of box\r
443 \r
444 DataWidth - DataWidth of the one-of box\r
445 \r
446 Prompt - Prompt of the one-of box\r
447 \r
448 Help - Help of the one-of box\r
449 \r
450 OptionsList - Each string in it is an option of the one-of box\r
451 \r
452 OptionCount - Option string count\r
453 \r
454 FormBuffer - The form where this one-of box adds to\r
455 \r
456 StringBuffer - String buffer created for Prompt, Help and Option strings\r
457 \r
458Returns: \r
459\r
460 EFI_DEVICE_ERROR - DataWidth > 2\r
461\r
462 EFI_SUCCESS - One-Of box successfully created.\r
463\r
464--*/\r
465{\r
466 EFI_STATUS Status;\r
467 UINTN Index;\r
468 EFI_IFR_ONE_OF OneOf;\r
469 EFI_IFR_ONE_OF_OPTION OneOfOption;\r
470 EFI_IFR_END_ONE_OF EndOneOf;\r
471 CHAR16 CurrentLanguage[4];\r
472 STRING_REF StringToken;\r
473\r
474 //\r
475 // We do not create op-code storage widths for one-of in excess of 16 bits for now\r
476 //\r
477 if (DataWidth > 2) {\r
478 return EFI_DEVICE_ERROR;\r
479 }\r
480\r
481 //\r
482 // Obtain current language value\r
483 //\r
484 GetCurrentLanguage (CurrentLanguage);\r
485\r
486 //\r
487 // Add first string, get first string's token\r
488 //\r
489 Status = AddString (StringBuffer, CurrentLanguage, Prompt, &StringToken);\r
490\r
491 if (EFI_ERROR (Status)) {\r
492 return Status;\r
493 }\r
494\r
495 OneOf.Header.OpCode = EFI_IFR_ONE_OF_OP;\r
496 OneOf.Header.Length = sizeof (EFI_IFR_ONE_OF);\r
497 OneOf.QuestionId = QuestionId;\r
498 OneOf.Width = DataWidth;\r
499 OneOf.Prompt = StringToken;\r
500\r
501 //\r
502 // Add second string, get first string's token\r
503 //\r
504 Status = AddString (StringBuffer, CurrentLanguage, Help, &StringToken);\r
505\r
506 if (EFI_ERROR (Status)) {\r
507 return Status;\r
508 }\r
509\r
510 OneOf.Help = StringToken;\r
511\r
512 Status = AddOpCode (FormBuffer, &OneOf);\r
513\r
514 if (EFI_ERROR (Status)) {\r
515 return Status;\r
516 }\r
517\r
518 for (Index = 0; Index < OptionCount; Index++) {\r
519 OneOfOption.Header.OpCode = EFI_IFR_ONE_OF_OPTION_OP;\r
520 OneOfOption.Header.Length = sizeof (EFI_IFR_ONE_OF_OPTION);\r
521\r
522 //\r
523 // Add string and get token back\r
524 //\r
525 Status = AddString (StringBuffer, CurrentLanguage, OptionsList[Index].OptionString, &StringToken);\r
526\r
527 OneOfOption.Option = StringToken;\r
528 OneOfOption.Value = OptionsList[Index].Value;\r
529 OneOfOption.Flags = (UINT8) (OptionsList[Index].Flags | EFI_IFR_FLAG_CREATED);\r
530 OneOfOption.Key = OptionsList[Index].Key;\r
531\r
532 Status = AddOpCode (FormBuffer, &OneOfOption);\r
533\r
534 if (EFI_ERROR (Status)) {\r
535 return Status;\r
536 }\r
537 }\r
538\r
539 EndOneOf.Header.Length = sizeof (EFI_IFR_END_ONE_OF);\r
540 EndOneOf.Header.OpCode = EFI_IFR_END_ONE_OF_OP;\r
541\r
542 Status = AddOpCode (FormBuffer, &EndOneOf);\r
543\r
544 if (EFI_ERROR (Status)) {\r
545 return Status;\r
546 }\r
547\r
548 return EFI_SUCCESS;\r
549}\r
550\r
551EFI_STATUS\r
552CreateOrderedList (\r
553 IN UINT16 QuestionId,\r
554 IN UINT8 MaxEntries,\r
555 IN CHAR16 *Prompt,\r
556 IN CHAR16 *Help,\r
557 IN IFR_OPTION *OptionsList,\r
558 IN UINTN OptionCount,\r
559 IN OUT VOID *FormBuffer,\r
560 IN OUT VOID *StringBuffer\r
561 )\r
562/*++\r
563\r
564Routine Description:\r
565\r
566 Create a one-of question with a set of options to choose from. The\r
567 OptionsList is a pointer to a null-terminated list of option descriptions.\r
568 \r
569Arguments:\r
570 \r
571 QuestionId - Question ID of the ordered list\r
572 \r
573 MaxEntries - MaxEntries of the ordered list\r
574 \r
575 Prompt - Prompt of the ordered list\r
576 \r
577 Help - Help of the ordered list\r
578 \r
579 OptionsList - Each string in it is an option of the ordered list\r
580 \r
581 OptionCount - Option string count\r
582 \r
583 FormBuffer - The form where this ordered list adds to\r
584 \r
585 StringBuffer - String buffer created for Prompt, Help and Option strings\r
586 \r
587Returns: \r
588\r
589 EFI_SUCCESS - Ordered list successfully created.\r
590\r
591--*/\r
592{\r
593 EFI_STATUS Status;\r
594 UINTN Index;\r
595 EFI_IFR_ORDERED_LIST OrderedList;\r
596 EFI_IFR_ONE_OF_OPTION OrderedListOption;\r
597 EFI_IFR_END_ONE_OF EndOrderedList;\r
598 CHAR16 CurrentLanguage[4];\r
599 STRING_REF StringToken;\r
600\r
601 //\r
602 // Obtain current language value\r
603 //\r
604 GetCurrentLanguage (CurrentLanguage);\r
605\r
606 //\r
607 // Add first string, get first string's token\r
608 //\r
609 Status = AddString (StringBuffer, CurrentLanguage, Prompt, &StringToken);\r
610\r
611 if (EFI_ERROR (Status)) {\r
612 return Status;\r
613 }\r
614\r
615 OrderedList.Header.OpCode = EFI_IFR_ORDERED_LIST_OP;\r
616 OrderedList.Header.Length = sizeof (EFI_IFR_ORDERED_LIST);\r
617 OrderedList.QuestionId = QuestionId;\r
618 OrderedList.MaxEntries = MaxEntries;\r
619 OrderedList.Prompt = StringToken;\r
620\r
621 //\r
622 // Add second string, get first string's token\r
623 //\r
624 Status = AddString (StringBuffer, CurrentLanguage, Help, &StringToken);\r
625\r
626 if (EFI_ERROR (Status)) {\r
627 return Status;\r
628 }\r
629\r
630 OrderedList.Help = StringToken;\r
631\r
632 Status = AddOpCode (FormBuffer, &OrderedList);\r
633\r
634 if (EFI_ERROR (Status)) {\r
635 return Status;\r
636 }\r
637\r
638 for (Index = 0; Index < OptionCount; Index++) {\r
639 OrderedListOption.Header.OpCode = EFI_IFR_ONE_OF_OPTION_OP;\r
640 OrderedListOption.Header.Length = sizeof (EFI_IFR_ONE_OF_OPTION);\r
641\r
642 //\r
643 // Add string and get token back\r
644 //\r
645 Status = AddString (StringBuffer, CurrentLanguage, OptionsList[Index].OptionString, &StringToken);\r
646\r
647 OrderedListOption.Option = StringToken;\r
648 OrderedListOption.Value = OptionsList[Index].Value;\r
649 OrderedListOption.Flags = (UINT8) (OptionsList[Index].Flags | EFI_IFR_FLAG_CREATED);\r
650 OrderedListOption.Key = OptionsList[Index].Key;\r
651\r
652 Status = AddOpCode (FormBuffer, &OrderedListOption);\r
653\r
654 if (EFI_ERROR (Status)) {\r
655 return Status;\r
656 }\r
657 }\r
658\r
659 EndOrderedList.Header.Length = sizeof (EFI_IFR_END_ONE_OF);\r
660 EndOrderedList.Header.OpCode = EFI_IFR_END_ONE_OF_OP;\r
661\r
662 Status = AddOpCode (FormBuffer, &EndOrderedList);\r
663\r
664 if (EFI_ERROR (Status)) {\r
665 return Status;\r
666 }\r
667\r
668 return EFI_SUCCESS;\r
669}\r
670\r
671\r
672EFI_STATUS\r
673CreateCheckBox (\r
674 IN UINT16 QuestionId,\r
675 IN UINT8 DataWidth,\r
676 IN CHAR16 *Prompt,\r
677 IN CHAR16 *Help,\r
678 IN UINT8 Flags,\r
679 IN OUT VOID *FormBuffer,\r
680 IN OUT VOID *StringBuffer\r
681 )\r
682/*++\r
683\r
684Routine Description:\r
685\r
686 Create a checkbox\r
687 \r
688Arguments:\r
689 \r
690 QuestionId - Question ID of the check box\r
691 \r
692 DataWidth - DataWidth of the check box\r
693 \r
694 Prompt - Prompt of the check box\r
695 \r
696 Help - Help of the check box\r
697 \r
698 Flags - Flags of the check box\r
699 \r
700 FormBuffer - The form where this check box adds to\r
701 \r
702 StringBuffer - String buffer created for Prompt and Help.\r
703 \r
704Returns: \r
705\r
706 EFI_DEVICE_ERROR - DataWidth > 1\r
707\r
708 EFI_SUCCESS - Check box successfully created\r
709\r
710--*/\r
711{\r
712 EFI_STATUS Status;\r
713 EFI_IFR_CHECK_BOX CheckBox;\r
714 CHAR16 CurrentLanguage[4];\r
715 STRING_REF StringToken;\r
716\r
717 //\r
718 // We do not create op-code storage widths for checkbox in excess of 8 bits for now\r
719 //\r
720 if (DataWidth > 1) {\r
721 return EFI_DEVICE_ERROR;\r
722 }\r
723\r
724 //\r
725 // Obtain current language value\r
726 //\r
727 GetCurrentLanguage (CurrentLanguage);\r
728\r
729 //\r
730 // Add first string, get first string's token\r
731 //\r
732 Status = AddString (StringBuffer, CurrentLanguage, Prompt, &StringToken);\r
733\r
734 if (EFI_ERROR (Status)) {\r
735 return Status;\r
736 }\r
737\r
738 CheckBox.Header.OpCode = EFI_IFR_CHECKBOX_OP;\r
739 CheckBox.Header.Length = sizeof (EFI_IFR_CHECK_BOX);\r
740 CheckBox.QuestionId = QuestionId;\r
741 CheckBox.Width = DataWidth;\r
742 CheckBox.Prompt = StringToken;\r
743\r
744 //\r
745 // Add second string, get first string's token\r
746 //\r
747 Status = AddString (StringBuffer, CurrentLanguage, Help, &StringToken);\r
748\r
749 if (EFI_ERROR (Status)) {\r
750 return Status;\r
751 }\r
752\r
753 CheckBox.Help = StringToken;\r
754 CheckBox.Flags = (UINT8) (Flags | EFI_IFR_FLAG_CREATED);\r
755\r
756 Status = AddOpCode (FormBuffer, &CheckBox);\r
757\r
758 if (EFI_ERROR (Status)) {\r
759 return Status;\r
760 }\r
761\r
762 return EFI_SUCCESS;\r
763}\r
764\r
765\r
766EFI_STATUS\r
767CreateNumeric (\r
768 IN UINT16 QuestionId,\r
769 IN UINT8 DataWidth,\r
770 IN CHAR16 *Prompt,\r
771 IN CHAR16 *Help,\r
772 IN UINT16 Minimum,\r
773 IN UINT16 Maximum,\r
774 IN UINT16 Step,\r
775 IN UINT16 Default,\r
776 IN UINT8 Flags,\r
777 IN UINT16 Key,\r
778 IN OUT VOID *FormBuffer,\r
779 IN OUT VOID *StringBuffer\r
780 )\r
781/*++\r
782\r
783Routine Description:\r
784\r
785 Create a numeric\r
786 \r
787Arguments:\r
788 \r
789 QuestionId - Question ID of the numeric\r
790 \r
791 DataWidth - DataWidth of the numeric\r
792 \r
793 Prompt - Prompt of the numeric\r
794 \r
795 Help - Help of the numeric\r
796 \r
797 Minimum - Minumun boundary of the numeric\r
798 \r
799 Maximum - Maximum boundary of the numeric\r
800 \r
801 Step - Step of the numeric\r
802 \r
803 Default - Default value\r
804 \r
805 Flags - Flags of the numeric\r
806 \r
807 Key - Key of the numeric\r
808 \r
809 FormBuffer - The form where this numeric adds to\r
810 \r
811 StringBuffer - String buffer created for Prompt and Help.\r
812 \r
813Returns: \r
814\r
815 EFI_DEVICE_ERROR - DataWidth > 2\r
816 \r
817 EFI_SUCCESS - Numeric is successfully created\r
818\r
819--*/\r
820{\r
821 EFI_STATUS Status;\r
822 EFI_IFR_NUMERIC Numeric;\r
823 CHAR16 CurrentLanguage[4];\r
824 STRING_REF StringToken;\r
825\r
826 //\r
827 // We do not create op-code storage widths for numerics in excess of 16 bits for now\r
828 //\r
829 if (DataWidth > 2) {\r
830 return EFI_DEVICE_ERROR;\r
831 }\r
832\r
833 //\r
834 // Obtain current language value\r
835 //\r
836 GetCurrentLanguage (CurrentLanguage);\r
837\r
838 //\r
839 // Add first string, get first string's token\r
840 //\r
841 Status = AddString (StringBuffer, CurrentLanguage, Prompt, &StringToken);\r
842\r
843 if (EFI_ERROR (Status)) {\r
844 return Status;\r
845 }\r
846\r
847 Numeric.Header.OpCode = EFI_IFR_NUMERIC_OP;\r
848 Numeric.Header.Length = sizeof (EFI_IFR_NUMERIC);\r
849 Numeric.QuestionId = QuestionId;\r
850 Numeric.Width = DataWidth;\r
851 Numeric.Prompt = StringToken;\r
852\r
853 //\r
854 // Add second string, get first string's token\r
855 //\r
856 Status = AddString (StringBuffer, CurrentLanguage, Help, &StringToken);\r
857\r
858 if (EFI_ERROR (Status)) {\r
859 return Status;\r
860 }\r
861\r
862 Numeric.Help = StringToken;\r
863 Numeric.Minimum = Minimum;\r
864 Numeric.Maximum = Maximum;\r
865 Numeric.Step = Step;\r
866 Numeric.Default = Default;\r
867 Numeric.Flags = (UINT8) (Flags | EFI_IFR_FLAG_CREATED);\r
868 Numeric.Key = Key;\r
869\r
870 Status = AddOpCode (FormBuffer, &Numeric);\r
871\r
872 if (EFI_ERROR (Status)) {\r
873 return Status;\r
874 }\r
875\r
876 return EFI_SUCCESS;\r
877}\r
878\r
879\r
880EFI_STATUS\r
881CreateString (\r
882 IN UINT16 QuestionId,\r
883 IN UINT8 DataWidth,\r
884 IN CHAR16 *Prompt,\r
885 IN CHAR16 *Help,\r
886 IN UINT8 MinSize,\r
887 IN UINT8 MaxSize,\r
888 IN UINT8 Flags,\r
889 IN UINT16 Key,\r
890 IN OUT VOID *FormBuffer,\r
891 IN OUT VOID *StringBuffer\r
892 )\r
893/*++\r
894\r
895Routine Description:\r
896\r
897 Create a string\r
898 \r
899Arguments:\r
900 \r
901 QuestionId - Question ID of the string\r
902 \r
903 DataWidth - DataWidth of the string\r
904 \r
905 Prompt - Prompt of the string\r
906 \r
907 Help - Help of the string\r
908 \r
909 MinSize - Min size boundary of the string\r
910 \r
911 MaxSize - Max size boundary of the string\r
912 \r
913 Flags - Flags of the string\r
914 \r
915 Key - Key of the string\r
916 \r
917 FormBuffer - The form where this string adds to\r
918 \r
919 StringBuffer - String buffer created for Prompt and Help.\r
920 \r
921Returns: \r
922\r
923 EFI_SUCCESS - String successfully created.\r
924\r
925--*/\r
926{\r
927 EFI_STATUS Status;\r
928 EFI_IFR_STRING String;\r
929 CHAR16 CurrentLanguage[4];\r
930 STRING_REF StringToken;\r
931\r
932 //\r
933 // Obtain current language value\r
934 //\r
935 GetCurrentLanguage (CurrentLanguage);\r
936\r
937 //\r
938 // Add first string, get first string's token\r
939 //\r
940 Status = AddString (StringBuffer, CurrentLanguage, Prompt, &StringToken);\r
941\r
942 if (EFI_ERROR (Status)) {\r
943 return Status;\r
944 }\r
945\r
946 String.Header.OpCode = EFI_IFR_STRING_OP;\r
947 String.Header.Length = sizeof (EFI_IFR_STRING);\r
948 String.QuestionId = QuestionId;\r
949 String.Width = DataWidth;\r
950 String.Prompt = StringToken;\r
951\r
952 //\r
953 // Add second string, get first string's token\r
954 //\r
955 Status = AddString (StringBuffer, CurrentLanguage, Help, &StringToken);\r
956\r
957 if (EFI_ERROR (Status)) {\r
958 return Status;\r
959 }\r
960\r
961 String.Help = StringToken;\r
962 String.MinSize = MinSize;\r
963 String.MaxSize = MaxSize;\r
964 String.Flags = (UINT8) (Flags | EFI_IFR_FLAG_CREATED);\r
965 String.Key = Key;\r
966\r
967 Status = AddOpCode (FormBuffer, &String);\r
968\r
969 if (EFI_ERROR (Status)) {\r
970 return Status;\r
971 }\r
972\r
973 return EFI_SUCCESS;\r
974}\r