/** @file
  Defines for EFI shell environment 2 ported to EDK II build environment. (no spec)

Copyright (c) 2005, 2009 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.

**/

  
#ifndef _SHELLENV2_H_
#define _SHELLENV2_H_

#include <Protocol/SimpleTextIn.h>
#include <Protocol/SimpleTextOut.h>
#include <Protocol/EfiShellInterface.h>

#define DEFAULT_INIT_ROW    1
#define DEFAULT_AUTO_LF     FALSE


/**
  this function is a prototype for a function that dumps information on a protocol 
  to a given location.  the location is dependant on the implementation.  This is 
  used when programatically adding shell commands.

  @param Handle                 the handle the protocol is on
  @param Interface              the interface to the protocol

**/
typedef
VOID
(EFIAPI *SHELLENV_DUMP_PROTOCOL_INFO) (
  IN EFI_HANDLE                   Handle,
  IN VOID                         *Interface
  );

/**
  this function is a prototype foe each command internal to the EFI shell 
  implementation.  the specific command depends on the implementation.  This is 
  used when programatically adding shell commands.

  @param ImageHandle            The handle to the binary shell
  @param SystemTable            pointer to the system table.

  @retval EFI_SUCCESS           the command ran to completion
  @return other                 an error ocurred.  any error is possible 
                                depending on the implementation of the shell 
                                command.

**/
typedef
EFI_STATUS
(EFIAPI *SHELLENV_INTERNAL_COMMAND) (
  IN EFI_HANDLE                   ImageHandle,
  IN EFI_SYSTEM_TABLE             *SystemTable
  );

/**
  This function is a prototype for one that gets a help string for a given command. 
  This is used when programatically adding shell commands.  Upon successful return 
  the memory allocated is up to the caller to free.

  @param Str                      pointer to pointer to string to display for help.

  @retval EFI_SUCCESS             the help string is in the parameter Str.

**/
typedef
EFI_STATUS
(EFIAPI *SHELLCMD_GET_LINE_HELP) (
  IN OUT CHAR16                 **Str
  );

/**
* Structure returned from functions that open multiple files
**/
typedef struct {
  UINT32                    Signature;            ///< SHELL_FILE_ARG_SIGNATURE
  LIST_ENTRY                Link;                 ///< linked list helper
  EFI_STATUS                Status;               ///< File's status

  EFI_FILE_HANDLE           Parent;               ///< what is the Parent file of this file
  UINT64                    OpenMode;             ///< how was the file opened
  CHAR16                    *ParentName;          ///< string representation of parent
  EFI_DEVICE_PATH_PROTOCOL  *ParentDevicePath;    ///< DevicePath for Parent

  CHAR16                    *FullName;            ///< path and file name for this file
  CHAR16                    *FileName;            ///< file name for this file

  EFI_FILE_HANDLE           Handle;               ///< handle to this file
  EFI_FILE_INFO             *Info;                ///< pointer to file info for this file
} SHELL_FILE_ARG;

/// signature for SHELL_FILE_ARG
#define SHELL_FILE_ARG_SIGNATURE  SIGNATURE_32 ('g', 'r', 'a', 'f') 

/**
*  GUID for the shell environment2 and shell environment
**/
#define SHELL_ENVIRONMENT_PROTOCOL_GUID \
  { \
    0x47c7b221, 0xc42a, 0x11d2, 0x8e, 0x57, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b \
  }

/**
*  GUID for the shell environment2 extension (main GUID same as shell environment)
**/
#define EFI_SE_EXT_SIGNATURE_GUID \
  { \
    0xd2c18636, 0x40e5, 0x4eb5, {0xa3, 0x1b, 0x36, 0x69, 0x5f, 0xd4, 0x2c, 0x87} \
  }

#define EFI_SHELL_MAJOR_VER 0x00000001 ///< Major version of the EFI_SHELL_ENVIRONMENT2
#define EFI_SHELL_MINOR_VER 0x00000000 ///< Minor version of the EFI_SHELL_ENVIRONMENT2

