/*
 * Nettle specific code headers
 * (C) Nettle developers 2000-2002
 *
 * $Id: nettle,v 1.40 2003/10/26 16:44:51 ijeffray Exp $
 */

#ifndef NETTLE_H
#define NETTLE_H

#define NETTLE_TELNET      1
#define NETTLE_SSH         2
#define NETTLE_TASKWINDOW  3

#define NETTLE_SESSION_NONE        0
#define NETTLE_SESSION_RESOLVE     1
#define NETTLE_SESSION_CONNECT     2
#define NETTLE_SESSION_CONNECTED   3

#define NETTLE_ESCAPE_NONE         0
#define NETTLE_ESCAPE_ESCAPE       1

#define NETTLE_FLAG_CURSOR        (1<<0)
#define NETTLE_FLAG_NO_INPUT      (1<<1)
#define NETTLE_FLAG_INVERTED      (1<<2)
#define NETTLE_FLAG_PLUS100       (1<<3)
#define NETTLE_FLAG_BLINK         (1<<4)
/*#define NETTLE_FLAG_VALID         (1<<5)*/ /* we can use this one now */
#define NETTLE_FLAG_UNDERLINE     (1<<6)

/* for line_flags */
#define NETTLE_LINE_WRAP          (1<<0)

#define NETTLE_OTHER_VT52_MODE	    (1<<0)
#define NETTLE_OTHER_INSERT_MODE    (1<<1)
#define NETTLE_OTHER_KEYLOCK_MODE   (1<<2)
#define NETTLE_OTHER_LINEFEED_MODE  (1<<3)
#define NETTLE_OTHER_CURSOR_VIS	    (1<<4)
#define NETTLE_OTHER_ORIGIN_MODE    (1<<5)
#define NETTLE_OTHER_WRAP_MODE	    (1<<6)
#define NETTLE_OTHER_REVERSE_VIDEO  (1<<7)
#define NETTLE_OTHER_APPLI_MODE	    (1<<8)
#define NETTLE_OTHER_BACKSPACE_MODE (1<<9)
#define NETTLE_OTHER_SCREEN_MODE    (1<<10)
#define NETTLE_OTHER_COLUMN_MODE    (1<<11)

#define NETTLE_COLOUR_NORMAL_BLACK   0
#define NETTLE_COLOUR_NORMAL_RED     1
#define NETTLE_COLOUR_NORMAL_GREEN   2
#define NETTLE_COLOUR_NORMAL_YELLOW  3
#define NETTLE_COLOUR_NORMAL_BLUE    4
#define NETTLE_COLOUR_NORMAL_MAGENTA 5
#define NETTLE_COLOUR_NORMAL_CYAN    6
#define NETTLE_COLOUR_NORMAL_WHITE   7
#define NETTLE_COLOUR_BRIGHT_BLACK   8
#define NETTLE_COLOUR_BRIGHT_RED     9
#define NETTLE_COLOUR_BRIGHT_GREEN   10
#define NETTLE_COLOUR_BRIGHT_YELLOW  11
#define NETTLE_COLOUR_BRIGHT_BLUE    12
#define NETTLE_COLOUR_BRIGHT_MAGENTA 13
#define NETTLE_COLOUR_BRIGHT_CYAN    14
#define NETTLE_COLOUR_BRIGHT_WHITE   15

enum nettle_terminal {
  NETTLE_TERMINAL_VT100,
  NETTLE_TERMINAL_VT102,
  NETTLE_TERMINAL_VT220,
  NETTLE_TERMINAL_VT320,
  NETTLE_TERMINAL_VT420,
  NETTLE_TERMINAL_VT510,
  NETTLE_TERMINAL_RXVT,
  NETTLE_TERMINAL_XTERM,
  NETTLE_TERMINAL_XTERM_COLOR,
  NETTLE_TERMINAL_LINUX
};


#define NETTLE_CHSET_G0	0
#define NETTLE_CHSET_G1	1
#define NETTLE_CHSET_G2	2
#define NETTLE_CHSET_G3	3

#define NETTLE_CHSET_ASCII	                1
#define NETTLE_CHSET_DEC_SUPPLEMENTAL_GRAPHICS	2
#define NETTLE_CHSET_UK_NATIONAL           	3
#define NETTLE_CHSET_DEC_SPECIAL_GRAPHICS       4
#define NETTLE_CHSET_DOWNLINE_LOADABLE          5

/* Maximum length for connection type - telnet, ssh, etc */
#define MESSAGE_MAX_CONNECTION  20

/* Maximum length for terminal type - vt100, vt102, etc */
#define MESSAGE_MAX_TERMINAL    12

/* Maximum length of menu entries */
#define MESSAGE_MAX_MENU        20

struct session_struct;

struct connection_params
{
  int         connection_type;
  enum        nettle_terminal terminal_type;
  const char *host;
  int         port;
  const char *command;
  int         width;
  int         height;
  int         scrollback;
  char        line_editor_type;
  char        label[150]; /**< appears on session menu and in title bar */

  char       *login_user;
  char       *login_pass;
};

bool start_connection(void);
bool start_connection_friedport(struct connection_params *params );

/**
 * Start a telnet connection with default choices
 *
 * @param host     Hostname to connect to
 * @param port     Port number to connect on
 *
 * @return true if connection started successfully, false otherwise
 */
bool nettle_start_telnet_connection(const char *host, int port);
bool nettle_start_telnet_connection_friedport(const char *host);

/**
 * Start a taskwindow command with default choices
 *
 * @param cmd      Command to run in taskwindow
 *
 * @return true if taskwindow started successfully, false otherwise
 */
bool nettle_start_taskwindow(const char *cmd);

void write_out_string(struct session_struct *, const char *);
void write_out_strings(struct session_struct *, ...); /* term with NUL ptr */
void write_out_data(struct session_struct *, const char *, int);

void remove_session(struct session_struct *);
int nettle_senddata(struct session_struct *, const char *, int);
void reset_terminal(struct session_struct *);

bool valid_x(struct session_struct *, int);
bool valid_y(struct session_struct *, int);
bool valid_alt_y(struct session_struct *, int);

void write_assigned(struct session_struct *, int, int, char, char, char, char);
void write_alt_assigned(struct session_struct *, int, int, char, char, char, char);

char read_assigned_fg(struct session_struct *, int, int);
char read_assigned_bg(struct session_struct *, int, int);
char read_assigned_flags(struct session_struct *, int, int);
char read_assigned_character(struct session_struct *, int, int);

char read_alt_assigned_fg(struct session_struct *, int, int);
char read_alt_assigned_bg(struct session_struct *, int, int);
char read_alt_assigned_flags(struct session_struct *, int, int);
char read_alt_assigned_character(struct session_struct *, int, int);

void write_assigned_flags(struct session_struct *, int, int, char);
void write_assigned_character(struct session_struct *, int, int, char);

void create_terminal(struct session_struct *, struct coords, int);
void delete_terminal(struct session_struct *);

void resize_terminal(struct session_struct *, int, int, int, bool);
void reopen_and_size_window(struct session_struct *, int, int, int, int, int, struct coords);

void scroll_term(struct session_struct *, int);

void nettle_reconnect(struct session_struct *);

#endif
