/*   event.h


*/

#define EVENTS_PORT	8000

#define	CRLF		"\015\012"
#define CR             '\015'
#define LF             '\012'
#define	EOL		"\012"		/* End of Line */
#define	EOL_LEN		1
#define EOM		".\015\012"		/* End of Message */
#define EOM_LEN		3
#define EOLM		"\012.\015\012"	/* EOL + EOM */
#define EOLM_LEN	(EOL_LEN + EOM_LEN)
#define FALSE           0
#define TRUE            1
#define DLM             ':'
#define BANNER     "100:Events Server, version .1, June 25, 1990.\n"
#define flush()			fflush(stdout)

#define	max(a, b)	((a) > (b) ? (a) : (b))
#define min(a, b)       ((a) < (b) ? (a) : (b))
#define  NOBODY  -1
#define  TRANS_LOG	"ev.trans.log"
#define  NEXTID_FILE	"ev.next.id"
#define  PROV_FILE	"ev.providers"
#define  ADMIN_FILE	"ev.admin"
#define  VER_FILE	"ev.versions"
#define  MSG_FILE       "ev.msg.file"
#define  LOG_FILE       "ev.log"

#define PROV_LN_SZ    40
#define ADMIN_LN_SZ    40

#define C_FULLFMT	0x1	/* Using full format output */
#define C_BUSY		0x2	/* cconnection is already being serviced */
#define C_TIMEOUT	0x4	/* Connection has timed out */

typedef struct connection	CONN;

struct connection {
	int	c_socket;
	char	*c_hostname;
	int	c_portnum;
	int	c_flags;
	PROCESS c_pid;
	char    *c_uid;
        char    *c_type;
	time_t	c_made;
	time_t	c_last;
	char    sendbuf[BUFSIZ]; /* for now they all use the same input buff */
	char    *sendbuf_pos;
};

#define	send(str)	dosend(str,conn->sendbuf, &(conn->sendbuf_pos), conn->c_socket)
#define	deliver()	dodeliver(conn->sendbuf, &(conn->sendbuf_pos), conn->c_socket)

#define	send_eol()	send(EOL)
#define	send_eom()	send(EOM)
#define	send_eolm()	send(EOLM)


#define	send_msg(s)	send(s), send_eolm()
#define	send_ok()	send_msg("101:OK")
#define	send_nak()	send_msg("UNAUTHORIZED")
#define	send_err()	send_msg("ERROR!")
#define	send_huh()	send_msg("500:HUH?")
/*
extern char	_sendbuf[];
extern char	*_sendbuf_pos;
*/
/************************** EVENT SPECIFIC *****************************/
#define  EVENT_DIR       "/mit/ti_data/events/recs/"
#define  EVENT_FILE	"events_file"
#define  SIZE           2048
typedef struct event      EVENT;

struct event {
  long id;
  long event_date; 
  long purge_date; /* yymmdd */
  long last_changed; /* date time stamp - UNIX fmt */
  int type;   /* we have tables of types, sponsors, & sources */
  int sponsor; 
  int source;
  char  *title;
  long  status; /* cancelled, postponed, tentative, multiday, private, moved */
  EVENT *next;
  EVENT *prev;
};

typedef struct add_event_info ADD_EVENT_INFO;

struct add_event_info {
  char *desc;
  char *location;
  char *speaker;
  char *contact_name;
  char *contact_phone;
  char *contact_add;
  char *start_time;
  char *end_time;
  char *t_price_adv;
  char *t_price_non;
  char *t_price_stu;
  char *t_price_door;
  char *t_price_fac;
  char *t_times;
  char *t_location;
  char *t_conditions;
  long  t_flags;
  char *last_chgd_by;
};

/* values for status field in event record */
#define S_PASSED        0x0001  /* event has already happened  */
#define S_RESCHEDULED   0x0002  /* event has been rescheduled  */
#define S_CANCELLED     0x0004  /* event has been cancelled    */
#define S_TENTATIVE     0x0008  /* event is tentative          */
#define S_MOVED         0x0010  /* event location has changed  */
#define S_MULTIDAY      0x0020  /* part of a multi day event   */
#define S_PRIVATE       0x0040  /* private  */

