git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@3 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			973 lines
		
	
	
		
			23 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			973 lines
		
	
	
		
			23 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*++
 | 
						|
Copyright (c) 2006, Intel Corporation                                                         
 | 
						|
All rights reserved. This program and the accompanying materials                          
 | 
						|
are licensed and made available under the terms and conditions of the BSD License         
 | 
						|
which accompanies this distribution.  The full text of the license may be found at        
 | 
						|
http://opensource.org/licenses/bsd-license.php                                            
 | 
						|
                                                                                          
 | 
						|
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     
 | 
						|
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             
 | 
						|
 | 
						|
Module Name:
 | 
						|
  IfrOnTheFly.c
 | 
						|
 | 
						|
Abstract:
 | 
						|
 | 
						|
  Library Routines to create IFR on-the-fly
 | 
						|
 | 
						|
Revision History:
 | 
						|
 | 
						|
--*/
 | 
						|
 | 
						|
EFI_STATUS
 | 
						|
CreateFormSet (
 | 
						|
  IN      CHAR16              *FormSetTitle,
 | 
						|
  IN      EFI_GUID            *Guid,
 | 
						|
  IN      UINT8               Class,
 | 
						|
  IN      UINT8               SubClass,
 | 
						|
  IN OUT  VOID                **FormBuffer,
 | 
						|
  IN OUT  VOID                **StringBuffer
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
 | 
						|
  Create a formset
 | 
						|
  
 | 
						|
Arguments:
 | 
						|
  
 | 
						|
  FormSetTitle        - Title of formset
 | 
						|
  
 | 
						|
  Guid                - Guid of formset
 | 
						|
  
 | 
						|
  Class               - Class of formset
 | 
						|
  
 | 
						|
  SubClass            - Sub class of formset
 | 
						|
  
 | 
						|
  FormBuffer          - Pointer of the formset created
 | 
						|
  
 | 
						|
  StringBuffer        - Pointer of FormSetTitile string created
 | 
						|
  
 | 
						|
Returns: 
 | 
						|
 | 
						|
  EFI_OUT_OF_RESOURCES    - No enough buffer to allocate
 | 
						|
  
 | 
						|
  EFI_SUCCESS             - Formset successfully created
 | 
						|
 | 
						|
--*/
 | 
						|
{
 | 
						|
  EFI_STATUS            Status;
 | 
						|
  EFI_HII_IFR_PACK      IfrPack;
 | 
						|
  EFI_IFR_FORM_SET      FormSet;
 | 
						|
  EFI_IFR_END_FORM_SET  EndFormSet;
 | 
						|
  UINT8                 *Destination;
 | 
						|
  CHAR16                CurrentLanguage[4];
 | 
						|
  STRING_REF            StringToken;
 | 
						|
 | 
						|
  //
 | 
						|
  // Pre-allocate a buffer sufficient for us to work from.
 | 
						|
  //
 | 
						|
  FormBuffer = AllocateZeroPool (DEFAULT_FORM_BUFFER_SIZE);
 | 
						|
  if (FormBuffer == NULL) {
 | 
						|
    return EFI_OUT_OF_RESOURCES;
 | 
						|
  }
 | 
						|
 | 
						|
  //
 | 
						|
  // Pre-allocate a buffer sufficient for us to work from.
 | 
						|
  //
 | 
						|
  StringBuffer = AllocateZeroPool (DEFAULT_STRING_BUFFER_SIZE);
 | 
						|
  if (StringBuffer == NULL) {
 | 
						|
    gBS->FreePool (FormBuffer);
 | 
						|
    return EFI_OUT_OF_RESOURCES;
 | 
						|
  }
 | 
						|
 | 
						|
  //
 | 
						|
  // Obtain current language value
 | 
						|
  //
 | 
						|
  GetCurrentLanguage (CurrentLanguage);
 | 
						|
 | 
						|
  //
 | 
						|
  // Add the FormSetTitle to the string buffer and get the StringToken
 | 
						|
  //
 | 
						|
  Status = AddString (*StringBuffer, CurrentLanguage, FormSetTitle, &StringToken);
 | 
						|
 | 
						|
  if (EFI_ERROR (Status)) {
 | 
						|
    return Status;
 | 
						|
  }
 | 
						|
 | 
						|
  //
 | 
						|
  // Initialize the Ifr Package header data
 | 
						|
  //
 | 
						|
  IfrPack.Header.Length = sizeof (EFI_HII_PACK_HEADER) + sizeof (EFI_IFR_FORM_SET) + sizeof (EFI_IFR_END_FORM_SET);
 | 
						|
  IfrPack.Header.Type   = EFI_HII_IFR;
 | 
						|
 | 
						|
  //
 | 
						|
  // Initialize FormSet with the appropriate information
 | 
						|
  //
 | 
						|
  FormSet.Header.OpCode = EFI_IFR_FORM_SET_OP;
 | 
						|
  FormSet.Header.Length = sizeof (EFI_IFR_FORM_SET);
 | 
						|
  FormSet.FormSetTitle  = StringToken;
 | 
						|
  FormSet.Class         = Class;
 | 
						|
  FormSet.SubClass      = SubClass;
 | 
						|
  CopyMem (&FormSet.Guid, Guid, sizeof (EFI_GUID));
 | 
						|
 | 
						|
  //
 | 
						|
  // Initialize the end formset data
 | 
						|
  //
 | 
						|
  EndFormSet.Header.Length  = sizeof (EFI_IFR_END_FORM_SET);
 | 
						|
  EndFormSet.Header.OpCode  = EFI_IFR_END_FORM_SET_OP;
 | 
						|
 | 
						|
  Destination               = (UINT8 *) *FormBuffer;
 | 
						|
 | 
						|
  //
 | 
						|
  // Copy the formset/endformset data to the form buffer
 | 
						|
  //
 | 
						|
  CopyMem (Destination, &IfrPack, sizeof (EFI_HII_PACK_HEADER));
 | 
						|
 | 
						|
  Destination = Destination + sizeof (EFI_HII_PACK_HEADER);
 | 
						|
 | 
						|
  CopyMem (Destination, &FormSet, sizeof (EFI_IFR_FORM_SET));
 | 
						|
 | 
						|
  Destination = Destination + sizeof (EFI_IFR_FORM_SET);
 | 
						|
 | 
						|
  CopyMem (Destination, &EndFormSet, sizeof (EFI_IFR_END_FORM_SET));
 | 
						|
  return EFI_SUCCESS;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
EFI_STATUS
 | 
						|
CreateForm (
 | 
						|
  IN      CHAR16              *FormTitle,
 | 
						|
  IN      UINT16              FormId,
 | 
						|
  IN OUT  VOID                *FormBuffer,
 | 
						|
  IN OUT  VOID                *StringBuffer
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
 | 
						|
  Create a form
 | 
						|
  
 | 
						|
Arguments:
 | 
						|
  
 | 
						|
  FormTitle       - Title of the form
 | 
						|
  
 | 
						|
  FormId          - Id of the form
 | 
						|
  
 | 
						|
  FormBuffer          - Pointer of the form created
 | 
						|
  
 | 
						|
  StringBuffer        - Pointer of FormTitil string created
 | 
						|
  
 | 
						|
Returns: 
 | 
						|
 | 
						|
  EFI_SUCCESS     - Form successfully created
 | 
						|
 | 
						|
--*/
 | 
						|
{
 | 
						|
  EFI_STATUS        Status;
 | 
						|
  EFI_IFR_FORM      Form;
 | 
						|
  EFI_IFR_END_FORM  EndForm;
 | 
						|
  CHAR16            CurrentLanguage[4];
 | 
						|
  STRING_REF        StringToken;
 | 
						|
 | 
						|
  //
 | 
						|
  // Obtain current language value
 | 
						|
  //
 | 
						|
  GetCurrentLanguage (CurrentLanguage);
 | 
						|
 | 
						|
  Status = AddString (StringBuffer, CurrentLanguage, FormTitle, &StringToken);
 | 
						|
 | 
						|
  if (EFI_ERROR (Status)) {
 | 
						|
    return Status;
 | 
						|
  }
 | 
						|
 | 
						|
  Form.Header.OpCode  = EFI_IFR_FORM_OP;
 | 
						|
  Form.Header.Length  = sizeof (EFI_IFR_FORM);
 | 
						|
  Form.FormId         = FormId;
 | 
						|
  Form.FormTitle      = StringToken;
 | 
						|
 | 
						|
  Status              = AddOpCode (FormBuffer, &Form);
 | 
						|
 | 
						|
  if (EFI_ERROR (Status)) {
 | 
						|
    return Status;
 | 
						|
  }
 | 
						|
 | 
						|
  EndForm.Header.OpCode = EFI_IFR_END_FORM_OP;
 | 
						|
  EndForm.Header.Length = sizeof (EFI_IFR_END_FORM);
 | 
						|
 | 
						|
  Status                = AddOpCode (FormBuffer, &EndForm);
 | 
						|
 | 
						|
  if (EFI_ERROR (Status)) {
 | 
						|
    return Status;
 | 
						|
  }
 | 
						|
 | 
						|
  return EFI_SUCCESS;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
EFI_STATUS
 | 
						|
CreateSubTitle (
 | 
						|
  IN      CHAR16              *SubTitle,
 | 
						|
  IN OUT  VOID                *FormBuffer,
 | 
						|
  IN OUT  VOID                *StringBuffer
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
 | 
						|
  Create a SubTitle
 | 
						|
  
 | 
						|
Arguments:
 | 
						|
  
 | 
						|
  SubTitle        - Sub title to be created
 | 
						|
  
 | 
						|
  FormBuffer      - Where this subtitle to add to
 | 
						|
  
 | 
						|
  StringBuffer    - String buffer created for subtitle
 | 
						|
  
 | 
						|
Returns: 
 | 
						|
 | 
						|
  EFI_SUCCESS     - Subtitle successfully created
 | 
						|
 | 
						|
--*/
 | 
						|
{
 | 
						|
  EFI_STATUS        Status;
 | 
						|
  EFI_IFR_SUBTITLE  Subtitle;
 | 
						|
  CHAR16            CurrentLanguage[4];
 | 
						|
  STRING_REF        StringToken;
 | 
						|
 | 
						|
  //
 | 
						|
  // Obtain current language value
 | 
						|
  //
 | 
						|
  GetCurrentLanguage (CurrentLanguage);
 | 
						|
 | 
						|
  Status = AddString (StringBuffer, CurrentLanguage, SubTitle, &StringToken);
 | 
						|
 | 
						|
  if (EFI_ERROR (Status)) {
 | 
						|
    return Status;
 | 
						|
  }
 | 
						|
 | 
						|
  Subtitle.Header.OpCode  = EFI_IFR_SUBTITLE_OP;
 | 
						|
  Subtitle.Header.Length  = sizeof (EFI_IFR_SUBTITLE);
 | 
						|
  Subtitle.SubTitle       = StringToken;
 | 
						|
 | 
						|
  Status                  = AddOpCode (FormBuffer, &Subtitle);
 | 
						|
 | 
						|
  if (EFI_ERROR (Status)) {
 | 
						|
    return Status;
 | 
						|
  }
 | 
						|
 | 
						|
  return EFI_SUCCESS;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
EFI_STATUS
 | 
						|
CreateText (
 | 
						|
  IN      CHAR16              *String,
 | 
						|
  IN      CHAR16              *String2,
 | 
						|
  IN      CHAR16              *String3,
 | 
						|
  IN      UINT8               Flags,
 | 
						|
  IN      UINT16              Key,
 | 
						|
  IN OUT  VOID                *FormBuffer,
 | 
						|
  IN OUT  VOID                *StringBuffer
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
 | 
						|
  Create a line of text
 | 
						|
  
 | 
						|
Arguments:
 | 
						|
  
 | 
						|
  String          - First string of the text
 | 
						|
  
 | 
						|
  String2         - Second string of the text
 | 
						|
  
 | 
						|
  String3         - Help string of the text
 | 
						|
  
 | 
						|
  Flags           - Flag of the text
 | 
						|
  
 | 
						|
  Key             - Key of the text
 | 
						|
  
 | 
						|
  FormBuffer      - The form where this text adds to
 | 
						|
  
 | 
						|
  StringBuffer    - String buffer created for String, String2 and String3
 | 
						|
  
 | 
						|
Returns: 
 | 
						|
 | 
						|
  EFI_SUCCESS     - Text successfully created
 | 
						|
 | 
						|
--*/
 | 
						|
{
 | 
						|
  EFI_STATUS    Status;
 | 
						|
  EFI_IFR_TEXT  Text;
 | 
						|
  CHAR16        CurrentLanguage[4];
 | 
						|
  STRING_REF    StringToken;
 | 
						|
 | 
						|
  //
 | 
						|
  // Obtain current language value
 | 
						|
  //
 | 
						|
  GetCurrentLanguage (CurrentLanguage);
 | 
						|
 | 
						|
  //
 | 
						|
  // Add first string, get first string's token
 | 
						|
  //
 | 
						|
  Status = AddString (StringBuffer, CurrentLanguage, String, &StringToken);
 | 
						|
 | 
						|
  if (EFI_ERROR (Status)) {
 | 
						|
    return Status;
 | 
						|
  }
 | 
						|
 | 
						|
  Text.Header.OpCode  = EFI_IFR_TEXT_OP;
 | 
						|
  Text.Header.Length  = sizeof (EFI_IFR_TEXT);
 | 
						|
  Text.Text           = StringToken;
 | 
						|
 | 
						|
  //
 | 
						|
  // Add second string, get first string's token
 | 
						|
  //
 | 
						|
  Status = AddString (StringBuffer, CurrentLanguage, String2, &StringToken);
 | 
						|
 | 
						|
  if (EFI_ERROR (Status)) {
 | 
						|
    return Status;
 | 
						|
  }
 | 
						|
 | 
						|
  Text.TextTwo  = StringToken;
 | 
						|
 | 
						|
  Text.Flags    = (UINT8) (Flags | EFI_IFR_FLAG_CREATED);
 | 
						|
  Text.Key      = Key;
 | 
						|
 | 
						|
  //
 | 
						|
  // Add second string, get first string's token
 | 
						|
  //
 | 
						|
  Status = AddString (StringBuffer, CurrentLanguage, String3, &StringToken);
 | 
						|
 | 
						|
  if (EFI_ERROR (Status)) {
 | 
						|
    return Status;
 | 
						|
  }
 | 
						|
 | 
						|
  Text.Help = StringToken;
 | 
						|
 | 
						|
  Status    = AddOpCode (FormBuffer, &Text);
 | 
						|
 | 
						|
  if (EFI_ERROR (Status)) {
 | 
						|
    return Status;
 | 
						|
  }
 | 
						|
 | 
						|
  return EFI_SUCCESS;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
EFI_STATUS
 | 
						|
CreateGoto (
 | 
						|
  IN      UINT16              FormId,
 | 
						|
  IN      CHAR16              *Prompt,
 | 
						|
  IN OUT  VOID                *FormBuffer,
 | 
						|
  IN OUT  VOID                *StringBuffer
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
 | 
						|
  Create a hyperlink
 | 
						|
  
 | 
						|
Arguments:
 | 
						|
  
 | 
						|
  FormId        - Form ID of the hyperlink
 | 
						|
  
 | 
						|
  Prompt        - Prompt of the hyperlink
 | 
						|
  
 | 
						|
  FormBuffer    - The form where this hyperlink adds to
 | 
						|
  
 | 
						|
  StringBuffer  - String buffer created for Prompt
 | 
						|
  
 | 
						|
Returns: 
 | 
						|
 | 
						|
  EFI_SUCCESS     - Hyperlink successfully created
 | 
						|
 | 
						|
--*/
 | 
						|
{
 | 
						|
  EFI_STATUS  Status;
 | 
						|
  EFI_IFR_REF Hyperlink;
 | 
						|
  CHAR16      CurrentLanguage[4];
 | 
						|
  STRING_REF  StringToken;
 | 
						|
 | 
						|
  //
 | 
						|
  // Obtain current language value
 | 
						|
  //
 | 
						|
  GetCurrentLanguage (CurrentLanguage);
 | 
						|
 | 
						|
  Status = AddString (StringBuffer, CurrentLanguage, Prompt, &StringToken);
 | 
						|
 | 
						|
  if (EFI_ERROR (Status)) {
 | 
						|
    return Status;
 | 
						|
  }
 | 
						|
 | 
						|
  Hyperlink.Header.OpCode = EFI_IFR_REF_OP;
 | 
						|
  Hyperlink.Header.Length = sizeof (EFI_IFR_REF);
 | 
						|
  Hyperlink.FormId        = FormId;
 | 
						|
  Hyperlink.Prompt        = StringToken;
 | 
						|
 | 
						|
  Status                  = AddOpCode (FormBuffer, &Hyperlink);
 | 
						|
 | 
						|
  if (EFI_ERROR (Status)) {
 | 
						|
    return Status;
 | 
						|
  }
 | 
						|
 | 
						|
  return EFI_SUCCESS;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
EFI_STATUS
 | 
						|
CreateOneOf (
 | 
						|
  IN      UINT16              QuestionId,
 | 
						|
  IN      UINT8               DataWidth,
 | 
						|
  IN      CHAR16              *Prompt,
 | 
						|
  IN      CHAR16              *Help,
 | 
						|
  IN      IFR_OPTION          *OptionsList,
 | 
						|
  IN      UINTN               OptionCount,
 | 
						|
  IN OUT  VOID                *FormBuffer,
 | 
						|
  IN OUT  VOID                *StringBuffer
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
 | 
						|
  Create a one-of question with a set of options to choose from.  The
 | 
						|
  OptionsList is a pointer to a null-terminated list of option descriptions.
 | 
						|
  
 | 
						|
Arguments:
 | 
						|
  
 | 
						|
  QuestionId      - Question ID of the one-of box
 | 
						|
  
 | 
						|
  DataWidth       - DataWidth of the one-of box
 | 
						|
  
 | 
						|
  Prompt          - Prompt of the one-of box
 | 
						|
  
 | 
						|
  Help            - Help of the one-of box
 | 
						|
  
 | 
						|
  OptionsList     - Each string in it is an option of the one-of box
 | 
						|
  
 | 
						|
  OptionCount     - Option string count
 | 
						|
  
 | 
						|
  FormBuffer      - The form where this one-of box adds to
 | 
						|
  
 | 
						|
  StringBuffer    - String buffer created for Prompt, Help and Option strings
 | 
						|
  
 | 
						|
Returns: 
 | 
						|
 | 
						|
  EFI_DEVICE_ERROR    - DataWidth > 2
 | 
						|
 | 
						|
  EFI_SUCCESS         - One-Of box successfully created.
 | 
						|
 | 
						|
--*/
 | 
						|
{
 | 
						|
  EFI_STATUS            Status;
 | 
						|
  UINTN                 Index;
 | 
						|
  EFI_IFR_ONE_OF        OneOf;
 | 
						|
  EFI_IFR_ONE_OF_OPTION OneOfOption;
 | 
						|
  EFI_IFR_END_ONE_OF    EndOneOf;
 | 
						|
  CHAR16                CurrentLanguage[4];
 | 
						|
  STRING_REF            StringToken;
 | 
						|
 | 
						|
  //
 | 
						|
  // We do not create op-code storage widths for one-of in excess of 16 bits for now
 | 
						|
  //
 | 
						|
  if (DataWidth > 2) {
 | 
						|
    return EFI_DEVICE_ERROR;
 | 
						|
  }
 | 
						|
 | 
						|
  //
 | 
						|
  // Obtain current language value
 | 
						|
  //
 | 
						|
  GetCurrentLanguage (CurrentLanguage);
 | 
						|
 | 
						|
  //
 | 
						|
  // Add first string, get first string's token
 | 
						|
  //
 | 
						|
  Status = AddString (StringBuffer, CurrentLanguage, Prompt, &StringToken);
 | 
						|
 | 
						|
  if (EFI_ERROR (Status)) {
 | 
						|
    return Status;
 | 
						|
  }
 | 
						|
 | 
						|
  OneOf.Header.OpCode = EFI_IFR_ONE_OF_OP;
 | 
						|
  OneOf.Header.Length = sizeof (EFI_IFR_ONE_OF);
 | 
						|
  OneOf.QuestionId    = QuestionId;
 | 
						|
  OneOf.Width         = DataWidth;
 | 
						|
  OneOf.Prompt        = StringToken;
 | 
						|
 | 
						|
  //
 | 
						|
  // Add second string, get first string's token
 | 
						|
  //
 | 
						|
  Status = AddString (StringBuffer, CurrentLanguage, Help, &StringToken);
 | 
						|
 | 
						|
  if (EFI_ERROR (Status)) {
 | 
						|
    return Status;
 | 
						|
  }
 | 
						|
 | 
						|
  OneOf.Help  = StringToken;
 | 
						|
 | 
						|
  Status      = AddOpCode (FormBuffer, &OneOf);
 | 
						|
 | 
						|
  if (EFI_ERROR (Status)) {
 | 
						|
    return Status;
 | 
						|
  }
 | 
						|
 | 
						|
  for (Index = 0; Index < OptionCount; Index++) {
 | 
						|
    OneOfOption.Header.OpCode = EFI_IFR_ONE_OF_OPTION_OP;
 | 
						|
    OneOfOption.Header.Length = sizeof (EFI_IFR_ONE_OF_OPTION);
 | 
						|
 | 
						|
    //
 | 
						|
    // Add string and get token back
 | 
						|
    //
 | 
						|
    Status              = AddString (StringBuffer, CurrentLanguage, OptionsList[Index].OptionString, &StringToken);
 | 
						|
 | 
						|
    OneOfOption.Option  = StringToken;
 | 
						|
    OneOfOption.Value   = OptionsList[Index].Value;
 | 
						|
    OneOfOption.Flags   = (UINT8) (OptionsList[Index].Flags | EFI_IFR_FLAG_CREATED);
 | 
						|
    OneOfOption.Key     = OptionsList[Index].Key;
 | 
						|
 | 
						|
    Status              = AddOpCode (FormBuffer, &OneOfOption);
 | 
						|
 | 
						|
    if (EFI_ERROR (Status)) {
 | 
						|
      return Status;
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  EndOneOf.Header.Length  = sizeof (EFI_IFR_END_ONE_OF);
 | 
						|
  EndOneOf.Header.OpCode  = EFI_IFR_END_ONE_OF_OP;
 | 
						|
 | 
						|
  Status                  = AddOpCode (FormBuffer, &EndOneOf);
 | 
						|
 | 
						|
  if (EFI_ERROR (Status)) {
 | 
						|
    return Status;
 | 
						|
  }
 | 
						|
 | 
						|
  return EFI_SUCCESS;
 | 
						|
}
 | 
						|
 | 
						|
EFI_STATUS
 | 
						|
CreateOrderedList (
 | 
						|
  IN      UINT16              QuestionId,
 | 
						|
  IN      UINT8               MaxEntries,
 | 
						|
  IN      CHAR16              *Prompt,
 | 
						|
  IN      CHAR16              *Help,
 | 
						|
  IN      IFR_OPTION          *OptionsList,
 | 
						|
  IN      UINTN               OptionCount,
 | 
						|
  IN OUT  VOID                *FormBuffer,
 | 
						|
  IN OUT  VOID                *StringBuffer
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
 | 
						|
  Create a one-of question with a set of options to choose from.  The
 | 
						|
  OptionsList is a pointer to a null-terminated list of option descriptions.
 | 
						|
  
 | 
						|
Arguments:
 | 
						|
  
 | 
						|
  QuestionId      - Question ID of the ordered list
 | 
						|
  
 | 
						|
  MaxEntries      - MaxEntries of the ordered list
 | 
						|
  
 | 
						|
  Prompt          - Prompt of the ordered list
 | 
						|
  
 | 
						|
  Help            - Help of the ordered list
 | 
						|
  
 | 
						|
  OptionsList     - Each string in it is an option of the ordered list
 | 
						|
  
 | 
						|
  OptionCount     - Option string count
 | 
						|
  
 | 
						|
  FormBuffer      - The form where this ordered list adds to
 | 
						|
  
 | 
						|
  StringBuffer    - String buffer created for Prompt, Help and Option strings
 | 
						|
  
 | 
						|
Returns: 
 | 
						|
 | 
						|
  EFI_SUCCESS     - Ordered list successfully created.
 | 
						|
 | 
						|
--*/
 | 
						|
{
 | 
						|
  EFI_STATUS            Status;
 | 
						|
  UINTN                 Index;
 | 
						|
  EFI_IFR_ORDERED_LIST  OrderedList;
 | 
						|
  EFI_IFR_ONE_OF_OPTION OrderedListOption;
 | 
						|
  EFI_IFR_END_ONE_OF    EndOrderedList;
 | 
						|
  CHAR16                CurrentLanguage[4];
 | 
						|
  STRING_REF            StringToken;
 | 
						|
 | 
						|
  //
 | 
						|
  // Obtain current language value
 | 
						|
  //
 | 
						|
  GetCurrentLanguage (CurrentLanguage);
 | 
						|
 | 
						|
  //
 | 
						|
  // Add first string, get first string's token
 | 
						|
  //
 | 
						|
  Status = AddString (StringBuffer, CurrentLanguage, Prompt, &StringToken);
 | 
						|
 | 
						|
  if (EFI_ERROR (Status)) {
 | 
						|
    return Status;
 | 
						|
  }
 | 
						|
 | 
						|
  OrderedList.Header.OpCode = EFI_IFR_ORDERED_LIST_OP;
 | 
						|
  OrderedList.Header.Length = sizeof (EFI_IFR_ORDERED_LIST);
 | 
						|
  OrderedList.QuestionId    = QuestionId;
 | 
						|
  OrderedList.MaxEntries    = MaxEntries;
 | 
						|
  OrderedList.Prompt        = StringToken;
 | 
						|
 | 
						|
  //
 | 
						|
  // Add second string, get first string's token
 | 
						|
  //
 | 
						|
  Status = AddString (StringBuffer, CurrentLanguage, Help, &StringToken);
 | 
						|
 | 
						|
  if (EFI_ERROR (Status)) {
 | 
						|
    return Status;
 | 
						|
  }
 | 
						|
 | 
						|
  OrderedList.Help  = StringToken;
 | 
						|
 | 
						|
  Status            = AddOpCode (FormBuffer, &OrderedList);
 | 
						|
 | 
						|
  if (EFI_ERROR (Status)) {
 | 
						|
    return Status;
 | 
						|
  }
 | 
						|
 | 
						|
  for (Index = 0; Index < OptionCount; Index++) {
 | 
						|
    OrderedListOption.Header.OpCode = EFI_IFR_ONE_OF_OPTION_OP;
 | 
						|
    OrderedListOption.Header.Length = sizeof (EFI_IFR_ONE_OF_OPTION);
 | 
						|
 | 
						|
    //
 | 
						|
    // Add string and get token back
 | 
						|
    //
 | 
						|
    Status                    = AddString (StringBuffer, CurrentLanguage, OptionsList[Index].OptionString, &StringToken);
 | 
						|
 | 
						|
    OrderedListOption.Option  = StringToken;
 | 
						|
    OrderedListOption.Value   = OptionsList[Index].Value;
 | 
						|
    OrderedListOption.Flags   = (UINT8) (OptionsList[Index].Flags | EFI_IFR_FLAG_CREATED);
 | 
						|
    OrderedListOption.Key     = OptionsList[Index].Key;
 | 
						|
 | 
						|
    Status                    = AddOpCode (FormBuffer, &OrderedListOption);
 | 
						|
 | 
						|
    if (EFI_ERROR (Status)) {
 | 
						|
      return Status;
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  EndOrderedList.Header.Length  = sizeof (EFI_IFR_END_ONE_OF);
 | 
						|
  EndOrderedList.Header.OpCode  = EFI_IFR_END_ONE_OF_OP;
 | 
						|
 | 
						|
  Status                        = AddOpCode (FormBuffer, &EndOrderedList);
 | 
						|
 | 
						|
  if (EFI_ERROR (Status)) {
 | 
						|
    return Status;
 | 
						|
  }
 | 
						|
 | 
						|
  return EFI_SUCCESS;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
EFI_STATUS
 | 
						|
CreateCheckBox (
 | 
						|
  IN      UINT16              QuestionId,
 | 
						|
  IN      UINT8               DataWidth,
 | 
						|
  IN      CHAR16              *Prompt,
 | 
						|
  IN      CHAR16              *Help,
 | 
						|
  IN      UINT8               Flags,
 | 
						|
  IN OUT  VOID                *FormBuffer,
 | 
						|
  IN OUT  VOID                *StringBuffer
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
 | 
						|
  Create a checkbox
 | 
						|
  
 | 
						|
Arguments:
 | 
						|
  
 | 
						|
  QuestionId      - Question ID of the check box
 | 
						|
  
 | 
						|
  DataWidth       - DataWidth of the check box
 | 
						|
  
 | 
						|
  Prompt          - Prompt of the check box
 | 
						|
  
 | 
						|
  Help            - Help of the check box
 | 
						|
  
 | 
						|
  Flags           - Flags of the check box
 | 
						|
  
 | 
						|
  FormBuffer      - The form where this check box adds to
 | 
						|
  
 | 
						|
  StringBuffer    - String buffer created for Prompt and Help.
 | 
						|
  
 | 
						|
Returns: 
 | 
						|
 | 
						|
  EFI_DEVICE_ERROR    - DataWidth > 1
 | 
						|
 | 
						|
  EFI_SUCCESS         - Check box successfully created
 | 
						|
 | 
						|
--*/
 | 
						|
{
 | 
						|
  EFI_STATUS        Status;
 | 
						|
  EFI_IFR_CHECKBOX  CheckBox;
 | 
						|
  CHAR16            CurrentLanguage[4];
 | 
						|
  STRING_REF        StringToken;
 | 
						|
 | 
						|
  //
 | 
						|
  // We do not create op-code storage widths for checkbox in excess of 8 bits for now
 | 
						|
  //
 | 
						|
  if (DataWidth > 1) {
 | 
						|
    return EFI_DEVICE_ERROR;
 | 
						|
  }
 | 
						|
 | 
						|
  //
 | 
						|
  // Obtain current language value
 | 
						|
  //
 | 
						|
  GetCurrentLanguage (CurrentLanguage);
 | 
						|
 | 
						|
  //
 | 
						|
  // Add first string, get first string's token
 | 
						|
  //
 | 
						|
  Status = AddString (StringBuffer, CurrentLanguage, Prompt, &StringToken);
 | 
						|
 | 
						|
  if (EFI_ERROR (Status)) {
 | 
						|
    return Status;
 | 
						|
  }
 | 
						|
 | 
						|
  CheckBox.Header.OpCode  = EFI_IFR_CHECKBOX_OP;
 | 
						|
  CheckBox.Header.Length  = sizeof (EFI_IFR_CHECKBOX);
 | 
						|
  CheckBox.QuestionId     = QuestionId;
 | 
						|
  CheckBox.Width          = DataWidth;
 | 
						|
  CheckBox.Prompt         = StringToken;
 | 
						|
 | 
						|
  //
 | 
						|
  // Add second string, get first string's token
 | 
						|
  //
 | 
						|
  Status = AddString (StringBuffer, CurrentLanguage, Help, &StringToken);
 | 
						|
 | 
						|
  if (EFI_ERROR (Status)) {
 | 
						|
    return Status;
 | 
						|
  }
 | 
						|
 | 
						|
  CheckBox.Help   = StringToken;
 | 
						|
  CheckBox.Flags  = (UINT8) (Flags | EFI_IFR_FLAG_CREATED);
 | 
						|
 | 
						|
  Status          = AddOpCode (FormBuffer, &CheckBox);
 | 
						|
 | 
						|
  if (EFI_ERROR (Status)) {
 | 
						|
    return Status;
 | 
						|
  }
 | 
						|
 | 
						|
  return EFI_SUCCESS;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
EFI_STATUS
 | 
						|
CreateNumeric (
 | 
						|
  IN      UINT16              QuestionId,
 | 
						|
  IN      UINT8               DataWidth,
 | 
						|
  IN      CHAR16              *Prompt,
 | 
						|
  IN      CHAR16              *Help,
 | 
						|
  IN      UINT16              Minimum,
 | 
						|
  IN      UINT16              Maximum,
 | 
						|
  IN      UINT16              Step,
 | 
						|
  IN      UINT16              Default,
 | 
						|
  IN      UINT8               Flags,
 | 
						|
  IN      UINT16              Key,
 | 
						|
  IN OUT  VOID                *FormBuffer,
 | 
						|
  IN OUT  VOID                *StringBuffer
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
 | 
						|
  Create a numeric
 | 
						|
  
 | 
						|
Arguments:
 | 
						|
  
 | 
						|
  QuestionId      - Question ID of the numeric
 | 
						|
  
 | 
						|
  DataWidth       - DataWidth of the numeric
 | 
						|
  
 | 
						|
  Prompt          - Prompt of the numeric
 | 
						|
  
 | 
						|
  Help            - Help of the numeric
 | 
						|
  
 | 
						|
  Minimum         - Minumun boundary of the numeric
 | 
						|
  
 | 
						|
  Maximum         - Maximum boundary of the numeric
 | 
						|
  
 | 
						|
  Step            - Step of the numeric
 | 
						|
  
 | 
						|
  Default         - Default value
 | 
						|
  
 | 
						|
  Flags           - Flags of the numeric
 | 
						|
  
 | 
						|
  Key             - Key of the numeric
 | 
						|
  
 | 
						|
  FormBuffer      - The form where this numeric adds to
 | 
						|
  
 | 
						|
  StringBuffer    - String buffer created for Prompt and Help.
 | 
						|
  
 | 
						|
Returns: 
 | 
						|
 | 
						|
  EFI_DEVICE_ERROR      - DataWidth > 2
 | 
						|
  
 | 
						|
  EFI_SUCCESS           - Numeric is successfully created
 | 
						|
 | 
						|
--*/
 | 
						|
{
 | 
						|
  EFI_STATUS      Status;
 | 
						|
  EFI_IFR_NUMERIC Numeric;
 | 
						|
  CHAR16          CurrentLanguage[4];
 | 
						|
  STRING_REF      StringToken;
 | 
						|
 | 
						|
  //
 | 
						|
  // We do not create op-code storage widths for numerics in excess of 16 bits for now
 | 
						|
  //
 | 
						|
  if (DataWidth > 2) {
 | 
						|
    return EFI_DEVICE_ERROR;
 | 
						|
  }
 | 
						|
 | 
						|
  //
 | 
						|
  // Obtain current language value
 | 
						|
  //
 | 
						|
  GetCurrentLanguage (CurrentLanguage);
 | 
						|
 | 
						|
  //
 | 
						|
  // Add first string, get first string's token
 | 
						|
  //
 | 
						|
  Status = AddString (StringBuffer, CurrentLanguage, Prompt, &StringToken);
 | 
						|
 | 
						|
  if (EFI_ERROR (Status)) {
 | 
						|
    return Status;
 | 
						|
  }
 | 
						|
 | 
						|
  Numeric.Header.OpCode = EFI_IFR_NUMERIC_OP;
 | 
						|
  Numeric.Header.Length = sizeof (EFI_IFR_NUMERIC);
 | 
						|
  Numeric.QuestionId    = QuestionId;
 | 
						|
  Numeric.Width         = DataWidth;
 | 
						|
  Numeric.Prompt        = StringToken;
 | 
						|
 | 
						|
  //
 | 
						|
  // Add second string, get first string's token
 | 
						|
  //
 | 
						|
  Status = AddString (StringBuffer, CurrentLanguage, Help, &StringToken);
 | 
						|
 | 
						|
  if (EFI_ERROR (Status)) {
 | 
						|
    return Status;
 | 
						|
  }
 | 
						|
 | 
						|
  Numeric.Help    = StringToken;
 | 
						|
  Numeric.Minimum = Minimum;
 | 
						|
  Numeric.Maximum = Maximum;
 | 
						|
  Numeric.Step    = Step;
 | 
						|
  Numeric.Default = Default;
 | 
						|
  Numeric.Flags   = (UINT8) (Flags | EFI_IFR_FLAG_CREATED);
 | 
						|
  Numeric.Key     = Key;
 | 
						|
 | 
						|
  Status          = AddOpCode (FormBuffer, &Numeric);
 | 
						|
 | 
						|
  if (EFI_ERROR (Status)) {
 | 
						|
    return Status;
 | 
						|
  }
 | 
						|
 | 
						|
  return EFI_SUCCESS;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
EFI_STATUS
 | 
						|
CreateString (
 | 
						|
  IN      UINT16              QuestionId,
 | 
						|
  IN      UINT8               DataWidth,
 | 
						|
  IN      CHAR16              *Prompt,
 | 
						|
  IN      CHAR16              *Help,
 | 
						|
  IN      UINT8               MinSize,
 | 
						|
  IN      UINT8               MaxSize,
 | 
						|
  IN      UINT8               Flags,
 | 
						|
  IN      UINT16              Key,
 | 
						|
  IN OUT  VOID                *FormBuffer,
 | 
						|
  IN OUT  VOID                *StringBuffer
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
 | 
						|
  Create a string
 | 
						|
  
 | 
						|
Arguments:
 | 
						|
  
 | 
						|
  QuestionId      - Question ID of the string
 | 
						|
  
 | 
						|
  DataWidth       - DataWidth of the string
 | 
						|
  
 | 
						|
  Prompt          - Prompt of the string
 | 
						|
  
 | 
						|
  Help            - Help of the string
 | 
						|
  
 | 
						|
  MinSize         - Min size boundary of the string
 | 
						|
  
 | 
						|
  MaxSize         - Max size boundary of the string
 | 
						|
    
 | 
						|
  Flags           - Flags of the string
 | 
						|
  
 | 
						|
  Key             - Key of the string
 | 
						|
  
 | 
						|
  FormBuffer      - The form where this string adds to
 | 
						|
  
 | 
						|
  StringBuffer    - String buffer created for Prompt and Help.
 | 
						|
  
 | 
						|
Returns: 
 | 
						|
 | 
						|
  EFI_SUCCESS     - String successfully created.
 | 
						|
 | 
						|
--*/
 | 
						|
{
 | 
						|
  EFI_STATUS      Status;
 | 
						|
  EFI_IFR_STRING  String;
 | 
						|
  CHAR16          CurrentLanguage[4];
 | 
						|
  STRING_REF      StringToken;
 | 
						|
 | 
						|
  //
 | 
						|
  // Obtain current language value
 | 
						|
  //
 | 
						|
  GetCurrentLanguage (CurrentLanguage);
 | 
						|
 | 
						|
  //
 | 
						|
  // Add first string, get first string's token
 | 
						|
  //
 | 
						|
  Status = AddString (StringBuffer, CurrentLanguage, Prompt, &StringToken);
 | 
						|
 | 
						|
  if (EFI_ERROR (Status)) {
 | 
						|
    return Status;
 | 
						|
  }
 | 
						|
 | 
						|
  String.Header.OpCode  = EFI_IFR_STRING_OP;
 | 
						|
  String.Header.Length  = sizeof (EFI_IFR_STRING);
 | 
						|
  String.QuestionId     = QuestionId;
 | 
						|
  String.Width          = DataWidth;
 | 
						|
  String.Prompt         = StringToken;
 | 
						|
 | 
						|
  //
 | 
						|
  // Add second string, get first string's token
 | 
						|
  //
 | 
						|
  Status = AddString (StringBuffer, CurrentLanguage, Help, &StringToken);
 | 
						|
 | 
						|
  if (EFI_ERROR (Status)) {
 | 
						|
    return Status;
 | 
						|
  }
 | 
						|
 | 
						|
  String.Help     = StringToken;
 | 
						|
  String.MinSize  = MinSize;
 | 
						|
  String.MaxSize  = MaxSize;
 | 
						|
  String.Flags    = (UINT8) (Flags | EFI_IFR_FLAG_CREATED);
 | 
						|
  String.Key      = Key;
 | 
						|
 | 
						|
  Status          = AddOpCode (FormBuffer, &String);
 | 
						|
 | 
						|
  if (EFI_ERROR (Status)) {
 | 
						|
    return Status;
 | 
						|
  }
 | 
						|
 | 
						|
  return EFI_SUCCESS;
 | 
						|
}
 |