/*****************************************************************************\ ** ** ** 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);