From 23d589cec01361b7c08528cd7433d5b01c0579bb Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Tue, 12 Jun 2012 17:21:11 +0200 Subject: [PATCH] fix bugs in call status, write codecs config immediately --- coreapi/callbacks.c | 15 ++++++++-- coreapi/linphonecall.c | 10 +++++-- coreapi/linphonecore.c | 67 ++++++++++++++++++++++++------------------ coreapi/linphonecore.h | 3 +- coreapi/misc.c | 1 + coreapi/private.h | 1 + gtk/calllogs.c | 21 ++++++++++++- 7 files changed, 83 insertions(+), 35 deletions(-) diff --git a/coreapi/callbacks.c b/coreapi/callbacks.c index d7bc861ba..8ec8f39b1 100644 --- a/coreapi/callbacks.c +++ b/coreapi/callbacks.c @@ -484,9 +484,18 @@ static void call_terminated(SalOp *op, const char *from){ if (call==NULL) return; - if (linphone_call_get_state(call)==LinphoneCallEnd || linphone_call_get_state(call)==LinphoneCallError){ - ms_warning("call_terminated: ignoring."); - return; + switch(linphone_call_get_state(call)){ + case LinphoneCallEnd: + case LinphoneCallError: + ms_warning("call_terminated: ignoring."); + return; + break; + case LinphoneCallIncomingReceived: + case LinphoneCallIncomingEarlyMedia: + call->reason=LinphoneReasonNotAnswered; + break; + default: + break; } ms_message("Current call terminated..."); //we stop the call only if we have this current call or if we are in call diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c index f010a7e79..ac8460291 100644 --- a/coreapi/linphonecall.c +++ b/coreapi/linphonecall.c @@ -497,8 +497,14 @@ void linphone_call_set_state(LinphoneCall *call, LinphoneCallState cstate, const call->state=cstate; } if (cstate==LinphoneCallEnd || cstate==LinphoneCallError){ - if (call->reason==LinphoneReasonDeclined){ - call->log->status=LinphoneCallDeclined; + switch(call->reason){ + case LinphoneReasonDeclined: + call->log->status=LinphoneCallDeclined; + case LinphoneReasonNotAnswered: + call->log->status=LinphoneCallMissed; + break; + default: + break; } linphone_call_set_terminated (call); } diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index c0531ae9a..3bc23b344 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -1319,6 +1319,7 @@ int linphone_core_set_audio_codecs(LinphoneCore *lc, MSList *codecs) { if (lc->codecs_conf.audio_codecs!=NULL) ms_list_free(lc->codecs_conf.audio_codecs); lc->codecs_conf.audio_codecs=codecs; + _linphone_core_codec_config_write(lc); return 0; } @@ -1333,6 +1334,7 @@ int linphone_core_set_video_codecs(LinphoneCore *lc, MSList *codecs) { if (lc->codecs_conf.video_codecs!=NULL) ms_list_free(lc->codecs_conf.video_codecs); lc->codecs_conf.video_codecs=codecs; + _linphone_core_codec_config_write(lc); return 0; } @@ -1827,6 +1829,7 @@ void linphone_core_iterate(LinphoneCore *lc){ ms_message("incoming call ringing for %i seconds",elapsed); if (elapsed>lc->sip_conf.inc_timeout){ call->log->status=LinphoneCallMissed; + call->reason=LinphoneReasonNotAnswered; linphone_core_terminate_call(lc,call); } } @@ -2569,7 +2572,8 @@ int linphone_core_abort_call(LinphoneCore *lc, LinphoneCall *call, const char *e static void terminate_call(LinphoneCore *lc, LinphoneCall *call){ if (call->state==LinphoneCallIncomingReceived){ - call->reason=LinphoneReasonDeclined; + if (call->reason!=LinphoneReasonNotAnswered) + call->reason=LinphoneReasonDeclined; } /*stop ringing*/ if (lc->ringstream!=NULL) { @@ -4261,38 +4265,43 @@ void video_config_uninit(LinphoneCore *lc) ms_free(lc->video_conf.cams); } -void codecs_config_uninit(LinphoneCore *lc) -{ - PayloadType *pt; - codecs_config_t *config=&lc->codecs_conf; - MSList *node; - char key[50]; - int index; - index=0; - for(node=config->audio_codecs;node!=NULL;node=ms_list_next(node)){ - pt=(PayloadType*)(node->data); +void _linphone_core_codec_config_write(LinphoneCore *lc){ + if (linphone_core_ready(lc)){ + PayloadType *pt; + codecs_config_t *config=&lc->codecs_conf; + MSList *node; + char key[50]; + int index; + index=0; + for(node=config->audio_codecs;node!=NULL;node=ms_list_next(node)){ + pt=(PayloadType*)(node->data); + sprintf(key,"audio_codec_%i",index); + lp_config_set_string(lc->config,key,"mime",pt->mime_type); + lp_config_set_int(lc->config,key,"rate",pt->clock_rate); + lp_config_set_int(lc->config,key,"enabled",linphone_core_payload_type_enabled(lc,pt)); + index++; + } sprintf(key,"audio_codec_%i",index); - lp_config_set_string(lc->config,key,"mime",pt->mime_type); - lp_config_set_int(lc->config,key,"rate",pt->clock_rate); - lp_config_set_int(lc->config,key,"enabled",linphone_core_payload_type_enabled(lc,pt)); - index++; - } - sprintf(key,"audio_codec_%i",index); - lp_config_clean_section (lc->config,key); + lp_config_clean_section (lc->config,key); - index=0; - for(node=config->video_codecs;node!=NULL;node=ms_list_next(node)){ - pt=(PayloadType*)(node->data); + index=0; + for(node=config->video_codecs;node!=NULL;node=ms_list_next(node)){ + pt=(PayloadType*)(node->data); + sprintf(key,"video_codec_%i",index); + lp_config_set_string(lc->config,key,"mime",pt->mime_type); + lp_config_set_int(lc->config,key,"rate",pt->clock_rate); + lp_config_set_int(lc->config,key,"enabled",linphone_core_payload_type_enabled(lc,pt)); + lp_config_set_string(lc->config,key,"recv_fmtp",pt->recv_fmtp); + index++; + } sprintf(key,"video_codec_%i",index); - lp_config_set_string(lc->config,key,"mime",pt->mime_type); - lp_config_set_int(lc->config,key,"rate",pt->clock_rate); - lp_config_set_int(lc->config,key,"enabled",linphone_core_payload_type_enabled(lc,pt)); - lp_config_set_string(lc->config,key,"recv_fmtp",pt->recv_fmtp); - index++; + lp_config_clean_section (lc->config,key); } - sprintf(key,"video_codec_%i",index); - lp_config_clean_section (lc->config,key); +} +static void codecs_config_uninit(LinphoneCore *lc) +{ + _linphone_core_codec_config_write(lc); ms_list_free(lc->codecs_conf.audio_codecs); ms_list_free(lc->codecs_conf.video_codecs); } @@ -4584,6 +4593,8 @@ const char *linphone_reason_to_string(LinphoneReason err){ return "Call declined"; case LinphoneReasonNotFound: return "User not found"; + case LinphoneReasonNotAnswered: + return "Not answered"; } return "unknown error"; } diff --git a/coreapi/linphonecore.h b/coreapi/linphonecore.h index 59dbca0cb..ae3f9cb15 100644 --- a/coreapi/linphonecore.h +++ b/coreapi/linphonecore.h @@ -205,7 +205,8 @@ enum _LinphoneReason{ LinphoneReasonNoResponse, /**codecs_conf.audio_codecs,pt) || ms_list_find(lc->codecs_conf.video_codecs,pt)){ payload_type_set_enable(pt,enabled); + _linphone_core_codec_config_write(lc); return 0; } ms_error("Enabling codec not in audio or video list of PayloadType !"); diff --git a/coreapi/private.h b/coreapi/private.h index 773e77882..1ab7a6a7d 100644 --- a/coreapi/private.h +++ b/coreapi/private.h @@ -568,6 +568,7 @@ bool_t linphone_core_sound_resources_available(LinphoneCore *lc); void linphone_core_notify_refer_state(LinphoneCore *lc, LinphoneCall *referer, LinphoneCall *newcall); void __linphone_core_invalidate_registers(LinphoneCore* lc); +void _linphone_core_codec_config_write(LinphoneCore *lc); #define HOLD_OFF (0) #define HOLD_ON (1) diff --git a/gtk/calllogs.c b/gtk/calllogs.c index 5ff2a08eb..bd5969ec8 100644 --- a/gtk/calllogs.c +++ b/gtk/calllogs.c @@ -57,6 +57,7 @@ void linphone_gtk_call_log_update(GtkWidget *w){ const char *display; gchar *logtxt, *minutes, *seconds; gchar quality[20]; + const char *status=NULL; display=linphone_address_get_display_name (la); if (display==NULL){ @@ -67,17 +68,35 @@ void linphone_gtk_call_log_update(GtkWidget *w){ if (cl->quality!=-1){ snprintf(quality,sizeof(quality),"%.1f",cl->quality); } + switch(cl->status){ + case LinphoneCallAborted: + status=_("Aborted"); + break; + case LinphoneCallMissed: + status=_("Missed"); + break; + case LinphoneCallDeclined: + status=_("Declined"); + break; + default: + break; + } minutes=g_markup_printf_escaped( ngettext("%i minute", "%i minutes", cl->duration/60), cl->duration/60); seconds=g_markup_printf_escaped( ngettext("%i second", "%i seconds", cl->duration%60), cl->duration%60); - logtxt=g_markup_printf_escaped( + if (status==NULL) logtxt=g_markup_printf_escaped( _("%s\t%s\t" "Quality: %s\n%s\t%s %s\t"), display, addr, cl->quality!=-1 ? quality : _("n/a"), cl->start_date, minutes, seconds); + else logtxt=g_markup_printf_escaped( + _("%s\t%s\t" + "\n%s\t%s"), + display, addr, + cl->start_date, status); g_free(minutes); g_free(seconds); gtk_list_store_append (store,&iter);