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