/**
  execute a command line

  this function will run the CommandLine.  This includes loading any required images, 
  parsing any requires scripts, and it DebugOutput is TRUE printing errors 
  encountered directly to the screen.
  
  @param ParentImageHandle      Handle of image executing this operation
  @param CommandLine            string command line to execute
  @param DebugOutput            TRUE indicates that errors should be printed directly.
                                FALSE supresses error messages.

  @retval EFI_SUCCESS           the command line executed and completed.
  @retval EFI_ABORTED           the operation did not complete due to abort.
  @retval EFI_INVALID_PARAMETER A parameter did not have a valid value.
  @retval EFI_OUT_OF_RESOURCES  A required memory allocation failed.

@sa HandleProtocol
**/
typedef
EFI_STATUS
(EFIAPI *SHELLENV_EXECUTE) (
  IN EFI_HANDLE   *ParentImageHandle,
  IN CHAR16       *CommandLine,
  IN BOOLEAN      DebugOutput
  );

/**
  this function returns a shell environment variable value.

  @param Name                   pointer to the string with the shell environment 
                                variables name

  @retval NULL                  the shell environment variable's value could not be found
  @retval !NULL                 the value of the shell environment variable Name

**/
typedef 
CHAR16 * 
(EFIAPI *SHELLENV_GET_ENV) (
  IN CHAR16 *Name
  );

/**
  this function returns a shell environment map value.

  @param Name                   pointer to the string with the shell environment 
                                map name

  @retval NULL                  the shell environment map's value could not be found
  @retval !NULL                 the value of the shell environment map Name

**/
typedef 
CHAR16 * 
(EFIAPI *SHELLENV_GET_MAP) (
  IN CHAR16 *Name
  );

/**
  This function will add an internal command to the shell interface.

  This will allocate all required memory, put the new command on the command
  list in the correct location.

  @param Handler                the handler function to call when the command gets called
  @param CmdStr                 The command name
  @param GetLineHelp            function to call of get help for this command

  @retval EFI_SUCCESS           the command is now part of the command list
  @retval EFI_OUT_OF_RESOURCES  a memory allocation failed.
  @sa SHELLENV_INTERNAL_COMMAND
  @sa SHELLCMD_GET_LINE_HELP
**/
typedef
EFI_STATUS
(EFIAPI *SHELLENV_ADD_CMD) (
  IN SHELLENV_INTERNAL_COMMAND    Handler,
  IN CHAR16                       *Cmd,
  IN SHELLCMD_GET_LINE_HELP       GetLineHelp
  );

/**
  Internal interface to add protocol handlers.

  This function is for internal shell use only.  This is how protocol handlers are added.
  This will get the current protocol info and add the new info or update existing info
  and then resave the info.

  @param SaveId                 save this change as an EFI variable
  @param Protocol               the protocol's GUID
  @param DumpToken              The function pointer to dump token function or 
                                NULL
  @param DumpInfo               The function pointer to dump infomation function 
                                or NULL
  @param IdString               The english name of the protocol
**/
typedef
VOID
(EFIAPI *SHELLENV_ADD_PROT) (
  IN EFI_GUID                     *Protocol,
  IN SHELLENV_DUMP_PROTOCOL_INFO  DumpToken OPTIONAL,
  IN SHELLENV_DUMP_PROTOCOL_INFO  DumpInfo OPTIONAL,
  IN CHAR16                       *IdString
  );

/**
  this function finds a protocol handle by a GUID.  

  This function will check for already known protocols by GUID and if one is 
  found it will return the name of that protocol.  if no name is found and 
  GenId is TRUE it will generate ths string.

  @param Protocol               the GUID of the protocol to look for.
  @param GenId                  whether to generate a name string if its not found.

  @return !NULL                 the Name of the protocol.
  @retval NULL                  the Name was not found and GenId was not TRUE.
**/
typedef 
CHAR16*
(EFIAPI *SHELLENV_GET_PROT) (
  IN EFI_GUID *Protocol, 
  IN BOOLEAN GenId
  );

/**
  this function returns the current directory on a given device

  If DeviceName is specified, then return the current shell directory on that 
  device.  If DeviceName is NULL, then return the current directory on the 
  current device.  The caller us responsible to free the returned string when
  no londer required.

  @param DeviceName             the name of the device to get the current 
                                directory on or NULL for current device

  @return The current directory on the current or specified device.

**/
typedef 
CHAR16*
(EFIAPI *SHELLENV_CUR_DIR) (
  IN CHAR16 *DeviceName OPTIONAL
  );

