/*   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;
};

#define	send(str)	dosend(str, _sendbuf, &_sendbuf_pos, cur_sock)
#define	deliver()	dodeliver(_sendbuf, &_sendbuf_pos, cur_sock)

#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[40];
  char contact_phone[20];
  char contact_address[100];
  long start_time;
  long end_time;
  char ticket_info[50]; /* just a place holder until all fields defined */
  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 */
#define S_PASSED4     0x0800  /* event has already happened */
#define S_PASSED5     0x1000  /* event has already happened */
#define S_PASSED6     0x2000  /* event has already happened */
#define S_PASSED7     0x4000  /* event has already happened */
#define S_PASSED8     0x8000  /* 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_ID       'i'
#define F_TITLE    't'
#define F_SOURCE   's'
#define F_SPONSOR  'p'
#define F_TYPE     'y'
#define F_DATE     'd' 
#define F_DESC     'c'
#define F_LOCATION 'l'
#define F_SPEAKER  'm'
#define F_MODIFIED 'u' 

/* 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'

/********************************************/
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();
extern void send_event_abr();
extern void send_table(char fld);
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);
extern long date_from_str(char *str);
extern void date_from_long(long num,char *str);

