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"
24 #ifdef SUPPORT_DEPRECATED_IFRSUPPORTLIB_API
28 IN CHAR16
*FormSetTitle
,
32 IN OUT VOID
**FormBuffer
,
33 IN OUT VOID
**StringBuffer
43 FormSetTitle - Title of formset
45 Guid - Guid of formset
47 Class - Class of formset
49 SubClass - Sub class of formset
51 FormBuffer - Pointer of the formset created
53 StringBuffer - Pointer of FormSetTitile string created
57 EFI_OUT_OF_RESOURCES - No enough buffer to allocate
59 EFI_SUCCESS - Formset successfully created
64 EFI_HII_IFR_PACK IfrPack
;
65 EFI_IFR_FORM_SET FormSet
;
66 EFI_IFR_END_FORM_SET EndFormSet
;
68 CHAR16 CurrentLanguage
[4];
69 STRING_REF StringToken
;
72 // Pre-allocate a buffer sufficient for us to work from.
74 FormBuffer
= EfiLibAllocateZeroPool (DEFAULT_FORM_BUFFER_SIZE
);
75 if (FormBuffer
== NULL
) {
76 return EFI_OUT_OF_RESOURCES
;
80 // Pre-allocate a buffer sufficient for us to work from.
82 StringBuffer
= EfiLibAllocateZeroPool (DEFAULT_STRING_BUFFER_SIZE
);
83 if (StringBuffer
== NULL
) {
84 gBS
->FreePool (FormBuffer
);
85 return EFI_OUT_OF_RESOURCES
;
89 // Obtain current language value
91 GetCurrentLanguage (CurrentLanguage
);
94 // Add the FormSetTitle to the string buffer and get the StringToken
96 Status
= AddString (*StringBuffer
, CurrentLanguage
, FormSetTitle
, &StringToken
);
98 if (EFI_ERROR (Status
)) {
103 // Initialize the Ifr Package header data
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
;
109 // Initialize FormSet with the appropriate information
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
));
119 // Initialize the end formset data
121 EndFormSet
.Header
.Length
= sizeof (EFI_IFR_END_FORM_SET
);
122 EndFormSet
.Header
.OpCode
= EFI_IFR_END_FORM_SET_OP
;
124 Destination
= (CHAR8
*) *FormBuffer
;
127 // Copy the formset/endformset data to the form buffer
129 EfiCopyMem (Destination
, &IfrPack
, sizeof (EFI_HII_PACK_HEADER
));
131 Destination
= Destination
+ sizeof (EFI_HII_PACK_HEADER
);
133 EfiCopyMem (Destination
, &FormSet
, sizeof (EFI_IFR_FORM_SET
));
135 Destination
= Destination
+ sizeof (EFI_IFR_FORM_SET
);
137 EfiCopyMem (Destination
, &EndFormSet
, sizeof (EFI_IFR_END_FORM_SET
));
144 IN CHAR16
*FormTitle
,
146 IN OUT VOID
*FormBuffer
,
147 IN OUT VOID
*StringBuffer
157 FormTitle - Title of the form
159 FormId - Id of the form
161 FormBuffer - Pointer of the form created
163 StringBuffer - Pointer of FormTitil string created
167 EFI_SUCCESS - Form successfully created
173 EFI_IFR_END_FORM EndForm
;
174 CHAR16 CurrentLanguage
[4];
175 STRING_REF StringToken
;
178 // Obtain current language value
180 GetCurrentLanguage (CurrentLanguage
);
182 Status
= AddString (StringBuffer
, CurrentLanguage
, FormTitle
, &StringToken
);
184 if (EFI_ERROR (Status
)) {
188 Form
.Header
.OpCode
= EFI_IFR_FORM_OP
;
189 Form
.Header
.Length
= sizeof (EFI_IFR_FORM
);
190 Form
.FormId
= FormId
;
191 Form
.FormTitle
= StringToken
;
193 Status
= AddOpCode (FormBuffer
, &Form
);
195 if (EFI_ERROR (Status
)) {
199 EndForm
.Header
.OpCode
= EFI_IFR_END_FORM_OP
;
200 EndForm
.Header
.Length
= sizeof (EFI_IFR_END_FORM
);
202 Status
= AddOpCode (FormBuffer
, &EndForm
);
204 if (EFI_ERROR (Status
)) {
215 IN OUT VOID
*FormBuffer
,
216 IN OUT VOID
*StringBuffer
226 SubTitle - Sub title to be created
228 FormBuffer - Where this subtitle to add to
230 StringBuffer - String buffer created for subtitle
234 EFI_SUCCESS - Subtitle successfully created
239 EFI_IFR_SUBTITLE Subtitle
;
240 CHAR16 CurrentLanguage
[4];
241 STRING_REF StringToken
;
244 // Obtain current language value
246 GetCurrentLanguage (CurrentLanguage
);
248 Status
= AddString (StringBuffer
, CurrentLanguage
, SubTitle
, &StringToken
);
250 if (EFI_ERROR (Status
)) {
254 Subtitle
.Header
.OpCode
= EFI_IFR_SUBTITLE_OP
;
255 Subtitle
.Header
.Length
= sizeof (EFI_IFR_SUBTITLE
);
256 Subtitle
.SubTitle
= StringToken
;
258 Status
= AddOpCode (FormBuffer
, &Subtitle
);
260 if (EFI_ERROR (Status
)) {
275 IN OUT VOID
*FormBuffer
,
276 IN OUT VOID
*StringBuffer
282 Create a line of text
286 String - First string of the text
288 String2 - Second string of the text
290 String3 - Help string of the text
292 Flags - Flag of the text
294 Key - Key of the text
296 FormBuffer - The form where this text adds to
298 StringBuffer - String buffer created for String, String2 and String3
302 EFI_SUCCESS - Text successfully created
308 CHAR16 CurrentLanguage
[4];
309 STRING_REF StringToken
;
312 // Obtain current language value
314 GetCurrentLanguage (CurrentLanguage
);
317 // Add first string, get first string's token
319 Status
= AddString (StringBuffer
, CurrentLanguage
, String
, &StringToken
);
321 if (EFI_ERROR (Status
)) {
325 Text
.Header
.OpCode
= EFI_IFR_TEXT_OP
;
326 Text
.Header
.Length
= sizeof (EFI_IFR_TEXT
);
327 Text
.Text
= StringToken
;
330 // Add second string, get first string's token
332 Status
= AddString (StringBuffer
, CurrentLanguage
, String2
, &StringToken
);
334 if (EFI_ERROR (Status
)) {
338 Text
.TextTwo
= StringToken
;
340 Text
.Flags
= (UINT8
) (Flags
| EFI_IFR_FLAG_CREATED
);
344 // Add second string, get first string's token
346 Status
= AddString (StringBuffer
, CurrentLanguage
, String3
, &StringToken
);
348 if (EFI_ERROR (Status
)) {
352 Text
.Help
= StringToken
;
354 Status
= AddOpCode (FormBuffer
, &Text
);
356 if (EFI_ERROR (Status
)) {
368 IN OUT VOID
*FormBuffer
,
369 IN OUT VOID
*StringBuffer
379 FormId - Form ID of the hyperlink
381 Prompt - Prompt of the hyperlink
383 FormBuffer - The form where this hyperlink adds to
385 StringBuffer - String buffer created for Prompt
389 EFI_SUCCESS - Hyperlink successfully created
394 EFI_IFR_REF Hyperlink
;
395 CHAR16 CurrentLanguage
[4];
396 STRING_REF StringToken
;
399 // Obtain current language value
401 GetCurrentLanguage (CurrentLanguage
);
403 Status
= AddString (StringBuffer
, CurrentLanguage
, Prompt
, &StringToken
);
405 if (EFI_ERROR (Status
)) {
409 Hyperlink
.Header
.OpCode
= EFI_IFR_REF_OP
;
410 Hyperlink
.Header
.Length
= sizeof (EFI_IFR_REF
);
411 Hyperlink
.FormId
= FormId
;
412 Hyperlink
.Prompt
= StringToken
;
414 Status
= AddOpCode (FormBuffer
, &Hyperlink
);
416 if (EFI_ERROR (Status
)) {
426 IN UINT16 QuestionId
,
430 IN IFR_OPTION
*OptionsList
,
431 IN UINTN OptionCount
,
432 IN OUT VOID
*FormBuffer
,
433 IN OUT VOID
*StringBuffer
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.
444 QuestionId - Question ID of the one-of box
446 DataWidth - DataWidth of the one-of box
448 Prompt - Prompt of the one-of box
450 Help - Help of the one-of box
452 OptionsList - Each string in it is an option of the one-of box
454 OptionCount - Option string count
456 FormBuffer - The form where this one-of box adds to
458 StringBuffer - String buffer created for Prompt, Help and Option strings
462 EFI_DEVICE_ERROR - DataWidth > 2
464 EFI_SUCCESS - One-Of box successfully created.
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
;
477 // We do not create op-code storage widths for one-of in excess of 16 bits for now
480 return EFI_DEVICE_ERROR
;
484 // Obtain current language value
486 GetCurrentLanguage (CurrentLanguage
);
489 // Add first string, get first string's token
491 Status
= AddString (StringBuffer
, CurrentLanguage
, Prompt
, &StringToken
);
493 if (EFI_ERROR (Status
)) {
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
;
504 // Add second string, get first string's token
506 Status
= AddString (StringBuffer
, CurrentLanguage
, Help
, &StringToken
);
508 if (EFI_ERROR (Status
)) {
512 OneOf
.Help
= StringToken
;
514 Status
= AddOpCode (FormBuffer
, &OneOf
);
516 if (EFI_ERROR (Status
)) {
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
);
525 // Add string and get token back
527 Status
= AddString (StringBuffer
, CurrentLanguage
, OptionsList
[Index
].OptionString
, &StringToken
);
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
;
534 Status
= AddOpCode (FormBuffer
, &OneOfOption
);
536 if (EFI_ERROR (Status
)) {
541 EndOneOf
.Header
.Length
= sizeof (EFI_IFR_END_ONE_OF
);
542 EndOneOf
.Header
.OpCode
= EFI_IFR_END_ONE_OF_OP
;
544 Status
= AddOpCode (FormBuffer
, &EndOneOf
);
546 if (EFI_ERROR (Status
)) {
555 IN UINT16 QuestionId
,
559 IN IFR_OPTION
*OptionsList
,
560 IN UINTN OptionCount
,
561 IN OUT VOID
*FormBuffer
,
562 IN OUT VOID
*StringBuffer
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.
573 QuestionId - Question ID of the ordered list
575 MaxEntries - MaxEntries of the ordered list
577 Prompt - Prompt of the ordered list
579 Help - Help of the ordered list
581 OptionsList - Each string in it is an option of the ordered list
583 OptionCount - Option string count
585 FormBuffer - The form where this ordered list adds to
587 StringBuffer - String buffer created for Prompt, Help and Option strings
591 EFI_SUCCESS - Ordered list successfully created.
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
;
604 // Obtain current language value
606 GetCurrentLanguage (CurrentLanguage
);
609 // Add first string, get first string's token
611 Status
= AddString (StringBuffer
, CurrentLanguage
, Prompt
, &StringToken
);
613 if (EFI_ERROR (Status
)) {
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
;
624 // Add second string, get first string's token
626 Status
= AddString (StringBuffer
, CurrentLanguage
, Help
, &StringToken
);
628 if (EFI_ERROR (Status
)) {
632 OrderedList
.Help
= StringToken
;
634 Status
= AddOpCode (FormBuffer
, &OrderedList
);
636 if (EFI_ERROR (Status
)) {
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
);
645 // Add string and get token back
647 Status
= AddString (StringBuffer
, CurrentLanguage
, OptionsList
[Index
].OptionString
, &StringToken
);
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
;
654 Status
= AddOpCode (FormBuffer
, &OrderedListOption
);
656 if (EFI_ERROR (Status
)) {
661 EndOrderedList
.Header
.Length
= sizeof (EFI_IFR_END_ONE_OF
);
662 EndOrderedList
.Header
.OpCode
= EFI_IFR_END_ONE_OF_OP
;
664 Status
= AddOpCode (FormBuffer
, &EndOrderedList
);
666 if (EFI_ERROR (Status
)) {
676 IN UINT16 QuestionId
,
681 IN OUT VOID
*FormBuffer
,
682 IN OUT VOID
*StringBuffer
692 QuestionId - Question ID of the check box
694 DataWidth - DataWidth of the check box
696 Prompt - Prompt of the check box
698 Help - Help of the check box
700 Flags - Flags of the check box
702 FormBuffer - The form where this check box adds to
704 StringBuffer - String buffer created for Prompt and Help.
708 EFI_DEVICE_ERROR - DataWidth > 1
710 EFI_SUCCESS - Check box successfully created
715 EFI_IFR_CHECK_BOX CheckBox
;
716 CHAR16 CurrentLanguage
[4];
717 STRING_REF StringToken
;
720 // We do not create op-code storage widths for checkbox in excess of 8 bits for now
723 return EFI_DEVICE_ERROR
;
727 // Obtain current language value
729 GetCurrentLanguage (CurrentLanguage
);
732 // Add first string, get first string's token
734 Status
= AddString (StringBuffer
, CurrentLanguage
, Prompt
, &StringToken
);
736 if (EFI_ERROR (Status
)) {
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
;
747 // Add second string, get first string's token
749 Status
= AddString (StringBuffer
, CurrentLanguage
, Help
, &StringToken
);
751 if (EFI_ERROR (Status
)) {
755 CheckBox
.Help
= StringToken
;
756 CheckBox
.Flags
= (UINT8
) (Flags
| EFI_IFR_FLAG_CREATED
);
758 Status
= AddOpCode (FormBuffer
, &CheckBox
);
760 if (EFI_ERROR (Status
)) {
770 IN UINT16 QuestionId
,
780 IN OUT VOID
*FormBuffer
,
781 IN OUT VOID
*StringBuffer
791 QuestionId - Question ID of the numeric
793 DataWidth - DataWidth of the numeric
795 Prompt - Prompt of the numeric
797 Help - Help of the numeric
799 Minimum - Minumun boundary of the numeric
801 Maximum - Maximum boundary of the numeric
803 Step - Step of the numeric
805 Default - Default value
807 Flags - Flags of the numeric
809 Key - Key of the numeric
811 FormBuffer - The form where this numeric adds to
813 StringBuffer - String buffer created for Prompt and Help.
817 EFI_DEVICE_ERROR - DataWidth > 2
819 EFI_SUCCESS - Numeric is successfully created
824 EFI_IFR_NUMERIC Numeric
;
825 CHAR16 CurrentLanguage
[4];
826 STRING_REF StringToken
;
829 // We do not create op-code storage widths for numerics in excess of 16 bits for now
832 return EFI_DEVICE_ERROR
;
836 // Obtain current language value
838 GetCurrentLanguage (CurrentLanguage
);
841 // Add first string, get first string's token
843 Status
= AddString (StringBuffer
, CurrentLanguage
, Prompt
, &StringToken
);
845 if (EFI_ERROR (Status
)) {
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
;
856 // Add second string, get first string's token
858 Status
= AddString (StringBuffer
, CurrentLanguage
, Help
, &StringToken
);
860 if (EFI_ERROR (Status
)) {
864 Numeric
.Help
= StringToken
;
865 Numeric
.Minimum
= Minimum
;
866 Numeric
.Maximum
= Maximum
;
868 Numeric
.Default
= Default
;
869 Numeric
.Flags
= (UINT8
) (Flags
| EFI_IFR_FLAG_CREATED
);
872 Status
= AddOpCode (FormBuffer
, &Numeric
);
874 if (EFI_ERROR (Status
)) {
884 IN UINT16 QuestionId
,
892 IN OUT VOID
*FormBuffer
,
893 IN OUT VOID
*StringBuffer
903 QuestionId - Question ID of the string
905 DataWidth - DataWidth of the string
907 Prompt - Prompt of the string
909 Help - Help of the string
911 MinSize - Min size boundary of the string
913 MaxSize - Max size boundary of the string
915 Flags - Flags of the string
917 Key - Key of the string
919 FormBuffer - The form where this string adds to
921 StringBuffer - String buffer created for Prompt and Help.
925 EFI_SUCCESS - String successfully created.
930 EFI_IFR_STRING String
;
931 CHAR16 CurrentLanguage
[4];
932 STRING_REF StringToken
;
935 // Obtain current language value
937 GetCurrentLanguage (CurrentLanguage
);
940 // Add first string, get first string's token
942 Status
= AddString (StringBuffer
, CurrentLanguage
, Prompt
, &StringToken
);
944 if (EFI_ERROR (Status
)) {
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
;
955 // Add second string, get first string's token
957 Status
= AddString (StringBuffer
, CurrentLanguage
, Help
, &StringToken
);
959 if (EFI_ERROR (Status
)) {
963 String
.Help
= StringToken
;
964 String
.MinSize
= MinSize
;
965 String
.MaxSize
= MaxSize
;
966 String
.Flags
= (UINT8
) (Flags
| EFI_IFR_FLAG_CREATED
);
969 Status
= AddOpCode (FormBuffer
, &String
);
971 if (EFI_ERROR (Status
)) {