/**
  this function will open a group of files that match the Arg path, including 
  support for wildcard characters ('?' and '*') in the Arg path.  if there are 
  any wildcard characters in the path this function will find any and all files
  that match the wildcards.  the return is a double linked list based on the 
  LIST_ENTRY linked list structure.  use this in conjunction with the 
  SHELL_FILE_ARG_SIGNATURE to get the SHELL_FILE_ARG structures that are returned.
  The memory allocated by the callee for this list is freed by making a call to 
  SHELLENV_FREE_FILE_LIST.

  @param Arg                    pointer Path to files to open
  @param ListHead               pointer to allocated and initialized list head 
                                upon which to append all the opened file structures.

  @retval EFI_SUCCESS           1 or more files was opened and a struct of each file's
                                information was appended to ListHead.
  @retval EFI_OUT_OF_RESOURCES  a memory allocation failed.
  @retval EFI_NOT_FOUND         no matching files could be found.
  @sa SHELLENV_FREE_FILE_LIST
**/typedef
EFI_STATUS
(EFIAPI *SHELLENV_FILE_META_ARG) (
  IN CHAR16               *Arg,
  IN OUT LIST_ENTRY       *ListHead
  );

/**
  this frees all of the nodes under the ListHead, but not ListHead itself.

  @param ListHead               Pointer to list to free all nodes of.

  @retval EFI_SUCCESS           always returned.
**/
typedef
EFI_STATUS
(EFIAPI *SHELLENV_FREE_FILE_LIST) (
  IN OUT LIST_ENTRY       *ListHead
  );

/**
  this function creates a new instance of the ShellInterface protocol for use on 
  the ImageHandle.

  This function is for internal shell usage.  this will allocate and then populate 
  EFI_SHELL_INTERFACE protocol.  it is the caller's responsibility to free the 
  memory.

  @param ImageHandle            the handle which will use the new ShellInterface 
                                protocol.

  @return the newly allocated shell interface protocol.

**/
typedef 
EFI_SHELL_INTERFACE* 
(EFIAPI *SHELLENV_NEW_SHELL) (
  IN EFI_HANDLE ImageHandle
  );

/**
  this function determins whether a script file is currently being processed.

  a script file (.nsh file) can contain a series of commands and this is useful to 
  know for some shell commands whether they are being run manually or as part of a 
  script.

  @retval TRUE                  A script file is being processed
  @return FALSE                 A script file is not being processed
**/
typedef
BOOLEAN
(EFIAPI *SHELLENV_BATCH_IS_ACTIVE) (
  IN VOID
  );

/**
  This is an internal shell function to free any and all allocated resources.  
  This should be called just closing the shell.
**/
typedef
VOID
(EFIAPI *SHELLENV_FREE_RESOURCES) (
  VOID
  );

/**
  This function enables the page break mode.

  This mode causes the output to pause after each complete screen to enable a 
  user to more easily read it.  if AutoWrap is TRUE then rows with too many 
  characters will be chopped and divided into 2 rows.  if FALSE then rows with 
  too many characters may not be fully visible to the user on the screen.

  @param StartRow               the row number to start this on.
  @param AutoWrap               whether to auto wrap rows that are 
**/
typedef
VOID
(EFIAPI *SHELLENV_ENABLE_PAGE_BREAK) (
  IN INT32      StartRow,
  IN BOOLEAN    AutoWrap
  );

/**
  This function disables the page break mode.

  disabling this causes the output to print out exactly as coded with no breaks 
  for readability.
**/
typedef
VOID
(EFIAPI *SHELLENV_DISABLE_PAGE_BREAK) (
  IN VOID
  );

/**
  Get the status of the page break output mode.

  @retval FALSE                 page break output mode is not enabled
  @retval TRUE                  page break output mode is enabled
**/
typedef
BOOLEAN
(EFIAPI *SHELLENV_GET_PAGE_BREAK) (
  IN VOID
  );

/**
  this function sets the keys to filter for for the console in.  the valid 
  values to set are:

  #define EFI_OUTPUT_SCROLL   0x00000001
  #define EFI_OUTPUT_PAUSE    0x00000002
  #define EFI_EXECUTION_BREAK 0x00000004

  @param KeyFilter              The new key filter to use.
**/
typedef
VOID
(EFIAPI *SHELLENV_SET_KEY_FILTER) (
  IN UINT32      KeyFilter
  );

