/*****************************************************************************\
**                                                                           **
** PBX4Linux                                                                 **
**                                                                           **
**---------------------------------------------------------------------------**
** Copyright: Andreas Eversberg                                              **
**                                                                           **
** call header file for pbx calls                                            **
**                                                                           **
\*****************************************************************************/ 


/* call
 *
 * calls connect interfaces together
 * calls are linked in a chain
 * interfaces can have 0, 1 or more references to a call
 * the call can have many references to interfaces
 * calls receive and send messages
 */

#define RECORD_BUFFER_SIZE	16000

enum { /* relation types */
	RELATION_TYPE_CALLING,	/* initiator of a call */
	RELATION_TYPE_SETUP,	/* interface which is to be set up */
	RELATION_TYPE_CONNECT,	/* interface is connected */
};

enum { /* relation audio state */
	CHANNEL_STATE_CONNECT,	/* endpoint is connected to the call voice transmission in both dirs */
	CHANNEL_STATE_HOLD,	/* endpoint is on hold state, no audio */
};

enum { /* states that results from last notification */
	NOTIFY_STATE_ACTIVE, /* just the normal case, the party is active */
	NOTIFY_STATE_SUSPEND, /* the party is inactive, because she has parked */
	NOTIFY_STATE_HOLD, /* the party is inactive, because she holds the line */
	NOTIFY_STATE_CONFERENCE, /* the parties joined a conference */
};


struct call_relation { /* relation to an interface */
	struct call_relation *next;	/* next node */
	int type;			/* type of relation */
	unsigned long epoint_id;	/* interface to link call to */
	int channel_state;		/* if audio is available */
	int rx_state;			/* current state of what we received from endpoint */
	int tx_state;			/* current state of what we sent to endpoint */
};

class CallPBX : public Call
{
	public:
	CallPBX(class Endpoint *epoint);
	~CallPBX();
	void message_epoint(unsigned long epoint_id, int message, union parameter *param);
	int handler(void);
	void release(unsigned long epoint_id, int hold, int location, int cause);

	char c_caller[32];		/* caller number */
	char c_caller_id[32];		/* caller id to signal */
	char c_dialed[1024];		/* dial string of (all) number(s) */
	char c_todial[32];		/* overlap dialing (part not signalled yet) */
	
	int c_updatebridge;		/* bridge must be updated */
	struct call_relation *c_relation; /* list of endpoints that are related to the call */

	int c_partyline;		/* if set, call is conference room */

	void bridge(void);
	void bridge_data(unsigned long epoint_from, struct call_relation *relation_from, union parameter *param);
	void remove_relation(struct call_relation *relation);
	struct call_relation *add_relation(void);
	int out_setup(unsigned long epoint_id, int message, union parameter *param, char *newnumber);
}; 

void callpbx_debug(class CallPBX *callpbx, char *function);
int callpbx_countrelations(unsigned long call_id);
int track_notify(int oldstate, int notify);

