]> sjero.net Git - linphone/commitdiff
fix bugs in call status, write codecs config immediately
authorSimon Morlat <simon.morlat@linphone.org>
Tue, 12 Jun 2012 15:21:11 +0000 (17:21 +0200)
committerSimon Morlat <simon.morlat@linphone.org>
Tue, 12 Jun 2012 15:22:03 +0000 (17:22 +0200)
coreapi/callbacks.c
coreapi/linphonecall.c
coreapi/linphonecore.c
coreapi/linphonecore.h
coreapi/misc.c
coreapi/private.h
gtk/calllogs.c

index d7bc861bafbe047429375c0b65cc5068c2ddf6fb..8ec8f39b17eec081b951025fbaa389ae732ec699 100644 (file)
@@ -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
index f010a7e7923156485e4470e28868b63f53c925fb..ac84602912ad75f5276ffac27b6702301608abfa 100644 (file)
@@ -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);
                }
index c0531ae9a52a5600ab334dc6a7e25403cd974309..3bc23b34480071b2f36c196f1685f8ec3f35728a 100644 (file)
@@ -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);
-
-       index=0;
-       for(node=config->video_codecs;node!=NULL;node=ms_list_next(node)){
-               pt=(PayloadType*)(node->data);
+               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);
+                       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";
 }
index 59dbca0cba3d09c7f960cc91fac6577216f919a9..ae3f9cb15d3426f4ac286a0e6c181f62e431a8e9 100644 (file)
@@ -205,7 +205,8 @@ enum _LinphoneReason{
        LinphoneReasonNoResponse, /**<No response received from remote*/
        LinphoneReasonBadCredentials, /**<Authentication failed due to bad or missing credentials*/
        LinphoneReasonDeclined, /**<The call has been declined*/
-       LinphoneReasonNotFound,
+       LinphoneReasonNotFound, /**<Destination of the calls was not found.*/
+       LinphoneReasonNotAnswered
 };
 
 typedef enum _LinphoneReason LinphoneReason;
index 881b88eb6131bd0f28dc555934bb260232b2dd0d..a749bf2793ba5f2a54867d0d4bed878073980b44 100644 (file)
@@ -196,6 +196,7 @@ bool_t linphone_core_payload_type_enabled(LinphoneCore *lc, const PayloadType *p
 int linphone_core_enable_payload_type(LinphoneCore *lc, PayloadType *pt, bool_t enabled){
        if (ms_list_find(lc->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 !");
index 773e77882a0d789a9a01b8d6060d556b76fbf5cd..1ab7a6a7de5390ba236faf161f9b114bf78e7190 100644 (file)
@@ -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)
index 5ff2a08eb59d9555b391b0ae32aa22fc97079582..bd5969ec880d2f72baa3a72f5526ebc9d494a225 100644 (file)
@@ -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(
                                _("<big><b>%s</b></big>\t<small><i>%s</i>\t"
                                        "<i>Quality: %s</i></small>\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(
+                               _("<big><b>%s</b></big>\t<small><i>%s</i></small>\t"
+                                       "\n%s\t%s"),
+                               display, addr,
+                               cl->start_date, status);
                g_free(minutes);
                g_free(seconds);
                gtk_list_store_append (store,&iter);