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