private.h 31.7 KB
Newer Older
aymeric's avatar
aymeric committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
/***************************************************************************
 *            private.h
 *
 *  Mon Jun 13 14:23:23 2005
 *  Copyright  2005  Simon Morlat
 *  Email simon dot morlat at linphone dot org
 ****************************************************************************/

/*
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 */
24

aymeric's avatar
aymeric committed
25 26
#ifndef _PRIVATE_H
#define _PRIVATE_H
Guillaume Beraudo's avatar
Guillaume Beraudo committed
27
#ifdef __cplusplus
28

Guillaume Beraudo's avatar
Guillaume Beraudo committed
29 30
extern "C" {
#endif
aymeric's avatar
aymeric committed
31
#include "linphonecore.h"
Yann Diorcet's avatar
Yann Diorcet committed
32
#include "linphonefriend.h"
jehan's avatar
jehan committed
33
#include "linphone_tunnel.h"
Simon Morlat's avatar
Simon Morlat committed
34
#include "linphonecore_utils.h"
Sylvain Berfini's avatar
Sylvain Berfini committed
35
#include "sal/sal.h"
Yann Diorcet's avatar
Yann Diorcet committed
36
#include "sipsetup.h"
37
#include "quality_reporting.h"
aymeric's avatar
aymeric committed
38

39 40 41
#include <belle-sip/object.h>
#include <belle-sip/dict.h>

aymeric's avatar
aymeric committed
42 43 44
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
45
#include "mediastreamer2/ice.h"
46
#include "mediastreamer2/mediastream.h"
Simon Morlat's avatar
Simon Morlat committed
47
#include "mediastreamer2/msconference.h"
Yann Diorcet's avatar
Yann Diorcet committed
48
#ifdef BUILD_UPNP
Yann Diorcet's avatar
Yann Diorcet committed
49
#include "upnp.h"
50
#endif //BUILD_UPNP
aymeric's avatar
aymeric committed
51

Margaux Clerc's avatar
Margaux Clerc committed
52 53 54 55
#ifdef MSG_STORAGE_ENABLED
#include "sqlite3.h"
#endif

56
#ifndef LIBLINPHONE_VERSION
aymeric's avatar
aymeric committed
57 58 59
#define LIBLINPHONE_VERSION LINPHONE_VERSION
#endif

60
#ifndef PACKAGE_SOUND_DIR
aymeric's avatar
aymeric committed
61 62 63
#define PACKAGE_SOUND_DIR "."
#endif

64 65 66 67
#ifndef PACKAGE_DATA_DIR
#define PACKAGE_DATA_DIR "."
#endif

aymeric's avatar
aymeric committed
68 69 70
#ifdef HAVE_GETTEXT
#include <libintl.h>
#ifndef _
Simon Morlat's avatar
Simon Morlat committed
71
#define _(String) dgettext(GETTEXT_PACKAGE,String)
aymeric's avatar
aymeric committed
72 73
#endif
#else
smorlat's avatar
smorlat committed
74
#ifndef _
aymeric's avatar
aymeric committed
75 76
#define _(something)	(something)
#endif
77 78 79
#ifndef ngettext
#define ngettext(singular, plural, number)	(((number)==1)?(singular):(plural))
#endif
smorlat's avatar
smorlat committed
80
#endif
aymeric's avatar
aymeric committed
81

82
struct _LinphoneCallParams{
83
	LinphoneCall *referer; /*in case this call creation is consecutive to an incoming transfer, this points to the original call */
84
	int audio_bw; /* bandwidth limit for audio stream */
Simon Morlat's avatar
Simon Morlat committed
85
	LinphoneMediaEncryption media_encryption;
Simon Morlat's avatar
Simon Morlat committed
86 87
	PayloadType *audio_codec; /*audio codec currently in use */
	PayloadType *video_codec; /*video codec currently in use */
88 89
	MSVideoSize sent_vsize; /* Size of the video currently being sent */
	MSVideoSize recv_vsize; /* Size of the video currently being received */
Simon Morlat's avatar
Simon Morlat committed
90 91 92 93
	int down_bw;
	int up_bw;
	int down_ptime;
	int up_ptime;
Simon Morlat's avatar
Simon Morlat committed
94
	char *record_file;
Simon Morlat's avatar
Simon Morlat committed
95
	char *session_name;
96
	SalCustomHeader *custom_headers;
97
	bool_t has_video;
98
	bool_t real_early_media; /*send real media even during early media (for outgoing calls)*/
Simon Morlat's avatar
Simon Morlat committed
99
	bool_t in_conference; /*in conference mode */
jehan's avatar
jehan committed
100
	bool_t low_bandwidth;
jehan's avatar
jehan committed
101
	LinphonePrivacyMask privacy;
102
};
103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118

struct _LinphoneCallLog{
	struct _LinphoneCore *lc;
	LinphoneCallDir dir; /**< The direction of the call*/
	LinphoneCallStatus status; /**< The status of the call*/
	LinphoneAddress *from; /**<Originator of the call as a LinphoneAddress object*/
	LinphoneAddress *to; /**<Destination of the call as a LinphoneAddress object*/
	char start_date[128]; /**<Human readable string containing the start date*/
	int duration; /**<Duration of the call in seconds*/
	char *refkey;
	void *user_pointer;
	rtp_stats_t local_stats;
	rtp_stats_t remote_stats;
	float quality;
	time_t start_date_time; /**Start date of the call in seconds as expressed in a time_t */
	char* call_id; /**unique id of a call*/
119

120
	reporting_session_report_t * reports[2]; /**<Quality statistics of the call (rfc6035) */
121 122 123
	bool_t video_enabled;
};

124 125
typedef struct _CallCallbackObj
{
126 127
	LinphoneCallCbFunc _func;
	void * _user_data;
128
}CallCallbackObj;
129

130 131
static const int linphone_call_magic=0x3343;

Simon Morlat's avatar
Simon Morlat committed
132 133 134 135 136
typedef enum _LinphoneChatMessageDir{
	LinphoneChatMessageIncoming,
	LinphoneChatMessageOutgoing
} LinphoneChatMessageDir;

jehan's avatar
jehan committed
137
struct _LinphoneChatMessage {
138
	belle_sip_object_t base;
jehan's avatar
jehan committed
139
	LinphoneChatRoom* chat_room;
Simon Morlat's avatar
Simon Morlat committed
140 141
	LinphoneChatMessageDir dir;
	char* message;
142
	LinphoneChatMessageStateChangedCb cb;
jehan's avatar
jehan committed
143 144
	void* cb_ud;
	void* message_userdata;
145
	char* external_body_url;
Simon Morlat's avatar
Simon Morlat committed
146 147
	LinphoneAddress *from;
	LinphoneAddress *to;
148
	time_t time;
149
	SalCustomHeader *custom_headers;
Margaux Clerc's avatar
Margaux Clerc committed
150
	LinphoneChatMessageState state;
Simon Morlat's avatar
Simon Morlat committed
151
	bool_t is_read;
152
	unsigned int storage_id;
153
	SalOp *op;
jehan's avatar
jehan committed
154
};
155

156 157
BELLE_SIP_DECLARE_VPTR(LinphoneChatMessage);

158 159 160 161 162 163
typedef struct StunCandidate{
	char addr[64];
	int port;
}StunCandidate;


164 165 166 167 168
typedef struct _PortConfig{
	int rtp_port;
	int rtcp_port;
}PortConfig;

169
struct _LinphoneCall
smorlat's avatar
smorlat committed
170
{
171
	int magic; /*used to distinguish from proxy config*/
smorlat's avatar
smorlat committed
172
	struct _LinphoneCore *core;
173
	SalErrorInfo non_op_error;
174
	int af; /*the address family to prefer for RTP path, guessed from signaling path*/
175 176
	LinphoneCallDir dir;
	SalMediaDescription *biggestdesc; /*media description with all already proposed streams, used to remember the mapping of streams*/
177 178
	SalMediaDescription *localdesc;
	SalMediaDescription *resultdesc;
Simon Morlat's avatar
Simon Morlat committed
179 180
	struct _RtpProfile *audio_profile;
	struct _RtpProfile *video_profile;
smorlat's avatar
smorlat committed
181
	struct _LinphoneCallLog *log;
182
	SalOp *op;
183
	SalOp *ping_op;
smorlat's avatar
smorlat committed
184 185
	char localip[LINPHONE_IPADDR_SIZE]; /* our best guess for local ipaddress for this call */
	time_t media_start_time; /*time at which it was accepted, media streams established*/
186 187
	LinphoneCallState state;
	LinphoneCallState prevstate;
188
	LinphoneCallState transfer_state; /*idle if no transfer*/
189
	LinphoneProxyConfig *dest_proxy;
190
	int refcnt;
191
	void * user_pointer;
192 193
	PortConfig media_ports[2];
	MSMediaStreamSessions sessions[2]; /*the rtp, srtp, zrtp contexts for each stream*/
194
	StunCandidate ac,vc; /*audio video ip/port discovered by STUN*/
195 196
	struct _AudioStream *audiostream;  /**/
	struct _VideoStream *videostream;
197

Simon Morlat's avatar
Simon Morlat committed
198
	MSAudioEndpoint *endpoint; /*used for conferencing*/
Simon Morlat's avatar
Simon Morlat committed
199
	char *refer_to;
200
	LinphoneCallParams params;
201
	LinphoneCallParams current_params;
202
	LinphoneCallParams remote_params;
Simon Morlat's avatar
Simon Morlat committed
203
	int up_bw; /*upload bandwidth setting at the time the call is started. Used to detect if it changes during a call */
Simon Morlat's avatar
Simon Morlat committed
204
	int audio_bw;	/*upload bandwidth used by audio */
205 206 207 208 209
	OrtpEvQueue *audiostream_app_evq;
	char *auth_token;
	OrtpEvQueue *videostream_app_evq;
	CallCallbackObj nextVideoFrameDecoded;
	LinphoneCallStats stats[2];
Yann Diorcet's avatar
Yann Diorcet committed
210 211 212
#ifdef BUILD_UPNP
	UpnpSession *upnp_session;
#endif //BUILD_UPNP
213 214
	IceSession *ice_session;
	int ping_time;
215 216
	unsigned int remote_session_id;
	unsigned int remote_session_ver;
217
	LinphoneCall *referer; /*when this call is the result of a transfer, referer is set to the original call that caused the transfer*/
218
	LinphoneCall *transfer_target;/*if this call received a transfer request, then transfer_target points to the new call created to the refer target */
219
	int localdesc_changed;/*not a boolean, contains a mask representing changes*/
220

221
	bool_t refer_pending;
222
	bool_t expect_media_in_ack;
223
	bool_t audio_muted;
224
	bool_t camera_enabled;
225

226
	bool_t all_muted; /*this flag is set during early medias*/
227
	bool_t playing_ringbacktone;
228
	bool_t owns_call_log;
229
	bool_t ringing_beep; /* whether this call is ringing through an already existent current call*/
230

Simon Morlat's avatar
Simon Morlat committed
231
	bool_t auth_token_verified;
232
	bool_t defer_update;
233

234
	bool_t was_automatically_paused;
235
	bool_t ping_replied;
Simon Morlat's avatar
Simon Morlat committed
236
	bool_t record_active;
237
	bool_t paused_by_app;
238
};
smorlat's avatar
smorlat committed
239

240

Simon Morlat's avatar
Simon Morlat committed
241
LinphoneCall * linphone_call_new_outgoing(struct _LinphoneCore *lc, LinphoneAddress *from, LinphoneAddress *to, const LinphoneCallParams *params, LinphoneProxyConfig *cfg);
242
LinphoneCall * linphone_call_new_incoming(struct _LinphoneCore *lc, LinphoneAddress *from, LinphoneAddress *to, SalOp *op);
243
void linphone_call_set_state(LinphoneCall *call, LinphoneCallState cstate, const char *message);
jehan's avatar
jehan committed
244
void linphone_call_set_contact_op(LinphoneCall* call);
smorlat's avatar
smorlat committed
245
/* private: */
246
LinphoneCallLog * linphone_call_log_new(LinphoneCall *call, LinphoneAddress *local, LinphoneAddress * remote);
247
void linphone_call_log_completed(LinphoneCall *call);
smorlat's avatar
smorlat committed
248
void linphone_call_log_destroy(LinphoneCallLog *cl);
249
void linphone_call_set_transfer_state(LinphoneCall* call, LinphoneCallState state);
smorlat's avatar
smorlat committed
250

aymeric's avatar
aymeric committed
251 252 253 254
void linphone_auth_info_write_config(struct _LpConfig *config, LinphoneAuthInfo *obj, int pos);

void linphone_core_update_proxy_register(LinphoneCore *lc);
void linphone_core_refresh_subscribes(LinphoneCore *lc);
255
int linphone_core_abort_call(LinphoneCore *lc, LinphoneCall *call, const char *error);
jehan's avatar
jehan committed
256
const char *linphone_core_get_nat_address_resolved(LinphoneCore *lc);
aymeric's avatar
aymeric committed
257

258
int linphone_proxy_config_send_publish(LinphoneProxyConfig *cfg, LinphonePresenceModel *presence);
259
void linphone_proxy_config_set_state(LinphoneProxyConfig *cfg, LinphoneRegistrationState rstate, const char *message);
260
void linphone_proxy_config_stop_refreshing(LinphoneProxyConfig *obj);
261
void linphone_proxy_config_write_all_to_config_file(LinphoneCore *lc);
jehan's avatar
jehan committed
262 263 264 265 266
/*
 * returns service route as defined in as defined by rfc3608, might be a list instead of just one.
 * Can be NULL
 * */
const LinphoneAddress* linphone_proxy_config_get_service_route(const LinphoneProxyConfig* cfg);
267

268
void linphone_friend_close_subscriptions(LinphoneFriend *lf);
269
void linphone_friend_update_subscribes(LinphoneFriend *fr, LinphoneProxyConfig *cfg, bool_t only_when_registered);
270
void linphone_friend_notify(LinphoneFriend *lf, LinphonePresenceModel *presence);
271 272
LinphoneFriend *linphone_find_friend_by_inc_subscribe(MSList *l, SalOp *op);
LinphoneFriend *linphone_find_friend_by_out_subscribe(MSList *l, SalOp *op);
Ghislain MARY's avatar
Ghislain MARY committed
273
MSList *linphone_find_friend_by_address(MSList *fl, const LinphoneAddress *addr, LinphoneFriend **lf);
274 275
bool_t linphone_core_should_subscribe_friends_only_when_registered(const LinphoneCore *lc);
void linphone_core_update_friends_subscriptions(LinphoneCore *lc, LinphoneProxyConfig *cfg, bool_t only_when_registered);
276

277
int parse_hostname_to_addr(const char *server, struct sockaddr_storage *ss, socklen_t *socklen, int default_port);
Simon Morlat's avatar
Simon Morlat committed
278

279
void linphone_core_get_local_ip(LinphoneCore *lc, int af, char *result);
aymeric's avatar
aymeric committed
280 281 282 283
bool_t host_has_ipv6_network();
bool_t lp_spawn_command_line_sync(const char *command, char **result,int *command_ret);

static inline int get_min_bandwidth(int dbw, int ubw){
Simon Morlat's avatar
Simon Morlat committed
284 285
	if (dbw<=0) return ubw;
	if (ubw<=0) return dbw;
aymeric's avatar
aymeric committed
286 287 288 289 290 291 292 293 294
	return MIN(dbw,ubw);
}

static inline bool_t bandwidth_is_greater(int bw1, int bw2){
	if (bw1<0) return TRUE;
	else if (bw2<0) return FALSE;
	else return bw1>=bw2;
}

295 296 297 298 299
static inline int get_video_bandwidth(int total, int audio){
	if (total<=0) return 0;
	return total-audio-10;
}

smorlat's avatar
smorlat committed
300 301 302 303 304 305 306 307 308
static inline void set_string(char **dest, const char *src){
	if (*dest){
		ms_free(*dest);
		*dest=NULL;
	}
	if (src)
		*dest=ms_strdup(src);
}

aymeric's avatar
aymeric committed
309 310
#define PAYLOAD_TYPE_ENABLED	PAYLOAD_TYPE_USER_FLAG_0

311 312
void linphone_process_authentication(LinphoneCore* lc, SalOp *op);
void linphone_authentication_ok(LinphoneCore *lc, SalOp *op);
313
void linphone_subscription_new(LinphoneCore *lc, SalOp *op, const char *from);
314
void linphone_core_send_presence(LinphoneCore *lc, LinphonePresenceModel *presence);
315
void linphone_notify_parse_presence(SalOp *op, const char *content_type, const char *content_subtype, const char *body, SalPresenceModel **result);
316
void linphone_notify_convert_presence_to_xml(SalOp *op, SalPresenceModel *presence, const char *contact, char **content);
317
void linphone_notify_recv(LinphoneCore *lc, SalOp *op, SalSubscribeStatus ss, SalPresenceModel *model);
318
void linphone_proxy_config_process_authentication_failure(LinphoneCore *lc, SalOp *op);
aymeric's avatar
aymeric committed
319

320 321
void linphone_subscription_answered(LinphoneCore *lc, SalOp *op);
void linphone_subscription_closed(LinphoneCore *lc, SalOp *op);
aymeric's avatar
aymeric committed
322

323
void linphone_core_update_allocated_audio_bandwidth(LinphoneCore *lc);
Simon Morlat's avatar
Simon Morlat committed
324
void linphone_core_update_allocated_audio_bandwidth_in_call(LinphoneCall *call, const PayloadType *pt);
325

326
int linphone_core_run_stun_tests(LinphoneCore *lc, LinphoneCall *call);
327 328
void linphone_core_resolve_stun_server(LinphoneCore *lc);
const struct addrinfo *linphone_core_get_stun_server_addrinfo(LinphoneCore *lc);
Simon Morlat's avatar
Simon Morlat committed
329
void linphone_core_adapt_to_network(LinphoneCore *lc, int ping_time_ms, LinphoneCallParams *params);
330
int linphone_core_gather_ice_candidates(LinphoneCore *lc, LinphoneCall *call);
331
void linphone_core_update_ice_state_in_call_stats(LinphoneCall *call);
332 333
void linphone_core_update_local_media_description_from_ice(SalMediaDescription *desc, IceSession *session);
void linphone_core_update_ice_from_remote_media_description(LinphoneCall *call, const SalMediaDescription *md);
334
bool_t linphone_core_media_description_contains_video_stream(const SalMediaDescription *md);
335
bool_t linphone_core_media_description_has_srtp(const SalMediaDescription *md);
aymeric's avatar
aymeric committed
336

337
void linphone_core_send_initial_subscribes(LinphoneCore *lc);
338
void linphone_core_write_friends_config(LinphoneCore* lc);
smorlat's avatar
smorlat committed
339 340 341
void linphone_friend_write_to_config_file(struct _LpConfig *config, LinphoneFriend *lf, int index);
LinphoneFriend * linphone_friend_new_from_config_file(struct _LinphoneCore *lc, int index);

smorlat's avatar
smorlat committed
342
void linphone_proxy_config_update(LinphoneProxyConfig *cfg);
343
void linphone_proxy_config_get_contact(LinphoneProxyConfig *cfg, const char **ip, int *port);
Simon Morlat's avatar
Simon Morlat committed
344
LinphoneProxyConfig * linphone_core_lookup_known_proxy(LinphoneCore *lc, const LinphoneAddress *uri);
345
const char *linphone_core_find_best_identity(LinphoneCore *lc, const LinphoneAddress *to);
346
int linphone_core_get_local_ip_for(int type, const char *dest, char *result);
347

smorlat's avatar
smorlat committed
348 349 350
LinphoneProxyConfig *linphone_proxy_config_new_from_config_file(struct _LpConfig *config, int index);
void linphone_proxy_config_write_to_config_file(struct _LpConfig* config,LinphoneProxyConfig *obj, int index);

351 352
int linphone_proxy_config_normalize_number(LinphoneProxyConfig *cfg, const char *username, char *result, size_t result_len);

Simon Morlat's avatar
Simon Morlat committed
353
void linphone_core_message_received(LinphoneCore *lc, SalOp *op, const SalMessage *msg);
354
void linphone_core_is_composing_received(LinphoneCore *lc, SalOp *op, const SalIsComposing *is_composing);
355

Yann Diorcet's avatar
Yann Diorcet committed
356
void linphone_call_init_stats(LinphoneCallStats *stats, int type);
357
void linphone_call_fix_call_parameters(LinphoneCall *call);
358 359
void linphone_call_init_audio_stream(LinphoneCall *call);
void linphone_call_init_video_stream(LinphoneCall *call);
360
void linphone_call_init_media_streams(LinphoneCall *call);
361
void linphone_call_start_media_streams(LinphoneCall *call, bool_t all_inputs_muted, bool_t send_ringbacktone);
362
void linphone_call_start_media_streams_for_ice_gathering(LinphoneCall *call);
363 364
void linphone_call_stop_audio_stream(LinphoneCall *call);
void linphone_call_stop_video_stream(LinphoneCall *call);
365
void linphone_call_stop_media_streams(LinphoneCall *call);
366
void linphone_call_delete_ice_session(LinphoneCall *call);
Yann Diorcet's avatar
Yann Diorcet committed
367
void linphone_call_delete_upnp_session(LinphoneCall *call);
368
void linphone_call_stop_media_streams_for_ice_gathering(LinphoneCall *call);
369
void linphone_call_update_crypto_parameters(LinphoneCall *call, SalMediaDescription *old_md, SalMediaDescription *new_md);
370
void linphone_call_update_remote_session_id_and_ver(LinphoneCall *call);
371

372
const char * linphone_core_get_identity(LinphoneCore *lc);
373

374 375 376 377
void linphone_core_start_waiting(LinphoneCore *lc, const char *purpose);
void linphone_core_update_progress(LinphoneCore *lc, const char *purpose, float progresses);
void linphone_core_stop_waiting(LinphoneCore *lc);

378
int linphone_core_proceed_with_invite_if_ready(LinphoneCore *lc, LinphoneCall *call, LinphoneProxyConfig *dest_proxy);
379
int linphone_core_start_invite(LinphoneCore *lc, LinphoneCall *call, const LinphoneAddress* destination/* = NULL if to be taken from the call log */);
Simon Morlat's avatar
Simon Morlat committed
380
int linphone_core_restart_invite(LinphoneCore *lc, LinphoneCall *call);
381 382 383
int linphone_core_start_update_call(LinphoneCore *lc, LinphoneCall *call);
int linphone_core_start_accept_call_update(LinphoneCore *lc, LinphoneCall *call);
void linphone_core_notify_incoming_call(LinphoneCore *lc, LinphoneCall *call);
384
bool_t linphone_core_incompatible_security(LinphoneCore *lc, SalMediaDescription *md);
385
extern SalCallbacks linphone_sal_callbacks;
386
bool_t linphone_core_rtcp_enabled(const LinphoneCore *lc);
387

388 389 390
LinphoneCall * is_a_linphone_call(void *user_pointer);
LinphoneProxyConfig * is_a_linphone_proxy_config(void *user_pointer);

391 392
void linphone_core_queue_task(LinphoneCore *lc, belle_sip_source_func_t task_fun, void *data, const char *task_description);

393
static const int linphone_proxy_config_magic=0x7979;
394

395
/*chat*/
jehan's avatar
jehan committed
396
void linphone_chat_message_destroy(LinphoneChatMessage* msg);
397
/**/
jehan's avatar
jehan committed
398

399 400
struct _LinphoneProxyConfig
{
401
	int magic;
402 403 404 405
	struct _LinphoneCore *lc;
	char *reg_proxy;
	char *reg_identity;
	char *reg_route;
406
	char *reg_statistics_collector;
407
	char *realm;
408
	char *contact_params;
409
	char *contact_uri_params;
410 411 412 413 414 415
	int expires;
	SalOp *op;
	char *type;
	struct _SipSetupContext *ssctx;
	int auth_failures;
	char *dial_prefix;
416
	LinphoneRegistrationState state;
Simon Morlat's avatar
Simon Morlat committed
417
	SalOp *publish_op;
418 419 420 421
	bool_t commit;
	bool_t reg_sendregister;
	bool_t publish;
	bool_t dial_escape_plus;
422
	bool_t send_publish;
423
	bool_t send_statistics;
424
	bool_t pad[3];
jehan's avatar
jehan committed
425
	void* user_data;
426
	time_t deletion_date;
jehan's avatar
jehan committed
427
	LinphonePrivacyMask privacy;
428 429
};

430
struct _LinphoneAuthInfo
431 432 433 434 435 436
{
	char *username;
	char *realm;
	char *userid;
	char *passwd;
	char *ha1;
437
	char *domain;
438 439
};

440 441 442 443 444
typedef enum _LinphoneIsComposingState {
	LinphoneIsComposingIdle,
	LinphoneIsComposingActive
} LinphoneIsComposingState;

445 446 447 448 449
struct _LinphoneChatRoom{
	struct _LinphoneCore *lc;
	char  *peer;
	LinphoneAddress *peer_url;
	void * user_data;
Margaux Clerc's avatar
Margaux Clerc committed
450
	MSList *messages_hist;
451 452 453 454 455
	LinphoneIsComposingState remote_is_composing;
	LinphoneIsComposingState is_composing;
	belle_sip_source_t *remote_composing_refresh_timer;
	belle_sip_source_t *composing_idle_timer;
	belle_sip_source_t *composing_refresh_timer;
456 457
};

jehan's avatar
jehan committed
458

459

460 461 462 463 464
struct _LinphoneFriend{
	LinphoneAddress *uri;
	SalOp *insub;
	SalOp *outsub;
	LinphoneSubscribePolicy pol;
465
	LinphonePresenceModel *presence;
466 467 468
	struct _LinphoneCore *lc;
	BuddyInfo *info;
	char *refkey;
Simon Morlat's avatar
Simon Morlat committed
469
	void *up;
470
	bool_t subscribe;
471
	bool_t subscribe_active;
472
	bool_t inc_subscribe_pending;
473
	bool_t commit;
474
	bool_t initial_subscribes_sent; /*used to know if initial subscribe message was sent or not*/
475
};
476

jehan's avatar
jehan committed
477

478 479 480 481 482 483 484
typedef struct sip_config
{
	char *contact;
	char *guessed_contact;
	MSList *proxies;
	MSList *deleted_proxies;
	int inc_timeout;	/*timeout after an un-answered incoming call is rejected*/
Yann Diorcet's avatar
Yann Diorcet committed
485
	int in_call_timeout;	/*timeout after a call is hangup */
486
	int delayed_timeout; 	/*timeout after a delayed call is resumed */
487 488
	unsigned int keepalive_period; /* interval in ms between keep alive messages sent to the proxy server*/
	LCSipTransports transports;
489 490 491 492 493
	bool_t guess_hostname;
	bool_t loopback_only;
	bool_t ipv6_enabled;
	bool_t sdp_200_ack;
	bool_t register_only_when_network_is_up;
494
	bool_t register_only_when_upnp_is_ok;
495
	bool_t ping_with_options;
jehan's avatar
jehan committed
496
	bool_t auto_net_state_mon;
497
	bool_t tcp_tls_keepalive;
498 499 500 501
} sip_config_t;

typedef struct rtp_config
{
502 503 504 505
	int audio_rtp_min_port;
	int audio_rtp_max_port;
	int video_rtp_min_port;
	int video_rtp_max_port;
506 507 508
	int audio_jitt_comp;  /*jitter compensation*/
	int video_jitt_comp;  /*jitter compensation*/
	int nortp_timeout;
509
	int disable_upnp;
510
	bool_t rtp_no_xmit_on_audio_mute;
511
							  /* stop rtp xmit when audio muted */
512 513
	bool_t audio_adaptive_jitt_comp_enabled;
	bool_t video_adaptive_jitt_comp_enabled;
Simon Morlat's avatar
Simon Morlat committed
514
	bool_t pad;
515 516 517 518 519 520
}rtp_config_t;



typedef struct net_config
{
521 522
	char *nat_address; /* may be IP or host name */
	char *nat_address_ip; /* ip translated from nat_address */
523
	char *stun_server;
524
	struct addrinfo *stun_addrinfo;
Simon Morlat's avatar
Simon Morlat committed
525
	SalResolverContext * stun_res;
526 527 528 529 530 531 532 533 534 535 536 537
	int download_bw;
	int upload_bw;
	int mtu;
	bool_t nat_sdp_only;
}net_config_t;


typedef struct sound_config
{
	struct _MSSndCard * ring_sndcard;	/* the playback sndcard currently used */
	struct _MSSndCard * play_sndcard;	/* the playback sndcard currently used */
	struct _MSSndCard * capt_sndcard; /* the capture sndcard currently used */
538
	struct _MSSndCard * lsd_card; /* dummy playback card for Linphone Sound Daemon extension */
539 540
	const char **cards;
	int latency;	/* latency in samples of the current used sound device */
541
	float soft_play_lev; /*playback gain in db.*/
Yann Diorcet's avatar
Yann Diorcet committed
542
	float soft_mic_lev; /*mic gain in db.*/
543 544 545 546 547 548
	char rec_lev;
	char play_lev;
	char ring_lev;
	char source;
	char *local_ring;
	char *remote_ring;
549
	char *ringback_tone;
550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589
	bool_t ec;
	bool_t ea;
	bool_t agc;
} sound_config_t;

typedef struct codecs_config
{
	MSList *audio_codecs;  /* list of audio codecs in order of preference*/
	MSList *video_codecs;	/* for later use*/
}codecs_config_t;

typedef struct video_config{
	struct _MSWebCam *device;
	const char **cams;
	MSVideoSize vsize;
	bool_t capture;
	bool_t show_local;
	bool_t display;
	bool_t selfview; /*during calls*/
}video_config_t;

typedef struct ui_config
{
	int is_daemon;
	int is_applet;
	unsigned int timer_id;  /* the timer id for registration */
}ui_config_t;



typedef struct autoreplier_config
{
	int enabled;
	int after_seconds;		/* accept the call after x seconds*/
	int max_users;			/* maximum number of user that can call simultaneously */
	int max_rec_time;  	/* the max time of incoming voice recorded */
	int max_rec_msg;		/* maximum number of recorded messages */
	const char *message;		/* the path of the file to be played */
}autoreplier_config_t;

Simon Morlat's avatar
Simon Morlat committed
590 591 592 593
struct _LinphoneConference{
	MSAudioConference *conf;
	AudioStream *local_participant;
	MSAudioEndpoint *local_endpoint;
594
	MSAudioEndpoint *record_endpoint;
595
	RtpProfile *local_dummy_profile;
596
	bool_t local_muted;
Simon Morlat's avatar
Simon Morlat committed
597 598
};

599 600 601 602 603 604 605 606 607 608 609

typedef struct _LinphoneToneDescription{
	LinphoneReason reason;
	LinphoneToneID toneid;
	char *audiofile;
}LinphoneToneDescription;

LinphoneToneDescription * linphone_tone_description_new(LinphoneReason reason, LinphoneToneID id, const char *audiofile);
void linphone_tone_description_destroy(LinphoneToneDescription *obj);
LinphoneToneDescription *linphone_core_get_call_error_tone(const LinphoneCore *lc, LinphoneReason reason);
void linphone_core_play_call_error_tone(LinphoneCore *lc, LinphoneReason reason);
610 611
void _linphone_core_set_tone(LinphoneCore *lc, LinphoneReason reason, LinphoneToneID id, const char *audiofile);
const char *linphone_core_get_tone_file(const LinphoneCore *lc, LinphoneToneID id);
jehan's avatar
jehan committed
612
int _linphone_core_accept_call_update(LinphoneCore *lc, LinphoneCall *call, const LinphoneCallParams *params);
Simon Morlat's avatar
Simon Morlat committed
613
typedef struct _LinphoneConference LinphoneConference;
614 615 616 617 618

struct _LinphoneCore
{
	LinphoneCoreVTable vtable;
	Sal *sal;
Simon Morlat's avatar
Simon Morlat committed
619
	LinphoneGlobalState state;
620
	struct _LpConfig *config;
Simon Morlat's avatar
Simon Morlat committed
621
	RtpProfile *default_profile;
622 623 624 625 626 627 628 629
	net_config_t net_conf;
	sip_config_t sip_conf;
	rtp_config_t rtp_conf;
	sound_config_t sound_conf;
	video_config_t video_conf;
	codecs_config_t codecs_conf;
	ui_config_t ui_conf;
	autoreplier_config_t autoreplier_conf;
630 631
	MSList *payload_types;
	int dyn_pt;
632 633 634 635
	LinphoneProxyConfig *default_proxy;
	MSList *friends;
	MSList *auth_info;
	struct _RingStream *ringstream;
636
	time_t dmfs_playing_start_time;
637
	LCCallbackObj preview_finished_cb;
638 639
	LinphoneCall *current_call;   /* the current call */
	MSList *calls;				/* all the processed calls */
640 641 642 643 644
	MSList *queued_calls;	/* used by the autoreplier */
	MSList *call_logs;
	MSList *chatrooms;
	int max_call_logs;
	int missed_calls;
645
	VideoPreview *previewstream;
646
	struct _MSEventQueue *msevq;
Guillaume Beraudo's avatar
Guillaume Beraudo committed
647
	LinphoneRtpTransportFactories *rtptf;
648 649 650
	MSList *bl_reqs;
	MSList *subscribers;	/* unknown subscribers */
	int minutes_away;
651
	LinphonePresenceModel *presence_model;
652 653 654 655 656
	void *data;
	char *play_file;
	char *rec_file;
	time_t prevtime;
	int audio_bw;
657
	LinphoneCoreWaitingCallback wait_cb;
658
	void *wait_ctx;
659 660
	unsigned long video_window_id;
	unsigned long preview_window_id;
661
	time_t netup_time; /*time when network went reachable */
Simon Morlat's avatar
Simon Morlat committed
662
	struct _EcCalibrator *ecc;
Simon Morlat's avatar
Simon Morlat committed
663
	MSList *hooks;
Simon Morlat's avatar
Simon Morlat committed
664 665
	LinphoneConference conf_ctx;
	char* zrtp_secrets_cache;
666
	LinphoneVideoPolicy video_policy;
667 668
	bool_t use_files;
	bool_t apply_nat_settings;
669
	bool_t initial_subscribes_sent;
670
	bool_t bl_refresh;
671

672
	bool_t preview_finished;
673
	bool_t auto_net_state_mon;
674
	bool_t network_reachable;
675
	bool_t use_preview_window;
676

Yann Diorcet's avatar
Yann Diorcet committed
677
	time_t network_last_check;
678

Yann Diorcet's avatar
Yann Diorcet committed
679
	bool_t network_last_status;
680
	bool_t ringstream_autorelease;
681
	bool_t pad[2];
682
	int device_rotation;
683
	int max_calls;
684
	LinphoneTunnel *tunnel;
jehan's avatar
jehan committed
685
	char* device_id;
686
	MSList *last_recv_msg_ids;
Simon Morlat's avatar
Simon Morlat committed
687
	char *chat_db_file;
Margaux Clerc's avatar
Margaux Clerc committed
688 689 690
#ifdef MSG_STORAGE_ENABLED
	sqlite3 *db;
#endif
Yann Diorcet's avatar
Yann Diorcet committed
691
#ifdef BUILD_UPNP
Yann Diorcet's avatar
Yann Diorcet committed
692
	UpnpContext *upnp;
Yann Diorcet's avatar
Yann Diorcet committed
693
#endif //BUILD_UPNP
694
	belle_http_provider_t *http_provider;
695
	belle_tls_verify_policy_t *http_verify_policy;
696
	MSList *tones;
Simon Morlat's avatar
Simon Morlat committed
697
	LinphoneReason chat_deny_code;
698 699
};

700 701 702 703 704

struct _LinphoneEvent{
	LinphoneSubscriptionDir dir;
	LinphoneCore *lc;
	SalOp *op;
705
	SalCustomHeader *send_custom_headers;
706 707 708 709 710 711 712
	LinphoneSubscriptionState subscription_state;
	LinphonePublishState publish_state;
	void *userdata;
	int refcnt;
	char *name;
	LinphoneAddress *from;
	LinphoneAddress *resource_addr;
713
	int expires;
714 715 716 717
	bool_t terminating;
};


718 719
LinphoneTunnel *linphone_core_tunnel_new(LinphoneCore *lc);
void linphone_tunnel_destroy(LinphoneTunnel *tunnel);
Simon Morlat's avatar
Simon Morlat committed
720 721
void linphone_tunnel_configure(LinphoneTunnel *tunnel);
void linphone_tunnel_enable_logs_with_handler(LinphoneTunnel *tunnel, bool_t enabled, OrtpLogFunc logHandler);
Yann Diorcet's avatar
Yann Diorcet committed
722

723 724 725 726 727 728
bool_t linphone_core_can_we_add_call(LinphoneCore *lc);
int linphone_core_add_call( LinphoneCore *lc, LinphoneCall *call);
int linphone_core_del_call( LinphoneCore *lc, LinphoneCall *call);
int linphone_core_set_as_current_call(LinphoneCore *lc, LinphoneCall *call);
int linphone_core_get_calls_nb(const LinphoneCore *lc);

729
void linphone_core_set_state(LinphoneCore *lc, LinphoneGlobalState gstate, const char *message);
Simon Morlat's avatar
Simon Morlat committed
730
void linphone_call_make_local_media_description(LinphoneCore *lc, LinphoneCall *call);
731
void linphone_core_update_streams(LinphoneCore *lc, LinphoneCall *call, SalMediaDescription *new_md);
732 733 734

bool_t linphone_core_is_payload_type_usable_for_bandwidth(LinphoneCore *lc, PayloadType *pt,  int bandwidth_limit);

735
#define linphone_core_ready(lc) ((lc)->state==LinphoneGlobalOn || (lc)->state==LinphoneGlobalShutdown)
736
void _linphone_core_configure_resolver();
737

Simon Morlat's avatar
Simon Morlat committed
738 739 740 741
struct _EcCalibrator{
	ms_thread_t thread;
	MSSndCard *play_card,*capt_card;
	MSFilter *sndread,*det,*rec;
742 743
	MSFilter *play, *gen, *sndwrite;
	MSFilter *read_resampler,*write_resampler;
Simon Morlat's avatar
Simon Morlat committed
744 745 746
	MSTicker *ticker;
	LinphoneEcCalibrationCallback cb;
	void *cb_data;
747 748
	LinphoneEcCalibrationAudioInit audio_init_cb;
	LinphoneEcCalibrationAudioUninit audio_uninit_cb;
Simon Morlat's avatar
Simon Morlat committed
749 750
	int64_t acc;
	int delay;
751
	unsigned int rate;
Simon Morlat's avatar
Simon Morlat committed
752
	LinphoneEcCalibratorStatus status;
Simon Morlat's avatar
Simon Morlat committed
753
	bool_t freq1,freq2,freq3;
Simon Morlat's avatar
Simon Morlat committed
754 755 756 757 758 759 760 761
};

typedef struct _EcCalibrator EcCalibrator;

LinphoneEcCalibratorStatus ec_calibrator_get_status(EcCalibrator *ecc);

void ec_calibrator_destroy(EcCalibrator *ecc);

762
void linphone_call_background_tasks(LinphoneCall *call, bool_t one_second_elapsed);
763
void linphone_core_preempt_sound_resources(LinphoneCore *lc);
764 765
int _linphone_core_pause_call(LinphoneCore *lc, LinphoneCall *call);

Simon Morlat's avatar
Simon Morlat committed
766
/*conferencing subsystem*/
767
void _post_configure_audio_stream(AudioStream *st, LinphoneCore *lc, bool_t muted);
768 769 770 771 772
/* When a conference participant pause the conference he may send a music.
 * We don't want to hear that music or to send it to the other participants.
 * Use muted=yes to handle this case.
 */
void linphone_call_add_to_conf(LinphoneCall *call, bool_t muted);
Simon Morlat's avatar
Simon Morlat committed
773
void linphone_call_remove_from_conf(LinphoneCall *call);
774
void linphone_core_conference_check_uninit(LinphoneCore *lc);
775
bool_t linphone_core_sound_resources_available(LinphoneCore *lc);
776
void linphone_core_notify_refer_state(LinphoneCore *lc, LinphoneCall *referer, LinphoneCall *newcall);
777
unsigned int linphone_core_get_audio_features(LinphoneCore *lc);
Simon Morlat's avatar
Simon Morlat committed
778

Simon Morlat's avatar