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