Commit 32eb45df authored by Simon Morlat's avatar Simon Morlat
Browse files

fix bad handling of remote params, resulting in wrong information given in...

fix bad handling of remote params, resulting in wrong information given in them in case of received INVITE without SDP
parent 03ad6404
......@@ -72,6 +72,16 @@ SalStreamDir get_video_dir_from_call_params(const LinphoneCallParams *params) {
return sal_dir_from_call_params_dir(linphone_call_params_get_video_direction(params));
}
void linphone_call_params_set_custom_headers(LinphoneCallParams *params, const SalCustomHeader *ch){
if (params->custom_headers){
sal_custom_header_free(params->custom_headers);
params->custom_headers = NULL;
}
if (ch){
params->custom_headers = sal_custom_header_clone(ch);
}
}
/*******************************************************************************
* Public functions *
......
......@@ -627,6 +627,19 @@ static void call_paused_by_remote(LinphoneCore *lc, LinphoneCall *call){
linphone_call_params_unref(params);
}
static void call_updated_by_remote(LinphoneCore *lc, LinphoneCall *call){
linphone_core_notify_display_status(lc,_("Call is updated by remote."));
linphone_call_set_state(call, LinphoneCallUpdatedByRemote,"Call updated by remote");
if (call->defer_update == FALSE){
linphone_core_accept_call_update(lc,call,NULL);
}else{
if (call->state == LinphoneCallUpdatedByRemote){
ms_message("LinphoneCall [%p]: UpdatedByRemoted was signaled but defered. LinphoneCore expects the application to call "
"linphone_core_accept_call_update() later.", call);
}
}
}
/* this callback is called when an incoming re-INVITE/ SIP UPDATE modifies the session*/
static void call_updated(LinphoneCore *lc, LinphoneCall *call, SalOp *op, bool_t is_update){
SalMediaDescription *rmd=sal_call_get_remote_media_description(op);
......@@ -638,12 +651,7 @@ static void call_updated(LinphoneCore *lc, LinphoneCall *call, SalOp *op, bool_t
if (sal_media_description_has_dir(rmd,SalStreamSendRecv) || sal_media_description_has_dir(rmd,SalStreamRecvOnly)){
call_resumed(lc,call);
}else{
/*we are staying in PausedByRemote*/
linphone_core_notify_display_status(lc,_("Call is updated by remote."));
linphone_call_set_state(call, LinphoneCallUpdatedByRemote,"Call updated by remote");
if (call->defer_update == FALSE){
linphone_core_accept_call_update(lc,call,NULL);
}
call_updated_by_remote(lc, call);
}
break;
/*SIP UPDATE CASE*/
......@@ -660,11 +668,7 @@ static void call_updated(LinphoneCore *lc, LinphoneCall *call, SalOp *op, bool_t
if (sal_media_description_has_dir(rmd,SalStreamSendOnly) || sal_media_description_has_dir(rmd,SalStreamInactive)){
call_paused_by_remote(lc,call);
}else{
linphone_core_notify_display_status(lc,_("Call is updated by remote."));
linphone_call_set_state(call, LinphoneCallUpdatedByRemote,"Call updated by remote");
if (call->defer_update == FALSE){
linphone_core_accept_call_update(lc,call,NULL);
}
call_updated_by_remote(lc, call);
}
break;
case LinphoneCallPaused:
......
......@@ -1394,7 +1394,7 @@ void linphone_call_fix_call_parameters(LinphoneCall *call){
ms_message("Call [%p]: disabling video in our call params because the remote doesn't want it.", call);
call->params->has_video = FALSE;
}
if (rcp->has_video && call->core->video_policy.automatically_accept && !call->params->has_video){
if (rcp->has_video && call->core->video_policy.automatically_accept && linphone_core_video_enabled(call->core) && !call->params->has_video){
ms_message("Call [%p]: re-enabling video in our call params because the remote wants it and the policy allows to automatically accept.", call);
call->params->has_video = TRUE;
}
......@@ -1727,8 +1727,7 @@ const LinphoneCallParams * linphone_call_get_remote_params(LinphoneCall *call){
if (call->op){
LinphoneCallParams *cp;
SalMediaDescription *md;
if (call->remote_params != NULL) linphone_call_params_unref(call->remote_params);
cp = call->remote_params = linphone_call_params_new();
md=sal_call_get_remote_media_description(call->op);
if (md) {
SalStreamDescription *sd;
......@@ -1736,7 +1735,9 @@ const LinphoneCallParams * linphone_call_get_remote_params(LinphoneCall *call){
unsigned int nb_audio_streams = sal_media_description_nb_active_streams_of_type(md, SalAudio);
unsigned int nb_video_streams = sal_media_description_nb_active_streams_of_type(md, SalVideo);
unsigned int nb_text_streams = sal_media_description_nb_active_streams_of_type(md, SalText);
if (call->remote_params != NULL) linphone_call_params_unref(call->remote_params);
cp = call->remote_params = linphone_call_params_new();
for (i = 0; i < nb_video_streams; i++) {
sd = sal_media_description_get_active_stream_of_type(md, SalVideo, i);
if (sal_stream_description_active(sd) == TRUE) cp->has_video = TRUE;
......@@ -1757,8 +1758,8 @@ const LinphoneCallParams * linphone_call_get_remote_params(LinphoneCall *call){
}
if (md->name[0]!='\0') linphone_call_params_set_session_name(cp,md->name);
}
cp->custom_headers=sal_custom_header_clone((SalCustomHeader*)sal_op_get_recv_custom_header(call->op));
return cp;
linphone_call_params_set_custom_headers(call->remote_params, sal_op_get_recv_custom_header(call->op));
return call->remote_params;
}
return NULL;
}
......
......@@ -343,6 +343,7 @@ LinphoneCallParams * linphone_call_params_new(void);
SalMediaProto get_proto_from_call_params(const LinphoneCallParams *params);
SalStreamDir get_audio_dir_from_call_params(const LinphoneCallParams *params);
SalStreamDir get_video_dir_from_call_params(const LinphoneCallParams *params);
void linphone_call_params_set_custom_headers(LinphoneCallParams *params, const SalCustomHeader *ch);
void linphone_auth_info_write_config(struct _LpConfig *config, LinphoneAuthInfo *obj, int pos);
void linphone_core_write_auth_info(LinphoneCore *lc, LinphoneAuthInfo *ai);
......
......@@ -1839,11 +1839,6 @@ void video_call_base_2(LinphoneCoreManager* pauline,LinphoneCoreManager* marie,
LinphoneCall* pauline_call;
LinphoneVideoPolicy marie_policy, pauline_policy;
linphone_core_enable_video_capture(marie->lc, TRUE);
linphone_core_enable_video_display(marie->lc, TRUE);
linphone_core_enable_video_capture(pauline->lc, TRUE);
linphone_core_enable_video_display(pauline->lc, FALSE);
if (using_policy) {
marie_policy.automatically_initiate=FALSE;
marie_policy.automatically_accept=TRUE;
......@@ -1853,20 +1848,12 @@ void video_call_base_2(LinphoneCoreManager* pauline,LinphoneCoreManager* marie,
linphone_core_set_video_policy(marie->lc,&marie_policy);
linphone_core_set_video_policy(pauline->lc,&pauline_policy);
}
if (callee_video_enabled) {
linphone_core_enable_video_display(marie->lc, TRUE);
linphone_core_enable_video_capture(marie->lc, TRUE);
} else {
linphone_core_enable_video_display(marie->lc, FALSE);
linphone_core_enable_video_capture(marie->lc, FALSE);
}
if (caller_video_enabled) {
linphone_core_enable_video_display(pauline->lc, TRUE);
linphone_core_enable_video_capture(pauline->lc, TRUE);
} else {
linphone_core_enable_video_display(pauline->lc, FALSE);
linphone_core_enable_video_capture(pauline->lc, FALSE);
}
linphone_core_enable_video_display(marie->lc, callee_video_enabled);
linphone_core_enable_video_capture(marie->lc, callee_video_enabled);
linphone_core_enable_video_display(pauline->lc, caller_video_enabled);
linphone_core_enable_video_capture(pauline->lc, caller_video_enabled);
if (mode==LinphoneMediaEncryptionDTLS) { /* for DTLS we must access certificates or at least have a directory to store them */
marie->lc->user_certificates_path = bc_tester_file("certificates-marie");
......@@ -1907,17 +1894,13 @@ void video_call_base_2(LinphoneCoreManager* pauline,LinphoneCoreManager* marie,
BC_ASSERT_FALSE(linphone_call_log_video_enabled(linphone_call_get_call_log(marie_call)));
BC_ASSERT_FALSE(linphone_call_log_video_enabled(linphone_call_get_call_log(pauline_call)));
}
liblinphone_tester_check_rtcp(marie,pauline);
}
}
static void video_call_base(LinphoneCoreManager* pauline,LinphoneCoreManager* marie, bool_t using_policy,LinphoneMediaEncryption mode, bool_t callee_video_enabled, bool_t caller_video_enabled) {
video_call_base_2(pauline,marie,using_policy,mode,callee_video_enabled,caller_video_enabled);
linphone_core_terminate_all_calls(pauline->lc);
BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallEnd,1));
BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallEnd,1));
end_call(pauline, marie);
}
static void video_call(void) {
LinphoneCoreManager* marie = linphone_core_manager_new("marie_rc");
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment