/** @file
  Include flie for basic command line parser for EBL (Embedded Boot Loader)

  Copyright (c) 2007, Intel Corporation<BR>
  Portions copyright (c) 2008-2009 Apple Inc. All rights reserved.<BR>

  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 __EBL_ADD_EXTERNAL_COMMAND_LIB_H__
#define __EBL_ADD_EXTERNAL_COMMAND_LIB_H__

#include <PiDxe.h>
#include <Protocol/EblAddCommand.h>


EFI_STATUS
EFIAPI
EblAddExternalCommands (
  IN const EBL_COMMAND_TABLE   *EntryArray,
  IN UINTN                     ArrayCount
  );

/**

  Return a keypress or optionally timeout if a timeout value was passed in.

  An optional callback funciton is called evey second when waiting for a

  timeout.



  @param  Key           EFI Key information returned

  @param  TimeoutInSec  Number of seconds to wait to timeout

  @param  CallBack      Callback called every second during the timeout wait 



  @return EFI_SUCCESS  Key was returned

  @return EFI_TIMEOUT  If the TimoutInSec expired



**/

EFI_STATUS

EFIAPI

EblGetCharKey (

  IN OUT EFI_INPUT_KEY            *Key,

  IN     UINTN                    TimeoutInSec,

  IN     EBL_GET_CHAR_CALL_BACK   CallBack   OPTIONAL

  );





/**

  This routine is used prevent command output data from scrolling off the end

  of the screen. The global gPageBreak is used to turn on or off this feature.

  If the CurrentRow is near the end of the screen pause and print out a prompt

  If the use hits Q to quit return TRUE else for any other key return FALSE.

  PrefixNewline is used to figure out if a newline is needed before the prompt

  string. This depends on the last print done before calling this function.

  CurrentRow is updated by one on a call or set back to zero if a prompt is 

  needed.



  @param  CurrentRow  Used to figure out if its the end of the page and updated

  @param  PrefixNewline  Did previous print issue a newline



  @return TRUE if Q was hit to quit, FALSE in all other cases.



**/

BOOLEAN

EFIAPI

EblAnyKeyToContinueQtoQuit (

  IN  UINTN   *CurrentRow,

  IN  BOOLEAN PrefixNewline

  );



#endif

