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