#define S_UNUSED      0x0080  /* event has already happened */
#define S_UNUSED1     0x0100  /* event has already happened */
#define S_UNUSED2     0x0200  /* event has already happened */
#define S_PASSED3     0x0400  /* event has already happened */

/* transaction types */
#define T_ADD_EVENT       'a'
#define T_QUERY_EVENT     'b'
#define T_FIND            'f'
#define T_IDENTIFY        'i'
#define T_LOAD            'l'
#define T_MODIFY_EVENT    'm'
#define T_QUIT            'q'
#define T_SEND_ALL        's'
#define T_SEND_TABLE      't'
#define T_DEL_REC         'x'
#define T_SAVE            'z'

/* field types */
#define F_T_PRICE_ADV     'a'
#define F_START_TIME      'b'
#define F_DESC            'c'
#define F_DATE            'd' 
#define F_END_TIME        'e'
#define F_T_FLAGS         'f'
#define F_T_PRICE_FAC     'g'
#define F_STATUS          'h'
#define F_ID              'i'
#define F_T_LOCATION      'j'
#define F_T_TIMES         'k'
#define F_LOCATION        'l'
#define F_SPEAKER         'm'
#define F_T_PRICE_NON     'n'
#define F_T_CONDITIONS    'o'
#define F_SPONSOR         'p'
#define F_T_PRICE_STU     'q'
#define F_T_PRICE_DOOR    'r'
#define F_SOURCE          's'
#define F_TITLE           't'
#define F_LAST_CHG_BY     'u'
#define F_CONTACT_NAME    'v'
#define F_CONTACT_ADD     'w'
#define F_CONTACT_PHONE   'x'
#define F_TYPE            'y'
#define F_PURGE_DATE      'z'

/* operators */
#define EQUALS        '='
#define NOT_EQUAL     '#'
#define GREATER_THAN  '>'
#define LESS_THAN     '<'
#define CONTAINS      '@'

/* query types */
#define STRING        'S'
#define FLAG          'F'
#define INTEGER       'I'


/* message numbers */

#define  RET_LIST     221
#define  RET_EVENT    222
#define  RET_TABLE    223 
/********************************************/
typedef struct table_entry   TABLE_ENTRY;

struct table_entry {
  short num;
  char string[32];
};
/* validation table stuff */  

#define  TYPE_FILE	"types"
#define  SPONSOR_FILE	"sponsors"
#define  SOURCE_FILE	"sources"

#define  MAX_TYPES    50
#define  MAX_SPONSORS 300
#define  MAX_SOURCES  100

TABLE_ENTRY type_table[MAX_TYPES];
TABLE_ENTRY sponsor_table[MAX_SPONSORS];
TABLE_ENTRY source_table[MAX_SOURCES];

/**********************************************/
extern void load_events();
extern void save_events();
extern EVENT * find_event();
extern void send_event();
extern void show_all_events(CONN *conn);
extern void send_event_abr(EVENT *event,CONN *conn);
extern void send_table(char fld,CONN *conn);
extern CONN * get_curr_conn();
extern char * get_token(char *str, int num);
extern int  write_rec_to_disk(ADD_EVENT_INFO *rec,long id);
extern void remove_event_entry(); /* from linked list */
extern void add_event_entry();   
 /* to sorted (st_date) linked list return  event id? */

extern int remove_event_file(long id); 
extern int load_table(TABLE_ENTRY *table,char *filename);
extern int test_source(short source_num,long event_id);
extern int get_idnum_from_table(char *str,TABLE_ENTRY *table,int table_size);
extern char * get_value_from_table(int idnum,TABLE_ENTRY *table,int table_size);
extern char * next_field(char **ptr);
extern void  show_event(EVENT *event,long ptr,CONN *conn);
extern long date_from_str(char *str);
extern void date_from_long(long num,char *str);

