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
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.
16 Library Routines to create IFR on-the-fly
22 #include "IfrLibrary.h"
26 IN CHAR16
*FormSetTitle
,
30 IN OUT VOID
**FormBuffer
,
31 IN OUT VOID
**StringBuffer
41 FormSetTitle - Title of formset
43 Guid - Guid of formset
45 Class - Class of formset
47 SubClass - Sub class of formset
49 FormBuffer - Pointer of the formset created
51 StringBuffer - Pointer of FormSetTitile string created
55 EFI_OUT_OF_RESOURCES - No enough buffer to allocate
57 EFI_SUCCESS - Formset successfully created
62 EFI_HII_IFR_PACK IfrPack
;
63 EFI_IFR_FORM_SET FormSet
;
64 EFI_IFR_END_FORM_SET EndFormSet
;
66 CHAR16 CurrentLanguage
[4];
67 STRING_REF StringToken
;
70 // Pre-allocate a buffer sufficient for us to work from.
72 FormBuffer
= EfiLibAllocateZeroPool (DEFAULT_FORM_BUFFER_SIZE
);
73 if (FormBuffer
== NULL
) {
74 return EFI_OUT_OF_RESOURCES
;
78 // Pre-allocate a buffer sufficient for us to work from.
80 StringBuffer
= EfiLibAllocateZeroPool (DEFAULT_STRING_BUFFER_SIZE
);
81 if (StringBuffer
== NULL
) {
82 gBS
->FreePool (FormBuffer
);
83 return EFI_OUT_OF_RESOURCES
;
87 // Obtain current language value
89 GetCurrentLanguage (CurrentLanguage
);
92 // Add the FormSetTitle to the string buffer and get the StringToken
94 Status
= AddString (*StringBuffer
, CurrentLanguage
, FormSetTitle
, &StringToken
);
96 if (EFI_ERROR (Status
)) {
101 // Initialize the Ifr Package header data
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
;
107 // Initialize FormSet with the appropriate information
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
));
117 // Initialize the end formset data
119 EndFormSet
.Header
.Length
= sizeof (EFI_IFR_END_FORM_SET
);
120 EndFormSet
.Header
.OpCode
= EFI_IFR_END_FORM_SET_OP
;
122 Destination
= (CHAR8
*) *FormBuffer
;
125 // Copy the formset/endformset data to the form buffer
127 EfiCopyMem (Destination
, &IfrPack
, sizeof (EFI_HII_PACK_HEADER
));
129 Destination
= Destination
+ sizeof (EFI_HII_PACK_HEADER
);
131 EfiCopyMem (Destination
, &FormSet
, sizeof (EFI_IFR_FORM_SET
));
133 Destination
= Destination
+ sizeof (EFI_IFR_FORM_SET
);
135 EfiCopyMem (Destination
, &EndFormSet
, sizeof (EFI_IFR_END_FORM_SET
));
142 IN CHAR16
*FormTitle
,
144 IN OUT VOID
*FormBuffer
,
145 IN OUT VOID
*StringBuffer
155 FormTitle - Title of the form
157 FormId - Id of the form
159 FormBuffer - Pointer of the form created
161 StringBuffer - Pointer of FormTitil string created
165 EFI_SUCCESS - Form successfully created
171 EFI_IFR_END_FORM EndForm
;
172 CHAR16 CurrentLanguage
[4];
173 STRING_REF StringToken
;
176 // Obtain current language value
178 GetCurrentLanguage (CurrentLanguage
);
180 Status
= AddString (StringBuffer
, CurrentLanguage
, FormTitle
, &StringToken
);
182 if (EFI_ERROR (Status
)) {
186 Form
.Header
.OpCode
= EFI_IFR_FORM_OP
;
187 Form
.Header
.Length
= sizeof (EFI_IFR_FORM
);
188 Form
.FormId
= FormId
;
189 Form
.FormTitle
= StringToken
;
191 Status
= AddOpCode (FormBuffer
, &Form
);
193 if (EFI_ERROR (Status
)) {
197 EndForm
.Header
.OpCode
= EFI_IFR_END_FORM_OP
;
198 EndForm
.Header
.Length
= sizeof (EFI_IFR_END_FORM
);
200 Status
= AddOpCode (FormBuffer
, &EndForm
);
202 if (EFI_ERROR (Status
)) {
213 IN OUT VOID
*FormBuffer
,
214 IN OUT VOID
*StringBuffer
224 SubTitle - Sub title to be created
226 FormBuffer - Where this subtitle to add to
228 StringBuffer - String buffer created for subtitle
232 EFI_SUCCESS - Subtitle successfully created
237 EFI_IFR_SUBTITLE Subtitle
;
238 CHAR16 CurrentLanguage
[4];
239 STRING_REF StringToken
;
242 // Obtain current language value
244 GetCurrentLanguage (CurrentLanguage
);
246 Status
= AddString (StringBuffer
, CurrentLanguage
, SubTitle
, &StringToken
);
248 if (EFI_ERROR (Status
)) {
252 Subtitle
.Header
.OpCode
= EFI_IFR_SUBTITLE_OP
;
253 Subtitle
.Header
.Length
= sizeof (EFI_IFR_SUBTITLE
);
254 Subtitle
.SubTitle
= StringToken
;
256 Status
= AddOpCode (FormBuffer
, &Subtitle
);
258 if (EFI_ERROR (Status
)) {
273 IN OUT VOID
*FormBuffer
,
274 IN OUT VOID
*StringBuffer
280 Create a line of text
284 String - First string of the text
286 String2 - Second string of the text
288 String3 - Help string of the text
290 Flags - Flag of the text
292 Key - Key of the text
294 FormBuffer - The form where this text adds to
296 StringBuffer - String buffer created for String, String2 and String3
300 EFI_SUCCESS - Text successfully created
306 CHAR16 CurrentLanguage
[4];
307 STRING_REF StringToken
;
310 // Obtain current language value
312 GetCurrentLanguage (CurrentLanguage
);
315 // Add first string, get first string's token
317 Status
= AddString (StringBuffer
, CurrentLanguage
, String
, &StringToken
);
319 if (EFI_ERROR (Status
)) {
323 Text
.Header
.OpCode
= EFI_IFR_TEXT_OP
;
324 Text
.Header
.Length
= sizeof (EFI_IFR_TEXT
);
325 Text
.Text
= StringToken
;
328 // Add second string, get first string's token
330 Status
= AddString (StringBuffer
, CurrentLanguage
, String2
, &StringToken
);
332 if (EFI_ERROR (Status
)) {
336 Text
.TextTwo
= StringToken
;
338 Text
.Flags
= (UINT8
) (Flags
| EFI_IFR_FLAG_CREATED
);
342 // Add second string, get first string's token
344 Status
= AddString (StringBuffer
, CurrentLanguage
, String3
, &StringToken
);
346 if (EFI_ERROR (Status
)) {
350 Text
.Help
= StringToken
;
352 Status
= AddOpCode (FormBuffer
, &Text
);
354 if (EFI_ERROR (Status
)) {
366 IN OUT VOID
*FormBuffer
,
367 IN OUT VOID
*StringBuffer
377 FormId - Form ID of the hyperlink
379 Prompt - Prompt of the hyperlink
381 FormBuffer - The form where this hyperlink adds to
383 StringBuffer - String buffer created for Prompt
387 EFI_SUCCESS - Hyperlink successfully created
392 EFI_IFR_REF Hyperlink
;
393 CHAR16 CurrentLanguage
[4];
394 STRING_REF StringToken
;
397 // Obtain current language value
399 GetCurrentLanguage (CurrentLanguage
);
401 Status
= AddString (StringBuffer
, CurrentLanguage
, Prompt
, &StringToken
);
403 if (EFI_ERROR (Status
)) {
407 Hyperlink
.Header
.OpCode
= EFI_IFR_REF_OP
;
408 Hyperlink
.Header
.Length
= sizeof (EFI_IFR_REF
);
409 Hyperlink
.FormId
= FormId
;
410 Hyperlink
.Prompt
= StringToken
;
412 Status
= AddOpCode (FormBuffer
, &Hyperlink
);
414 if (EFI_ERROR (Status
)) {
424 IN UINT16 QuestionId
,
428 IN IFR_OPTION
*OptionsList
,
429 IN UINTN OptionCount
,
430 IN OUT VOID
*FormBuffer
,
431 IN OUT VOID
*StringBuffer
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.
442 QuestionId - Question ID of the one-of box
444 DataWidth - DataWidth of the one-of box
446 Prompt - Prompt of the one-of box
448 Help - Help of the one-of box
450 OptionsList - Each string in it is an option of the one-of box
452 OptionCount - Option string count
454 FormBuffer - The form where this one-of box adds to
456 StringBuffer - String buffer created for Prompt, Help and Option strings
460 EFI_DEVICE_ERROR - DataWidth > 2
462 EFI_SUCCESS - One-Of box successfully created.
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
;
475 // We do not create op-code storage widths for one-of in excess of 16 bits for now
478 return EFI_DEVICE_ERROR
;
482 // Obtain current language value
484 GetCurrentLanguage (CurrentLanguage
);
487 // Add first string, get first string's token
489 Status
= AddString (StringBuffer
, CurrentLanguage
, Prompt
, &StringToken
);
491 if (EFI_ERROR (Status
)) {
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
;
502 // Add second string, get first string's token
504 Status
= AddString (StringBuffer
, CurrentLanguage
, Help
, &StringToken
);
506 if (EFI_ERROR (Status
)) {
510 OneOf
.Help
= StringToken
;
512 Status
= AddOpCode (FormBuffer
, &OneOf
);
514 if (EFI_ERROR (Status
)) {
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
);
523 // Add string and get token back
525 Status
= AddString (StringBuffer
, CurrentLanguage
, OptionsList
[Index
].OptionString
, &StringToken
);
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
;
532 Status
= AddOpCode (FormBuffer
, &OneOfOption
);
534 if (EFI_ERROR (Status
)) {
539 EndOneOf
.Header
.Length
= sizeof (EFI_IFR_END_ONE_OF
);
540 EndOneOf
.Header
.OpCode
= EFI_IFR_END_ONE_OF_OP
;
542 Status
= AddOpCode (FormBuffer
, &EndOneOf
);
544 if (EFI_ERROR (Status
)) {
553 IN UINT16 QuestionId
,
557 IN IFR_OPTION
*OptionsList
,
558 IN UINTN OptionCount
,
559 IN OUT VOID
*FormBuffer
,
560 IN OUT VOID
*StringBuffer
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.
571 QuestionId - Question ID of the ordered list
573 MaxEntries - MaxEntries of the ordered list
575 Prompt - Prompt of the ordered list
577 Help - Help of the ordered list
579 OptionsList - Each string in it is an option of the ordered list
581 OptionCount - Option string count
583 FormBuffer - The form where this ordered list adds to
585 StringBuffer - String buffer created for Prompt, Help and Option strings
589 EFI_SUCCESS - Ordered list successfully created.
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
;
602 // Obtain current language value
604 GetCurrentLanguage (CurrentLanguage
);
607 // Add first string, get first string's token
609 Status
= AddString (StringBuffer
, CurrentLanguage
, Prompt
, &StringToken
);
611 if (EFI_ERROR (Status
)) {
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
;
622 // Add second string, get first string's token
624 Status
= AddString (StringBuffer
, CurrentLanguage
, Help
, &StringToken
);
626 if (EFI_ERROR (Status
)) {
630 OrderedList
.Help
= StringToken
;
632 Status
= AddOpCode (FormBuffer
, &OrderedList
);
634 if (EFI_ERROR (Status
)) {
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
);
643 // Add string and get token back
645 Status
= AddString (StringBuffer
, CurrentLanguage
, OptionsList
[Index
].OptionString
, &StringToken
);
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
;
652 Status
= AddOpCode (FormBuffer
, &OrderedListOption
);
654 if (EFI_ERROR (Status
)) {
659 EndOrderedList
.Header
.Length
= sizeof (EFI_IFR_END_ONE_OF
);
660 EndOrderedList
.Header
.OpCode
= EFI_IFR_END_ONE_OF_OP
;
662 Status
= AddOpCode (FormBuffer
, &EndOrderedList
);
664 if (EFI_ERROR (Status
)) {
674 IN UINT16 QuestionId
,
679 IN OUT VOID
*FormBuffer
,
680 IN OUT VOID
*StringBuffer
690 QuestionId - Question ID of the check box
692 DataWidth - DataWidth of the check box
694 Prompt - Prompt of the check box
696 Help - Help of the check box
698 Flags - Flags of the check box
700 FormBuffer - The form where this check box adds to
702 StringBuffer - String buffer created for Prompt and Help.
706 EFI_DEVICE_ERROR - DataWidth > 1
708 EFI_SUCCESS - Check box successfully created
713 EFI_IFR_CHECK_BOX CheckBox
;
714 CHAR16 CurrentLanguage
[4];
715 STRING_REF StringToken
;
718 // We do not create op-code storage widths for checkbox in excess of 8 bits for now
721 return EFI_DEVICE_ERROR
;
725 // Obtain current language value
727 GetCurrentLanguage (CurrentLanguage
);
730 // Add first string, get first string's token
732 Status
= AddString (StringBuffer
, CurrentLanguage
, Prompt
, &StringToken
);
734 if (EFI_ERROR (Status
)) {
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
;
745 // Add second string, get first string's token
747 Status
= AddString (StringBuffer
, CurrentLanguage
, Help
, &StringToken
);
749 if (EFI_ERROR (Status
)) {
753 CheckBox
.Help
= StringToken
;
754 CheckBox
.Flags
= (UINT8
) (Flags
| EFI_IFR_FLAG_CREATED
);
756 Status
= AddOpCode (FormBuffer
, &CheckBox
);
758 if (EFI_ERROR (Status
)) {
768 IN UINT16 QuestionId
,
778 IN OUT VOID
*FormBuffer
,
779 IN OUT VOID
*StringBuffer
789 QuestionId - Question ID of the numeric
791 DataWidth - DataWidth of the numeric
793 Prompt - Prompt of the numeric
795 Help - Help of the numeric
797 Minimum - Minumun boundary of the numeric
799 Maximum - Maximum boundary of the numeric
801 Step - Step of the numeric
803 Default - Default value
805 Flags - Flags of the numeric
807 Key - Key of the numeric
809 FormBuffer - The form where this numeric adds to
811 StringBuffer - String buffer created for Prompt and Help.
815 EFI_DEVICE_ERROR - DataWidth > 2
817 EFI_SUCCESS - Numeric is successfully created
822 EFI_IFR_NUMERIC Numeric
;
823 CHAR16 CurrentLanguage
[4];
824 STRING_REF StringToken
;
827 // We do not create op-code storage widths for numerics in excess of 16 bits for now
830 return EFI_DEVICE_ERROR
;
834 // Obtain current language value
836 GetCurrentLanguage (CurrentLanguage
);
839 // Add first string, get first string's token
841 Status
= AddString (StringBuffer
, CurrentLanguage
, Prompt
, &StringToken
);
843 if (EFI_ERROR (Status
)) {
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
;
854 // Add second string, get first string's token
856 Status
= AddString (StringBuffer
, CurrentLanguage
, Help
, &StringToken
);
858 if (EFI_ERROR (Status
)) {
862 Numeric
.Help
= StringToken
;
863 Numeric
.Minimum
= Minimum
;
864 Numeric
.Maximum
= Maximum
;
866 Numeric
.Default
= Default
;
867 Numeric
.Flags
= (UINT8
) (Flags
| EFI_IFR_FLAG_CREATED
);
870 Status
= AddOpCode (FormBuffer
, &Numeric
);
872 if (EFI_ERROR (Status
)) {
882 IN UINT16 QuestionId
,
890 IN OUT VOID
*FormBuffer
,
891 IN OUT VOID
*StringBuffer
901 QuestionId - Question ID of the string
903 DataWidth - DataWidth of the string
905 Prompt - Prompt of the string
907 Help - Help of the string
909 MinSize - Min size boundary of the string
911 MaxSize - Max size boundary of the string
913 Flags - Flags of the string
915 Key - Key of the string
917 FormBuffer - The form where this string adds to
919 StringBuffer - String buffer created for Prompt and Help.
923 EFI_SUCCESS - String successfully created.
928 EFI_IFR_STRING String
;
929 CHAR16 CurrentLanguage
[4];
930 STRING_REF StringToken
;
933 // Obtain current language value
935 GetCurrentLanguage (CurrentLanguage
);
938 // Add first string, get first string's token
940 Status
= AddString (StringBuffer
, CurrentLanguage
, Prompt
, &StringToken
);
942 if (EFI_ERROR (Status
)) {
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
;
953 // Add second string, get first string's token
955 Status
= AddString (StringBuffer
, CurrentLanguage
, Help
, &StringToken
);
957 if (EFI_ERROR (Status
)) {
961 String
.Help
= StringToken
;
962 String
.MinSize
= MinSize
;
963 String
.MaxSize
= MaxSize
;
964 String
.Flags
= (UINT8
) (Flags
| EFI_IFR_FLAG_CREATED
);
967 Status
= AddOpCode (FormBuffer
, &String
);
969 if (EFI_ERROR (Status
)) {