/**
  this function gets the keys to filter for for the console in.  the valid 
  values to get are:

  #define EFI_OUTPUT_SCROLL   0x00000001
  #define EFI_OUTPUT_PAUSE    0x00000002
  #define EFI_EXECUTION_BREAK 0x00000004

  @retval the current filter mask.
**/
typedef
UINT32
(EFIAPI *SHELLENV_GET_KEY_FILTER) (
  IN VOID
  );

/**
  this function determins if the shell application should break.

  This is used to inform a shell application that a break condition has been 
  initiated.  long loops should check this to prevent delays to the break.

  @retval TRUE                  a break has been signaled.  the application   
                                should exit with EFI_ABORTED as soon as possible.
  @retval FALSE                 continue as normal.
**/
typedef
BOOLEAN
(EFIAPI *SHELLENV_GET_EXECUTION_BREAK) (
  IN VOID
  );

/**
  This is an internal-shell function used to increment the shell nesting level.

**/
typedef
VOID
(EFIAPI *SHELLENV_INCREMENT_SHELL_NESTING_LEVEL) (
  IN VOID
  );

/**
  This is an internal-shell function used to decrement the shell nesting level.
**/
typedef
VOID
(EFIAPI *SHELLENV_DECREMENT_SHELL_NESTING_LEVEL) (
  IN VOID
  );

/**
  this function determins if the caller is running under the root shell.

  @retval TRUE                  The caller is running under the root shell
  @retval FALSE                 The caller is not running under the root shell

**/
typedef
BOOLEAN
(EFIAPI *SHELLENV_IS_ROOT_SHELL) (
  IN VOID
  );

/**
  Close the console proxy to restore the original console.

  This is an internal shell function to handle shell cascading.  it restores the 
  original set of console protocols.
  
  @param ConInHandle            The handle of ConIn.
  @param ConIn                  pointer to the location to return the pointer to 
                                the original console input.
  @param ConOutHandle           The handle of ConOut
  @param ConOut                 pointer to the location to return the pointer to 
                                the original console output.
**/
typedef
VOID
(EFIAPI *SHELLENV_CLOSE_CONSOLE_PROXY) (
  IN     EFI_HANDLE                       ConInHandle,
  IN OUT EFI_SIMPLE_TEXT_INPUT_PROTOCOL   **ConIn,
  IN     EFI_HANDLE                       ConOutHandle,
  IN OUT EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL  **ConOut
  );

//
// declarations of handle enumerator
//
/**
  For ease of use the shell maps handle #'s to short numbers.
  This is only done on request for various internal commands and the references 
  are immediately freed when the internal command completes.
**/
typedef
VOID
(EFIAPI *INIT_HANDLE_ENUMERATOR) (
  VOID
  );

/**
  this is an internal shell function to enumerate the handle database.

  this function gets the next handle in the handle database.  if no handles are 
  found EFI_NOT_FOUND is returned.  if the previous Handle was the last handle 
  it is set to NULL before returning.

  this must be called after INIT_HANDLE_ENUMERATOR and before CLOSE_HANDLE_ENUMERATOR.

  @param Handle                 pointer to pointer to Handle.  will be set
                                on a sucessful return.

  @retval EFI_SUCCESS           the next handle in the handle database is *Handle
  @retval EFI_NOT_FOUND         there is not another handle.
**/
typedef
EFI_STATUS
(EFIAPI *NEXT_HANDLE) (
  IN OUT EFI_HANDLE             **Handle
  );

/**
  this is an internal shell function to enumerate the handle database.

  this function skips the next SkipNum handles in the handle database.  If there 
  are not enough handles left to skip that many EFI_ACCESS_DENIED is returned and 
  no skip is performed.

  this must be called after INIT_HANDLE_ENUMERATOR and before CLOSE_HANDLE_ENUMERATOR.

  @param SkipNum                how many handles to skip

  @retval EFI_SUCCESS           the next handle in the handle database is *Handle
  @retval EFI_ACCESS_DENIED     there are not SkipNum handles left in the database
**/
typedef
EFI_STATUS
(EFIAPI *SKIP_HANDLE) (
  IN UINTN                   SkipNum
  );

