/** @file
Constants and declarations for the Interactive IO library.
Copyright (c) 2012, Intel Corporation. All rights reserved.<BR>
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 _INTERACTIVE_IO_H
#define _INTERACTIVE_IO_H
#include <sys/EfiSysCall.h>
#include <sys/termios.h>
#include <Containers/Fifo.h>
#include <kfile.h>
__BEGIN_DECLS
typedef struct _IIO_Instance cIIO;
cIIO * EFIAPI New_cIIO(void); // Creates a new cIIO structure
/* Types of Member functions of the TTY I/O "class". */
typedef void (EFIAPI *cIIO_Delete) (cIIO *This);
typedef ssize_t (EFIAPI *cIIO_Read) (struct __filedes *filp, size_t BufferSize, VOID *Buffer);
typedef ssize_t (EFIAPI *cIIO_Write) (struct __filedes *filp, const char *buf, ssize_t n);
typedef ssize_t (EFIAPI *cIIO_Echo) (struct __filedes *filp, wchar_t EChar, BOOLEAN EchoIsOK);
/** Structure defining an instance of the Interactive I/O "class". **/
struct _IIO_Instance {
/* ######## Public Functions ######## */
cIIO_Delete Delete;
cIIO_Read Read;
cIIO_Write Write;
cIIO_Echo Echo;
/* ######## PRIVATE Data ######## */
// Wide input buffer -- stdin
cFIFO *InBuf;
// Wide output buffer -- stdout
cFIFO *OutBuf;
// Attributes for characters in the output buffer
UINT8 *AttrBuf;
// Wide output buffer -- stderr
cFIFO *ErrBuf;
// Character conversion states for the buffers
mbstate_t OutState;
mbstate_t ErrState;
// Cursor position at beginning of operation
// and at each character thereafter.
CURSOR_XY InitialXY;
CURSOR_XY CurrentXY;
UINTN MaxColumn; // Width of the output device
UINTN MaxRow; // Height of the output device
// termios structure
struct termios Termio;
};
// Helper Functions
ssize_t IIO_CanonRead (struct __filedes *filp);
ssize_t IIO_NonCanonRead (struct __filedes *filp);
ssize_t IIO_WriteOne (struct __filedes *filp, cFIFO *Buf, wchar_t InCh);
ssize_t IIO_EchoOne (struct __filedes *filp, wchar_t InCh, BOOLEAN EchoIsOK);
__END_DECLS
#endif /* _INTERACTIVE_IO_H */