2 Copyright (c) 2006, 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
23 // Include common header file for this module.
25 #include "IfrSupportLibInternal.h"
29 IN CHAR16
*FormSetTitle
,
33 IN OUT VOID
**FormBuffer
,
34 IN OUT VOID
**StringBuffer
44 FormSetTitle - Title of formset
46 Guid - Guid of formset
48 Class - Class of formset
50 SubClass - Sub class of formset
52 FormBuffer - Pointer of the formset created
54 StringBuffer - Pointer of FormSetTitile string created
58 EFI_OUT_OF_RESOURCES - No enough buffer to allocate
60 EFI_SUCCESS - Formset successfully created
65 EFI_HII_IFR_PACK IfrPack
;
66 EFI_IFR_FORM_SET FormSet
;
67 EFI_IFR_END_FORM_SET EndFormSet
;
69 CHAR16 CurrentLanguage
[4];
70 STRING_REF StringToken
;
73 // Pre-allocate a buffer sufficient for us to work from.
75 FormBuffer
= AllocateZeroPool (DEFAULT_FORM_BUFFER_SIZE
);
76 if (FormBuffer
== NULL
) {
77 return EFI_OUT_OF_RESOURCES
;
81 // Pre-allocate a buffer sufficient for us to work from.
83 StringBuffer
= AllocateZeroPool (DEFAULT_STRING_BUFFER_SIZE
);
84 if (StringBuffer
== NULL
) {
85 gBS
->FreePool (FormBuffer
);
86 return EFI_OUT_OF_RESOURCES
;
90 // Obtain current language value
92 GetCurrentLanguage (CurrentLanguage
);
95 // Add the FormSetTitle to the string buffer and get the StringToken
97 Status
= AddString (*StringBuffer
, CurrentLanguage
, FormSetTitle
, &StringToken
);
99 if (EFI_ERROR (Status
)) {
104 // Initialize the Ifr Package header data
106 IfrPack
.Header
.Length
= sizeof (EFI_HII_PACK_HEADER
) + sizeof (EFI_IFR_FORM_SET
) + sizeof (EFI_IFR_END_FORM_SET
);
107 IfrPack
.Header
.Type
= EFI_HII_IFR
;
110 // Initialize FormSet with the appropriate information
112 FormSet
.Header
.OpCode
= EFI_IFR_FORM_SET_OP
;
113 FormSet
.Header
.Length
= sizeof (EFI_IFR_FORM_SET
);
114 FormSet
.FormSetTitle
= StringToken
;
115 FormSet
.Class
= Class
;
116 FormSet
.SubClass
= SubClass
;
117 CopyMem (&FormSet
.Guid
, Guid
, sizeof (EFI_GUID
));
120 // Initialize the end formset data
122 EndFormSet
.Header
.Length
= sizeof (EFI_IFR_END_FORM_SET
);
123 EndFormSet
.Header
.OpCode
= EFI_IFR_END_FORM_SET_OP
;
125 Destination
= (UINT8
*) *FormBuffer
;
128 // Copy the formset/endformset data to the form buffer
130 CopyMem (Destination
, &IfrPack
, sizeof (EFI_HII_PACK_HEADER
));
132 Destination
= Destination
+ sizeof (EFI_HII_PACK_HEADER
);
134 CopyMem (Destination
, &FormSet
, sizeof (EFI_IFR_FORM_SET
));
136 Destination
= Destination
+ sizeof (EFI_IFR_FORM_SET
);
138 CopyMem (Destination
, &EndFormSet
, sizeof (EFI_IFR_END_FORM_SET
));
145 IN CHAR16
*FormTitle
,
147 IN OUT VOID
*FormBuffer
,
148 IN OUT VOID
*StringBuffer
158 FormTitle - Title of the form
160 FormId - Id of the form
162 FormBuffer - Pointer of the form created
164 StringBuffer - Pointer of FormTitil string created
168 EFI_SUCCESS - Form successfully created
174 EFI_IFR_END_FORM EndForm
;
175 CHAR16 CurrentLanguage
[4];
176 STRING_REF StringToken
;
179 // Obtain current language value
181 GetCurrentLanguage (CurrentLanguage
);
183 Status
= AddString (StringBuffer
, CurrentLanguage
, FormTitle
, &StringToken
);
185 if (EFI_ERROR (Status
)) {
189 Form
.Header
.OpCode
= EFI_IFR_FORM_OP
;
190 Form
.Header
.Length
= sizeof (EFI_IFR_FORM
);
191 Form
.FormId
= FormId
;
192 Form
.FormTitle
= StringToken
;
194 Status
= AddOpCode (FormBuffer
, &Form
);
196 if (EFI_ERROR (Status
)) {
200 EndForm
.Header
.OpCode
= EFI_IFR_END_FORM_OP
;
201 EndForm
.Header
.Length
= sizeof (EFI_IFR_END_FORM
);
203 Status
= AddOpCode (FormBuffer
, &EndForm
);
205 if (EFI_ERROR (Status
)) {
216 IN OUT VOID
*FormBuffer
,
217 IN OUT VOID
*StringBuffer
227 SubTitle - Sub title to be created
229 FormBuffer - Where this subtitle to add to
231 StringBuffer - String buffer created for subtitle
235 EFI_SUCCESS - Subtitle successfully created
240 EFI_IFR_SUBTITLE Subtitle
;
241 CHAR16 CurrentLanguage
[4];
242 STRING_REF StringToken
;
245 // Obtain current language value
247 GetCurrentLanguage (CurrentLanguage
);
249 Status
= AddString (StringBuffer
, CurrentLanguage
, SubTitle
, &StringToken
);
251 if (EFI_ERROR (Status
)) {
255 Subtitle
.Header
.OpCode
= EFI_IFR_SUBTITLE_OP
;
256 Subtitle
.Header
.Length
= sizeof (EFI_IFR_SUBTITLE
);
257 Subtitle
.SubTitle
= StringToken
;
259 Status
= AddOpCode (FormBuffer
, &Subtitle
);
261 if (EFI_ERROR (Status
)) {
276 IN OUT VOID
*FormBuffer
,
277 IN OUT VOID
*StringBuffer
283 Create a line of text
287 String - First string of the text
289 String2 - Second string of the text
291 String3 - Help string of the text
293 Flags - Flag of the text
295 Key - Key of the text
297 FormBuffer - The form where this text adds to
299 StringBuffer - String buffer created for String, String2 and String3
303 EFI_SUCCESS - Text successfully created
309 CHAR16 CurrentLanguage
[4];
310 STRING_REF StringToken
;
313 // Obtain current language value
315 GetCurrentLanguage (CurrentLanguage
);
318 // Add first string, get first string's token
320 Status
= AddString (StringBuffer
, CurrentLanguage
, String
, &StringToken
);
322 if (EFI_ERROR (Status
)) {
326 Text
.Header
.OpCode
= EFI_IFR_TEXT_OP
;
327 Text
.Header
.Length
= sizeof (EFI_IFR_TEXT
);
328 Text
.Text
= StringToken
;
331 // Add second string, get first string's token
333 Status
= AddString (StringBuffer
, CurrentLanguage
, String2
, &StringToken
);
335 if (EFI_ERROR (Status
)) {
339 Text
.TextTwo
= StringToken
;
341 Text
.Flags
= (UINT8
) (Flags
| EFI_IFR_FLAG_CREATED
);
345 // Add second string, get first string's token
347 Status
= AddString (StringBuffer
, CurrentLanguage
, String3
, &StringToken
);
349 if (EFI_ERROR (Status
)) {
353 Text
.Help
= StringToken
;
355 Status
= AddOpCode (FormBuffer
, &Text
);
357 if (EFI_ERROR (Status
)) {
369 IN OUT VOID
*FormBuffer
,
370 IN OUT VOID
*StringBuffer
380 FormId - Form ID of the hyperlink
382 Prompt - Prompt of the hyperlink
384 FormBuffer - The form where this hyperlink adds to
386 StringBuffer - String buffer created for Prompt
390 EFI_SUCCESS - Hyperlink successfully created
395 EFI_IFR_REF Hyperlink
;
396 CHAR16 CurrentLanguage
[4];
397 STRING_REF StringToken
;
400 // Obtain current language value
402 GetCurrentLanguage (CurrentLanguage
);
404 Status
= AddString (StringBuffer
, CurrentLanguage
, Prompt
, &StringToken
);
406 if (EFI_ERROR (Status
)) {
410 Hyperlink
.Header
.OpCode
= EFI_IFR_REF_OP
;
411 Hyperlink
.Header
.Length
= sizeof (EFI_IFR_REF
);
412 Hyperlink
.FormId
= FormId
;
413 Hyperlink
.Prompt
= StringToken
;
415 Status
= AddOpCode (FormBuffer
, &Hyperlink
);
417 if (EFI_ERROR (Status
)) {
427 IN UINT16 QuestionId
,
431 IN IFR_OPTION
*OptionsList
,
432 IN UINTN OptionCount
,
433 IN OUT VOID
*FormBuffer
,
434 IN OUT VOID
*StringBuffer
440 Create a one-of question with a set of options to choose from. The
441 OptionsList is a pointer to a null-terminated list of option descriptions.
445 QuestionId - Question ID of the one-of box
447 DataWidth - DataWidth of the one-of box
449 Prompt - Prompt of the one-of box
451 Help - Help of the one-of box
453 OptionsList - Each string in it is an option of the one-of box
455 OptionCount - Option string count
457 FormBuffer - The form where this one-of box adds to
459 StringBuffer - String buffer created for Prompt, Help and Option strings
463 EFI_DEVICE_ERROR - DataWidth > 2
465 EFI_SUCCESS - One-Of box successfully created.
471 EFI_IFR_ONE_OF OneOf
;
472 EFI_IFR_ONE_OF_OPTION OneOfOption
;
473 EFI_IFR_END_ONE_OF EndOneOf
;
474 CHAR16 CurrentLanguage
[4];
475 STRING_REF StringToken
;
478 // We do not create op-code storage widths for one-of in excess of 16 bits for now
481 return EFI_DEVICE_ERROR
;
485 // Obtain current language value
487 GetCurrentLanguage (CurrentLanguage
);
490 // Add first string, get first string's token
492 Status
= AddString (StringBuffer
, CurrentLanguage
, Prompt
, &StringToken
);
494 if (EFI_ERROR (Status
)) {
498 OneOf
.Header
.OpCode
= EFI_IFR_ONE_OF_OP
;
499 OneOf
.Header
.Length
= sizeof (EFI_IFR_ONE_OF
);
500 OneOf
.QuestionId
= QuestionId
;
501 OneOf
.Width
= DataWidth
;
502 OneOf
.Prompt
= StringToken
;
505 // Add second string, get first string's token
507 Status
= AddString (StringBuffer
, CurrentLanguage
, Help
, &StringToken
);
509 if (EFI_ERROR (Status
)) {
513 OneOf
.Help
= StringToken
;
515 Status
= AddOpCode (FormBuffer
, &OneOf
);
517 if (EFI_ERROR (Status
)) {
521 for (Index
= 0; Index
< OptionCount
; Index
++) {
522 OneOfOption
.Header
.OpCode
= EFI_IFR_ONE_OF_OPTION_OP
;
523 OneOfOption
.Header
.Length
= sizeof (EFI_IFR_ONE_OF_OPTION
);
526 // Add string and get token back
528 Status
= AddString (StringBuffer
, CurrentLanguage
, OptionsList
[Index
].OptionString
, &StringToken
);
530 OneOfOption
.Option
= StringToken
;
531 OneOfOption
.Value
= OptionsList
[Index
].Value
;
532 OneOfOption
.Flags
= (UINT8
) (OptionsList
[Index
].Flags
| EFI_IFR_FLAG_CREATED
);
533 OneOfOption
.Key
= OptionsList
[Index
].Key
;
535 Status
= AddOpCode (FormBuffer
, &OneOfOption
);
537 if (EFI_ERROR (Status
)) {
542 EndOneOf
.Header
.Length
= sizeof (EFI_IFR_END_ONE_OF
);
543 EndOneOf
.Header
.OpCode
= EFI_IFR_END_ONE_OF_OP
;
545 Status
= AddOpCode (FormBuffer
, &EndOneOf
);
547 if (EFI_ERROR (Status
)) {
556 IN UINT16 QuestionId
,
560 IN IFR_OPTION
*OptionsList
,
561 IN UINTN OptionCount
,
562 IN OUT VOID
*FormBuffer
,
563 IN OUT VOID
*StringBuffer
569 Create a one-of question with a set of options to choose from. The
570 OptionsList is a pointer to a null-terminated list of option descriptions.
574 QuestionId - Question ID of the ordered list
576 MaxEntries - MaxEntries of the ordered list
578 Prompt - Prompt of the ordered list
580 Help - Help of the ordered list
582 OptionsList - Each string in it is an option of the ordered list
584 OptionCount - Option string count
586 FormBuffer - The form where this ordered list adds to
588 StringBuffer - String buffer created for Prompt, Help and Option strings
592 EFI_SUCCESS - Ordered list successfully created.
598 EFI_IFR_ORDERED_LIST OrderedList
;
599 EFI_IFR_ONE_OF_OPTION OrderedListOption
;
600 EFI_IFR_END_ONE_OF EndOrderedList
;
601 CHAR16 CurrentLanguage
[4];
602 STRING_REF StringToken
;
605 // Obtain current language value
607 GetCurrentLanguage (CurrentLanguage
);
610 // Add first string, get first string's token
612 Status
= AddString (StringBuffer
, CurrentLanguage
, Prompt
, &StringToken
);
614 if (EFI_ERROR (Status
)) {
618 OrderedList
.Header
.OpCode
= EFI_IFR_ORDERED_LIST_OP
;
619 OrderedList
.Header
.Length
= sizeof (EFI_IFR_ORDERED_LIST
);
620 OrderedList
.QuestionId
= QuestionId
;
621 OrderedList
.MaxEntries
= MaxEntries
;
622 OrderedList
.Prompt
= StringToken
;
625 // Add second string, get first string's token
627 Status
= AddString (StringBuffer
, CurrentLanguage
, Help
, &StringToken
);
629 if (EFI_ERROR (Status
)) {
633 OrderedList
.Help
= StringToken
;
635 Status
= AddOpCode (FormBuffer
, &OrderedList
);
637 if (EFI_ERROR (Status
)) {
641 for (Index
= 0; Index
< OptionCount
; Index
++) {
642 OrderedListOption
.Header
.OpCode
= EFI_IFR_ONE_OF_OPTION_OP
;
643 OrderedListOption
.Header
.Length
= sizeof (EFI_IFR_ONE_OF_OPTION
);
646 // Add string and get token back
648 Status
= AddString (StringBuffer
, CurrentLanguage
, OptionsList
[Index
].OptionString
, &StringToken
);
650 OrderedListOption
.Option
= StringToken
;
651 OrderedListOption
.Value
= OptionsList
[Index
].Value
;
652 OrderedListOption
.Flags
= (UINT8
) (OptionsList
[Index
].Flags
| EFI_IFR_FLAG_CREATED
);
653 OrderedListOption
.Key
= OptionsList
[Index
].Key
;
655 Status
= AddOpCode (FormBuffer
, &OrderedListOption
);
657 if (EFI_ERROR (Status
)) {
662 EndOrderedList
.Header
.Length
= sizeof (EFI_IFR_END_ONE_OF
);
663 EndOrderedList
.Header
.OpCode
= EFI_IFR_END_ONE_OF_OP
;
665 Status
= AddOpCode (FormBuffer
, &EndOrderedList
);
667 if (EFI_ERROR (Status
)) {
677 IN UINT16 QuestionId
,
682 IN OUT VOID
*FormBuffer
,
683 IN OUT VOID
*StringBuffer
693 QuestionId - Question ID of the check box
695 DataWidth - DataWidth of the check box
697 Prompt - Prompt of the check box
699 Help - Help of the check box
701 Flags - Flags of the check box
703 FormBuffer - The form where this check box adds to
705 StringBuffer - String buffer created for Prompt and Help.
709 EFI_DEVICE_ERROR - DataWidth > 1
711 EFI_SUCCESS - Check box successfully created
716 EFI_IFR_CHECKBOX CheckBox
;
717 CHAR16 CurrentLanguage
[4];
718 STRING_REF StringToken
;
721 // We do not create op-code storage widths for checkbox in excess of 8 bits for now
724 return EFI_DEVICE_ERROR
;
728 // Obtain current language value
730 GetCurrentLanguage (CurrentLanguage
);
733 // Add first string, get first string's token
735 Status
= AddString (StringBuffer
, CurrentLanguage
, Prompt
, &StringToken
);
737 if (EFI_ERROR (Status
)) {
741 CheckBox
.Header
.OpCode
= EFI_IFR_CHECKBOX_OP
;
742 CheckBox
.Header
.Length
= sizeof (EFI_IFR_CHECKBOX
);
743 CheckBox
.QuestionId
= QuestionId
;
744 CheckBox
.Width
= DataWidth
;
745 CheckBox
.Prompt
= StringToken
;
748 // Add second string, get first string's token
750 Status
= AddString (StringBuffer
, CurrentLanguage
, Help
, &StringToken
);
752 if (EFI_ERROR (Status
)) {
756 CheckBox
.Help
= StringToken
;
757 CheckBox
.Flags
= (UINT8
) (Flags
| EFI_IFR_FLAG_CREATED
);
759 Status
= AddOpCode (FormBuffer
, &CheckBox
);
761 if (EFI_ERROR (Status
)) {
771 IN UINT16 QuestionId
,
781 IN OUT VOID
*FormBuffer
,
782 IN OUT VOID
*StringBuffer
792 QuestionId - Question ID of the numeric
794 DataWidth - DataWidth of the numeric
796 Prompt - Prompt of the numeric
798 Help - Help of the numeric
800 Minimum - Minumun boundary of the numeric
802 Maximum - Maximum boundary of the numeric
804 Step - Step of the numeric
806 Default - Default value
808 Flags - Flags of the numeric
810 Key - Key of the numeric
812 FormBuffer - The form where this numeric adds to
814 StringBuffer - String buffer created for Prompt and Help.
818 EFI_DEVICE_ERROR - DataWidth > 2
820 EFI_SUCCESS - Numeric is successfully created
825 EFI_IFR_NUMERIC Numeric
;
826 CHAR16 CurrentLanguage
[4];
827 STRING_REF StringToken
;
830 // We do not create op-code storage widths for numerics in excess of 16 bits for now
833 return EFI_DEVICE_ERROR
;
837 // Obtain current language value
839 GetCurrentLanguage (CurrentLanguage
);
842 // Add first string, get first string's token
844 Status
= AddString (StringBuffer
, CurrentLanguage
, Prompt
, &StringToken
);
846 if (EFI_ERROR (Status
)) {
850 Numeric
.Header
.OpCode
= EFI_IFR_NUMERIC_OP
;
851 Numeric
.Header
.Length
= sizeof (EFI_IFR_NUMERIC
);
852 Numeric
.QuestionId
= QuestionId
;
853 Numeric
.Width
= DataWidth
;
854 Numeric
.Prompt
= StringToken
;
857 // Add second string, get first string's token
859 Status
= AddString (StringBuffer
, CurrentLanguage
, Help
, &StringToken
);
861 if (EFI_ERROR (Status
)) {
865 Numeric
.Help
= StringToken
;
866 Numeric
.Minimum
= Minimum
;
867 Numeric
.Maximum
= Maximum
;
869 Numeric
.Default
= Default
;
870 Numeric
.Flags
= (UINT8
) (Flags
| EFI_IFR_FLAG_CREATED
);
873 Status
= AddOpCode (FormBuffer
, &Numeric
);
875 if (EFI_ERROR (Status
)) {
885 IN UINT16 QuestionId
,
893 IN OUT VOID
*FormBuffer
,
894 IN OUT VOID
*StringBuffer
904 QuestionId - Question ID of the string
906 DataWidth - DataWidth of the string
908 Prompt - Prompt of the string
910 Help - Help of the string
912 MinSize - Min size boundary of the string
914 MaxSize - Max size boundary of the string
916 Flags - Flags of the string
918 Key - Key of the string
920 FormBuffer - The form where this string adds to
922 StringBuffer - String buffer created for Prompt and Help.
926 EFI_SUCCESS - String successfully created.
931 EFI_IFR_STRING String
;
932 CHAR16 CurrentLanguage
[4];
933 STRING_REF StringToken
;
936 // Obtain current language value
938 GetCurrentLanguage (CurrentLanguage
);
941 // Add first string, get first string's token
943 Status
= AddString (StringBuffer
, CurrentLanguage
, Prompt
, &StringToken
);
945 if (EFI_ERROR (Status
)) {
949 String
.Header
.OpCode
= EFI_IFR_STRING_OP
;
950 String
.Header
.Length
= sizeof (EFI_IFR_STRING
);
951 String
.QuestionId
= QuestionId
;
952 String
.Width
= DataWidth
;
953 String
.Prompt
= StringToken
;
956 // Add second string, get first string's token
958 Status
= AddString (StringBuffer
, CurrentLanguage
, Help
, &StringToken
);
960 if (EFI_ERROR (Status
)) {
964 String
.Help
= StringToken
;
965 String
.MinSize
= MinSize
;
966 String
.MaxSize
= MaxSize
;
967 String
.Flags
= (UINT8
) (Flags
| EFI_IFR_FLAG_CREATED
);
970 Status
= AddOpCode (FormBuffer
, &String
);
972 if (EFI_ERROR (Status
)) {