/**
  this is an internal shell function to enumerate the handle database.

  this function resets the the handle database so that NEXT_HANDLE and SKIP_HANDLE 
  will start from EnumIndex on the next call. 
  
  this must be called after INIT_HANDLE_ENUMERATOR and before CLOSE_HANDLE_ENUMERATOR.

  @param EnumIndex              where to start.

  @retval the number of handles either read out or skipped before this reset.
**/
typedef
UINTN
(EFIAPI *RESET_HANDLE_ENUMERATOR) (
  IN UINTN                  EnumIndex
  );

/**
  this is an internal shell function to enumerate the handle database.
  
  this must be called after INIT_HANDLE_ENUMERATOR.

  this function releases all memory and resources associated with the handle database.
  after this no other handle enumerator functions except INIT_HANDLE_ENUMERATOR will 
  function properly.
**/
typedef
VOID
(EFIAPI *CLOSE_HANDLE_ENUMERATOR) (
  VOID
  );

/**
  this is an internal shell function to enumerate the handle database.

  this function returns the number of handles in the handle database.
  
  this must be called after INIT_HANDLE_ENUMERATOR and before CLOSE_HANDLE_ENUMERATOR.

  @retval the number of handles in the handle database.
**/
typedef
UINTN
(EFIAPI *GET_NUM) (
  VOID
  );

/**
Handle Enumerator structure
**/
typedef struct {
  INIT_HANDLE_ENUMERATOR  Init;   ///< pointer to INIT_HANDLE_ENUMERATOR function
  NEXT_HANDLE             Next;   ///< pointer to NEXT_HANDLE function
  SKIP_HANDLE             Skip;   ///< pointer to SKIP_HANDLE function
  RESET_HANDLE_ENUMERATOR Reset;  ///< pointer to RESET_HANDLE_ENUMERATOR function
  CLOSE_HANDLE_ENUMERATOR Close;  ///< pointer to CLOSE_HANDLE_ENUMERATOR function
  GET_NUM                 GetNum; ///< pointer to GET_NUM function
} HANDLE_ENUMERATOR;
/**
  signature for the PROTOCOL_INFO structure 
**/
#define PROTOCOL_INFO_SIGNATURE SIGNATURE_32 ('s', 'p', 'i', 'n')
/**
  PROTOCOL_INFO structure for protocol enumerator functions.

**/
typedef struct {
  UINTN                       Signature;   ///< PROTOCOL_INFO_SIGNATURE 
  LIST_ENTRY                  Link;        ///< standard lined list helper member
  //
  // parsing info for the protocol
  //
  EFI_GUID                    ProtocolId;  ///< GUID for the protocol
  CHAR16                      *IdString;   ///< Name of the protocol
  SHELLENV_DUMP_PROTOCOL_INFO DumpToken;   ///< pointer to DumpToken function for the protocol
  SHELLENV_DUMP_PROTOCOL_INFO DumpInfo;    ///< pointer to DumpInfo function for the protocol
  //
  // database info on which handles are supporting this protocol
  //
  UINTN                       NoHandles;   ///< how many handles produce this protocol
  EFI_HANDLE                  *Handles;    ///< array of handles

} PROTOCOL_INFO;

//
// declarations of protocol info enumerator
//
/**
  this is an internal shell function to initialize the protocol enumerator.

  this must be called before NEXT_PROTOCOL_INFO, SKIP_PROTOCOL_INFO, 
  RESET_PROTOCOL_INFO_ENUMERATOR, and CLOSE_PROTOCOL_INFO_ENUMERATOR are
  called.
**/
typedef
VOID
(EFIAPI *INIT_PROTOCOL_INFO_ENUMERATOR) (
  VOID
  );

/**
  this function is an internal shell function for enumeration of protocols.  

  This functiol will return the next protocol in the list.  If this is called 
  immediately after initialization it will return the first.  If this is called
  immediately after reset it will return the protocol first again.

  This cannot be called after CLOSE_PROTOCOL_INFO_ENUMERATOR, but it must be 
  called after INIT_PROTOCOL_INFO_ENUMERATOR.

  @param ProtocolInfo           pointer to pointer to protocol information structure.

  @retval EFI_SUCCESS           the next protocol's information was sucessfully returned.  
                                If there were no more protocols NULL was returned.
**/
typedef
EFI_STATUS
(EFIAPI *NEXT_PROTOCOL_INFO) (
  IN OUT PROTOCOL_INFO            **ProtocolInfo
  );

