2 * Asterisk -- A telephony toolkit for Linux.
4 * Implementation of Inter-Asterisk eXchange
6 * Copyright (C) 1999, Mark Spencer
8 * Mark Spencer <markster@linux-support.net>
10 * This program is free software, distributed under the terms of
11 * the GNU Lesser General Public License (LGPL)
14 #ifndef _ASTERISK_IAX_CLIENT_H
15 #define _ASTERISK_IAX_CLIENT_H
18 /* disable zero-sized array in struct/union warning */
19 #pragma warning(disable:4200)
28 #include "iax2-parser.h"
32 #define IAX_AUTHMETHOD_PLAINTEXT IAX_AUTH_PLAINTEXT
33 #define IAX_AUTHMETHOD_MD5 IAX_AUTH_MD5
35 extern char iax_errstr[];
40 #define IAX_EVENT_CONNECT 0 /* Connect a new call */
41 #define IAX_EVENT_ACCEPT 1 /* Accept a call */
42 #define IAX_EVENT_HANGUP 2 /* Hang up a call */
43 #define IAX_EVENT_REJECT 3 /* Rejected call */
44 #define IAX_EVENT_VOICE 4 /* Voice Data */
45 #define IAX_EVENT_DTMF 5 /* A DTMF Tone */
46 #define IAX_EVENT_TIMEOUT 6 /* Connection timeout... session
47 will be a pointer to free()'d
49 #define IAX_EVENT_LAGRQ 7 /* Lag request -- Internal use only */
50 #define IAX_EVENT_LAGRP 8 /* Lag Measurement. See event.lag */
51 #define IAX_EVENT_RINGA 9 /* Announce we/they are ringing */
52 #define IAX_EVENT_PING 10 /* Ping -- internal use only */
53 #define IAX_EVENT_PONG 11 /* Pong -- internal use only */
54 #define IAX_EVENT_BUSY 12 /* Report a line busy */
55 #define IAX_EVENT_ANSWER 13 /* Answer the line */
57 #define IAX_EVENT_IMAGE 14 /* Send/Receive an image */
58 #define IAX_EVENT_AUTHRQ 15 /* Authentication request */
59 #define IAX_EVENT_AUTHRP 16 /* Authentication reply */
61 #define IAX_EVENT_REGREQ 17 /* Registration request */
62 #define IAX_EVENT_REGACK 18 /* Registration reply */
63 #define IAX_EVENT_URL 19 /* URL received */
64 #define IAX_EVENT_LDCOMPLETE 20 /* URL loading complete */
66 #define IAX_EVENT_TRANSFER 21 /* Transfer has taken place */
68 #define IAX_EVENT_DPREQ 22 /* Dialplan request */
69 #define IAX_EVENT_DPREP 23 /* Dialplan reply */
70 #define IAX_EVENT_DIAL 24 /* Dial on a TBD call */
72 #define IAX_EVENT_QUELCH 25 /* Quelch Audio */
73 #define IAX_EVENT_UNQUELCH 26 /* Unquelch Audio */
75 #define IAX_EVENT_UNLINK 27 /* Unlink */
76 #define IAX_EVENT_LINKREJECT 28 /* Link Rejection */
77 #define IAX_EVENT_TEXT 29 /* Text Frame :-) */
78 #define IAX_EVENT_REGREJ 30 /* Registration reply */
79 #define IAX_EVENT_LINKURL 31 /* Unlink */
80 #define IAX_EVENT_CNG 32 /* Comfort-noise (almost silence) */
81 #define IAX_EVENT_POKE 33
82 #define IAX_EVENT_VIDEO 34 /* Send/receive video */
85 /* moved from iax.c to support attended transfer */
86 #define IAX_EVENT_REREQUEST 999
87 #define IAX_EVENT_TXREPLY 1000
88 #define IAX_EVENT_TXREJECT 1001
89 #define IAX_EVENT_TXACCEPT 1002
90 #define IAX_EVENT_TXREADY 1003
93 * Null event. We use it to notify back the caller that a frame has been
94 * received and is queued for delivery
95 * Applciations should simply ignore it
97 #define IAX_EVENT_NULL 65535
99 #define IAX_SCHEDULE_FUZZ 0 /* ms of fuzz to drop */
101 #if defined(WIN32) || defined(_WIN32_WCE)
102 #if defined(_MSC_VER)
103 typedef int (__stdcall *iax_sendto_t)(SOCKET, const void *, size_t, int,
104 const struct sockaddr *, socklen_t);
105 typedef int (__stdcall *iax_recvfrom_t)(SOCKET, void *, size_t, int,
106 struct sockaddr *, socklen_t *);
108 typedef int PASCAL (*iax_sendto_t)(SOCKET, const char *, int, int,
109 const struct sockaddr *, int);
110 typedef int PASCAL (*iax_recvfrom_t)(SOCKET, char *, int, int,
111 struct sockaddr *, int *);
114 typedef int (*iax_sendto_t)(int, const void *, size_t, int,
115 const struct sockaddr *, socklen_t);
116 typedef int (*iax_recvfrom_t)(int, void *, size_t, int,
117 struct sockaddr *, socklen_t *);
121 int etype; /* Type of event */
122 int subclass; /* Subclass data (event specific) */
123 unsigned int ts; /* Timestamp */
124 struct iax_session *session; /* Applicable session */
125 int datalen; /* Length of raw data */
126 struct iax_ies ies; /* IE's for IAX2 frames */
127 unsigned char data[0]; /* Raw data if applicable */
130 #if defined(__cplusplus)
135 /* All functions return 0 on success and -1 on failure unless otherwise
138 /* Called to initialize IAX structures and sockets. Returns actual
139 portnumber (which it will try preferred portno first, but if not
140 take what it can get */
141 extern int iax_init(int preferredportno);
143 /* Get filedescriptor for IAX to use with select or gtk_input_add */
144 extern int iax_get_fd(void);
146 /* Find out how many milliseconds until the next scheduled event */
147 extern int iax_time_to_next_event(void);
149 /* Generate a new IAX session */
150 extern struct iax_session *iax_session_new(void);
152 /* Return exactly one iax event (if there is one pending). If blocking is
153 non-zero, IAX will block until some event is received */
154 extern struct iax_event *iax_get_event(int blocking);
157 extern int iax_auth_reply(struct iax_session *session, char *password,
158 char *challenge, int methods);
161 extern void iax_event_free(struct iax_event *event);
165 /* Front ends for sending events */
166 extern int iax_send_dtmf(struct iax_session *session, char digit);
167 extern int iax_send_voice(struct iax_session *session, int format, unsigned char *data, int datalen, int samples);
168 extern int iax_send_cng(struct iax_session *session, int level, unsigned char *data, int datalen);
169 extern int iax_send_image(struct iax_session *session, int format, unsigned char *data, int datalen);
170 extern int iax_send_url(struct iax_session *session, const char *url, int link);
171 extern int iax_send_text(struct iax_session *session, const char *text);
172 extern int iax_send_ping(struct iax_session *session);
173 extern int iax_load_complete(struct iax_session *session);
174 extern int iax_reject(struct iax_session *session, char *reason);
175 extern int iax_busy(struct iax_session *session);
176 extern int iax_congestion(struct iax_session *session);
177 extern int iax_hangup(struct iax_session *session, char *byemsg);
178 extern int iax_call(struct iax_session *session, const char *cidnum, const char *cidname, const char *ich, const char *lang, int wait, int format, int capability);
179 extern int iax_accept(struct iax_session *session, int format);
180 extern int iax_answer(struct iax_session *session);
181 extern int iax_sendurl(struct iax_session *session, char *url);
182 extern int iax_send_unlink(struct iax_session *session);
183 extern int iax_send_link_reject(struct iax_session *session);
184 extern int iax_ring_announce(struct iax_session *session);
185 extern struct sockaddr_in iax_get_peer_addr(struct iax_session *session);
186 extern int iax_register(struct iax_session *session, const char *hostname, const char *peer, const char *secret, int refresh);
187 extern int iax_unregister(struct iax_session *session, const char *hostname, const char *peer, const char *secret, const char *reason);
188 extern int iax_lag_request(struct iax_session *session);
189 extern int iax_dial(struct iax_session *session, char *number); /* Dial on a TBD call */
190 extern int iax_dialplan_request(struct iax_session *session, char *number); /* Request dialplan status for number */
191 extern int iax_quelch(struct iax_session *session);
192 extern int iax_unquelch(struct iax_session * session);
193 extern int iax_transfer(struct iax_session *session, const char *number);
194 extern int iax_quelch_moh(struct iax_session *session, int MOH);
195 extern int iax_send_video(struct iax_session *session, int format, unsigned char *data, int datalen, int fullframe);
196 extern int iax_send_video_trunk(struct iax_session *session, int format, char *data, int datalen, int fullframe, int ntrunk);
198 extern void iax_destroy(struct iax_session * session);
200 extern void iax_enable_debug(void);
201 extern void iax_disable_debug(void);
203 extern struct timeval iax_tvnow(void);
205 /* For attended transfer, application create a new session,
206 * make a call on the new session.
207 * On answer of the new session, call iax_setup_transfer and wait for
208 * IAX_EVENT_TXREADY when both sides are completed succefully or
209 * IAX_EVENT_TXREJECT for either side.
210 * If there are music on hold the it will be stopped by this library.
212 extern int iax_setup_transfer(struct iax_session *s0, struct iax_session *s1);
223 /* fills in rtt, and an iax_netstat structure for each of local/remote directions of call */
224 extern int iax_get_netstats(struct iax_session *s, int *rtt, struct iax_netstat *local, struct iax_netstat *remote);
227 extern void iax_set_private(struct iax_session *s, void *pvt);
228 extern void *iax_get_private(struct iax_session *s);
229 extern void iax_set_sendto(struct iax_session *s, iax_sendto_t sendto);
231 /* to use application networking instead of internal, set call this instead of iax_init,
232 * and pass in sendto and recvfrom replacements. blocking reads may not be implemented */
233 extern void iax_set_networking(iax_sendto_t st, iax_recvfrom_t rf);
235 /* destroy an iax session */
236 extern void iax_session_destroy(struct iax_session **session);
238 /* To control use of jitter buffer for video event */
239 int iax_video_bypass_jitter(struct iax_session*, int );
241 /* Handle externally received frames */
242 struct iax_event *iax_net_process(unsigned char *buf, int len, struct sockaddr_in *sin);
243 extern unsigned int iax_session_get_capability(struct iax_session *s);
244 extern char iax_pref_codec_add(struct iax_session *session, unsigned int format);
245 extern void iax_pref_codec_del(struct iax_session *session, unsigned int format);
246 extern int iax_pref_codec_get(struct iax_session *session, unsigned int *array, int len);
248 /* Fine tune jitterbuffer */
249 extern void iax_set_jb_target_extra( long value );
251 /* Portable 'decent' random number generation */
252 extern void iax_seed_random(void);
253 extern int iax_random(void);
255 #if defined(__cplusplus)
259 #endif /* _ASTERISK_IAX_CLIENT_H */