diff --git a/console/commands.c b/console/commands.c index 9f10a4831d757cd96d8d8188bbf4403f5961811c..2f07bbdad79d70f02882a998c1babe008f341dcc 100644 --- a/console/commands.c +++ b/console/commands.c @@ -407,19 +407,20 @@ lpc_cmd_call(LinphoneCore *lc, char *args) } if(!strcmp(args,"show")) { - MSList *calls = linphone_core_get_calls(lc); + const MSList *calls = linphone_core_get_calls(lc); if(calls) { - MSList *p_calls = calls; + const MSList *p_calls = calls; linphonec_out("<remote>\t\t\t\t<status>\r\n"); while(p_calls != NULL) { + char *tmp=linphone_call_get_remote_address_as_string(p_calls->data); linphonec_out("%s\t\t\t%s\r\n", - linphone_call_get_remote_address_as_string(p_calls->data), + tmp, (((LinphoneCall *)p_calls->data)==linphone_core_get_current_call(lc))?"yes":"no"); p_calls = p_calls->next; + ms_free(tmp); } - ms_list_free(calls); } else { @@ -639,7 +640,7 @@ lpc_cmd_nat(LinphoneCore *lc, char *args) } nat = linphone_core_get_nat_address(lc); - use = linphone_core_get_firewall_policy(lc)==LINPHONE_POLICY_USE_NAT_ADDRESS; + use = linphone_core_get_firewall_policy(lc)==LinphonePolicyUseNatAddress; linphonec_out("Nat address: %s%s\n", nat ? nat : "unspecified" , use ? "" : " (disabled - use 'firewall nat' to enable)"); return 1; @@ -660,7 +661,7 @@ lpc_cmd_stun(LinphoneCore *lc, char *args) } stun = linphone_core_get_stun_server(lc); - use = linphone_core_get_firewall_policy(lc)==LINPHONE_POLICY_USE_STUN; + use = linphone_core_get_firewall_policy(lc)==LinphonePolicyUseStun; linphonec_out("Stun server: %s%s\n", stun ? stun : "unspecified" , use? "" : " (disabled - use 'firewall stun' to enable)"); return 1; @@ -677,7 +678,7 @@ lpc_cmd_firewall(LinphoneCore *lc, char *args) { if (strcmp(args,"none")==0) { - linphone_core_set_firewall_policy(lc,LINPHONE_POLICY_NO_FIREWALL); + linphone_core_set_firewall_policy(lc,LinphonePolicyNoFirewall); } else if (strcmp(args,"stun")==0) { @@ -687,7 +688,7 @@ lpc_cmd_firewall(LinphoneCore *lc, char *args) linphonec_out("No stun server address is defined, use 'stun <address>' first\n"); return 1; } - linphone_core_set_firewall_policy(lc,LINPHONE_POLICY_USE_STUN); + linphone_core_set_firewall_policy(lc,LinphonePolicyUseStun); } else if (strcmp(args,"nat")==0) { @@ -697,19 +698,19 @@ lpc_cmd_firewall(LinphoneCore *lc, char *args) linphonec_out("No nat address is defined, use 'nat <address>' first"); return 1; } - linphone_core_set_firewall_policy(lc,LINPHONE_POLICY_USE_NAT_ADDRESS); + linphone_core_set_firewall_policy(lc,LinphonePolicyUseNatAddress); } } switch(linphone_core_get_firewall_policy(lc)) { - case LINPHONE_POLICY_NO_FIREWALL: + case LinphonePolicyNoFirewall: linphonec_out("No firewall\n"); break; - case LINPHONE_POLICY_USE_STUN: + case LinphonePolicyUseStun: linphonec_out("Using stun server %s to discover firewall address\n", setting ? setting : linphone_core_get_stun_server(lc)); break; - case LINPHONE_POLICY_USE_NAT_ADDRESS: + case LinphonePolicyUseNatAddress: linphonec_out("Using supplied nat address %s.\n", setting ? setting : linphone_core_get_nat_address(lc)); break; } @@ -1229,7 +1230,7 @@ static int lpc_cmd_resume(LinphoneCore *lc, char *args){ else { int returned = 0; - MSList *calls = linphone_core_get_calls(lc); + const MSList *calls = linphone_core_get_calls(lc); if(ms_list_size(calls) == 1) { if(linphone_core_resume_call(lc,calls->data) < 0) @@ -1241,7 +1242,6 @@ static int lpc_cmd_resume(LinphoneCore *lc, char *args){ { returned = 1; } - ms_list_free(calls); return returned; } } @@ -1775,31 +1775,31 @@ static int lpc_cmd_status(LinphoneCore *lc, char *args) } else if (strstr(args,"hook")) { - gstate_t call_state=linphone_core_get_state(lc,GSTATE_GROUP_CALL); -/* - if (!cfg || !linphone_proxy_config_is_registered(cfg)){ - linphonec_out("unregistered\n"); - return 1; - } - */ + LinphoneCall *call=linphone_core_get_current_call (lc); + LinphoneCallState call_state=LinphoneCallIdle; + if (call) call_state=linphone_call_get_state(call); + switch(call_state){ - case GSTATE_CALL_OUT_INVITE: + case LinphoneCallOutgoingInit: + case LinphoneCallOutgoingProgress: linphonec_out("hook=dialing\n"); break; - case GSTATE_CALL_IDLE: + case LinphoneCallIdle: linphonec_out("hook=offhook\n"); break; - case GSTATE_CALL_OUT_CONNECTED: - linphonec_out("Call out, hook=%s duration=%i, muted=%s rtp-xmit-muted=%s\n", linphonec_get_callee(), + case LinphoneCallStreamsRunning: + case LinphoneCallConnected: + if (linphone_call_get_dir(call)==LinphoneCallOutgoing){ + linphonec_out("Call out, hook=%s duration=%i, muted=%s rtp-xmit-muted=%s\n", linphonec_get_callee(), linphone_core_get_current_call_duration(lc), - lc->audio_muted ? "yes" : "no", + linphone_core_is_mic_muted (lc) ? "yes" : "no", linphone_core_is_rtp_muted(lc) ? "yes" : "no"); - break; - case GSTATE_CALL_IN_CONNECTED: - linphonec_out("hook=answered duration=%i\n" , - linphone_core_get_current_call_duration(lc)); + }else{ + linphonec_out("hook=answered duration=%i\n" , + linphone_core_get_current_call_duration(lc)); + } break; - case GSTATE_CALL_IN_INVITE: + case LinphoneCallIncomingReceived: linphonec_out("Incoming call from %s\n",linphonec_get_caller()); break; default: @@ -2048,22 +2048,21 @@ static int lpc_cmd_unmute_mic(LinphoneCore *lc, char *args){ static int lpc_cmd_rtp_no_xmit_on_audio_mute(LinphoneCore *lc, char *args) { - bool_t rtp_xmit_off=FALSE; - char *status; - gstate_t call_state=linphone_core_get_state(lc,GSTATE_GROUP_CALL); - - if(args){ - if(strstr(args,"1"))rtp_xmit_off=TRUE; - if(call_state == GSTATE_CALL_IDLE) - linphone_core_set_rtp_no_xmit_on_audio_mute(lc,rtp_xmit_off); - else - linphonec_out("nortp-on-audio-mute: call in progress - cannot change state\n"); - } - rtp_xmit_off=linphone_core_get_rtp_no_xmit_on_audio_mute(lc); - if(rtp_xmit_off)status="off"; - else status="on"; - linphonec_out("rtp transmit %s when audio muted\n",status); - return 1; + bool_t rtp_xmit_off=FALSE; + char *status; + + if(args){ + if(strstr(args,"1"))rtp_xmit_off=TRUE; + if(linphone_core_get_current_call (lc)==NULL) + linphone_core_set_rtp_no_xmit_on_audio_mute(lc,rtp_xmit_off); + else + linphonec_out("nortp-on-audio-mute: call in progress - cannot change state\n"); + } + rtp_xmit_off=linphone_core_get_rtp_no_xmit_on_audio_mute(lc); + if (rtp_xmit_off) status="off"; + else status="on"; + linphonec_out("rtp transmit %s when audio muted\n",status); + return 1; } diff --git a/console/linphonec.c b/console/linphonec.c index 030477c7427931673cabc8f72853a34e5f420167..c00d87632bc4f6595d4c92e78b7dcf6ce244b612 100644 --- a/console/linphonec.c +++ b/console/linphonec.c @@ -112,27 +112,21 @@ static char **linephonec_readline_completion(const char *text, #endif /* These are callback for linphone core */ -static void linphonec_call_received(LinphoneCore *lc, LinphoneCall *call); -static void linphonec_paused_received(LinphoneCore *lc, LinphoneCall *call); -static void linphonec_resumed_received(LinphoneCore *lc, LinphoneCall *call); static void linphonec_prompt_for_auth(LinphoneCore *lc, const char *realm, const char *username); -static void linphonec_display_refer (LinphoneCore * lc,LinphoneCall *call, const char *refer_to); +static void linphonec_display_refer (LinphoneCore * lc, const char *refer_to); static void linphonec_display_something (LinphoneCore * lc, const char *something); static void linphonec_display_url (LinphoneCore * lc, const char *something, const char *url); static void linphonec_display_warning (LinphoneCore * lc, const char *something); -static void stub () {} static void linphonec_notify_received(LinphoneCore *lc,const char *from,const char *msg); -static void linphonec_ack_paused_received(LinphoneCore *lc, LinphoneCall *call); -static void linphonec_ack_resumed_received(LinphoneCore *lc, LinphoneCall *call); + static void linphonec_notify_presence_received(LinphoneCore *lc,LinphoneFriend *fid); static void linphonec_new_unknown_subscriber(LinphoneCore *lc, LinphoneFriend *lf, const char *url); -static void linphonec_bye_received(LinphoneCore *lc, LinphoneCall *call); + static void linphonec_text_received(LinphoneCore *lc, LinphoneChatRoom *cr, const char *from, const char *msg); static void linphonec_display_status (LinphoneCore * lc, const char *something); -static void linphonec_general_state (LinphoneCore * lc, LinphoneGeneralState *gstate, LinphoneGeneralStateContext gctx); static void linphonec_dtmf_received(LinphoneCore *lc, LinphoneCall *call, int dtmf); static void print_prompt(LinphoneCore *opm); void linphonec_out(const char *fmt,...); @@ -175,37 +169,6 @@ static ortp_pipe_t server_sock; #endif /*_WIN32_WCE*/ -LinphoneCoreVTable linphonec_vtable -#if !defined (_MSC_VER) -= { - .show =(ShowInterfaceCb) stub, - .inv_recv = linphonec_call_received, - .bye_recv = linphonec_bye_received, - .ringing_recv = (RingingReceivedCb) stub, - .connected_recv = (ConnectedReceivedCb) stub, - .failure_recv = (FailureReceivedCb) stub, - .paused_recv = linphonec_paused_received, - .resumed_recv = linphonec_resumed_received, - .notify_recv = linphonec_notify_received, - .ack_paused_recv = linphonec_ack_paused_received, - .ack_resumed_recv = linphonec_ack_resumed_received, - .notify_presence_recv = linphonec_notify_presence_received, - .new_unknown_subscriber = linphonec_new_unknown_subscriber, - .auth_info_requested = linphonec_prompt_for_auth, - .display_status = linphonec_display_status, - .display_message=linphonec_display_something, - .display_warning=linphonec_display_warning, - .display_url=linphonec_display_url, - .text_received=linphonec_text_received, - .general_state=linphonec_general_state, - .dtmf_received=linphonec_dtmf_received, - .refer_received=linphonec_display_refer -} -#endif /*_WIN32_WCE*/ -; - - - /*************************************************************************** * * Linphone core callbacks @@ -216,10 +179,9 @@ LinphoneCoreVTable linphonec_vtable * Linphone core callback */ static void -linphonec_display_refer (LinphoneCore * lc,LinphoneCall *call, const char *refer_to) +linphonec_display_refer (LinphoneCore * lc, const char *refer_to) { - fprintf (stdout, "The distant end point asked to transfer the call to %s,don't forget to terminate the call if not\n%s", refer_to,prompt); - fflush(stdout); + linphonec_out("Receiving out of call refer to %s", refer_to); } /* @@ -261,49 +223,6 @@ linphonec_display_url (LinphoneCore * lc, const char *something, const char *url fprintf (stdout, "%s : %s\n", something, url); } - -/* - * Linphone core callback - */ -static void -linphonec_call_received(LinphoneCore *lc, LinphoneCall *call) -{ - char *from=linphone_call_get_remote_address_as_string(call); - linphonec_set_caller(from); - ms_free(from); - if ( auto_answer) { - answer_call=TRUE; - } -} -/* - * Linphone core callback - */ -static void -linphonec_paused_received(LinphoneCore *lc, LinphoneCall *call) -{ - char *from=linphone_call_get_remote_address_as_string(call); - if(from) - { - linphonec_out("the call from %s have been paused\n",from); - ms_free(from); - } -} -/* - * Linphone core callback - */ -static void -linphonec_resumed_received(LinphoneCore *lc, LinphoneCall *call) -{ - char *from=linphone_call_get_remote_address_as_string(call); - if(from) - { - linphonec_out("the call from %s have been resumed\n",from); - ms_free(from); - } -} - - - /* * Linphone core callback */ @@ -343,33 +262,6 @@ linphonec_notify_received(LinphoneCore *lc,const char *from,const char *msg) } } -/* - * Linphone core callback - */ -static void -linphonec_ack_paused_received(LinphoneCore *lc, LinphoneCall *call) -{ - char *from=linphone_call_get_remote_address_as_string(call); - if(from) - { - linphonec_out("the previous pause sent to %s has been acknowledged\n",from); - ms_free(from); - } -} - -/* - * Linphone core callback - */ -static void -linphonec_ack_resumed_received(LinphoneCore *lc, LinphoneCall *call) -{ - char *from=linphone_call_get_remote_address_as_string(call); - if(from) - { - linphonec_out("the previous resume sent to %s has been acknowledged\n",from); - ms_free(from); - } -} /* * Linphone core callback @@ -397,18 +289,33 @@ linphonec_new_unknown_subscriber(LinphoneCore *lc, LinphoneFriend *lf, } -/* - * Linphone core callback - */ -static void -linphonec_bye_received(LinphoneCore *lc, LinphoneCall *call) -{ - // Should change prompt back to original maybe - - // printing this is unneeded as we'd get a "Communication ended" - // message trough display_status callback anyway +static void linphonec_call_state_changed(LinphoneCore *lc, LinphoneCall *call, LinphoneCallState st, const char *msg){ char *from=linphone_call_get_remote_address_as_string(call); - printf("Bye received from %s\n", from); + switch(st){ + case LinphoneCallEnd: + printf("Call with %s ended.\n", from); + break; + case LinphoneCallResuming: + printf("Resuming call with %s.\n", from); + break; + case LinphoneCallStreamsRunning: + printf("Media streams established with %s.\n", from); + break; + case LinphoneCallPausing: + printf("Pausing call with %s.\n", from); + break; + case LinphoneCallPaused: + printf("Call with %s is now paused.\n", from); + break; + case LinphoneCallIncomingReceived: + linphonec_set_caller(from); + if ( auto_answer) { + answer_call=TRUE; + } + break; + default: + break; + } ms_free(from); } @@ -431,64 +338,6 @@ static void linphonec_dtmf_received(LinphoneCore *lc, LinphoneCall *call, int dt ms_free(from); } -static void -linphonec_general_state (LinphoneCore * lc, LinphoneGeneralState *gstate, LinphoneGeneralStateContext gctx) -{ - if (show_general_state) { - switch(gstate->new_state) { - case GSTATE_POWER_OFF: - printf("GSTATE_POWER_OFF"); - break; - case GSTATE_POWER_STARTUP: - printf("GSTATE_POWER_STARTUP"); - break; - case GSTATE_POWER_ON: - printf("GSTATE_POWER_ON"); - break; - case GSTATE_POWER_SHUTDOWN: - printf("GSTATE_POWER_SHUTDOWN"); - break; - case GSTATE_REG_NONE: - printf("GSTATE_REG_NONE"); - break; - case GSTATE_REG_OK: - printf("GSTATE_REG_OK"); - break; - case GSTATE_REG_FAILED: - printf("GSTATE_REG_FAILED"); - break; - case GSTATE_CALL_IDLE: - printf("GSTATE_CALL_IDLE"); - break; - case GSTATE_CALL_OUT_RINGING: - printf("GSTATE_CALL_OUT_RINGING"); - break; - case GSTATE_CALL_OUT_INVITE: - printf("GSTATE_CALL_OUT_INVITE"); - break; - case GSTATE_CALL_OUT_CONNECTED: - printf("GSTATE_CALL_OUT_CONNECTED"); - break; - case GSTATE_CALL_IN_INVITE: - printf("GSTATE_CALL_IN_INVITE"); - break; - case GSTATE_CALL_IN_CONNECTED: - printf("GSTATE_CALL_IN_CONNECTED"); - break; - case GSTATE_CALL_END: - printf("GSTATE_CALL_END"); - break; - case GSTATE_CALL_ERROR: - printf("GSTATE_CALL_ERROR"); - break; - default: - printf("GSTATE_UNKNOWN_%d",gstate->new_state); - } - if (gstate->message) printf(" %s", gstate->message); - printf("\n"); - } -} - static char received_prompt[PROMPT_MAX_LEN]; static ms_mutex_t prompt_mutex; static bool_t have_prompt=FALSE; @@ -668,6 +517,8 @@ bool_t linphonec_get_autoanswer(){ return auto_answer; } +LinphoneCoreVTable linphonec_vtable={0}; + /***************************************************************************/ /* * Main @@ -693,31 +544,24 @@ char **convert_args_to_ascii(int argc, _TCHAR **wargv){ int _tmain(int argc, _TCHAR* wargv[]) { char **argv=convert_args_to_ascii(argc,wargv); trace_level=6; - linphonec_vtable.show =(ShowInterfaceCb) stub; - linphonec_vtable.inv_recv = linphonec_call_received; - linphonec_vtable.bye_recv = linphonec_bye_received; - linphonec_vtable.notify_presence_recv = linphonec_notify_received; + +#else +int +main (int argc, char *argv[]) { +#endif + linphonec_vtable.call_state_changed=linphonec_call_state_changed; + linphonec_vtable.notify_presence_recv = linphonec_notify_presence_received; linphonec_vtable.new_unknown_subscriber = linphonec_new_unknown_subscriber; linphonec_vtable.auth_info_requested = linphonec_prompt_for_auth; linphonec_vtable.display_status = linphonec_display_status; linphonec_vtable.display_message=linphonec_display_something; -#ifdef VINCENT_MAURY_RSVP - /* the yes/no dialog box */ - linphonec_vtable.display_yes_no= (DisplayMessageCb) stub; -#endif linphonec_vtable.display_warning=linphonec_display_warning; linphonec_vtable.display_url=linphonec_display_url; - linphonec_vtable.display_question=(DisplayQuestionCb)stub; linphonec_vtable.text_received=linphonec_text_received; - linphonec_vtable.general_state=linphonec_general_state; linphonec_vtable.dtmf_received=linphonec_dtmf_received; - -#else -int -main (int argc, char *argv[]) { -#endif - - + linphonec_vtable.refer_received=linphonec_display_refer; + linphonec_vtable.notify_recv=linphonec_notify_received; + if (! linphonec_init(argc, argv) ) exit(EXIT_FAILURE); linphonec_main_loop (linphonec, sipAddr); diff --git a/coreapi/callbacks.c b/coreapi/callbacks.c index 7c52c83273a32d6fc2089da71fd2489bb45626ac..597aeb0c848df77e427c09edae426153ca21b003 100644 --- a/coreapi/callbacks.c +++ b/coreapi/callbacks.c @@ -95,7 +95,7 @@ static void call_received(SalOp *h){ linphone_address_clean(from_parsed); tmp=linphone_address_as_string(from_parsed); linphone_address_destroy(from_parsed); - linphone_call_set_state(call,LinphoneCallIncomingProgress,"Incoming call"); + linphone_call_set_state(call,LinphoneCallIncomingReceived,"Incoming call"); barmesg=ortp_strdup_printf("%s %s%s",tmp,_("is contacting you"), (sal_call_autoanswer_asked(h)) ?_(" and asked autoanswer."):_(".")); if (lc->vtable.show) lc->vtable.show(lc); @@ -190,10 +190,16 @@ static void call_accepted(SalOp *op){ call->media_pending=FALSE; } if (call->resultdesc && !sal_media_description_empty(call->resultdesc)){ - if (call->state==LinphoneCallPausing || sal_media_description_has_dir(call->resultdesc,SalStreamSendOnly)){ + if (sal_media_description_has_dir(call->resultdesc,SalStreamSendOnly)){ /*we initiated a pause*/ + if (lc->vtable.display_status){ + char *tmp=linphone_call_get_remote_address_as_string (call); + char *msg=ms_strdup_printf(_("Call with %s is paused."),tmp); + lc->vtable.display_status(lc,msg); + ms_free(tmp); + ms_free(msg); + } linphone_call_set_state(call,LinphoneCallPaused,"Call paused"); - linphone_call_set_media_streams_dir (call,SalStreamSendOnly); linphone_call_start_media_streams (call); }else{ linphone_connect_incoming(lc,call); @@ -252,21 +258,17 @@ static void call_updated(SalOp *op){ if(lc->vtable.display_status) lc->vtable.display_status(lc,_("We have been resumed...")); linphone_call_set_state (call,LinphoneCallStreamsRunning,"Connected (streams running)"); - linphone_call_set_media_streams_dir (call,SalStreamSendRecv); } else if(call->state==LinphoneCallStreamsRunning && sal_media_description_has_dir(call->resultdesc,SalStreamRecvOnly) && !strcmp(call->resultdesc->addr,"0.0.0.0")){ if(lc->vtable.display_status) lc->vtable.display_status(lc,_("We are being paused...")); linphone_call_set_state (call,LinphoneCallPaused,"Call paused"); - linphone_call_set_media_streams_dir (call,SalStreamRecvOnly); - } - else - { - linphone_call_stop_media_streams (call); - linphone_call_init_media_streams (call); - linphone_connect_incoming(lc,call); } + + linphone_call_stop_media_streams (call); + linphone_call_init_media_streams (call); + linphone_connect_incoming(lc,call); } } @@ -457,9 +459,17 @@ static void dtmf_received(SalOp *op, char dtmf){ static void refer_received(Sal *sal, SalOp *op, const char *referto){ LinphoneCore *lc=(LinphoneCore *)sal_get_user_pointer(sal); LinphoneCall *call=(LinphoneCall*)sal_op_get_user_pointer(op); - if (lc->vtable.refer_received){ - lc->vtable.refer_received(lc,call,referto); - if (op) sal_refer_accept(op); + if (call){ + linphone_call_set_state(call,LinphoneCallRefered,"Refered"); + if (lc->vtable.display_status){ + char *msg=ms_strdup_printf(_("We are transferred to %s"),referto); + lc->vtable.display_status(lc,msg); + ms_free(msg); + } + sal_refer_accept(op); + }else if (lc->vtable.refer_received){ + lc->vtable.refer_received(lc,referto); + sal_refer_accept(op); } } diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c index 0a3807442a022bd796b0d07a1fd0add60594c6d5..17df0e52ab9140b923d86065a1f59c62418348f8 100644 --- a/coreapi/linphonecall.c +++ b/coreapi/linphonecall.c @@ -335,6 +335,16 @@ LinphoneCallLog *linphone_call_get_call_log(const LinphoneCall *call){ return call->log; } +/** + * Returns the refer-to uri (if the call received was transfered). +**/ +const char *linphone_call_get_refer_to(const LinphoneCall *call){ + return call->refer_to; +} + +LinphoneCallDir linphone_call_get_dir(const LinphoneCall *call){ + return call->log->dir; +} /** * @} @@ -550,21 +560,35 @@ void linphone_call_start_media_streams(LinphoneCall *call){ { const SalStreamDescription *stream=sal_media_description_find_stream(call->resultdesc, SalProtoRtpAvp,SalAudio); - if (stream && stream->port!=0){ + if (stream){ + MSSndCard *playcard=lc->sound_conf.lsd_card ? + lc->sound_conf.lsd_card : lc->sound_conf.play_sndcard; + MSSndCard *captcard=lc->sound_conf.capt_sndcard; + const char *playfile=lc->play_file; + const char *recfile=lc->rec_file; call->audio_profile=make_profile(lc,call->resultdesc,stream,&used_pt); - if (!lc->use_files){ - MSSndCard *playcard=lc->sound_conf.lsd_card ? - lc->sound_conf.lsd_card : lc->sound_conf.play_sndcard; - MSSndCard *captcard=lc->sound_conf.capt_sndcard; + if (used_pt!=-1){ if (playcard==NULL) { ms_warning("No card defined for playback !"); - goto end; } if (captcard==NULL) { ms_warning("No card defined for capture !"); - goto end; } - audio_stream_start_now( + ms_message("streamdir is %i",stream->dir); + /*Replace soundcard filters by inactive file players or recorders + when placed in recvonly or sendonly mode*/ + if (stream->port==0 || stream->dir==SalStreamRecvOnly){ + captcard=NULL; + playfile=NULL; + }else if (stream->dir==SalStreamSendOnly){ + playcard=NULL; + captcard=NULL; + recfile=NULL; + } + /*if playfile are supplied don't use soundcards*/ + if (playfile) captcard=NULL; + if (recfile) playcard=NULL; + audio_stream_start_full( call->audiostream, call->audio_profile, stream->addr[0]!='\0' ? stream->addr : call->resultdesc->addr, @@ -572,54 +596,63 @@ void linphone_call_start_media_streams(LinphoneCall *call){ stream->port+1, used_pt, jitt_comp, + playfile, + recfile, playcard, captcard, linphone_core_echo_cancellation_enabled(lc)); - }else{ - audio_stream_start_with_files( - call->audiostream, - call->audio_profile, - stream->addr[0]!='\0' ? stream->addr : call->resultdesc->addr, - stream->port, - stream->port+1, - used_pt, - 100, - lc->play_file, - lc->rec_file); - } - post_configure_audio_streams(call); - audio_stream_set_rtcp_information(call->audiostream, cname, tool); - }else ms_warning("No audio stream defined ?"); + post_configure_audio_streams(call); + audio_stream_set_rtcp_information(call->audiostream, cname, tool); + }else ms_warning("No audio stream accepted ?"); + } } #ifdef VIDEO_ENABLED { const SalStreamDescription *stream=sal_media_description_find_stream(call->resultdesc, SalProtoRtpAvp,SalVideo); + used_pt=-1; /* shutdown preview */ if (lc->previewstream!=NULL) { video_preview_stop(lc->previewstream); lc->previewstream=NULL; } - if (stream && stream->port!=0 && (lc->video_conf.display || lc->video_conf.capture)) { + if (stream) { const char *addr=stream->addr[0]!='\0' ? stream->addr : call->resultdesc->addr; call->video_profile=make_profile(lc,call->resultdesc,stream,&used_pt); - video_stream_set_sent_video_size(call->videostream,linphone_core_get_preferred_video_size(lc)); - video_stream_enable_self_view(call->videostream,lc->video_conf.selfview); - if (lc->video_conf.display && lc->video_conf.capture) - video_stream_start(call->videostream, - call->video_profile, addr, stream->port, - stream->port+1, - used_pt, jitt_comp, lc->video_conf.device); - else if (lc->video_conf.display) - video_stream_recv_only_start(call->videostream, - call->video_profile, addr, stream->port, - used_pt, jitt_comp); - else if (lc->video_conf.capture) - video_stream_send_only_start(call->videostream, - call->video_profile, addr, stream->port, - stream->port+1, - used_pt, jitt_comp, lc->video_conf.device); - video_stream_set_rtcp_information(call->videostream, cname,tool); + if (used_pt!=-1){ + VideoStreamDir dir=VideoStreamSendRecv; + MSWebCam *cam=lc->video_conf.device; + bool_t is_inactive=FALSE; + + video_stream_set_sent_video_size(call->videostream,linphone_core_get_preferred_video_size(lc)); + video_stream_enable_self_view(call->videostream,lc->video_conf.selfview); + + if (stream->dir==SalStreamSendOnly && lc->video_conf.capture ){ + cam=ms_web_cam_manager_get_cam(ms_web_cam_manager_get(),"Static picture"); + dir=VideoStreamSendOnly; + }else if (stream->dir==SalStreamRecvOnly && lc->video_conf.display ){ + dir=VideoStreamRecvOnly; + }else if (stream->dir==SalStreamSendRecv){ + if (lc->video_conf.display && lc->video_conf.capture) + dir=VideoStreamSendRecv; + else if (lc->video_conf.display) + dir=VideoStreamRecvOnly; + else + dir=VideoStreamSendOnly; + }else{ + ms_warning("video stream is inactive."); + /*either inactive or incompatible with local capabilities*/ + is_inactive=TRUE; + } + if (!is_inactive){ + video_stream_set_direction (call->videostream, dir); + video_stream_start(call->videostream, + call->video_profile, addr, stream->port, + stream->port+1, + used_pt, jitt_comp, cam); + video_stream_set_rtcp_information(call->videostream, cname,tool); + } + }else ms_warning("No video stream accepted."); }else{ ms_warning("No valid video stream defined."); } @@ -638,7 +671,6 @@ static void linphone_call_log_fill_stats(LinphoneCallLog *log, AudioStream *st){ } void linphone_call_stop_media_streams(LinphoneCall *call){ - LinphoneCore *lc=call->core; if (call->audiostream!=NULL) { linphone_call_log_fill_stats (call->log,call->audiostream); audio_stream_stop(call->audiostream); @@ -646,12 +678,7 @@ void linphone_call_stop_media_streams(LinphoneCall *call){ } #ifdef VIDEO_ENABLED if (call->videostream!=NULL){ - if (lc->video_conf.display && lc->video_conf.capture) - video_stream_stop(call->videostream); - else if (lc->video_conf.display) - video_stream_recv_only_stop(call->videostream); - else if (lc->video_conf.capture) - video_stream_send_only_stop(call->videostream); + video_stream_stop(call->videostream); call->videostream=NULL; } @@ -668,6 +695,4 @@ void linphone_call_stop_media_streams(LinphoneCall *call){ } } -void linphone_call_set_media_streams_dir(LinphoneCall *call, SalStreamDir dir){ -} diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index 20f28384c7cf2485a73d6c8a2984885332d1f448..0c5420d668d28b35a0d9c7e258fb61ea53ecc8d9 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -1980,11 +1980,13 @@ LinphoneCall * linphone_core_invite_address(LinphoneCore *lc, const LinphoneAddr LinphoneCall *call; if (linphone_core_in_call(lc)){ - lc->vtable.display_warning(lc,_("Sorry, you have to pause or stop the current call first !")); + if (lc->vtable.display_warning) + lc->vtable.display_warning(lc,_("Sorry, you have to pause or stop the current call first !")); return NULL; } if(!linphone_core_can_we_add_call(lc)){ - lc->vtable.display_warning(lc,_("Sorry, we have reached the maximum number of simultaneous calls")); + if (lc->vtable.display_warning) + lc->vtable.display_warning(lc,_("Sorry, we have reached the maximum number of simultaneous calls")); return NULL; } linphone_core_get_default_proxy(lc,&proxy); @@ -2013,10 +2015,12 @@ LinphoneCall * linphone_core_invite_address(LinphoneCore *lc, const LinphoneAddr if(linphone_core_add_call(lc,call)!= 0) { - ms_warning("we had a problem in adding the call into the invite ... weird\n"); + ms_warning("we had a problem in adding the call into the invite ... weird"); linphone_call_unref(call); return NULL; } + /* this call becomes now the current one*/ + lc->current_call=call; if (dest_proxy!=NULL || lc->sip_conf.ping_with_options==FALSE){ err=linphone_core_start_invite(lc,call,dest_proxy); }else{ @@ -2089,12 +2093,17 @@ int linphone_core_accept_call(LinphoneCore *lc, LinphoneCall *call) if (call==NULL){ //if just one call is present answer the only one ... - if(ms_list_size(linphone_core_get_calls(lc)) != 1) + if(linphone_core_get_calls_nb (lc) != 1) return -1; else - call = linphone_core_get_calls(lc)->data; + call = (LinphoneCall*)linphone_core_get_calls(lc)->data; } + if (lc->current_call){ + ms_warning("Cannot accept this call, there is already one running."); + return -1; + } + if (call->state==LinphoneCallConnected){ /*call already accepted*/ return -1; @@ -2119,10 +2128,6 @@ int linphone_core_accept_call(LinphoneCore *lc, LinphoneCall *call) ms_message("ring stopped"); lc->ringstream=NULL; } - if(linphone_core_set_as_current_call(lc,call)!=0) - { - ms_message("another call is already in process\n"); - } linphone_core_get_default_proxy(lc,&cfg); /*try to be best-effort in giving real local or routable contact address*/ @@ -2135,6 +2140,7 @@ int linphone_core_accept_call(LinphoneCore *lc, LinphoneCall *call) sal_call_accept(call->op); if (lc->vtable.display_status!=NULL) lc->vtable.display_status(lc,_("Connected.")); + lc->current_call=call; linphone_call_set_state(call,LinphoneCallConnected,"Connected"); call->resultdesc=sal_call_get_final_media_description(call->op); if (call->resultdesc){ @@ -2214,13 +2220,17 @@ int linphone_core_terminate_all_calls(LinphoneCore *lc){ } /** - * Returns the calls MSList + * Returns the current list of calls. + * + * Note that this list is read-only and might be changed by the core after a function call to linphone_core_iterate(). + * Similarly the LinphoneCall objects inside it might be destroyed without prior notice. + * To hold references to LinphoneCall object into your program, you must use linphone_call_ref(). * * @ingroup call_control **/ -MSList *linphone_core_get_calls(LinphoneCore *lc) +const MSList *linphone_core_get_calls(LinphoneCore *lc) { - return ms_list_copy(lc->calls); + return lc->calls; } /** @@ -2250,23 +2260,7 @@ LinphoneCall *linphone_core_get_current_call(const LinphoneCore *lc) int linphone_core_pause_call(LinphoneCore *lc, LinphoneCall *the_call) { LinphoneCall *call = the_call; - if(lc == NULL) - { - ms_error("LinphoneCore was null\n"); - return -1; - } - if(call == NULL) - { - if(linphone_core_in_call(lc)) - { - call = linphone_core_get_current_call(lc); - } - else - { - ms_error("LinphoneCall was null"); - return -1; - } - } + if(linphone_core_get_current_call(lc) != call) { ms_error("The call asked to be paused was not the current on"); @@ -2280,6 +2274,7 @@ int linphone_core_pause_call(LinphoneCore *lc, LinphoneCall *the_call) linphone_call_set_state(call,LinphoneCallPausing,"Pausing call"); if (lc->vtable.display_status) lc->vtable.display_status(lc,_("Pausing the current call...")); + lc->current_call=NULL; return 0; } @@ -2292,46 +2287,24 @@ int linphone_core_resume_call(LinphoneCore *lc, LinphoneCall *the_call) { char temp[255]={0}; LinphoneCall *call = the_call; - if(lc == NULL) - { - ms_error("LinphoneCore was null\n"); - return -1; - } - if(call == NULL) - { - MSList *calls = linphone_core_get_calls(lc); - if(ms_list_size(calls) == 1) - { - call = ((LinphoneCall *)calls->data); - ms_list_free(calls); - } - else - { - ms_error("LinphoneCall was null\n"); - ms_list_free(calls); - return -2; - } - } - if(call->state!=LinphoneCallPaused ) - { + + if(call->state!=LinphoneCallPaused ){ ms_warning("we cannot resume a call when the communication is not established"); return -1; } - if(linphone_core_get_current_call(lc) != NULL) - { - ms_error("There is already a call in process pause or stop it first\n"); + if(linphone_core_get_current_call(lc) != NULL){ + if (lc->vtable.display_warning) + lc->vtable.display_warning(lc,_("There is already a call in process, pause or stop it first.")); return -1; } - if(sal_call_hold(call->op,FALSE) != 0) - { - lc->vtable.display_warning(lc,_("Could not resume the call")); + if(sal_call_hold(call->op,FALSE) != 0){ + return -1; } linphone_call_set_state (call,LinphoneCallResuming,"Resuming"); - linphone_core_set_as_current_call(lc,call); snprintf(temp,sizeof(temp)-1,"Resuming the call with %s",linphone_call_get_remote_address_as_string(call)); if (lc->vtable.display_status) lc->vtable.display_status(lc,temp); - + lc->current_call=call; return 0; } @@ -3145,7 +3118,7 @@ int linphone_core_set_static_picture(LinphoneCore *lc, const char *path) { unsigned long linphone_core_get_native_video_window_id(const LinphoneCore *lc){ #ifdef VIDEO_ENABLED LinphoneCall *call=linphone_core_get_current_call (lc); - if (call->videostream) + if (call && call->videostream) return video_stream_get_native_window_id(call->videostream); if (lc->previewstream) return video_stream_get_native_window_id(lc->previewstream); @@ -3617,18 +3590,8 @@ void linphone_core_destroy(LinphoneCore *lc){ * * @ingroup call_control **/ -int linphone_core_get_calls_nb(const LinphoneCore *lc) -{ - int returned; - if(lc->calls == NULL) - { - returned = 0; - } - else - { - returned = ms_list_size(lc->calls); - } - return returned; +int linphone_core_get_calls_nb(const LinphoneCore *lc){ + return ms_list_size(lc->calls);; } /** @@ -3644,44 +3607,12 @@ bool_t linphone_core_can_we_add_call(LinphoneCore *lc) return FALSE; } -/** - * Unset the current call - * - * @ingroup call_control -**/ -int linphone_core_unset_the_current_call(LinphoneCore *lc) -{ - if(lc->current_call == NULL) - return -1; - lc->current_call = NULL; - ms_message("Current call unset\n"); - return 0; -} - -/** - * Set the call in parameter as the new current call - * - * @ingroup call_control -**/ -int linphone_core_set_as_current_call(LinphoneCore *lc, LinphoneCall *call) -{ - if(lc->current_call != NULL) - return -1; - lc->current_call = call; - return 0; -} - int linphone_core_add_call( LinphoneCore *lc, LinphoneCall *call) { if(linphone_core_can_we_add_call(lc)) { - MSList *the_calls = lc->calls; - if (the_calls==NULL){ - lc->current_call=call; - } - the_calls = ms_list_append(the_calls,call); - lc->calls = the_calls; + lc->calls = ms_list_append(lc->calls,call); return 0; } return -1; @@ -3690,12 +3621,8 @@ int linphone_core_add_call( LinphoneCore *lc, LinphoneCall *call) int linphone_core_del_call( LinphoneCore *lc, LinphoneCall *call) { MSList *it; - MSList *the_calls = lc->calls; - if(call == linphone_core_get_current_call(lc)) - { - linphone_core_unset_the_current_call(lc); - } + it=ms_list_find(the_calls,call); if (it) { diff --git a/coreapi/linphonecore.h b/coreapi/linphonecore.h index 774dcc817cde9b6244f199f2b373a8bc6b4bf9c5..a1ed9d317e94fe5c4b6d205790b37b65edc208c2 100644 --- a/coreapi/linphonecore.h +++ b/coreapi/linphonecore.h @@ -167,9 +167,11 @@ bool_t linphone_call_asked_to_autoanswer(LinphoneCall *call); const LinphoneAddress * linphone_core_get_current_call_remote_address(struct _LinphoneCore *lc); const LinphoneAddress * linphone_call_get_remote_address(const LinphoneCall *call); char *linphone_call_get_remote_address_as_string(const LinphoneCall *call); +LinphoneCallDir linphone_call_get_dir(const LinphoneCall *call); void linphone_call_ref(LinphoneCall *call); void linphone_call_unref(LinphoneCall *call); LinphoneCallLog *linphone_call_get_call_log(const LinphoneCall *call); +const char *linphone_call_get_refer_to(const LinphoneCall *call); void *linphone_call_get_user_pointer(LinphoneCall *call); void linphone_call_set_user_pointer(LinphoneCall *call, void *user_pointer); @@ -364,7 +366,7 @@ void * linphone_chat_room_get_user_data(LinphoneChatRoom *cr); typedef enum _LinphoneCallState{ LinphoneCallIdle, - LinphoneCallIncomingProgress, + LinphoneCallIncomingReceived, LinphoneCallOutgoingInit, LinphoneCallOutgoingProgress, LinphoneCallOutgoingRinging, @@ -431,7 +433,7 @@ typedef void (*TextMessageReceived)(struct _LinphoneCore *lc, LinphoneChatRoom * /** Callback prototype */ typedef void (*DtmfReceived)(struct _LinphoneCore* lc, LinphoneCall *call, int dtmf); /** Callback prototype */ -typedef void (*ReferReceived)(struct _LinphoneCore *lc, LinphoneCall *call, const char *refer_to); +typedef void (*ReferReceived)(struct _LinphoneCore *lc, const char *refer_to); /** Callback prototype */ typedef void (*BuddyInfoUpdated)(struct _LinphoneCore *lc, LinphoneFriend *lf); @@ -449,7 +451,7 @@ typedef struct _LinphoneVTable{ CallLogUpdated call_log_updated; /**< Notifies that call log list has been updated */ TextMessageReceived text_received; /**< A text message has been received */ DtmfReceived dtmf_received; /**< A dtmf has been received received */ - ReferReceived refer_received; /**< A refer was received */ + ReferReceived refer_received; /**< An out of call refer was received */ BuddyInfoUpdated buddy_info_updated; /**< a LinphoneFriend's BuddyInfo has changed*/ NotifyReceivedCb notify_recv; /**< Other notifications*/ DisplayStatusCb display_status; /**< Callback that notifies various events with human readable text.*/ @@ -813,10 +815,12 @@ void linphone_core_set_audio_transports(LinphoneCore *lc, RtpTransport *rtp, Rtp int linphone_core_get_current_call_stats(LinphoneCore *lc, rtp_stats_t *local, rtp_stats_t *remote); +const MSList *linphone_core_get_calls(LinphoneCore *lc); + #ifdef __cplusplus } #endif -MSList *linphone_core_get_calls(LinphoneCore *lc); + #endif diff --git a/coreapi/offeranswer.c b/coreapi/offeranswer.c index d69a22ddd5805a566a027e5e09aa6bbe87b409d0..efd44552de674d90c13c011cec046ec40c954b5a 100644 --- a/coreapi/offeranswer.c +++ b/coreapi/offeranswer.c @@ -85,6 +85,8 @@ static void initiate_outgoing(const SalStreamDescription *local_offer, result->payloads=match_payloads(local_offer->payloads,remote_answer->payloads); result->proto=local_offer->proto; result->type=local_offer->type; + result->dir=local_offer->dir; + if (result->payloads && !only_telephone_event(result->payloads)){ strcpy(result->addr,remote_answer->addr); result->port=remote_answer->port; @@ -102,6 +104,13 @@ static void initiate_incoming(const SalStreamDescription *local_cap, result->payloads=match_payloads(local_cap->payloads,remote_offer->payloads); result->proto=local_cap->proto; result->type=local_cap->type; + if (remote_offer->dir==SalStreamSendOnly) + result->dir=SalStreamRecvOnly; + else if (remote_offer->dir==SalStreamRecvOnly){ + result->dir=SalStreamSendOnly; + }else if (remote_offer->dir==SalStreamInactive){ + result->dir=SalStreamInactive; + }else result->dir=SalStreamSendRecv; if (result->payloads && !only_telephone_event(result->payloads)){ strcpy(result->addr,local_cap->addr); result->port=local_cap->port; diff --git a/coreapi/private.h b/coreapi/private.h index 28caaaf9daadab7f947d43a8dffb7f7e03627134..e5d0e9055592ab4c7448ed419c3983293dd4477b 100644 --- a/coreapi/private.h +++ b/coreapi/private.h @@ -75,6 +75,7 @@ struct _LinphoneCall int video_port; struct _AudioStream *audiostream; /**/ struct _VideoStream *videostream; + char *refer_to; bool_t media_pending; bool_t audio_muted; }; diff --git a/gtk-glade/friendlist.c b/gtk-glade/friendlist.c index d4fddf871d3e6e39fd8f1b2a7a905e44807af09a..3805057c3795b78886dd922bc895d37c2adc74ad 100644 --- a/gtk-glade/friendlist.c +++ b/gtk-glade/friendlist.c @@ -39,18 +39,18 @@ typedef struct _status_picture_tab_t{ } status_picture_tab_t; status_picture_tab_t status_picture_tab[]={ - { LINPHONE_STATUS_ONLINE, "status-green.png" }, - { LINPHONE_STATUS_BUSY, "status-orange.png" }, - { LINPHONE_STATUS_BERIGHTBACK, "status-orange.png" }, - { LINPHONE_STATUS_AWAY, "status-orange.png" }, - { LINPHONE_STATUS_ONTHEPHONE, "status-orange.png" }, - { LINPHONE_STATUS_OUTTOLUNCH, "status-orange.png" }, - { LINPHONE_STATUS_NOT_DISTURB, "status-red.png" }, - { LINPHONE_STATUS_MOVED, "status-orange.png" }, - { LINPHONE_STATUS_ALT_SERVICE, "status-orange.png" }, - { LINPHONE_STATUS_OFFLINE, "status-offline.png" }, - { LINPHONE_STATUS_PENDING, "status-offline.png" }, - { LINPHONE_STATUS_END, NULL }, + { LinphoneStatusOnline, "status-green.png" }, + { LinphoneStatusBusy, "status-orange.png" }, + { LinphoneStatusBeRightBack, "status-orange.png" }, + { LinphoneStatusAway, "status-orange.png" }, + { LinphoneStatusOnThePhone, "status-orange.png" }, + { LinphoneStatusOutToLunch, "status-orange.png" }, + { LinphoneStatusDoNotDisturb, "status-red.png" }, + { LinphoneStatusMoved, "status-orange.png" }, + { LinphoneStatusAltService, "status-orange.png" }, + { LinphoneStatusOffline, "status-offline.png" }, + { LinphoneStatusPending, "status-offline.png" }, + { LinphoneStatusEnd, NULL }, }; static GdkPixbuf *create_status_picture(LinphoneOnlineStatus ss){ @@ -132,7 +132,7 @@ static GtkWidget * create_presence_menu(){ GdkPixbuf *pbuf; status_picture_tab_t *t; for(t=status_picture_tab;t->img!=NULL;++t){ - if (t->status==LINPHONE_STATUS_PENDING){ + if (t->status==LinphoneStatusPending){ continue; } menu_item=gtk_image_menu_item_new_with_label(linphone_online_status_to_string(t->status)); @@ -317,7 +317,7 @@ void linphone_gtk_show_friends(void){ continue; } } - if (!online_only || (linphone_friend_get_status(lf)!=LINPHONE_STATUS_OFFLINE)){ + if (!online_only || (linphone_friend_get_status(lf)!=LinphoneStatusOffline)){ BuddyInfo *bi; if (name==NULL || name[0]=='\0') display=uri; gtk_list_store_append(store,&iter); diff --git a/gtk-glade/incall_view.c b/gtk-glade/incall_view.c index 2874da52a4172df2f6243f1ffb83f5724d180003..4d60d6309c75eda071792890c251190bf43328d5 100644 --- a/gtk-glade/incall_view.c +++ b/gtk-glade/incall_view.c @@ -231,22 +231,29 @@ void linphone_gtk_draw_hold_button(GtkToggleButton *button, gboolean active){ } void linphone_gtk_hold_toggled(GtkToggleButton *button){ - GtkWidget *mw=linphone_gtk_get_main_window(); gboolean active=gtk_toggle_button_get_active(button); + if(active) { - linphone_core_pause_call(linphone_gtk_get_core(),NULL); - gtk_widget_set_sensitive(linphone_gtk_get_widget(mw,"terminate_call"),FALSE); + LinphoneCall *call=linphone_core_get_current_call (linphone_gtk_get_core()); + if (call==NULL) return; + linphone_core_pause_call(linphone_gtk_get_core(),call); } else { - linphone_core_resume_call(linphone_gtk_get_core(),NULL); - gtk_widget_set_sensitive(linphone_gtk_get_widget(mw,"terminate_call"),TRUE); + const MSList *calls=linphone_core_get_calls(linphone_gtk_get_core()); + if (calls==NULL) return; + if (ms_list_size(calls)>1){ + g_warning("Simultaneously calls not yet implemented in gtk ui."); + return; + } + /*we are supposed to have only one */ + linphone_core_resume_call(linphone_gtk_get_core(),(LinphoneCall*)calls->data); } linphone_gtk_draw_hold_button(button,active); } void linphone_gtk_enable_hold_button(GtkToggleButton *button, gboolean sensitive){ gtk_widget_set_sensitive(GTK_WIDGET(button),sensitive); - linphone_gtk_hold_toggled(button); + linphone_gtk_draw_hold_button(button,FALSE); } diff --git a/gtk-glade/main.c b/gtk-glade/main.c index 56b5728608b469f67af4d0c158287072091baefd..d5a1b0997dbbdb18dd68965135b1995fe168f001 100644 --- a/gtk-glade/main.c +++ b/gtk-glade/main.c @@ -43,7 +43,6 @@ static GtkWidget *the_ui=NULL; static void linphone_gtk_show(LinphoneCore *lc); static void linphone_gtk_inv_recv(LinphoneCore *lc, LinphoneCall *call); -static void linphone_gtk_bye_recv(LinphoneCore *lc, LinphoneCall *call); static void linphone_gtk_notify_recv(LinphoneCore *lc, LinphoneFriend * fid); static void linphone_gtk_new_unknown_subscriber(LinphoneCore *lc, LinphoneFriend *lf, const char *url); static void linphone_gtk_auth_info_requested(LinphoneCore *lc, const char *realm, const char *username); @@ -52,27 +51,10 @@ static void linphone_gtk_display_message(LinphoneCore *lc, const char *msg); static void linphone_gtk_display_warning(LinphoneCore *lc, const char *warning); static void linphone_gtk_display_url(LinphoneCore *lc, const char *msg, const char *url); static void linphone_gtk_call_log_updated(LinphoneCore *lc, LinphoneCallLog *cl); -static void linphone_gtk_general_state(LinphoneCore *lc, LinphoneGeneralState *gstate, LinphoneGeneralStateContext gctx); -static void linphone_gtk_refer_received(LinphoneCore *lc, LinphoneCall *call, const char *refer_to); +static void linphone_gtk_refer_received(LinphoneCore *lc, const char *refer_to); +static void linphone_gtk_call_state_changed(LinphoneCore *lc, LinphoneCall *call, LinphoneCallState cs, const char *msg); static gboolean linphone_gtk_auto_answer(GtkWidget *incall_window); -static LinphoneCoreVTable vtable={ - .show=linphone_gtk_show, - .inv_recv=linphone_gtk_inv_recv, - .bye_recv=linphone_gtk_bye_recv, - .notify_presence_recv=linphone_gtk_notify_recv, - .new_unknown_subscriber=linphone_gtk_new_unknown_subscriber, - .auth_info_requested=linphone_gtk_auth_info_requested, - .display_status=linphone_gtk_display_status, - .display_message=linphone_gtk_display_message, - .display_warning=linphone_gtk_display_warning, - .display_url=linphone_gtk_display_url, - .call_log_updated=linphone_gtk_call_log_updated, - .text_received=linphone_gtk_text_received, - .general_state=linphone_gtk_general_state, - .refer_received=linphone_gtk_refer_received, - .buddy_info_updated=linphone_gtk_buddy_info_updated -}; static gboolean verbose=0; static gboolean auto_answer = 0; @@ -209,6 +191,22 @@ static const char *linphone_gtk_get_factory_config_file(){ static void linphone_gtk_init_liblinphone(const char *config_file, const char *factory_config_file) { + LinphoneCoreVTable vtable={0}; + + vtable.call_state_changed=linphone_gtk_call_state_changed; + vtable.show=linphone_gtk_show; + vtable.notify_presence_recv=linphone_gtk_notify_recv; + vtable.new_unknown_subscriber=linphone_gtk_new_unknown_subscriber; + vtable.auth_info_requested=linphone_gtk_auth_info_requested; + vtable.display_status=linphone_gtk_display_status; + vtable.display_message=linphone_gtk_display_message; + vtable.display_warning=linphone_gtk_display_warning; + vtable.display_url=linphone_gtk_display_url; + vtable.call_log_updated=linphone_gtk_call_log_updated; + vtable.text_received=linphone_gtk_text_received; + vtable.refer_received=linphone_gtk_refer_received; + vtable.buddy_info_updated=linphone_gtk_buddy_info_updated; + linphone_core_set_user_agent("Linphone", LINPHONE_VERSION); the_core=linphone_core_new(&vtable,config_file,factory_config_file,NULL); linphone_core_set_waiting_callback(the_core,linphone_gtk_wait,NULL); @@ -641,7 +639,9 @@ void linphone_gtk_uri_bar_activate(GtkWidget *w){ void linphone_gtk_terminate_call(GtkWidget *button){ - linphone_core_terminate_call(linphone_gtk_get_core(),NULL); + const MSList *elem=linphone_core_get_calls(linphone_gtk_get_core()); + if (elem==NULL) return; + linphone_core_terminate_call(linphone_gtk_get_core(),(LinphoneCall*)elem->data); } void linphone_gtk_decline_call(GtkWidget *button){ @@ -729,10 +729,6 @@ static void linphone_gtk_inv_recv(LinphoneCore *lc, LinphoneCall *call){ ms_free(from); } -static void linphone_gtk_bye_recv(LinphoneCore *lc, LinphoneCall *call){ - -} - static void linphone_gtk_notify_recv(LinphoneCore *lc, LinphoneFriend * fid){ linphone_gtk_show_friends(); } @@ -873,22 +869,24 @@ static void linphone_gtk_call_log_updated(LinphoneCore *lc, LinphoneCallLog *cl) if (w) linphone_gtk_call_log_update(w); } -static void linphone_gtk_general_state(LinphoneCore *lc, LinphoneGeneralState *gstate, LinphoneGeneralStateContext gctx){ - switch(gstate->new_state){ - case GSTATE_CALL_OUT_CONNECTED: - case GSTATE_CALL_IN_CONNECTED: +static void linphone_gtk_call_state_changed(LinphoneCore *lc, LinphoneCall *call, LinphoneCallState cs, const char *msg){ + switch(cs){ + case LinphoneCallConnected: if (linphone_gtk_use_in_call_view()) linphone_gtk_in_call_view_set_in_call(); linphone_gtk_enable_mute_button( GTK_TOGGLE_BUTTON(linphone_gtk_get_widget(linphone_gtk_get_main_window(),"main_mute")), TRUE); break; - case GSTATE_CALL_ERROR: - linphone_gtk_call_terminated(gstate->message); + case LinphoneCallError: + linphone_gtk_call_terminated(msg); break; - case GSTATE_CALL_END: + case LinphoneCallEnd: linphone_gtk_call_terminated(NULL); break; + case LinphoneCallIncomingReceived: + linphone_gtk_inv_recv (lc,call); + break; default: break; } @@ -1204,7 +1202,7 @@ void linphone_gtk_log_handler(OrtpLogLevel lev, const char *fmt, va_list args){ } -static void linphone_gtk_refer_received(LinphoneCore *lc, LinphoneCall *call, const char *refer_to){ +static void linphone_gtk_refer_received(LinphoneCore *lc, const char *refer_to){ GtkEntry * uri_bar =GTK_ENTRY(linphone_gtk_get_widget( linphone_gtk_get_main_window(), "uribar")); linphone_gtk_show_main_window(); diff --git a/gtk-glade/propertybox.c b/gtk-glade/propertybox.c index bab3e3af6fa1bd82f75492e671f8c1bfcc6bc5db..be4073fb9100284840a6c6aaf3b041810f206bef 100644 --- a/gtk-glade/propertybox.c +++ b/gtk-glade/propertybox.c @@ -119,17 +119,17 @@ void linphone_gtk_video_port_changed(GtkWidget *w){ void linphone_gtk_no_firewall_toggled(GtkWidget *w){ if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w))) - linphone_core_set_firewall_policy(linphone_gtk_get_core(),LINPHONE_POLICY_NO_FIREWALL); + linphone_core_set_firewall_policy(linphone_gtk_get_core(),LinphonePolicyNoFirewall); } void linphone_gtk_use_nat_address_toggled(GtkWidget *w){ if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w))) - linphone_core_set_firewall_policy(linphone_gtk_get_core(),LINPHONE_POLICY_USE_NAT_ADDRESS); + linphone_core_set_firewall_policy(linphone_gtk_get_core(),LinphonePolicyUseNatAddress); } void linphone_gtk_use_stun_toggled(GtkWidget *w){ if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w))) - linphone_core_set_firewall_policy(linphone_gtk_get_core(),LINPHONE_POLICY_USE_STUN); + linphone_core_set_firewall_policy(linphone_gtk_get_core(),LinphonePolicyUseStun); } void linphone_gtk_mtu_changed(GtkWidget *w){ @@ -762,13 +762,13 @@ void linphone_gtk_show_parameters(void){ if (tmp) gtk_entry_set_text(GTK_ENTRY(linphone_gtk_get_widget(pb,"stun_server")),tmp); pol=linphone_core_get_firewall_policy(lc); switch(pol){ - case LINPHONE_POLICY_NO_FIREWALL: + case LinphonePolicyNoFirewall: gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(linphone_gtk_get_widget(pb,"no_nat")),TRUE); break; - case LINPHONE_POLICY_USE_NAT_ADDRESS: + case LinphonePolicyUseNatAddress: gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(linphone_gtk_get_widget(pb,"use_nat_address")),TRUE); break; - case LINPHONE_POLICY_USE_STUN: + case LinphonePolicyUseStun: gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(linphone_gtk_get_widget(pb,"use_stun")),TRUE); break; } diff --git a/mediastreamer2 b/mediastreamer2 index 04be0f4c3eac2d30828963b3617497bb9337e3bc..236222b3f08baf502742b6c75633f50e3a14917f 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 04be0f4c3eac2d30828963b3617497bb9337e3bc +Subproject commit 236222b3f08baf502742b6c75633f50e3a14917f