/**
  this function is an internal shell function for enumeration of protocols.  

  This cannot be called after CLOSE_PROTOCOL_INFO_ENUMERATOR, but it must be 
  called after INIT_PROTOCOL_INFO_ENUMERATOR.

  this function does nothing and always returns EFI_SUCCESS.

  @retval EFI_SUCCESS           always returned (see note).
**/
typedef
EFI_STATUS
(EFIAPI *SKIP_PROTOCOL_INFO) (
  IN UINTN                         SkipNum
  );

/**
  this function is an internal shell function for enumeration of protocols.  

  This cannot be called after CLOSE_PROTOCOL_INFO_ENUMERATOR, but it must be 
  called after INIT_PROTOCOL_INFO_ENUMERATOR.

  this function resets the list of protocols such that the next one in the 
  list is the begining of the list.
**/
typedef
VOID
(EFIAPI *RESET_PROTOCOL_INFO_ENUMERATOR) (
  VOID
  );


/**
  this function is an internal shell function for enumeration of protocols.  

  This must be called after INIT_PROTOCOL_INFO_ENUMERATOR.  After this call
  no protocol enumerator calls except INIT_PROTOCOL_INFO_ENUMERATOR may be made.

  this function frees any memory or resources associated with the protocol
  enumerator.
**/
typedef
VOID
(EFIAPI *CLOSE_PROTOCOL_INFO_ENUMERATOR) (
  VOID
  );

/**
*  protocol enumerator structure of function pointers.
**/
typedef struct {
  INIT_PROTOCOL_INFO_ENUMERATOR   Init;   ///< pointer to INIT_PROTOCOL_INFO_ENUMERATOR function
  NEXT_PROTOCOL_INFO              Next;   ///< pointer to NEXT_PROTOCOL_INFO function
  SKIP_PROTOCOL_INFO              Skip;   ///< pointer to SKIP_PROTOCOL_INFO function
  RESET_PROTOCOL_INFO_ENUMERATOR  Reset;  ///< pointer to RESET_PROTOCOL_INFO_ENUMERATOR function
  CLOSE_PROTOCOL_INFO_ENUMERATOR  Close;  ///< pointer to CLOSE_PROTOCOL_INFO_ENUMERATOR function
} PROTOCOL_INFO_ENUMERATOR;

/**
  this function is used to retrieve a user-friendly display name for a handle.  

  If UseComponentName is TRUE then the component name protocol for this device 
  or it's parent device (if required) will be used to obtain the name of the 
  device.  If UseDevicePath is TRUE it will get the human readable device path
  and return that.  If both are TRUE it will try to use component name first
  and device path if that fails. 

  It will use either ComponentName or ComponentName2 protocol, depending on 
  what is present.

  This function will furthur verify whether the handle in question produced either
  EFI_DRIVER_CONFIGRATION_PROTOCOL or EFI_DRIVER_CONFIGURATION2_PROTOCOL and also 
  whether the handle in question produced either EFI_DRIVER_DIAGNOSTICS_PROTOCOL or 
  EFI_DRIVER_DIAGNOSTICS2_PROTOCOL.
  
  Upon sucessful return the memory for *BestDeviceName is up to the caller to free.

  @param DeviceHandle           the device handle whose name is desired
  @param UseComponentName       whether to use the ComponentName protocol at all
  @param UseDevicePath          whether to use the DevicePath protocol at all
  @param Language               pointer to language string to use
  @param BestDeviceName         pointer to pointer to string allocated with the name
  @param ConfigurationStatus    pointer to status for opening a Configuration protocol
  @param DiagnosticsStatus      pointer to status for opening a Diagnostics protocol
  @param Display                Whether to Print this out to default Print location
  @param Indent                 how many characters to indent the printing

  @retval EFI_SUCCESS           this function always returns EFI_SUCCESS
**/
typedef
EFI_STATUS
(EFIAPI *GET_DEVICE_NAME) (
  EFI_HANDLE  DeviceHandle,
  BOOLEAN     UseComponentName,
  BOOLEAN     UseDevicePath,
  CHAR8       *Language,
  CHAR16      **BestDeviceName,
  EFI_STATUS  *ConfigurationStatus,
  EFI_STATUS  *DiagnosticsStatus,
  BOOLEAN     Display,
  UINTN       Indent
  );

#define EFI_SHELL_COMPATIBLE_MODE_VER L"1.1.1" ///< string for lowest version this shell supports
#define EFI_SHELL_ENHANCED_MODE_VER   L"1.1.2" ///< string for highest version this shell supports

/**
  this function gets the shell mode as stored in the shell environment 
  "efishellmode".  it will not fail.

  @param Mode                   returns a string representing one of the 
                                2 supported modes of the shell.

  @retval EFI_SUCCESS           this function always returns success
**/
typedef
EFI_STATUS
(EFIAPI *GET_SHELL_MODE) (
  OUT CHAR16     **Mode
  );

/**
  Convert a file system style name to an file path

  This function will convert a shell path name to a Device Path Protocol path.
  This function will allocate any required memory for this operation and it 
  is the responsibility of the caller to free that memory when no longer required.

  if anything prevents the complete conversion free any allocated memory and 
  return NULL.

  @retval !NULL                 a pointer to the callee allocated Device Path
  @retval NULL                  the operation could not be completed.
**/
typedef 
EFI_DEVICE_PATH_PROTOCOL* 
(EFIAPI *SHELLENV_NAME_TO_PATH) (
  IN CHAR16 *Path
  );

/**
  converts a device path into a file system map name.

  if DevPath is NULL then ASSERT
  This function looks through the shell environment map for a map whose device
  path matches the DevPath parameter.  If one is found the Name is returned via 
  Name parameter.  If sucessful the caller must free the memory allocated for
  Name.

  this function will use the internal lock to prevent changes to the map during 
  the lookup operation.
  
  @param DevPath                The device path to search for a name for
  @param ConsistMapping         what state to verify map flag VAR_ID_CONSIST
  @param Name                   on sucessful return the name of that device path

  @retval EFI_SUCCESS           the DevPath was found and the name returned
                                in Name.  
  @retval EFI_OUT_OF_RESOURCES  A required memory allocation failed.
  @retval EFI_UNSUPPORTED       the DevPath was not found in the map
**/
typedef
EFI_STATUS
(EFIAPI *SHELLENV_GET_FS_NAME) (
  IN EFI_DEVICE_PATH_PROTOCOL     * DevPath,
  IN BOOLEAN                      ConsistMapping,
  OUT CHAR16                      **Name
  );

/**
  this function will open a group of files that match the Arg path, but will not 
  support the wildcard characters ('?' and '*') in the Arg path.  if there are 
  any wildcard characters in the path this function will return 
  EFI_INVALID_PARAMETER.  the return is a double linked list based on the 
  LIST_ENTRY linked list structure.  use this in conjunction with the 
  SHELL_FILE_ARG_SIGNATURE to get the SHELL_FILE_ARG structures that are returned.
  The memory allocated by the callee for this list is freed by making a call to 
  SHELLENV_FREE_FILE_LIST.

  @param Arg                    pointer Path to files to open
  @param ListHead               pointer to allocated and initialized list head 
                                upon which to append all the opened file structures.

  @retval EFI_SUCCESS           1 or more files was opened and a struct of each file's
                                information was appended to ListHead.
  @retval EFI_OUT_OF_RESOURCES  a memory allocation failed.
  @retval EFI_NOT_FOUND         no matching files could be found.
  @sa SHELLENV_FREE_FILE_LIST
**/
typedef
EFI_STATUS
(EFIAPI *SHELLENV_FILE_META_ARG_NO_WILDCARD) (
  IN CHAR16               *Arg,
  IN OUT LIST_ENTRY       *ListHead
  );

/**
  this function removes duplicate file listings from lists.

  this is a function for use with SHELLENV_FILE_META_ARG_NO_WILDCARD and 
  SHELLENV_FILE_META_ARG.  this function will verify that there are no duplicate
  files in the list of returned files.  any file listed twice will have one of its
  instances removed.

  @param ListHead               pointer to linked list head that was returned from 
                                SHELLENV_FILE_META_ARG_NO_WILDCARD or
                                SHELLENV_FILE_META_ARG.

  @retval EFI_SUCCESS           this function always returns success.

**/
typedef
EFI_STATUS
(EFIAPI *SHELLENV_DEL_DUP_FILE) (
  IN LIST_ENTRY   * ListHead
  );

