2 Library Routines to create IFR on-the-fly
4 Copyright (c) 2006, Intel Corporation
5 All rights reserved. This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
15 #include "IfrSupportLibInternal.h"
20 The form package is a collection of forms that are intended to describe the pages that will be
21 displayed to the user.
23 @param FormSetTitle Title of formset
24 @param Guid Guid of formset
25 @param Class Class of formset
26 @param SubClass Sub class of formset
27 @param FormBuffer Pointer of the formset created
28 @param StringBuffer Pointer of FormSetTitile string created
30 @retval EFI_OUT_OF_RESOURCES No enough buffer to allocate
31 @retval EFI_SUCCESS Formset successfully created
36 IN CHAR16
*FormSetTitle
,
40 IN OUT VOID
**FormBuffer
,
41 IN OUT VOID
**StringBuffer
45 EFI_HII_IFR_PACK IfrPack
;
46 FRAMEWORK_EFI_IFR_FORM_SET FormSet
;
47 FRAMEWORK_EFI_IFR_END_FORM_SET EndFormSet
;
49 CHAR16 CurrentLanguage
[4];
50 STRING_REF StringToken
;
53 // Pre-allocate a buffer sufficient for us to work from.
55 FormBuffer
= AllocateZeroPool (DEFAULT_FORM_BUFFER_SIZE
);
56 if (FormBuffer
== NULL
) {
57 return EFI_OUT_OF_RESOURCES
;
61 // Pre-allocate a buffer sufficient for us to work from.
63 StringBuffer
= AllocateZeroPool (DEFAULT_STRING_BUFFER_SIZE
);
64 if (StringBuffer
== NULL
) {
65 FreePool (FormBuffer
);
66 return EFI_OUT_OF_RESOURCES
;
70 // Add FormSetTitle to the StringBuffer, get FormSetTitle's token
72 GetCurrentLanguage (CurrentLanguage
);
73 Status
= AddString (*StringBuffer
, CurrentLanguage
, FormSetTitle
, &StringToken
);
74 if (EFI_ERROR (Status
)) {
75 FreePool (FormBuffer
);
76 FreePool (StringBuffer
);
81 // Initialize the Ifr Package header data
83 IfrPack
.Header
.Length
= sizeof (EFI_HII_PACK_HEADER
) + sizeof (FRAMEWORK_EFI_IFR_FORM_SET
) + sizeof (FRAMEWORK_EFI_IFR_END_FORM_SET
);
84 IfrPack
.Header
.Type
= EFI_HII_IFR
;
87 // Initialize FormSet with the appropriate information
89 FormSet
.Header
.OpCode
= FRAMEWORK_EFI_IFR_FORM_SET_OP
;
90 FormSet
.Header
.Length
= sizeof (FRAMEWORK_EFI_IFR_FORM_SET
);
91 FormSet
.FormSetTitle
= StringToken
;
92 FormSet
.Class
= Class
;
93 FormSet
.SubClass
= SubClass
;
94 CopyGuid ((GUID
*)(VOID
*)&FormSet
.Guid
, Guid
);
97 // Initialize the end formset data
99 EndFormSet
.Header
.Length
= sizeof (FRAMEWORK_EFI_IFR_END_FORM_SET
);
100 EndFormSet
.Header
.OpCode
= FRAMEWORK_EFI_IFR_END_FORM_SET_OP
;
103 // Copy the formset/endformset data to the form buffer
105 Destination
= (UINT8
*) *FormBuffer
;
106 CopyMem (Destination
, &IfrPack
, sizeof (EFI_HII_PACK_HEADER
));
108 Destination
= Destination
+ sizeof (EFI_HII_PACK_HEADER
);
109 CopyMem (Destination
, &FormSet
, sizeof (FRAMEWORK_EFI_IFR_FORM_SET
));
111 Destination
= Destination
+ sizeof (FRAMEWORK_EFI_IFR_FORM_SET
);
112 CopyMem (Destination
, &EndFormSet
, sizeof (FRAMEWORK_EFI_IFR_END_FORM_SET
));
119 A form is the encapsulation of what amounts to a browser page. The header defines a FormId,
120 which is referenced by the form package, among others. It also defines a FormTitle, which is a
121 string to be used as the title for the form
123 @param FormTitle Title of the form
124 @param FormId Id of the form
125 @param FormBuffer Pointer of the form created
126 @param StringBuffer Pointer of FormTitil string created
128 @retval EFI_SUCCESS Form successfully created
133 IN CHAR16
*FormTitle
,
135 IN OUT VOID
*FormBuffer
,
136 IN OUT VOID
*StringBuffer
140 FRAMEWORK_EFI_IFR_FORM Form
;
141 FRAMEWORK_EFI_IFR_END_FORM EndForm
;
142 CHAR16 CurrentLanguage
[4];
143 STRING_REF StringToken
;
146 // Add FormTitle to the StringBuffer, get FormTitle's token
148 GetCurrentLanguage (CurrentLanguage
);
149 Status
= AddString (StringBuffer
, CurrentLanguage
, FormTitle
, &StringToken
);
150 if (EFI_ERROR (Status
)) {
154 Form
.Header
.OpCode
= FRAMEWORK_EFI_IFR_FORM_OP
;
155 Form
.Header
.Length
= sizeof (FRAMEWORK_EFI_IFR_FORM
);
156 Form
.FormId
= FormId
;
157 Form
.FormTitle
= StringToken
;
159 Status
= AddOpCode (FormBuffer
, &Form
);
160 if (EFI_ERROR (Status
)) {
164 EndForm
.Header
.OpCode
= FRAMEWORK_EFI_IFR_END_FORM_OP
;
165 EndForm
.Header
.Length
= sizeof (FRAMEWORK_EFI_IFR_END_FORM
);
167 Status
= AddOpCode (FormBuffer
, &EndForm
);
175 Subtitle strings are intended to be used by authors to separate sections of questions into semantic
178 @param SubTitle Sub title to be created
179 @param FormBuffer Where this subtitle to add to
180 @param StringBuffer String buffer created for subtitle
182 @retval EFI_SUCCESS Subtitle successfully created
188 IN OUT VOID
*FormBuffer
,
189 IN OUT VOID
*StringBuffer
193 FRAMEWORK_EFI_IFR_SUBTITLE Subtitle
;
194 CHAR16 CurrentLanguage
[4];
195 STRING_REF StringToken
;
198 // Add SubTitle to the StringBuffer, get SubTitle's token
200 GetCurrentLanguage (CurrentLanguage
);
201 Status
= AddString (StringBuffer
, CurrentLanguage
, SubTitle
, &StringToken
);
202 if (EFI_ERROR (Status
)) {
206 Subtitle
.Header
.OpCode
= FRAMEWORK_EFI_IFR_SUBTITLE_OP
;
207 Subtitle
.Header
.Length
= sizeof (FRAMEWORK_EFI_IFR_SUBTITLE
);
208 Subtitle
.SubTitle
= StringToken
;
210 Status
= AddOpCode (FormBuffer
, &Subtitle
);
216 Create a line of text.
217 Unlike HTML, text is simply another tag.
218 This tag type enables IFR to be more easily localized.
220 @param String First string of the text
221 @param String2 Second string of the text
222 @param String3 Help string of the text
223 @param Flags Flag of the text
224 @param Key Key of the text
225 @param FormBuffer The form where this text adds to
226 @param StringBuffer String buffer created for String, String2 and String3
228 @retval EFI_SUCCESS Text successfully created
238 IN OUT VOID
*FormBuffer
,
239 IN OUT VOID
*StringBuffer
243 FRAMEWORK_EFI_IFR_TEXT Text
;
244 CHAR16 CurrentLanguage
[4];
245 STRING_REF StringToken
;
248 // Add first string to the StringBuffer, get first string's token
250 GetCurrentLanguage (CurrentLanguage
);
251 Status
= AddString (StringBuffer
, CurrentLanguage
, String
, &StringToken
);
252 if (EFI_ERROR (Status
)) {
256 Text
.Header
.OpCode
= FRAMEWORK_EFI_IFR_TEXT_OP
;
257 Text
.Header
.Length
= sizeof (FRAMEWORK_EFI_IFR_TEXT
);
258 Text
.Text
= StringToken
;
261 // Add second string, get first string's token
263 Status
= AddString (StringBuffer
, CurrentLanguage
, String2
, &StringToken
);
264 if (EFI_ERROR (Status
)) {
268 Text
.TextTwo
= StringToken
;
269 Text
.Flags
= (UINT8
) (Flags
| FRAMEWORK_EFI_IFR_FLAG_CREATED
);
273 // Add second string, get first string's token
275 Status
= AddString (StringBuffer
, CurrentLanguage
, String3
, &StringToken
);
276 if (EFI_ERROR (Status
)) {
280 Text
.Help
= StringToken
;
282 Status
= AddOpCode (FormBuffer
, &Text
);
290 @param FormId Form ID of the hyperlink
291 @param Prompt Prompt of the hyperlink
292 @param FormBuffer The form where this hyperlink adds to
293 @param StringBuffer String buffer created for Prompt
295 @retval EFI_SUCCESS Hyperlink successfully created
302 IN OUT VOID
*FormBuffer
,
303 IN OUT VOID
*StringBuffer
307 FRAMEWORK_EFI_IFR_REF Hyperlink
;
308 CHAR16 CurrentLanguage
[4];
309 STRING_REF StringToken
;
312 // Add Prompt string to the StringBuffer, get Prompt string's token
314 GetCurrentLanguage (CurrentLanguage
);
315 Status
= AddString (StringBuffer
, CurrentLanguage
, Prompt
, &StringToken
);
316 if (EFI_ERROR (Status
)) {
320 Hyperlink
.Header
.OpCode
= FRAMEWORK_EFI_IFR_REF_OP
;
321 Hyperlink
.Header
.Length
= sizeof (FRAMEWORK_EFI_IFR_REF
);
322 Hyperlink
.FormId
= FormId
;
323 Hyperlink
.Prompt
= StringToken
;
325 Status
= AddOpCode (FormBuffer
, &Hyperlink
);
331 Create a one-of question with a set of options to choose from. The
332 OptionsList is a pointer to a null-terminated list of option descriptions.
334 @param QuestionId Question ID of the one-of box
335 @param DataWidth DataWidth of the one-of box
336 @param Prompt Prompt of the one-of box
337 @param Help Help of the one-of box
338 @param OptionsList Each string in it is an option of the one-of box
339 @param OptionCount Option string count
340 @param FormBuffer The form where this one-of box adds to
341 @param StringBuffer String buffer created for Prompt, Help and Option strings
343 @retval EFI_DEVICE_ERROR DataWidth > 2
344 @retval EFI_SUCCESS One-Of box successfully created.
349 IN UINT16 QuestionId
,
353 IN IFR_OPTION
*OptionsList
,
354 IN UINTN OptionCount
,
355 IN OUT VOID
*FormBuffer
,
356 IN OUT VOID
*StringBuffer
361 FRAMEWORK_EFI_IFR_ONE_OF OneOf
;
362 FRAMEWORK_EFI_IFR_ONE_OF_OPTION OneOfOption
;
363 FRAMEWORK_EFI_IFR_END_ONE_OF EndOneOf
;
364 CHAR16 CurrentLanguage
[4];
365 STRING_REF StringToken
;
368 // We do not create op-code storage widths for one-of in excess of 16 bits for now
371 return EFI_DEVICE_ERROR
;
375 // Add Prompt string to the StringBuffer, get Prompt string's token
377 GetCurrentLanguage (CurrentLanguage
);
378 Status
= AddString (StringBuffer
, CurrentLanguage
, Prompt
, &StringToken
);
379 if (EFI_ERROR (Status
)) {
383 OneOf
.Header
.OpCode
= FRAMEWORK_EFI_IFR_ONE_OF_OP
;
384 OneOf
.Header
.Length
= sizeof (FRAMEWORK_EFI_IFR_ONE_OF
);
385 OneOf
.QuestionId
= QuestionId
;
386 OneOf
.Width
= DataWidth
;
387 OneOf
.Prompt
= StringToken
;
390 // Add Help string to the StringBuffer, get Help string's token
392 Status
= AddString (StringBuffer
, CurrentLanguage
, Help
, &StringToken
);
393 if (EFI_ERROR (Status
)) {
397 OneOf
.Help
= StringToken
;
399 Status
= AddOpCode (FormBuffer
, &OneOf
);
400 if (EFI_ERROR (Status
)) {
404 for (Index
= 0; Index
< OptionCount
; Index
++) {
405 OneOfOption
.Header
.OpCode
= FRAMEWORK_EFI_IFR_ONE_OF_OPTION_OP
;
406 OneOfOption
.Header
.Length
= sizeof (FRAMEWORK_EFI_IFR_ONE_OF_OPTION
);
409 // Add OptionString string to the StringBuffer, get OptionString string's token
411 Status
= AddString (StringBuffer
, CurrentLanguage
, OptionsList
[Index
].OptionString
, &StringToken
);
413 OneOfOption
.Option
= StringToken
;
414 OneOfOption
.Value
= OptionsList
[Index
].Value
;
415 OneOfOption
.Flags
= (UINT8
) (OptionsList
[Index
].Flags
| FRAMEWORK_EFI_IFR_FLAG_CREATED
);
416 OneOfOption
.Key
= OptionsList
[Index
].Key
;
418 Status
= AddOpCode (FormBuffer
, &OneOfOption
);
419 if (EFI_ERROR (Status
)) {
424 EndOneOf
.Header
.Length
= sizeof (FRAMEWORK_EFI_IFR_END_ONE_OF
);
425 EndOneOf
.Header
.OpCode
= FRAMEWORK_EFI_IFR_END_ONE_OF_OP
;
427 Status
= AddOpCode (FormBuffer
, &EndOneOf
);
428 if (EFI_ERROR (Status
)) {
436 Create a one-of question with a set of options to choose from. The
437 OptionsList is a pointer to a null-terminated list of option descriptions.
439 @param QuestionId Question ID of the ordered list
440 @param MaxEntries MaxEntries of the ordered list
441 @param Prompt Prompt of the ordered list
442 @param Help Help of the ordered list
443 @param OptionsList Each string in it is an option of the ordered list
444 @param OptionCount Option string count
445 @param FormBuffer The form where this ordered list adds to
446 @param StringBuffer String buffer created for Prompt, Help and Option strings
448 @retval EFI_SUCCESS Ordered list successfully created.
453 IN UINT16 QuestionId
,
457 IN IFR_OPTION
*OptionsList
,
458 IN UINTN OptionCount
,
459 IN OUT VOID
*FormBuffer
,
460 IN OUT VOID
*StringBuffer
465 FRAMEWORK_EFI_IFR_ORDERED_LIST OrderedList
;
466 FRAMEWORK_EFI_IFR_ONE_OF_OPTION OrderedListOption
;
467 FRAMEWORK_EFI_IFR_END_ONE_OF EndOrderedList
;
468 CHAR16 CurrentLanguage
[4];
469 STRING_REF StringToken
;
472 // Add Prompt string to the StringBuffer, get Prompt string's token
474 GetCurrentLanguage (CurrentLanguage
);
475 Status
= AddString (StringBuffer
, CurrentLanguage
, Prompt
, &StringToken
);
476 if (EFI_ERROR (Status
)) {
480 OrderedList
.Header
.OpCode
= FRAMEWORK_EFI_IFR_ORDERED_LIST_OP
;
481 OrderedList
.Header
.Length
= sizeof (FRAMEWORK_EFI_IFR_ORDERED_LIST
);
482 OrderedList
.QuestionId
= QuestionId
;
483 OrderedList
.MaxEntries
= MaxEntries
;
484 OrderedList
.Prompt
= StringToken
;
487 // Add Help string to the StringBuffer, get Help string's token
489 Status
= AddString (StringBuffer
, CurrentLanguage
, Help
, &StringToken
);
490 if (EFI_ERROR (Status
)) {
494 OrderedList
.Help
= StringToken
;
496 Status
= AddOpCode (FormBuffer
, &OrderedList
);
497 if (EFI_ERROR (Status
)) {
501 for (Index
= 0; Index
< OptionCount
; Index
++) {
502 OrderedListOption
.Header
.OpCode
= FRAMEWORK_EFI_IFR_ONE_OF_OPTION_OP
;
503 OrderedListOption
.Header
.Length
= sizeof (FRAMEWORK_EFI_IFR_ONE_OF_OPTION
);
506 // Add OptionString string to the StringBuffer, get OptionString string's token
508 Status
= AddString (StringBuffer
, CurrentLanguage
, OptionsList
[Index
].OptionString
, &StringToken
);
510 OrderedListOption
.Option
= StringToken
;
511 OrderedListOption
.Value
= OptionsList
[Index
].Value
;
512 OrderedListOption
.Flags
= (UINT8
) (OptionsList
[Index
].Flags
| FRAMEWORK_EFI_IFR_FLAG_CREATED
);
513 OrderedListOption
.Key
= OptionsList
[Index
].Key
;
515 Status
= AddOpCode (FormBuffer
, &OrderedListOption
);
516 if (EFI_ERROR (Status
)) {
521 EndOrderedList
.Header
.Length
= sizeof (FRAMEWORK_EFI_IFR_END_ONE_OF
);
522 EndOrderedList
.Header
.OpCode
= FRAMEWORK_EFI_IFR_END_ONE_OF_OP
;
524 Status
= AddOpCode (FormBuffer
, &EndOrderedList
);
532 @param QuestionId Question ID of the check box
533 @param DataWidth DataWidth of the check box
534 @param Prompt Prompt of the check box
535 @param Help Help of the check box
536 @param Flags Flags of the check box
537 @param FormBuffer The form where this check box adds to
538 @param StringBuffer String buffer created for Prompt and Help.
540 @retval EFI_DEVICE_ERROR DataWidth > 1
541 @retval EFI_SUCCESS Check box successfully created
546 IN UINT16 QuestionId
,
551 IN OUT VOID
*FormBuffer
,
552 IN OUT VOID
*StringBuffer
556 FRAMEWORK_EFI_IFR_CHECKBOX CheckBox
;
557 CHAR16 CurrentLanguage
[4];
558 STRING_REF StringToken
;
561 // We do not create op-code storage widths for checkbox in excess of 8 bits for now
564 return EFI_DEVICE_ERROR
;
568 // Add Prompt string to the StringBuffer, get Prompt string's token
570 GetCurrentLanguage (CurrentLanguage
);
571 Status
= AddString (StringBuffer
, CurrentLanguage
, Prompt
, &StringToken
);
572 if (EFI_ERROR (Status
)) {
576 CheckBox
.Header
.OpCode
= FRAMEWORK_EFI_IFR_CHECKBOX_OP
;
577 CheckBox
.Header
.Length
= sizeof (FRAMEWORK_EFI_IFR_CHECKBOX
);
578 CheckBox
.QuestionId
= QuestionId
;
579 CheckBox
.Width
= DataWidth
;
580 CheckBox
.Prompt
= StringToken
;
583 // Add Help string to the StringBuffer, get Help string's token
585 Status
= AddString (StringBuffer
, CurrentLanguage
, Help
, &StringToken
);
586 if (EFI_ERROR (Status
)) {
590 CheckBox
.Help
= StringToken
;
591 CheckBox
.Flags
= (UINT8
) (Flags
| FRAMEWORK_EFI_IFR_FLAG_CREATED
);
593 Status
= AddOpCode (FormBuffer
, &CheckBox
);
601 @param QuestionId Question ID of the numeric
602 @param DataWidth DataWidth of the numeric
603 @param Prompt Prompt of the numeric
604 @param Help Help of the numeric
605 @param Minimum Minumun boundary of the numeric
606 @param Maximum Maximum boundary of the numeric
607 @param Step Step of the numeric
608 @param Default Default value
609 @param Flags Flags of the numeric
610 @param Key Key of the numeric
611 @param FormBuffer The form where this numeric adds to
612 @param StringBuffer String buffer created for Prompt and Help.
614 @retval EFI_DEVICE_ERROR DataWidth > 2
615 @retval EFI_SUCCESS Numeric is successfully created
620 IN UINT16 QuestionId
,
630 IN OUT VOID
*FormBuffer
,
631 IN OUT VOID
*StringBuffer
635 FRAMEWORK_EFI_IFR_NUMERIC Numeric
;
636 CHAR16 CurrentLanguage
[4];
637 STRING_REF StringToken
;
640 // We do not create op-code storage widths for numerics in excess of 16 bits for now
643 return EFI_DEVICE_ERROR
;
647 // Add Prompt string to the StringBuffer, get Prompt string's token
649 GetCurrentLanguage (CurrentLanguage
);
650 Status
= AddString (StringBuffer
, CurrentLanguage
, Prompt
, &StringToken
);
651 if (EFI_ERROR (Status
)) {
655 Numeric
.Header
.OpCode
= FRAMEWORK_EFI_IFR_NUMERIC_OP
;
656 Numeric
.Header
.Length
= sizeof (FRAMEWORK_EFI_IFR_NUMERIC
);
657 Numeric
.QuestionId
= QuestionId
;
658 Numeric
.Width
= DataWidth
;
659 Numeric
.Prompt
= StringToken
;
662 // Add Help string to the StringBuffer, get Help string's token
664 Status
= AddString (StringBuffer
, CurrentLanguage
, Help
, &StringToken
);
665 if (EFI_ERROR (Status
)) {
669 Numeric
.Help
= StringToken
;
670 Numeric
.Minimum
= Minimum
;
671 Numeric
.Maximum
= Maximum
;
673 Numeric
.Default
= Default
;
674 Numeric
.Flags
= (UINT8
) (Flags
| FRAMEWORK_EFI_IFR_FLAG_CREATED
);
677 Status
= AddOpCode (FormBuffer
, &Numeric
);
685 @param QuestionId Question ID of the string
686 @param DataWidth DataWidth of the string
687 @param Prompt Prompt of the string
688 @param Help Help of the string
689 @param MinSize Min size boundary of the string
690 @param MaxSize Max size boundary of the string
691 @param Flags Flags of the string
692 @param Key Key of the string
693 @param FormBuffer The form where this string adds to
694 @param StringBuffer String buffer created for Prompt and Help.
696 @retval EFI_SUCCESS String successfully created.
701 IN UINT16 QuestionId
,
709 IN OUT VOID
*FormBuffer
,
710 IN OUT VOID
*StringBuffer
714 FRAMEWORK_EFI_IFR_STRING String
;
715 CHAR16 CurrentLanguage
[4];
716 STRING_REF StringToken
;
719 // Add Prompt string to the StringBuffer, get Prompt string's token
721 GetCurrentLanguage (CurrentLanguage
);
722 Status
= AddString (StringBuffer
, CurrentLanguage
, Prompt
, &StringToken
);
723 if (EFI_ERROR (Status
)) {
727 String
.Header
.OpCode
= FRAMEWORK_EFI_IFR_STRING_OP
;
728 String
.Header
.Length
= sizeof (FRAMEWORK_EFI_IFR_STRING
);
729 String
.QuestionId
= QuestionId
;
730 String
.Width
= DataWidth
;
731 String
.Prompt
= StringToken
;
734 // Add Help string to the StringBuffer, get Help string's token
736 Status
= AddString (StringBuffer
, CurrentLanguage
, Help
, &StringToken
);
737 if (EFI_ERROR (Status
)) {
741 String
.Help
= StringToken
;
742 String
.MinSize
= MinSize
;
743 String
.MaxSize
= MaxSize
;
744 String
.Flags
= (UINT8
) (Flags
| FRAMEWORK_EFI_IFR_FLAG_CREATED
);
747 Status
= AddOpCode (FormBuffer
, &String
);