summaryrefslogtreecommitdiffstats
path: root/chan_lcr.h
blob: 8caa48e07cd5f08ff2edf394b36284bc6f1ba9e0 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
/*****************************************************************************\
**                                                                           **
** Linux Call Router                                                         **
**                                                                           **
**---------------------------------------------------------------------------**
** Copyright: Andreas Eversberg                                              **
**                                                                           **
** Asterisk socket client header                                             **
**                                                                           **
\*****************************************************************************/

/* structure for all calls */
struct bchannel;
struct chan_call {
	struct chan_call	*next;	/* link to next call instance */
	int			state;	/* current call state CHAN_LCR_STATE */
	unsigned int		ref;	/* callref for this channel */
	int			ref_was_assigned;
	void			*ast;	/* current asterisk channel */
	int			pbx_started;
					/* indicates if pbx que is available */
	struct bchannel		*bchannel;
					/* reference to bchannel, if set */
	int			audiopath;
					/* audio is available */
	int			cause, location;
					/* store cause from lcr */
	char			dialque[64];
					/* queue dialing prior setup ack */
	char			oad[64];/* caller id in number format */

	struct caller_info	callerinfo;
	struct redir_info	redirinfo;
	struct connect_info	connectinfo;
					/* store connectinfo form lcr */
	int			bridge_id;
					/* current ID or 0 */
	struct chan_call	*bridge_call;
					/* remote instance or NULL */
	int			pipe[2];
					/* pipe for receive data */
	unsigned char		read_buff[1024];
					/* read buffer for frame */
	struct ast_frame	read_fr;
					/* frame for read */
	char			interface[32];
					/* LCR interface name for setup */
	char			dialstring[64];
					/* cached dial string for setup */
#ifndef AST_PARTY_CALLER
        char                    cid_num[64]; /* cached cid for setup */
	char                    cid_name[64]; /* cached cid for setup */
	char                    cid_rdnis[64]; /* cached cid for setup */
#endif
	char			display[128];
					/* display for setup */
	int			dsp_dtmf;
					/* decode dtmf by dsp */
	int                     inband_dtmf; /* generate dtmf tones, if
					      requested by asterisk */
        int                     rebuffer; /* send only 160 bytes frames
					     to asterisk */

	int			framepos; /* send only 160 bytes frames to asterisk */
	
        int                     on_hold; /* track hold management, since
					    sip phones sometimes screw it up */
	char			pipeline[256];
					/* echo cancel pipeline by option */
	int			tx_gain, rx_gain;
					/* gain by option */
	int			keypad;
					/* use keypad to dial number */
	unsigned char		bf_key[56];
	int			bf_len;	/* blowfish crypt key */
	struct ast_dsp		*dsp; /* ast dsp processor for fax/tone detection */
	struct ast_trans_pvt 	*trans; /* Codec translation path as fax/tone detection requires slin */
	int			nodsp, nodsp_queue, hdlc, faxdetect;
					/* flags for bchannel mode */
	char			queue_string[64];
					/* queue for asterisk */
	int			has_pattern;
					/* pattern are available, PROGRESS has been indicated */
		
};

enum {
	CHAN_LCR_STATE_IN_PREPARE = 0,
	CHAN_LCR_STATE_IN_SETUP,
	CHAN_LCR_STATE_IN_DIALING,
	CHAN_LCR_STATE_IN_PROCEEDING,
	CHAN_LCR_STATE_IN_ALERTING,
	CHAN_LCR_STATE_OUT_PREPARE,
	CHAN_LCR_STATE_OUT_SETUP,
	CHAN_LCR_STATE_OUT_DIALING,
	CHAN_LCR_STATE_OUT_PROCEEDING,
	CHAN_LCR_STATE_OUT_ALERTING,
	CHAN_LCR_STATE_CONNECT,
	CHAN_LCR_STATE_IN_DISCONNECT,
	CHAN_LCR_STATE_OUT_DISCONNECT,
	CHAN_LCR_STATE_RELEASE,
};

#define CHAN_LCR_STATE static const struct chan_lcr_state { \
	char *name; \
	char *meaning; \
} chan_lcr_state[] = { \
	{ "IN_PREPARE", \
	  "New call from ISDN is waiting for setup." }, \
	{ "IN_SETUP", \
	  "Call from ISDN is currently set up." }, \
	{ "IN_DIALING", \
	  "Call from ISDN is currently waiting for digits to be dialed." }, \
	{ "IN_PROCEEDING", \
	  "Call from ISDN is complete and proceeds to ring." }, \
	{ "IN_ALERTING", \
	  "Call from ISDN is ringing." }, \
	{ "OUT_PREPARE", \
	  "New call to ISDN is wating for setup." }, \
	{ "OUT_SETUP", \
	  "Call to ISDN is currently set up." }, \
	{ "OUT_DIALING", \
	  "Call to ISDN is currently waiting for digits to be dialed." }, \
	{ "OUT_PROCEEDING", \
	  "Call to ISDN is complete and proceeds to ring." }, \
	{ "OUT_ALERTING", \
	  "Call to ISDN is ringing." }, \
	{ "CONNECT", \
	  "Call has been answered." }, \
	{ "IN_DISCONNECT", \
	  "Call has been hung up on ISDN side." }, \
	{ "OUT_DISCONNECT", \
	  "Call has been hung up on Asterisk side." }, \
	{ "RELEASE", \
	  "Call is waiting for complete release." }, \
};


#define SOCKET_RETRY_TIMER	5

#define CERROR(call, ast, arg...) chan_lcr_log(__LOG_ERROR, __FILE__, __LINE__,  __FUNCTION__, call, ast, ##arg)
#define CDEBUG(call, ast, arg...) chan_lcr_log(__LOG_NOTICE, __FILE__, __LINE__,  __FUNCTION__, call, ast, ##arg)
void chan_lcr_log(int type, const char *file, int line, const char *function,  struct chan_call *call, struct ast_channel *ast, const char *fmt, ...);
extern unsigned char flip_bits[256];
void lcr_in_dtmf(struct chan_call *call, int val);