/**
  Converts a File System map name to a device path.

  if DevPath is NULL then ASSERT()

  This function looks through the shell environment map for a map whose Name 
  matches the Name parameter.  If one is found the device path pointer is 
  updated to point to that file systems device path.  the caller should not 
  free the memory from that device path.

  this function will use the internal lock to prevent changes to the map during 
  the lookup operation.

  @param Name                   pointer to NULL terminated UNICODE string of the 
                                file system name
  @param DevPath                pointer to pointer to DevicePath.  only valid on 
                                OUT if sucessful

  @retval EFI_SUCCESS           the conversion was successful and the device 
                                path was returned.
  @retval EFI_NOT_FOUND         the file system could not be found in the map.
**/
typedef
EFI_STATUS
(EFIAPI *SHELLENV_GET_FS_DEVICE_PATH) (
  IN CHAR16                        *Name,
  OUT EFI_DEVICE_PATH_PROTOCOL     **DevPath
  );

/// EFI_SHELL_ENVIRONMENT2 protocol structure
/// contains pointers to functions
typedef struct {
  SHELLENV_EXECUTE                        Execute;
  SHELLENV_GET_ENV                        GetEnv;
  SHELLENV_GET_MAP                        GetMap;
  SHELLENV_ADD_CMD                        AddCmd;
  SHELLENV_ADD_PROT                       AddProt;
  SHELLENV_GET_PROT                       GetProt;
  SHELLENV_CUR_DIR                        CurDir;
  SHELLENV_FILE_META_ARG                  FileMetaArg;
  SHELLENV_FREE_FILE_LIST                 FreeFileList;

  //
  // The following services are only used by the shell itself
  //
  SHELLENV_NEW_SHELL                      NewShell;
  SHELLENV_BATCH_IS_ACTIVE                BatchIsActive;

  SHELLENV_FREE_RESOURCES                 FreeResources;

  //
  // GUID to differentiate ShellEnvironment2 from ShellEnvironment
  //
  EFI_GUID                                SESGuid;
  //
  // Major Version grows if shell environment interface has been changes
  //
  UINT32                                  MajorVersion;
  UINT32                                  MinorVersion;
  SHELLENV_ENABLE_PAGE_BREAK              EnablePageBreak;
  SHELLENV_DISABLE_PAGE_BREAK             DisablePageBreak;
  SHELLENV_GET_PAGE_BREAK                 GetPageBreak;

  SHELLENV_SET_KEY_FILTER                 SetKeyFilter;
  SHELLENV_GET_KEY_FILTER                 GetKeyFilter;

  SHELLENV_GET_EXECUTION_BREAK            GetExecutionBreak;
  SHELLENV_INCREMENT_SHELL_NESTING_LEVEL  IncrementShellNestingLevel;
  SHELLENV_DECREMENT_SHELL_NESTING_LEVEL  DecrementShellNestingLevel;
  SHELLENV_IS_ROOT_SHELL                  IsRootShell;

  SHELLENV_CLOSE_CONSOLE_PROXY            CloseConsoleProxy;
  HANDLE_ENUMERATOR                       HandleEnumerator;
  PROTOCOL_INFO_ENUMERATOR                ProtocolInfoEnumerator;
  GET_DEVICE_NAME                         GetDeviceName;
  GET_SHELL_MODE                          GetShellMode;
  SHELLENV_NAME_TO_PATH                   NameToPath;
  SHELLENV_GET_FS_NAME                    GetFsName;
  SHELLENV_FILE_META_ARG_NO_WILDCARD      FileMetaArgNoWildCard;
  SHELLENV_DEL_DUP_FILE                   DelDupFileArg;
  SHELLENV_GET_FS_DEVICE_PATH             GetFsDevicePath;
} EFI_SHELL_ENVIRONMENT2;

extern EFI_GUID gEfiShellEnvironment2Guid;
extern EFI_GUID gEfiShellEnvironment2ExtGuid;
#endif // _SHELLENV_H_
