From 51abeed0b5dcb740c3ddb42825dd3bda50e0747c Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Thu, 2 Apr 2015 18:46:06 +0200 Subject: [PATCH 001/157] fix video stream not started when called party is configured with automatically accept policy in case of first invited in audio only and video is later added. --- coreapi/callbacks.c | 2 +- tester/call_tester.c | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/coreapi/callbacks.c b/coreapi/callbacks.c index a82b11f33..48235265c 100644 --- a/coreapi/callbacks.c +++ b/coreapi/callbacks.c @@ -147,7 +147,7 @@ void linphone_core_update_streams(LinphoneCore *lc, LinphoneCall *call, SalMedia /* we already started media: check if we really need to restart it*/ if (oldmd){ int md_changed = media_parameters_changed(call, oldmd, new_md); - if ((md_changed & SAL_MEDIA_DESCRIPTION_CODEC_CHANGED)){ + if ((md_changed & (SAL_MEDIA_DESCRIPTION_CODEC_CHANGED|SAL_MEDIA_DESCRIPTION_STREAMS_CHANGED))){ ms_message("Media descriptions are different, need to restart the streams."); } else if ( call->playing_ringbacktone) { ms_message("Playing ringback tone, will restart the streams."); diff --git a/tester/call_tester.c b/tester/call_tester.c index 721f8362c..becd29549 100644 --- a/tester/call_tester.c +++ b/tester/call_tester.c @@ -1537,6 +1537,29 @@ static void call_with_video_added(void) { linphone_core_manager_destroy(pauline); } +static void call_with_video_added_2(void) { + LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); + LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc"); + + /*in this variant marie is already in automatically accept*/ + LinphoneVideoPolicy marie_policy; + marie_policy.automatically_accept=TRUE; + linphone_core_set_video_policy(marie->lc,&marie_policy); + linphone_core_enable_video_capture(marie->lc, TRUE); + linphone_core_enable_video_display(marie->lc, FALSE); + + CU_ASSERT_TRUE(call(pauline,marie)); + + CU_ASSERT_TRUE(add_video(marie,pauline)); + /*just to sleep*/ + linphone_core_terminate_all_calls(pauline->lc); + CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallEnd,1)); + CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallEnd,1)); + + linphone_core_manager_destroy(marie); + linphone_core_manager_destroy(pauline); +} + static void call_with_video_added_random_ports(void) { LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc"); @@ -3885,6 +3908,7 @@ test_t call_tests[] = { { "SRTP ice video call", srtp_video_ice_call }, { "ZRTP ice video call", zrtp_video_ice_call }, { "Call with video added", call_with_video_added }, + { "Call with video added 2", call_with_video_added_2 }, { "Call with video added (random ports)", call_with_video_added_random_ports }, { "Call with several video switches", call_with_several_video_switches }, { "SRTP call with several video switches", srtp_call_with_several_video_switches }, From 1fd8e12180fd8080d2ef8596d4b4a565d5b46239 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Fri, 3 Apr 2015 14:03:00 +0200 Subject: [PATCH 002/157] change local ip management to take into account new bind_address settings for both media and sig --- coreapi/linphonecall.c | 34 +++++++++++++++++++++++----------- coreapi/private.h | 3 ++- 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c index 1c03ec931..84d3e5b63 100644 --- a/coreapi/linphonecall.c +++ b/coreapi/linphonecall.c @@ -555,19 +555,19 @@ static void transfer_already_assigned_payload_types(SalMediaDescription *old, Sa } static const char *linphone_call_get_bind_ip_for_stream(LinphoneCall *call, int stream_index){ - const char *bind_ip = lp_config_get_string(call->core->config,"rtp","bind_address",call->af==AF_INET6 ? "::0" : "0.0.0.0"); ; + const char *bind_ip = lp_config_get_string(call->core->config,"rtp","bind_address",call->af==AF_INET6 ? "::0" : "0.0.0.0"); if (stream_index<2 && call->media_ports[stream_index].multicast_ip[0]!='\0'){ if (call->dir==LinphoneCallOutgoing){ /*as multicast sender, we must decide a local interface to use to send multicast, and bind to it*/ - bind_ip=call->localip; + bind_ip=call->media_localip; } } return bind_ip; } static const char *linphone_call_get_public_ip_for_stream(LinphoneCall *call, int stream_index){ - const char *public_ip=call->localip; + const char *public_ip=call->media_localip; if (stream_index<2 && call->media_ports[stream_index].multicast_ip[0]!='\0') public_ip=call->media_ports[stream_index].multicast_ip; @@ -610,7 +610,7 @@ void linphone_call_make_local_media_description(LinphoneCore *lc, LinphoneCall * md->session_ver=(old_md ? (old_md->session_ver+1) : (rand() & 0xfff)); md->nb_streams=(call->biggestdesc ? call->biggestdesc->nb_streams : 1); - strncpy(md->addr,call->localip,sizeof(md->addr)); + strncpy(md->addr,call->media_localip,sizeof(md->addr)); if (linphone_address_get_username(addr)) /*might be null in case of identity without userinfo*/ strncpy(md->username,linphone_address_get_username(addr),sizeof(md->username)); if (subject) strncpy(md->name,subject,sizeof(md->name)); @@ -906,18 +906,30 @@ static void linphone_call_get_local_ip(LinphoneCall *call, const LinphoneAddress } if (linphone_core_get_firewall_policy(call->core)==LinphonePolicyUseNatAddress && (ip=linphone_core_get_nat_address_resolved(call->core))!=NULL){ - strncpy(call->localip,ip,LINPHONE_IPADDR_SIZE); + strncpy(call->media_localip,ip,LINPHONE_IPADDR_SIZE); + strncpy(call->sig_localip,ip,LINPHONE_IPADDR_SIZE); return; } #ifdef BUILD_UPNP else if (call->core->upnp != NULL && linphone_core_get_firewall_policy(call->core)==LinphonePolicyUseUpnp && linphone_upnp_context_get_state(call->core->upnp) == LinphoneUpnpStateOk) { ip = linphone_upnp_context_get_external_ipaddress(call->core->upnp); - strncpy(call->localip,ip,LINPHONE_IPADDR_SIZE); + strncpy(call->media_localip,ip,LINPHONE_IPADDR_SIZE); + strncpy(call->sig_localip,ip,LINPHONE_IPADDR_SIZE); return; } #endif //BUILD_UPNP - linphone_core_get_local_ip(call->core, af, dest, call->localip); + /*first nominal use case*/ + linphone_core_get_local_ip(call->core, af, dest, call->media_localip); + strncpy(call->sig_localip,call->media_localip,LINPHONE_IPADDR_SIZE); + + /*next, sometime, override from config*/ + if ((ip=lp_config_get_string(call->core->config,"rtp","bind_address",NULL))) + strncpy(call->media_localip,ip,LINPHONE_IPADDR_SIZE); + if ((ip=lp_config_get_string(call->core->config,"sip","bind_address",NULL))) + strncpy(call->sig_localip,ip,LINPHONE_IPADDR_SIZE); + + return; } static void linphone_call_destroy(LinphoneCall *obj); @@ -3739,7 +3751,7 @@ void linphone_call_zoom_video(LinphoneCall* call, float zoom_factor, float* cx, static LinphoneAddress *get_fixed_contact(LinphoneCore *lc, LinphoneCall *call , LinphoneProxyConfig *dest_proxy){ LinphoneAddress *ctt=NULL; LinphoneAddress *ret=NULL; - const char *localip=call->localip; + //const char *localip=call->localip; /* first use user's supplied ip address if asked*/ if (linphone_core_get_firewall_policy(lc)==LinphonePolicyUseNatAddress){ @@ -3762,9 +3774,9 @@ static LinphoneAddress *get_fixed_contact(LinphoneCore *lc, LinphoneCall *call , ctt=linphone_core_get_primary_contact_parsed(lc); if (ctt!=NULL){ /*otherwise use supplied localip*/ - linphone_address_set_domain(ctt,localip); - linphone_address_set_port(ctt,linphone_core_get_sip_port(lc)); - ms_message("Contact has been fixed using local ip"/* to %s",ret*/); + linphone_address_set_domain(ctt,NULL/*localip*/); + linphone_address_set_port(ctt,-1/*linphone_core_get_sip_port(lc)*/); + ms_message("Contact has not been fixed stack will do"/* to %s",ret*/); ret=ctt; } } diff --git a/coreapi/private.h b/coreapi/private.h index ccb43d24c..09062267d 100644 --- a/coreapi/private.h +++ b/coreapi/private.h @@ -227,7 +227,8 @@ struct _LinphoneCall{ LinphoneAddress *me; /*Either from or to based on call dir*/ SalOp *op; SalOp *ping_op; - char localip[LINPHONE_IPADDR_SIZE]; /* our best guess for local ipaddress for this call */ + char sig_localip[LINPHONE_IPADDR_SIZE]; /* our best guess for local sig ipaddress for this call */ + char media_localip[LINPHONE_IPADDR_SIZE]; /* our best guess for local media ipaddress for this call */ LinphoneCallState state; LinphoneCallState prevstate; LinphoneCallState transfer_state; /*idle if no transfer*/ From 8b1d56ea9e39c7f73165bba81c0c41090d12de5e Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Fri, 3 Apr 2015 14:19:52 +0200 Subject: [PATCH 003/157] Fix build with CMake on Mac OS X. --- coreapi/CMakeLists.txt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/coreapi/CMakeLists.txt b/coreapi/CMakeLists.txt index 73fa16fb9..ec2123a62 100644 --- a/coreapi/CMakeLists.txt +++ b/coreapi/CMakeLists.txt @@ -166,7 +166,12 @@ if(WIN32 AND "${CMAKE_SYSTEM_NAME}" STREQUAL "WindowsPhone") set_target_properties(linphone PROPERTIES PREFIX "lib") endif() if(ICONV_FOUND) - target_include_directories(linphone PUBLIC ${ICONV_INCLUDE_DIRS}) + if(APPLE) + # Prevent conflict between the system iconv.h header and the one from macports. + target_compile_options(linphone PRIVATE "-include" "${ICONV_INCLUDE_DIRS}/iconv.h") + else() + target_include_directories(linphone PRIVATE ${ICONV_INCLUDE_DIRS}) + endif() endif() install(TARGETS linphone EXPORT LinphoneTargets From de19b3a7349f7519c35ccb4afc9766a34e5a5ae9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Grisez?= Date: Fri, 3 Apr 2015 16:04:59 +0200 Subject: [PATCH 004/157] Check whether the git tag start with the version number set in configure.ac --- coreapi/Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreapi/Makefile.am b/coreapi/Makefile.am index e57492387..b5eab37d3 100644 --- a/coreapi/Makefile.am +++ b/coreapi/Makefile.am @@ -199,7 +199,7 @@ AM_CXXFLAGS=$(COMMON_CFLAGS) $(STRICT_OPTIONS_CXX) make_gitversion_h: if test -n "$(GITLOG)" ; then \ if test "$(GITDESCRIBE)" != "" ; then \ - if test "$(GIT_TAG)" != "$(PACKAGE_VERSION)" ; then \ + if [ "$(GIT_TAG)" != "$(PACKAGE_VERSION)" ] && [[ ! "$(GIT_TAG)" =~ "$(PACKAGE_VERSION)-" ]]; then \ $(ECHO) "*** PACKAGE_VERSION and git tag differ. Please put them identical."; \ exit 1; \ fi ; \ From 5afe239ed83a02ea8d72ad5ac876a997a7f08320 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Fri, 3 Apr 2015 22:04:42 +0200 Subject: [PATCH 005/157] add new test that check that big messages (ICE+ video + lots of codecs) are now passing through the tunnel --- tester/call_tester.c | 21 ++--------- tester/liblinphone_tester.h | 1 + tester/rcfiles/laure_rc | 2 ++ tester/rcfiles/marie_early_rc | 6 +++- tester/rcfiles/marie_rc | 2 ++ tester/rcfiles/marie_sips_rc | 1 + tester/rcfiles/pauline_rc | 3 +- tester/rcfiles/pauline_tcp_rc | 4 +++ tester/transport_tester.c | 65 ++++++++++++++++++++++++++++++----- 9 files changed, 77 insertions(+), 28 deletions(-) diff --git a/tester/call_tester.c b/tester/call_tester.c index becd29549..e2fee2bb0 100644 --- a/tester/call_tester.c +++ b/tester/call_tester.c @@ -1043,11 +1043,9 @@ static bool_t check_ice(LinphoneCoreManager* caller, LinphoneCoreManager* callee static void _call_with_ice_base(LinphoneCoreManager* pauline,LinphoneCoreManager* marie, bool_t caller_with_ice, bool_t callee_with_ice, bool_t random_ports) { if (callee_with_ice){ linphone_core_set_firewall_policy(marie->lc,LinphonePolicyUseIce); - linphone_core_set_stun_server(marie->lc,"stun.linphone.org"); } if (caller_with_ice){ linphone_core_set_firewall_policy(pauline->lc,LinphonePolicyUseIce); - linphone_core_set_stun_server(pauline->lc,"stun.linphone.org"); } if (random_ports){ @@ -1093,10 +1091,8 @@ static void call_with_ice_no_sdp(void){ linphone_core_enable_sdp_200_ack(pauline->lc,TRUE); linphone_core_set_firewall_policy(marie->lc,LinphonePolicyUseIce); - linphone_core_set_stun_server(marie->lc,"stun.linphone.org"); linphone_core_set_firewall_policy(pauline->lc,LinphonePolicyUseIce); - linphone_core_set_stun_server(pauline->lc,"stun.linphone.org"); call(pauline,marie); @@ -1390,10 +1386,8 @@ static void audio_call_with_ice_no_matching_audio_codecs(void) { linphone_core_enable_payload_type(marie->lc, linphone_core_find_payload_type(marie->lc, "PCMU", 8000, 1), FALSE); /* Disable PCMU */ linphone_core_enable_payload_type(marie->lc, linphone_core_find_payload_type(marie->lc, "PCMA", 8000, 1), TRUE); /* Enable PCMA */ linphone_core_set_firewall_policy(marie->lc, LinphonePolicyUseIce); - linphone_core_set_stun_server(marie->lc, "stun.linphone.org"); linphone_core_set_firewall_policy(pauline->lc, LinphonePolicyUseIce); - linphone_core_set_stun_server(pauline->lc, "stun.linphone.org"); - + out_call = linphone_core_invite_address(marie->lc, pauline->identity); linphone_call_ref(out_call); CU_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &marie->stat.number_of_LinphoneCallOutgoingInit, 1)); @@ -1417,7 +1411,7 @@ static LinphoneCall* setup_video(LinphoneCoreManager* caller,LinphoneCoreManager if (!linphone_core_get_current_call(callee->lc) || linphone_call_get_state(linphone_core_get_current_call(callee->lc)) != LinphoneCallStreamsRunning || !linphone_core_get_current_call(caller->lc) || linphone_call_get_state(linphone_core_get_current_call(caller->lc)) != LinphoneCallStreamsRunning ) { ms_warning("bad state for adding video"); - return FALSE; + return NULL; } caller_policy.automatically_accept=TRUE; @@ -1437,7 +1431,7 @@ static LinphoneCall* setup_video(LinphoneCoreManager* caller,LinphoneCoreManager return call_obj; } -static bool_t add_video(LinphoneCoreManager* caller,LinphoneCoreManager* callee) { +bool_t add_video(LinphoneCoreManager* caller,LinphoneCoreManager* callee) { stats initial_caller_stat=caller->stat; stats initial_callee_stat=callee->stat; LinphoneCall *call_obj; @@ -1856,12 +1850,8 @@ static void call_with_ice_video_added(void) { linphone_core_set_video_policy(marie->lc,&vpol); linphone_core_set_firewall_policy(marie->lc,LinphonePolicyUseIce); - linphone_core_set_stun_server(marie->lc,"stun.linphone.org"); - linphone_core_set_firewall_policy(pauline->lc,LinphonePolicyUseIce); - linphone_core_set_stun_server(pauline->lc,"stun.linphone.org"); - if (1){ linphone_core_set_audio_port(marie->lc,-1); @@ -2343,10 +2333,7 @@ void call_base_with_configfile(LinphoneMediaEncryption mode, bool_t enable_video } linphone_core_set_firewall_policy(marie->lc,policy); - linphone_core_set_stun_server(marie->lc,"stun.linphone.org"); linphone_core_set_firewall_policy(pauline->lc,policy); - linphone_core_set_stun_server(pauline->lc,"stun.linphone.org"); - CU_ASSERT_TRUE(call(pauline,marie)); if (linphone_core_get_media_encryption(pauline->lc) == LinphoneMediaEncryptionZRTP @@ -3041,7 +3028,6 @@ static void accept_call_in_send_base(bool_t caller_has_ice) { pauline = linphone_core_manager_new("pauline_rc"); if (caller_has_ice) { - linphone_core_set_stun_server(pauline->lc,"stun.linphone.org"); linphone_core_set_firewall_policy(pauline->lc,LinphonePolicyUseIce); } marie = linphone_core_manager_new("marie_rc"); @@ -3567,7 +3553,6 @@ static void early_media_without_sdp_in_200_base( bool_t use_video, bool_t use_ic lcs = ms_list_append(lcs,pauline->lc); if (use_ice){ linphone_core_set_firewall_policy(marie->lc, LinphonePolicyUseIce); - linphone_core_set_stun_server(marie->lc, "stun.linphone.org"); } /* Marie calls Pauline, and after the call has rung, transitions to an early_media session diff --git a/tester/liblinphone_tester.h b/tester/liblinphone_tester.h index 72e6abd99..a8c00f987 100644 --- a/tester/liblinphone_tester.h +++ b/tester/liblinphone_tester.h @@ -283,6 +283,7 @@ bool_t call_with_test_params(LinphoneCoreManager* caller_mgr ,const LinphoneCallTestParams *callee_test_params); bool_t call(LinphoneCoreManager* caller_mgr,LinphoneCoreManager* callee_mgr); +bool_t add_video(LinphoneCoreManager* caller,LinphoneCoreManager* callee); void end_call(LinphoneCoreManager *m1, LinphoneCoreManager *m2); void disable_all_audio_codecs_except_one(LinphoneCore *lc, const char *mime, int rate); void disable_all_video_codecs_except_one(LinphoneCore *lc, const char *mime); diff --git a/tester/rcfiles/laure_rc b/tester/rcfiles/laure_rc index 2b6ce617a..283f917f7 100644 --- a/tester/rcfiles/laure_rc +++ b/tester/rcfiles/laure_rc @@ -42,3 +42,5 @@ echocancellation=0 #to not overload cpu in case of VG [net] dns_srv_enabled=0 #no srv needed in general +stun_server=stun.linphone.org + diff --git a/tester/rcfiles/marie_early_rc b/tester/rcfiles/marie_early_rc index f1866026b..efa5408bb 100644 --- a/tester/rcfiles/marie_early_rc +++ b/tester/rcfiles/marie_early_rc @@ -42,4 +42,8 @@ enabled=0 self_view=0 automatically_initiate=0 automatically_accept=0 -device=StaticImage: Static picture \ No newline at end of file +device=StaticImage: Static picture + +[net] +stun_server=stun.linphone.org + diff --git a/tester/rcfiles/marie_rc b/tester/rcfiles/marie_rc index 5dec5f724..fe9687c36 100644 --- a/tester/rcfiles/marie_rc +++ b/tester/rcfiles/marie_rc @@ -51,3 +51,5 @@ echocancellation=0 #to not overload cpu in case of VG [net] dns_srv_enabled=0 #no srv needed in general +stun_server=stun.linphone.org + diff --git a/tester/rcfiles/marie_sips_rc b/tester/rcfiles/marie_sips_rc index 7a935d4cb..f67cca50d 100644 --- a/tester/rcfiles/marie_sips_rc +++ b/tester/rcfiles/marie_sips_rc @@ -51,3 +51,4 @@ echocancellation=0 #to not overload cpu in case of VG [net] dns_srv_enabled=0 #no srv needed in general +stun_server=stun.linphone.org diff --git a/tester/rcfiles/pauline_rc b/tester/rcfiles/pauline_rc index f8cffd4b3..50920606b 100644 --- a/tester/rcfiles/pauline_rc +++ b/tester/rcfiles/pauline_rc @@ -47,4 +47,5 @@ device=StaticImage: Static picture echocancellation=0 #to not overload cpu in case of VG [net] -dns_srv_enabled=0 #no srv needed in general \ No newline at end of file +dns_srv_enabled=0 #no srv needed in general +stun_server=stun.linphone.org diff --git a/tester/rcfiles/pauline_tcp_rc b/tester/rcfiles/pauline_tcp_rc index 73fd469d7..1b2a85e80 100644 --- a/tester/rcfiles/pauline_tcp_rc +++ b/tester/rcfiles/pauline_tcp_rc @@ -45,3 +45,7 @@ device=StaticImage: Static picture [sound] echocancellation=0 #to not overload cpu in case of VG + +[net] +stun_server=stun.linphone.org + diff --git a/tester/transport_tester.c b/tester/transport_tester.c index e847e0fe8..f08e4f569 100644 --- a/tester/transport_tester.c +++ b/tester/transport_tester.c @@ -61,11 +61,11 @@ static char* get_public_contact_ip(LinphoneCore* lc) { } -static void call_with_transport_base(LinphoneTunnelMode tunnel_mode, bool_t with_sip, LinphoneMediaEncryption encryption) { +static void call_with_transport_base(LinphoneTunnelMode tunnel_mode, bool_t with_sip, LinphoneMediaEncryption encryption, bool_t with_video_and_ice) { if (linphone_core_tunnel_available()){ LinphoneCoreManager *pauline = linphone_core_manager_new( "pauline_rc"); LinphoneCoreManager *marie = linphone_core_manager_new( "marie_rc"); - LinphoneCall *pauline_call; + LinphoneCall *pauline_call, *marie_call; LinphoneProxyConfig *proxy = linphone_core_get_default_proxy_config(pauline->lc); LinphoneAddress *server_addr = linphone_address_new(linphone_proxy_config_get_server_addr(proxy)); LinphoneAddress *route = linphone_address_new(linphone_proxy_config_get_route(proxy)); @@ -77,6 +77,26 @@ static void call_with_transport_base(LinphoneTunnelMode tunnel_mode, bool_t with CU_ASSERT_STRING_NOT_EQUAL(public_ip, tunnel_ip); linphone_core_set_media_encryption(pauline->lc, encryption); + + if (with_video_and_ice){ + /*we want to test that tunnel is able to work with long SIP message, above mtu. + * Enable ICE and many codec to make the SIP message bigger*/ + linphone_core_set_firewall_policy(marie->lc, LinphonePolicyUseIce); + linphone_core_set_firewall_policy(pauline->lc, LinphonePolicyUseIce); + linphone_core_enable_payload_type(pauline->lc, + linphone_core_find_payload_type(pauline->lc, "speex", 32000, 1), TRUE); + linphone_core_enable_payload_type(pauline->lc, + linphone_core_find_payload_type(pauline->lc, "speex", 16000, 1), TRUE); + linphone_core_enable_payload_type(pauline->lc, + linphone_core_find_payload_type(pauline->lc, "G722", 8000, 1), TRUE); + linphone_core_enable_payload_type(marie->lc, + linphone_core_find_payload_type(marie->lc, "speex", 32000, 1), TRUE); + linphone_core_enable_payload_type(marie->lc, + linphone_core_find_payload_type(marie->lc, "speex", 16000, 1), TRUE); + linphone_core_enable_payload_type(marie->lc, + linphone_core_find_payload_type(marie->lc, "G722", 8000, 1), TRUE); + + } if (tunnel_mode != LinphoneTunnelModeDisable){ LinphoneTunnel *tunnel = linphone_core_get_tunnel(pauline->lc); @@ -97,7 +117,7 @@ static void call_with_transport_base(LinphoneTunnelMode tunnel_mode, bool_t with * full testing of the automatic mode. */ - if(tunnel_mode == LinphoneTunnelModeEnable && with_sip) { + if (tunnel_mode == LinphoneTunnelModeEnable && with_sip) { CU_ASSERT_TRUE(wait_for(pauline->lc,NULL,&pauline->stat.number_of_LinphoneRegistrationOk,2)); /* Ensure that we did use the tunnel. If so, we should see contact changed from: Contact: ;.[...] @@ -120,6 +140,26 @@ static void call_with_transport_base(LinphoneTunnelMode tunnel_mode, bool_t with CU_ASSERT_EQUAL(linphone_call_params_get_media_encryption(linphone_call_get_current_params(pauline_call)), encryption); } + if (tunnel_mode == LinphoneTunnelModeEnable && with_sip){ + /* make sure the call from pauline arrived from the tunnel by checking the contact address*/ + marie_call = linphone_core_get_current_call(marie->lc); + CU_ASSERT_PTR_NOT_NULL(marie_call); + if (marie_call){ + const char *remote_contact = linphone_call_get_remote_contact(marie_call); + CU_ASSERT_PTR_NOT_NULL(remote_contact); + if (remote_contact){ + LinphoneAddress *tmp = linphone_address_new(remote_contact); + CU_ASSERT_PTR_NOT_NULL(tmp); + if (tmp){ + CU_ASSERT_STRING_EQUAL(linphone_address_get_domain(tmp), tunnel_ip); + linphone_address_destroy(tmp); + } + } + } + } + if (with_video_and_ice){ + CU_ASSERT_TRUE(add_video(pauline, marie)); + } end_call(pauline,marie); ms_free(public_ip); @@ -135,26 +175,34 @@ static void call_with_transport_base(LinphoneTunnelMode tunnel_mode, bool_t with static void call_with_tunnel(void) { - call_with_transport_base(LinphoneTunnelModeEnable, TRUE, LinphoneMediaEncryptionNone); + call_with_transport_base(LinphoneTunnelModeEnable, TRUE, LinphoneMediaEncryptionNone, FALSE); } static void call_with_tunnel_srtp(void) { - call_with_transport_base(LinphoneTunnelModeEnable, TRUE, LinphoneMediaEncryptionSRTP); + call_with_transport_base(LinphoneTunnelModeEnable, TRUE, LinphoneMediaEncryptionSRTP, FALSE); } static void call_with_tunnel_without_sip(void) { - call_with_transport_base(LinphoneTunnelModeEnable, FALSE, LinphoneMediaEncryptionNone); + call_with_transport_base(LinphoneTunnelModeEnable, FALSE, LinphoneMediaEncryptionNone, FALSE); } static void call_with_tunnel_auto(void) { - call_with_transport_base(LinphoneTunnelModeAuto, TRUE, LinphoneMediaEncryptionNone); + call_with_transport_base(LinphoneTunnelModeAuto, TRUE, LinphoneMediaEncryptionNone, FALSE); } static void call_with_tunnel_auto_without_sip_with_srtp(void) { - call_with_transport_base(LinphoneTunnelModeAuto, FALSE, LinphoneMediaEncryptionSRTP); + call_with_transport_base(LinphoneTunnelModeAuto, FALSE, LinphoneMediaEncryptionSRTP, FALSE); } #ifdef VIDEO_ENABLED + +static void full_tunnel_video_ice_call(void){ + if (linphone_core_tunnel_available()){ + call_with_transport_base(LinphoneTunnelModeEnable, TRUE, LinphoneMediaEncryptionNone, TRUE); + }else + ms_warning("Could not test %s because tunnel functionality is not available",__FUNCTION__); +} + static void tunnel_srtp_video_ice_call(void) { if (linphone_core_tunnel_available()) call_base(LinphoneMediaEncryptionSRTP,TRUE,FALSE,LinphonePolicyUseIce,TRUE); @@ -214,6 +262,7 @@ test_t transport_tests[] = { { "Tunnel ZRTP ice call", tunnel_zrtp_ice_call }, #ifdef VIDEO_ENABLED { "Tunnel ice video call", tunnel_video_ice_call }, + { "Tunnel with SIP - ice video call", full_tunnel_video_ice_call }, { "Tunnel SRTP ice video call", tunnel_srtp_video_ice_call }, { "Tunnel DTLS ice video call", tunnel_dtls_video_ice_call }, { "Tunnel ZRTP ice video call", tunnel_zrtp_video_ice_call }, From e9e32912fd34abc350ccfdf2c33bd85fd2f567db Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Sat, 4 Apr 2015 21:07:13 +0200 Subject: [PATCH 006/157] repair audio only build --- tester/transport_tester.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tester/transport_tester.c b/tester/transport_tester.c index f08e4f569..f50946a5b 100644 --- a/tester/transport_tester.c +++ b/tester/transport_tester.c @@ -157,9 +157,11 @@ static void call_with_transport_base(LinphoneTunnelMode tunnel_mode, bool_t with } } } +#ifdef VIDEO_ENABLED if (with_video_and_ice){ CU_ASSERT_TRUE(add_video(pauline, marie)); } +#endif end_call(pauline,marie); ms_free(public_ip); From 1f141a11a78128d4368c6bfd83f988ce1f49aa41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Grisez?= Date: Tue, 7 Apr 2015 11:01:29 +0200 Subject: [PATCH 007/157] Revert commit de19b3a7349f7519c35ccb4afc9766a34e5a5ae9 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reverted commit: commit de19b3a7349f7519c35ccb4afc9766a34e5a5ae9 Author: François Grisez Date: Fri Apr 3 16:04:59 2015 +0200 Check whether the git tag start with the version number set in configure.ac --- coreapi/Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreapi/Makefile.am b/coreapi/Makefile.am index b5eab37d3..8582213c5 100644 --- a/coreapi/Makefile.am +++ b/coreapi/Makefile.am @@ -199,7 +199,7 @@ AM_CXXFLAGS=$(COMMON_CFLAGS) $(STRICT_OPTIONS_CXX) make_gitversion_h: if test -n "$(GITLOG)" ; then \ if test "$(GITDESCRIBE)" != "" ; then \ - if [ "$(GIT_TAG)" != "$(PACKAGE_VERSION)" ] && [[ ! "$(GIT_TAG)" =~ "$(PACKAGE_VERSION)-" ]]; then \ + if [ "$(GIT_TAG)" != "$(PACKAGE_VERSION)" ]; then \ $(ECHO) "*** PACKAGE_VERSION and git tag differ. Please put them identical."; \ exit 1; \ fi ; \ From 9133e161dda43463294e86235696fe7ef21b791f Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Tue, 7 Apr 2015 15:08:26 +0200 Subject: [PATCH 008/157] Fix crash on Windows when no linphonerc file is configured. --- coreapi/lpconfig.c | 1 + 1 file changed, 1 insertion(+) diff --git a/coreapi/lpconfig.c b/coreapi/lpconfig.c index d7eb6ad5c..f6755863b 100644 --- a/coreapi/lpconfig.c +++ b/coreapi/lpconfig.c @@ -720,6 +720,7 @@ static char *_lp_config_dirname(char *path) { } void lp_config_write_relative_file(const LpConfig *lpconfig, const char *filename, const char *data) { + if (lpconfig->filename == NULL) return; if(strlen(data) > 0) { char *dir = _lp_config_dirname(lpconfig->filename); char *filepath = ms_strdup_printf("%s/%s", dir, filename); From 2718f631bd2a413ccad34a5930e85ff11f7e2c0b Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Tue, 7 Apr 2015 15:03:16 +0200 Subject: [PATCH 009/157] Fix crash in linphone_core_reload_sound_devices() and linphone_core_reload_video_devices(). --- coreapi/linphonecore.c | 50 +++++++++++++++++++++++++++++++++--------- tester/setup_tester.c | 25 ++++++++++++++++++++- 2 files changed, 64 insertions(+), 11 deletions(-) diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index 82eb5f742..36bfd8cf3 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -4625,23 +4625,53 @@ const char** linphone_core_get_video_devices(const LinphoneCore *lc){ } void linphone_core_reload_sound_devices(LinphoneCore *lc){ - const char *ringer,*playback,*capture; - ringer=linphone_core_get_ringer_device(lc); - playback=linphone_core_get_playback_device(lc); - capture=linphone_core_get_capture_device(lc); + const char *ringer; + const char *playback; + const char *capture; + char *ringer_copy = NULL; + char *playback_copy = NULL; + char *capture_copy = NULL; + + ringer = linphone_core_get_ringer_device(lc); + if (ringer != NULL) { + ringer_copy = ms_strdup(ringer); + } + playback = linphone_core_get_playback_device(lc); + if (playback != NULL) { + playback_copy = ms_strdup(playback); + } + capture = linphone_core_get_capture_device(lc); + if (capture != NULL) { + capture_copy = ms_strdup(capture); + } ms_snd_card_manager_reload(ms_snd_card_manager_get()); build_sound_devices_table(lc); - linphone_core_set_ringer_device(lc,ringer); - linphone_core_set_playback_device(lc,playback); - linphone_core_set_capture_device(lc,capture); + if (ringer_copy != NULL) { + linphone_core_set_ringer_device(lc, ringer_copy); + ms_free(ringer_copy); + } + if (playback_copy != NULL) { + linphone_core_set_playback_device(lc, playback_copy); + ms_free(playback_copy); + } + if (capture_copy != NULL) { + linphone_core_set_capture_device(lc, capture_copy); + ms_free(capture_copy); + } } void linphone_core_reload_video_devices(LinphoneCore *lc){ - const char *devid; - devid=linphone_core_get_video_device(lc); + char *devid_copy = NULL; + const char *devid = linphone_core_get_video_device(lc); + if (devid != NULL) { + devid_copy = ms_strdup(devid); + } ms_web_cam_manager_reload(ms_web_cam_manager_get()); build_video_devices_table(lc); - linphone_core_set_video_device(lc,devid); + if (devid_copy != NULL) { + linphone_core_set_video_device(lc, devid_copy); + ms_free(devid_copy); + } } char linphone_core_get_sound_source(LinphoneCore *lc) diff --git a/tester/setup_tester.c b/tester/setup_tester.c index 03cb36a8b..217f257e6 100644 --- a/tester/setup_tester.c +++ b/tester/setup_tester.c @@ -244,6 +244,28 @@ static void chat_root_test(void) { linphone_core_destroy(lc); } +static void devices_reload_test(void) { + char *devid1; + char *devid2; + LinphoneCoreManager *mgr = linphone_core_manager_new2("empty_rc", FALSE); + + devid1 = ms_strdup(linphone_core_get_capture_device(mgr->lc)); + linphone_core_reload_sound_devices(mgr->lc); + devid2 = ms_strdup(linphone_core_get_capture_device(mgr->lc)); + CU_ASSERT_STRING_EQUAL(devid1, devid2); + ms_free(devid1); + ms_free(devid2); + + devid1 = ms_strdup(linphone_core_get_video_device(mgr->lc)); + linphone_core_reload_video_devices(mgr->lc); + devid2 = ms_strdup(linphone_core_get_video_device(mgr->lc)); + CU_ASSERT_STRING_EQUAL(devid1, devid2); + ms_free(devid1); + ms_free(devid2); + + linphone_core_manager_destroy(mgr); +} + test_t setup_tests[] = { { "Version check", linphone_version_test }, { "Linphone Address", linphone_address_test }, @@ -256,7 +278,8 @@ test_t setup_tests[] = { { "LPConfig zero_len value from buffer", linphone_lpconfig_from_buffer_zerolen_value }, { "LPConfig zero_len value from file", linphone_lpconfig_from_file_zerolen_value }, { "LPConfig zero_len value from XML", linphone_lpconfig_from_xml_zerolen_value }, - { "Chat room", chat_root_test } + { "Chat room", chat_root_test }, + { "Devices reload", devices_reload_test } }; test_suite_t setup_test_suite = { From c66a00ff242c74b03c23fe7ef2c52d8c8f59b275 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Tue, 7 Apr 2015 16:14:25 +0200 Subject: [PATCH 010/157] Do not try to search for libgcc and libmingwex when building for Windows Phone. --- coreapi/CMakeLists.txt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/coreapi/CMakeLists.txt b/coreapi/CMakeLists.txt index ec2123a62..f2fe192bc 100644 --- a/coreapi/CMakeLists.txt +++ b/coreapi/CMakeLists.txt @@ -20,7 +20,7 @@ # ############################################################################ -if(MSVC) +if(MSVC AND NOT "${CMAKE_SYSTEM_NAME}" STREQUAL "WindowsPhone") find_library(LIBGCC NAMES gcc) find_library(LIBMINGWEX NAMES mingwex) endif() @@ -121,8 +121,6 @@ add_definitions( ) set(LIBS - ${LIBGCC} - ${LIBMINGWEX} ${BELLESIP_LIBRARIES} ${MEDIASTREAMER2_LIBRARIES} ${XML2_LIBRARIES} @@ -142,6 +140,9 @@ endif() if(ENABLE_ASSISTANT) list(APPEND LIBS ${SOUP_LIBRARIES}) endif() +if(MSVC AND NOT "${CMAKE_SYSTEM_NAME}" STREQUAL "WindowsPhone") + list(APPEND LIBS ${LIBGCC} ${LIBMINGWEX}) +endif() if(WIN32 AND NOT "${CMAKE_SYSTEM_NAME}" STREQUAL "WindowsPhone") list(APPEND LIBS shlwapi) endif() From d59c6f01cd2889655a6853335bf2bbc475b71809 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Tue, 7 Apr 2015 16:14:53 +0200 Subject: [PATCH 011/157] Allow search for static zlib when building with CMake. --- cmake/FindZlib.cmake | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/cmake/FindZlib.cmake b/cmake/FindZlib.cmake index 6252049bc..86ebf913f 100644 --- a/cmake/FindZlib.cmake +++ b/cmake/FindZlib.cmake @@ -40,11 +40,19 @@ if(ZLIB_INCLUDE_DIRS) set(HAVE_ZLIB_H 1) endif() -find_library(ZLIB_LIBRARIES - NAMES z zlib zlibd - HINTS ${_ZLIB_ROOT_PATHS} - PATH_SUFFIXES bin lib -) +if(ENABLE_STATIC) + find_library(ZLIB_LIBRARIES + NAMES zstatic zlibstatic zlibstaticd + HINTS ${_ZLIB_ROOT_PATHS} + PATH_SUFFIXES bin lib + ) +else() + find_library(ZLIB_LIBRARIES + NAMES z zlib zlibd + HINTS ${_ZLIB_ROOT_PATHS} + PATH_SUFFIXES bin lib + ) +endif() include(FindPackageHandleStandardArgs) find_package_handle_standard_args(Zlib From 11cd389a1226776957b5f145e17beaf4aeae6527 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Tue, 7 Apr 2015 16:15:55 +0200 Subject: [PATCH 012/157] Update ms2 submodule. --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index fc8d5b93f..1f3306fb1 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit fc8d5b93ff618bbeca005d6c631e9eb0b10f1cd2 +Subproject commit 1f3306fb1b243eb7e182c2f08b2dfc319c887b03 From d65ab6064b101cd4e8aa3a403e0d1bb8b16310ce Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Tue, 7 Apr 2015 17:27:15 +0200 Subject: [PATCH 013/157] robustize tests (once again) --- tester/call_tester.c | 167 +++++++++++++++++++++++++++++-------------- 1 file changed, 115 insertions(+), 52 deletions(-) diff --git a/tester/call_tester.c b/tester/call_tester.c index e2fee2bb0..476d41a77 100644 --- a/tester/call_tester.c +++ b/tester/call_tester.c @@ -1041,6 +1041,8 @@ static bool_t check_ice(LinphoneCoreManager* caller, LinphoneCoreManager* callee } static void _call_with_ice_base(LinphoneCoreManager* pauline,LinphoneCoreManager* marie, bool_t caller_with_ice, bool_t callee_with_ice, bool_t random_ports) { + bool_t call_ok; + if (callee_with_ice){ linphone_core_set_firewall_policy(marie->lc,LinphonePolicyUseIce); } @@ -1055,8 +1057,9 @@ static void _call_with_ice_base(LinphoneCoreManager* pauline,LinphoneCoreManager linphone_core_set_video_port(pauline->lc,-1); } - CU_ASSERT_TRUE(call(pauline,marie)); + CU_ASSERT_TRUE((call_ok=call(pauline,marie))); + if (!call_ok) goto end; if (callee_with_ice && caller_with_ice) { /*wait for the ICE reINVITE to complete*/ CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallStreamsRunning,2)); @@ -1068,6 +1071,7 @@ static void _call_with_ice_base(LinphoneCoreManager* pauline,LinphoneCoreManager liblinphone_tester_check_rtcp(marie,pauline); /*then close the call*/ linphone_core_terminate_all_calls(pauline->lc); +end: CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallEnd,1)); CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallEnd,1)); @@ -1190,10 +1194,14 @@ void call_paused_resumed_base(bool_t multicast) { LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc"); LinphoneCall* call_pauline; const rtp_stats_t * stats; + bool_t call_ok; linphone_core_enable_audio_multicast(pauline->lc,multicast); - CU_ASSERT_TRUE(call(pauline,marie)); + CU_ASSERT_TRUE((call_ok=call(pauline,marie))); + + if (!call_ok) goto end; + call_pauline = linphone_core_get_current_call(pauline->lc); wait_for_until(pauline->lc, marie->lc, NULL, 5, 3000); @@ -1222,7 +1230,7 @@ void call_paused_resumed_base(bool_t multicast) { CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallEnd,1)); CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallEnd,1)); - +end: linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); } @@ -1347,8 +1355,10 @@ static void call_paused_resumed_from_callee(void) { LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc"); LinphoneCall* call_marie; const rtp_stats_t * stats; + bool_t call_ok; - CU_ASSERT_TRUE(call(pauline,marie)); + CU_ASSERT_TRUE((call_ok=call(pauline,marie))); + if (!call_ok) goto end; call_marie = linphone_core_get_current_call(marie->lc); linphone_core_pause_call(marie->lc,call_marie); @@ -1373,7 +1383,7 @@ static void call_paused_resumed_from_callee(void) { linphone_core_terminate_all_calls(pauline->lc); CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallEnd,1)); CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallEnd,1)); - +end: linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); } @@ -1519,14 +1529,18 @@ static bool_t remove_video(LinphoneCoreManager *caller, LinphoneCoreManager *cal static void call_with_video_added(void) { LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc"); - CU_ASSERT_TRUE(call(pauline,marie)); + bool_t call_ok; + + CU_ASSERT_TRUE((call_ok=call(pauline,marie))); + if (!call_ok) goto end; CU_ASSERT_TRUE(add_video(pauline,marie)); /*just to sleep*/ linphone_core_terminate_all_calls(pauline->lc); CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallEnd,1)); CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallEnd,1)); - + +end: linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); } @@ -1534,22 +1548,25 @@ static void call_with_video_added(void) { static void call_with_video_added_2(void) { LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc"); - + bool_t call_ok; /*in this variant marie is already in automatically accept*/ LinphoneVideoPolicy marie_policy; marie_policy.automatically_accept=TRUE; + + linphone_core_set_video_policy(marie->lc,&marie_policy); linphone_core_enable_video_capture(marie->lc, TRUE); linphone_core_enable_video_display(marie->lc, FALSE); - CU_ASSERT_TRUE(call(pauline,marie)); + CU_ASSERT_TRUE(call_ok=call(pauline,marie)); + if (!call_ok) goto end; CU_ASSERT_TRUE(add_video(marie,pauline)); /*just to sleep*/ linphone_core_terminate_all_calls(pauline->lc); CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallEnd,1)); CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallEnd,1)); - +end: linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); } @@ -1557,20 +1574,22 @@ static void call_with_video_added_2(void) { static void call_with_video_added_random_ports(void) { LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc"); + bool_t call_ok; linphone_core_set_audio_port(marie->lc,-1); linphone_core_set_video_port(marie->lc,-1); linphone_core_set_audio_port(pauline->lc,-1); linphone_core_set_video_port(pauline->lc,-1); - CU_ASSERT_TRUE(call(pauline,marie)); + CU_ASSERT_TRUE(call_ok=call(pauline,marie)); + if (!call_ok) goto end; CU_ASSERT_TRUE(add_video(pauline,marie)); /*just to sleep*/ linphone_core_terminate_all_calls(pauline->lc); CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallEnd,1)); CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallEnd,1)); - +end: linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); } @@ -1579,7 +1598,10 @@ static void call_with_several_video_switches(void) { int dummy = 0; LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc"); - CU_ASSERT_TRUE(call(pauline,marie)); + bool_t call_ok; + CU_ASSERT_TRUE(call_ok=call(pauline,marie)); + + if (!call_ok) goto end; CU_ASSERT_TRUE(add_video(pauline,marie)); wait_for_until(pauline->lc,marie->lc,&dummy,1,1000); /* Wait for VFU request exchanges to be finished. */ @@ -1591,7 +1613,7 @@ static void call_with_several_video_switches(void) { linphone_core_terminate_all_calls(pauline->lc); CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallEnd,1)); CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallEnd,1)); - +end: linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); } @@ -1600,12 +1622,14 @@ static void srtp_call_with_several_video_switches(void) { int dummy = 0; LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc"); + bool_t call_ok; if (linphone_core_media_encryption_supported(marie->lc, LinphoneMediaEncryptionSRTP)) { linphone_core_set_media_encryption(marie->lc, LinphoneMediaEncryptionSRTP); linphone_core_set_media_encryption(pauline->lc, LinphoneMediaEncryptionSRTP); - CU_ASSERT_TRUE(call(pauline,marie)); + CU_ASSERT_TRUE(call_ok=call(pauline,marie)); + if (!call_ok) goto end; CU_ASSERT_TRUE(add_video(pauline,marie)); wait_for_until(pauline->lc,marie->lc,&dummy,1,1000); /* Wait for VFU request exchanges to be finished. */ @@ -1620,7 +1644,7 @@ static void srtp_call_with_several_video_switches(void) { } else { ms_warning("Not tested because SRTP is not available."); } - +end: linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); } @@ -1632,6 +1656,8 @@ static void call_with_declined_video_base(bool_t using_policy) { LinphoneCall* pauline_call; LinphoneVideoPolicy marie_policy, pauline_policy; LinphoneCallTestParams caller_test_params = {0}, callee_test_params = {0}; + bool_t call_ok; + linphone_core_enable_video_capture(marie->lc, TRUE); linphone_core_enable_video_display(marie->lc, TRUE); linphone_core_enable_video_capture(pauline->lc, TRUE); @@ -1656,7 +1682,8 @@ static void call_with_declined_video_base(bool_t using_policy) { linphone_call_params_enable_video(callee_test_params.base,FALSE); } - CU_ASSERT_TRUE(call_with_params2(pauline,marie,&caller_test_params,&callee_test_params,using_policy)); + CU_ASSERT_TRUE((call_ok=call_with_params2(pauline,marie,&caller_test_params,&callee_test_params,using_policy))); + if (!call_ok) goto end; linphone_call_params_destroy(caller_test_params.base); if (callee_test_params.base) linphone_call_params_destroy(callee_test_params.base); @@ -1671,6 +1698,7 @@ static void call_with_declined_video_base(bool_t using_policy) { CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallEnd,1)); CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallEnd,1)); +end: linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); } @@ -1846,6 +1874,8 @@ static void call_with_ice_video_added(void) { LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc"); LinphoneVideoPolicy vpol={0}; + bool_t call_ok; + linphone_core_set_video_policy(pauline->lc,&vpol); linphone_core_set_video_policy(marie->lc,&vpol); @@ -1860,7 +1890,8 @@ static void call_with_ice_video_added(void) { linphone_core_set_video_port(pauline->lc,-1); } - CU_ASSERT_TRUE(call(pauline,marie)); + CU_ASSERT_TRUE(call_ok=call(pauline,marie)); + if (!call_ok) goto end; CU_ASSERT_TRUE(check_ice(pauline,marie,LinphoneIceStateHostConnection)); /*wait for ICE reINVITEs to complete*/ CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallStreamsRunning,2) @@ -1868,6 +1899,7 @@ static void call_with_ice_video_added(void) { wait_for(pauline->lc,pauline->lc,&marie->stat.number_of_LinphoneCallStreamsRunning,2)); CU_ASSERT_TRUE(add_video(pauline,marie)); CU_ASSERT_TRUE(check_ice(pauline,marie,LinphoneIceStateHostConnection)); +end: linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); } @@ -1943,6 +1975,8 @@ static void video_call_limited_bandwidth(void) { static void _call_with_media_relay(bool_t random_ports) { LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc"); + bool_t call_ok; + linphone_core_set_user_agent(marie->lc,"Natted Linphone",NULL); linphone_core_set_user_agent(pauline->lc,"Natted Linphone",NULL); @@ -1953,7 +1987,8 @@ static void _call_with_media_relay(bool_t random_ports) { linphone_core_set_video_port(pauline->lc,-1); } - CU_ASSERT_TRUE(call(pauline,marie)); + CU_ASSERT_TRUE(call_ok=call(pauline,marie)); + if (!call_ok) goto end; liblinphone_tester_check_rtcp(pauline,marie); #ifdef VIDEO_ENABLED @@ -1964,7 +1999,7 @@ static void _call_with_media_relay(bool_t random_ports) { linphone_core_terminate_all_calls(pauline->lc); CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallEnd,1)); CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallEnd,1)); - +end: linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); } @@ -1994,14 +2029,15 @@ static void call_with_privacy(void) { CU_ASSERT_PTR_NOT_NULL(c1); CU_ASSERT_PTR_NOT_NULL(c2); + if (c1 && c2){ + /*make sure local identity is unchanged*/ + CU_ASSERT_TRUE(linphone_address_weak_equal(linphone_call_log_get_from(linphone_call_get_call_log(c1)),pauline->identity)); - /*make sure local identity is unchanged*/ - CU_ASSERT_TRUE(linphone_address_weak_equal(linphone_call_log_get_from(linphone_call_get_call_log(c1)),pauline->identity)); + /*make sure remote identity is hidden*/ + CU_ASSERT_FALSE(linphone_address_weak_equal(linphone_call_get_remote_address(c2),pauline->identity)); - /*make sure remote identity is hidden*/ - CU_ASSERT_FALSE(linphone_address_weak_equal(linphone_call_get_remote_address(c2),pauline->identity)); - - CU_ASSERT_EQUAL(linphone_call_params_get_privacy(linphone_call_get_current_params(c2)),LinphonePrivacyId); + CU_ASSERT_EQUAL(linphone_call_params_get_privacy(linphone_call_get_current_params(c2)),LinphonePrivacyId); + } /*just to sleep*/ linphone_core_terminate_all_calls(pauline->lc); @@ -2013,16 +2049,19 @@ static void call_with_privacy(void) { linphone_proxy_config_set_privacy(pauline_proxy,LinphonePrivacyId); CU_ASSERT_TRUE(call(pauline,marie)); + c1=linphone_core_get_current_call(pauline->lc); c2=linphone_core_get_current_call(marie->lc); CU_ASSERT_PTR_NOT_NULL(c1); CU_ASSERT_PTR_NOT_NULL(c2); + if (c1 && c2){ - /*make sure remote identity is hidden*/ - CU_ASSERT_FALSE(linphone_address_weak_equal(linphone_call_get_remote_address(c2),pauline->identity)); + /*make sure remote identity is hidden*/ + CU_ASSERT_FALSE(linphone_address_weak_equal(linphone_call_get_remote_address(c2),pauline->identity)); - CU_ASSERT_EQUAL(linphone_call_params_get_privacy(linphone_call_get_current_params(c2)),LinphonePrivacyId); + CU_ASSERT_EQUAL(linphone_call_params_get_privacy(linphone_call_get_current_params(c2)),LinphonePrivacyId); + } /*just to sleep*/ linphone_core_terminate_all_calls(pauline->lc); CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallEnd,2)); @@ -2056,13 +2095,14 @@ static void call_with_privacy2(void) { CU_ASSERT_PTR_NOT_NULL(c1); CU_ASSERT_PTR_NOT_NULL(c2); - /*make sure local identity is unchanged*/ - CU_ASSERT_TRUE(linphone_address_weak_equal(linphone_call_log_get_from(linphone_call_get_call_log(c1)),pauline->identity)); + if (c1 && c2){ + /*make sure local identity is unchanged*/ + CU_ASSERT_TRUE(linphone_address_weak_equal(linphone_call_log_get_from(linphone_call_get_call_log(c1)),pauline->identity)); + /*make sure remote identity is hidden*/ + CU_ASSERT_FALSE(linphone_address_weak_equal(linphone_call_get_remote_address(c2),pauline->identity)); - /*make sure remote identity is hidden*/ - CU_ASSERT_FALSE(linphone_address_weak_equal(linphone_call_get_remote_address(c2),pauline->identity)); - - CU_ASSERT_EQUAL(linphone_call_params_get_privacy(linphone_call_get_current_params(c2)),LinphonePrivacyId); + CU_ASSERT_EQUAL(linphone_call_params_get_privacy(linphone_call_get_current_params(c2)),LinphonePrivacyId); + } /*just to sleep*/ linphone_core_terminate_all_calls(pauline->lc); @@ -2079,11 +2119,11 @@ static void call_with_privacy2(void) { CU_ASSERT_PTR_NOT_NULL(c1); CU_ASSERT_PTR_NOT_NULL(c2); - /*make sure remote identity is hidden*/ - CU_ASSERT_FALSE(linphone_address_weak_equal(linphone_call_get_remote_address(c2),pauline->identity)); - - CU_ASSERT_EQUAL(linphone_call_params_get_privacy(linphone_call_get_current_params(c2)),LinphonePrivacyId); - /*just to sleep*/ + if (c1 && c2){ + /*make sure remote identity is hidden*/ + CU_ASSERT_FALSE(linphone_address_weak_equal(linphone_call_get_remote_address(c2),pauline->identity)); + CU_ASSERT_EQUAL(linphone_call_params_get_privacy(linphone_call_get_current_params(c2)),LinphonePrivacyId); + } linphone_core_terminate_all_calls(pauline->lc); CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallEnd,2)); CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallEnd,2)); @@ -2168,6 +2208,7 @@ static void call_with_file_player(void) { LinphonePlayer *player; char hellopath[256]; char *recordpath = create_filepath(bc_tester_writable_dir_prefix, "record-call_with_file_player", "wav"); + bool_t call_ok; /*make sure the record file doesn't already exists, otherwise this test will append new samples to it*/ unlink(recordpath); @@ -2183,8 +2224,8 @@ static void call_with_file_player(void) { linphone_core_set_play_file(pauline->lc,NULL); linphone_core_set_record_file(pauline->lc,recordpath); - CU_ASSERT_TRUE(call(marie,pauline)); - + CU_ASSERT_TRUE((call_ok=call(marie,pauline))); + if (!call_ok) goto end; player=linphone_call_get_player(linphone_core_get_current_call(marie->lc)); CU_ASSERT_PTR_NOT_NULL(player); if (player){ @@ -2215,6 +2256,7 @@ static void call_with_file_player(void) { #else remove(recordpath); #endif +end: linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); ms_free(recordpath); @@ -2235,6 +2277,7 @@ static void call_with_mkv_file_player(void) { char hellomkv[256]; char hellowav[256]; char *recordpath; + bool_t call_ok; #if !defined(__arm__) && !defined(__arm64__) && !TARGET_IPHONE_SIMULATOR && !defined(ANDROID) double similar; const double threshold = 0.9; @@ -2260,8 +2303,8 @@ static void call_with_mkv_file_player(void) { linphone_core_set_play_file(pauline->lc,hellowav); /*just to send something but we are not testing what is sent by pauline*/ linphone_core_set_record_file(pauline->lc,recordpath); - CU_ASSERT_TRUE(call(marie,pauline)); - + CU_ASSERT_TRUE((call_ok=call(marie,pauline))); + if (!call_ok) goto end; player=linphone_call_get_player(linphone_core_get_current_call(marie->lc)); CU_ASSERT_PTR_NOT_NULL(player); if (player){ @@ -2302,6 +2345,8 @@ end: void call_base_with_configfile(LinphoneMediaEncryption mode, bool_t enable_video,bool_t enable_relay,LinphoneFirewallPolicy policy,bool_t enable_tunnel, const char *marie_rc, const char *pauline_rc) { LinphoneCoreManager* marie = linphone_core_manager_new(marie_rc); LinphoneCoreManager* pauline = linphone_core_manager_new(pauline_rc); + bool_t call_ok; + if (enable_relay) { linphone_core_set_user_agent(marie->lc,"Natted Linphone",NULL); linphone_core_set_user_agent(pauline->lc,"Natted Linphone",NULL); @@ -2335,7 +2380,8 @@ void call_base_with_configfile(LinphoneMediaEncryption mode, bool_t enable_video linphone_core_set_firewall_policy(marie->lc,policy); linphone_core_set_firewall_policy(pauline->lc,policy); - CU_ASSERT_TRUE(call(pauline,marie)); + CU_ASSERT_TRUE((call_ok=call(pauline,marie))); + if (!call_ok) goto end; if (linphone_core_get_media_encryption(pauline->lc) == LinphoneMediaEncryptionZRTP && linphone_core_get_media_encryption(pauline->lc) == LinphoneMediaEncryptionZRTP) { /*wait for SAS*/ @@ -2390,6 +2436,7 @@ void call_base_with_configfile(LinphoneMediaEncryption mode, bool_t enable_video } else { ms_warning ("not tested because %s not available", linphone_media_encryption_to_string(mode)); } +end: linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); } @@ -3212,13 +3259,16 @@ static void call_with_in_dialog_update(void) { LinphoneCoreManager* marie; LinphoneCoreManager* pauline; LinphoneCallParams *params; + bool_t call_ok; belle_sip_object_enable_leak_detector(TRUE); begin=belle_sip_object_get_object_count(); marie = linphone_core_manager_new( "marie_rc"); pauline = linphone_core_manager_new( "pauline_rc"); - CU_ASSERT_TRUE(call(pauline,marie)); + CU_ASSERT_TRUE(call_ok=call(pauline,marie)); + if (!call_ok) goto end; + liblinphone_tester_check_rtcp(marie,pauline); params=linphone_core_create_call_params(marie->lc,linphone_core_get_current_call(marie->lc)); params->no_user_consent=TRUE; @@ -3229,6 +3279,8 @@ static void call_with_in_dialog_update(void) { CU_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&pauline->stat.number_of_LinphoneCallUpdatedByRemote,1)); CU_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&pauline->stat.number_of_LinphoneCallStreamsRunning,2)); end_call(marie,pauline); + +end: linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); @@ -3245,13 +3297,16 @@ static void call_with_in_dialog_codec_change_base(bool_t no_sdp) { LinphoneCoreManager* marie; LinphoneCoreManager* pauline; LinphoneCallParams *params; + bool_t call_ok; belle_sip_object_enable_leak_detector(TRUE); begin=belle_sip_object_get_object_count(); marie = linphone_core_manager_new( "marie_rc"); pauline = linphone_core_manager_new( "pauline_rc"); - CU_ASSERT_TRUE(call(pauline,marie)); + CU_ASSERT_TRUE(call_ok=call(pauline,marie)); + if (!call_ok) goto end; + liblinphone_tester_check_rtcp(marie,pauline); params=linphone_core_create_call_params(marie->lc,linphone_core_get_current_call(marie->lc)); @@ -3274,6 +3329,7 @@ static void call_with_in_dialog_codec_change_base(bool_t no_sdp) { CU_ASSERT_TRUE(linphone_call_get_audio_stats(linphone_core_get_current_call(pauline->lc))->download_bandwidth>70); end_call(marie,pauline); +end: linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); @@ -3296,6 +3352,7 @@ static void call_with_custom_supported_tags(void) { LinphoneCoreManager* pauline; const LinphoneCallParams *remote_params; const char *recv_supported; + bool_t call_ok; belle_sip_object_enable_leak_detector(TRUE); begin=belle_sip_object_get_object_count(); @@ -3304,7 +3361,8 @@ static void call_with_custom_supported_tags(void) { pauline = linphone_core_manager_new( "pauline_rc"); linphone_core_add_supported_tag(marie->lc,"pouet-tag"); - CU_ASSERT_TRUE(call(pauline,marie)); + CU_ASSERT_TRUE(call_ok=call(pauline,marie)); + if (!call_ok) goto end; liblinphone_tester_check_rtcp(marie,pauline); remote_params=linphone_call_get_remote_params(linphone_core_get_current_call(pauline->lc)); recv_supported=linphone_call_params_get_custom_header(remote_params,"supported"); @@ -3313,6 +3371,7 @@ static void call_with_custom_supported_tags(void) { CU_ASSERT_TRUE(strstr(recv_supported,"pouet-tag")!=NULL); } end_call(marie,pauline); +end: linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); @@ -3331,6 +3390,7 @@ static void call_log_from_taken_from_p_asserted_id(void) { const char* paulie_asserted_id ="\"Paupauche\" "; LinphoneAddress *paulie_asserted_id_addr = linphone_address_new(paulie_asserted_id); LpConfig *marie_lp; + bool_t call_ok; params=linphone_core_create_default_call_parameters(pauline->lc); @@ -3341,8 +3401,9 @@ static void call_log_from_taken_from_p_asserted_id(void) { lp_config_set_int(marie_lp,"sip","call_logs_use_asserted_id_instead_of_from",1); - CU_ASSERT_TRUE(call_with_caller_params(pauline,marie,params)); - linphone_call_params_destroy(params); + CU_ASSERT_TRUE(call_ok=call_with_caller_params(pauline,marie,params)); + + if (!call_ok) goto end; c1=linphone_core_get_current_call(pauline->lc); c2=linphone_core_get_current_call(marie->lc); @@ -3358,7 +3419,8 @@ static void call_log_from_taken_from_p_asserted_id(void) { linphone_core_terminate_all_calls(pauline->lc); CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallEnd,1)); CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallEnd,1)); - +end: + linphone_call_params_destroy(params); linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); } @@ -3499,6 +3561,7 @@ static void call_with_paused_no_sdp_on_resume() { call_marie = linphone_core_get_current_call(marie->lc); CU_ASSERT_PTR_NOT_NULL(call_marie); + if (!call_marie) goto end; ms_message("== Call is OK =="); @@ -3526,7 +3589,7 @@ static void call_with_paused_no_sdp_on_resume() { wait_for_until(marie->lc, pauline->lc, &dummy, 1, 3000); CU_ASSERT_TRUE(linphone_call_get_audio_stats(call_marie)->download_bandwidth>70); CU_ASSERT_TRUE(linphone_call_get_audio_stats(linphone_core_get_current_call(pauline->lc))->download_bandwidth>70); - +end: end_call(marie,pauline); linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); From 573fcd7dda03186c0b1d62bead0f64407198e4f6 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Tue, 7 Apr 2015 19:21:57 +0200 Subject: [PATCH 014/157] fix test --- tester/call_tester.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/tester/call_tester.c b/tester/call_tester.c index 476d41a77..7203d27b9 100644 --- a/tester/call_tester.c +++ b/tester/call_tester.c @@ -2571,14 +2571,17 @@ static void early_media_call_with_update_base(bool_t media_change){ marie_call = linphone_core_invite_address(marie->lc, pauline->identity); - CU_ASSERT_TRUE(wait_for_list(lcs, &pauline->stat.number_of_LinphoneCallIncomingReceived,1,1000)); - CU_ASSERT_TRUE(wait_for_list(lcs, &marie->stat.number_of_LinphoneCallOutgoingRinging,1,1000)); - /* send a 183 to initiate the early media */ - linphone_core_accept_early_media(pauline->lc, linphone_core_get_current_call(pauline->lc)); - CU_ASSERT_TRUE( wait_for_list(lcs, &pauline->stat.number_of_LinphoneCallIncomingEarlyMedia,1,2000) ); - CU_ASSERT_TRUE( wait_for_list(lcs, &marie->stat.number_of_LinphoneCallOutgoingEarlyMedia,1,2000) ); - + CU_ASSERT_TRUE(wait_for_list(lcs, &pauline->stat.number_of_LinphoneCallIncomingReceived,1,5000)); + CU_ASSERT_TRUE(wait_for_list(lcs, &marie->stat.number_of_LinphoneCallOutgoingRinging,1,5000)); + pauline_call = linphone_core_get_current_call(pauline->lc); + if (!pauline_call) goto end; + /* send a 183 to initiate the early media */ + linphone_core_accept_early_media(pauline->lc, pauline_call); + CU_ASSERT_TRUE( wait_for_list(lcs, &pauline->stat.number_of_LinphoneCallIncomingEarlyMedia,1,1000) ); + CU_ASSERT_TRUE( wait_for_list(lcs, &marie->stat.number_of_LinphoneCallOutgoingEarlyMedia,1,5000) ); + + pauline_params = linphone_call_params_copy(linphone_call_get_current_params(pauline_call)); if (media_change) { @@ -2614,9 +2617,9 @@ static void early_media_call_with_update_base(bool_t media_change){ CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallEnd,1,1000)); CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallEnd,1,1000)); +end: ms_list_free(lcs); - linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); } From 4449bc3481ca92a1155c9aac972d6866362fd6b0 Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Wed, 8 Apr 2015 09:43:45 +0200 Subject: [PATCH 015/157] tester: redefine CU_* macros to enable IF(! CU_macro()) { ... } syntax and goto end handling --- mediastreamer2 | 2 +- tester/common/bc_tester_utils.c | 52 +++++++++++--------- tester/common/bc_tester_utils.h | 84 +++++++++++++++++++++++++++++++++ 3 files changed, 115 insertions(+), 23 deletions(-) diff --git a/mediastreamer2 b/mediastreamer2 index 1f3306fb1..af994a131 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 1f3306fb1b243eb7e182c2f08b2dfc319c887b03 +Subproject commit af994a131d462d6b091be7f115a6341431a58de4 diff --git a/tester/common/bc_tester_utils.c b/tester/common/bc_tester_utils.c index 077ec0569..057217584 100644 --- a/tester/common/bc_tester_utils.c +++ b/tester/common/bc_tester_utils.c @@ -54,10 +54,8 @@ int xml_enabled = 0; char * suite_name; char * test_name; void (*tester_printf_va)(int level, const char *fmt, va_list args); -int verbosity_info; -int verbosity_error; -static void tester_printf(int level, const char *fmt, ...) { +void bc_tester_printf(int level, const char *fmt, ...) { va_list args; va_start (args, fmt); tester_printf_va(level, fmt, args); @@ -115,7 +113,7 @@ int bc_tester_nb_tests(const char *suite_name) { void bc_tester_list_suites() { int j; for(j=0;jpName); + bc_tester_printf(bc_printf_verbosity_error,"Suite initialization failed for [%s]", pSuite->pName); } static void suite_cleanup_failure_message_handler(const CU_pSuite pSuite) { - tester_printf(verbosity_error,"Suite cleanup failed for [%s]", pSuite->pName); + bc_tester_printf(bc_printf_verbosity_error,"Suite cleanup failed for [%s]", pSuite->pName); } #ifdef HAVE_CU_GET_SUITE static void suite_start_message_handler(const CU_pSuite pSuite) { - tester_printf(verbosity_info,"Suite [%s] started", pSuite->pName); + bc_tester_printf(bc_printf_verbosity_info,"Suite [%s] started\n", pSuite->pName); } static void suite_complete_message_handler(const CU_pSuite pSuite, const CU_pFailureRecord pFailure) { - tester_printf(verbosity_info,"Suite [%s] ended", pSuite->pName); + bc_tester_printf(bc_printf_verbosity_info,"Suite [%s] ended\n", pSuite->pName); } static void test_start_message_handler(const CU_pTest pTest, const CU_pSuite pSuite) { - tester_printf(verbosity_info,"Suite [%s] Test [%s] started", pSuite->pName,pTest->pName); + bc_tester_printf(bc_printf_verbosity_info,"Suite [%s] Test [%s] started", pSuite->pName,pTest->pName); } /*derivated from cunit*/ @@ -176,7 +174,7 @@ static void test_complete_message_handler(const CU_pTest pTest, } else { strncat(result, " passed", strlen(" passed")); } - tester_printf(verbosity_info,"%s\n", result); + bc_tester_printf(bc_printf_verbosity_info,"%s\n", result); } #endif @@ -206,26 +204,26 @@ int bc_tester_run_tests(const char *suite_name, const char *test_name) { #ifndef HAVE_CU_GET_SUITE if( suite_name ){ - tester_printf(verbosity_info, "Tester compiled without CU_get_suite() function, running all tests instead of suite '%s'", suite_name); + bc_tester_printf(bc_printf_verbosity_info, "Tester compiled without CU_get_suite() function, running all tests instead of suite '%s'", suite_name); } #else if (suite_name){ CU_pSuite suite; suite=CU_get_suite(suite_name); if (!suite) { - tester_printf(verbosity_error, "Could not find suite '%s'. Available suites are:", suite_name); + bc_tester_printf(bc_printf_verbosity_error, "Could not find suite '%s'. Available suites are:", suite_name); bc_tester_list_suites(); return -1; } else if (test_name) { CU_pTest test=CU_get_test_by_name(test_name, suite); if (!test) { - tester_printf(verbosity_error, "Could not find test '%s' in suite '%s'. Available tests are:", test_name, suite_name); + bc_tester_printf(bc_printf_verbosity_error, "Could not find test '%s' in suite '%s'. Available tests are:", test_name, suite_name); // do not use suite_name here, since this method is case sensitive bc_tester_list_tests(suite->pName); return -2; } else { CU_ErrorCode err= CU_run_test(suite, test); - if (err != CUE_SUCCESS) tester_printf(verbosity_error, "CU_basic_run_test error %d", err); + if (err != CUE_SUCCESS) bc_tester_printf(bc_printf_verbosity_error, "CU_basic_run_test error %d", err); } } else { CU_run_suite(suite); @@ -253,7 +251,7 @@ int bc_tester_run_tests(const char *suite_name, const char *test_name) { void bc_tester_helper(const char *name, const char* additionnal_helper) { - tester_printf(verbosity_info,"%s --help\n" + bc_tester_printf(bc_printf_verbosity_info,"%s --help\n" "\t\t\t--list-suites\n" "\t\t\t--list-tests \n" "\t\t\t--suite \n" @@ -271,8 +269,8 @@ void bc_tester_helper(const char *name, const char* additionnal_helper) { void bc_tester_init(void (*ftester_printf)(int level, const char *fmt, va_list args), int iverbosity_info, int iverbosity_error) { tester_printf_va = ftester_printf; - verbosity_error = iverbosity_error; - verbosity_info = iverbosity_info; + bc_printf_verbosity_error = iverbosity_error; + bc_printf_verbosity_info = iverbosity_info; } int bc_tester_parse_args(int argc, char **argv, int argid) @@ -301,12 +299,12 @@ int bc_tester_parse_args(int argc, char **argv, int argid) } else if (strcmp(argv[i], "--xml") == 0){ xml_enabled = 1; }else { - tester_printf(verbosity_error, "Unknown option \"%s\"\n", argv[i]); + bc_tester_printf(bc_printf_verbosity_error, "Unknown option \"%s\"\n", argv[i]); return -1; } if( xml_enabled && (suite_name || test_name) ){ - tester_printf(verbosity_error, "Cannot use both XML and specific test suite\n"); + bc_tester_printf(bc_printf_verbosity_error, "Cannot use both XML and specific test suite\n"); return -1; } @@ -346,7 +344,7 @@ void bc_tester_uninit() { } CU_cleanup_registry(); /*add missing final newline*/ - tester_printf(verbosity_info,""); + bc_tester_printf(bc_printf_verbosity_info,""); if( xml_enabled ){ /*create real xml file only if tester did not crash*/ @@ -363,3 +361,13 @@ void bc_tester_uninit() { nb_test_suites = 0; } } + +char * bc_tester_res(const char *name) { + char* file = NULL; + if (name) { + size_t len = strlen(bc_tester_read_dir_prefix) + 1 + strlen(name) + 1; + file = malloc(len); + snprintf(file, len, "%s/%s", bc_tester_read_dir_prefix, name); + } + return file; +} diff --git a/tester/common/bc_tester_utils.h b/tester/common/bc_tester_utils.h index ef14d98fd..374e9fad0 100644 --- a/tester/common/bc_tester_utils.h +++ b/tester/common/bc_tester_utils.h @@ -26,6 +26,9 @@ extern const char *bc_tester_read_dir_prefix; extern const char *bc_tester_writable_dir_prefix; +int bc_printf_verbosity_info; +int bc_printf_verbosity_error; + typedef void (*test_function_t)(void); typedef int (*test_suite_function_t)(const char *name); @@ -60,6 +63,7 @@ int bc_tester_parse_args(int argc, char** argv, int argid); int bc_tester_start(); void bc_tester_add_suite(test_suite_t *suite); void bc_tester_uninit(); +void bc_tester_printf(int level, const char *fmt, ...); int bc_tester_nb_suites(); int bc_tester_nb_tests(const char* name); @@ -71,6 +75,86 @@ int bc_tester_run_suite(test_suite_t *suite); int bc_tester_run_tests(const char *suite_name, const char *test_name); int bc_tester_suite_index(const char *suite_name); + +/** + * Get full path to the given resource + * + * @param name relative resource path (relative to bc_tester_writable_dir_prefix) + * @return path to the resource. Must be freed by caller. +*/ +char * bc_tester_res(const char *name); + +/*Redefine the CU_... macros WITHOUT final ';' semicolon, to allow IF conditions */ +#define BC_ASSERT_EQUAL(actual, expected) CU_assertImplementation(((actual) == (expected)), __LINE__, ("CU_ASSERT_EQUAL(" #actual "," #expected ")"), __FILE__, "", CU_FALSE) +#define BC_PASS(msg) CU_assertImplementation(CU_TRUE, __LINE__, ("CU_PASS(" #msg ")"), __FILE__, "", CU_FALSE) +#define BC_ASSERT(value) CU_assertImplementation((value), __LINE__, #value, __FILE__, "", CU_FALSE) +#define BC_ASSERT_FATAL(value) CU_assertImplementation((value), __LINE__, #value, __FILE__, "", CU_TRUE) +#define BC_TEST(value) CU_assertImplementation((value), __LINE__, #value, __FILE__, "", CU_FALSE) +#define BC_TEST_FATAL(value) CU_assertImplementation((value), __LINE__, #value, __FILE__, "", CU_TRUE) +#define BC_ASSERT_TRUE(value) CU_assertImplementation((value), __LINE__, ("CU_ASSERT_TRUE(" #value ")"), __FILE__, "", CU_FALSE) +#define BC_ASSERT_TRUE_FATAL(value) CU_assertImplementation((value), __LINE__, ("CU_ASSERT_TRUE_FATAL(" #value ")"), __FILE__, "", CU_TRUE) +#define BC_ASSERT_FALSE(value) CU_assertImplementation(!(value), __LINE__, ("CU_ASSERT_FALSE(" #value ")"), __FILE__, "", CU_FALSE) +#define BC_ASSERT_FALSE_FATAL(value) CU_assertImplementation(!(value), __LINE__, ("CU_ASSERT_FALSE_FATAL(" #value ")"), __FILE__, "", CU_TRUE) +#define BC_ASSERT_EQUAL(actual, expected) CU_assertImplementation(((actual) == (expected)), __LINE__, ("CU_ASSERT_EQUAL(" #actual "," #expected ")"), __FILE__, "", CU_FALSE) +#define BC_ASSERT_EQUAL_FATAL(actual, expected) CU_assertImplementation(((actual) == (expected)), __LINE__, ("CU_ASSERT_EQUAL_FATAL(" #actual "," #expected ")"), __FILE__, "", CU_TRUE) +#define BC_ASSERT_NOT_EQUAL(actual, expected) CU_assertImplementation(((actual) != (expected)), __LINE__, ("CU_ASSERT_NOT_EQUAL(" #actual "," #expected ")"), __FILE__, "", CU_FALSE) +#define BC_ASSERT_NOT_EQUAL_FATAL(actual, expected) CU_assertImplementation(((actual) != (expected)), __LINE__, ("CU_ASSERT_NOT_EQUAL_FATAL(" #actual "," #expected ")"), __FILE__, "", CU_TRUE) +#define BC_ASSERT_PTR_EQUAL(actual, expected) CU_assertImplementation(((const void*)(actual) == (const void*)(expected)), __LINE__, ("CU_ASSERT_PTR_EQUAL(" #actual "," #expected ")"), __FILE__, "", CU_FALSE) +#define BC_ASSERT_PTR_EQUAL_FATAL(actual, expected) CU_assertImplementation(((const void*)(actual) == (const void*)(expected)), __LINE__, ("CU_ASSERT_PTR_EQUAL_FATAL(" #actual "," #expected ")"), __FILE__, "", CU_TRUE) +#define BC_ASSERT_PTR_NOT_EQUAL(actual, expected) CU_assertImplementation(((const void*)(actual) != (const void*)(expected)), __LINE__, ("CU_ASSERT_PTR_NOT_EQUAL(" #actual "," #expected ")"), __FILE__, "", CU_FALSE) +#define BC_ASSERT_PTR_NOT_EQUAL_FATAL(actual, expected) CU_assertImplementation(((const void*)(actual) != (const void*)(expected)), __LINE__, ("CU_ASSERT_PTR_NOT_EQUAL_FATAL(" #actual "," #expected ")"), __FILE__, "", CU_TRUE) +#define BC_ASSERT_PTR_NULL(value) CU_assertImplementation((NULL == (const void*)(value)), __LINE__, ("CU_ASSERT_PTR_NULL(" #value")"), __FILE__, "", CU_FALSE) +#define BC_ASSERT_PTR_NULL_FATAL(value) CU_assertImplementation((NULL == (const void*)(value)), __LINE__, ("CU_ASSERT_PTR_NULL_FATAL(" #value")"), __FILE__, "", CU_TRUE) +#define BC_ASSERT_PTR_NOT_NULL(value) CU_assertImplementation((NULL != (const void*)(value)), __LINE__, ("CU_ASSERT_PTR_NOT_NULL(" #value")"), __FILE__, "", CU_FALSE) +#define BC_ASSERT_PTR_NOT_NULL_FATAL(value) CU_assertImplementation((NULL != (const void*)(value)), __LINE__, ("CU_ASSERT_PTR_NOT_NULL_FATAL(" #value")"), __FILE__, "", CU_TRUE) +#define BC_ASSERT_STRING_EQUAL(actual, expected) CU_assertImplementation(!(strcmp((const char*)(actual), (const char*)(expected))), __LINE__, ("CU_ASSERT_STRING_EQUAL(" #actual "," #expected ")"), __FILE__, "", CU_FALSE) +#define BC_ASSERT_STRING_EQUAL_FATAL(actual, expected) CU_assertImplementation(!(strcmp((const char*)(actual), (const char*)(expected))), __LINE__, ("CU_ASSERT_STRING_EQUAL_FATAL(" #actual "," #expected ")"), __FILE__, "", CU_TRUE) +#define BC_ASSERT_STRING_NOT_EQUAL(actual, expected) CU_assertImplementation((strcmp((const char*)(actual), (const char*)(expected))), __LINE__, ("CU_ASSERT_STRING_NOT_EQUAL(" #actual "," #expected ")"), __FILE__, "", CU_FALSE) +#define BC_ASSERT_STRING_NOT_EQUAL_FATAL(actual, expected) CU_assertImplementation((strcmp((const char*)(actual), (const char*)(expected))), __LINE__, ("CU_ASSERT_STRING_NOT_EQUAL_FATAL(" #actual "," #expected ")"), __FILE__, "", CU_TRUE) +#define BC_ASSERT_NSTRING_EQUAL(actual, expected, count) CU_assertImplementation(!(strncmp((const char*)(actual), (const char*)(expected), (size_t)(count))), __LINE__, ("CU_ASSERT_NSTRING_EQUAL(" #actual "," #expected "," #count ")"), __FILE__, "", CU_FALSE) +#define BC_ASSERT_NSTRING_EQUAL_FATAL(actual, expected, count) CU_assertImplementation(!(strncmp((const char*)(actual), (const char*)(expected), (size_t)(count))), __LINE__, ("CU_ASSERT_NSTRING_EQUAL_FATAL(" #actual "," #expected "," #count ")"), __FILE__, "", CU_TRUE) +#define BC_ASSERT_NSTRING_NOT_EQUAL(actual, expected, count) CU_assertImplementation((strncmp((const char*)(actual), (const char*)(expected), (size_t)(count))), __LINE__, ("CU_ASSERT_NSTRING_NOT_EQUAL(" #actual "," #expected "," #count ")"), __FILE__, "", CU_FALSE) +#define BC_ASSERT_NSTRING_NOT_EQUAL_FATAL(actual, expected, count) CU_assertImplementation((strncmp((const char*)(actual), (const char*)(expected), (size_t)(count))), __LINE__, ("CU_ASSERT_NSTRING_NOT_EQUAL_FATAL(" #actual "," #expected "," #count ")"), __FILE__, "", CU_TRUE) +#define BC_ASSERT_DOUBLE_EQUAL(actual, expected, granularity) CU_assertImplementation(((fabs((double)(actual) - (expected)) <= fabs((double)(granularity)))), __LINE__, ("CU_ASSERT_DOUBLE_EQUAL(" #actual "," #expected "," #granularity ")"), __FILE__, "", CU_FALSE) +#define BC_ASSERT_DOUBLE_EQUAL_FATAL(actual, expected, granularity) CU_assertImplementation(((fabs((double)(actual) - (expected)) <= fabs((double)(granularity)))), __LINE__, ("CU_ASSERT_DOUBLE_EQUAL_FATAL(" #actual "," #expected "," #granularity ")"), __FILE__, "", CU_TRUE) +#define BC_ASSERT_DOUBLE_NOT_EQUAL(actual, expected, granularity) CU_assertImplementation(((fabs((double)(actual) - (expected)) > fabs((double)(granularity)))), __LINE__, ("CU_ASSERT_DOUBLE_NOT_EQUAL(" #actual "," #expected "," #granularity ")"), __FILE__, "", CU_FALSE) +#define BC_ASSERT_DOUBLE_NOT_EQUAL_FATAL(actual, expected, granularity) CU_assertImplementation(((fabs((double)(actual) - (expected)) > fabs((double)(granularity)))), __LINE__, ("CU_ASSERT_DOUBLE_NOT_EQUAL_FATAL(" #actual "," #expected "," #granularity ")"), __FILE__, "", CU_TRUE) +#define BC_ASSERT_GREATER(actual, expected) CU_assertImplementation(((actual) >= (expected)), __LINE__, ("CU_ASSERT_GREATER(" #actual "," #expected ")"), __FILE__, "", CU_FALSE) +#define BC_ASSERT_LOWER(actual, expected) CU_assertImplementation((actual) <= (expected)), __LINE__, ("CU_ASSERT_LOWER(" #actual "," #expected ")"), __FILE__, "", CU_FALSE) + +/*Add some custom defines with logs in case of fail*/ +#define BC_ASSERT_EQUAL_INT(actual, expected) { \ + int cactual = (actual), cexpected = (expected); \ + if (! BC_ASSERT_EQUAL(cactual, cexpected)) { \ + bc_tester_printf(bc_printf_verbosity_error, "%s:%d - Expected " #actual " = " #expected " but was %d != %d\n", __FILE__, __LINE__, cactual, cexpected); \ + } \ +} +#define BC_ASSERT_GREATER_INT(actual, expected) { \ + int cactual = (actual), cexpected = (expected); \ + if (! BC_ASSERT_LOWER(cactual, cexpected)) { \ + bc_tester_printf(bc_printf_verbosity_error, "%s:%d - Expected " #actual " >= " #expected " but was %d < %d\n", __FILE__, __LINE__, cactual, cexpected); \ + } \ +} +#define BC_ASSERT_LOWER_INT(actual, expected) { \ + int cactual = (actual), cexpected = (expected); \ + if (! BC_ASSERT_LOWER(cactual, cexpected)) { \ + bc_tester_printf(bc_printf_verbosity_error, "%s:%d - Expected " #actual " <= " #expected " but was %d > %d\n", __FILE__, __LINE__, cactual, cexpected); \ + } \ +} +#define BC_ASSERT_GREATER_UINT64_T(actual, expected) { \ + uint64_t cactual = (actual), cexpected = (expected); \ + if (! BC_ASSERT_GREATER(cactual, cexpected)) { \ + bc_tester_printf(bc_printf_verbosity_error, "%s:%d - Expected " #actual " >= " #expected " but was %lu < %lu\n", __FILE__, __LINE__, (long unsigned)cactual, (long unsigned)cexpected); \ + } \ +} +#define BC_ASSERT_LOWER_UINT64_T(actual, expected) { \ + uint64_t cactual = (actual), cexpected = (expected); \ + if (! BC_ASSERT_GREATER(cactual, cexpected)) { \ + bc_tester_printf(bc_printf_verbosity_error, "%s:%d - Expected " #actual " <= " #expected " but was %lu > %lu\n", __FILE__, __LINE__, (long unsigned)cactual, (long unsigned)cexpected); \ + } \ +} + + #ifdef __cplusplus } #endif From 81c032ecf03123e7b78b1c87c56e73cb1f0e9d29 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Wed, 8 Apr 2015 11:51:17 +0200 Subject: [PATCH 016/157] Updated ms2 with v4l2 capture changes --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index af994a131..835447565 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit af994a131d462d6b091be7f115a6341431a58de4 +Subproject commit 835447565c6553de91e1c034275fbd87e55079c3 From f991b69ab7abb5d6415cb107232a63f2d3426849 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Grisez?= Date: Wed, 8 Apr 2015 15:11:23 +0200 Subject: [PATCH 017/157] Search for linphonerc.factory in ../share/linphone instead of ../share/Linphone on Unix --- gtk/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtk/main.c b/gtk/main.c index ad984c081..aa993cf4c 100644 --- a/gtk/main.c +++ b/gtk/main.c @@ -220,7 +220,7 @@ static const char *linphone_gtk_get_factory_config_file(){ basename ++; *basename = '\0'; snprintf(_factory_config_file, sizeof(_factory_config_file), - "%s/../share/Linphone/%s", progdir, FACTORY_CONFIG_FILE); + "%s/../share/linphone/%s", progdir, FACTORY_CONFIG_FILE); } else { free(progdir); return NULL; From 0387cd476b7f682b68ee37ced6e1cefc9eddb2da Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Wed, 8 Apr 2015 16:35:52 +0200 Subject: [PATCH 018/157] Update ms2 and oRTP submodules. --- mediastreamer2 | 2 +- oRTP | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mediastreamer2 b/mediastreamer2 index 835447565..36213e704 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 835447565c6553de91e1c034275fbd87e55079c3 +Subproject commit 36213e704d79fbe62fa4ab8ed70feaeb3efeaa69 diff --git a/oRTP b/oRTP index f21b5418b..a024f905f 160000 --- a/oRTP +++ b/oRTP @@ -1 +1 @@ -Subproject commit f21b5418b62c8acbe7a8a3be4ddf569af537d35e +Subproject commit a024f905fd42d7b90c16dd7562b226f0afc4c59e From 40f82acc4d73aa19657e376c82c68eaad6bf6bdb Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Thu, 9 Apr 2015 09:47:03 +0200 Subject: [PATCH 019/157] tester: fix duplicate symbols issue --- tester/common/bc_tester_utils.c | 3 +++ tester/common/bc_tester_utils.h | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/tester/common/bc_tester_utils.c b/tester/common/bc_tester_utils.c index 057217584..22d74cd02 100644 --- a/tester/common/bc_tester_utils.c +++ b/tester/common/bc_tester_utils.c @@ -41,6 +41,9 @@ const char *bc_tester_writable_dir_prefix = "/data/data/org.linphone.tester/cach const char *bc_tester_writable_dir_prefix = "."; #endif +int bc_printf_verbosity_info; +int bc_printf_verbosity_error; + static test_suite_t **test_suite = NULL; static int nb_test_suites = 0; diff --git a/tester/common/bc_tester_utils.h b/tester/common/bc_tester_utils.h index 374e9fad0..815e74eb6 100644 --- a/tester/common/bc_tester_utils.h +++ b/tester/common/bc_tester_utils.h @@ -26,8 +26,8 @@ extern const char *bc_tester_read_dir_prefix; extern const char *bc_tester_writable_dir_prefix; -int bc_printf_verbosity_info; -int bc_printf_verbosity_error; +extern int bc_printf_verbosity_info; +extern int bc_printf_verbosity_error; typedef void (*test_function_t)(void); typedef int (*test_suite_function_t)(const char *name); From 8352e97861c48d8ca1cccb9e403af085d89deda6 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Thu, 9 Apr 2015 23:04:23 +0200 Subject: [PATCH 020/157] fix crashing test --- tester/call_tester.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/tester/call_tester.c b/tester/call_tester.c index 7203d27b9..7d4d7cc18 100644 --- a/tester/call_tester.c +++ b/tester/call_tester.c @@ -1907,7 +1907,7 @@ end: static void video_call_with_early_media_no_matching_audio_codecs(void) { LinphoneCoreManager *marie = linphone_core_manager_new("marie_rc"); LinphoneCoreManager *pauline = linphone_core_manager_new("pauline_rc"); - LinphoneCall *out_call; + LinphoneCall *out_call, *pauline_call; LinphoneVideoPolicy vpol={0}; linphone_core_enable_video_capture(marie->lc, TRUE); @@ -1929,17 +1929,20 @@ static void video_call_with_early_media_no_matching_audio_codecs(void) { CU_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &pauline->stat.number_of_LinphoneCallIncomingReceived, 1)); CU_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &marie->stat.number_of_LinphoneCallOutgoingRinging, 1)); - linphone_core_accept_early_media(pauline->lc,linphone_core_get_current_call(pauline->lc)); + pauline_call = linphone_core_get_current_call(pauline->lc); + if (!pauline_call) goto end; + + linphone_core_accept_early_media(pauline->lc, pauline_call); CU_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &pauline->stat.number_of_LinphoneCallIncomingEarlyMedia, 1)); CU_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &marie->stat.number_of_LinphoneCallOutgoingEarlyMedia, 1)); /*audio stream shall not have been requested to start*/ - CU_ASSERT_PTR_NULL(linphone_core_get_current_call(pauline->lc)->audiostream->soundread); + CU_ASSERT_PTR_NULL(pauline_call->audiostream->soundread); CU_ASSERT_TRUE(linphone_call_params_video_enabled(linphone_call_get_current_params(out_call))==TRUE); - CU_ASSERT_TRUE(linphone_call_params_video_enabled(linphone_call_get_current_params(linphone_core_get_current_call(pauline->lc)))==TRUE); + CU_ASSERT_TRUE(linphone_call_params_video_enabled(linphone_call_get_current_params(pauline_call))==TRUE); - linphone_core_accept_call(pauline->lc, linphone_core_get_current_call(pauline->lc)); + linphone_core_accept_call(pauline->lc, pauline_call); CU_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &pauline->stat.number_of_LinphoneCallStreamsRunning, 1)); CU_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &marie->stat.number_of_LinphoneCallStreamsRunning, 1)); @@ -1949,6 +1952,7 @@ static void video_call_with_early_media_no_matching_audio_codecs(void) { CU_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &pauline->stat.number_of_LinphoneCallEnd, 1)); CU_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &marie->stat.number_of_LinphoneCallEnd, 1)); +end: linphone_call_unref(out_call); linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); From 74ad3ed63f99dd65ca2c9881731ae18cbc0e92c8 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Fri, 10 Apr 2015 11:45:47 +0200 Subject: [PATCH 021/157] Add linphonerc option to disable video during pause. --- coreapi/callbacks.c | 9 +++++++-- coreapi/linphonecall.c | 28 ++++++++++++++++------------ coreapi/linphonecore.c | 29 ++++++++++++++++++----------- coreapi/private.h | 1 + 4 files changed, 42 insertions(+), 25 deletions(-) diff --git a/coreapi/callbacks.c b/coreapi/callbacks.c index 48235265c..d1d7ce160 100644 --- a/coreapi/callbacks.c +++ b/coreapi/callbacks.c @@ -620,12 +620,17 @@ static void call_resumed(LinphoneCore *lc, LinphoneCall *call){ } static void call_paused_by_remote(LinphoneCore *lc, LinphoneCall *call){ + LinphoneCallParams *params; /*when we are paused, increment session id, because sdp is changed (a=recvonly appears)*/ linphone_call_increment_local_media_description(call); /* we are being paused */ linphone_core_notify_display_status(lc,_("We are paused by other party.")); - _linphone_core_accept_call_update(lc,call,NULL,LinphoneCallPausedByRemote,"Call paused by remote"); - + params = linphone_call_params_copy(call->params); + if (lp_config_get_int(lc->config, "sip", "inactive_video_on_pause", 0)) { + linphone_call_params_set_video_direction(params, LinphoneMediaDirectionInactive); + } + _linphone_core_accept_call_update(lc,call,params,LinphoneCallPausedByRemote,"Call paused by remote"); + linphone_call_params_unref(params); } static void call_updated_by_remote(LinphoneCore *lc, LinphoneCall *call, bool_t is_update){ diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c index 84d3e5b63..1954b79a5 100644 --- a/coreapi/linphonecall.c +++ b/coreapi/linphonecall.c @@ -574,7 +574,11 @@ static const char *linphone_call_get_public_ip_for_stream(LinphoneCall *call, in return public_ip; } -void linphone_call_make_local_media_description(LinphoneCore *lc, LinphoneCall *call){ +void linphone_call_make_local_media_description(LinphoneCore *lc, LinphoneCall *call) { + linphone_call_make_local_media_description_with_params(lc, call, call->params); +} + +void linphone_call_make_local_media_description_with_params(LinphoneCore *lc, LinphoneCall *call, LinphoneCallParams *params) { MSList *l; SalMediaDescription *old_md=call->localdesc; int i; @@ -596,9 +600,9 @@ void linphone_call_make_local_media_description(LinphoneCore *lc, LinphoneCall * md->streams[1].multicast_role = SalMulticastSender; } - subject=linphone_call_params_get_session_name(call->params); + subject=linphone_call_params_get_session_name(params); - linphone_core_adapt_to_network(lc,call->ping_time,call->params); + linphone_core_adapt_to_network(lc,call->ping_time,params); if (call->dest_proxy) me=linphone_proxy_config_get_identity(call->dest_proxy); @@ -615,8 +619,8 @@ void linphone_call_make_local_media_description(LinphoneCore *lc, LinphoneCall * strncpy(md->username,linphone_address_get_username(addr),sizeof(md->username)); if (subject) strncpy(md->name,subject,sizeof(md->name)); - if (call->params->down_bw) - md->bandwidth=call->params->down_bw; + if (params->down_bw) + md->bandwidth=params->down_bw; else md->bandwidth=linphone_core_get_download_bandwidth(lc); /*set audio capabilities */ @@ -625,14 +629,14 @@ void linphone_call_make_local_media_description(LinphoneCore *lc, LinphoneCall * strncpy(md->streams[0].name,"Audio",sizeof(md->streams[0].name)-1); md->streams[0].rtp_port=call->media_ports[0].rtp_port; md->streams[0].rtcp_port=call->media_ports[0].rtcp_port; - md->streams[0].proto=get_proto_from_call_params(call->params); - md->streams[0].dir=get_audio_dir_from_call_params(call->params); + md->streams[0].proto=get_proto_from_call_params(params); + md->streams[0].dir=get_audio_dir_from_call_params(params); md->streams[0].type=SalAudio; - if (call->params->down_ptime) - md->streams[0].ptime=call->params->down_ptime; + if (params->down_ptime) + md->streams[0].ptime=params->down_ptime; else md->streams[0].ptime=linphone_core_get_download_ptime(lc); - codec_hints.bandwidth_limit=call->params->audio_bw; + codec_hints.bandwidth_limit=params->audio_bw; codec_hints.max_codecs=-1; codec_hints.previously_used=old_md ? old_md->streams[0].already_assigned_payloads : NULL; l=make_codec_list(lc, &codec_hints, SalAudio, lc->codecs_conf.audio_codecs); @@ -648,14 +652,14 @@ void linphone_call_make_local_media_description(LinphoneCore *lc, LinphoneCall * ms_warning("Cannot get audio local ssrc for call [%p]",call); nb_active_streams++; - if (call->params->has_video && (!call->params->internal_call_update || !call->current_params->video_declined)){ + if (params->has_video && (!params->internal_call_update || !call->current_params->video_declined)){ strncpy(md->streams[1].rtp_addr,linphone_call_get_public_ip_for_stream(call,1),sizeof(md->streams[1].rtp_addr)); strncpy(md->streams[1].rtcp_addr,linphone_call_get_public_ip_for_stream(call,1),sizeof(md->streams[1].rtcp_addr)); strncpy(md->streams[1].name,"Video",sizeof(md->streams[1].name)-1); md->streams[1].rtp_port=call->media_ports[1].rtp_port; md->streams[1].rtcp_port=call->media_ports[1].rtcp_port; md->streams[1].proto=md->streams[0].proto; - md->streams[1].dir=get_video_dir_from_call_params(call->params); + md->streams[1].dir=get_video_dir_from_call_params(params); md->streams[1].type=SalVideo; codec_hints.bandwidth_limit=0; codec_hints.max_codecs=-1; diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index 36bfd8cf3..70b55a109 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -3987,27 +3987,34 @@ int linphone_core_pause_call(LinphoneCore *lc, LinphoneCall *call){ int _linphone_core_pause_call(LinphoneCore *lc, LinphoneCall *call) { const char *subject=NULL; + LinphoneCallParams *params; if (call->state!=LinphoneCallStreamsRunning && call->state!=LinphoneCallPausedByRemote){ ms_warning("Cannot pause this call, it is not active."); return -1; } - linphone_call_make_local_media_description(lc,call); + if (sal_media_description_has_dir(call->resultdesc, SalStreamSendRecv)) { + subject = "Call on hold"; + } else if (sal_media_description_has_dir(call->resultdesc, SalStreamRecvOnly)) { + subject = "Call on hold for me too"; + } else { + ms_error("No reason to pause this call, it is already paused or inactive."); + return -1; + } + params = linphone_call_params_copy(call->params); + linphone_call_params_set_audio_direction(params, LinphoneMediaDirectionSendOnly); + if (lp_config_get_int(lc->config, "sip", "inactive_video_on_pause", 0)) { + linphone_call_params_set_video_direction(params, LinphoneMediaDirectionInactive); + } else { + linphone_call_params_set_video_direction(params, LinphoneMediaDirectionSendOnly); + } + linphone_call_make_local_media_description_with_params(lc, call, params); + linphone_call_params_unref(params); #ifdef BUILD_UPNP if(call->upnp_session != NULL) { linphone_core_update_local_media_description_from_upnp(call->localdesc, call->upnp_session); } #endif //BUILD_UPNP - if (sal_media_description_has_dir(call->resultdesc,SalStreamSendRecv)){ - sal_media_description_set_dir(call->localdesc,SalStreamSendOnly); - subject="Call on hold"; - }else if (sal_media_description_has_dir(call->resultdesc,SalStreamRecvOnly)){ - sal_media_description_set_dir(call->localdesc,SalStreamSendOnly); - subject="Call on hold for me too"; - }else{ - ms_error("No reason to pause this call, it is already paused or inactive."); - return -1; - } sal_call_set_local_media_description(call->op,call->localdesc); if (sal_call_update(call->op,subject,FALSE) != 0){ linphone_core_notify_display_warning(lc,_("Could not pause the call")); diff --git a/coreapi/private.h b/coreapi/private.h index 09062267d..a2f29632f 100644 --- a/coreapi/private.h +++ b/coreapi/private.h @@ -856,6 +856,7 @@ int linphone_core_get_calls_nb(const LinphoneCore *lc); void linphone_core_set_state(LinphoneCore *lc, LinphoneGlobalState gstate, const char *message); void linphone_call_make_local_media_description(LinphoneCore *lc, LinphoneCall *call); +void linphone_call_make_local_media_description_with_params(LinphoneCore *lc, LinphoneCall *call, LinphoneCallParams *params); void linphone_call_increment_local_media_description(LinphoneCall *call); void linphone_core_update_streams(LinphoneCore *lc, LinphoneCall *call, SalMediaDescription *new_md); From 3611dcf6d708bd61802343b20ada11102cfa0c72 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Fri, 10 Apr 2015 22:27:56 +0200 Subject: [PATCH 022/157] add test for very special case where ICE video call is accepted by call params instead of policy --- tester/call_tester.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/tester/call_tester.c b/tester/call_tester.c index 7d4d7cc18..c8c2b4a4d 100644 --- a/tester/call_tester.c +++ b/tester/call_tester.c @@ -3909,6 +3909,18 @@ static void video_call_with_re_invite_inactive_followed_by_re_invite() { static void video_call_with_re_invite_inactive_followed_by_re_invite_no_sdp() { video_call_with_re_invite_inactive_followed_by_re_invite_base(TRUE); } +static void video_call_ice_params() { + LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); + LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc"); + linphone_core_set_stun_server(marie->lc,"stun.linphone.org"); + linphone_core_set_firewall_policy(marie->lc,LinphonePolicyUseIce); + linphone_core_set_stun_server(pauline->lc,"stun.linphone.org"); + linphone_core_set_firewall_policy(pauline->lc,LinphonePolicyUseIce); + video_call_base(marie,pauline,FALSE,LinphoneMediaEncryptionNone,TRUE,TRUE); + CU_FAIL("200ok ice list is wrong, missing reflexive candidates"); + linphone_core_manager_destroy(marie); + linphone_core_manager_destroy(pauline); +} #endif test_t call_tests[] = { @@ -3960,6 +3972,7 @@ test_t call_tests[] = { { "Video call using policy with callee video disabled", video_call_using_policy_with_callee_video_disabled }, { "Video call using policy with caller video disabled", video_call_using_policy_with_caller_video_disabled }, { "Video call without SDP",video_call_no_sdp}, + { "Video call with ICE accepted using call params",video_call_ice_params}, { "SRTP ice video call", srtp_video_ice_call }, { "ZRTP ice video call", zrtp_video_ice_call }, { "Call with video added", call_with_video_added }, From 7fb4c0d19b8f586645f97ca8db2c5ee5dc72b75b Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Mon, 13 Apr 2015 09:35:28 +0200 Subject: [PATCH 023/157] fix ICE bug --- coreapi/linphonecall.c | 2 +- tester/call_tester.c | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c index 1954b79a5..8a1888341 100644 --- a/coreapi/linphonecall.c +++ b/coreapi/linphonecall.c @@ -1860,7 +1860,7 @@ int linphone_call_prepare_ice(LinphoneCall *call, bool_t incoming_offer){ if ((linphone_core_get_firewall_policy(call->core) == LinphonePolicyUseIce) && (call->ice_session != NULL)){ if (incoming_offer){ remote=sal_call_get_remote_media_description(call->op); - has_video=call->params->has_video && linphone_core_media_description_contains_video_stream(remote); + has_video=linphone_core_video_enabled(call->core) && linphone_core_media_description_contains_video_stream(remote); }else has_video=call->params->has_video; _linphone_call_prepare_ice_for_stream(call,0,TRUE); diff --git a/tester/call_tester.c b/tester/call_tester.c index c8c2b4a4d..e7bfde1b8 100644 --- a/tester/call_tester.c +++ b/tester/call_tester.c @@ -3912,12 +3912,10 @@ static void video_call_with_re_invite_inactive_followed_by_re_invite_no_sdp() { static void video_call_ice_params() { LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc"); - linphone_core_set_stun_server(marie->lc,"stun.linphone.org"); + linphone_core_set_firewall_policy(marie->lc,LinphonePolicyUseIce); - linphone_core_set_stun_server(pauline->lc,"stun.linphone.org"); linphone_core_set_firewall_policy(pauline->lc,LinphonePolicyUseIce); video_call_base(marie,pauline,FALSE,LinphoneMediaEncryptionNone,TRUE,TRUE); - CU_FAIL("200ok ice list is wrong, missing reflexive candidates"); linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); } @@ -3972,7 +3970,6 @@ test_t call_tests[] = { { "Video call using policy with callee video disabled", video_call_using_policy_with_callee_video_disabled }, { "Video call using policy with caller video disabled", video_call_using_policy_with_caller_video_disabled }, { "Video call without SDP",video_call_no_sdp}, - { "Video call with ICE accepted using call params",video_call_ice_params}, { "SRTP ice video call", srtp_video_ice_call }, { "ZRTP ice video call", zrtp_video_ice_call }, { "Call with video added", call_with_video_added }, @@ -3985,6 +3982,7 @@ test_t call_tests[] = { { "Call with multiple early media", multiple_early_media }, { "Call with ICE from video to non-video", call_with_ice_video_to_novideo}, { "Call with ICE and video added", call_with_ice_video_added }, + { "Video call with ICE accepted using call params",video_call_ice_params}, { "Video call recording", video_call_recording_test }, { "Snapshot", video_call_snapshot }, { "Video call with early media and no matching audio codecs", video_call_with_early_media_no_matching_audio_codecs }, From b9eec6849cf1b9f70f264e586eb38afe5a3e8d84 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Mon, 13 Apr 2015 11:22:34 +0200 Subject: [PATCH 024/157] rename auto_answer into lp-autoanswer --- tools/Makefile.am | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tools/Makefile.am b/tools/Makefile.am index ab76dddb2..ecd6cab5a 100644 --- a/tools/Makefile.am +++ b/tools/Makefile.am @@ -19,7 +19,7 @@ EXTRA_DIST=xml2lpc_jni.cc lpc2xml_jni.cc if BUILD_TOOLS -bin_PROGRAMS=xml2lpc_test lpc2xml_test lp-gen-wrappers auto_answer +bin_PROGRAMS=xml2lpc_test lpc2xml_test lp-gen-wrappers lp-autoanswer xml2lpc_test_SOURCES=\ xml2lpc_test.c @@ -42,9 +42,9 @@ lp_gen_wrappers_SOURCES=genwrappers.cc \ lp_gen_wrappers_LDADD= \ $(LIBXML2_LIBS) -auto_answer_SOURCES=auto_answer.c -auto_answer_CFLAGS=$(COMMON_CFLAGS) -auto_answer_LDADD=\ +lp_autoanswer_SOURCES=auto_answer.c +lp_autoanswer_CFLAGS=$(COMMON_CFLAGS) +lp_autoanswer_LDADD=\ $(top_builddir)/coreapi/liblinphone.la \ $(MEDIASTREAMER_LIBS) From e83b3484af751c265c1a50909f10f90e2894bb07 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Mon, 13 Apr 2015 12:24:24 +0200 Subject: [PATCH 025/157] update README --- README.macos.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/README.macos.md b/README.macos.md index 436f6b967..61132bf3f 100644 --- a/README.macos.md +++ b/README.macos.md @@ -103,9 +103,6 @@ The next pieces need to be compiled manually. make CCFLAGS="$CFLAGS -c -O2 -DNeedFunctionPrototypes=1" sudo make install INSTALL_ROOT=/opt/local GSM_INSTALL_INC=/opt/local/include -* (Optional) libvpx-1.2 has a bug on MacOS resulting in ugly video. It is recommended to upgrade it manually to 1.3 from source. -The libvpx build isn't able to produce dual architecture files. To workaround this, configure libvpx twice and use lipo to create a dual architecture `libvpx.a`. - * (Optional, proprietary extension only) Compile and install the tunnel library If you got the source code from git, run `./autogen.sh` first. Then or otherwise, do: From 144bdc532863999a4444f21e51ac5e170a71b8a7 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Mon, 13 Apr 2015 12:35:25 +0200 Subject: [PATCH 026/157] fix bundle generation --- Makefile.am | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Makefile.am b/Makefile.am index 87695fe53..80c1e1e98 100644 --- a/Makefile.am +++ b/Makefile.am @@ -249,3 +249,7 @@ discovery: touch specs.c $(CC) --include $(top_builddir)/config.h \ $(TUNNEL_CFLAGS) $(CFLAGS) $(MEDIASTREAMER2_CFLAGS) $(ORTP_CFLAGS) $(SIPSTACK_CFLAGS) $(CUNIT_CFLAGS) -E -P -v -dD specs.c + +.PHONY: Linphone.app + + From d78aed08aac78846c76012f9a98caae2ababd6ba Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Tue, 14 Apr 2015 13:37:59 +0200 Subject: [PATCH 027/157] chat.c: mark messages as read anytime user starts replaying --- gtk/chat.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/gtk/chat.c b/gtk/chat.c index b6cdb76ca..5479b7330 100644 --- a/gtk/chat.c +++ b/gtk/chat.c @@ -294,6 +294,8 @@ void linphone_gtk_compose_text(void) { LinphoneChatRoom *cr=g_object_get_data(G_OBJECT(w),"cr"); if (cr) { linphone_chat_room_compose(cr); + linphone_chat_room_mark_as_read(cr); + linphone_gtk_friend_list_update_chat_picture(); } } @@ -422,7 +424,7 @@ GtkWidget* linphone_gtk_init_chatroom(LinphoneChatRoom *cr, const LinphoneAddres display_history_message(chat_view,messages,with); button = linphone_gtk_get_widget(chat_view,"send"); g_signal_connect_swapped(G_OBJECT(button),"clicked",(GCallback)linphone_gtk_send_text,NULL); - + g_signal_connect_swapped(G_OBJECT(entry),"activate",(GCallback)linphone_gtk_send_text,NULL); g_signal_connect_swapped(G_OBJECT(entry),"changed",(GCallback)linphone_gtk_compose_text,NULL); g_signal_connect(G_OBJECT(notebook),"switch_page",(GCallback)linphone_gtk_notebook_tab_select,NULL); From 54b161f8d0c5507c38fa76cf1e6f4bd2f38f66b7 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Tue, 14 Apr 2015 13:41:08 +0200 Subject: [PATCH 028/157] update ms2 --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index 36213e704..467d48150 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 36213e704d79fbe62fa4ab8ed70feaeb3efeaa69 +Subproject commit 467d48150b34b1ead2f5c97ae2f459e04efde1ca From a99188ebeb428bda5062e9ae23212cb3c850c2db Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Tue, 14 Apr 2015 17:01:55 +0200 Subject: [PATCH 029/157] Added dos test on flexisip suite & updated flexisip.conf --- tester/flexisip/flexisip.conf | 48 ++++++++++++++++++----------------- tester/flexisip_tester.c | 40 ++++++++++++++++++++++++++++- 2 files changed, 64 insertions(+), 24 deletions(-) diff --git a/tester/flexisip/flexisip.conf b/tester/flexisip/flexisip.conf index 96ac77cc4..be06bbf89 100755 --- a/tester/flexisip/flexisip.conf +++ b/tester/flexisip/flexisip.conf @@ -60,31 +60,35 @@ bind-address=0.0.0.0 # Default value: 3478 port=3478 + ## -## DOS protection parameters. +## This module bans user when they are sending too much packets on +## a given timelapse ## -[dos-protection] -# Enable or disable DOS protection using IPTables firewall. -# Default value: false -enabled=false +[module::DoS] +# Indicate whether the module is activated. +# Default value: true +enabled=true -# List of whitelist IPs which won't be affected by DOS protection. -# Default value: 127.0.0.1 -authorized-ip=127.0.0.1 +# A request/response enters module if the boolean filter evaluates +# to true. Ex: from.uri.domain contains 'sip.linphone.org', from.uri.domain +# in 'a.org b.org c.org', (to.uri.domain in 'a.org b.org c.org') +# && (user-agent == 'Linphone v2') +# Default value: +filter= -# Local ports to protect. -# Default value: 5060 -port=5060 +# Number of milliseconds to calculate the packet rate +# Default value: 1000 +time-period=1000 -# Time (in seconds) while an IP have to not send any packet in order -# to leave the blacklist. -# Default value: 60 -ban-duration=60 +# Maximum packet rate received in [time-period] millisecond(s) to +# consider to consider it a DoS attack. +# Default value: 5 +packet-rate-limit=5 -# Number of packets authorized in 1sec before considering them as -# DOS attack. -# Default value: 20 -packets-limit=20 +# Number of minutes to ban the ip/port using iptables +# Default value: 1 +ban-time=1 ## @@ -273,10 +277,6 @@ fork-late=true call-fork-timeout=20 -# Only forward one response of forked invite to the caller -# Default value: true -fork-one-response=true - # All the forked have to decline in order to decline the caller # invite # Default value: false @@ -544,3 +544,5 @@ filter= # Default value: collector-address=sip:collector@sip.example.org + + diff --git a/tester/flexisip_tester.c b/tester/flexisip_tester.c index a5e0f3803..d32740440 100644 --- a/tester/flexisip_tester.c +++ b/tester/flexisip_tester.c @@ -858,6 +858,43 @@ static void file_transfer_message_external_body_to_rcs_client(void) { linphone_core_manager_destroy(pauline); } +static void dos_module_trigger(void) { + char *to; + LinphoneChatRoom *chat_room; + int i = 0; + int number_of_messge_to_send = 100; + LinphoneCoreManager* marie = linphone_core_manager_new("marie_rc"); + LinphoneCoreManager* pauline = linphone_core_manager_new("pauline_rc"); + + reset_counters(&marie->stat); + reset_counters(&pauline->stat); + + to = linphone_address_as_string(marie->identity); + chat_room = linphone_core_create_chat_room(pauline->lc,to); + + do { + char msg[128]; + sprintf(msg, "Flood message number %i", i); + linphone_chat_room_send_message(chat_room, msg); + ms_usleep(100000); + i++; + } while (i < number_of_messge_to_send); + // At this point we should be banned for a minute + + ms_usleep(90000000); // Wait 90 seconds to ensure we are not banned anymore + CU_ASSERT_TRUE(marie->stat.number_of_LinphoneMessageReceived < number_of_messge_to_send); + + reset_counters(&marie->stat); + reset_counters(&pauline->stat); + + linphone_chat_room_send_message(chat_room, "This one should pass through"); + CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneMessageReceived, 1)); + + linphone_core_manager_destroy(marie); + linphone_core_manager_destroy(pauline); + ms_free(to); +} + test_t flexisip_tests[] = { { "Subscribe forking", subscribe_forking }, { "Message forking", message_forking }, @@ -877,7 +914,8 @@ test_t flexisip_tests[] = { { "Call with ipv6", call_with_ipv6 }, { "File transfer message rcs to external body client", file_transfer_message_rcs_to_external_body_client }, { "File transfer message external body to rcs client", file_transfer_message_external_body_to_rcs_client }, - { "File transfer message external body to external body client", file_transfer_message_external_body_to_external_body_client } + { "File transfer message external body to external body client", file_transfer_message_external_body_to_external_body_client }, + { "DoS module trigger by sending a lot of chat messages", dos_module_trigger } }; From a2561ca88c636154dda9ffdc885d26fa5ffafec5 Mon Sep 17 00:00:00 2001 From: Margaux Clerc Date: Tue, 31 Mar 2015 15:03:52 +0200 Subject: [PATCH 030/157] Add ref counting on LinphoneFriend --- coreapi/friend.c | 33 +++++++++--- coreapi/linphonecore.c | 1 + coreapi/linphonecore_jni.cc | 54 +++++++++++++++++++ coreapi/linphonefriend.h | 17 +++++- coreapi/private.h | 8 ++- .../org/linphone/core/LinphoneCore.java | 6 +++ .../org/linphone/core/LinphoneCoreImpl.java | 7 ++- .../org/linphone/core/LinphoneFriendImpl.java | 12 ++--- 8 files changed, 121 insertions(+), 17 deletions(-) diff --git a/coreapi/friend.c b/coreapi/friend.c index 44a2a6f82..e6c429bee 100644 --- a/coreapi/friend.c +++ b/coreapi/friend.c @@ -128,7 +128,7 @@ void __linphone_friend_do_subscribe(LinphoneFriend *fr){ } LinphoneFriend * linphone_friend_new(){ - LinphoneFriend *obj=ms_new0(LinphoneFriend,1); + LinphoneFriend *obj=belle_sip_object_new(LinphoneFriend); obj->pol=LinphoneSPAccept; obj->presence=NULL; obj->subscribe=TRUE; @@ -150,11 +150,11 @@ LinphoneFriend *linphone_friend_new_with_address(const char *addr){ } void linphone_friend_set_user_data(LinphoneFriend *lf, void *data){ - lf->up=data; + lf->user_data=data; } void* linphone_friend_get_user_data(const LinphoneFriend *lf){ - return lf->up; + return lf->user_data; } bool_t linphone_friend_in_list(const LinphoneFriend *lf){ @@ -266,7 +266,7 @@ void linphone_friend_close_subscriptions(LinphoneFriend *lf){ } } -void linphone_friend_destroy(LinphoneFriend *lf){ +static void _linphone_friend_destroy(LinphoneFriend *lf){ if (lf->insub) { sal_op_release(lf->insub); lf->insub=NULL; @@ -278,7 +278,6 @@ void linphone_friend_destroy(LinphoneFriend *lf){ if (lf->presence != NULL) linphone_presence_model_unref(lf->presence); if (lf->uri!=NULL) linphone_address_destroy(lf->uri); if (lf->info!=NULL) buddy_info_free(lf->info); - ms_free(lf); } const LinphoneAddress *linphone_friend_get_address(const LinphoneFriend *lf){ @@ -481,7 +480,7 @@ void linphone_core_add_friend(LinphoneCore *lc, LinphoneFriend *lf) if (tmp) ms_free(tmp); return ; } - lc->friends=ms_list_append(lc->friends,lf); + lc->friends=ms_list_append(lc->friends,linphone_friend_ref(lf)); lf->lc=lc; if ( linphone_core_ready(lc)) linphone_friend_apply(lf,lc); else lf->commit=TRUE; @@ -685,3 +684,25 @@ LinphoneCore *linphone_friend_get_core(const LinphoneFriend *fr){ return fr->lc; } +LinphoneFriend *linphone_friend_ref(LinphoneFriend *lf) { + belle_sip_object_ref(lf); + return lf; +} + +void linphone_friend_unref(LinphoneFriend *lf) { + belle_sip_object_unref(lf); +} + +/* DEPRECATED */ +void linphone_friend_destroy(LinphoneFriend *lf) { + linphone_friend_unref(lf); +} + +BELLE_SIP_DECLARE_NO_IMPLEMENTED_INTERFACES(LinphoneFriend); + +BELLE_SIP_INSTANCIATE_VPTR(LinphoneFriend, belle_sip_object_t, + (belle_sip_object_destroy_t) _linphone_friend_destroy, + NULL, // clone + NULL, // marshal + FALSE +); \ No newline at end of file diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index 70b55a109..b5bfc095f 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -1253,6 +1253,7 @@ static void ui_config_read(LinphoneCore *lc) int i; for (i=0;(lf=linphone_friend_new_from_config_file(lc,i))!=NULL;i++){ linphone_core_add_friend(lc,lf); + linphone_friend_unref(lf); } call_logs_read_from_config_file(lc); } diff --git a/coreapi/linphonecore_jni.cc b/coreapi/linphonecore_jni.cc index b372f393c..1fa0390d6 100644 --- a/coreapi/linphonecore_jni.cc +++ b/coreapi/linphonecore_jni.cc @@ -250,6 +250,31 @@ jobject getChatMessage(JNIEnv *env, LinphoneChatMessage *msg){ return jobj; } +jobject getFriend(JNIEnv *env, LinphoneFriend *lfriend, jobject core){ + jobject jobj=0; + + if (lfriend!=NULL){ + jclass friendClass = (jclass)env->FindClass("org/linphone/core/LinphoneFriendImpl"); + jmethodID friendCtrId = env->GetMethodID(friendClass,"", "(J)V"); + + void *up=linphone_friend_get_user_data(lfriend); + + if (up==NULL){ + jobj=env->NewObject(friendClass,friendCtrId,(jlong)lfriend); + linphone_friend_set_user_data(lfriend,(void*)env->NewWeakGlobalRef(jobj)); + linphone_friend_ref(lfriend); + }else{ + jobj=env->NewLocalRef((jobject)up); + if (jobj == NULL){ + jobj=env->NewObject(friendClass,friendCtrId,(jlong)lfriend); + linphone_friend_set_user_data(lfriend,(void*)env->NewWeakGlobalRef(jobj)); + } + } + env->DeleteLocalRef(friendClass); + } + return jobj; +} + jobject getEvent(JNIEnv *env, LinphoneEvent *lev){ if (lev==NULL) return NULL; jobject jev=(jobject)linphone_event_get_user_data(lev); @@ -1810,6 +1835,25 @@ extern "C" void Java_org_linphone_core_LinphoneCoreImpl_addFriend(JNIEnv* env ) { linphone_core_add_friend((LinphoneCore*)lc,(LinphoneFriend*)aFriend); } +extern "C" jobjectArray Java_org_linphone_core_LinphoneCoreImpl_getFriendList(JNIEnv* env + ,jobject thiz + ,jlong lc) { + const MSList* friends = linphone_core_get_friend_list((LinphoneCore*)lc); + int friendsSize = ms_list_size(friends); + jclass cls = (jclass)env->NewGlobalRef(env->FindClass("org/linphone/core/LinphoneFriendImpl")); + jobjectArray jFriends = env->NewObjectArray(friendsSize,cls,NULL); + + for (int i = 0; i < friendsSize; i++) { + LinphoneFriend* lfriend = (LinphoneFriend*)friends->data; + jobject jfriend = getFriend(env,lfriend,thiz); + if(jfriend != NULL){ + env->SetObjectArrayElement(jFriends, i, jfriend); + } + } + + env->DeleteGlobalRef(cls); + return jFriends; +} extern "C" void Java_org_linphone_core_LinphoneCoreImpl_setPresenceInfo(JNIEnv* env ,jobject thiz ,jlong lc @@ -2838,9 +2882,11 @@ extern "C" jlong Java_org_linphone_core_LinphoneFriendImpl_newLinphoneFriend(JNI if (jFriendUri) { const char* friendUri = env->GetStringUTFChars(jFriendUri, NULL); lResult= linphone_friend_new_with_address(friendUri); + linphone_friend_set_user_data(lResult,env->NewWeakGlobalRef(thiz)); env->ReleaseStringUTFChars(jFriendUri, friendUri); } else { lResult = linphone_friend_new(); + linphone_friend_set_user_data(lResult,env->NewWeakGlobalRef(thiz)); } return (jlong)lResult; } @@ -2908,6 +2954,14 @@ extern "C" jstring Java_org_linphone_core_LinphoneFriendImpl_getRefKey(JNIEnv* } +extern "C" void Java_org_linphone_core_LinphoneFriendImpl_finalize(JNIEnv* env + ,jobject thiz + ,jlong ptr) { + LinphoneFriend *friend=(LinphoneFriend*)ptr; + linphone_friend_set_user_data(friend,NULL); + linphone_friend_unref(friend); +} + /* * Class: org_linphone_core_LinphoneFriendImpl * Method: getPresenceModel diff --git a/coreapi/linphonefriend.h b/coreapi/linphonefriend.h index d0c18825d..1a6535fed 100644 --- a/coreapi/linphonefriend.h +++ b/coreapi/linphonefriend.h @@ -135,8 +135,9 @@ LINPHONE_PUBLIC LinphoneFriend *linphone_friend_new_with_address(const char *add #define linphone_friend_new_with_addr linphone_friend_new_with_address /** - * Destructor - * @param lf #LinphoneFriend object + * Destroy a LinphoneFriend. + * @param lf LinphoneFriend object + * @deprecated Use linphone_friend_unref() instead. */ LINPHONE_PUBLIC void linphone_friend_destroy(LinphoneFriend *lf); @@ -393,6 +394,18 @@ LINPHONE_PUBLIC LinphoneFriend *linphone_core_find_friend(const LinphoneCore *lc */ LINPHONE_PUBLIC LinphoneFriend *linphone_core_get_friend_by_ref_key(const LinphoneCore *lc, const char *key); +/** + * Acquire a reference to the linphone friend. + * @param[in] lf LinphoneFriend object + * @return The same LinphoneFriend object +**/ +LINPHONE_PUBLIC LinphoneFriend * linphone_friend_ref(LinphoneFriend *lf); + +/** + * Release a reference to the linphone friend. + * @param[in] lf LinohoneFriend object +**/ +LINPHONE_PUBLIC void linphone_friend_unref(LinphoneFriend *lf); /** * Returns the LinphoneCore object managing this friend, if any. diff --git a/coreapi/private.h b/coreapi/private.h index a2f29632f..7daed803e 100644 --- a/coreapi/private.h +++ b/coreapi/private.h @@ -553,6 +553,8 @@ BELLE_SIP_DECLARE_VPTR(LinphoneChatRoom); struct _LinphoneFriend{ + belle_sip_object_t base; + void *user_data; LinphoneAddress *uri; SalOp *insub; SalOp *outsub; @@ -561,7 +563,6 @@ struct _LinphoneFriend{ struct _LinphoneCore *lc; BuddyInfo *info; char *refkey; - void *up; bool_t subscribe; bool_t subscribe_active; bool_t inc_subscribe_pending; @@ -569,6 +570,8 @@ struct _LinphoneFriend{ bool_t initial_subscribes_sent; /*used to know if initial subscribe message was sent or not*/ }; +BELLE_SIP_DECLARE_VPTR(LinphoneFriend); + typedef struct sip_config { @@ -1081,7 +1084,8 @@ BELLE_SIP_TYPE_ID(LinphoneChatRoom), BELLE_SIP_TYPE_ID(LinphoneContent), BELLE_SIP_TYPE_ID(LinphoneLDAPContactProvider), BELLE_SIP_TYPE_ID(LinphoneLDAPContactSearch), -BELLE_SIP_TYPE_ID(LinphoneProxyConfig) +BELLE_SIP_TYPE_ID(LinphoneProxyConfig), +BELLE_SIP_TYPE_ID(LinphoneFriend) BELLE_SIP_DECLARE_TYPES_END diff --git a/java/common/org/linphone/core/LinphoneCore.java b/java/common/org/linphone/core/LinphoneCore.java index 2c4616dd8..33f917b7c 100644 --- a/java/common/org/linphone/core/LinphoneCore.java +++ b/java/common/org/linphone/core/LinphoneCore.java @@ -889,6 +889,12 @@ public interface LinphoneCore { */ void addFriend(LinphoneFriend lf) throws LinphoneCoreException; + /** + * Get list of LinphoneFriend + * @return LinphoneFriend list + */ + LinphoneFriend[] getFriendList(); + /** * @brief Set my presence status * @param minutes_away how long in away diff --git a/java/impl/org/linphone/core/LinphoneCoreImpl.java b/java/impl/org/linphone/core/LinphoneCoreImpl.java index 80d007172..2268c6585 100644 --- a/java/impl/org/linphone/core/LinphoneCoreImpl.java +++ b/java/impl/org/linphone/core/LinphoneCoreImpl.java @@ -92,6 +92,7 @@ class LinphoneCoreImpl implements LinphoneCore { private native void setPreviewWindowId(long nativePtr, Object wid); private native void setDeviceRotation(long nativePtr, int rotation); private native void addFriend(long nativePtr,long friend); + private native LinphoneFriend[] getFriendList(long nativePtr); private native void setPresenceInfo(long nativePtr, int minutes_away, String alternative_contact, int status); private native int getPresenceInfo(long nativePtr); private native void setPresenceModel(long nativePtr, long presencePtr); @@ -433,8 +434,12 @@ class LinphoneCoreImpl implements LinphoneCore { public synchronized void addFriend(LinphoneFriend lf) throws LinphoneCoreException { addFriend(nativePtr,((LinphoneFriendImpl)lf).nativePtr); - } + + public synchronized LinphoneFriend[] getFriendList() { + return getFriendList(nativePtr); + } + @SuppressWarnings("deprecation") public synchronized void setPresenceInfo(int minutes_away, String alternative_contact, OnlineStatus status) { setPresenceInfo(nativePtr,minutes_away,alternative_contact,status.mValue); diff --git a/java/impl/org/linphone/core/LinphoneFriendImpl.java b/java/impl/org/linphone/core/LinphoneFriendImpl.java index 2285f3788..220f5dbca 100644 --- a/java/impl/org/linphone/core/LinphoneFriendImpl.java +++ b/java/impl/org/linphone/core/LinphoneFriendImpl.java @@ -22,6 +22,7 @@ import java.io.Serializable; class LinphoneFriendImpl implements LinphoneFriend, Serializable { protected final long nativePtr; + private native void finalize(long nativePtr); private native long newLinphoneFriend(String friendUri); private native void setAddress(long nativePtr,long friend); private native long getAddress(long nativePtr); @@ -34,24 +35,23 @@ class LinphoneFriendImpl implements LinphoneFriend, Serializable { private native void setPresenceModel(long nativePtr, long presencePtr); private native void edit(long nativePtr); private native void done(long nativePtr); - private native void delete(long ptr); private native Object getCore(long ptr); private native void setRefKey(long nativePtr, String key); private native String getRefKey(long nativePtr); - - boolean ownPtr = false; + protected LinphoneFriendImpl() { nativePtr = newLinphoneFriend(null); - } + } protected LinphoneFriendImpl(String friendUri) { nativePtr = newLinphoneFriend(friendUri); } + protected LinphoneFriendImpl(long aNativePtr) { nativePtr = aNativePtr; - ownPtr=false; + } protected void finalize() throws Throwable { - if (ownPtr) delete(nativePtr); + finalize(nativePtr); } public void setAddress(LinphoneAddress anAddress) { this.setAddress(nativePtr, ((LinphoneAddressImpl)anAddress).nativePtr); From ef7677a88d7aaef4168f884eeaca85af2994ecd9 Mon Sep 17 00:00:00 2001 From: Margaux Clerc Date: Mon, 13 Apr 2015 10:40:40 +0200 Subject: [PATCH 031/157] Fix friend in JNI --- coreapi/linphonecore.c | 2 +- coreapi/linphonecore_jni.cc | 31 ++++++++++++------- .../org/linphone/core/LinphoneCoreImpl.java | 8 ++--- .../org/linphone/core/LinphoneFriendImpl.java | 7 +++-- 4 files changed, 27 insertions(+), 21 deletions(-) diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index b5bfc095f..cde6f8767 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -6333,7 +6333,7 @@ void ui_config_uninit(LinphoneCore* lc) { ms_message("Destroying friends."); if (lc->friends){ - ms_list_for_each(lc->friends,(void (*)(void *))linphone_friend_destroy); + ms_list_for_each(lc->friends,(void (*)(void *))linphone_friend_unref); ms_list_free(lc->friends); lc->friends=NULL; } diff --git a/coreapi/linphonecore_jni.cc b/coreapi/linphonecore_jni.cc index 1fa0390d6..a5a159684 100644 --- a/coreapi/linphonecore_jni.cc +++ b/coreapi/linphonecore_jni.cc @@ -250,20 +250,21 @@ jobject getChatMessage(JNIEnv *env, LinphoneChatMessage *msg){ return jobj; } -jobject getFriend(JNIEnv *env, LinphoneFriend *lfriend, jobject core){ +jobject getFriend(JNIEnv *env, LinphoneFriend *lfriend){ jobject jobj=0; - if (lfriend!=NULL){ + if (lfriend != NULL){ jclass friendClass = (jclass)env->FindClass("org/linphone/core/LinphoneFriendImpl"); jmethodID friendCtrId = env->GetMethodID(friendClass,"", "(J)V"); void *up=linphone_friend_get_user_data(lfriend); - if (up==NULL){ + if (up == NULL){ jobj=env->NewObject(friendClass,friendCtrId,(jlong)lfriend); linphone_friend_set_user_data(lfriend,(void*)env->NewWeakGlobalRef(jobj)); linphone_friend_ref(lfriend); }else{ + jobj=env->NewLocalRef((jobject)up); if (jobj == NULL){ jobj=env->NewObject(friendClass,friendCtrId,(jlong)lfriend); @@ -754,7 +755,7 @@ public: env->CallVoidMethod(lcData->listener ,lcData->notifyPresenceReceivedId ,lcData->core - ,env->NewObject(lcData->friendClass,lcData->friendCtrId,(jlong)my_friend)); + ,getFriend(env,my_friend)); if (env->ExceptionCheck()) { ms_error("Listener %p raised an exception",lcData->listener); env->ExceptionClear(); @@ -772,7 +773,7 @@ public: env->CallVoidMethod(lcData->listener ,lcData->newSubscriptionRequestId ,lcData->core - ,env->NewObject(lcData->friendClass,lcData->friendCtrId,(jlong)my_friend) + ,getFriend(env,my_friend) ,url ? env->NewStringUTF(url) : NULL); if (env->ExceptionCheck()) { ms_error("Listener %p raised an exception",lcData->listener); @@ -1845,10 +1846,11 @@ extern "C" jobjectArray Java_org_linphone_core_LinphoneCoreImpl_getFriendList(JN for (int i = 0; i < friendsSize; i++) { LinphoneFriend* lfriend = (LinphoneFriend*)friends->data; - jobject jfriend = getFriend(env,lfriend,thiz); + jobject jfriend = getFriend(env,lfriend); if(jfriend != NULL){ env->SetObjectArrayElement(jFriends, i, jfriend); } + friends = friends->next; } env->DeleteGlobalRef(cls); @@ -2881,7 +2883,7 @@ extern "C" jlong Java_org_linphone_core_LinphoneFriendImpl_newLinphoneFriend(JNI if (jFriendUri) { const char* friendUri = env->GetStringUTFChars(jFriendUri, NULL); - lResult= linphone_friend_new_with_address(friendUri); + lResult = linphone_friend_new_with_address(friendUri); linphone_friend_set_user_data(lResult,env->NewWeakGlobalRef(thiz)); env->ReleaseStringUTFChars(jFriendUri, friendUri); } else { @@ -2957,9 +2959,9 @@ extern "C" jstring Java_org_linphone_core_LinphoneFriendImpl_getRefKey(JNIEnv* extern "C" void Java_org_linphone_core_LinphoneFriendImpl_finalize(JNIEnv* env ,jobject thiz ,jlong ptr) { - LinphoneFriend *friend=(LinphoneFriend*)ptr; - linphone_friend_set_user_data(friend,NULL); - linphone_friend_unref(friend); + LinphoneFriend *lfriend=(LinphoneFriend*)ptr; + linphone_friend_set_user_data(lfriend,NULL); + linphone_friend_unref(lfriend); } /* @@ -2990,14 +2992,19 @@ extern "C" void Java_org_linphone_core_LinphoneCoreImpl_removeFriend(JNIEnv* en ,jlong lf) { linphone_core_remove_friend((LinphoneCore*)ptr, (LinphoneFriend*)lf); } -extern "C" jlong Java_org_linphone_core_LinphoneCoreImpl_getFriendByAddress(JNIEnv* env +extern "C" jobject Java_org_linphone_core_LinphoneCoreImpl_getFriendByAddress(JNIEnv* env ,jobject thiz ,jlong ptr ,jstring jaddress) { const char* address = env->GetStringUTFChars(jaddress, NULL); LinphoneFriend *lf = linphone_core_get_friend_by_address((LinphoneCore*)ptr, address); env->ReleaseStringUTFChars(jaddress, address); - return (jlong) lf; + if(lf != NULL) { + jobject jfriend = getFriend(env,lf); + return jfriend; + } else { + return NULL; + } } extern "C" jlongArray _LinphoneChatRoomImpl_getHistory(JNIEnv* env diff --git a/java/impl/org/linphone/core/LinphoneCoreImpl.java b/java/impl/org/linphone/core/LinphoneCoreImpl.java index 2268c6585..3e7fd1910 100644 --- a/java/impl/org/linphone/core/LinphoneCoreImpl.java +++ b/java/impl/org/linphone/core/LinphoneCoreImpl.java @@ -960,14 +960,10 @@ class LinphoneCoreImpl implements LinphoneCore { removeFriend(nativePtr, lf.getNativePtr()); } - private native long getFriendByAddress(long ptr, String sipUri); + private native LinphoneFriend getFriendByAddress(long ptr, String sipUri); @Override public synchronized LinphoneFriend findFriendByAddress(String sipUri) { - long ptr = getFriendByAddress(nativePtr, sipUri); - if (ptr == 0) { - return null; - } - return new LinphoneFriendImpl(ptr); + return getFriendByAddress(nativePtr, sipUri); } public synchronized void setAudioPort(int port) { diff --git a/java/impl/org/linphone/core/LinphoneFriendImpl.java b/java/impl/org/linphone/core/LinphoneFriendImpl.java index 220f5dbca..ba47eccb4 100644 --- a/java/impl/org/linphone/core/LinphoneFriendImpl.java +++ b/java/impl/org/linphone/core/LinphoneFriendImpl.java @@ -46,12 +46,15 @@ class LinphoneFriendImpl implements LinphoneFriend, Serializable { nativePtr = newLinphoneFriend(friendUri); } + /*reserved for JNI */ protected LinphoneFriendImpl(long aNativePtr) { nativePtr = aNativePtr; - } protected void finalize() throws Throwable { - finalize(nativePtr); + if (nativePtr != 0) { + finalize(nativePtr); + } + super.finalize(); } public void setAddress(LinphoneAddress anAddress) { this.setAddress(nativePtr, ((LinphoneAddressImpl)anAddress).nativePtr); From 0df1b49ec5655e723dcb0557334263517f320b16 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Tue, 14 Apr 2015 17:37:50 +0200 Subject: [PATCH 032/157] Build console UI when building with CMake. --- CMakeLists.txt | 3 +++ console/CMakeLists.txt | 53 ++++++++++++++++++++++++++++++++++++++++++ console/commands.c | 2 +- console/linphonec.c | 34 ++++++++++++++++++--------- coreapi/linphonecore.h | 12 +++++----- 5 files changed, 86 insertions(+), 18 deletions(-) create mode 100644 console/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index 46629c8ad..3d5c892db 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -216,6 +216,9 @@ endif() add_subdirectory(coreapi) add_subdirectory(share) +if(ENABLE_CONSOLE_UI) + add_subdirectory(console) +endif() if(ENABLE_GTK_UI) add_subdirectory(gtk) add_subdirectory(pixmaps) diff --git a/console/CMakeLists.txt b/console/CMakeLists.txt new file mode 100644 index 000000000..328fdbcf2 --- /dev/null +++ b/console/CMakeLists.txt @@ -0,0 +1,53 @@ +############################################################################ +# CMakeLists.txt +# Copyright (C) 2014 Belledonne Communications, Grenoble France +# +############################################################################ +# +# 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. +# +############################################################################ + +set(LINPHONEC_SOURCE_FILES + linphonec.c + linphonec.h + commands.c +) +set(LINPHONECSH_SOURCE_FILES + shell.c +) + +add_executable(linphonec ${LINPHONEC_SOURCE_FILES}) +target_link_libraries(linphonec linphone) + +if(WIN32) + add_executable(linphoned WIN32 ${LINPHONEC_SOURCE_FILES}) + target_link_libraries(linphoned linphone) +endif() + +add_executable(linphonecsh ${LINPHONECSH_SOURCE_FILES}) +target_link_libraries(linphonecsh linphone) + +set(INSTALL_TARGETS linphonec linphonecsh) +if(WIN32) + list(APPEND INSTALL_TARGETS linphoned) +endif() + +install(TARGETS ${INSTALL_TARGETS} + RUNTIME DESTINATION bin + LIBRARY DESTINATION lib + ARCHIVE DESTINATION lib + PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE +) diff --git a/console/commands.c b/console/commands.c index cd968f555..8f1ef2293 100644 --- a/console/commands.c +++ b/console/commands.c @@ -28,7 +28,6 @@ #include #ifndef _WIN32_WCE #include -#include #endif /*_WIN32_WCE*/ #include #include @@ -38,6 +37,7 @@ #ifndef WIN32 #include +#include #endif #define AUDIO 0 diff --git a/console/linphonec.c b/console/linphonec.c index 9fa4f4a9a..fb3c9d1ba 100644 --- a/console/linphonec.c +++ b/console/linphonec.c @@ -25,9 +25,7 @@ ****************************************************************************/ #include #ifndef _WIN32_WCE -#include #include -#include #include #include #include "private.h" /*coreapi/private.h, needed for LINPHONE_VERSION */ @@ -48,17 +46,19 @@ #endif /*_WIN32_WCE*/ #else #include +#include #include #include #include +#include #endif -#if defined(_WIN32_WCE) - #if !defined(PATH_MAX) #define PATH_MAX 256 #endif /*PATH_MAX*/ +#if defined(_WIN32_WCE) + #if !defined(strdup) #define strdup _strdup #endif /*strdup*/ @@ -661,6 +661,12 @@ main (int argc, char *argv[]) { exit(EXIT_SUCCESS); /* should never reach here */ } +#ifdef _MSC_VER +int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { + return main(__argc, __argv); +} +#endif + /* * Initialize linphonec */ @@ -1214,15 +1220,21 @@ linphonec_parse_cmdline(int argc, char **argv) else if (strncmp ("-c", argv[arg_num], 2) == 0) { if ( ++arg_num >= argc ) print_usage(EXIT_FAILURE); +#ifdef _MSC_VER + if (strcmp(argv[arg_num], "NUL") != 0) { +#endif #if !defined(_WIN32_WCE) - if (access(argv[arg_num],F_OK)!=0 ) - { - fprintf (stderr, - "Cannot open config file %s.\n", - argv[arg_num]); - exit(EXIT_FAILURE); - } + if (access(argv[arg_num], F_OK) != 0) + { + fprintf(stderr, + "Cannot open config file %s.\n", + argv[arg_num]); + exit(EXIT_FAILURE); + } #endif /*_WIN32_WCE*/ +#ifdef _MSC_VER + } +#endif snprintf(configfile_name, PATH_MAX, "%s", argv[arg_num]); } else if (strncmp ("-b", argv[arg_num], 2) == 0) diff --git a/coreapi/linphonecore.h b/coreapi/linphonecore.h index 761bdcd63..662637bba 100644 --- a/coreapi/linphonecore.h +++ b/coreapi/linphonecore.h @@ -183,7 +183,7 @@ typedef enum _LinphoneReason LinphoneReason; * Converts a LinphoneReason enum to a string. * @ingroup misc **/ -const char *linphone_reason_to_string(LinphoneReason err); +LINPHONE_PUBLIC const char *linphone_reason_to_string(LinphoneReason err); /** * Object representing full details about a signaling error or status. @@ -1623,7 +1623,7 @@ typedef enum _LinphoneGlobalState{ LinphoneGlobalConfiguring }LinphoneGlobalState; -const char *linphone_global_state_to_string(LinphoneGlobalState gs); +LINPHONE_PUBLIC const char *linphone_global_state_to_string(LinphoneGlobalState gs); /** * LinphoneCoreLogCollectionUploadState is used to notify if log collection upload have been succesfully delivered or not. @@ -2770,10 +2770,10 @@ LINPHONE_PUBLIC void linphone_core_enable_mic(LinphoneCore *lc, bool_t enable); **/ LINPHONE_PUBLIC bool_t linphone_core_mic_enabled(LinphoneCore *lc); -bool_t linphone_core_is_rtp_muted(LinphoneCore *lc); +LINPHONE_PUBLIC bool_t linphone_core_is_rtp_muted(LinphoneCore *lc); -bool_t linphone_core_get_rtp_no_xmit_on_audio_mute(const LinphoneCore *lc); -void linphone_core_set_rtp_no_xmit_on_audio_mute(LinphoneCore *lc, bool_t val); +LINPHONE_PUBLIC bool_t linphone_core_get_rtp_no_xmit_on_audio_mute(const LinphoneCore *lc); +LINPHONE_PUBLIC void linphone_core_set_rtp_no_xmit_on_audio_mute(LinphoneCore *lc, bool_t val); /******************************************************************************* @@ -3129,7 +3129,7 @@ LINPHONE_PUBLIC int linphone_core_get_calls_nb(const LinphoneCore *lc); LINPHONE_PUBLIC const MSList *linphone_core_get_calls(LinphoneCore *lc); -LinphoneGlobalState linphone_core_get_global_state(const LinphoneCore *lc); +LINPHONE_PUBLIC LinphoneGlobalState linphone_core_get_global_state(const LinphoneCore *lc); /** * force registration refresh to be initiated upon next iterate * @ingroup proxies From cc5244f222c3becf811edec5bf2a25acd2a12041 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Tue, 14 Apr 2015 17:46:25 +0200 Subject: [PATCH 033/157] add new test for ICE. add possibility to change bitrate --- gtk/propertybox.c | 19 +++++++++++++++++++ tester/call_tester.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+) diff --git a/gtk/propertybox.c b/gtk/propertybox.c index 102aeafc1..6f4816ece 100644 --- a/gtk/propertybox.c +++ b/gtk/propertybox.c @@ -532,6 +532,23 @@ static void fmtp_edited(GtkCellRendererText *renderer, gchar *path, gchar *new_t } } +static void bitrate_edited(GtkCellRendererText *renderer, gchar *path, gchar *new_text, gpointer userdata){ + GtkListStore *store=(GtkListStore*)userdata; + GtkTreeIter iter; + float newbitrate=0; + + if (!new_text) return; + + if (sscanf(new_text, "%f", &newbitrate)!=1) return; + + if (gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(store),&iter,path)){ + PayloadType *pt; + gtk_list_store_set(store,&iter,CODEC_BITRATE,newbitrate,-1); + gtk_tree_model_get(GTK_TREE_MODEL(store),&iter,CODEC_PRIVDATA,&pt,-1); + linphone_core_set_payload_type_bitrate(linphone_gtk_get_core(), pt, (int)newbitrate); + } +} + static void linphone_gtk_init_codec_list(GtkTreeView *listview){ GtkCellRenderer *renderer; GtkTreeViewColumn *column; @@ -571,7 +588,9 @@ static void linphone_gtk_init_codec_list(GtkTreeView *listview){ renderer, "text", CODEC_BITRATE, "foreground",CODEC_COLOR, + "editable",TRUE, NULL); + g_signal_connect(G_OBJECT(renderer),"edited",G_CALLBACK(bitrate_edited),store); gtk_tree_view_append_column (listview, column); renderer = gtk_cell_renderer_text_new (); column = gtk_tree_view_column_new_with_attributes (_("Parameters"), diff --git a/tester/call_tester.c b/tester/call_tester.c index e7bfde1b8..b243975af 100644 --- a/tester/call_tester.c +++ b/tester/call_tester.c @@ -1904,6 +1904,49 @@ end: linphone_core_manager_destroy(pauline); } +static void call_with_ice_video_added2(void) { + LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); + LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc"); + LinphoneVideoPolicy vpol={TRUE,TRUE}; + bool_t call_ok; + + 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, TRUE); + + linphone_core_set_video_policy(pauline->lc,&vpol); + vpol.automatically_accept=FALSE; + vpol.automatically_initiate=FALSE; + linphone_core_set_video_policy(marie->lc,&vpol); + + linphone_core_set_firewall_policy(marie->lc,LinphonePolicyUseIce); + linphone_core_set_firewall_policy(pauline->lc,LinphonePolicyUseIce); + + if (1){ + linphone_core_set_audio_port(marie->lc,-1); + linphone_core_set_video_port(marie->lc,-1); + linphone_core_set_audio_port(pauline->lc,-1); + linphone_core_set_video_port(pauline->lc,-1); + } + + CU_ASSERT_TRUE(call_ok=call(pauline,marie)); + if (!call_ok) goto end; + CU_ASSERT_TRUE(check_ice(pauline,marie,LinphoneIceStateHostConnection)); + CU_ASSERT_FALSE(linphone_call_params_video_enabled(linphone_call_get_current_params(linphone_core_get_current_call(pauline->lc)))); + /*wait for ICE reINVITEs to complete*/ + CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallStreamsRunning,2) + && + wait_for(pauline->lc,pauline->lc,&marie->stat.number_of_LinphoneCallStreamsRunning,2)); + CU_ASSERT_TRUE(add_video(pauline,marie)); + CU_ASSERT_TRUE(check_ice(pauline,marie,LinphoneIceStateHostConnection)); +end: + linphone_core_manager_destroy(marie); + linphone_core_manager_destroy(pauline); +} + + static void video_call_with_early_media_no_matching_audio_codecs(void) { LinphoneCoreManager *marie = linphone_core_manager_new("marie_rc"); LinphoneCoreManager *pauline = linphone_core_manager_new("pauline_rc"); @@ -3982,6 +4025,7 @@ test_t call_tests[] = { { "Call with multiple early media", multiple_early_media }, { "Call with ICE from video to non-video", call_with_ice_video_to_novideo}, { "Call with ICE and video added", call_with_ice_video_added }, + { "Call with ICE and video added 2", call_with_ice_video_added2 }, { "Video call with ICE accepted using call params",video_call_ice_params}, { "Video call recording", video_call_recording_test }, { "Snapshot", video_call_snapshot }, From dbd6745277215095507fc724dc5979dd8335dd4d Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Wed, 15 Apr 2015 09:35:21 +0200 Subject: [PATCH 034/157] .gitignore: ignore lp-autoanswer executable --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 94eb798c5..cb5a36dea 100644 --- a/.gitignore +++ b/.gitignore @@ -83,3 +83,4 @@ po/linphone.pot .tx/linphone-gtk.audio-assistantdesktopin/ tester/linphone_log.gz.txt tools/auto_answer +tools/lp-autoanswer From 736f018d2e07b3666a6da4699ab400c59e105833 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Wed, 15 Apr 2015 14:22:22 +0200 Subject: [PATCH 035/157] Add linphone icon in the pixmaps when building with CMake. --- pixmaps/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/pixmaps/CMakeLists.txt b/pixmaps/CMakeLists.txt index aaf7d011f..301a6a442 100644 --- a/pixmaps/CMakeLists.txt +++ b/pixmaps/CMakeLists.txt @@ -42,6 +42,7 @@ set(PIXMAPS hold_on.png linphone-banner.png linphone.icns + linphone.png mic_active.png mic_muted.png notok.png From 2dc157e76f5b7eb8dbc2bf92d46e7b5b178d4d3d Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Wed, 15 Apr 2015 16:04:13 +0200 Subject: [PATCH 036/157] Add option to enable/disable documentation generation when building with CMake. --- CMakeLists.txt | 1 + coreapi/CMakeLists.txt | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3d5c892db..a3c505c56 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -38,6 +38,7 @@ include(CMakeDependentOption) option(ENABLE_STATIC "Build static library (default is shared library)." NO) option(ENABLE_CONSOLE_UI "Turn on or off compilation of console interface." YES) option(ENABLE_DATE "Use build date in internal version number." NO) +option(ENABLE_DOC "Enable documentation generation with Doxygen." YES) option(ENABLE_GTK_UI "Turn on or off compilation of gtk interface." YES) option(ENABLE_LDAP "Enable LDAP support." NO) option(ENABLE_MSG_STORAGE "Turn on compilation of message storage." YES) diff --git a/coreapi/CMakeLists.txt b/coreapi/CMakeLists.txt index f2fe192bc..b8b6b27cb 100644 --- a/coreapi/CMakeLists.txt +++ b/coreapi/CMakeLists.txt @@ -205,4 +205,6 @@ install(FILES ${HEADER_FILES} PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ ) -add_subdirectory(help) +if(ENABLE_DOC) + add_subdirectory(help) +endif() From 2f5f8ca14abc5cae79a5a4d62162a7eaa55af940 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Fri, 17 Apr 2015 00:30:47 +0200 Subject: [PATCH 037/157] revisit current_params's filling for media-encryption, in order to solve bug leading to change media encryption to unencrypted during a call, without application consent. --- coreapi/linphonecall.c | 46 +++++++++++++++-------------------------- mediastreamer2 | 2 +- tester/call_tester.c | 47 +++++++++++++++++++++++++++++++++++++++++- 3 files changed, 64 insertions(+), 31 deletions(-) diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c index 8a1888341..2f21922e9 100644 --- a/coreapi/linphonecall.c +++ b/coreapi/linphonecall.c @@ -1195,21 +1195,8 @@ static void linphone_call_set_terminated(LinphoneCall *call){ void linphone_call_fix_call_parameters(LinphoneCall *call){ if (sal_call_is_offerer(call->op)) { /*get remote params*/ - const LinphoneCallParams* lcp = linphone_call_get_remote_params(call); - call->current_params->video_declined = call->params->has_video && !lcp->has_video; - } - switch(call->params->media_encryption) { - case LinphoneMediaEncryptionZRTP: - case LinphoneMediaEncryptionDTLS: - case LinphoneMediaEncryptionNone: - /* do nothing */ - break; - case LinphoneMediaEncryptionSRTP: - call->params->media_encryption=call->current_params->media_encryption; - break; - default: - ms_fatal("Unknown media encryption type on call [%p]", call); - break; + const LinphoneCallParams* rcp = linphone_call_get_remote_params(call); + call->current_params->video_declined = call->params->has_video && !rcp->has_video; } } @@ -1447,20 +1434,24 @@ const LinphoneCallParams * linphone_call_get_current_params(LinphoneCall *call){ } #endif - if (linphone_call_all_streams_encrypted(call)) { - if (linphone_call_get_authentication_token(call)) { - call->current_params->media_encryption=LinphoneMediaEncryptionZRTP; - } else { - /* TODO : check this or presence of dtls_fingerprint in the call? */ - if (call->params->media_encryption == LinphoneMediaEncryptionDTLS) { - call->current_params->media_encryption=LinphoneMediaEncryptionDTLS; - } else { - call->current_params->media_encryption=LinphoneMediaEncryptionSRTP; + /* REVISITED + * Previous code was buggy. + * Relying on the mediastream's state to know the current encryption is unreliable. + * For ZRTP it is though necessary. + * But for all others the current_params->media_encryption state should reflect what is agreed by the offer/answer + * mechanism. + * Typically there can be inactive streams for which the media layer has no idea of whether they are encrypted or not. + */ + if (call->params->media_encryption == LinphoneMediaEncryptionZRTP){ + if (linphone_call_all_streams_encrypted(call)) { + if (linphone_call_get_authentication_token(call)) { + call->current_params->media_encryption=LinphoneMediaEncryptionZRTP; } } - } else { - call->current_params->media_encryption=LinphoneMediaEncryptionNone; + }else{ + call->current_params->media_encryption = call->params->media_encryption; } + call->current_params->avpf_enabled = linphone_call_all_streams_avpf_enabled(call); if (call->current_params->avpf_enabled == TRUE) { call->current_params->avpf_rr_interval = linphone_call_get_avpf_rr_interval(call); @@ -2806,9 +2797,6 @@ void linphone_call_start_media_streams(LinphoneCall *call, bool_t all_inputs_mut video_stream_enable_zrtp(call->videostream,call->audiostream,¶ms); } #endif - }else if (call->params->media_encryption==LinphoneMediaEncryptionSRTP){ - call->current_params->media_encryption=linphone_call_all_streams_encrypted(call) ? - LinphoneMediaEncryptionSRTP : LinphoneMediaEncryptionNone; } set_dtls_fingerprint_on_all_streams(call); diff --git a/mediastreamer2 b/mediastreamer2 index 467d48150..4ebcd5b4d 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 467d48150b34b1ead2f5c97ae2f459e04efde1ca +Subproject commit 4ebcd5b4d26feaba9826c88381e9ae9f5df9bab3 diff --git a/tester/call_tester.c b/tester/call_tester.c index b243975af..253f83bdf 100644 --- a/tester/call_tester.c +++ b/tester/call_tester.c @@ -2233,7 +2233,6 @@ static void call_with_declined_srtp(void) { CU_ASSERT_TRUE(call(pauline,marie)); - /*just to sleep*/ linphone_core_terminate_all_calls(marie->lc); CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallEnd,1)); CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallEnd,1)); @@ -2244,6 +2243,51 @@ static void call_with_declined_srtp(void) { linphone_core_manager_destroy(pauline); } +static void call_srtp_paused_and_resumed(void) { + /* + * This test was made to evidence a bug due to internal usage of current_params while not yet filled by linphone_call_get_current_params(). + * As a result it must not use the call() function because it calls linphone_call_get_current_params(). + */ + LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); + LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc"); + const LinphoneCallParams *params; + LinphoneCall *pauline_call; + + if (!linphone_core_media_encryption_supported(marie->lc,LinphoneMediaEncryptionSRTP)) goto end; + linphone_core_set_media_encryption(pauline->lc,LinphoneMediaEncryptionSRTP); + + linphone_core_invite_address(pauline->lc, marie->identity); + + if (!BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallIncomingReceived,1))) goto end; + pauline_call = linphone_core_get_current_call(pauline->lc); + linphone_core_accept_call(marie->lc, linphone_core_get_current_call(marie->lc)); + + if (!BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallStreamsRunning,1))) goto end; + if (!BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallStreamsRunning,1))) goto end; + + linphone_core_pause_call(pauline->lc, pauline_call); + + CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallPaused,1)); + CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallPausedByRemote,1)); + + linphone_core_resume_call(pauline->lc, pauline_call); + if (!BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallStreamsRunning,2))) goto end; + if (!BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallStreamsRunning,2))) goto end; + + /*assert that after pause and resume, SRTP is still being used*/ + params = linphone_call_get_current_params(linphone_core_get_current_call(pauline->lc)); + CU_ASSERT_TRUE(linphone_call_params_get_media_encryption(params) == LinphoneMediaEncryptionSRTP); + params = linphone_call_get_current_params(linphone_core_get_current_call(marie->lc)); + CU_ASSERT_TRUE(linphone_call_params_get_media_encryption(params) == LinphoneMediaEncryptionSRTP); + + linphone_core_terminate_all_calls(marie->lc); + CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallEnd,1)); + CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallEnd,1)); +end: + linphone_core_manager_destroy(marie); + linphone_core_manager_destroy(pauline); +} + static void on_eof(LinphonePlayer *player, void *user_data){ LinphoneCoreManager *marie=(LinphoneCoreManager*)user_data; marie->stat.number_of_player_eof++; @@ -4002,6 +4046,7 @@ test_t call_tests[] = { { "DTLS SRTP call with media relay", dtls_srtp_call_with_media_realy}, { "ZRTP video call",zrtp_video_call}, { "SRTP call with declined srtp", call_with_declined_srtp }, + { "SRTP call paused and resumed", call_srtp_paused_and_resumed }, { "Call with file player", call_with_file_player}, { "Call with mkv file player", call_with_mkv_file_player}, { "Audio call with ICE no matching audio codecs", audio_call_with_ice_no_matching_audio_codecs }, From 6487c063124a8399d384df6c72af70773c26024f Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Fri, 17 Apr 2015 11:05:27 +0200 Subject: [PATCH 038/157] adapt call params to what is received when incoming call arrives --- coreapi/linphonecall.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c index 2f21922e9..cbd70a9e1 100644 --- a/coreapi/linphonecall.c +++ b/coreapi/linphonecall.c @@ -1006,9 +1006,10 @@ void linphone_call_set_compatible_incoming_call_parameters(LinphoneCall *call, c } if ((sal_media_description_has_dtls(md) == TRUE) && (media_stream_dtls_supported() == TRUE)) { call->params->media_encryption = LinphoneMediaEncryptionDTLS; - } - if ((sal_media_description_has_srtp(md) == TRUE) && (ms_srtp_supported() == TRUE)) { + }else if ((sal_media_description_has_srtp(md) == TRUE) && (ms_srtp_supported() == TRUE)) { call->params->media_encryption = LinphoneMediaEncryptionSRTP; + }else if (call->params->media_encryption != LinphoneMediaEncryptionZRTP){ + call->params->media_encryption = LinphoneMediaEncryptionNone; } /* set both local audio & video multicast ip address if any*/ From d41ab6047bb951d4e71ffb12e439eb612710a04f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Grisez?= Date: Fri, 17 Apr 2015 15:07:03 +0200 Subject: [PATCH 039/157] Add the AVC/H.264 Patent Portfolio License Conditions to COPYING --- COPYING | 104 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) diff --git a/COPYING b/COPYING index b18ab0474..365b8c279 100644 --- a/COPYING +++ b/COPYING @@ -338,3 +338,107 @@ proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. + + +------------------------------------------------------------------------------- + + +------------------------------------------------------- +About The Cisco-Provided Binary of OpenH264 Video Codec +------------------------------------------------------- + +Cisco provides this program under the terms of the BSD license. + +Additionally, this binary is licensed under Cisco’s AVC/H.264 Patent Portfolio +License from MPEG LA, at no cost to you, provided that the requirements and +conditions shown below in the AVC/H.264 Patent Portfolio sections are met. + +As with all AVC/H.264 codecs, you may also obtain your own patent license from +MPEG LA or from the individual patent owners, or proceed at your own risk. +Your rights from Cisco under the BSD license are not affected by this choice. + +For more information on the OpenH264 binary licensing, please see the OpenH264 +FAQ found at http://www.openh264.org/faq.html#binary + +A corresponding source code to this binary program is available under the same +BSD terms, which can be found at http://www.openh264.org + +----------- +BSD License +----------- + +Copyright © 2014 Cisco Systems, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation +and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +----------------------------------------- +AVC/H.264 Patent Portfolio License Notice +----------------------------------------- + +The binary form of this Software is distributed by Cisco under the AVC/H.264 +Patent Portfolio License from MPEG LA, and is subject to the following +requirements, which may or may not be applicable to your use of this software: + +THIS PRODUCT IS LICENSED UNDER THE AVC PATENT PORTFOLIO LICENSE FOR THE +PERSONAL USE OF A CONSUMER OR OTHER USES IN WHICH IT DOES NOT RECEIVE +REMUNERATION TO (i) ENCODE VIDEO IN COMPLIANCE WITH THE AVC STANDARD +(“AVC VIDEO”) AND/OR (ii) DECODE AVC VIDEO THAT WAS ENCODED BY A CONSUMER +ENGAGED IN A PERSONAL ACTIVITY AND/OR WAS OBTAINED FROM A VIDEO PROVIDER +LICENSED TO PROVIDE AVC VIDEO. NO LICENSE IS GRANTED OR SHALL BE IMPLIED FOR +ANY OTHER USE. ADDITIONAL INFORMATION MAY BE OBTAINED FROM MPEG LA, L.L.C. SEE +HTTP://WWW.MPEGLA.COM + +Accordingly, please be advised that content providers and broadcasters using +AVC/H.264 in their service may be required to obtain a separate use license +from MPEG LA, referred to as "(b) sublicenses" in the SUMMARY OF AVC/H.264 +LICENSE TERMS from MPEG LA found at http://www.openh264.org/mpegla + +--------------------------------------------- +AVC/H.264 Patent Portfolio License Conditions +--------------------------------------------- + +In addition, the Cisco-provided binary of this Software is licensed under +Cisco's license from MPEG LA only if the following conditions are met: + +1. The Cisco-provided binary is separately downloaded to an end user’s device, +and not integrated into or combined with third party software prior to being +downloaded to the end user’s device; + +2. The end user must have the ability to control (e.g., to enable, disable, or +re-enable) the use of the Cisco-provided binary; + +3. Third party software, in the location where end users can control the use of +the Cisco-provided binary, must display the following text: + + "OpenH264 Video Codec provided by Cisco Systems, Inc." + +4. Any third-party software that makes use of the Cisco-provided binary must +reproduce all of the above text, as well as this last condition, in the EULA +and/or in another location where licensing information is to be presented to +the end user. + + + + v1.0 + From da924cdecea09a8a3e308b32c81e641aa5402d23 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Fri, 17 Apr 2015 15:27:03 +0200 Subject: [PATCH 040/157] Updated ms2 to update android version codes --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index 4ebcd5b4d..c0893480a 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 4ebcd5b4d26feaba9826c88381e9ae9f5df9bab3 +Subproject commit c0893480a148ac1724329ba0a5aca0165c65fc8e From f53864f9c0a485e4352c8dba0d0c940aa454311d Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Fri, 17 Apr 2015 16:06:49 +0200 Subject: [PATCH 041/157] Fix 0002202: ICE fails again. --- coreapi/linphonecore.c | 1 + coreapi/misc.c | 17 +++++- coreapi/private.h | 1 + tester/call_tester.c | 116 +++++++++++++++++++---------------------- 4 files changed, 72 insertions(+), 63 deletions(-) diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index cde6f8767..93df26f22 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -3795,6 +3795,7 @@ int linphone_core_accept_call_with_params(LinphoneCore *lc, LinphoneCall *call, } linphone_call_update_remote_session_id_and_ver(call); + linphone_call_stop_ice_for_inactive_streams(call->localdesc, call->ice_session); sal_call_accept(call->op); linphone_core_notify_display_status(lc,_("Connected.")); lc->current_call=call; diff --git a/coreapi/misc.c b/coreapi/misc.c index 9d3d76989..080175a6c 100644 --- a/coreapi/misc.c +++ b/coreapi/misc.c @@ -716,8 +716,21 @@ void linphone_core_update_ice_state_in_call_stats(LinphoneCall *call) linphone_ice_state_to_string(call->stats[LINPHONE_CALL_STATS_AUDIO].ice_state), linphone_ice_state_to_string(call->stats[LINPHONE_CALL_STATS_VIDEO].ice_state)); } -void _update_local_media_description_from_ice(SalMediaDescription *desc, IceSession *session) -{ +void linphone_call_stop_ice_for_inactive_streams(SalMediaDescription *desc, IceSession *session) { + int i; + + if (session == NULL) return; + if (ice_session_state(session) == IS_Completed) return; + + for (i = 0; i < SAL_MEDIA_DESCRIPTION_MAX_STREAMS; i++) { + IceCheckList *cl = ice_session_check_list(session, i); + if (!sal_stream_description_active(&desc->streams[i]) && cl) { + ice_session_remove_check_list(session, cl); + } + } +} + +void _update_local_media_description_from_ice(SalMediaDescription *desc, IceSession *session) { const char *rtp_addr, *rtcp_addr; IceSessionState session_state = ice_session_state(session); int nb_candidates; diff --git a/coreapi/private.h b/coreapi/private.h index 7daed803e..a1751da5f 100644 --- a/coreapi/private.h +++ b/coreapi/private.h @@ -396,6 +396,7 @@ void linphone_core_adapt_to_network(LinphoneCore *lc, int ping_time_ms, Linphone int linphone_core_gather_ice_candidates(LinphoneCore *lc, LinphoneCall *call); void linphone_core_update_ice_state_in_call_stats(LinphoneCall *call); void linphone_call_stats_fill(LinphoneCallStats *stats, MediaStream *ms, OrtpEvent *ev); +void linphone_call_stop_ice_for_inactive_streams(SalMediaDescription *desc, IceSession *session); void _update_local_media_description_from_ice(SalMediaDescription *desc, IceSession *session); void linphone_call_update_local_media_description_from_ice_or_upnp(LinphoneCall *call); void linphone_call_update_ice_from_remote_media_description(LinphoneCall *call, const SalMediaDescription *md); diff --git a/tester/call_tester.c b/tester/call_tester.c index 253f83bdf..1b0b0ede2 100644 --- a/tester/call_tester.c +++ b/tester/call_tester.c @@ -1870,80 +1870,73 @@ static void call_with_ice_video_to_novideo(void) { linphone_core_manager_destroy(pauline); } -static void call_with_ice_video_added(void) { - LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); - LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc"); - LinphoneVideoPolicy vpol={0}; +static void _call_with_ice_video(LinphoneVideoPolicy caller_policy, LinphoneVideoPolicy callee_policy, + bool_t video_added_by_caller, bool_t video_added_by_callee, bool_t video_removed_by_caller, bool_t video_removed_by_callee) { + LinphoneCoreManager *marie = linphone_core_manager_new("marie_rc"); + LinphoneCoreManager *pauline = linphone_core_manager_new("pauline_rc"); bool_t call_ok; - linphone_core_set_video_policy(pauline->lc,&vpol); - linphone_core_set_video_policy(marie->lc,&vpol); + linphone_core_set_video_policy(pauline->lc, &caller_policy); + linphone_core_set_video_policy(marie->lc, &callee_policy); + linphone_core_set_firewall_policy(marie->lc, LinphonePolicyUseIce); + linphone_core_set_firewall_policy(pauline->lc, LinphonePolicyUseIce); - linphone_core_set_firewall_policy(marie->lc,LinphonePolicyUseIce); + linphone_core_set_audio_port(marie->lc, -1); + linphone_core_set_video_port(marie->lc, -1); + linphone_core_set_audio_port(pauline->lc, -1); + linphone_core_set_video_port(pauline->lc, -1); - linphone_core_set_firewall_policy(pauline->lc,LinphonePolicyUseIce); + CU_ASSERT_TRUE(call_ok = call(pauline, marie)); + if (!call_ok) goto end; + CU_ASSERT_TRUE(check_ice(pauline, marie, LinphoneIceStateHostConnection)); + CU_ASSERT_EQUAL(linphone_call_params_video_enabled(linphone_call_get_current_params(linphone_core_get_current_call(pauline->lc))), callee_policy.automatically_accept); - if (1){ - linphone_core_set_audio_port(marie->lc,-1); - linphone_core_set_video_port(marie->lc,-1); - linphone_core_set_audio_port(pauline->lc,-1); - linphone_core_set_video_port(pauline->lc,-1); + /* Wait for ICE reINVITEs to complete. */ + CU_ASSERT_TRUE(wait_for(pauline->lc, marie->lc, &pauline->stat.number_of_LinphoneCallStreamsRunning, 2) + && wait_for(pauline->lc, pauline->lc, &marie->stat.number_of_LinphoneCallStreamsRunning, 2)); + + if (video_added_by_caller) { + CU_ASSERT_TRUE(add_video(pauline, marie)); + } else if (video_added_by_callee) { + CU_ASSERT_TRUE(add_video(marie, pauline)); + } + if (video_added_by_caller || video_added_by_callee) { + CU_ASSERT_TRUE(check_ice(pauline, marie, LinphoneIceStateHostConnection)); + CU_ASSERT_TRUE(linphone_call_params_video_enabled(linphone_call_get_current_params(linphone_core_get_current_call(pauline->lc)))); + CU_ASSERT_TRUE(linphone_call_params_video_enabled(linphone_call_get_current_params(linphone_core_get_current_call(marie->lc)))); + } + + if (video_removed_by_caller) { + CU_ASSERT_TRUE(remove_video(pauline, marie)); + } else if (video_removed_by_callee) { + CU_ASSERT_TRUE(remove_video(marie, pauline)); + } + if (video_removed_by_caller || video_removed_by_callee) { + CU_ASSERT_TRUE(check_ice(pauline, marie, LinphoneIceStateHostConnection)); + CU_ASSERT_FALSE(linphone_call_params_video_enabled(linphone_call_get_current_params(linphone_core_get_current_call(pauline->lc)))); + CU_ASSERT_FALSE(linphone_call_params_video_enabled(linphone_call_get_current_params(linphone_core_get_current_call(marie->lc)))); } - CU_ASSERT_TRUE(call_ok=call(pauline,marie)); - if (!call_ok) goto end; - CU_ASSERT_TRUE(check_ice(pauline,marie,LinphoneIceStateHostConnection)); - /*wait for ICE reINVITEs to complete*/ - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallStreamsRunning,2) - && - wait_for(pauline->lc,pauline->lc,&marie->stat.number_of_LinphoneCallStreamsRunning,2)); - CU_ASSERT_TRUE(add_video(pauline,marie)); - CU_ASSERT_TRUE(check_ice(pauline,marie,LinphoneIceStateHostConnection)); end: linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); } -static void call_with_ice_video_added2(void) { - LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); - LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc"); - LinphoneVideoPolicy vpol={TRUE,TRUE}; - bool_t call_ok; - - 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, TRUE); - - linphone_core_set_video_policy(pauline->lc,&vpol); - vpol.automatically_accept=FALSE; - vpol.automatically_initiate=FALSE; - linphone_core_set_video_policy(marie->lc,&vpol); +static void call_with_ice_video_added(void) { + LinphoneVideoPolicy vpol = { FALSE, FALSE }; + _call_with_ice_video(vpol, vpol, TRUE, FALSE, TRUE, FALSE); +} - linphone_core_set_firewall_policy(marie->lc,LinphonePolicyUseIce); - linphone_core_set_firewall_policy(pauline->lc,LinphonePolicyUseIce); +static void call_with_ice_video_added_2(void) { + LinphoneVideoPolicy caller_policy = { TRUE, TRUE }; + LinphoneVideoPolicy callee_policy = { FALSE, FALSE }; + _call_with_ice_video(caller_policy, callee_policy, TRUE, FALSE, FALSE, TRUE); +} - if (1){ - linphone_core_set_audio_port(marie->lc,-1); - linphone_core_set_video_port(marie->lc,-1); - linphone_core_set_audio_port(pauline->lc,-1); - linphone_core_set_video_port(pauline->lc,-1); - } - - CU_ASSERT_TRUE(call_ok=call(pauline,marie)); - if (!call_ok) goto end; - CU_ASSERT_TRUE(check_ice(pauline,marie,LinphoneIceStateHostConnection)); - CU_ASSERT_FALSE(linphone_call_params_video_enabled(linphone_call_get_current_params(linphone_core_get_current_call(pauline->lc)))); - /*wait for ICE reINVITEs to complete*/ - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallStreamsRunning,2) - && - wait_for(pauline->lc,pauline->lc,&marie->stat.number_of_LinphoneCallStreamsRunning,2)); - CU_ASSERT_TRUE(add_video(pauline,marie)); - CU_ASSERT_TRUE(check_ice(pauline,marie,LinphoneIceStateHostConnection)); -end: - linphone_core_manager_destroy(marie); - linphone_core_manager_destroy(pauline); +static void call_with_ice_video_added_3(void) { + LinphoneVideoPolicy caller_policy = { TRUE, TRUE }; + LinphoneVideoPolicy callee_policy = { FALSE, FALSE }; + _call_with_ice_video(caller_policy, callee_policy, FALSE, TRUE, TRUE, FALSE); } @@ -4070,7 +4063,8 @@ test_t call_tests[] = { { "Call with multiple early media", multiple_early_media }, { "Call with ICE from video to non-video", call_with_ice_video_to_novideo}, { "Call with ICE and video added", call_with_ice_video_added }, - { "Call with ICE and video added 2", call_with_ice_video_added2 }, + { "Call with ICE and video added 2", call_with_ice_video_added_2 }, + { "Call with ICE and video added 3", call_with_ice_video_added_3 }, { "Video call with ICE accepted using call params",video_call_ice_params}, { "Video call recording", video_call_recording_test }, { "Snapshot", video_call_snapshot }, From 5913eff7a5ff4516c745669b6bedb87f367a84fa Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Fri, 17 Apr 2015 18:37:28 +0200 Subject: [PATCH 042/157] fix crash with ICE scenario --- coreapi/linphonecore.c | 2 +- coreapi/misc.c | 8 ++++++-- coreapi/private.h | 2 +- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index 93df26f22..ed8cae539 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -3795,7 +3795,7 @@ int linphone_core_accept_call_with_params(LinphoneCore *lc, LinphoneCall *call, } linphone_call_update_remote_session_id_and_ver(call); - linphone_call_stop_ice_for_inactive_streams(call->localdesc, call->ice_session); + linphone_call_stop_ice_for_inactive_streams(call); sal_call_accept(call->op); linphone_core_notify_display_status(lc,_("Connected.")); lc->current_call=call; diff --git a/coreapi/misc.c b/coreapi/misc.c index 080175a6c..5f34b21ff 100644 --- a/coreapi/misc.c +++ b/coreapi/misc.c @@ -59,6 +59,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #define RTP_HDR_SZ 12 #define IP4_HDR_SZ 20 /*20 is the minimum, but there may be some options*/ +static void clear_ice_check_list(LinphoneCall *call, IceCheckList *removed); bool_t linphone_core_payload_type_enabled(LinphoneCore *lc, const LinphonePayloadType *pt){ if (ms_list_find(lc->codecs_conf.audio_codecs, (PayloadType*) pt) || ms_list_find(lc->codecs_conf.video_codecs, (PayloadType*)pt)){ @@ -716,9 +717,11 @@ void linphone_core_update_ice_state_in_call_stats(LinphoneCall *call) linphone_ice_state_to_string(call->stats[LINPHONE_CALL_STATS_AUDIO].ice_state), linphone_ice_state_to_string(call->stats[LINPHONE_CALL_STATS_VIDEO].ice_state)); } -void linphone_call_stop_ice_for_inactive_streams(SalMediaDescription *desc, IceSession *session) { +void linphone_call_stop_ice_for_inactive_streams(LinphoneCall *call) { int i; - + IceSession *session = call->ice_session; + SalMediaDescription *desc = call->localdesc; + if (session == NULL) return; if (ice_session_state(session) == IS_Completed) return; @@ -726,6 +729,7 @@ void linphone_call_stop_ice_for_inactive_streams(SalMediaDescription *desc, IceS IceCheckList *cl = ice_session_check_list(session, i); if (!sal_stream_description_active(&desc->streams[i]) && cl) { ice_session_remove_check_list(session, cl); + clear_ice_check_list(call, cl); } } } diff --git a/coreapi/private.h b/coreapi/private.h index a1751da5f..d53a7d780 100644 --- a/coreapi/private.h +++ b/coreapi/private.h @@ -396,7 +396,7 @@ void linphone_core_adapt_to_network(LinphoneCore *lc, int ping_time_ms, Linphone int linphone_core_gather_ice_candidates(LinphoneCore *lc, LinphoneCall *call); void linphone_core_update_ice_state_in_call_stats(LinphoneCall *call); void linphone_call_stats_fill(LinphoneCallStats *stats, MediaStream *ms, OrtpEvent *ev); -void linphone_call_stop_ice_for_inactive_streams(SalMediaDescription *desc, IceSession *session); +void linphone_call_stop_ice_for_inactive_streams(LinphoneCall *call); void _update_local_media_description_from_ice(SalMediaDescription *desc, IceSession *session); void linphone_call_update_local_media_description_from_ice_or_upnp(LinphoneCall *call); void linphone_call_update_ice_from_remote_media_description(LinphoneCall *call, const SalMediaDescription *md); From 5993175b5208ba94e2707352ef4c24fc74e4f26c Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Wed, 15 Apr 2015 09:36:08 +0200 Subject: [PATCH 043/157] i10n: update translations --- po/ar.po | 244 +++++++++++++++++------------------ po/cs.po | 244 +++++++++++++++++------------------ po/de.po | 244 +++++++++++++++++------------------ po/es.po | 244 +++++++++++++++++------------------ po/fr.po | 250 ++++++++++++++++++------------------ po/he.po | 244 +++++++++++++++++------------------ po/hu.po | 244 +++++++++++++++++------------------ po/it.po | 244 +++++++++++++++++------------------ po/ja.po | 244 +++++++++++++++++------------------ po/nb_NO.po | 244 +++++++++++++++++------------------ po/nl.po | 244 +++++++++++++++++------------------ po/pl.po | 266 ++++++++++++++++++++------------------- po/pt_BR.po | 274 ++++++++++++++++++++-------------------- po/ru.po | 244 +++++++++++++++++------------------ po/sr.po | 244 +++++++++++++++++------------------ po/sv.po | 244 +++++++++++++++++------------------ po/tr.po | 356 ++++++++++++++++++++++++++-------------------------- po/zh_CN.po | 244 +++++++++++++++++------------------ po/zh_TW.po | 244 +++++++++++++++++------------------ 19 files changed, 2441 insertions(+), 2365 deletions(-) diff --git a/po/ar.po b/po/ar.po index 93272a4a9..84c207abd 100644 --- a/po/ar.po +++ b/po/ar.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: linphone-gtk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-27 14:40+0100\n" -"PO-Revision-Date: 2015-03-30 15:42+0000\n" +"POT-Creation-Date: 2015-04-01 16:25+0200\n" +"PO-Revision-Date: 2015-04-12 14:07+0000\n" "Last-Translator: محيي الدين \n" "Language-Team: Arabic (http://www.transifex.com/projects/p/linphone-gtk/language/ar/)\n" "MIME-Version: 1.0\n" @@ -135,7 +135,7 @@ msgstr "ابدأ مرشد الصوت" msgid "Run self test and exit 0 if succeed" msgstr "شغِّل الاختبار الذاتي ثم اخرِجْ 0 إذا نجح" -#: ../gtk/main.c:1059 +#: ../gtk/main.c:1069 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -143,76 +143,76 @@ msgid "" "If you answer no, this person will be temporarily blacklisted." msgstr "%s يريد إضافتك إلى جهة اتصاله.\nهل تريد السماح له برؤية معلومات حضورك وكذا إضافته إلى جهة اتصالك أيضا ؟ إذا أجبت ب لا، سيُحظَر هذا الشخص مؤقتا." -#: ../gtk/main.c:1136 +#: ../gtk/main.c:1146 #, c-format msgid "" "Please enter your password for username %s\n" " at realm %s:" msgstr "ادخل كلمة السر ل %s\n في نطاق %s:" -#: ../gtk/main.c:1257 +#: ../gtk/main.c:1267 msgid "Call error" msgstr "خطأ في المكالمة" -#: ../gtk/main.c:1260 ../coreapi/linphonecore.c:3826 +#: ../gtk/main.c:1270 ../coreapi/linphonecore.c:3842 msgid "Call ended" msgstr "إنتهت المكالمة" -#: ../gtk/main.c:1263 ../coreapi/call_log.c:221 +#: ../gtk/main.c:1273 ../coreapi/call_log.c:221 msgid "Incoming call" msgstr "مكالمة واردة" -#: ../gtk/main.c:1265 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 +#: ../gtk/main.c:1275 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 msgid "Answer" msgstr "أجِبْ" -#: ../gtk/main.c:1267 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1277 ../gtk/main.ui.h:6 msgid "Decline" msgstr "ارفضْ" -#: ../gtk/main.c:1273 +#: ../gtk/main.c:1283 msgid "Call paused" msgstr "المكالمة متوقفة" -#: ../gtk/main.c:1273 +#: ../gtk/main.c:1283 #, c-format msgid "by %s" msgstr "بواسطة %s" -#: ../gtk/main.c:1343 +#: ../gtk/main.c:1353 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "يود %s تشغيل الفيديو. هل تقبل ذلك ؟" -#: ../gtk/main.c:1505 +#: ../gtk/main.c:1516 msgid "Website link" msgstr "وصلة إلى الموقع وِبْ" -#: ../gtk/main.c:1554 +#: ../gtk/main.c:1565 msgid "Linphone - a video internet phone" msgstr "لِنْفُونْ - الهاتف المرئي عبر الإنترنت" -#: ../gtk/main.c:1646 +#: ../gtk/main.c:1657 #, c-format msgid "%s (Default)" msgstr "%s (افتراضي)" -#: ../gtk/main.c:1978 ../coreapi/callbacks.c:1057 +#: ../gtk/main.c:1989 ../coreapi/callbacks.c:1057 #, c-format msgid "We are transferred to %s" msgstr "التحويل إلى %s" -#: ../gtk/main.c:1988 +#: ../gtk/main.c:1999 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." msgstr "لا وجود للوحة الصوت على هذا الحاسوب.\nلن تتمكن من تلقي أو إجراء أي مكالمة." -#: ../gtk/main.c:2136 +#: ../gtk/main.c:2147 msgid "A free SIP video-phone" msgstr "هاتف SIP المرئي الحر" -#: ../gtk/main.c:2241 +#: ../gtk/main.c:2252 #, c-format msgid "Hello\n" msgstr "أهلا\n" @@ -286,7 +286,7 @@ msgstr "الإعدادات" msgid "Enabled" msgstr "مفعَّل" -#: ../gtk/propertybox.c:622 ../gtk/propertybox.c:763 ../gtk/parameters.ui.h:17 +#: ../gtk/propertybox.c:622 ../gtk/propertybox.c:763 ../gtk/parameters.ui.h:20 msgid "Disabled" msgstr "غير مفعَّل" @@ -455,7 +455,7 @@ msgstr "أريد تحديد عنوان التهيئة عن بعد" msgid "Enter your linphone.org username" msgstr "أدخِلْ إسم المستخدم في linphone.org" -#: ../gtk/setupwizard.c:102 ../gtk/parameters.ui.h:81 ../gtk/ldap.ui.h:4 +#: ../gtk/setupwizard.c:102 ../gtk/parameters.ui.h:85 ../gtk/ldap.ui.h:4 msgid "Username:" msgstr "إسم المستخدم :" @@ -1192,307 +1192,311 @@ msgid "C" msgstr "C" #: ../gtk/parameters.ui.h:11 +msgid "SIP (UDP)" +msgstr "SIP (UDP)" + +#: ../gtk/parameters.ui.h:12 +msgid "SIP (TCP)" +msgstr "SIP (TCP)" + +#: ../gtk/parameters.ui.h:13 +msgid "SIP (TLS)" +msgstr "SIP (TLS)" + +#: ../gtk/parameters.ui.h:14 msgid "Settings" msgstr "الإعدادات" -#: ../gtk/parameters.ui.h:12 +#: ../gtk/parameters.ui.h:15 msgid "Set Maximum Transmission Unit:" msgstr "حدِّد Maximum Transmission Unit :" -#: ../gtk/parameters.ui.h:13 +#: ../gtk/parameters.ui.h:16 msgid "Send DTMFs as SIP info" msgstr "أرسِل الأرقام الهاتفية على هيئة SIP INFO" -#: ../gtk/parameters.ui.h:14 +#: ../gtk/parameters.ui.h:17 msgid "Allow IPv6" msgstr "السماح باستخدام IPv6" -#: ../gtk/parameters.ui.h:15 +#: ../gtk/parameters.ui.h:18 msgid "Transport" msgstr "النقل" -#: ../gtk/parameters.ui.h:16 +#: ../gtk/parameters.ui.h:19 msgid "SIP/UDP port" msgstr "منفذ SIP/UDP" -#: ../gtk/parameters.ui.h:18 +#: ../gtk/parameters.ui.h:21 msgid "Random" msgstr "عشوائي" -#: ../gtk/parameters.ui.h:19 +#: ../gtk/parameters.ui.h:22 msgid "SIP/TCP port" msgstr "منفذ SIP/TCP" -#: ../gtk/parameters.ui.h:20 +#: ../gtk/parameters.ui.h:23 msgid "Audio RTP/UDP:" msgstr "صوت RTP/UDP :" -#: ../gtk/parameters.ui.h:21 +#: ../gtk/parameters.ui.h:24 msgid "Fixed" msgstr "ثابت" -#: ../gtk/parameters.ui.h:22 +#: ../gtk/parameters.ui.h:25 msgid "Video RTP/UDP:" msgstr "فيديو RTP/UDP :" -#: ../gtk/parameters.ui.h:23 +#: ../gtk/parameters.ui.h:26 msgid "Media encryption type" msgstr "نوع وسيط التعمية" -#: ../gtk/parameters.ui.h:24 +#: ../gtk/parameters.ui.h:27 msgid "Media encryption is mandatory" msgstr "وسيط التعمية إجباري" -#: ../gtk/parameters.ui.h:25 +#: ../gtk/parameters.ui.h:28 msgid "Tunnel" msgstr "النفق" -#: ../gtk/parameters.ui.h:26 +#: ../gtk/parameters.ui.h:29 msgid "DSCP fields" msgstr "حقول DSCP" -#: ../gtk/parameters.ui.h:27 +#: ../gtk/parameters.ui.h:30 msgid "Network protocol and ports" msgstr "بروتوكول الشبكة والمنافذ" -#: ../gtk/parameters.ui.h:28 +#: ../gtk/parameters.ui.h:31 msgid "Direct connection to the Internet" msgstr "الاتصال مباشر بالإنترنت" -#: ../gtk/parameters.ui.h:29 +#: ../gtk/parameters.ui.h:32 msgid "Behind NAT / Firewall (specify gateway IP )" msgstr "وراء جدار ناري (حدِّد عنوان IP البوابة)" -#: ../gtk/parameters.ui.h:30 +#: ../gtk/parameters.ui.h:33 msgid "Behind NAT / Firewall (use STUN to resolve)" msgstr "وراء جدار ناري (استخدم STUN)" -#: ../gtk/parameters.ui.h:31 +#: ../gtk/parameters.ui.h:34 msgid "Behind NAT / Firewall (use ICE)" msgstr "وراء جدار ناري (استخدم ICE)" -#: ../gtk/parameters.ui.h:32 +#: ../gtk/parameters.ui.h:35 msgid "Behind NAT / Firewall (use uPnP)" msgstr "وراء جدار ناري (استخدم uPnP)" -#: ../gtk/parameters.ui.h:33 +#: ../gtk/parameters.ui.h:36 msgid "Public IP address:" msgstr "عنوان IP العمومي :" -#: ../gtk/parameters.ui.h:34 +#: ../gtk/parameters.ui.h:37 msgid "Stun server:" msgstr "خادم STUN :" -#: ../gtk/parameters.ui.h:35 +#: ../gtk/parameters.ui.h:38 msgid "NAT and Firewall" msgstr "إعدادات حول الجدار الناري" -#: ../gtk/parameters.ui.h:36 +#: ../gtk/parameters.ui.h:39 msgid "Network settings" msgstr "إعدادات الشبكة" -#: ../gtk/parameters.ui.h:37 +#: ../gtk/parameters.ui.h:40 msgid "Ring sound:" msgstr "صوت الجرس :" -#: ../gtk/parameters.ui.h:38 +#: ../gtk/parameters.ui.h:41 msgid "ALSA special device (optional):" msgstr "عتاد ALSA الخصوصي (اختياري) :" -#: ../gtk/parameters.ui.h:39 +#: ../gtk/parameters.ui.h:42 msgid "Capture device:" msgstr "جهاز الالتقاط :" -#: ../gtk/parameters.ui.h:40 +#: ../gtk/parameters.ui.h:43 msgid "Ring device:" msgstr "جهاز الرنين :" -#: ../gtk/parameters.ui.h:41 +#: ../gtk/parameters.ui.h:44 msgid "Playback device:" msgstr "جهاز السمع :" -#: ../gtk/parameters.ui.h:42 +#: ../gtk/parameters.ui.h:45 msgid "Enable echo cancellation" msgstr "فعِّل إزالة الصدى" -#: ../gtk/parameters.ui.h:43 +#: ../gtk/parameters.ui.h:46 msgid "Audio" msgstr "الصوت" -#: ../gtk/parameters.ui.h:44 +#: ../gtk/parameters.ui.h:47 msgid "Video input device:" msgstr "جهاز إدخال الفيديو :" -#: ../gtk/parameters.ui.h:45 +#: ../gtk/parameters.ui.h:48 msgid "Prefered video resolution:" msgstr "المقدار المُراد لدقة الفيديو :" -#: ../gtk/parameters.ui.h:46 +#: ../gtk/parameters.ui.h:49 msgid "Video output method:" msgstr "طريقة إخراج الفيديو :" -#: ../gtk/parameters.ui.h:47 +#: ../gtk/parameters.ui.h:50 msgid "Show camera preview" msgstr "اظهر معاينة الكاميرا" -#: ../gtk/parameters.ui.h:48 +#: ../gtk/parameters.ui.h:51 msgid "Video" msgstr "الفيديو" -#: ../gtk/parameters.ui.h:49 +#: ../gtk/parameters.ui.h:52 msgid "Multimedia settings" msgstr "إعدادات الوسائط المتعددة" -#: ../gtk/parameters.ui.h:50 +#: ../gtk/parameters.ui.h:53 msgid "This section defines your SIP address when not using a SIP account" msgstr "هذه الفقرة تحدد عنوانك SIP إن كنت لا تستخدم حساب SIP" -#: ../gtk/parameters.ui.h:51 +#: ../gtk/parameters.ui.h:54 msgid "Your display name (eg: John Doe):" msgstr "إسمك المعروض (مثلا : زيد عمرو) :" -#: ../gtk/parameters.ui.h:52 +#: ../gtk/parameters.ui.h:55 msgid "Your username:" msgstr "إسم المستخدم لديك :" -#: ../gtk/parameters.ui.h:53 +#: ../gtk/parameters.ui.h:56 msgid "Your resulting SIP address:" msgstr "عنوانك SIP :" -#: ../gtk/parameters.ui.h:54 +#: ../gtk/parameters.ui.h:57 msgid "Default identity" msgstr "الهوية الافتراضية" -#: ../gtk/parameters.ui.h:55 +#: ../gtk/parameters.ui.h:58 msgid "Wizard" msgstr "المرشد" -#: ../gtk/parameters.ui.h:56 +#: ../gtk/parameters.ui.h:59 msgid "Add" msgstr "إضافة" -#: ../gtk/parameters.ui.h:57 +#: ../gtk/parameters.ui.h:60 msgid "Edit" msgstr "حرر" -#: ../gtk/parameters.ui.h:58 +#: ../gtk/parameters.ui.h:61 msgid "Remove" msgstr "أزل" -#: ../gtk/parameters.ui.h:59 +#: ../gtk/parameters.ui.h:62 msgid "Proxy accounts" msgstr "حسابات الوكيل" -#: ../gtk/parameters.ui.h:60 +#: ../gtk/parameters.ui.h:63 msgid "Erase all passwords" msgstr "احذف جميع كلمات السر" -#: ../gtk/parameters.ui.h:61 +#: ../gtk/parameters.ui.h:64 msgid "Privacy" msgstr "الأمان" -#: ../gtk/parameters.ui.h:62 +#: ../gtk/parameters.ui.h:65 msgid "Automatically answer when a call is received" msgstr "الإجابة تلقائيا فور تلقي المكالمة" -#: ../gtk/parameters.ui.h:63 +#: ../gtk/parameters.ui.h:66 +msgid "Delay before answering (ms)" +msgstr "التأخير قبل الإجابة (ميلي ث,)" + +#: ../gtk/parameters.ui.h:67 msgid "Auto-answer" msgstr "الإجابة تلقائيا" -#: ../gtk/parameters.ui.h:64 +#: ../gtk/parameters.ui.h:68 msgid "Manage SIP Accounts" msgstr "إدارة حسابات SIP" -#: ../gtk/parameters.ui.h:65 ../gtk/tunnel_config.ui.h:4 +#: ../gtk/parameters.ui.h:69 ../gtk/tunnel_config.ui.h:4 msgid "Enable" msgstr "فعِّل" -#: ../gtk/parameters.ui.h:66 ../gtk/tunnel_config.ui.h:5 +#: ../gtk/parameters.ui.h:70 ../gtk/tunnel_config.ui.h:5 msgid "Disable" msgstr "إلغاء التفعيل" -#: ../gtk/parameters.ui.h:67 +#: ../gtk/parameters.ui.h:71 msgid "Codecs" msgstr "المراميز" -#: ../gtk/parameters.ui.h:68 +#: ../gtk/parameters.ui.h:72 msgid "0 stands for \"unlimited\"" msgstr "حدِّد 0 لعدم وضع أي حد" -#: ../gtk/parameters.ui.h:69 +#: ../gtk/parameters.ui.h:73 msgid "Upload speed limit in Kbit/sec:" msgstr "حد سرعة الرفع بالكيلوبِتْ/الثانية :" -#: ../gtk/parameters.ui.h:70 +#: ../gtk/parameters.ui.h:74 msgid "Download speed limit in Kbit/sec:" msgstr "حد سرعة التنزيل بالكيلوبِتْ/الثانية :" -#: ../gtk/parameters.ui.h:71 +#: ../gtk/parameters.ui.h:75 msgid "Enable adaptive rate control" msgstr "فعِّل التحكم المتكيف مع الصبيب" -#: ../gtk/parameters.ui.h:72 +#: ../gtk/parameters.ui.h:76 msgid "" "Adaptive rate control is a technique to dynamically guess the available " "bandwidth during a call." msgstr "التحكم المتكيف مع الصبيب هو تقنية لملائمة جودة الصوت والصورة بناءً على سعة قناة الاتصال المتاحة خلال المكالمة." -#: ../gtk/parameters.ui.h:73 +#: ../gtk/parameters.ui.h:77 msgid "Bandwidth control" msgstr "إدارة سعة القناة" -#: ../gtk/parameters.ui.h:74 +#: ../gtk/parameters.ui.h:78 msgid "Codecs" msgstr "المراميز" -#: ../gtk/parameters.ui.h:75 +#: ../gtk/parameters.ui.h:79 msgid "Language" msgstr "اللغة" -#: ../gtk/parameters.ui.h:76 +#: ../gtk/parameters.ui.h:80 msgid "Show advanced settings" msgstr "أظهر الإعدادات المتقدمة" -#: ../gtk/parameters.ui.h:77 +#: ../gtk/parameters.ui.h:81 msgid "Level" msgstr "المستوى" -#: ../gtk/parameters.ui.h:78 +#: ../gtk/parameters.ui.h:82 msgid "User interface" msgstr "واجهة المستخدم" -#: ../gtk/parameters.ui.h:79 ../gtk/ldap.ui.h:2 +#: ../gtk/parameters.ui.h:83 ../gtk/ldap.ui.h:2 msgid "Server address:" msgstr "عنوان الخادم :" -#: ../gtk/parameters.ui.h:80 ../gtk/ldap.ui.h:3 +#: ../gtk/parameters.ui.h:84 ../gtk/ldap.ui.h:3 msgid "Authentication method:" msgstr "طريقة التحقق من الهوية :" -#: ../gtk/parameters.ui.h:82 +#: ../gtk/parameters.ui.h:86 msgid "LDAP Account setup" msgstr "تهيئة LDAP" -#: ../gtk/parameters.ui.h:83 +#: ../gtk/parameters.ui.h:87 msgid "LDAP" msgstr "LDAP" -#: ../gtk/parameters.ui.h:84 +#: ../gtk/parameters.ui.h:88 msgid "Done" msgstr "أغلق" -#: ../gtk/parameters.ui.h:85 -msgid "SIP (UDP)" -msgstr "SIP (UDP)" - -#: ../gtk/parameters.ui.h:86 -msgid "SIP (TCP)" -msgstr "SIP (TCP)" - -#: ../gtk/parameters.ui.h:87 -msgid "SIP (TLS)" -msgstr "SIP (TLS)" - #: ../gtk/buddylookup.ui.h:1 msgid "Search contacts in directory" msgstr "البحث عن جهات الاتصال في الدليل" @@ -1708,60 +1712,60 @@ msgstr "تجري التهيئة..." msgid "Please wait while fetching configuration from server..." msgstr "رجاءً انتظر ريثما ينتهي من جلب الإعدادات من الخادم..." -#: ../coreapi/linphonecore.c:1534 +#: ../coreapi/linphonecore.c:1538 msgid "Ready" msgstr "جاهز" -#: ../coreapi/linphonecore.c:2534 +#: ../coreapi/linphonecore.c:2550 msgid "Configuring" msgstr "تجري التهيئة" -#: ../coreapi/linphonecore.c:2708 +#: ../coreapi/linphonecore.c:2724 msgid "Looking for telephone number destination..." msgstr "يجري البحث عن وجهة رقم الهاتف..." -#: ../coreapi/linphonecore.c:2710 +#: ../coreapi/linphonecore.c:2726 msgid "Could not resolve this number." msgstr "لم يتمكن من إيجاد هذا الرقم." #. must be known at that time -#: ../coreapi/linphonecore.c:2996 +#: ../coreapi/linphonecore.c:3012 msgid "Contacting" msgstr "يتصل ب" -#: ../coreapi/linphonecore.c:3001 +#: ../coreapi/linphonecore.c:3017 msgid "Could not call" msgstr "لم يتمكن من الاتصال" -#: ../coreapi/linphonecore.c:3152 +#: ../coreapi/linphonecore.c:3168 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "آسف، وصل عدد المكالمات الآنية إلى حده الأقصى" -#: ../coreapi/linphonecore.c:3310 +#: ../coreapi/linphonecore.c:3326 msgid "is contacting you" msgstr "يتصل بك" -#: ../coreapi/linphonecore.c:3311 +#: ../coreapi/linphonecore.c:3327 msgid " and asked autoanswer." msgstr "ويطلب ردا تلقائيا." -#: ../coreapi/linphonecore.c:3435 +#: ../coreapi/linphonecore.c:3451 msgid "Modifying call parameters..." msgstr "يجري تعديل إعدادات المكالمة..." -#: ../coreapi/linphonecore.c:3782 +#: ../coreapi/linphonecore.c:3798 msgid "Connected." msgstr "متصل." -#: ../coreapi/linphonecore.c:3807 +#: ../coreapi/linphonecore.c:3823 msgid "Call aborted" msgstr "أُلغيت المكالمة" -#: ../coreapi/linphonecore.c:3997 +#: ../coreapi/linphonecore.c:4013 msgid "Could not pause the call" msgstr "لم يتمكن من توقيف المكالمة مؤقتا" -#: ../coreapi/linphonecore.c:4000 +#: ../coreapi/linphonecore.c:4016 msgid "Pausing the current call..." msgstr "وضع المكالمة قيد الانتظار..." @@ -1957,11 +1961,11 @@ msgstr "خدمة غير متاحة، تجري الإعادة" msgid "Authentication token is %s" msgstr "شارة التحقق من الهوية هي %s" -#: ../coreapi/linphonecall.c:1305 +#: ../coreapi/linphonecall.c:1306 msgid "Call parameters were successfully modified." msgstr "عُدِّلت معاملات المكالمات بنجاج." -#: ../coreapi/linphonecall.c:3659 +#: ../coreapi/linphonecall.c:3660 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." diff --git a/po/cs.po b/po/cs.po index 05e682390..100d76bf2 100644 --- a/po/cs.po +++ b/po/cs.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: linphone-gtk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-27 14:40+0100\n" -"PO-Revision-Date: 2015-03-27 13:40+0000\n" +"POT-Creation-Date: 2015-04-01 16:25+0200\n" +"PO-Revision-Date: 2015-04-01 14:26+0000\n" "Last-Translator: Belledonne Communications \n" "Language-Team: Czech (http://www.transifex.com/projects/p/linphone-gtk/language/cs/)\n" "MIME-Version: 1.0\n" @@ -129,7 +129,7 @@ msgstr "" msgid "Run self test and exit 0 if succeed" msgstr "" -#: ../gtk/main.c:1059 +#: ../gtk/main.c:1069 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -137,76 +137,76 @@ msgid "" "If you answer no, this person will be temporarily blacklisted." msgstr "%s si vás chce přidat do svého adresáře.\nDovolíte mu, aby viděl váš stav přítomnosti, nebo si ho také chcete přidat do svého adresáře?\nOdpovíte-li ne, tato osobo bude dočasně blokována." -#: ../gtk/main.c:1136 +#: ../gtk/main.c:1146 #, c-format msgid "" "Please enter your password for username %s\n" " at realm %s:" msgstr "" -#: ../gtk/main.c:1257 +#: ../gtk/main.c:1267 msgid "Call error" msgstr "Chyba hovoru" -#: ../gtk/main.c:1260 ../coreapi/linphonecore.c:3826 +#: ../gtk/main.c:1270 ../coreapi/linphonecore.c:3842 msgid "Call ended" msgstr "Hovor ukončen" -#: ../gtk/main.c:1263 ../coreapi/call_log.c:221 +#: ../gtk/main.c:1273 ../coreapi/call_log.c:221 msgid "Incoming call" msgstr "Příchozí hovor" -#: ../gtk/main.c:1265 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 +#: ../gtk/main.c:1275 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 msgid "Answer" msgstr "Odpovědět" -#: ../gtk/main.c:1267 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1277 ../gtk/main.ui.h:6 msgid "Decline" msgstr "Odmítnout" -#: ../gtk/main.c:1273 +#: ../gtk/main.c:1283 msgid "Call paused" msgstr "Hovor odložen" -#: ../gtk/main.c:1273 +#: ../gtk/main.c:1283 #, c-format msgid "by %s" msgstr "kým: %s" -#: ../gtk/main.c:1343 +#: ../gtk/main.c:1353 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "%s navrhuje začít videohovor. Přijímáte?" -#: ../gtk/main.c:1505 +#: ../gtk/main.c:1516 msgid "Website link" msgstr "Odkaz na webovou stránku" -#: ../gtk/main.c:1554 +#: ../gtk/main.c:1565 msgid "Linphone - a video internet phone" msgstr "Lipnhone – internetový videofon" -#: ../gtk/main.c:1646 +#: ../gtk/main.c:1657 #, c-format msgid "%s (Default)" msgstr "%s (Výchozí)" -#: ../gtk/main.c:1978 ../coreapi/callbacks.c:1057 +#: ../gtk/main.c:1989 ../coreapi/callbacks.c:1057 #, c-format msgid "We are transferred to %s" msgstr "Byly jsme přepojeni na %s" -#: ../gtk/main.c:1988 +#: ../gtk/main.c:1999 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." msgstr "Na tomto počítači nebyla objevena žádná zvuková karta.\nNebudete moci vytáčet a přijímat a zvukové hovory." -#: ../gtk/main.c:2136 +#: ../gtk/main.c:2147 msgid "A free SIP video-phone" msgstr "Volný SIP videofon" -#: ../gtk/main.c:2241 +#: ../gtk/main.c:2252 #, c-format msgid "Hello\n" msgstr "" @@ -280,7 +280,7 @@ msgstr "Parametry" msgid "Enabled" msgstr "Povoleno" -#: ../gtk/propertybox.c:622 ../gtk/propertybox.c:763 ../gtk/parameters.ui.h:17 +#: ../gtk/propertybox.c:622 ../gtk/propertybox.c:763 ../gtk/parameters.ui.h:20 msgid "Disabled" msgstr "Zakázáno" @@ -446,7 +446,7 @@ msgstr "" msgid "Enter your linphone.org username" msgstr "Zadejte uživatelské jméno na linphone.org" -#: ../gtk/setupwizard.c:102 ../gtk/parameters.ui.h:81 ../gtk/ldap.ui.h:4 +#: ../gtk/setupwizard.c:102 ../gtk/parameters.ui.h:85 ../gtk/ldap.ui.h:4 msgid "Username:" msgstr "Uživatelské jméno:" @@ -1183,307 +1183,311 @@ msgid "C" msgstr "C" #: ../gtk/parameters.ui.h:11 +msgid "SIP (UDP)" +msgstr "SIP (UDP)" + +#: ../gtk/parameters.ui.h:12 +msgid "SIP (TCP)" +msgstr "SIP (TCP)" + +#: ../gtk/parameters.ui.h:13 +msgid "SIP (TLS)" +msgstr "SIP (TLS)" + +#: ../gtk/parameters.ui.h:14 msgid "Settings" msgstr "Nastavení" -#: ../gtk/parameters.ui.h:12 +#: ../gtk/parameters.ui.h:15 msgid "Set Maximum Transmission Unit:" msgstr "Nastavit MTU (největší přenositelná zpráva):" -#: ../gtk/parameters.ui.h:13 +#: ../gtk/parameters.ui.h:16 msgid "Send DTMFs as SIP info" msgstr "Odesílat tóny DTMF jako SIP INFO zprávy" -#: ../gtk/parameters.ui.h:14 +#: ../gtk/parameters.ui.h:17 msgid "Allow IPv6" msgstr "" -#: ../gtk/parameters.ui.h:15 +#: ../gtk/parameters.ui.h:18 msgid "Transport" msgstr "Přenos" -#: ../gtk/parameters.ui.h:16 +#: ../gtk/parameters.ui.h:19 msgid "SIP/UDP port" msgstr "" -#: ../gtk/parameters.ui.h:18 +#: ../gtk/parameters.ui.h:21 msgid "Random" msgstr "" -#: ../gtk/parameters.ui.h:19 +#: ../gtk/parameters.ui.h:22 msgid "SIP/TCP port" msgstr "" -#: ../gtk/parameters.ui.h:20 +#: ../gtk/parameters.ui.h:23 msgid "Audio RTP/UDP:" msgstr "Zvukový RTP/UDP:" -#: ../gtk/parameters.ui.h:21 +#: ../gtk/parameters.ui.h:24 msgid "Fixed" msgstr "Stálý" -#: ../gtk/parameters.ui.h:22 +#: ../gtk/parameters.ui.h:25 msgid "Video RTP/UDP:" msgstr "Obrazový RTP/UDP:" -#: ../gtk/parameters.ui.h:23 +#: ../gtk/parameters.ui.h:26 msgid "Media encryption type" msgstr "Druh šifrování médií" -#: ../gtk/parameters.ui.h:24 +#: ../gtk/parameters.ui.h:27 msgid "Media encryption is mandatory" msgstr "Šifrování médií je povinné" -#: ../gtk/parameters.ui.h:25 +#: ../gtk/parameters.ui.h:28 msgid "Tunnel" msgstr "Tunel" -#: ../gtk/parameters.ui.h:26 +#: ../gtk/parameters.ui.h:29 msgid "DSCP fields" msgstr "Položky DSCP" -#: ../gtk/parameters.ui.h:27 +#: ../gtk/parameters.ui.h:30 msgid "Network protocol and ports" msgstr "Síťové protokoly a porty" -#: ../gtk/parameters.ui.h:28 +#: ../gtk/parameters.ui.h:31 msgid "Direct connection to the Internet" msgstr "Přímé připojení do Internetu" -#: ../gtk/parameters.ui.h:29 +#: ../gtk/parameters.ui.h:32 msgid "Behind NAT / Firewall (specify gateway IP )" msgstr "" -#: ../gtk/parameters.ui.h:30 +#: ../gtk/parameters.ui.h:33 msgid "Behind NAT / Firewall (use STUN to resolve)" msgstr "Za NAT/firewallem (adresu určí STUN)" -#: ../gtk/parameters.ui.h:31 +#: ../gtk/parameters.ui.h:34 msgid "Behind NAT / Firewall (use ICE)" msgstr "Za NAT/firewallem (adresu určí ICE)" -#: ../gtk/parameters.ui.h:32 +#: ../gtk/parameters.ui.h:35 msgid "Behind NAT / Firewall (use uPnP)" msgstr "Za NAT/firewallem (adresu určí UPnP)" -#: ../gtk/parameters.ui.h:33 +#: ../gtk/parameters.ui.h:36 msgid "Public IP address:" msgstr "Veřejná IP adresa:" -#: ../gtk/parameters.ui.h:34 +#: ../gtk/parameters.ui.h:37 msgid "Stun server:" msgstr "STUN server:" -#: ../gtk/parameters.ui.h:35 +#: ../gtk/parameters.ui.h:38 msgid "NAT and Firewall" msgstr "NAT a firewall" -#: ../gtk/parameters.ui.h:36 +#: ../gtk/parameters.ui.h:39 msgid "Network settings" msgstr "Nastavení sítě" -#: ../gtk/parameters.ui.h:37 +#: ../gtk/parameters.ui.h:40 msgid "Ring sound:" msgstr "Vyzvánění:" -#: ../gtk/parameters.ui.h:38 +#: ../gtk/parameters.ui.h:41 msgid "ALSA special device (optional):" msgstr "Zvláštní ALSA zařízení (volitelné):" -#: ../gtk/parameters.ui.h:39 +#: ../gtk/parameters.ui.h:42 msgid "Capture device:" msgstr "Zařízení pro nahrávání:" -#: ../gtk/parameters.ui.h:40 +#: ../gtk/parameters.ui.h:43 msgid "Ring device:" msgstr "Zařízení pro vyzvánění:" -#: ../gtk/parameters.ui.h:41 +#: ../gtk/parameters.ui.h:44 msgid "Playback device:" msgstr "Zařízení pro přehrávání:" -#: ../gtk/parameters.ui.h:42 +#: ../gtk/parameters.ui.h:45 msgid "Enable echo cancellation" msgstr "Zapnout potlačení ozvěny" -#: ../gtk/parameters.ui.h:43 +#: ../gtk/parameters.ui.h:46 msgid "Audio" msgstr "Zvuk" -#: ../gtk/parameters.ui.h:44 +#: ../gtk/parameters.ui.h:47 msgid "Video input device:" msgstr "Vstupní zařízení obrazu:" -#: ../gtk/parameters.ui.h:45 +#: ../gtk/parameters.ui.h:48 msgid "Prefered video resolution:" msgstr "Upřednostňované rozlišení obrazu:" -#: ../gtk/parameters.ui.h:46 +#: ../gtk/parameters.ui.h:49 msgid "Video output method:" msgstr "" -#: ../gtk/parameters.ui.h:47 +#: ../gtk/parameters.ui.h:50 msgid "Show camera preview" msgstr "" -#: ../gtk/parameters.ui.h:48 +#: ../gtk/parameters.ui.h:51 msgid "Video" msgstr "Obraz" -#: ../gtk/parameters.ui.h:49 +#: ../gtk/parameters.ui.h:52 msgid "Multimedia settings" msgstr "Nastavení multimédií" -#: ../gtk/parameters.ui.h:50 +#: ../gtk/parameters.ui.h:53 msgid "This section defines your SIP address when not using a SIP account" msgstr "Tento oddíl určuje vaši SIP adresu, když se nepoužívá žádný účet" -#: ../gtk/parameters.ui.h:51 +#: ../gtk/parameters.ui.h:54 msgid "Your display name (eg: John Doe):" msgstr "Vaše zobrazované jméno (např. Jan Novák):" -#: ../gtk/parameters.ui.h:52 +#: ../gtk/parameters.ui.h:55 msgid "Your username:" msgstr "Vaše uživatelské jméno:" -#: ../gtk/parameters.ui.h:53 +#: ../gtk/parameters.ui.h:56 msgid "Your resulting SIP address:" msgstr "Vaše výsledná SIP adresa:" -#: ../gtk/parameters.ui.h:54 +#: ../gtk/parameters.ui.h:57 msgid "Default identity" msgstr "Implicitní totožnost" -#: ../gtk/parameters.ui.h:55 +#: ../gtk/parameters.ui.h:58 msgid "Wizard" msgstr "Průvodce" -#: ../gtk/parameters.ui.h:56 +#: ../gtk/parameters.ui.h:59 msgid "Add" msgstr "Přidat" -#: ../gtk/parameters.ui.h:57 +#: ../gtk/parameters.ui.h:60 msgid "Edit" msgstr "Upravit" -#: ../gtk/parameters.ui.h:58 +#: ../gtk/parameters.ui.h:61 msgid "Remove" msgstr "Odstranit" -#: ../gtk/parameters.ui.h:59 +#: ../gtk/parameters.ui.h:62 msgid "Proxy accounts" msgstr "Proxy účty" -#: ../gtk/parameters.ui.h:60 +#: ../gtk/parameters.ui.h:63 msgid "Erase all passwords" msgstr "Vymazat všechna hesla" -#: ../gtk/parameters.ui.h:61 +#: ../gtk/parameters.ui.h:64 msgid "Privacy" msgstr "Soukromí" -#: ../gtk/parameters.ui.h:62 +#: ../gtk/parameters.ui.h:65 msgid "Automatically answer when a call is received" msgstr "" -#: ../gtk/parameters.ui.h:63 +#: ../gtk/parameters.ui.h:66 +msgid "Delay before answering (ms)" +msgstr "" + +#: ../gtk/parameters.ui.h:67 msgid "Auto-answer" msgstr "" -#: ../gtk/parameters.ui.h:64 +#: ../gtk/parameters.ui.h:68 msgid "Manage SIP Accounts" msgstr "Nastavení SIP účtů" -#: ../gtk/parameters.ui.h:65 ../gtk/tunnel_config.ui.h:4 +#: ../gtk/parameters.ui.h:69 ../gtk/tunnel_config.ui.h:4 msgid "Enable" msgstr "Povolit" -#: ../gtk/parameters.ui.h:66 ../gtk/tunnel_config.ui.h:5 +#: ../gtk/parameters.ui.h:70 ../gtk/tunnel_config.ui.h:5 msgid "Disable" msgstr "Zakázat" -#: ../gtk/parameters.ui.h:67 +#: ../gtk/parameters.ui.h:71 msgid "Codecs" msgstr "Kodeky" -#: ../gtk/parameters.ui.h:68 +#: ../gtk/parameters.ui.h:72 msgid "0 stands for \"unlimited\"" msgstr "0 znamená „neomezeno“" -#: ../gtk/parameters.ui.h:69 +#: ../gtk/parameters.ui.h:73 msgid "Upload speed limit in Kbit/sec:" msgstr "Omezení odchozí rychlosti (kb/s):" -#: ../gtk/parameters.ui.h:70 +#: ../gtk/parameters.ui.h:74 msgid "Download speed limit in Kbit/sec:" msgstr "Omezení příchozí rychlosti (kb/s):" -#: ../gtk/parameters.ui.h:71 +#: ../gtk/parameters.ui.h:75 msgid "Enable adaptive rate control" msgstr "Zapnout přizpůsobující se řízení rychlosti" -#: ../gtk/parameters.ui.h:72 +#: ../gtk/parameters.ui.h:76 msgid "" "Adaptive rate control is a technique to dynamically guess the available " "bandwidth during a call." msgstr "Přizpůsobující se řízení rychlosti je technika dynamického odhadu dostupného pásma během hovoru." -#: ../gtk/parameters.ui.h:73 +#: ../gtk/parameters.ui.h:77 msgid "Bandwidth control" msgstr "Využití šířky pásma" -#: ../gtk/parameters.ui.h:74 +#: ../gtk/parameters.ui.h:78 msgid "Codecs" msgstr "Kodeky" -#: ../gtk/parameters.ui.h:75 +#: ../gtk/parameters.ui.h:79 msgid "Language" msgstr "Jazyk" -#: ../gtk/parameters.ui.h:76 +#: ../gtk/parameters.ui.h:80 msgid "Show advanced settings" msgstr "Zobrazit podrobnější nastavení" -#: ../gtk/parameters.ui.h:77 +#: ../gtk/parameters.ui.h:81 msgid "Level" msgstr "Úroveň" -#: ../gtk/parameters.ui.h:78 +#: ../gtk/parameters.ui.h:82 msgid "User interface" msgstr "Uživatelské rozhraní" -#: ../gtk/parameters.ui.h:79 ../gtk/ldap.ui.h:2 +#: ../gtk/parameters.ui.h:83 ../gtk/ldap.ui.h:2 msgid "Server address:" msgstr "" -#: ../gtk/parameters.ui.h:80 ../gtk/ldap.ui.h:3 +#: ../gtk/parameters.ui.h:84 ../gtk/ldap.ui.h:3 msgid "Authentication method:" msgstr "" -#: ../gtk/parameters.ui.h:82 +#: ../gtk/parameters.ui.h:86 msgid "LDAP Account setup" msgstr "" -#: ../gtk/parameters.ui.h:83 +#: ../gtk/parameters.ui.h:87 msgid "LDAP" msgstr "" -#: ../gtk/parameters.ui.h:84 +#: ../gtk/parameters.ui.h:88 msgid "Done" msgstr "Hotovo" -#: ../gtk/parameters.ui.h:85 -msgid "SIP (UDP)" -msgstr "SIP (UDP)" - -#: ../gtk/parameters.ui.h:86 -msgid "SIP (TCP)" -msgstr "SIP (TCP)" - -#: ../gtk/parameters.ui.h:87 -msgid "SIP (TLS)" -msgstr "SIP (TLS)" - #: ../gtk/buddylookup.ui.h:1 msgid "Search contacts in directory" msgstr "Hledat kontakty v adresáři" @@ -1699,60 +1703,60 @@ msgstr "" msgid "Please wait while fetching configuration from server..." msgstr "" -#: ../coreapi/linphonecore.c:1534 +#: ../coreapi/linphonecore.c:1538 msgid "Ready" msgstr "Připraven." -#: ../coreapi/linphonecore.c:2534 +#: ../coreapi/linphonecore.c:2550 msgid "Configuring" msgstr "" -#: ../coreapi/linphonecore.c:2708 +#: ../coreapi/linphonecore.c:2724 msgid "Looking for telephone number destination..." msgstr "Vyhledává se umístění čísla…" -#: ../coreapi/linphonecore.c:2710 +#: ../coreapi/linphonecore.c:2726 msgid "Could not resolve this number." msgstr "Toto číslo nelze vyhledat." #. must be known at that time -#: ../coreapi/linphonecore.c:2996 +#: ../coreapi/linphonecore.c:3012 msgid "Contacting" msgstr "Navazuje se spojení" -#: ../coreapi/linphonecore.c:3001 +#: ../coreapi/linphonecore.c:3017 msgid "Could not call" msgstr "Nelze volat" -#: ../coreapi/linphonecore.c:3152 +#: ../coreapi/linphonecore.c:3168 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "Je nám líto, ale byl dosažen maximální počet současných hovorů." -#: ../coreapi/linphonecore.c:3310 +#: ../coreapi/linphonecore.c:3326 msgid "is contacting you" msgstr "vás volá" -#: ../coreapi/linphonecore.c:3311 +#: ../coreapi/linphonecore.c:3327 msgid " and asked autoanswer." msgstr " a požaduje automatickou zvednutí." -#: ../coreapi/linphonecore.c:3435 +#: ../coreapi/linphonecore.c:3451 msgid "Modifying call parameters..." msgstr "Upravují se parametry hovoru…" -#: ../coreapi/linphonecore.c:3782 +#: ../coreapi/linphonecore.c:3798 msgid "Connected." msgstr "Připojeno." -#: ../coreapi/linphonecore.c:3807 +#: ../coreapi/linphonecore.c:3823 msgid "Call aborted" msgstr "Hovor přerušen" -#: ../coreapi/linphonecore.c:3997 +#: ../coreapi/linphonecore.c:4013 msgid "Could not pause the call" msgstr "Hovor nebylo možné odložit" -#: ../coreapi/linphonecore.c:4000 +#: ../coreapi/linphonecore.c:4016 msgid "Pausing the current call..." msgstr "Současný hovor se odkládá…" @@ -1948,11 +1952,11 @@ msgstr "" msgid "Authentication token is %s" msgstr "Klíč k ověření totožnosti je %s" -#: ../coreapi/linphonecall.c:1305 +#: ../coreapi/linphonecall.c:1306 msgid "Call parameters were successfully modified." msgstr "" -#: ../coreapi/linphonecall.c:3659 +#: ../coreapi/linphonecall.c:3660 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." diff --git a/po/de.po b/po/de.po index 1d5b4011b..7ed76bcf5 100644 --- a/po/de.po +++ b/po/de.po @@ -11,8 +11,8 @@ msgid "" msgstr "" "Project-Id-Version: linphone-gtk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-27 14:40+0100\n" -"PO-Revision-Date: 2015-03-27 13:40+0000\n" +"POT-Creation-Date: 2015-04-01 16:25+0200\n" +"PO-Revision-Date: 2015-04-01 14:26+0000\n" "Last-Translator: Belledonne Communications \n" "Language-Team: German (http://www.transifex.com/projects/p/linphone-gtk/language/de/)\n" "MIME-Version: 1.0\n" @@ -129,7 +129,7 @@ msgstr "Starte den Audio-Assistent" msgid "Run self test and exit 0 if succeed" msgstr "" -#: ../gtk/main.c:1059 +#: ../gtk/main.c:1069 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -137,76 +137,76 @@ msgid "" "If you answer no, this person will be temporarily blacklisted." msgstr "%s möchte Sie zu seiner Kontaktliste hinzufügen.\nMöchten Sie ihm erlauben, Ihren Anwesenheitsstatus zu sehen, oder ihn zu Ihrer Kontaktliste hinzufügen?\nWenn Sie mit Nein antworten, wird diese Person vorläufig blockiert." -#: ../gtk/main.c:1136 +#: ../gtk/main.c:1146 #, c-format msgid "" "Please enter your password for username %s\n" " at realm %s:" msgstr "Bitte geben Sie Ihr Passwort für den Benutzernamen %s\n für Bereich %s ein:" -#: ../gtk/main.c:1257 +#: ../gtk/main.c:1267 msgid "Call error" msgstr "Anruf fehlgeschlagen" -#: ../gtk/main.c:1260 ../coreapi/linphonecore.c:3826 +#: ../gtk/main.c:1270 ../coreapi/linphonecore.c:3842 msgid "Call ended" msgstr "Anruf beendet" -#: ../gtk/main.c:1263 ../coreapi/call_log.c:221 +#: ../gtk/main.c:1273 ../coreapi/call_log.c:221 msgid "Incoming call" msgstr "Eingehender Anruf" -#: ../gtk/main.c:1265 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 +#: ../gtk/main.c:1275 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 msgid "Answer" msgstr "Annehmen" -#: ../gtk/main.c:1267 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1277 ../gtk/main.ui.h:6 msgid "Decline" msgstr "Abweisen" -#: ../gtk/main.c:1273 +#: ../gtk/main.c:1283 msgid "Call paused" msgstr "Anruf wird gehalten" -#: ../gtk/main.c:1273 +#: ../gtk/main.c:1283 #, c-format msgid "by %s" msgstr "von %s" -#: ../gtk/main.c:1343 +#: ../gtk/main.c:1353 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "%s schlägt vor, eine Videoübertragung zu starten. Nehmen Sie an?" -#: ../gtk/main.c:1505 +#: ../gtk/main.c:1516 msgid "Website link" msgstr "Website-Verknüpfung" -#: ../gtk/main.c:1554 +#: ../gtk/main.c:1565 msgid "Linphone - a video internet phone" msgstr "Linphone - ein Internet-Video-Telefon" -#: ../gtk/main.c:1646 +#: ../gtk/main.c:1657 #, c-format msgid "%s (Default)" msgstr "%s (Vorgabe)" -#: ../gtk/main.c:1978 ../coreapi/callbacks.c:1057 +#: ../gtk/main.c:1989 ../coreapi/callbacks.c:1057 #, c-format msgid "We are transferred to %s" msgstr "Vermittlung nach %s" -#: ../gtk/main.c:1988 +#: ../gtk/main.c:1999 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." msgstr "Auf diesem Rechner können keine Soundkarten gefunden werden.\nSie können keine Audio-Anrufe tätigen oder entgegennehmen." -#: ../gtk/main.c:2136 +#: ../gtk/main.c:2147 msgid "A free SIP video-phone" msgstr "Ein freies SIP-Video-Telefon" -#: ../gtk/main.c:2241 +#: ../gtk/main.c:2252 #, c-format msgid "Hello\n" msgstr "" @@ -280,7 +280,7 @@ msgstr "Parameter" msgid "Enabled" msgstr "Freigegeben" -#: ../gtk/propertybox.c:622 ../gtk/propertybox.c:763 ../gtk/parameters.ui.h:17 +#: ../gtk/propertybox.c:622 ../gtk/propertybox.c:763 ../gtk/parameters.ui.h:20 msgid "Disabled" msgstr "Gesperrt" @@ -445,7 +445,7 @@ msgstr "Ich möchte eine URI zur Fernkonfiguration angeben" msgid "Enter your linphone.org username" msgstr "Geben Sie Ihren Benutzernamen bei linphone.org ein." -#: ../gtk/setupwizard.c:102 ../gtk/parameters.ui.h:81 ../gtk/ldap.ui.h:4 +#: ../gtk/setupwizard.c:102 ../gtk/parameters.ui.h:85 ../gtk/ldap.ui.h:4 msgid "Username:" msgstr "Benutzername:" @@ -1182,307 +1182,311 @@ msgid "C" msgstr "C" #: ../gtk/parameters.ui.h:11 +msgid "SIP (UDP)" +msgstr "SIP (UDP)" + +#: ../gtk/parameters.ui.h:12 +msgid "SIP (TCP)" +msgstr "SIP (TCP)" + +#: ../gtk/parameters.ui.h:13 +msgid "SIP (TLS)" +msgstr "SIP (TLS)" + +#: ../gtk/parameters.ui.h:14 msgid "Settings" msgstr "Einstellungen" -#: ../gtk/parameters.ui.h:12 +#: ../gtk/parameters.ui.h:15 msgid "Set Maximum Transmission Unit:" msgstr "Maximum Transmission Unit setzen:" -#: ../gtk/parameters.ui.h:13 +#: ../gtk/parameters.ui.h:16 msgid "Send DTMFs as SIP info" msgstr "DTMFs als SIP-Info senden" -#: ../gtk/parameters.ui.h:14 +#: ../gtk/parameters.ui.h:17 msgid "Allow IPv6" msgstr "" -#: ../gtk/parameters.ui.h:15 +#: ../gtk/parameters.ui.h:18 msgid "Transport" msgstr "Übertragung" -#: ../gtk/parameters.ui.h:16 +#: ../gtk/parameters.ui.h:19 msgid "SIP/UDP port" msgstr "SIP/UDP Port" -#: ../gtk/parameters.ui.h:18 +#: ../gtk/parameters.ui.h:21 msgid "Random" msgstr "" -#: ../gtk/parameters.ui.h:19 +#: ../gtk/parameters.ui.h:22 msgid "SIP/TCP port" msgstr "SIP/TCP Port" -#: ../gtk/parameters.ui.h:20 +#: ../gtk/parameters.ui.h:23 msgid "Audio RTP/UDP:" msgstr "Audio RTP/UDP:" -#: ../gtk/parameters.ui.h:21 +#: ../gtk/parameters.ui.h:24 msgid "Fixed" msgstr "Fest" -#: ../gtk/parameters.ui.h:22 +#: ../gtk/parameters.ui.h:25 msgid "Video RTP/UDP:" msgstr "Video RTP/UDP:" -#: ../gtk/parameters.ui.h:23 +#: ../gtk/parameters.ui.h:26 msgid "Media encryption type" msgstr "Verschlüsselungstyp der Medien" -#: ../gtk/parameters.ui.h:24 +#: ../gtk/parameters.ui.h:27 msgid "Media encryption is mandatory" msgstr "Medienverschlüsselung erzwingen" -#: ../gtk/parameters.ui.h:25 +#: ../gtk/parameters.ui.h:28 msgid "Tunnel" msgstr "Tunnel" -#: ../gtk/parameters.ui.h:26 +#: ../gtk/parameters.ui.h:29 msgid "DSCP fields" msgstr "DSCP-Felder" -#: ../gtk/parameters.ui.h:27 +#: ../gtk/parameters.ui.h:30 msgid "Network protocol and ports" msgstr "Netzwerkprotokoll und Ports" -#: ../gtk/parameters.ui.h:28 +#: ../gtk/parameters.ui.h:31 msgid "Direct connection to the Internet" msgstr "Direkte Verbindung ins Internet" -#: ../gtk/parameters.ui.h:29 +#: ../gtk/parameters.ui.h:32 msgid "Behind NAT / Firewall (specify gateway IP )" msgstr "Hinter NAT / Firewall (Gateway IP angeben)" -#: ../gtk/parameters.ui.h:30 +#: ../gtk/parameters.ui.h:33 msgid "Behind NAT / Firewall (use STUN to resolve)" msgstr "Hinter NAT / Firewall (STUN verwenden)" -#: ../gtk/parameters.ui.h:31 +#: ../gtk/parameters.ui.h:34 msgid "Behind NAT / Firewall (use ICE)" msgstr "Hinter NAT / Firewall (ICE verwenden)" -#: ../gtk/parameters.ui.h:32 +#: ../gtk/parameters.ui.h:35 msgid "Behind NAT / Firewall (use uPnP)" msgstr "Hinter NAT / Firewall (uPnP verwenden)" -#: ../gtk/parameters.ui.h:33 +#: ../gtk/parameters.ui.h:36 msgid "Public IP address:" msgstr "Öffentliche IP-Adresse:" -#: ../gtk/parameters.ui.h:34 +#: ../gtk/parameters.ui.h:37 msgid "Stun server:" msgstr "STUN-Server:" -#: ../gtk/parameters.ui.h:35 +#: ../gtk/parameters.ui.h:38 msgid "NAT and Firewall" msgstr "NAT und Firewall" -#: ../gtk/parameters.ui.h:36 +#: ../gtk/parameters.ui.h:39 msgid "Network settings" msgstr "Netzwerkeinstellungen" -#: ../gtk/parameters.ui.h:37 +#: ../gtk/parameters.ui.h:40 msgid "Ring sound:" msgstr "Klingelton:" -#: ../gtk/parameters.ui.h:38 +#: ../gtk/parameters.ui.h:41 msgid "ALSA special device (optional):" msgstr "Spezielles ALSA-Gerät (optional):" -#: ../gtk/parameters.ui.h:39 +#: ../gtk/parameters.ui.h:42 msgid "Capture device:" msgstr "Aufnahmegerät:" -#: ../gtk/parameters.ui.h:40 +#: ../gtk/parameters.ui.h:43 msgid "Ring device:" msgstr "Gerät für Klingelton:" -#: ../gtk/parameters.ui.h:41 +#: ../gtk/parameters.ui.h:44 msgid "Playback device:" msgstr "Wiedergabegerät:" -#: ../gtk/parameters.ui.h:42 +#: ../gtk/parameters.ui.h:45 msgid "Enable echo cancellation" msgstr "Echounterdrückung ein" -#: ../gtk/parameters.ui.h:43 +#: ../gtk/parameters.ui.h:46 msgid "Audio" msgstr "Audio" -#: ../gtk/parameters.ui.h:44 +#: ../gtk/parameters.ui.h:47 msgid "Video input device:" msgstr "Video-Aufnahmegerät:" -#: ../gtk/parameters.ui.h:45 +#: ../gtk/parameters.ui.h:48 msgid "Prefered video resolution:" msgstr "Bevorzugte Video-Auflösung:" -#: ../gtk/parameters.ui.h:46 +#: ../gtk/parameters.ui.h:49 msgid "Video output method:" msgstr "Methode zur Videoausgabe" -#: ../gtk/parameters.ui.h:47 +#: ../gtk/parameters.ui.h:50 msgid "Show camera preview" msgstr "" -#: ../gtk/parameters.ui.h:48 +#: ../gtk/parameters.ui.h:51 msgid "Video" msgstr "Video" -#: ../gtk/parameters.ui.h:49 +#: ../gtk/parameters.ui.h:52 msgid "Multimedia settings" msgstr "Multimedia-Einstellungen" -#: ../gtk/parameters.ui.h:50 +#: ../gtk/parameters.ui.h:53 msgid "This section defines your SIP address when not using a SIP account" msgstr "In diesem Bereich legen Sie Ihre SIP-Adresse fest, wenn Sie kein SIP-Konto verwenden." -#: ../gtk/parameters.ui.h:51 +#: ../gtk/parameters.ui.h:54 msgid "Your display name (eg: John Doe):" msgstr "Ihr angezeigter Name (z. B. Heinz Müller):" -#: ../gtk/parameters.ui.h:52 +#: ../gtk/parameters.ui.h:55 msgid "Your username:" msgstr "Ihr Benutzername:" -#: ../gtk/parameters.ui.h:53 +#: ../gtk/parameters.ui.h:56 msgid "Your resulting SIP address:" msgstr "Sich ergebende SIP-Adresse:" -#: ../gtk/parameters.ui.h:54 +#: ../gtk/parameters.ui.h:57 msgid "Default identity" msgstr "Standard-Identität" -#: ../gtk/parameters.ui.h:55 +#: ../gtk/parameters.ui.h:58 msgid "Wizard" msgstr "Assistent" -#: ../gtk/parameters.ui.h:56 +#: ../gtk/parameters.ui.h:59 msgid "Add" msgstr "Hinzufügen" -#: ../gtk/parameters.ui.h:57 +#: ../gtk/parameters.ui.h:60 msgid "Edit" msgstr "Bearbeiten" -#: ../gtk/parameters.ui.h:58 +#: ../gtk/parameters.ui.h:61 msgid "Remove" msgstr "Entfernen" -#: ../gtk/parameters.ui.h:59 +#: ../gtk/parameters.ui.h:62 msgid "Proxy accounts" msgstr "Proxy-Konten" -#: ../gtk/parameters.ui.h:60 +#: ../gtk/parameters.ui.h:63 msgid "Erase all passwords" msgstr "Alle Passwörter löschen" -#: ../gtk/parameters.ui.h:61 +#: ../gtk/parameters.ui.h:64 msgid "Privacy" msgstr "Privatsphäre" -#: ../gtk/parameters.ui.h:62 +#: ../gtk/parameters.ui.h:65 msgid "Automatically answer when a call is received" msgstr "" -#: ../gtk/parameters.ui.h:63 +#: ../gtk/parameters.ui.h:66 +msgid "Delay before answering (ms)" +msgstr "" + +#: ../gtk/parameters.ui.h:67 msgid "Auto-answer" msgstr "" -#: ../gtk/parameters.ui.h:64 +#: ../gtk/parameters.ui.h:68 msgid "Manage SIP Accounts" msgstr "SIP-Konten verwalten" -#: ../gtk/parameters.ui.h:65 ../gtk/tunnel_config.ui.h:4 +#: ../gtk/parameters.ui.h:69 ../gtk/tunnel_config.ui.h:4 msgid "Enable" msgstr "Freigeben" -#: ../gtk/parameters.ui.h:66 ../gtk/tunnel_config.ui.h:5 +#: ../gtk/parameters.ui.h:70 ../gtk/tunnel_config.ui.h:5 msgid "Disable" msgstr "Sperren" -#: ../gtk/parameters.ui.h:67 +#: ../gtk/parameters.ui.h:71 msgid "Codecs" msgstr "Codecs" -#: ../gtk/parameters.ui.h:68 +#: ../gtk/parameters.ui.h:72 msgid "0 stands for \"unlimited\"" msgstr "0 bedeutet „unbegrenzt“" -#: ../gtk/parameters.ui.h:69 +#: ../gtk/parameters.ui.h:73 msgid "Upload speed limit in Kbit/sec:" msgstr "Upload-Bandbreite (kbit/sec):" -#: ../gtk/parameters.ui.h:70 +#: ../gtk/parameters.ui.h:74 msgid "Download speed limit in Kbit/sec:" msgstr "Download-Bandbreite (kbit/sec):" -#: ../gtk/parameters.ui.h:71 +#: ../gtk/parameters.ui.h:75 msgid "Enable adaptive rate control" msgstr "Adaptive Ratenregelung ein" -#: ../gtk/parameters.ui.h:72 +#: ../gtk/parameters.ui.h:76 msgid "" "Adaptive rate control is a technique to dynamically guess the available " "bandwidth during a call." msgstr "Adaptive Ratenregelung ist eine Technik zur dynamischen Abschätzung der zur Verfügung stehenden Bandbreite während eines Anrufs." -#: ../gtk/parameters.ui.h:73 +#: ../gtk/parameters.ui.h:77 msgid "Bandwidth control" msgstr "Bandbreiten-Einstellungen" -#: ../gtk/parameters.ui.h:74 +#: ../gtk/parameters.ui.h:78 msgid "Codecs" msgstr "Codecs" -#: ../gtk/parameters.ui.h:75 +#: ../gtk/parameters.ui.h:79 msgid "Language" msgstr "Sprache" -#: ../gtk/parameters.ui.h:76 +#: ../gtk/parameters.ui.h:80 msgid "Show advanced settings" msgstr "Fortgeschrittene Einstellungen anzeigen" -#: ../gtk/parameters.ui.h:77 +#: ../gtk/parameters.ui.h:81 msgid "Level" msgstr "Detaillierung" -#: ../gtk/parameters.ui.h:78 +#: ../gtk/parameters.ui.h:82 msgid "User interface" msgstr "Benutzeroberfläche" -#: ../gtk/parameters.ui.h:79 ../gtk/ldap.ui.h:2 +#: ../gtk/parameters.ui.h:83 ../gtk/ldap.ui.h:2 msgid "Server address:" msgstr "Server-Adresse" -#: ../gtk/parameters.ui.h:80 ../gtk/ldap.ui.h:3 +#: ../gtk/parameters.ui.h:84 ../gtk/ldap.ui.h:3 msgid "Authentication method:" msgstr "Authentifizierungsmethode" -#: ../gtk/parameters.ui.h:82 +#: ../gtk/parameters.ui.h:86 msgid "LDAP Account setup" msgstr "LDAP-Kontoeinrichtung" -#: ../gtk/parameters.ui.h:83 +#: ../gtk/parameters.ui.h:87 msgid "LDAP" msgstr "LDAP" -#: ../gtk/parameters.ui.h:84 +#: ../gtk/parameters.ui.h:88 msgid "Done" msgstr "Fertig" -#: ../gtk/parameters.ui.h:85 -msgid "SIP (UDP)" -msgstr "SIP (UDP)" - -#: ../gtk/parameters.ui.h:86 -msgid "SIP (TCP)" -msgstr "SIP (TCP)" - -#: ../gtk/parameters.ui.h:87 -msgid "SIP (TLS)" -msgstr "SIP (TLS)" - #: ../gtk/buddylookup.ui.h:1 msgid "Search contacts in directory" msgstr "Kontakte im Verzeichnis suchen" @@ -1698,60 +1702,60 @@ msgstr "Einstellen..." msgid "Please wait while fetching configuration from server..." msgstr "Bitte warten Sie während die Einstellungen vom Server abgerufen werden..." -#: ../coreapi/linphonecore.c:1534 +#: ../coreapi/linphonecore.c:1538 msgid "Ready" msgstr "Bereit" -#: ../coreapi/linphonecore.c:2534 +#: ../coreapi/linphonecore.c:2550 msgid "Configuring" msgstr "Einstellen" -#: ../coreapi/linphonecore.c:2708 +#: ../coreapi/linphonecore.c:2724 msgid "Looking for telephone number destination..." msgstr "Telefonnummernziel wird gesucht..." -#: ../coreapi/linphonecore.c:2710 +#: ../coreapi/linphonecore.c:2726 msgid "Could not resolve this number." msgstr "Diese Nummer kann nicht aufgelöst werden." #. must be known at that time -#: ../coreapi/linphonecore.c:2996 +#: ../coreapi/linphonecore.c:3012 msgid "Contacting" msgstr "Verbindungsaufbau" -#: ../coreapi/linphonecore.c:3001 +#: ../coreapi/linphonecore.c:3017 msgid "Could not call" msgstr "Anruf kann nicht getätigt werden." -#: ../coreapi/linphonecore.c:3152 +#: ../coreapi/linphonecore.c:3168 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "Die maximale Anzahl der gleichzeitigen Anrufe ist erreicht." -#: ../coreapi/linphonecore.c:3310 +#: ../coreapi/linphonecore.c:3326 msgid "is contacting you" msgstr "ruft Sie an" -#: ../coreapi/linphonecore.c:3311 +#: ../coreapi/linphonecore.c:3327 msgid " and asked autoanswer." msgstr " und fragt nach automatischer Antwort." -#: ../coreapi/linphonecore.c:3435 +#: ../coreapi/linphonecore.c:3451 msgid "Modifying call parameters..." msgstr "Die Anrufparameter werden verändert..." -#: ../coreapi/linphonecore.c:3782 +#: ../coreapi/linphonecore.c:3798 msgid "Connected." msgstr "Verbunden." -#: ../coreapi/linphonecore.c:3807 +#: ../coreapi/linphonecore.c:3823 msgid "Call aborted" msgstr "Anruf abgebrochen" -#: ../coreapi/linphonecore.c:3997 +#: ../coreapi/linphonecore.c:4013 msgid "Could not pause the call" msgstr "Anruf kann nicht gehalten werden" -#: ../coreapi/linphonecore.c:4000 +#: ../coreapi/linphonecore.c:4016 msgid "Pausing the current call..." msgstr "Aktueller Anruf wird gehalten..." @@ -1947,11 +1951,11 @@ msgstr "Service nicht verfügbar, versuche erneut" msgid "Authentication token is %s" msgstr "Authentifizierungs-Token ist %s" -#: ../coreapi/linphonecall.c:1305 +#: ../coreapi/linphonecall.c:1306 msgid "Call parameters were successfully modified." msgstr "" -#: ../coreapi/linphonecall.c:3659 +#: ../coreapi/linphonecall.c:3660 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." diff --git a/po/es.po b/po/es.po index 3422f3896..8394b8241 100644 --- a/po/es.po +++ b/po/es.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: linphone-gtk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-27 14:40+0100\n" -"PO-Revision-Date: 2015-03-27 13:40+0000\n" +"POT-Creation-Date: 2015-04-01 16:25+0200\n" +"PO-Revision-Date: 2015-04-01 14:26+0000\n" "Last-Translator: Belledonne Communications \n" "Language-Team: Spanish (http://www.transifex.com/projects/p/linphone-gtk/language/es/)\n" "MIME-Version: 1.0\n" @@ -125,7 +125,7 @@ msgstr "" msgid "Run self test and exit 0 if succeed" msgstr "" -#: ../gtk/main.c:1059 +#: ../gtk/main.c:1069 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -133,76 +133,76 @@ msgid "" "If you answer no, this person will be temporarily blacklisted." msgstr "%s desea añadirle a su lista de contactos.\n¿Desea permitirle ver su estado de presencia o añadirle a su lista de contactos?\nSi responde no, esta persona será bloqueada temporalmente." -#: ../gtk/main.c:1136 +#: ../gtk/main.c:1146 #, c-format msgid "" "Please enter your password for username %s\n" " at realm %s:" msgstr "" -#: ../gtk/main.c:1257 +#: ../gtk/main.c:1267 msgid "Call error" msgstr "" -#: ../gtk/main.c:1260 ../coreapi/linphonecore.c:3826 +#: ../gtk/main.c:1270 ../coreapi/linphonecore.c:3842 msgid "Call ended" msgstr "" -#: ../gtk/main.c:1263 ../coreapi/call_log.c:221 +#: ../gtk/main.c:1273 ../coreapi/call_log.c:221 msgid "Incoming call" msgstr "Llamada entrante" -#: ../gtk/main.c:1265 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 +#: ../gtk/main.c:1275 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 msgid "Answer" msgstr "Contestar" -#: ../gtk/main.c:1267 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1277 ../gtk/main.ui.h:6 msgid "Decline" msgstr "" -#: ../gtk/main.c:1273 +#: ../gtk/main.c:1283 msgid "Call paused" msgstr "" -#: ../gtk/main.c:1273 +#: ../gtk/main.c:1283 #, c-format msgid "by %s" msgstr "" -#: ../gtk/main.c:1343 +#: ../gtk/main.c:1353 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1505 +#: ../gtk/main.c:1516 msgid "Website link" msgstr "Enlace a la Web" -#: ../gtk/main.c:1554 +#: ../gtk/main.c:1565 msgid "Linphone - a video internet phone" msgstr "Linphone - un video-teléfono a través de Internet" -#: ../gtk/main.c:1646 +#: ../gtk/main.c:1657 #, c-format msgid "%s (Default)" msgstr "%s (Opción predeterminada)" -#: ../gtk/main.c:1978 ../coreapi/callbacks.c:1057 +#: ../gtk/main.c:1989 ../coreapi/callbacks.c:1057 #, c-format msgid "We are transferred to %s" msgstr "Somos transferidos a %s" -#: ../gtk/main.c:1988 +#: ../gtk/main.c:1999 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." msgstr "No se ha encontrado una tarjeta de sonido en este equipo.\nNo será posible realizar o recibir llamadas de audio." -#: ../gtk/main.c:2136 +#: ../gtk/main.c:2147 msgid "A free SIP video-phone" msgstr "Un video-teléfono SIP gratuito" -#: ../gtk/main.c:2241 +#: ../gtk/main.c:2252 #, c-format msgid "Hello\n" msgstr "" @@ -276,7 +276,7 @@ msgstr "Parámetros" msgid "Enabled" msgstr "Activado" -#: ../gtk/propertybox.c:622 ../gtk/propertybox.c:763 ../gtk/parameters.ui.h:17 +#: ../gtk/propertybox.c:622 ../gtk/propertybox.c:763 ../gtk/parameters.ui.h:20 msgid "Disabled" msgstr "Desactivado" @@ -441,7 +441,7 @@ msgstr "" msgid "Enter your linphone.org username" msgstr "" -#: ../gtk/setupwizard.c:102 ../gtk/parameters.ui.h:81 ../gtk/ldap.ui.h:4 +#: ../gtk/setupwizard.c:102 ../gtk/parameters.ui.h:85 ../gtk/ldap.ui.h:4 msgid "Username:" msgstr "" @@ -1178,307 +1178,311 @@ msgid "C" msgstr "C" #: ../gtk/parameters.ui.h:11 +msgid "SIP (UDP)" +msgstr "SIP (UDP)" + +#: ../gtk/parameters.ui.h:12 +msgid "SIP (TCP)" +msgstr "SIP (TCP)" + +#: ../gtk/parameters.ui.h:13 +msgid "SIP (TLS)" +msgstr "SIP (TLS)" + +#: ../gtk/parameters.ui.h:14 msgid "Settings" msgstr "Configuración" -#: ../gtk/parameters.ui.h:12 +#: ../gtk/parameters.ui.h:15 msgid "Set Maximum Transmission Unit:" msgstr "Fijar Unidad de Transmisión Máxima:" -#: ../gtk/parameters.ui.h:13 +#: ../gtk/parameters.ui.h:16 msgid "Send DTMFs as SIP info" msgstr "Enviar DTMFs como información SIP" -#: ../gtk/parameters.ui.h:14 +#: ../gtk/parameters.ui.h:17 msgid "Allow IPv6" msgstr "" -#: ../gtk/parameters.ui.h:15 +#: ../gtk/parameters.ui.h:18 msgid "Transport" msgstr "" -#: ../gtk/parameters.ui.h:16 +#: ../gtk/parameters.ui.h:19 msgid "SIP/UDP port" msgstr "" -#: ../gtk/parameters.ui.h:18 +#: ../gtk/parameters.ui.h:21 msgid "Random" msgstr "" -#: ../gtk/parameters.ui.h:19 +#: ../gtk/parameters.ui.h:22 msgid "SIP/TCP port" msgstr "" -#: ../gtk/parameters.ui.h:20 +#: ../gtk/parameters.ui.h:23 msgid "Audio RTP/UDP:" msgstr "Audio RTP/UDP:" -#: ../gtk/parameters.ui.h:21 +#: ../gtk/parameters.ui.h:24 msgid "Fixed" msgstr "" -#: ../gtk/parameters.ui.h:22 +#: ../gtk/parameters.ui.h:25 msgid "Video RTP/UDP:" msgstr "Vídeo RTP/UDP" -#: ../gtk/parameters.ui.h:23 +#: ../gtk/parameters.ui.h:26 msgid "Media encryption type" msgstr "Tipo de cifrado de medios" -#: ../gtk/parameters.ui.h:24 +#: ../gtk/parameters.ui.h:27 msgid "Media encryption is mandatory" msgstr "" -#: ../gtk/parameters.ui.h:25 +#: ../gtk/parameters.ui.h:28 msgid "Tunnel" msgstr "" -#: ../gtk/parameters.ui.h:26 +#: ../gtk/parameters.ui.h:29 msgid "DSCP fields" msgstr "" -#: ../gtk/parameters.ui.h:27 +#: ../gtk/parameters.ui.h:30 msgid "Network protocol and ports" msgstr "Protocolo de red y puertos" -#: ../gtk/parameters.ui.h:28 +#: ../gtk/parameters.ui.h:31 msgid "Direct connection to the Internet" msgstr "Conexión directa a Internet" -#: ../gtk/parameters.ui.h:29 +#: ../gtk/parameters.ui.h:32 msgid "Behind NAT / Firewall (specify gateway IP )" msgstr "" -#: ../gtk/parameters.ui.h:30 +#: ../gtk/parameters.ui.h:33 msgid "Behind NAT / Firewall (use STUN to resolve)" msgstr "Tras un NAT/Firewall (utilizar STUN para resolver)" -#: ../gtk/parameters.ui.h:31 +#: ../gtk/parameters.ui.h:34 msgid "Behind NAT / Firewall (use ICE)" msgstr "" -#: ../gtk/parameters.ui.h:32 +#: ../gtk/parameters.ui.h:35 msgid "Behind NAT / Firewall (use uPnP)" msgstr "" -#: ../gtk/parameters.ui.h:33 +#: ../gtk/parameters.ui.h:36 msgid "Public IP address:" msgstr "" -#: ../gtk/parameters.ui.h:34 +#: ../gtk/parameters.ui.h:37 msgid "Stun server:" msgstr "" -#: ../gtk/parameters.ui.h:35 +#: ../gtk/parameters.ui.h:38 msgid "NAT and Firewall" msgstr "" -#: ../gtk/parameters.ui.h:36 +#: ../gtk/parameters.ui.h:39 msgid "Network settings" msgstr "" -#: ../gtk/parameters.ui.h:37 +#: ../gtk/parameters.ui.h:40 msgid "Ring sound:" msgstr "" -#: ../gtk/parameters.ui.h:38 +#: ../gtk/parameters.ui.h:41 msgid "ALSA special device (optional):" msgstr "Dispositivo especial ALSA (opcional):" -#: ../gtk/parameters.ui.h:39 +#: ../gtk/parameters.ui.h:42 msgid "Capture device:" msgstr "" -#: ../gtk/parameters.ui.h:40 +#: ../gtk/parameters.ui.h:43 msgid "Ring device:" msgstr "" -#: ../gtk/parameters.ui.h:41 +#: ../gtk/parameters.ui.h:44 msgid "Playback device:" msgstr "" -#: ../gtk/parameters.ui.h:42 +#: ../gtk/parameters.ui.h:45 msgid "Enable echo cancellation" msgstr "Activar cancelación de eco" -#: ../gtk/parameters.ui.h:43 +#: ../gtk/parameters.ui.h:46 msgid "Audio" msgstr "" -#: ../gtk/parameters.ui.h:44 +#: ../gtk/parameters.ui.h:47 msgid "Video input device:" msgstr "" -#: ../gtk/parameters.ui.h:45 +#: ../gtk/parameters.ui.h:48 msgid "Prefered video resolution:" msgstr "Resolución de vídeo preferida:" -#: ../gtk/parameters.ui.h:46 +#: ../gtk/parameters.ui.h:49 msgid "Video output method:" msgstr "" -#: ../gtk/parameters.ui.h:47 +#: ../gtk/parameters.ui.h:50 msgid "Show camera preview" msgstr "" -#: ../gtk/parameters.ui.h:48 +#: ../gtk/parameters.ui.h:51 msgid "Video" msgstr "" -#: ../gtk/parameters.ui.h:49 +#: ../gtk/parameters.ui.h:52 msgid "Multimedia settings" msgstr "Configuración multimedia" -#: ../gtk/parameters.ui.h:50 +#: ../gtk/parameters.ui.h:53 msgid "This section defines your SIP address when not using a SIP account" msgstr "Esta sección define su dirección SIP cuando no utiliza una cuenta SIP" -#: ../gtk/parameters.ui.h:51 +#: ../gtk/parameters.ui.h:54 msgid "Your display name (eg: John Doe):" msgstr "Su nombre a mostrar (x ej: Pepito Pérez):" -#: ../gtk/parameters.ui.h:52 +#: ../gtk/parameters.ui.h:55 msgid "Your username:" msgstr "" -#: ../gtk/parameters.ui.h:53 +#: ../gtk/parameters.ui.h:56 msgid "Your resulting SIP address:" msgstr "" -#: ../gtk/parameters.ui.h:54 +#: ../gtk/parameters.ui.h:57 msgid "Default identity" msgstr "" -#: ../gtk/parameters.ui.h:55 +#: ../gtk/parameters.ui.h:58 msgid "Wizard" msgstr "" -#: ../gtk/parameters.ui.h:56 +#: ../gtk/parameters.ui.h:59 msgid "Add" msgstr "Añadir" -#: ../gtk/parameters.ui.h:57 +#: ../gtk/parameters.ui.h:60 msgid "Edit" msgstr "Editar" -#: ../gtk/parameters.ui.h:58 +#: ../gtk/parameters.ui.h:61 msgid "Remove" msgstr "Eliminar" -#: ../gtk/parameters.ui.h:59 +#: ../gtk/parameters.ui.h:62 msgid "Proxy accounts" msgstr "" -#: ../gtk/parameters.ui.h:60 +#: ../gtk/parameters.ui.h:63 msgid "Erase all passwords" msgstr "Borrar todas las contraseñas" -#: ../gtk/parameters.ui.h:61 +#: ../gtk/parameters.ui.h:64 msgid "Privacy" msgstr "" -#: ../gtk/parameters.ui.h:62 +#: ../gtk/parameters.ui.h:65 msgid "Automatically answer when a call is received" msgstr "" -#: ../gtk/parameters.ui.h:63 +#: ../gtk/parameters.ui.h:66 +msgid "Delay before answering (ms)" +msgstr "" + +#: ../gtk/parameters.ui.h:67 msgid "Auto-answer" msgstr "" -#: ../gtk/parameters.ui.h:64 +#: ../gtk/parameters.ui.h:68 msgid "Manage SIP Accounts" msgstr "Gestionar cuentas SIP" -#: ../gtk/parameters.ui.h:65 ../gtk/tunnel_config.ui.h:4 +#: ../gtk/parameters.ui.h:69 ../gtk/tunnel_config.ui.h:4 msgid "Enable" msgstr "Activar" -#: ../gtk/parameters.ui.h:66 ../gtk/tunnel_config.ui.h:5 +#: ../gtk/parameters.ui.h:70 ../gtk/tunnel_config.ui.h:5 msgid "Disable" msgstr "Desactivar" -#: ../gtk/parameters.ui.h:67 +#: ../gtk/parameters.ui.h:71 msgid "Codecs" msgstr "" -#: ../gtk/parameters.ui.h:68 +#: ../gtk/parameters.ui.h:72 msgid "0 stands for \"unlimited\"" msgstr "0 significa \"ilimitado\"" -#: ../gtk/parameters.ui.h:69 +#: ../gtk/parameters.ui.h:73 msgid "Upload speed limit in Kbit/sec:" msgstr "Velocidad límite de subida en Kbit/seg" -#: ../gtk/parameters.ui.h:70 +#: ../gtk/parameters.ui.h:74 msgid "Download speed limit in Kbit/sec:" msgstr "Velocidad límite de descarga en Kbit/seg:" -#: ../gtk/parameters.ui.h:71 +#: ../gtk/parameters.ui.h:75 msgid "Enable adaptive rate control" msgstr "Activar control de frecuencia adaptativo" -#: ../gtk/parameters.ui.h:72 +#: ../gtk/parameters.ui.h:76 msgid "" "Adaptive rate control is a technique to dynamically guess the available " "bandwidth during a call." msgstr "Control de frecuencia adaptativo es una técnica que estima dinámicamente el ancho de banda disponible durante la llamada." -#: ../gtk/parameters.ui.h:73 +#: ../gtk/parameters.ui.h:77 msgid "Bandwidth control" msgstr "Control de ancho de banda" -#: ../gtk/parameters.ui.h:74 +#: ../gtk/parameters.ui.h:78 msgid "Codecs" msgstr "" -#: ../gtk/parameters.ui.h:75 +#: ../gtk/parameters.ui.h:79 msgid "Language" msgstr "" -#: ../gtk/parameters.ui.h:76 +#: ../gtk/parameters.ui.h:80 msgid "Show advanced settings" msgstr "Mostrar opciones avanzadas" -#: ../gtk/parameters.ui.h:77 +#: ../gtk/parameters.ui.h:81 msgid "Level" msgstr "" -#: ../gtk/parameters.ui.h:78 +#: ../gtk/parameters.ui.h:82 msgid "User interface" msgstr "" -#: ../gtk/parameters.ui.h:79 ../gtk/ldap.ui.h:2 +#: ../gtk/parameters.ui.h:83 ../gtk/ldap.ui.h:2 msgid "Server address:" msgstr "" -#: ../gtk/parameters.ui.h:80 ../gtk/ldap.ui.h:3 +#: ../gtk/parameters.ui.h:84 ../gtk/ldap.ui.h:3 msgid "Authentication method:" msgstr "" -#: ../gtk/parameters.ui.h:82 +#: ../gtk/parameters.ui.h:86 msgid "LDAP Account setup" msgstr "" -#: ../gtk/parameters.ui.h:83 +#: ../gtk/parameters.ui.h:87 msgid "LDAP" msgstr "" -#: ../gtk/parameters.ui.h:84 +#: ../gtk/parameters.ui.h:88 msgid "Done" msgstr "" -#: ../gtk/parameters.ui.h:85 -msgid "SIP (UDP)" -msgstr "SIP (UDP)" - -#: ../gtk/parameters.ui.h:86 -msgid "SIP (TCP)" -msgstr "SIP (TCP)" - -#: ../gtk/parameters.ui.h:87 -msgid "SIP (TLS)" -msgstr "SIP (TLS)" - #: ../gtk/buddylookup.ui.h:1 msgid "Search contacts in directory" msgstr "" @@ -1694,60 +1698,60 @@ msgstr "" msgid "Please wait while fetching configuration from server..." msgstr "" -#: ../coreapi/linphonecore.c:1534 +#: ../coreapi/linphonecore.c:1538 msgid "Ready" msgstr "" -#: ../coreapi/linphonecore.c:2534 +#: ../coreapi/linphonecore.c:2550 msgid "Configuring" msgstr "" -#: ../coreapi/linphonecore.c:2708 +#: ../coreapi/linphonecore.c:2724 msgid "Looking for telephone number destination..." msgstr "Buscando el número de teléfono del destinatario…" -#: ../coreapi/linphonecore.c:2710 +#: ../coreapi/linphonecore.c:2726 msgid "Could not resolve this number." msgstr "No se ha podido resolver este número." #. must be known at that time -#: ../coreapi/linphonecore.c:2996 +#: ../coreapi/linphonecore.c:3012 msgid "Contacting" msgstr "" -#: ../coreapi/linphonecore.c:3001 +#: ../coreapi/linphonecore.c:3017 msgid "Could not call" msgstr "" -#: ../coreapi/linphonecore.c:3152 +#: ../coreapi/linphonecore.c:3168 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "Disculpe, se ha alcanzado el máximo número de llamadas simultáneas" -#: ../coreapi/linphonecore.c:3310 +#: ../coreapi/linphonecore.c:3326 msgid "is contacting you" msgstr "" -#: ../coreapi/linphonecore.c:3311 +#: ../coreapi/linphonecore.c:3327 msgid " and asked autoanswer." msgstr "y ha solicitado auto respuesta." -#: ../coreapi/linphonecore.c:3435 +#: ../coreapi/linphonecore.c:3451 msgid "Modifying call parameters..." msgstr "Modificando parámetros de llamada…" -#: ../coreapi/linphonecore.c:3782 +#: ../coreapi/linphonecore.c:3798 msgid "Connected." msgstr "Conectado." -#: ../coreapi/linphonecore.c:3807 +#: ../coreapi/linphonecore.c:3823 msgid "Call aborted" msgstr "" -#: ../coreapi/linphonecore.c:3997 +#: ../coreapi/linphonecore.c:4013 msgid "Could not pause the call" msgstr "No se pudo pausar la llamada" -#: ../coreapi/linphonecore.c:4000 +#: ../coreapi/linphonecore.c:4016 msgid "Pausing the current call..." msgstr "Pausando la llamada actual..." @@ -1943,11 +1947,11 @@ msgstr "" msgid "Authentication token is %s" msgstr "" -#: ../coreapi/linphonecall.c:1305 +#: ../coreapi/linphonecall.c:1306 msgid "Call parameters were successfully modified." msgstr "" -#: ../coreapi/linphonecall.c:3659 +#: ../coreapi/linphonecall.c:3660 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." diff --git a/po/fr.po b/po/fr.po index 72b945b5e..f95029574 100644 --- a/po/fr.po +++ b/po/fr.po @@ -12,8 +12,8 @@ msgid "" msgstr "" "Project-Id-Version: linphone-gtk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-27 14:40+0100\n" -"PO-Revision-Date: 2015-03-27 13:51+0000\n" +"POT-Creation-Date: 2015-04-01 16:25+0200\n" +"PO-Revision-Date: 2015-04-15 07:34+0000\n" "Last-Translator: Belledonne Communications \n" "Language-Team: French (http://www.transifex.com/projects/p/linphone-gtk/language/fr/)\n" "MIME-Version: 1.0\n" @@ -130,7 +130,7 @@ msgstr "Démarre l'assistant audio" msgid "Run self test and exit 0 if succeed" msgstr "Exécuter le test local et retourner 0 en cas de succès" -#: ../gtk/main.c:1059 +#: ../gtk/main.c:1069 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -138,76 +138,76 @@ msgid "" "If you answer no, this person will be temporarily blacklisted." msgstr "%s souhaite vous ajouter à sa liste de contact.\nSouhaitez vous l'autoriser à voir votre information de présence et l'ajouter à votre liste également ?\nSi vous répondez non, cette personne sera mise temporairement sur liste noire." -#: ../gtk/main.c:1136 +#: ../gtk/main.c:1146 #, c-format msgid "" "Please enter your password for username %s\n" " at realm %s:" msgstr "Entrez le mot de passe pour %s\n sur le domaine %s:" -#: ../gtk/main.c:1257 +#: ../gtk/main.c:1267 msgid "Call error" msgstr "Erreur lors de l'appel" -#: ../gtk/main.c:1260 ../coreapi/linphonecore.c:3826 +#: ../gtk/main.c:1270 ../coreapi/linphonecore.c:3842 msgid "Call ended" msgstr "Appel terminé." -#: ../gtk/main.c:1263 ../coreapi/call_log.c:221 +#: ../gtk/main.c:1273 ../coreapi/call_log.c:221 msgid "Incoming call" msgstr "Appel entrant" -#: ../gtk/main.c:1265 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 +#: ../gtk/main.c:1275 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 msgid "Answer" msgstr "Répondre" -#: ../gtk/main.c:1267 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1277 ../gtk/main.ui.h:6 msgid "Decline" msgstr "Refuser" -#: ../gtk/main.c:1273 +#: ../gtk/main.c:1283 msgid "Call paused" msgstr "Appel en pause" -#: ../gtk/main.c:1273 +#: ../gtk/main.c:1283 #, c-format msgid "by %s" msgstr "b>par %s" -#: ../gtk/main.c:1343 +#: ../gtk/main.c:1353 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "%s propose de démarrer la vidéo. Acceptez-vous ?" -#: ../gtk/main.c:1505 +#: ../gtk/main.c:1516 msgid "Website link" msgstr "Lien site web" -#: ../gtk/main.c:1554 +#: ../gtk/main.c:1565 msgid "Linphone - a video internet phone" msgstr "Linphone - un téléphone video pour l'internet" -#: ../gtk/main.c:1646 +#: ../gtk/main.c:1657 #, c-format msgid "%s (Default)" msgstr "%s (par défaut)" -#: ../gtk/main.c:1978 ../coreapi/callbacks.c:1057 +#: ../gtk/main.c:1989 ../coreapi/callbacks.c:1057 #, c-format msgid "We are transferred to %s" msgstr "Transfert vers %s" -#: ../gtk/main.c:1988 +#: ../gtk/main.c:1999 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." msgstr "Aucune carte son n'a été détectée sur cet ordinateur.\nVous ne pourrez pas effectuer d'appels audio." -#: ../gtk/main.c:2136 +#: ../gtk/main.c:2147 msgid "A free SIP video-phone" msgstr "Un visiophone libre" -#: ../gtk/main.c:2241 +#: ../gtk/main.c:2252 #, c-format msgid "Hello\n" msgstr "Bonjour\n" @@ -281,7 +281,7 @@ msgstr "Paramètres" msgid "Enabled" msgstr "Activé" -#: ../gtk/propertybox.c:622 ../gtk/propertybox.c:763 ../gtk/parameters.ui.h:17 +#: ../gtk/propertybox.c:622 ../gtk/propertybox.c:763 ../gtk/parameters.ui.h:20 msgid "Disabled" msgstr "Désactivé" @@ -446,7 +446,7 @@ msgstr "Je veux spécifier une URI de configuration" msgid "Enter your linphone.org username" msgstr "Entrez votre identifiant linphone.org" -#: ../gtk/setupwizard.c:102 ../gtk/parameters.ui.h:81 ../gtk/ldap.ui.h:4 +#: ../gtk/setupwizard.c:102 ../gtk/parameters.ui.h:85 ../gtk/ldap.ui.h:4 msgid "Username:" msgstr "Nom d'utilisateur:" @@ -980,7 +980,7 @@ msgstr "Appels récents" #: ../gtk/main.ui.h:40 msgid "My current identity:" -msgstr "Mon identité sip:" +msgstr "Mon identité SIP :" #: ../gtk/main.ui.h:41 ../gtk/tunnel_config.ui.h:7 msgid "Username" @@ -1088,7 +1088,7 @@ msgstr "Linphone - Configurer un compte SIP" #: ../gtk/sip_account.ui.h:2 msgid "Your SIP identity:" -msgstr "Votre identité SIP:" +msgstr "Votre identité SIP :" #: ../gtk/sip_account.ui.h:3 msgid "Looks like sip:@" @@ -1183,307 +1183,311 @@ msgid "C" msgstr "C" #: ../gtk/parameters.ui.h:11 +msgid "SIP (UDP)" +msgstr "SIP (UDP)" + +#: ../gtk/parameters.ui.h:12 +msgid "SIP (TCP)" +msgstr "SIP (TCP)" + +#: ../gtk/parameters.ui.h:13 +msgid "SIP (TLS)" +msgstr "SIP (TLS)" + +#: ../gtk/parameters.ui.h:14 msgid "Settings" msgstr "Réglages" -#: ../gtk/parameters.ui.h:12 +#: ../gtk/parameters.ui.h:15 msgid "Set Maximum Transmission Unit:" msgstr "Spécifier la Maximum Transmission Unit" -#: ../gtk/parameters.ui.h:13 +#: ../gtk/parameters.ui.h:16 msgid "Send DTMFs as SIP info" msgstr "Envoyer les digits en tant que SIP INFO" -#: ../gtk/parameters.ui.h:14 +#: ../gtk/parameters.ui.h:17 msgid "Allow IPv6" msgstr "Utiliser IPv6" -#: ../gtk/parameters.ui.h:15 +#: ../gtk/parameters.ui.h:18 msgid "Transport" msgstr "Transport" -#: ../gtk/parameters.ui.h:16 +#: ../gtk/parameters.ui.h:19 msgid "SIP/UDP port" msgstr "Port SIP / UDP" -#: ../gtk/parameters.ui.h:18 +#: ../gtk/parameters.ui.h:21 msgid "Random" msgstr "Aléatoire" -#: ../gtk/parameters.ui.h:19 +#: ../gtk/parameters.ui.h:22 msgid "SIP/TCP port" msgstr "Port SIP / TCP" -#: ../gtk/parameters.ui.h:20 +#: ../gtk/parameters.ui.h:23 msgid "Audio RTP/UDP:" msgstr "Audio RTP / UDP :" -#: ../gtk/parameters.ui.h:21 +#: ../gtk/parameters.ui.h:24 msgid "Fixed" msgstr "Fixe" -#: ../gtk/parameters.ui.h:22 +#: ../gtk/parameters.ui.h:25 msgid "Video RTP/UDP:" msgstr "Vidéo RTP / UDP :" -#: ../gtk/parameters.ui.h:23 +#: ../gtk/parameters.ui.h:26 msgid "Media encryption type" msgstr "Type d'encryption media" -#: ../gtk/parameters.ui.h:24 +#: ../gtk/parameters.ui.h:27 msgid "Media encryption is mandatory" msgstr "Le chiffrement media est obligatoire" -#: ../gtk/parameters.ui.h:25 +#: ../gtk/parameters.ui.h:28 msgid "Tunnel" msgstr "Tunnel" -#: ../gtk/parameters.ui.h:26 +#: ../gtk/parameters.ui.h:29 msgid "DSCP fields" msgstr "Champs DSCP" -#: ../gtk/parameters.ui.h:27 +#: ../gtk/parameters.ui.h:30 msgid "Network protocol and ports" msgstr "Protocoles réseaux et ports" -#: ../gtk/parameters.ui.h:28 +#: ../gtk/parameters.ui.h:31 msgid "Direct connection to the Internet" msgstr "Connexion directe à l'Internet" -#: ../gtk/parameters.ui.h:29 +#: ../gtk/parameters.ui.h:32 msgid "Behind NAT / Firewall (specify gateway IP )" msgstr "Derrière un pare-feu (spécifier la passerelle ci dessous)" -#: ../gtk/parameters.ui.h:30 +#: ../gtk/parameters.ui.h:33 msgid "Behind NAT / Firewall (use STUN to resolve)" msgstr "Derrière un pare-feu (utiliser STUN)" -#: ../gtk/parameters.ui.h:31 +#: ../gtk/parameters.ui.h:34 msgid "Behind NAT / Firewall (use ICE)" msgstr "Derrière un pare-feu (utiliser ICE)" -#: ../gtk/parameters.ui.h:32 +#: ../gtk/parameters.ui.h:35 msgid "Behind NAT / Firewall (use uPnP)" msgstr "Derrière un pare-feu (utiliser uPnP)" -#: ../gtk/parameters.ui.h:33 +#: ../gtk/parameters.ui.h:36 msgid "Public IP address:" msgstr "Adresse IP publique:" -#: ../gtk/parameters.ui.h:34 +#: ../gtk/parameters.ui.h:37 msgid "Stun server:" msgstr "Serveur STUN:" -#: ../gtk/parameters.ui.h:35 +#: ../gtk/parameters.ui.h:38 msgid "NAT and Firewall" msgstr "Paramètres liés au pare-feu" -#: ../gtk/parameters.ui.h:36 +#: ../gtk/parameters.ui.h:39 msgid "Network settings" msgstr "Paramètres réseau" -#: ../gtk/parameters.ui.h:37 +#: ../gtk/parameters.ui.h:40 msgid "Ring sound:" msgstr "Sonnerie:" -#: ../gtk/parameters.ui.h:38 +#: ../gtk/parameters.ui.h:41 msgid "ALSA special device (optional):" msgstr "Appareil ALSA spécifique (optionnel) :" -#: ../gtk/parameters.ui.h:39 +#: ../gtk/parameters.ui.h:42 msgid "Capture device:" msgstr "Périphérique de capture:" -#: ../gtk/parameters.ui.h:40 +#: ../gtk/parameters.ui.h:43 msgid "Ring device:" msgstr "Périphérique de sonnerie:" -#: ../gtk/parameters.ui.h:41 +#: ../gtk/parameters.ui.h:44 msgid "Playback device:" msgstr "Périphérique d'écoute:" -#: ../gtk/parameters.ui.h:42 +#: ../gtk/parameters.ui.h:45 msgid "Enable echo cancellation" msgstr "Activer l'annulation d'écho" -#: ../gtk/parameters.ui.h:43 +#: ../gtk/parameters.ui.h:46 msgid "Audio" msgstr "Son" -#: ../gtk/parameters.ui.h:44 +#: ../gtk/parameters.ui.h:47 msgid "Video input device:" msgstr "Périphérique d'entrée vidéo" -#: ../gtk/parameters.ui.h:45 +#: ../gtk/parameters.ui.h:48 msgid "Prefered video resolution:" msgstr "Résolution de vidéo préférée:" -#: ../gtk/parameters.ui.h:46 +#: ../gtk/parameters.ui.h:49 msgid "Video output method:" msgstr "Type de rendu video:" -#: ../gtk/parameters.ui.h:47 +#: ../gtk/parameters.ui.h:50 msgid "Show camera preview" msgstr "Afficher la vidéo" -#: ../gtk/parameters.ui.h:48 +#: ../gtk/parameters.ui.h:51 msgid "Video" msgstr "Video" -#: ../gtk/parameters.ui.h:49 +#: ../gtk/parameters.ui.h:52 msgid "Multimedia settings" msgstr "Paramètres multimedia" -#: ../gtk/parameters.ui.h:50 +#: ../gtk/parameters.ui.h:53 msgid "This section defines your SIP address when not using a SIP account" msgstr "Cette rubrique permet de définir son adresse SIP lorsqu'on ne possède pas de compte SIP" -#: ../gtk/parameters.ui.h:51 +#: ../gtk/parameters.ui.h:54 msgid "Your display name (eg: John Doe):" msgstr "Votre nom d'affichage (ex: John Doe)" -#: ../gtk/parameters.ui.h:52 +#: ../gtk/parameters.ui.h:55 msgid "Your username:" msgstr "Votre nom d'utilisateur:" -#: ../gtk/parameters.ui.h:53 +#: ../gtk/parameters.ui.h:56 msgid "Your resulting SIP address:" msgstr "Votre adresse SIP:" -#: ../gtk/parameters.ui.h:54 +#: ../gtk/parameters.ui.h:57 msgid "Default identity" msgstr "Identité par défaut" -#: ../gtk/parameters.ui.h:55 +#: ../gtk/parameters.ui.h:58 msgid "Wizard" msgstr "Assistant" -#: ../gtk/parameters.ui.h:56 +#: ../gtk/parameters.ui.h:59 msgid "Add" msgstr "Ajouter" -#: ../gtk/parameters.ui.h:57 +#: ../gtk/parameters.ui.h:60 msgid "Edit" msgstr "Editer" -#: ../gtk/parameters.ui.h:58 +#: ../gtk/parameters.ui.h:61 msgid "Remove" msgstr "Enlever" -#: ../gtk/parameters.ui.h:59 +#: ../gtk/parameters.ui.h:62 msgid "Proxy accounts" msgstr "Comptes SIP via des proxy" -#: ../gtk/parameters.ui.h:60 +#: ../gtk/parameters.ui.h:63 msgid "Erase all passwords" msgstr "Effacer tous les mots de passe" -#: ../gtk/parameters.ui.h:61 +#: ../gtk/parameters.ui.h:64 msgid "Privacy" msgstr "Sécurité" -#: ../gtk/parameters.ui.h:62 +#: ../gtk/parameters.ui.h:65 msgid "Automatically answer when a call is received" msgstr "Répondre automatiquement aux appels entrants" -#: ../gtk/parameters.ui.h:63 +#: ../gtk/parameters.ui.h:66 +msgid "Delay before answering (ms)" +msgstr "Temps d'attente avant réponse (ms)" + +#: ../gtk/parameters.ui.h:67 msgid "Auto-answer" msgstr "Décrochage automatique" -#: ../gtk/parameters.ui.h:64 +#: ../gtk/parameters.ui.h:68 msgid "Manage SIP Accounts" msgstr "Gérer mes comptes SIP" -#: ../gtk/parameters.ui.h:65 ../gtk/tunnel_config.ui.h:4 +#: ../gtk/parameters.ui.h:69 ../gtk/tunnel_config.ui.h:4 msgid "Enable" msgstr "Activer" -#: ../gtk/parameters.ui.h:66 ../gtk/tunnel_config.ui.h:5 +#: ../gtk/parameters.ui.h:70 ../gtk/tunnel_config.ui.h:5 msgid "Disable" msgstr "Désactiver" -#: ../gtk/parameters.ui.h:67 +#: ../gtk/parameters.ui.h:71 msgid "Codecs" msgstr "Codecs" -#: ../gtk/parameters.ui.h:68 +#: ../gtk/parameters.ui.h:72 msgid "0 stands for \"unlimited\"" msgstr "Indiquez 0 pour ne pas mettre de limite" -#: ../gtk/parameters.ui.h:69 +#: ../gtk/parameters.ui.h:73 msgid "Upload speed limit in Kbit/sec:" msgstr "Limite de débit montant en kbits/sec:" -#: ../gtk/parameters.ui.h:70 +#: ../gtk/parameters.ui.h:74 msgid "Download speed limit in Kbit/sec:" msgstr "Limite de débit descendant en kbits/sec:" -#: ../gtk/parameters.ui.h:71 +#: ../gtk/parameters.ui.h:75 msgid "Enable adaptive rate control" msgstr "Activer le control de débit adaptatif." -#: ../gtk/parameters.ui.h:72 +#: ../gtk/parameters.ui.h:76 msgid "" "Adaptive rate control is a technique to dynamically guess the available " "bandwidth during a call." msgstr "Le control de débit adaptatif est une technique pour adapter la qualité de l'audio et de la video en fonction de la bande passante disponible, durant l'appel." -#: ../gtk/parameters.ui.h:73 +#: ../gtk/parameters.ui.h:77 msgid "Bandwidth control" msgstr "Gestion de la bande passante" -#: ../gtk/parameters.ui.h:74 +#: ../gtk/parameters.ui.h:78 msgid "Codecs" msgstr "Codecs" -#: ../gtk/parameters.ui.h:75 +#: ../gtk/parameters.ui.h:79 msgid "Language" msgstr "Langue" -#: ../gtk/parameters.ui.h:76 +#: ../gtk/parameters.ui.h:80 msgid "Show advanced settings" msgstr "Montrer les réglages avancés" -#: ../gtk/parameters.ui.h:77 +#: ../gtk/parameters.ui.h:81 msgid "Level" msgstr "Niveau" -#: ../gtk/parameters.ui.h:78 +#: ../gtk/parameters.ui.h:82 msgid "User interface" msgstr "Interface utilisateur" -#: ../gtk/parameters.ui.h:79 ../gtk/ldap.ui.h:2 +#: ../gtk/parameters.ui.h:83 ../gtk/ldap.ui.h:2 msgid "Server address:" msgstr "Adresse du serveur:" -#: ../gtk/parameters.ui.h:80 ../gtk/ldap.ui.h:3 +#: ../gtk/parameters.ui.h:84 ../gtk/ldap.ui.h:3 msgid "Authentication method:" msgstr "Méthode d'authentification:" -#: ../gtk/parameters.ui.h:82 +#: ../gtk/parameters.ui.h:86 msgid "LDAP Account setup" msgstr "Configuration LDAP" -#: ../gtk/parameters.ui.h:83 +#: ../gtk/parameters.ui.h:87 msgid "LDAP" msgstr "LDAP" -#: ../gtk/parameters.ui.h:84 +#: ../gtk/parameters.ui.h:88 msgid "Done" msgstr "Fermer" -#: ../gtk/parameters.ui.h:85 -msgid "SIP (UDP)" -msgstr "SIP (UDP)" - -#: ../gtk/parameters.ui.h:86 -msgid "SIP (TCP)" -msgstr "SIP (TCP)" - -#: ../gtk/parameters.ui.h:87 -msgid "SIP (TLS)" -msgstr "SIP (TLS)" - #: ../gtk/buddylookup.ui.h:1 msgid "Search contacts in directory" msgstr "Rechercher dans l'annuaire" @@ -1699,60 +1703,60 @@ msgstr "Configuration en cours" msgid "Please wait while fetching configuration from server..." msgstr "Veuillez patenter un instant pendant le chargement de la configuration distante..." -#: ../coreapi/linphonecore.c:1534 +#: ../coreapi/linphonecore.c:1538 msgid "Ready" msgstr "Prêt." -#: ../coreapi/linphonecore.c:2534 +#: ../coreapi/linphonecore.c:2550 msgid "Configuring" msgstr "Configuration en cours" -#: ../coreapi/linphonecore.c:2708 +#: ../coreapi/linphonecore.c:2724 msgid "Looking for telephone number destination..." msgstr "Recherche de la destination du numéro de téléphone..." -#: ../coreapi/linphonecore.c:2710 +#: ../coreapi/linphonecore.c:2726 msgid "Could not resolve this number." msgstr "La destination n'a pu être trouvée." #. must be known at that time -#: ../coreapi/linphonecore.c:2996 +#: ../coreapi/linphonecore.c:3012 msgid "Contacting" msgstr "Appel de" -#: ../coreapi/linphonecore.c:3001 +#: ../coreapi/linphonecore.c:3017 msgid "Could not call" msgstr "Echec de l'appel" -#: ../coreapi/linphonecore.c:3152 +#: ../coreapi/linphonecore.c:3168 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "Désolé, le nombre maximum d'appels simultanés est atteint." -#: ../coreapi/linphonecore.c:3310 +#: ../coreapi/linphonecore.c:3326 msgid "is contacting you" msgstr "vous appelle" -#: ../coreapi/linphonecore.c:3311 +#: ../coreapi/linphonecore.c:3327 msgid " and asked autoanswer." msgstr "et sollicite un décrochage automatique." -#: ../coreapi/linphonecore.c:3435 +#: ../coreapi/linphonecore.c:3451 msgid "Modifying call parameters..." msgstr "Modifications des paramètres d'appels..." -#: ../coreapi/linphonecore.c:3782 +#: ../coreapi/linphonecore.c:3798 msgid "Connected." msgstr "En ligne." -#: ../coreapi/linphonecore.c:3807 +#: ../coreapi/linphonecore.c:3823 msgid "Call aborted" msgstr "Appel abandonné" -#: ../coreapi/linphonecore.c:3997 +#: ../coreapi/linphonecore.c:4013 msgid "Could not pause the call" msgstr "La mise en attente a échoué" -#: ../coreapi/linphonecore.c:4000 +#: ../coreapi/linphonecore.c:4016 msgid "Pausing the current call..." msgstr "Mise en attente de l'appel..." @@ -1826,7 +1830,7 @@ msgstr "L'adresse SIP du proxy est invalide. Elle doit commencer par \"sip:\" su msgid "" "The sip identity you entered is invalid.\n" "It should look like sip:username@proxydomain, such as sip:alice@example.net" -msgstr "L'identité SIP que vous avez fourni est invalide.\nElle doit être de la forme sip:username@domain, comme par example sip:alice@example.net" +msgstr "L'identité SIP que vous avez fourni est invalide.\nElle doit être de la forme sip:utilisateur@domaine, comme par exemple sip:alice@example.net" #: ../coreapi/proxy.c:1416 #, c-format @@ -1948,11 +1952,11 @@ msgstr "Service indisponible, nouvelle tentative" msgid "Authentication token is %s" msgstr "Le jeton d'authentification est %s" -#: ../coreapi/linphonecall.c:1305 +#: ../coreapi/linphonecall.c:1306 msgid "Call parameters were successfully modified." msgstr "Les paramètres d'appel ont été modifiés avec succès." -#: ../coreapi/linphonecall.c:3659 +#: ../coreapi/linphonecall.c:3660 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." diff --git a/po/he.po b/po/he.po index d0730fa4f..8b7e19670 100644 --- a/po/he.po +++ b/po/he.po @@ -12,8 +12,8 @@ msgid "" msgstr "" "Project-Id-Version: linphone-gtk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-27 14:40+0100\n" -"PO-Revision-Date: 2015-03-27 13:40+0000\n" +"POT-Creation-Date: 2015-04-01 16:25+0200\n" +"PO-Revision-Date: 2015-04-01 14:26+0000\n" "Last-Translator: Belledonne Communications \n" "Language-Team: Hebrew (http://www.transifex.com/projects/p/linphone-gtk/language/he/)\n" "MIME-Version: 1.0\n" @@ -130,7 +130,7 @@ msgstr "" msgid "Run self test and exit 0 if succeed" msgstr "" -#: ../gtk/main.c:1059 +#: ../gtk/main.c:1069 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -138,76 +138,76 @@ msgid "" "If you answer no, this person will be temporarily blacklisted." msgstr "‫%s מעוניין להוסיפך אל רשימת אנשי הקשר שלו.\nהאם ברצונך להרשות להם לראות את מצב נוכחותך או להוסיפם אל רשימת אנשי הקשר שלך ?\nהיה ותשובתך תהיה לא, אדם זה יהיה מסומן באופן זמני ברשימה השחורה." -#: ../gtk/main.c:1136 +#: ../gtk/main.c:1146 #, c-format msgid "" "Please enter your password for username %s\n" " at realm %s:" msgstr "אנא הזן סיסמה עבור משתמש %s\nבמתחם %s:" -#: ../gtk/main.c:1257 +#: ../gtk/main.c:1267 msgid "Call error" msgstr "שגיאת קריאה" -#: ../gtk/main.c:1260 ../coreapi/linphonecore.c:3826 +#: ../gtk/main.c:1270 ../coreapi/linphonecore.c:3842 msgid "Call ended" msgstr "שיחה הסתיימה" -#: ../gtk/main.c:1263 ../coreapi/call_log.c:221 +#: ../gtk/main.c:1273 ../coreapi/call_log.c:221 msgid "Incoming call" msgstr "קריאה נכנסת" -#: ../gtk/main.c:1265 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 +#: ../gtk/main.c:1275 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 msgid "Answer" msgstr "לענות" -#: ../gtk/main.c:1267 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1277 ../gtk/main.ui.h:6 msgid "Decline" msgstr "לדחות" -#: ../gtk/main.c:1273 +#: ../gtk/main.c:1283 msgid "Call paused" msgstr "שיחה הושהתה" -#: ../gtk/main.c:1273 +#: ../gtk/main.c:1283 #, c-format msgid "by %s" msgstr "על ידי %s" -#: ../gtk/main.c:1343 +#: ../gtk/main.c:1353 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "‏%s רוצה להתחיל וידאו. האם אתה מסכים ?" -#: ../gtk/main.c:1505 +#: ../gtk/main.c:1516 msgid "Website link" msgstr "קישור אתר רשת" -#: ../gtk/main.c:1554 +#: ../gtk/main.c:1565 msgid "Linphone - a video internet phone" msgstr "‫Linphone - וידאופון אינטרנטי" -#: ../gtk/main.c:1646 +#: ../gtk/main.c:1657 #, c-format msgid "%s (Default)" msgstr "‫%s (ברירת מחדל)" -#: ../gtk/main.c:1978 ../coreapi/callbacks.c:1057 +#: ../gtk/main.c:1989 ../coreapi/callbacks.c:1057 #, c-format msgid "We are transferred to %s" msgstr "אנחנו מועברים אל %s" -#: ../gtk/main.c:1988 +#: ../gtk/main.c:1999 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." msgstr "לא אותרו כרטיסי קול במחשב זה.\nלא תהיה ביכולתך לשלוח או לקבל שיחות אודיו." -#: ../gtk/main.c:2136 +#: ../gtk/main.c:2147 msgid "A free SIP video-phone" msgstr "וידאופון SIP חופשי" -#: ../gtk/main.c:2241 +#: ../gtk/main.c:2252 #, c-format msgid "Hello\n" msgstr "" @@ -281,7 +281,7 @@ msgstr "פרמטרים" msgid "Enabled" msgstr "מופעל" -#: ../gtk/propertybox.c:622 ../gtk/propertybox.c:763 ../gtk/parameters.ui.h:17 +#: ../gtk/propertybox.c:622 ../gtk/propertybox.c:763 ../gtk/parameters.ui.h:20 msgid "Disabled" msgstr "לא מופעל" @@ -446,7 +446,7 @@ msgstr "" msgid "Enter your linphone.org username" msgstr "הזן את שם משתמשך אצל linphone.org" -#: ../gtk/setupwizard.c:102 ../gtk/parameters.ui.h:81 ../gtk/ldap.ui.h:4 +#: ../gtk/setupwizard.c:102 ../gtk/parameters.ui.h:85 ../gtk/ldap.ui.h:4 msgid "Username:" msgstr "שם משתמש:" @@ -1183,307 +1183,311 @@ msgid "C" msgstr "" #: ../gtk/parameters.ui.h:11 +msgid "SIP (UDP)" +msgstr "‏SIP ‏(UDP)" + +#: ../gtk/parameters.ui.h:12 +msgid "SIP (TCP)" +msgstr "‏SIP ‏(TCP)" + +#: ../gtk/parameters.ui.h:13 +msgid "SIP (TLS)" +msgstr "‏SIP ‏(TLS)" + +#: ../gtk/parameters.ui.h:14 msgid "Settings" msgstr "הגדרות" -#: ../gtk/parameters.ui.h:12 +#: ../gtk/parameters.ui.h:15 msgid "Set Maximum Transmission Unit:" msgstr "הגדר יחידת תמסורת מרבית:" -#: ../gtk/parameters.ui.h:13 +#: ../gtk/parameters.ui.h:16 msgid "Send DTMFs as SIP info" msgstr "שלח טזמ״תים (DTMFs) כמידע SIP" -#: ../gtk/parameters.ui.h:14 +#: ../gtk/parameters.ui.h:17 msgid "Allow IPv6" msgstr "" -#: ../gtk/parameters.ui.h:15 +#: ../gtk/parameters.ui.h:18 msgid "Transport" msgstr "טרנספורט" -#: ../gtk/parameters.ui.h:16 +#: ../gtk/parameters.ui.h:19 msgid "SIP/UDP port" msgstr "" -#: ../gtk/parameters.ui.h:18 +#: ../gtk/parameters.ui.h:21 msgid "Random" msgstr "" -#: ../gtk/parameters.ui.h:19 +#: ../gtk/parameters.ui.h:22 msgid "SIP/TCP port" msgstr "" -#: ../gtk/parameters.ui.h:20 +#: ../gtk/parameters.ui.h:23 msgid "Audio RTP/UDP:" msgstr "אודיו RTP/UDP:" -#: ../gtk/parameters.ui.h:21 +#: ../gtk/parameters.ui.h:24 msgid "Fixed" msgstr "מקובע" -#: ../gtk/parameters.ui.h:22 +#: ../gtk/parameters.ui.h:25 msgid "Video RTP/UDP:" msgstr "וידאו RTP/UDP:" -#: ../gtk/parameters.ui.h:23 +#: ../gtk/parameters.ui.h:26 msgid "Media encryption type" msgstr "סוג הצפנת מדיה" -#: ../gtk/parameters.ui.h:24 +#: ../gtk/parameters.ui.h:27 msgid "Media encryption is mandatory" msgstr "הצפנת מדיה הינה מנדטורית" -#: ../gtk/parameters.ui.h:25 +#: ../gtk/parameters.ui.h:28 msgid "Tunnel" msgstr "מינהור" -#: ../gtk/parameters.ui.h:26 +#: ../gtk/parameters.ui.h:29 msgid "DSCP fields" msgstr "שדות DSCP" -#: ../gtk/parameters.ui.h:27 +#: ../gtk/parameters.ui.h:30 msgid "Network protocol and ports" msgstr "פרוטוקולי רשת תקשורת ופורטים" -#: ../gtk/parameters.ui.h:28 +#: ../gtk/parameters.ui.h:31 msgid "Direct connection to the Internet" msgstr "חיבור ישיר אל האינטרנט" -#: ../gtk/parameters.ui.h:29 +#: ../gtk/parameters.ui.h:32 msgid "Behind NAT / Firewall (specify gateway IP )" msgstr "" -#: ../gtk/parameters.ui.h:30 +#: ../gtk/parameters.ui.h:33 msgid "Behind NAT / Firewall (use STUN to resolve)" msgstr "מאחורי NAT / חומת אש (בעזרת STUN לפתירה)" -#: ../gtk/parameters.ui.h:31 +#: ../gtk/parameters.ui.h:34 msgid "Behind NAT / Firewall (use ICE)" msgstr "מאחורי NAT / חומת אש (בעזרת ICE)" -#: ../gtk/parameters.ui.h:32 +#: ../gtk/parameters.ui.h:35 msgid "Behind NAT / Firewall (use uPnP)" msgstr "מאחורי NAT / חומת אש (בעזרת uPnP)" -#: ../gtk/parameters.ui.h:33 +#: ../gtk/parameters.ui.h:36 msgid "Public IP address:" msgstr "כתובת IP פומבית:" -#: ../gtk/parameters.ui.h:34 +#: ../gtk/parameters.ui.h:37 msgid "Stun server:" msgstr "שרת STUN:" -#: ../gtk/parameters.ui.h:35 +#: ../gtk/parameters.ui.h:38 msgid "NAT and Firewall" msgstr "‫NAT וחומת אש" -#: ../gtk/parameters.ui.h:36 +#: ../gtk/parameters.ui.h:39 msgid "Network settings" msgstr "הגדרות רשת תקשורת" -#: ../gtk/parameters.ui.h:37 +#: ../gtk/parameters.ui.h:40 msgid "Ring sound:" msgstr "צליל צלצול:" -#: ../gtk/parameters.ui.h:38 +#: ../gtk/parameters.ui.h:41 msgid "ALSA special device (optional):" msgstr "התקן ALSA מיוחד (רשות):" -#: ../gtk/parameters.ui.h:39 +#: ../gtk/parameters.ui.h:42 msgid "Capture device:" msgstr "התקן לכידה:" -#: ../gtk/parameters.ui.h:40 +#: ../gtk/parameters.ui.h:43 msgid "Ring device:" msgstr "התקן צלצול:" -#: ../gtk/parameters.ui.h:41 +#: ../gtk/parameters.ui.h:44 msgid "Playback device:" msgstr "התקן פס קול:" -#: ../gtk/parameters.ui.h:42 +#: ../gtk/parameters.ui.h:45 msgid "Enable echo cancellation" msgstr "אפשר ביטול הד" -#: ../gtk/parameters.ui.h:43 +#: ../gtk/parameters.ui.h:46 msgid "Audio" msgstr "אודיו" -#: ../gtk/parameters.ui.h:44 +#: ../gtk/parameters.ui.h:47 msgid "Video input device:" msgstr "התקן קלט וידאו:" -#: ../gtk/parameters.ui.h:45 +#: ../gtk/parameters.ui.h:48 msgid "Prefered video resolution:" msgstr "רזולוציית וידאו מועדפת:" -#: ../gtk/parameters.ui.h:46 +#: ../gtk/parameters.ui.h:49 msgid "Video output method:" msgstr "" -#: ../gtk/parameters.ui.h:47 +#: ../gtk/parameters.ui.h:50 msgid "Show camera preview" msgstr "" -#: ../gtk/parameters.ui.h:48 +#: ../gtk/parameters.ui.h:51 msgid "Video" msgstr "וידאו" -#: ../gtk/parameters.ui.h:49 +#: ../gtk/parameters.ui.h:52 msgid "Multimedia settings" msgstr "הגדרות מולטימדיה" -#: ../gtk/parameters.ui.h:50 +#: ../gtk/parameters.ui.h:53 msgid "This section defines your SIP address when not using a SIP account" msgstr "חלק זה מגדיר את כתובת ה־SIP כאשר אינך עושה שימוש בחשבון SIP" -#: ../gtk/parameters.ui.h:51 +#: ../gtk/parameters.ui.h:54 msgid "Your display name (eg: John Doe):" msgstr "שם התצוגה שלך (למשל: יורם יהודה):" -#: ../gtk/parameters.ui.h:52 +#: ../gtk/parameters.ui.h:55 msgid "Your username:" msgstr "שם המשתמש שלך:" -#: ../gtk/parameters.ui.h:53 +#: ../gtk/parameters.ui.h:56 msgid "Your resulting SIP address:" msgstr "כתובת SIP נובעת:" -#: ../gtk/parameters.ui.h:54 +#: ../gtk/parameters.ui.h:57 msgid "Default identity" msgstr "זהות משתמטת" -#: ../gtk/parameters.ui.h:55 +#: ../gtk/parameters.ui.h:58 msgid "Wizard" msgstr "אשף" -#: ../gtk/parameters.ui.h:56 +#: ../gtk/parameters.ui.h:59 msgid "Add" msgstr "הוסף" -#: ../gtk/parameters.ui.h:57 +#: ../gtk/parameters.ui.h:60 msgid "Edit" msgstr "ערוך" -#: ../gtk/parameters.ui.h:58 +#: ../gtk/parameters.ui.h:61 msgid "Remove" msgstr "הסר" -#: ../gtk/parameters.ui.h:59 +#: ../gtk/parameters.ui.h:62 msgid "Proxy accounts" msgstr "חשבונות Proxy" -#: ../gtk/parameters.ui.h:60 +#: ../gtk/parameters.ui.h:63 msgid "Erase all passwords" msgstr "מחק סיסמאות" -#: ../gtk/parameters.ui.h:61 +#: ../gtk/parameters.ui.h:64 msgid "Privacy" msgstr "פרטיות" -#: ../gtk/parameters.ui.h:62 +#: ../gtk/parameters.ui.h:65 msgid "Automatically answer when a call is received" msgstr "" -#: ../gtk/parameters.ui.h:63 +#: ../gtk/parameters.ui.h:66 +msgid "Delay before answering (ms)" +msgstr "" + +#: ../gtk/parameters.ui.h:67 msgid "Auto-answer" msgstr "" -#: ../gtk/parameters.ui.h:64 +#: ../gtk/parameters.ui.h:68 msgid "Manage SIP Accounts" msgstr "ניהול חשבונות ‫SIP" -#: ../gtk/parameters.ui.h:65 ../gtk/tunnel_config.ui.h:4 +#: ../gtk/parameters.ui.h:69 ../gtk/tunnel_config.ui.h:4 msgid "Enable" msgstr "אפשר" -#: ../gtk/parameters.ui.h:66 ../gtk/tunnel_config.ui.h:5 +#: ../gtk/parameters.ui.h:70 ../gtk/tunnel_config.ui.h:5 msgid "Disable" msgstr "נטרל" -#: ../gtk/parameters.ui.h:67 +#: ../gtk/parameters.ui.h:71 msgid "Codecs" msgstr "קודקים" -#: ../gtk/parameters.ui.h:68 +#: ../gtk/parameters.ui.h:72 msgid "0 stands for \"unlimited\"" msgstr "0 מסמל \"בלי הגבלה\"" -#: ../gtk/parameters.ui.h:69 +#: ../gtk/parameters.ui.h:73 msgid "Upload speed limit in Kbit/sec:" msgstr "מגבלת מהירות העלאה בקי״ב/שנ׳:" -#: ../gtk/parameters.ui.h:70 +#: ../gtk/parameters.ui.h:74 msgid "Download speed limit in Kbit/sec:" msgstr "מגבלת מהירות הורדה בקי״ב/שנ׳:" -#: ../gtk/parameters.ui.h:71 +#: ../gtk/parameters.ui.h:75 msgid "Enable adaptive rate control" msgstr "אפשר בקרת קצב מסתגלת" -#: ../gtk/parameters.ui.h:72 +#: ../gtk/parameters.ui.h:76 msgid "" "Adaptive rate control is a technique to dynamically guess the available " "bandwidth during a call." msgstr "בקרת קצב מסתגלת הינה טכניקה להשערה דינמית של רוחב הפס הזמין במהלך שיחה." -#: ../gtk/parameters.ui.h:73 +#: ../gtk/parameters.ui.h:77 msgid "Bandwidth control" msgstr "בקרת רוחב פס" -#: ../gtk/parameters.ui.h:74 +#: ../gtk/parameters.ui.h:78 msgid "Codecs" msgstr "קודקים" -#: ../gtk/parameters.ui.h:75 +#: ../gtk/parameters.ui.h:79 msgid "Language" msgstr "שפה" -#: ../gtk/parameters.ui.h:76 +#: ../gtk/parameters.ui.h:80 msgid "Show advanced settings" msgstr "הצג הגדרות מתקדמות" -#: ../gtk/parameters.ui.h:77 +#: ../gtk/parameters.ui.h:81 msgid "Level" msgstr "רמה" -#: ../gtk/parameters.ui.h:78 +#: ../gtk/parameters.ui.h:82 msgid "User interface" msgstr "ממשק משתמש" -#: ../gtk/parameters.ui.h:79 ../gtk/ldap.ui.h:2 +#: ../gtk/parameters.ui.h:83 ../gtk/ldap.ui.h:2 msgid "Server address:" msgstr "" -#: ../gtk/parameters.ui.h:80 ../gtk/ldap.ui.h:3 +#: ../gtk/parameters.ui.h:84 ../gtk/ldap.ui.h:3 msgid "Authentication method:" msgstr "" -#: ../gtk/parameters.ui.h:82 +#: ../gtk/parameters.ui.h:86 msgid "LDAP Account setup" msgstr "" -#: ../gtk/parameters.ui.h:83 +#: ../gtk/parameters.ui.h:87 msgid "LDAP" msgstr "" -#: ../gtk/parameters.ui.h:84 +#: ../gtk/parameters.ui.h:88 msgid "Done" msgstr "סיום" -#: ../gtk/parameters.ui.h:85 -msgid "SIP (UDP)" -msgstr "‏SIP ‏(UDP)" - -#: ../gtk/parameters.ui.h:86 -msgid "SIP (TCP)" -msgstr "‏SIP ‏(TCP)" - -#: ../gtk/parameters.ui.h:87 -msgid "SIP (TLS)" -msgstr "‏SIP ‏(TLS)" - #: ../gtk/buddylookup.ui.h:1 msgid "Search contacts in directory" msgstr "חיפוש אנשי קשר בתוך מדור" @@ -1699,60 +1703,60 @@ msgstr "" msgid "Please wait while fetching configuration from server..." msgstr "" -#: ../coreapi/linphonecore.c:1534 +#: ../coreapi/linphonecore.c:1538 msgid "Ready" msgstr "מוכן" -#: ../coreapi/linphonecore.c:2534 +#: ../coreapi/linphonecore.c:2550 msgid "Configuring" msgstr "" -#: ../coreapi/linphonecore.c:2708 +#: ../coreapi/linphonecore.c:2724 msgid "Looking for telephone number destination..." msgstr "מחפש כעת עבור יעד מספר טלפון..." -#: ../coreapi/linphonecore.c:2710 +#: ../coreapi/linphonecore.c:2726 msgid "Could not resolve this number." msgstr "לא ניתן לפתור את מספר זה." #. must be known at that time -#: ../coreapi/linphonecore.c:2996 +#: ../coreapi/linphonecore.c:3012 msgid "Contacting" msgstr "מתקשר כעת" -#: ../coreapi/linphonecore.c:3001 +#: ../coreapi/linphonecore.c:3017 msgid "Could not call" msgstr "לא ניתן להתקשר" -#: ../coreapi/linphonecore.c:3152 +#: ../coreapi/linphonecore.c:3168 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "הגענו אל המספר המרבי של שיחות מקבילות, עמך הסליחה" -#: ../coreapi/linphonecore.c:3310 +#: ../coreapi/linphonecore.c:3326 msgid "is contacting you" msgstr "מתקשר/ת אליך" -#: ../coreapi/linphonecore.c:3311 +#: ../coreapi/linphonecore.c:3327 msgid " and asked autoanswer." msgstr " ומבקש/ת מענה אוטומטי." -#: ../coreapi/linphonecore.c:3435 +#: ../coreapi/linphonecore.c:3451 msgid "Modifying call parameters..." msgstr "מתאים כעת פרמטרים של שיחה..." -#: ../coreapi/linphonecore.c:3782 +#: ../coreapi/linphonecore.c:3798 msgid "Connected." msgstr "מקושר." -#: ../coreapi/linphonecore.c:3807 +#: ../coreapi/linphonecore.c:3823 msgid "Call aborted" msgstr "קריאה בוטלה" -#: ../coreapi/linphonecore.c:3997 +#: ../coreapi/linphonecore.c:4013 msgid "Could not pause the call" msgstr "לא ניתן להשהות את השיחה" -#: ../coreapi/linphonecore.c:4000 +#: ../coreapi/linphonecore.c:4016 msgid "Pausing the current call..." msgstr "משהה כעת שיחה נוכחית..." @@ -1948,11 +1952,11 @@ msgstr "" msgid "Authentication token is %s" msgstr "אות האימות הינה %s" -#: ../coreapi/linphonecall.c:1305 +#: ../coreapi/linphonecall.c:1306 msgid "Call parameters were successfully modified." msgstr "" -#: ../coreapi/linphonecall.c:3659 +#: ../coreapi/linphonecall.c:3660 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." diff --git a/po/hu.po b/po/hu.po index a32fbab4c..0ab15b250 100644 --- a/po/hu.po +++ b/po/hu.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: linphone-gtk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-27 14:40+0100\n" -"PO-Revision-Date: 2015-03-27 13:40+0000\n" +"POT-Creation-Date: 2015-04-01 16:25+0200\n" +"PO-Revision-Date: 2015-04-01 14:26+0000\n" "Last-Translator: Belledonne Communications \n" "Language-Team: Hungarian (http://www.transifex.com/projects/p/linphone-gtk/language/hu/)\n" "MIME-Version: 1.0\n" @@ -125,7 +125,7 @@ msgstr "" msgid "Run self test and exit 0 if succeed" msgstr "" -#: ../gtk/main.c:1059 +#: ../gtk/main.c:1069 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -133,76 +133,76 @@ msgid "" "If you answer no, this person will be temporarily blacklisted." msgstr "%s szeretné Önt hozzáadni partnerlistájához.\nSzeretné megengedni neki, hogy lássa az Ön jelenlétét, illetve hozzá szeretné adni a partnerlistához?\nHa nemmel válaszol, ez a személy átmenetileg tiltólistára kerül." -#: ../gtk/main.c:1136 +#: ../gtk/main.c:1146 #, c-format msgid "" "Please enter your password for username %s\n" " at realm %s:" msgstr "" -#: ../gtk/main.c:1257 +#: ../gtk/main.c:1267 msgid "Call error" msgstr "Hiba a hívás közben" -#: ../gtk/main.c:1260 ../coreapi/linphonecore.c:3826 +#: ../gtk/main.c:1270 ../coreapi/linphonecore.c:3842 msgid "Call ended" msgstr "Hívás vége" -#: ../gtk/main.c:1263 ../coreapi/call_log.c:221 +#: ../gtk/main.c:1273 ../coreapi/call_log.c:221 msgid "Incoming call" msgstr "Beérkező hívás" -#: ../gtk/main.c:1265 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 +#: ../gtk/main.c:1275 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 msgid "Answer" msgstr "Hívás fogadása" -#: ../gtk/main.c:1267 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1277 ../gtk/main.ui.h:6 msgid "Decline" msgstr "Elutasítás" -#: ../gtk/main.c:1273 +#: ../gtk/main.c:1283 msgid "Call paused" msgstr "Hívás várakoztatva" -#: ../gtk/main.c:1273 +#: ../gtk/main.c:1283 #, c-format msgid "by %s" msgstr "a következő által: %s" -#: ../gtk/main.c:1343 +#: ../gtk/main.c:1353 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "%s szerené elidítani a videót. Elfogadja?" -#: ../gtk/main.c:1505 +#: ../gtk/main.c:1516 msgid "Website link" msgstr "Internetes oldal" -#: ../gtk/main.c:1554 +#: ../gtk/main.c:1565 msgid "Linphone - a video internet phone" msgstr "Linphone - internetes videó telefon" -#: ../gtk/main.c:1646 +#: ../gtk/main.c:1657 #, c-format msgid "%s (Default)" msgstr "%s (Alapértelmezett)" -#: ../gtk/main.c:1978 ../coreapi/callbacks.c:1057 +#: ../gtk/main.c:1989 ../coreapi/callbacks.c:1057 #, c-format msgid "We are transferred to %s" msgstr "Át vagyunk irányítva ide: %s" -#: ../gtk/main.c:1988 +#: ../gtk/main.c:1999 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." msgstr "Hangkártya nincs érzékelve ezen a számítógépen.\nNem fog tudni hang hívásokat küldeni vagy fogadni." -#: ../gtk/main.c:2136 +#: ../gtk/main.c:2147 msgid "A free SIP video-phone" msgstr "Egy ingyenes SIP video-telefon" -#: ../gtk/main.c:2241 +#: ../gtk/main.c:2252 #, c-format msgid "Hello\n" msgstr "" @@ -276,7 +276,7 @@ msgstr "Paraméterek" msgid "Enabled" msgstr "Engedélyezve" -#: ../gtk/propertybox.c:622 ../gtk/propertybox.c:763 ../gtk/parameters.ui.h:17 +#: ../gtk/propertybox.c:622 ../gtk/propertybox.c:763 ../gtk/parameters.ui.h:20 msgid "Disabled" msgstr "Tiltva" @@ -441,7 +441,7 @@ msgstr "" msgid "Enter your linphone.org username" msgstr "Adja meg linphone.org felhasználónevét" -#: ../gtk/setupwizard.c:102 ../gtk/parameters.ui.h:81 ../gtk/ldap.ui.h:4 +#: ../gtk/setupwizard.c:102 ../gtk/parameters.ui.h:85 ../gtk/ldap.ui.h:4 msgid "Username:" msgstr "Felhasználónév:" @@ -1178,307 +1178,311 @@ msgid "C" msgstr "C" #: ../gtk/parameters.ui.h:11 +msgid "SIP (UDP)" +msgstr "SIP (UDP)" + +#: ../gtk/parameters.ui.h:12 +msgid "SIP (TCP)" +msgstr "SIP (TCP)" + +#: ../gtk/parameters.ui.h:13 +msgid "SIP (TLS)" +msgstr "SIP (TLS)" + +#: ../gtk/parameters.ui.h:14 msgid "Settings" msgstr "Beállítások" -#: ../gtk/parameters.ui.h:12 +#: ../gtk/parameters.ui.h:15 msgid "Set Maximum Transmission Unit:" msgstr "Maximum Továbbítási Egység beállítása:" -#: ../gtk/parameters.ui.h:13 +#: ../gtk/parameters.ui.h:16 msgid "Send DTMFs as SIP info" msgstr "DTMF küldése SIP infóként" -#: ../gtk/parameters.ui.h:14 +#: ../gtk/parameters.ui.h:17 msgid "Allow IPv6" msgstr "" -#: ../gtk/parameters.ui.h:15 +#: ../gtk/parameters.ui.h:18 msgid "Transport" msgstr "Átvitel" -#: ../gtk/parameters.ui.h:16 +#: ../gtk/parameters.ui.h:19 msgid "SIP/UDP port" msgstr "" -#: ../gtk/parameters.ui.h:18 +#: ../gtk/parameters.ui.h:21 msgid "Random" msgstr "" -#: ../gtk/parameters.ui.h:19 +#: ../gtk/parameters.ui.h:22 msgid "SIP/TCP port" msgstr "" -#: ../gtk/parameters.ui.h:20 +#: ../gtk/parameters.ui.h:23 msgid "Audio RTP/UDP:" msgstr "Audió RTP/UDP:" -#: ../gtk/parameters.ui.h:21 +#: ../gtk/parameters.ui.h:24 msgid "Fixed" msgstr "Javítva" -#: ../gtk/parameters.ui.h:22 +#: ../gtk/parameters.ui.h:25 msgid "Video RTP/UDP:" msgstr "Videó RTP/UDP:" -#: ../gtk/parameters.ui.h:23 +#: ../gtk/parameters.ui.h:26 msgid "Media encryption type" msgstr "Média titkosítás típusa" -#: ../gtk/parameters.ui.h:24 +#: ../gtk/parameters.ui.h:27 msgid "Media encryption is mandatory" msgstr "Média titkosítás kötelező" -#: ../gtk/parameters.ui.h:25 +#: ../gtk/parameters.ui.h:28 msgid "Tunnel" msgstr "Alagút" -#: ../gtk/parameters.ui.h:26 +#: ../gtk/parameters.ui.h:29 msgid "DSCP fields" msgstr "DSCP mezők" -#: ../gtk/parameters.ui.h:27 +#: ../gtk/parameters.ui.h:30 msgid "Network protocol and ports" msgstr "Hálózati protokoll és port" -#: ../gtk/parameters.ui.h:28 +#: ../gtk/parameters.ui.h:31 msgid "Direct connection to the Internet" msgstr "Közvetlen Internet kapcsolat" -#: ../gtk/parameters.ui.h:29 +#: ../gtk/parameters.ui.h:32 msgid "Behind NAT / Firewall (specify gateway IP )" msgstr "" -#: ../gtk/parameters.ui.h:30 +#: ../gtk/parameters.ui.h:33 msgid "Behind NAT / Firewall (use STUN to resolve)" msgstr "NAT / tűzfal mögött (STUN használata a feloldáshoz)" -#: ../gtk/parameters.ui.h:31 +#: ../gtk/parameters.ui.h:34 msgid "Behind NAT / Firewall (use ICE)" msgstr "NAT / tűzfal mögött (ICE használata)" -#: ../gtk/parameters.ui.h:32 +#: ../gtk/parameters.ui.h:35 msgid "Behind NAT / Firewall (use uPnP)" msgstr "NAT / tűzfal mögött (uPnP használata)" -#: ../gtk/parameters.ui.h:33 +#: ../gtk/parameters.ui.h:36 msgid "Public IP address:" msgstr "Publikus IP cím:" -#: ../gtk/parameters.ui.h:34 +#: ../gtk/parameters.ui.h:37 msgid "Stun server:" msgstr "STUN kiszolgáló:" -#: ../gtk/parameters.ui.h:35 +#: ../gtk/parameters.ui.h:38 msgid "NAT and Firewall" msgstr "NAT és tűzfal" -#: ../gtk/parameters.ui.h:36 +#: ../gtk/parameters.ui.h:39 msgid "Network settings" msgstr "Hálózati beállítások" -#: ../gtk/parameters.ui.h:37 +#: ../gtk/parameters.ui.h:40 msgid "Ring sound:" msgstr "Csengőhang:" -#: ../gtk/parameters.ui.h:38 +#: ../gtk/parameters.ui.h:41 msgid "ALSA special device (optional):" msgstr "Különleges ALSA eszköz (nem kötelező):" -#: ../gtk/parameters.ui.h:39 +#: ../gtk/parameters.ui.h:42 msgid "Capture device:" msgstr "Felvevő hang eszköz:" -#: ../gtk/parameters.ui.h:40 +#: ../gtk/parameters.ui.h:43 msgid "Ring device:" msgstr "Csengőhang eszköz:" -#: ../gtk/parameters.ui.h:41 +#: ../gtk/parameters.ui.h:44 msgid "Playback device:" msgstr "Lejátszó hang eszköz:" -#: ../gtk/parameters.ui.h:42 +#: ../gtk/parameters.ui.h:45 msgid "Enable echo cancellation" msgstr "Visszhang-elnyomás engedélyezése" -#: ../gtk/parameters.ui.h:43 +#: ../gtk/parameters.ui.h:46 msgid "Audio" msgstr "Audió" -#: ../gtk/parameters.ui.h:44 +#: ../gtk/parameters.ui.h:47 msgid "Video input device:" msgstr "Videó bemeneti eszköz:" -#: ../gtk/parameters.ui.h:45 +#: ../gtk/parameters.ui.h:48 msgid "Prefered video resolution:" msgstr "Kívánt videó felbontás:" -#: ../gtk/parameters.ui.h:46 +#: ../gtk/parameters.ui.h:49 msgid "Video output method:" msgstr "" -#: ../gtk/parameters.ui.h:47 +#: ../gtk/parameters.ui.h:50 msgid "Show camera preview" msgstr "" -#: ../gtk/parameters.ui.h:48 +#: ../gtk/parameters.ui.h:51 msgid "Video" msgstr "Videó" -#: ../gtk/parameters.ui.h:49 +#: ../gtk/parameters.ui.h:52 msgid "Multimedia settings" msgstr "Multimédia beállítások" -#: ../gtk/parameters.ui.h:50 +#: ../gtk/parameters.ui.h:53 msgid "This section defines your SIP address when not using a SIP account" msgstr "Ez a rész határozza meg az Ön SIP címét, amikor nem használ SIP fiókot" -#: ../gtk/parameters.ui.h:51 +#: ../gtk/parameters.ui.h:54 msgid "Your display name (eg: John Doe):" msgstr "Az Ön megjelenített neve (pl. Kis József):" -#: ../gtk/parameters.ui.h:52 +#: ../gtk/parameters.ui.h:55 msgid "Your username:" msgstr "Az Ön felhasználóneve:" -#: ../gtk/parameters.ui.h:53 +#: ../gtk/parameters.ui.h:56 msgid "Your resulting SIP address:" msgstr "Az Ön így keletkezett SIP címe:" -#: ../gtk/parameters.ui.h:54 +#: ../gtk/parameters.ui.h:57 msgid "Default identity" msgstr "Alapértelmezett identitás" -#: ../gtk/parameters.ui.h:55 +#: ../gtk/parameters.ui.h:58 msgid "Wizard" msgstr "Varázsló" -#: ../gtk/parameters.ui.h:56 +#: ../gtk/parameters.ui.h:59 msgid "Add" msgstr "Hozzáadás" -#: ../gtk/parameters.ui.h:57 +#: ../gtk/parameters.ui.h:60 msgid "Edit" msgstr "Szerkesztés" -#: ../gtk/parameters.ui.h:58 +#: ../gtk/parameters.ui.h:61 msgid "Remove" msgstr "Eltávolítás" -#: ../gtk/parameters.ui.h:59 +#: ../gtk/parameters.ui.h:62 msgid "Proxy accounts" msgstr "Proxy fiókok" -#: ../gtk/parameters.ui.h:60 +#: ../gtk/parameters.ui.h:63 msgid "Erase all passwords" msgstr "Minden kulcsszó törlése" -#: ../gtk/parameters.ui.h:61 +#: ../gtk/parameters.ui.h:64 msgid "Privacy" msgstr "Titoktartás" -#: ../gtk/parameters.ui.h:62 +#: ../gtk/parameters.ui.h:65 msgid "Automatically answer when a call is received" msgstr "" -#: ../gtk/parameters.ui.h:63 +#: ../gtk/parameters.ui.h:66 +msgid "Delay before answering (ms)" +msgstr "" + +#: ../gtk/parameters.ui.h:67 msgid "Auto-answer" msgstr "" -#: ../gtk/parameters.ui.h:64 +#: ../gtk/parameters.ui.h:68 msgid "Manage SIP Accounts" msgstr "SIP fiókok beállítása" -#: ../gtk/parameters.ui.h:65 ../gtk/tunnel_config.ui.h:4 +#: ../gtk/parameters.ui.h:69 ../gtk/tunnel_config.ui.h:4 msgid "Enable" msgstr "Engedélyezés" -#: ../gtk/parameters.ui.h:66 ../gtk/tunnel_config.ui.h:5 +#: ../gtk/parameters.ui.h:70 ../gtk/tunnel_config.ui.h:5 msgid "Disable" msgstr "Tiltás" -#: ../gtk/parameters.ui.h:67 +#: ../gtk/parameters.ui.h:71 msgid "Codecs" msgstr "Kódekek" -#: ../gtk/parameters.ui.h:68 +#: ../gtk/parameters.ui.h:72 msgid "0 stands for \"unlimited\"" msgstr "A 0 jelentése \"végtelen\"" -#: ../gtk/parameters.ui.h:69 +#: ../gtk/parameters.ui.h:73 msgid "Upload speed limit in Kbit/sec:" msgstr "Feltöltési sebesség korlát (kbit/mp):" -#: ../gtk/parameters.ui.h:70 +#: ../gtk/parameters.ui.h:74 msgid "Download speed limit in Kbit/sec:" msgstr "Letöltési sebesség korlát (kbit/mp):" -#: ../gtk/parameters.ui.h:71 +#: ../gtk/parameters.ui.h:75 msgid "Enable adaptive rate control" msgstr "Alkalmazkodó mérték-szabályozás engedélyezése" -#: ../gtk/parameters.ui.h:72 +#: ../gtk/parameters.ui.h:76 msgid "" "Adaptive rate control is a technique to dynamically guess the available " "bandwidth during a call." msgstr "Az alkalmazkodó mérték-szabályozás egy módszer, mely erőteljesen próbálja megállapítani a rendelkezésre álló sávszélességet hívás alatt." -#: ../gtk/parameters.ui.h:73 +#: ../gtk/parameters.ui.h:77 msgid "Bandwidth control" msgstr "Sávszélesség szabályozása" -#: ../gtk/parameters.ui.h:74 +#: ../gtk/parameters.ui.h:78 msgid "Codecs" msgstr "Kódekek" -#: ../gtk/parameters.ui.h:75 +#: ../gtk/parameters.ui.h:79 msgid "Language" msgstr "Nyelv" -#: ../gtk/parameters.ui.h:76 +#: ../gtk/parameters.ui.h:80 msgid "Show advanced settings" msgstr "Haladó beállítások megjelenítése" -#: ../gtk/parameters.ui.h:77 +#: ../gtk/parameters.ui.h:81 msgid "Level" msgstr "Szint" -#: ../gtk/parameters.ui.h:78 +#: ../gtk/parameters.ui.h:82 msgid "User interface" msgstr "Felhasználói környezet" -#: ../gtk/parameters.ui.h:79 ../gtk/ldap.ui.h:2 +#: ../gtk/parameters.ui.h:83 ../gtk/ldap.ui.h:2 msgid "Server address:" msgstr "" -#: ../gtk/parameters.ui.h:80 ../gtk/ldap.ui.h:3 +#: ../gtk/parameters.ui.h:84 ../gtk/ldap.ui.h:3 msgid "Authentication method:" msgstr "" -#: ../gtk/parameters.ui.h:82 +#: ../gtk/parameters.ui.h:86 msgid "LDAP Account setup" msgstr "" -#: ../gtk/parameters.ui.h:83 +#: ../gtk/parameters.ui.h:87 msgid "LDAP" msgstr "" -#: ../gtk/parameters.ui.h:84 +#: ../gtk/parameters.ui.h:88 msgid "Done" msgstr "Kész" -#: ../gtk/parameters.ui.h:85 -msgid "SIP (UDP)" -msgstr "SIP (UDP)" - -#: ../gtk/parameters.ui.h:86 -msgid "SIP (TCP)" -msgstr "SIP (TCP)" - -#: ../gtk/parameters.ui.h:87 -msgid "SIP (TLS)" -msgstr "SIP (TLS)" - #: ../gtk/buddylookup.ui.h:1 msgid "Search contacts in directory" msgstr "Partnerek keresése könyvtárban" @@ -1694,60 +1698,60 @@ msgstr "" msgid "Please wait while fetching configuration from server..." msgstr "" -#: ../coreapi/linphonecore.c:1534 +#: ../coreapi/linphonecore.c:1538 msgid "Ready" msgstr "Kész" -#: ../coreapi/linphonecore.c:2534 +#: ../coreapi/linphonecore.c:2550 msgid "Configuring" msgstr "" -#: ../coreapi/linphonecore.c:2708 +#: ../coreapi/linphonecore.c:2724 msgid "Looking for telephone number destination..." msgstr "Telefonszám-cél keresése..." -#: ../coreapi/linphonecore.c:2710 +#: ../coreapi/linphonecore.c:2726 msgid "Could not resolve this number." msgstr "Nem sikkerült értelmezni a számot." #. must be known at that time -#: ../coreapi/linphonecore.c:2996 +#: ../coreapi/linphonecore.c:3012 msgid "Contacting" msgstr "Kapcsolódás" -#: ../coreapi/linphonecore.c:3001 +#: ../coreapi/linphonecore.c:3017 msgid "Could not call" msgstr "Nem sikerült hívni" -#: ../coreapi/linphonecore.c:3152 +#: ../coreapi/linphonecore.c:3168 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "Elnézést, elértük a egyidejű hívások maximális számát" -#: ../coreapi/linphonecore.c:3310 +#: ../coreapi/linphonecore.c:3326 msgid "is contacting you" msgstr "kapcsolatba lépett veled." -#: ../coreapi/linphonecore.c:3311 +#: ../coreapi/linphonecore.c:3327 msgid " and asked autoanswer." msgstr "és automatikus választ kért." -#: ../coreapi/linphonecore.c:3435 +#: ../coreapi/linphonecore.c:3451 msgid "Modifying call parameters..." msgstr "A hívási jellemzők módosítása..." -#: ../coreapi/linphonecore.c:3782 +#: ../coreapi/linphonecore.c:3798 msgid "Connected." msgstr "Kapcsolódva." -#: ../coreapi/linphonecore.c:3807 +#: ../coreapi/linphonecore.c:3823 msgid "Call aborted" msgstr "Hívás megszakítva" -#: ../coreapi/linphonecore.c:3997 +#: ../coreapi/linphonecore.c:4013 msgid "Could not pause the call" msgstr "Nem sikerült várakoztatni a hívást" -#: ../coreapi/linphonecore.c:4000 +#: ../coreapi/linphonecore.c:4016 msgid "Pausing the current call..." msgstr "Jelenlegi hívás várakoztatásának aktiválása..." @@ -1943,11 +1947,11 @@ msgstr "" msgid "Authentication token is %s" msgstr "Hitelesítési jel: %s" -#: ../coreapi/linphonecall.c:1305 +#: ../coreapi/linphonecall.c:1306 msgid "Call parameters were successfully modified." msgstr "" -#: ../coreapi/linphonecall.c:3659 +#: ../coreapi/linphonecall.c:3660 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." diff --git a/po/it.po b/po/it.po index 6c369ce0a..8c0c860b2 100644 --- a/po/it.po +++ b/po/it.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: linphone-gtk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-27 14:40+0100\n" -"PO-Revision-Date: 2015-03-27 13:40+0000\n" +"POT-Creation-Date: 2015-04-01 16:25+0200\n" +"PO-Revision-Date: 2015-04-01 14:26+0000\n" "Last-Translator: Belledonne Communications \n" "Language-Team: Italian (http://www.transifex.com/projects/p/linphone-gtk/language/it/)\n" "MIME-Version: 1.0\n" @@ -125,7 +125,7 @@ msgstr "" msgid "Run self test and exit 0 if succeed" msgstr "" -#: ../gtk/main.c:1059 +#: ../gtk/main.c:1069 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -133,76 +133,76 @@ msgid "" "If you answer no, this person will be temporarily blacklisted." msgstr "%s voui aggiungere il tuo contatto alla sua listaVoui permettere che lui veda il tuo stato o aggiungerlo alla tua lista dei contatti Se rispondi no questo utente sarà momentaneamente bloccato." -#: ../gtk/main.c:1136 +#: ../gtk/main.c:1146 #, c-format msgid "" "Please enter your password for username %s\n" " at realm %s:" msgstr "" -#: ../gtk/main.c:1257 +#: ../gtk/main.c:1267 msgid "Call error" msgstr "" -#: ../gtk/main.c:1260 ../coreapi/linphonecore.c:3826 +#: ../gtk/main.c:1270 ../coreapi/linphonecore.c:3842 msgid "Call ended" msgstr "Chiamata terminata" -#: ../gtk/main.c:1263 ../coreapi/call_log.c:221 +#: ../gtk/main.c:1273 ../coreapi/call_log.c:221 msgid "Incoming call" msgstr "Chimata in entrata" -#: ../gtk/main.c:1265 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 +#: ../gtk/main.c:1275 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 msgid "Answer" msgstr "" -#: ../gtk/main.c:1267 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1277 ../gtk/main.ui.h:6 msgid "Decline" msgstr "Rifiuta" -#: ../gtk/main.c:1273 +#: ../gtk/main.c:1283 msgid "Call paused" msgstr "" -#: ../gtk/main.c:1273 +#: ../gtk/main.c:1283 #, c-format msgid "by %s" msgstr "" -#: ../gtk/main.c:1343 +#: ../gtk/main.c:1353 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1505 +#: ../gtk/main.c:1516 msgid "Website link" msgstr "" -#: ../gtk/main.c:1554 +#: ../gtk/main.c:1565 msgid "Linphone - a video internet phone" msgstr "" -#: ../gtk/main.c:1646 +#: ../gtk/main.c:1657 #, c-format msgid "%s (Default)" msgstr "%s (Default)" -#: ../gtk/main.c:1978 ../coreapi/callbacks.c:1057 +#: ../gtk/main.c:1989 ../coreapi/callbacks.c:1057 #, c-format msgid "We are transferred to %s" msgstr "" -#: ../gtk/main.c:1988 +#: ../gtk/main.c:1999 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." msgstr "" -#: ../gtk/main.c:2136 +#: ../gtk/main.c:2147 msgid "A free SIP video-phone" msgstr "" -#: ../gtk/main.c:2241 +#: ../gtk/main.c:2252 #, c-format msgid "Hello\n" msgstr "" @@ -276,7 +276,7 @@ msgstr "Parametri" msgid "Enabled" msgstr "Attivato" -#: ../gtk/propertybox.c:622 ../gtk/propertybox.c:763 ../gtk/parameters.ui.h:17 +#: ../gtk/propertybox.c:622 ../gtk/propertybox.c:763 ../gtk/parameters.ui.h:20 msgid "Disabled" msgstr "Disattivato" @@ -441,7 +441,7 @@ msgstr "" msgid "Enter your linphone.org username" msgstr "" -#: ../gtk/setupwizard.c:102 ../gtk/parameters.ui.h:81 ../gtk/ldap.ui.h:4 +#: ../gtk/setupwizard.c:102 ../gtk/parameters.ui.h:85 ../gtk/ldap.ui.h:4 msgid "Username:" msgstr "Manuale utente" @@ -1178,307 +1178,311 @@ msgid "C" msgstr "C" #: ../gtk/parameters.ui.h:11 +msgid "SIP (UDP)" +msgstr "" + +#: ../gtk/parameters.ui.h:12 +msgid "SIP (TCP)" +msgstr "" + +#: ../gtk/parameters.ui.h:13 +msgid "SIP (TLS)" +msgstr "" + +#: ../gtk/parameters.ui.h:14 msgid "Settings" msgstr "Preferenze" -#: ../gtk/parameters.ui.h:12 +#: ../gtk/parameters.ui.h:15 msgid "Set Maximum Transmission Unit:" msgstr "Imposta Maximum Transmission Unit:" -#: ../gtk/parameters.ui.h:13 +#: ../gtk/parameters.ui.h:16 msgid "Send DTMFs as SIP info" msgstr "Invia DTMF come SIP info" -#: ../gtk/parameters.ui.h:14 +#: ../gtk/parameters.ui.h:17 msgid "Allow IPv6" msgstr "" -#: ../gtk/parameters.ui.h:15 +#: ../gtk/parameters.ui.h:18 msgid "Transport" msgstr "Transporto" -#: ../gtk/parameters.ui.h:16 +#: ../gtk/parameters.ui.h:19 msgid "SIP/UDP port" msgstr "" -#: ../gtk/parameters.ui.h:18 +#: ../gtk/parameters.ui.h:21 msgid "Random" msgstr "" -#: ../gtk/parameters.ui.h:19 +#: ../gtk/parameters.ui.h:22 msgid "SIP/TCP port" msgstr "" -#: ../gtk/parameters.ui.h:20 +#: ../gtk/parameters.ui.h:23 msgid "Audio RTP/UDP:" msgstr "Audio RTP/UDP:" -#: ../gtk/parameters.ui.h:21 +#: ../gtk/parameters.ui.h:24 msgid "Fixed" msgstr "" -#: ../gtk/parameters.ui.h:22 +#: ../gtk/parameters.ui.h:25 msgid "Video RTP/UDP:" msgstr "Video RTP/UDP" -#: ../gtk/parameters.ui.h:23 +#: ../gtk/parameters.ui.h:26 msgid "Media encryption type" msgstr "" -#: ../gtk/parameters.ui.h:24 +#: ../gtk/parameters.ui.h:27 msgid "Media encryption is mandatory" msgstr "" -#: ../gtk/parameters.ui.h:25 +#: ../gtk/parameters.ui.h:28 msgid "Tunnel" msgstr "" -#: ../gtk/parameters.ui.h:26 +#: ../gtk/parameters.ui.h:29 msgid "DSCP fields" msgstr "" -#: ../gtk/parameters.ui.h:27 +#: ../gtk/parameters.ui.h:30 msgid "Network protocol and ports" msgstr "" -#: ../gtk/parameters.ui.h:28 +#: ../gtk/parameters.ui.h:31 msgid "Direct connection to the Internet" msgstr "Connessione diretta a internet" -#: ../gtk/parameters.ui.h:29 +#: ../gtk/parameters.ui.h:32 msgid "Behind NAT / Firewall (specify gateway IP )" msgstr "" -#: ../gtk/parameters.ui.h:30 +#: ../gtk/parameters.ui.h:33 msgid "Behind NAT / Firewall (use STUN to resolve)" msgstr "Dietro NAT / Firewall (utilizza STUN)" -#: ../gtk/parameters.ui.h:31 +#: ../gtk/parameters.ui.h:34 msgid "Behind NAT / Firewall (use ICE)" msgstr "" -#: ../gtk/parameters.ui.h:32 +#: ../gtk/parameters.ui.h:35 msgid "Behind NAT / Firewall (use uPnP)" msgstr "" -#: ../gtk/parameters.ui.h:33 +#: ../gtk/parameters.ui.h:36 msgid "Public IP address:" msgstr "Indirizzo ip pubblico:" -#: ../gtk/parameters.ui.h:34 +#: ../gtk/parameters.ui.h:37 msgid "Stun server:" msgstr "Stun server:" -#: ../gtk/parameters.ui.h:35 +#: ../gtk/parameters.ui.h:38 msgid "NAT and Firewall" msgstr "NAT and Firewall" -#: ../gtk/parameters.ui.h:36 +#: ../gtk/parameters.ui.h:39 msgid "Network settings" msgstr "Impostazioni di rete" -#: ../gtk/parameters.ui.h:37 +#: ../gtk/parameters.ui.h:40 msgid "Ring sound:" msgstr "Suoneria:" -#: ../gtk/parameters.ui.h:38 +#: ../gtk/parameters.ui.h:41 msgid "ALSA special device (optional):" msgstr "Dispositivo ALSA (optional):" -#: ../gtk/parameters.ui.h:39 +#: ../gtk/parameters.ui.h:42 msgid "Capture device:" msgstr "Dispositivo microfono:" -#: ../gtk/parameters.ui.h:40 +#: ../gtk/parameters.ui.h:43 msgid "Ring device:" msgstr "Dispositivo squillo:" -#: ../gtk/parameters.ui.h:41 +#: ../gtk/parameters.ui.h:44 msgid "Playback device:" msgstr "Dispositivo uscita audio:" -#: ../gtk/parameters.ui.h:42 +#: ../gtk/parameters.ui.h:45 msgid "Enable echo cancellation" msgstr "Attiva cancellazione eco" -#: ../gtk/parameters.ui.h:43 +#: ../gtk/parameters.ui.h:46 msgid "Audio" msgstr "Audio" -#: ../gtk/parameters.ui.h:44 +#: ../gtk/parameters.ui.h:47 msgid "Video input device:" msgstr "Dispositivo Video:" -#: ../gtk/parameters.ui.h:45 +#: ../gtk/parameters.ui.h:48 msgid "Prefered video resolution:" msgstr "Risoluzione video preferita" -#: ../gtk/parameters.ui.h:46 +#: ../gtk/parameters.ui.h:49 msgid "Video output method:" msgstr "" -#: ../gtk/parameters.ui.h:47 +#: ../gtk/parameters.ui.h:50 msgid "Show camera preview" msgstr "" -#: ../gtk/parameters.ui.h:48 +#: ../gtk/parameters.ui.h:51 msgid "Video" msgstr "Video" -#: ../gtk/parameters.ui.h:49 +#: ../gtk/parameters.ui.h:52 msgid "Multimedia settings" msgstr "Impostazioni multimediali" -#: ../gtk/parameters.ui.h:50 +#: ../gtk/parameters.ui.h:53 msgid "This section defines your SIP address when not using a SIP account" msgstr "questa sezione definisce il tuo indirizzo SIP se non hai account attivi" -#: ../gtk/parameters.ui.h:51 +#: ../gtk/parameters.ui.h:54 msgid "Your display name (eg: John Doe):" msgstr "Nome visualizzato (es: Mario Rossi):" -#: ../gtk/parameters.ui.h:52 +#: ../gtk/parameters.ui.h:55 msgid "Your username:" msgstr "Username" -#: ../gtk/parameters.ui.h:53 +#: ../gtk/parameters.ui.h:56 msgid "Your resulting SIP address:" msgstr "Il tuo indirizzo sip:" -#: ../gtk/parameters.ui.h:54 +#: ../gtk/parameters.ui.h:57 msgid "Default identity" msgstr "Identità di default" -#: ../gtk/parameters.ui.h:55 +#: ../gtk/parameters.ui.h:58 msgid "Wizard" msgstr "" -#: ../gtk/parameters.ui.h:56 +#: ../gtk/parameters.ui.h:59 msgid "Add" msgstr "Aggiungi" -#: ../gtk/parameters.ui.h:57 +#: ../gtk/parameters.ui.h:60 msgid "Edit" msgstr "Edita" -#: ../gtk/parameters.ui.h:58 +#: ../gtk/parameters.ui.h:61 msgid "Remove" msgstr "Rimuovi" -#: ../gtk/parameters.ui.h:59 +#: ../gtk/parameters.ui.h:62 msgid "Proxy accounts" msgstr "Account proxy" -#: ../gtk/parameters.ui.h:60 +#: ../gtk/parameters.ui.h:63 msgid "Erase all passwords" msgstr "Cancella tutte le password" -#: ../gtk/parameters.ui.h:61 +#: ../gtk/parameters.ui.h:64 msgid "Privacy" msgstr "Privacy" -#: ../gtk/parameters.ui.h:62 +#: ../gtk/parameters.ui.h:65 msgid "Automatically answer when a call is received" msgstr "" -#: ../gtk/parameters.ui.h:63 +#: ../gtk/parameters.ui.h:66 +msgid "Delay before answering (ms)" +msgstr "" + +#: ../gtk/parameters.ui.h:67 msgid "Auto-answer" msgstr "" -#: ../gtk/parameters.ui.h:64 +#: ../gtk/parameters.ui.h:68 msgid "Manage SIP Accounts" msgstr "Gestici SIP Account" -#: ../gtk/parameters.ui.h:65 ../gtk/tunnel_config.ui.h:4 +#: ../gtk/parameters.ui.h:69 ../gtk/tunnel_config.ui.h:4 msgid "Enable" msgstr "Attivato" -#: ../gtk/parameters.ui.h:66 ../gtk/tunnel_config.ui.h:5 +#: ../gtk/parameters.ui.h:70 ../gtk/tunnel_config.ui.h:5 msgid "Disable" msgstr "Disattivato" -#: ../gtk/parameters.ui.h:67 +#: ../gtk/parameters.ui.h:71 msgid "Codecs" msgstr "Codecs" -#: ../gtk/parameters.ui.h:68 +#: ../gtk/parameters.ui.h:72 msgid "0 stands for \"unlimited\"" msgstr "0 sta per illimitato" -#: ../gtk/parameters.ui.h:69 +#: ../gtk/parameters.ui.h:73 msgid "Upload speed limit in Kbit/sec:" msgstr "Velocità massima in upload Kbit/sec:" -#: ../gtk/parameters.ui.h:70 +#: ../gtk/parameters.ui.h:74 msgid "Download speed limit in Kbit/sec:" msgstr "Velocita massima in Dowload Kbit/sec" -#: ../gtk/parameters.ui.h:71 +#: ../gtk/parameters.ui.h:75 msgid "Enable adaptive rate control" msgstr "" -#: ../gtk/parameters.ui.h:72 +#: ../gtk/parameters.ui.h:76 msgid "" "Adaptive rate control is a technique to dynamically guess the available " "bandwidth during a call." msgstr "" -#: ../gtk/parameters.ui.h:73 +#: ../gtk/parameters.ui.h:77 msgid "Bandwidth control" msgstr "Gestione banda" -#: ../gtk/parameters.ui.h:74 +#: ../gtk/parameters.ui.h:78 msgid "Codecs" msgstr "Codec" -#: ../gtk/parameters.ui.h:75 +#: ../gtk/parameters.ui.h:79 msgid "Language" msgstr "Linguaggio" -#: ../gtk/parameters.ui.h:76 +#: ../gtk/parameters.ui.h:80 msgid "Show advanced settings" msgstr "" -#: ../gtk/parameters.ui.h:77 +#: ../gtk/parameters.ui.h:81 msgid "Level" msgstr "" -#: ../gtk/parameters.ui.h:78 +#: ../gtk/parameters.ui.h:82 msgid "User interface" msgstr "Interfaccia utente" -#: ../gtk/parameters.ui.h:79 ../gtk/ldap.ui.h:2 +#: ../gtk/parameters.ui.h:83 ../gtk/ldap.ui.h:2 msgid "Server address:" msgstr "" -#: ../gtk/parameters.ui.h:80 ../gtk/ldap.ui.h:3 +#: ../gtk/parameters.ui.h:84 ../gtk/ldap.ui.h:3 msgid "Authentication method:" msgstr "" -#: ../gtk/parameters.ui.h:82 +#: ../gtk/parameters.ui.h:86 msgid "LDAP Account setup" msgstr "" -#: ../gtk/parameters.ui.h:83 +#: ../gtk/parameters.ui.h:87 msgid "LDAP" msgstr "" -#: ../gtk/parameters.ui.h:84 +#: ../gtk/parameters.ui.h:88 msgid "Done" msgstr "Fatto" -#: ../gtk/parameters.ui.h:85 -msgid "SIP (UDP)" -msgstr "" - -#: ../gtk/parameters.ui.h:86 -msgid "SIP (TCP)" -msgstr "" - -#: ../gtk/parameters.ui.h:87 -msgid "SIP (TLS)" -msgstr "" - #: ../gtk/buddylookup.ui.h:1 msgid "Search contacts in directory" msgstr "Cerca contatti nella directory" @@ -1694,60 +1698,60 @@ msgstr "" msgid "Please wait while fetching configuration from server..." msgstr "" -#: ../coreapi/linphonecore.c:1534 +#: ../coreapi/linphonecore.c:1538 msgid "Ready" msgstr "Pronto" -#: ../coreapi/linphonecore.c:2534 +#: ../coreapi/linphonecore.c:2550 msgid "Configuring" msgstr "" -#: ../coreapi/linphonecore.c:2708 +#: ../coreapi/linphonecore.c:2724 msgid "Looking for telephone number destination..." msgstr "Ricerca numero destinazione..." -#: ../coreapi/linphonecore.c:2710 +#: ../coreapi/linphonecore.c:2726 msgid "Could not resolve this number." msgstr "Impossibile risolvere il numero." #. must be known at that time -#: ../coreapi/linphonecore.c:2996 +#: ../coreapi/linphonecore.c:3012 msgid "Contacting" msgstr "In connessione" -#: ../coreapi/linphonecore.c:3001 +#: ../coreapi/linphonecore.c:3017 msgid "Could not call" msgstr "" -#: ../coreapi/linphonecore.c:3152 +#: ../coreapi/linphonecore.c:3168 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "" -#: ../coreapi/linphonecore.c:3310 +#: ../coreapi/linphonecore.c:3326 msgid "is contacting you" msgstr "" -#: ../coreapi/linphonecore.c:3311 +#: ../coreapi/linphonecore.c:3327 msgid " and asked autoanswer." msgstr "" -#: ../coreapi/linphonecore.c:3435 +#: ../coreapi/linphonecore.c:3451 msgid "Modifying call parameters..." msgstr "" -#: ../coreapi/linphonecore.c:3782 +#: ../coreapi/linphonecore.c:3798 msgid "Connected." msgstr "Connessione" -#: ../coreapi/linphonecore.c:3807 +#: ../coreapi/linphonecore.c:3823 msgid "Call aborted" msgstr "" -#: ../coreapi/linphonecore.c:3997 +#: ../coreapi/linphonecore.c:4013 msgid "Could not pause the call" msgstr "" -#: ../coreapi/linphonecore.c:4000 +#: ../coreapi/linphonecore.c:4016 msgid "Pausing the current call..." msgstr "" @@ -1943,11 +1947,11 @@ msgstr "" msgid "Authentication token is %s" msgstr "" -#: ../coreapi/linphonecall.c:1305 +#: ../coreapi/linphonecall.c:1306 msgid "Call parameters were successfully modified." msgstr "" -#: ../coreapi/linphonecall.c:3659 +#: ../coreapi/linphonecall.c:3660 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." diff --git a/po/ja.po b/po/ja.po index 6b9b7e926..2f9366905 100644 --- a/po/ja.po +++ b/po/ja.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: linphone-gtk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-27 14:40+0100\n" -"PO-Revision-Date: 2015-03-27 13:40+0000\n" +"POT-Creation-Date: 2015-04-01 16:25+0200\n" +"PO-Revision-Date: 2015-04-01 14:26+0000\n" "Last-Translator: Belledonne Communications \n" "Language-Team: Japanese (http://www.transifex.com/projects/p/linphone-gtk/language/ja/)\n" "MIME-Version: 1.0\n" @@ -125,7 +125,7 @@ msgstr "オーディオアシスタントを実行" msgid "Run self test and exit 0 if succeed" msgstr "" -#: ../gtk/main.c:1059 +#: ../gtk/main.c:1069 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -133,76 +133,76 @@ msgid "" "If you answer no, this person will be temporarily blacklisted." msgstr "%s が連絡相手にあなたを追加しようとしています。\nあなたのステータスを参照させるか、もしくは連絡先リストに追加することができます。\nあなたが拒否すると、この人は一時的にブラックリストへ登録されます。" -#: ../gtk/main.c:1136 +#: ../gtk/main.c:1146 #, c-format msgid "" "Please enter your password for username %s\n" " at realm %s:" msgstr "" -#: ../gtk/main.c:1257 +#: ../gtk/main.c:1267 msgid "Call error" msgstr "呼出エラー" -#: ../gtk/main.c:1260 ../coreapi/linphonecore.c:3826 +#: ../gtk/main.c:1270 ../coreapi/linphonecore.c:3842 msgid "Call ended" msgstr "呼出終了" -#: ../gtk/main.c:1263 ../coreapi/call_log.c:221 +#: ../gtk/main.c:1273 ../coreapi/call_log.c:221 msgid "Incoming call" msgstr "着信" -#: ../gtk/main.c:1265 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 +#: ../gtk/main.c:1275 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 msgid "Answer" msgstr "応答" -#: ../gtk/main.c:1267 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1277 ../gtk/main.ui.h:6 msgid "Decline" msgstr "拒否" -#: ../gtk/main.c:1273 +#: ../gtk/main.c:1283 msgid "Call paused" msgstr "呼び出しの一時停止" -#: ../gtk/main.c:1273 +#: ../gtk/main.c:1283 #, c-format msgid "by %s" msgstr "%s" -#: ../gtk/main.c:1343 +#: ../gtk/main.c:1353 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1505 +#: ../gtk/main.c:1516 msgid "Website link" msgstr "ウェブサイトリンク" -#: ../gtk/main.c:1554 +#: ../gtk/main.c:1565 msgid "Linphone - a video internet phone" msgstr "Linphone - ビデオインターネット電話" -#: ../gtk/main.c:1646 +#: ../gtk/main.c:1657 #, c-format msgid "%s (Default)" msgstr "%s (デフォルト)" -#: ../gtk/main.c:1978 ../coreapi/callbacks.c:1057 +#: ../gtk/main.c:1989 ../coreapi/callbacks.c:1057 #, c-format msgid "We are transferred to %s" msgstr "%s に転送しました" -#: ../gtk/main.c:1988 +#: ../gtk/main.c:1999 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." msgstr "" -#: ../gtk/main.c:2136 +#: ../gtk/main.c:2147 msgid "A free SIP video-phone" msgstr "無料 SIP ビデオ-電話" -#: ../gtk/main.c:2241 +#: ../gtk/main.c:2252 #, c-format msgid "Hello\n" msgstr "" @@ -276,7 +276,7 @@ msgstr "パラメーター" msgid "Enabled" msgstr "使用する" -#: ../gtk/propertybox.c:622 ../gtk/propertybox.c:763 ../gtk/parameters.ui.h:17 +#: ../gtk/propertybox.c:622 ../gtk/propertybox.c:763 ../gtk/parameters.ui.h:20 msgid "Disabled" msgstr "使用しない" @@ -440,7 +440,7 @@ msgstr "" msgid "Enter your linphone.org username" msgstr "linphone.orgで取得したユーザー名を入力" -#: ../gtk/setupwizard.c:102 ../gtk/parameters.ui.h:81 ../gtk/ldap.ui.h:4 +#: ../gtk/setupwizard.c:102 ../gtk/parameters.ui.h:85 ../gtk/ldap.ui.h:4 msgid "Username:" msgstr "ユーザー名:" @@ -1177,307 +1177,311 @@ msgid "C" msgstr "C" #: ../gtk/parameters.ui.h:11 +msgid "SIP (UDP)" +msgstr "SIP (UDP)" + +#: ../gtk/parameters.ui.h:12 +msgid "SIP (TCP)" +msgstr "SIP (TCP)" + +#: ../gtk/parameters.ui.h:13 +msgid "SIP (TLS)" +msgstr "SIP (TLS)" + +#: ../gtk/parameters.ui.h:14 msgid "Settings" msgstr "設定" -#: ../gtk/parameters.ui.h:12 +#: ../gtk/parameters.ui.h:15 msgid "Set Maximum Transmission Unit:" msgstr "" -#: ../gtk/parameters.ui.h:13 +#: ../gtk/parameters.ui.h:16 msgid "Send DTMFs as SIP info" msgstr "DTMFをSIP情報で送信する" -#: ../gtk/parameters.ui.h:14 +#: ../gtk/parameters.ui.h:17 msgid "Allow IPv6" msgstr "" -#: ../gtk/parameters.ui.h:15 +#: ../gtk/parameters.ui.h:18 msgid "Transport" msgstr "転送" -#: ../gtk/parameters.ui.h:16 +#: ../gtk/parameters.ui.h:19 msgid "SIP/UDP port" msgstr "SIP/UDP ポート" -#: ../gtk/parameters.ui.h:18 +#: ../gtk/parameters.ui.h:21 msgid "Random" msgstr "" -#: ../gtk/parameters.ui.h:19 +#: ../gtk/parameters.ui.h:22 msgid "SIP/TCP port" msgstr "SIP/TCP ポート" -#: ../gtk/parameters.ui.h:20 +#: ../gtk/parameters.ui.h:23 msgid "Audio RTP/UDP:" msgstr "オーディオ RTP/UDP:" -#: ../gtk/parameters.ui.h:21 +#: ../gtk/parameters.ui.h:24 msgid "Fixed" msgstr "" -#: ../gtk/parameters.ui.h:22 +#: ../gtk/parameters.ui.h:25 msgid "Video RTP/UDP:" msgstr "ビデオ RTP/UDP:" -#: ../gtk/parameters.ui.h:23 +#: ../gtk/parameters.ui.h:26 msgid "Media encryption type" msgstr "メディアの暗号化の種類" -#: ../gtk/parameters.ui.h:24 +#: ../gtk/parameters.ui.h:27 msgid "Media encryption is mandatory" msgstr "" -#: ../gtk/parameters.ui.h:25 +#: ../gtk/parameters.ui.h:28 msgid "Tunnel" msgstr "トンネル" -#: ../gtk/parameters.ui.h:26 +#: ../gtk/parameters.ui.h:29 msgid "DSCP fields" msgstr "DSCP値" -#: ../gtk/parameters.ui.h:27 +#: ../gtk/parameters.ui.h:30 msgid "Network protocol and ports" msgstr "ネットワークのプロトコルとポート" -#: ../gtk/parameters.ui.h:28 +#: ../gtk/parameters.ui.h:31 msgid "Direct connection to the Internet" msgstr "" -#: ../gtk/parameters.ui.h:29 +#: ../gtk/parameters.ui.h:32 msgid "Behind NAT / Firewall (specify gateway IP )" msgstr "" -#: ../gtk/parameters.ui.h:30 +#: ../gtk/parameters.ui.h:33 msgid "Behind NAT / Firewall (use STUN to resolve)" msgstr "" -#: ../gtk/parameters.ui.h:31 +#: ../gtk/parameters.ui.h:34 msgid "Behind NAT / Firewall (use ICE)" msgstr "" -#: ../gtk/parameters.ui.h:32 +#: ../gtk/parameters.ui.h:35 msgid "Behind NAT / Firewall (use uPnP)" msgstr "" -#: ../gtk/parameters.ui.h:33 +#: ../gtk/parameters.ui.h:36 msgid "Public IP address:" msgstr "パブリック IP アドレス:" -#: ../gtk/parameters.ui.h:34 +#: ../gtk/parameters.ui.h:37 msgid "Stun server:" msgstr "Stunサーバー:" -#: ../gtk/parameters.ui.h:35 +#: ../gtk/parameters.ui.h:38 msgid "NAT and Firewall" msgstr "NAT と ファイヤーウォール" -#: ../gtk/parameters.ui.h:36 +#: ../gtk/parameters.ui.h:39 msgid "Network settings" msgstr "ネットワーク設定" -#: ../gtk/parameters.ui.h:37 +#: ../gtk/parameters.ui.h:40 msgid "Ring sound:" msgstr "鳴動音:" -#: ../gtk/parameters.ui.h:38 +#: ../gtk/parameters.ui.h:41 msgid "ALSA special device (optional):" msgstr "" -#: ../gtk/parameters.ui.h:39 +#: ../gtk/parameters.ui.h:42 msgid "Capture device:" msgstr "" -#: ../gtk/parameters.ui.h:40 +#: ../gtk/parameters.ui.h:43 msgid "Ring device:" msgstr "" -#: ../gtk/parameters.ui.h:41 +#: ../gtk/parameters.ui.h:44 msgid "Playback device:" msgstr "" -#: ../gtk/parameters.ui.h:42 +#: ../gtk/parameters.ui.h:45 msgid "Enable echo cancellation" msgstr "エコーキャンセラーを有効にする" -#: ../gtk/parameters.ui.h:43 +#: ../gtk/parameters.ui.h:46 msgid "Audio" msgstr "オーディオ" -#: ../gtk/parameters.ui.h:44 +#: ../gtk/parameters.ui.h:47 msgid "Video input device:" msgstr "" -#: ../gtk/parameters.ui.h:45 +#: ../gtk/parameters.ui.h:48 msgid "Prefered video resolution:" msgstr "" -#: ../gtk/parameters.ui.h:46 +#: ../gtk/parameters.ui.h:49 msgid "Video output method:" msgstr "" -#: ../gtk/parameters.ui.h:47 +#: ../gtk/parameters.ui.h:50 msgid "Show camera preview" msgstr "" -#: ../gtk/parameters.ui.h:48 +#: ../gtk/parameters.ui.h:51 msgid "Video" msgstr "ビデオ" -#: ../gtk/parameters.ui.h:49 +#: ../gtk/parameters.ui.h:52 msgid "Multimedia settings" msgstr "マルチメディア設定" -#: ../gtk/parameters.ui.h:50 +#: ../gtk/parameters.ui.h:53 msgid "This section defines your SIP address when not using a SIP account" msgstr "" -#: ../gtk/parameters.ui.h:51 +#: ../gtk/parameters.ui.h:54 msgid "Your display name (eg: John Doe):" msgstr "あなたの表示名 (例: John Doe):" -#: ../gtk/parameters.ui.h:52 +#: ../gtk/parameters.ui.h:55 msgid "Your username:" msgstr "あなたのユーザー名:" -#: ../gtk/parameters.ui.h:53 +#: ../gtk/parameters.ui.h:56 msgid "Your resulting SIP address:" msgstr "" -#: ../gtk/parameters.ui.h:54 +#: ../gtk/parameters.ui.h:57 msgid "Default identity" msgstr "" -#: ../gtk/parameters.ui.h:55 +#: ../gtk/parameters.ui.h:58 msgid "Wizard" msgstr "ウィザード" -#: ../gtk/parameters.ui.h:56 +#: ../gtk/parameters.ui.h:59 msgid "Add" msgstr "追加する" -#: ../gtk/parameters.ui.h:57 +#: ../gtk/parameters.ui.h:60 msgid "Edit" msgstr "編集する" -#: ../gtk/parameters.ui.h:58 +#: ../gtk/parameters.ui.h:61 msgid "Remove" msgstr "削除する" -#: ../gtk/parameters.ui.h:59 +#: ../gtk/parameters.ui.h:62 msgid "Proxy accounts" msgstr "プロキシアカウント" -#: ../gtk/parameters.ui.h:60 +#: ../gtk/parameters.ui.h:63 msgid "Erase all passwords" msgstr "すべてのパスワードを消去する" -#: ../gtk/parameters.ui.h:61 +#: ../gtk/parameters.ui.h:64 msgid "Privacy" msgstr "プライバシー" -#: ../gtk/parameters.ui.h:62 +#: ../gtk/parameters.ui.h:65 msgid "Automatically answer when a call is received" msgstr "" -#: ../gtk/parameters.ui.h:63 +#: ../gtk/parameters.ui.h:66 +msgid "Delay before answering (ms)" +msgstr "" + +#: ../gtk/parameters.ui.h:67 msgid "Auto-answer" msgstr "" -#: ../gtk/parameters.ui.h:64 +#: ../gtk/parameters.ui.h:68 msgid "Manage SIP Accounts" msgstr "" -#: ../gtk/parameters.ui.h:65 ../gtk/tunnel_config.ui.h:4 +#: ../gtk/parameters.ui.h:69 ../gtk/tunnel_config.ui.h:4 msgid "Enable" msgstr "使用する" -#: ../gtk/parameters.ui.h:66 ../gtk/tunnel_config.ui.h:5 +#: ../gtk/parameters.ui.h:70 ../gtk/tunnel_config.ui.h:5 msgid "Disable" msgstr "使用しない" -#: ../gtk/parameters.ui.h:67 +#: ../gtk/parameters.ui.h:71 msgid "Codecs" msgstr "コーデック" -#: ../gtk/parameters.ui.h:68 +#: ../gtk/parameters.ui.h:72 msgid "0 stands for \"unlimited\"" msgstr "" -#: ../gtk/parameters.ui.h:69 +#: ../gtk/parameters.ui.h:73 msgid "Upload speed limit in Kbit/sec:" msgstr "アップロード速度制限 Kbit/sec:" -#: ../gtk/parameters.ui.h:70 +#: ../gtk/parameters.ui.h:74 msgid "Download speed limit in Kbit/sec:" msgstr "ダウンロード速度制限 Kbit/sec:" -#: ../gtk/parameters.ui.h:71 +#: ../gtk/parameters.ui.h:75 msgid "Enable adaptive rate control" msgstr "" -#: ../gtk/parameters.ui.h:72 +#: ../gtk/parameters.ui.h:76 msgid "" "Adaptive rate control is a technique to dynamically guess the available " "bandwidth during a call." msgstr "" -#: ../gtk/parameters.ui.h:73 +#: ../gtk/parameters.ui.h:77 msgid "Bandwidth control" msgstr "帯域幅制御" -#: ../gtk/parameters.ui.h:74 +#: ../gtk/parameters.ui.h:78 msgid "Codecs" msgstr "コーデック" -#: ../gtk/parameters.ui.h:75 +#: ../gtk/parameters.ui.h:79 msgid "Language" msgstr "言語" -#: ../gtk/parameters.ui.h:76 +#: ../gtk/parameters.ui.h:80 msgid "Show advanced settings" msgstr "拡張設定を表示する" -#: ../gtk/parameters.ui.h:77 +#: ../gtk/parameters.ui.h:81 msgid "Level" msgstr "レベル" -#: ../gtk/parameters.ui.h:78 +#: ../gtk/parameters.ui.h:82 msgid "User interface" msgstr "ユーザーインターフェイス" -#: ../gtk/parameters.ui.h:79 ../gtk/ldap.ui.h:2 +#: ../gtk/parameters.ui.h:83 ../gtk/ldap.ui.h:2 msgid "Server address:" msgstr "サーバーアドレス:" -#: ../gtk/parameters.ui.h:80 ../gtk/ldap.ui.h:3 +#: ../gtk/parameters.ui.h:84 ../gtk/ldap.ui.h:3 msgid "Authentication method:" msgstr "" -#: ../gtk/parameters.ui.h:82 +#: ../gtk/parameters.ui.h:86 msgid "LDAP Account setup" msgstr "" -#: ../gtk/parameters.ui.h:83 +#: ../gtk/parameters.ui.h:87 msgid "LDAP" msgstr "LDAP" -#: ../gtk/parameters.ui.h:84 +#: ../gtk/parameters.ui.h:88 msgid "Done" msgstr "完了" -#: ../gtk/parameters.ui.h:85 -msgid "SIP (UDP)" -msgstr "SIP (UDP)" - -#: ../gtk/parameters.ui.h:86 -msgid "SIP (TCP)" -msgstr "SIP (TCP)" - -#: ../gtk/parameters.ui.h:87 -msgid "SIP (TLS)" -msgstr "SIP (TLS)" - #: ../gtk/buddylookup.ui.h:1 msgid "Search contacts in directory" msgstr "" @@ -1693,60 +1697,60 @@ msgstr "" msgid "Please wait while fetching configuration from server..." msgstr "" -#: ../coreapi/linphonecore.c:1534 +#: ../coreapi/linphonecore.c:1538 msgid "Ready" msgstr "準備" -#: ../coreapi/linphonecore.c:2534 +#: ../coreapi/linphonecore.c:2550 msgid "Configuring" msgstr "" -#: ../coreapi/linphonecore.c:2708 +#: ../coreapi/linphonecore.c:2724 msgid "Looking for telephone number destination..." msgstr "" -#: ../coreapi/linphonecore.c:2710 +#: ../coreapi/linphonecore.c:2726 msgid "Could not resolve this number." msgstr "" #. must be known at that time -#: ../coreapi/linphonecore.c:2996 +#: ../coreapi/linphonecore.c:3012 msgid "Contacting" msgstr "" -#: ../coreapi/linphonecore.c:3001 +#: ../coreapi/linphonecore.c:3017 msgid "Could not call" msgstr "" -#: ../coreapi/linphonecore.c:3152 +#: ../coreapi/linphonecore.c:3168 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "" -#: ../coreapi/linphonecore.c:3310 +#: ../coreapi/linphonecore.c:3326 msgid "is contacting you" msgstr "" -#: ../coreapi/linphonecore.c:3311 +#: ../coreapi/linphonecore.c:3327 msgid " and asked autoanswer." msgstr "と自動応答を尋ねる" -#: ../coreapi/linphonecore.c:3435 +#: ../coreapi/linphonecore.c:3451 msgid "Modifying call parameters..." msgstr "コールパラメーターの変更..." -#: ../coreapi/linphonecore.c:3782 +#: ../coreapi/linphonecore.c:3798 msgid "Connected." msgstr "接続しました。" -#: ../coreapi/linphonecore.c:3807 +#: ../coreapi/linphonecore.c:3823 msgid "Call aborted" msgstr "呼び出しを打ち切る" -#: ../coreapi/linphonecore.c:3997 +#: ../coreapi/linphonecore.c:4013 msgid "Could not pause the call" msgstr "呼び出しを一時停止できませんでした" -#: ../coreapi/linphonecore.c:4000 +#: ../coreapi/linphonecore.c:4016 msgid "Pausing the current call..." msgstr "現在の通話を一時停止..." @@ -1942,11 +1946,11 @@ msgstr "" msgid "Authentication token is %s" msgstr "" -#: ../coreapi/linphonecall.c:1305 +#: ../coreapi/linphonecall.c:1306 msgid "Call parameters were successfully modified." msgstr "" -#: ../coreapi/linphonecall.c:3659 +#: ../coreapi/linphonecall.c:3660 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." diff --git a/po/nb_NO.po b/po/nb_NO.po index 07c3a2728..a59e02e36 100644 --- a/po/nb_NO.po +++ b/po/nb_NO.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: linphone-gtk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-27 14:40+0100\n" -"PO-Revision-Date: 2015-03-27 13:40+0000\n" +"POT-Creation-Date: 2015-04-01 16:25+0200\n" +"PO-Revision-Date: 2015-04-01 14:26+0000\n" "Last-Translator: Belledonne Communications \n" "Language-Team: Norwegian Bokmål (Norway) (http://www.transifex.com/projects/p/linphone-gtk/language/nb_NO/)\n" "MIME-Version: 1.0\n" @@ -126,7 +126,7 @@ msgstr "" msgid "Run self test and exit 0 if succeed" msgstr "" -#: ../gtk/main.c:1059 +#: ../gtk/main.c:1069 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -134,76 +134,76 @@ msgid "" "If you answer no, this person will be temporarily blacklisted." msgstr "%s vil legge deg til i hans/hennes kontaktliste.\nVil du tillate vedkommende å se din tilstedestatus eller legge vedkommende i din kontaktliste?\nHvis du svarer nei vil personen bli svartelyst midlertidig." -#: ../gtk/main.c:1136 +#: ../gtk/main.c:1146 #, c-format msgid "" "Please enter your password for username %s\n" " at realm %s:" msgstr "" -#: ../gtk/main.c:1257 +#: ../gtk/main.c:1267 msgid "Call error" msgstr "" -#: ../gtk/main.c:1260 ../coreapi/linphonecore.c:3826 +#: ../gtk/main.c:1270 ../coreapi/linphonecore.c:3842 msgid "Call ended" msgstr "Samtale avsluttet" -#: ../gtk/main.c:1263 ../coreapi/call_log.c:221 +#: ../gtk/main.c:1273 ../coreapi/call_log.c:221 msgid "Incoming call" msgstr "Innkommende samtale" -#: ../gtk/main.c:1265 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 +#: ../gtk/main.c:1275 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 msgid "Answer" msgstr "Svarer" -#: ../gtk/main.c:1267 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1277 ../gtk/main.ui.h:6 msgid "Decline" msgstr "Avvis" -#: ../gtk/main.c:1273 +#: ../gtk/main.c:1283 msgid "Call paused" msgstr "" -#: ../gtk/main.c:1273 +#: ../gtk/main.c:1283 #, c-format msgid "by %s" msgstr "" -#: ../gtk/main.c:1343 +#: ../gtk/main.c:1353 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1505 +#: ../gtk/main.c:1516 msgid "Website link" msgstr "Peker til nettsted" -#: ../gtk/main.c:1554 +#: ../gtk/main.c:1565 msgid "Linphone - a video internet phone" msgstr "Linphone - en video Internet telefon" -#: ../gtk/main.c:1646 +#: ../gtk/main.c:1657 #, c-format msgid "%s (Default)" msgstr "%s (Standard)" -#: ../gtk/main.c:1978 ../coreapi/callbacks.c:1057 +#: ../gtk/main.c:1989 ../coreapi/callbacks.c:1057 #, c-format msgid "We are transferred to %s" msgstr "Vi er overført til %s" -#: ../gtk/main.c:1988 +#: ../gtk/main.c:1999 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." msgstr "Klarte ikke å finne noe lydkort på denne datamaskinen.\nDu vil ikke kunne sende eller motta lydsamtaler." -#: ../gtk/main.c:2136 +#: ../gtk/main.c:2147 msgid "A free SIP video-phone" msgstr "En gratis SIP video-telefon" -#: ../gtk/main.c:2241 +#: ../gtk/main.c:2252 #, c-format msgid "Hello\n" msgstr "" @@ -277,7 +277,7 @@ msgstr "Parametere" msgid "Enabled" msgstr "På" -#: ../gtk/propertybox.c:622 ../gtk/propertybox.c:763 ../gtk/parameters.ui.h:17 +#: ../gtk/propertybox.c:622 ../gtk/propertybox.c:763 ../gtk/parameters.ui.h:20 msgid "Disabled" msgstr "Av" @@ -442,7 +442,7 @@ msgstr "" msgid "Enter your linphone.org username" msgstr "" -#: ../gtk/setupwizard.c:102 ../gtk/parameters.ui.h:81 ../gtk/ldap.ui.h:4 +#: ../gtk/setupwizard.c:102 ../gtk/parameters.ui.h:85 ../gtk/ldap.ui.h:4 msgid "Username:" msgstr "Brukernavn:" @@ -1179,307 +1179,311 @@ msgid "C" msgstr "C" #: ../gtk/parameters.ui.h:11 +msgid "SIP (UDP)" +msgstr "" + +#: ../gtk/parameters.ui.h:12 +msgid "SIP (TCP)" +msgstr "" + +#: ../gtk/parameters.ui.h:13 +msgid "SIP (TLS)" +msgstr "" + +#: ../gtk/parameters.ui.h:14 msgid "Settings" msgstr "Innstillinger" -#: ../gtk/parameters.ui.h:12 +#: ../gtk/parameters.ui.h:15 msgid "Set Maximum Transmission Unit:" msgstr "Velg MTU (Maximum Transmission Unit):" -#: ../gtk/parameters.ui.h:13 +#: ../gtk/parameters.ui.h:16 msgid "Send DTMFs as SIP info" msgstr "Send DTMF som SIP-info" -#: ../gtk/parameters.ui.h:14 +#: ../gtk/parameters.ui.h:17 msgid "Allow IPv6" msgstr "" -#: ../gtk/parameters.ui.h:15 +#: ../gtk/parameters.ui.h:18 msgid "Transport" msgstr "Transport" -#: ../gtk/parameters.ui.h:16 +#: ../gtk/parameters.ui.h:19 msgid "SIP/UDP port" msgstr "" -#: ../gtk/parameters.ui.h:18 +#: ../gtk/parameters.ui.h:21 msgid "Random" msgstr "" -#: ../gtk/parameters.ui.h:19 +#: ../gtk/parameters.ui.h:22 msgid "SIP/TCP port" msgstr "" -#: ../gtk/parameters.ui.h:20 +#: ../gtk/parameters.ui.h:23 msgid "Audio RTP/UDP:" msgstr "Lyd RTP/UDP:" -#: ../gtk/parameters.ui.h:21 +#: ../gtk/parameters.ui.h:24 msgid "Fixed" msgstr "" -#: ../gtk/parameters.ui.h:22 +#: ../gtk/parameters.ui.h:25 msgid "Video RTP/UDP:" msgstr "Video RTP/UDP:" -#: ../gtk/parameters.ui.h:23 +#: ../gtk/parameters.ui.h:26 msgid "Media encryption type" msgstr "" -#: ../gtk/parameters.ui.h:24 +#: ../gtk/parameters.ui.h:27 msgid "Media encryption is mandatory" msgstr "" -#: ../gtk/parameters.ui.h:25 +#: ../gtk/parameters.ui.h:28 msgid "Tunnel" msgstr "" -#: ../gtk/parameters.ui.h:26 +#: ../gtk/parameters.ui.h:29 msgid "DSCP fields" msgstr "" -#: ../gtk/parameters.ui.h:27 +#: ../gtk/parameters.ui.h:30 msgid "Network protocol and ports" msgstr "" -#: ../gtk/parameters.ui.h:28 +#: ../gtk/parameters.ui.h:31 msgid "Direct connection to the Internet" msgstr "Tilkoblet Internett direkte" -#: ../gtk/parameters.ui.h:29 +#: ../gtk/parameters.ui.h:32 msgid "Behind NAT / Firewall (specify gateway IP )" msgstr "" -#: ../gtk/parameters.ui.h:30 +#: ../gtk/parameters.ui.h:33 msgid "Behind NAT / Firewall (use STUN to resolve)" msgstr "Bak NAT / Brannmur (bruk STUN for å avgjøre)" -#: ../gtk/parameters.ui.h:31 +#: ../gtk/parameters.ui.h:34 msgid "Behind NAT / Firewall (use ICE)" msgstr "" -#: ../gtk/parameters.ui.h:32 +#: ../gtk/parameters.ui.h:35 msgid "Behind NAT / Firewall (use uPnP)" msgstr "" -#: ../gtk/parameters.ui.h:33 +#: ../gtk/parameters.ui.h:36 msgid "Public IP address:" msgstr "Offentlig IP-addresse:" -#: ../gtk/parameters.ui.h:34 +#: ../gtk/parameters.ui.h:37 msgid "Stun server:" msgstr "STUN tjener:" -#: ../gtk/parameters.ui.h:35 +#: ../gtk/parameters.ui.h:38 msgid "NAT and Firewall" msgstr "NAT og Brannvegg" -#: ../gtk/parameters.ui.h:36 +#: ../gtk/parameters.ui.h:39 msgid "Network settings" msgstr "Nettverksinnstillinger" -#: ../gtk/parameters.ui.h:37 +#: ../gtk/parameters.ui.h:40 msgid "Ring sound:" msgstr "Ringelyd:" -#: ../gtk/parameters.ui.h:38 +#: ../gtk/parameters.ui.h:41 msgid "ALSA special device (optional):" msgstr "Spesiell ALSA enhet (valgfritt):" -#: ../gtk/parameters.ui.h:39 +#: ../gtk/parameters.ui.h:42 msgid "Capture device:" msgstr "Mikrofonenhet:" -#: ../gtk/parameters.ui.h:40 +#: ../gtk/parameters.ui.h:43 msgid "Ring device:" msgstr "Ringe-enhet:" -#: ../gtk/parameters.ui.h:41 +#: ../gtk/parameters.ui.h:44 msgid "Playback device:" msgstr "Avspillingsenhet:" -#: ../gtk/parameters.ui.h:42 +#: ../gtk/parameters.ui.h:45 msgid "Enable echo cancellation" msgstr "Bruk ekko-kansellering" -#: ../gtk/parameters.ui.h:43 +#: ../gtk/parameters.ui.h:46 msgid "Audio" msgstr "Lyd" -#: ../gtk/parameters.ui.h:44 +#: ../gtk/parameters.ui.h:47 msgid "Video input device:" msgstr "Videoenhet:" -#: ../gtk/parameters.ui.h:45 +#: ../gtk/parameters.ui.h:48 msgid "Prefered video resolution:" msgstr "Foretrukke video-oppløsning:" -#: ../gtk/parameters.ui.h:46 +#: ../gtk/parameters.ui.h:49 msgid "Video output method:" msgstr "" -#: ../gtk/parameters.ui.h:47 +#: ../gtk/parameters.ui.h:50 msgid "Show camera preview" msgstr "" -#: ../gtk/parameters.ui.h:48 +#: ../gtk/parameters.ui.h:51 msgid "Video" msgstr "Video" -#: ../gtk/parameters.ui.h:49 +#: ../gtk/parameters.ui.h:52 msgid "Multimedia settings" msgstr "Multimediainnstillinger" -#: ../gtk/parameters.ui.h:50 +#: ../gtk/parameters.ui.h:53 msgid "This section defines your SIP address when not using a SIP account" msgstr "Denne seksjonen velger SIP-addresse når du ikke bruker en SIP-konto" -#: ../gtk/parameters.ui.h:51 +#: ../gtk/parameters.ui.h:54 msgid "Your display name (eg: John Doe):" msgstr "Vist navn (eks: Ola Nordmann):" -#: ../gtk/parameters.ui.h:52 +#: ../gtk/parameters.ui.h:55 msgid "Your username:" msgstr "Ditt brukernavn:" -#: ../gtk/parameters.ui.h:53 +#: ../gtk/parameters.ui.h:56 msgid "Your resulting SIP address:" msgstr "Din resulterende SIP addresse:" -#: ../gtk/parameters.ui.h:54 +#: ../gtk/parameters.ui.h:57 msgid "Default identity" msgstr "Standard identitet" -#: ../gtk/parameters.ui.h:55 +#: ../gtk/parameters.ui.h:58 msgid "Wizard" msgstr "" -#: ../gtk/parameters.ui.h:56 +#: ../gtk/parameters.ui.h:59 msgid "Add" msgstr "Legg til" -#: ../gtk/parameters.ui.h:57 +#: ../gtk/parameters.ui.h:60 msgid "Edit" msgstr "Rediger" -#: ../gtk/parameters.ui.h:58 +#: ../gtk/parameters.ui.h:61 msgid "Remove" msgstr "Fjern" -#: ../gtk/parameters.ui.h:59 +#: ../gtk/parameters.ui.h:62 msgid "Proxy accounts" msgstr "Proxy kontoer" -#: ../gtk/parameters.ui.h:60 +#: ../gtk/parameters.ui.h:63 msgid "Erase all passwords" msgstr "Slett alle passord" -#: ../gtk/parameters.ui.h:61 +#: ../gtk/parameters.ui.h:64 msgid "Privacy" msgstr "Personvern" -#: ../gtk/parameters.ui.h:62 +#: ../gtk/parameters.ui.h:65 msgid "Automatically answer when a call is received" msgstr "" -#: ../gtk/parameters.ui.h:63 +#: ../gtk/parameters.ui.h:66 +msgid "Delay before answering (ms)" +msgstr "" + +#: ../gtk/parameters.ui.h:67 msgid "Auto-answer" msgstr "" -#: ../gtk/parameters.ui.h:64 +#: ../gtk/parameters.ui.h:68 msgid "Manage SIP Accounts" msgstr "Behandle SIP-kontoer" -#: ../gtk/parameters.ui.h:65 ../gtk/tunnel_config.ui.h:4 +#: ../gtk/parameters.ui.h:69 ../gtk/tunnel_config.ui.h:4 msgid "Enable" msgstr "Aktiver" -#: ../gtk/parameters.ui.h:66 ../gtk/tunnel_config.ui.h:5 +#: ../gtk/parameters.ui.h:70 ../gtk/tunnel_config.ui.h:5 msgid "Disable" msgstr "Deaktiver" -#: ../gtk/parameters.ui.h:67 +#: ../gtk/parameters.ui.h:71 msgid "Codecs" msgstr "Kodeker" -#: ../gtk/parameters.ui.h:68 +#: ../gtk/parameters.ui.h:72 msgid "0 stands for \"unlimited\"" msgstr "0 betyr \"ubegrenset\"" -#: ../gtk/parameters.ui.h:69 +#: ../gtk/parameters.ui.h:73 msgid "Upload speed limit in Kbit/sec:" msgstr "Maks opplastningshastighet i Kbit/sek:" -#: ../gtk/parameters.ui.h:70 +#: ../gtk/parameters.ui.h:74 msgid "Download speed limit in Kbit/sec:" msgstr "Nedlastningsbegrensning i Kbit/sek:" -#: ../gtk/parameters.ui.h:71 +#: ../gtk/parameters.ui.h:75 msgid "Enable adaptive rate control" msgstr "" -#: ../gtk/parameters.ui.h:72 +#: ../gtk/parameters.ui.h:76 msgid "" "Adaptive rate control is a technique to dynamically guess the available " "bandwidth during a call." msgstr "" -#: ../gtk/parameters.ui.h:73 +#: ../gtk/parameters.ui.h:77 msgid "Bandwidth control" msgstr "Båndbreddekontrol" -#: ../gtk/parameters.ui.h:74 +#: ../gtk/parameters.ui.h:78 msgid "Codecs" msgstr "Kodek" -#: ../gtk/parameters.ui.h:75 +#: ../gtk/parameters.ui.h:79 msgid "Language" msgstr "Språk" -#: ../gtk/parameters.ui.h:76 +#: ../gtk/parameters.ui.h:80 msgid "Show advanced settings" msgstr "Vis avanserte innstillinger" -#: ../gtk/parameters.ui.h:77 +#: ../gtk/parameters.ui.h:81 msgid "Level" msgstr "Nivå" -#: ../gtk/parameters.ui.h:78 +#: ../gtk/parameters.ui.h:82 msgid "User interface" msgstr "Brukergrensesnitt" -#: ../gtk/parameters.ui.h:79 ../gtk/ldap.ui.h:2 +#: ../gtk/parameters.ui.h:83 ../gtk/ldap.ui.h:2 msgid "Server address:" msgstr "" -#: ../gtk/parameters.ui.h:80 ../gtk/ldap.ui.h:3 +#: ../gtk/parameters.ui.h:84 ../gtk/ldap.ui.h:3 msgid "Authentication method:" msgstr "" -#: ../gtk/parameters.ui.h:82 +#: ../gtk/parameters.ui.h:86 msgid "LDAP Account setup" msgstr "" -#: ../gtk/parameters.ui.h:83 +#: ../gtk/parameters.ui.h:87 msgid "LDAP" msgstr "" -#: ../gtk/parameters.ui.h:84 +#: ../gtk/parameters.ui.h:88 msgid "Done" msgstr "Ferdig" -#: ../gtk/parameters.ui.h:85 -msgid "SIP (UDP)" -msgstr "" - -#: ../gtk/parameters.ui.h:86 -msgid "SIP (TCP)" -msgstr "" - -#: ../gtk/parameters.ui.h:87 -msgid "SIP (TLS)" -msgstr "" - #: ../gtk/buddylookup.ui.h:1 msgid "Search contacts in directory" msgstr "Søk kontakter i katalogen" @@ -1695,60 +1699,60 @@ msgstr "" msgid "Please wait while fetching configuration from server..." msgstr "" -#: ../coreapi/linphonecore.c:1534 +#: ../coreapi/linphonecore.c:1538 msgid "Ready" msgstr "Klar" -#: ../coreapi/linphonecore.c:2534 +#: ../coreapi/linphonecore.c:2550 msgid "Configuring" msgstr "" -#: ../coreapi/linphonecore.c:2708 +#: ../coreapi/linphonecore.c:2724 msgid "Looking for telephone number destination..." msgstr "Ser etter telefonnummer for destinasjonen..." -#: ../coreapi/linphonecore.c:2710 +#: ../coreapi/linphonecore.c:2726 msgid "Could not resolve this number." msgstr "Kan ikke tilkoble dette nummeret." #. must be known at that time -#: ../coreapi/linphonecore.c:2996 +#: ../coreapi/linphonecore.c:3012 msgid "Contacting" msgstr "Tilknytter" -#: ../coreapi/linphonecore.c:3001 +#: ../coreapi/linphonecore.c:3017 msgid "Could not call" msgstr "Kunne ikke ringe" -#: ../coreapi/linphonecore.c:3152 +#: ../coreapi/linphonecore.c:3168 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "Beklager, du har nådd maksimalt antall samtidige samtaler" -#: ../coreapi/linphonecore.c:3310 +#: ../coreapi/linphonecore.c:3326 msgid "is contacting you" msgstr "Kontakter deg." -#: ../coreapi/linphonecore.c:3311 +#: ../coreapi/linphonecore.c:3327 msgid " and asked autoanswer." msgstr " og ba om autosvar." -#: ../coreapi/linphonecore.c:3435 +#: ../coreapi/linphonecore.c:3451 msgid "Modifying call parameters..." msgstr "Endrer ringeparametre..." -#: ../coreapi/linphonecore.c:3782 +#: ../coreapi/linphonecore.c:3798 msgid "Connected." msgstr "Tilkoblet" -#: ../coreapi/linphonecore.c:3807 +#: ../coreapi/linphonecore.c:3823 msgid "Call aborted" msgstr "Samtale avbrutt" -#: ../coreapi/linphonecore.c:3997 +#: ../coreapi/linphonecore.c:4013 msgid "Could not pause the call" msgstr "Kunne ikke pause samtalen" -#: ../coreapi/linphonecore.c:4000 +#: ../coreapi/linphonecore.c:4016 msgid "Pausing the current call..." msgstr "Pauser nåværende samtale" @@ -1944,11 +1948,11 @@ msgstr "" msgid "Authentication token is %s" msgstr "" -#: ../coreapi/linphonecall.c:1305 +#: ../coreapi/linphonecall.c:1306 msgid "Call parameters were successfully modified." msgstr "" -#: ../coreapi/linphonecall.c:3659 +#: ../coreapi/linphonecall.c:3660 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." diff --git a/po/nl.po b/po/nl.po index 3b0b86a42..8f445639d 100644 --- a/po/nl.po +++ b/po/nl.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: linphone-gtk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-27 14:40+0100\n" -"PO-Revision-Date: 2015-03-27 13:40+0000\n" +"POT-Creation-Date: 2015-04-01 16:25+0200\n" +"PO-Revision-Date: 2015-04-01 14:26+0000\n" "Last-Translator: Belledonne Communications \n" "Language-Team: Dutch (http://www.transifex.com/projects/p/linphone-gtk/language/nl/)\n" "MIME-Version: 1.0\n" @@ -126,7 +126,7 @@ msgstr "Doorloop de audio-instelwizard" msgid "Run self test and exit 0 if succeed" msgstr "Draai een zelftest en exit 0 wanneer succesvol" -#: ../gtk/main.c:1059 +#: ../gtk/main.c:1069 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -134,76 +134,76 @@ msgid "" "If you answer no, this person will be temporarily blacklisted." msgstr "%s wil u toevoegen aan zijn/haar contactpersonenlijst.\nWilt u toestaan dat hij/zij uw aanwezigheidsstatus ziet of hem/haar toevoegen aan uw contactpersonenljst?\nIndien u nee antwoordt, zal deze persoon tijdelijk op de zwarte lijst worden gezet." -#: ../gtk/main.c:1136 +#: ../gtk/main.c:1146 #, c-format msgid "" "Please enter your password for username %s\n" " at realm %s:" msgstr "Vul uw wachtwoord in voor gebruikersnaam %s\nop realm %s" -#: ../gtk/main.c:1257 +#: ../gtk/main.c:1267 msgid "Call error" msgstr "Oproepfout" -#: ../gtk/main.c:1260 ../coreapi/linphonecore.c:3826 +#: ../gtk/main.c:1270 ../coreapi/linphonecore.c:3842 msgid "Call ended" msgstr "Oproep beëindigd" -#: ../gtk/main.c:1263 ../coreapi/call_log.c:221 +#: ../gtk/main.c:1273 ../coreapi/call_log.c:221 msgid "Incoming call" msgstr "Inkomende oproep" -#: ../gtk/main.c:1265 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 +#: ../gtk/main.c:1275 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 msgid "Answer" msgstr "Opnemen" -#: ../gtk/main.c:1267 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1277 ../gtk/main.ui.h:6 msgid "Decline" msgstr "Weigeren" -#: ../gtk/main.c:1273 +#: ../gtk/main.c:1283 msgid "Call paused" msgstr "Oproep gepauzeerd" -#: ../gtk/main.c:1273 +#: ../gtk/main.c:1283 #, c-format msgid "by %s" msgstr "door %s" -#: ../gtk/main.c:1343 +#: ../gtk/main.c:1353 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "%s stelt u voor om video in te schakelen. Wilt u dit accepteren?" -#: ../gtk/main.c:1505 +#: ../gtk/main.c:1516 msgid "Website link" msgstr "Websitelink" -#: ../gtk/main.c:1554 +#: ../gtk/main.c:1565 msgid "Linphone - a video internet phone" msgstr "Linphone - een video-internettelefoon" -#: ../gtk/main.c:1646 +#: ../gtk/main.c:1657 #, c-format msgid "%s (Default)" msgstr "%s (Standaard)" -#: ../gtk/main.c:1978 ../coreapi/callbacks.c:1057 +#: ../gtk/main.c:1989 ../coreapi/callbacks.c:1057 #, c-format msgid "We are transferred to %s" msgstr "We zijn overgeschakeld naar %s" -#: ../gtk/main.c:1988 +#: ../gtk/main.c:1999 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." msgstr "Er zijn geluidskaarten aangetroffen op deze computer.\nU zult niet in staat zijn om audio-oproepen te ontvangen of versturen." -#: ../gtk/main.c:2136 +#: ../gtk/main.c:2147 msgid "A free SIP video-phone" msgstr "Een gratis SIP-videotelefoon" -#: ../gtk/main.c:2241 +#: ../gtk/main.c:2252 #, c-format msgid "Hello\n" msgstr "" @@ -277,7 +277,7 @@ msgstr "Argumenten" msgid "Enabled" msgstr "Ingeschakeld" -#: ../gtk/propertybox.c:622 ../gtk/propertybox.c:763 ../gtk/parameters.ui.h:17 +#: ../gtk/propertybox.c:622 ../gtk/propertybox.c:763 ../gtk/parameters.ui.h:20 msgid "Disabled" msgstr "Uitgeschakeld" @@ -442,7 +442,7 @@ msgstr "Ik wil een externe URI-configuratie opgeven" msgid "Enter your linphone.org username" msgstr "Vul uw linphone.org-gebruikersnaam in" -#: ../gtk/setupwizard.c:102 ../gtk/parameters.ui.h:81 ../gtk/ldap.ui.h:4 +#: ../gtk/setupwizard.c:102 ../gtk/parameters.ui.h:85 ../gtk/ldap.ui.h:4 msgid "Username:" msgstr "Gebruikersnaam:" @@ -1179,307 +1179,311 @@ msgid "C" msgstr "C" #: ../gtk/parameters.ui.h:11 +msgid "SIP (UDP)" +msgstr "" + +#: ../gtk/parameters.ui.h:12 +msgid "SIP (TCP)" +msgstr "" + +#: ../gtk/parameters.ui.h:13 +msgid "SIP (TLS)" +msgstr "" + +#: ../gtk/parameters.ui.h:14 msgid "Settings" msgstr "Instellingen" -#: ../gtk/parameters.ui.h:12 +#: ../gtk/parameters.ui.h:15 msgid "Set Maximum Transmission Unit:" msgstr "Maximale Transmissie-unit instellen:" -#: ../gtk/parameters.ui.h:13 +#: ../gtk/parameters.ui.h:16 msgid "Send DTMFs as SIP info" msgstr "DTMF's als SIP-informatie versturen" -#: ../gtk/parameters.ui.h:14 +#: ../gtk/parameters.ui.h:17 msgid "Allow IPv6" msgstr "" -#: ../gtk/parameters.ui.h:15 +#: ../gtk/parameters.ui.h:18 msgid "Transport" msgstr "Overdracht" -#: ../gtk/parameters.ui.h:16 +#: ../gtk/parameters.ui.h:19 msgid "SIP/UDP port" msgstr "SIP/UDP-poort" -#: ../gtk/parameters.ui.h:18 +#: ../gtk/parameters.ui.h:21 msgid "Random" msgstr "Willekeurig" -#: ../gtk/parameters.ui.h:19 +#: ../gtk/parameters.ui.h:22 msgid "SIP/TCP port" msgstr "SIP/TCP-poort" -#: ../gtk/parameters.ui.h:20 +#: ../gtk/parameters.ui.h:23 msgid "Audio RTP/UDP:" msgstr "AUDIO RTP/UDP:" -#: ../gtk/parameters.ui.h:21 +#: ../gtk/parameters.ui.h:24 msgid "Fixed" msgstr "Vastgezet" -#: ../gtk/parameters.ui.h:22 +#: ../gtk/parameters.ui.h:25 msgid "Video RTP/UDP:" msgstr "Video RTP/UDP:" -#: ../gtk/parameters.ui.h:23 +#: ../gtk/parameters.ui.h:26 msgid "Media encryption type" msgstr "Mediaversleutelingstype" -#: ../gtk/parameters.ui.h:24 +#: ../gtk/parameters.ui.h:27 msgid "Media encryption is mandatory" msgstr "Mediaversleuteling is vereist" -#: ../gtk/parameters.ui.h:25 +#: ../gtk/parameters.ui.h:28 msgid "Tunnel" msgstr "Tunnel" -#: ../gtk/parameters.ui.h:26 +#: ../gtk/parameters.ui.h:29 msgid "DSCP fields" msgstr "DSCP-velden" -#: ../gtk/parameters.ui.h:27 +#: ../gtk/parameters.ui.h:30 msgid "Network protocol and ports" msgstr "Netwerkprotocol en -poorten" -#: ../gtk/parameters.ui.h:28 +#: ../gtk/parameters.ui.h:31 msgid "Direct connection to the Internet" msgstr "Directe verbinding met het internet" -#: ../gtk/parameters.ui.h:29 +#: ../gtk/parameters.ui.h:32 msgid "Behind NAT / Firewall (specify gateway IP )" msgstr "Achter een NAT / Firewall (specificeer de gateway IP)" -#: ../gtk/parameters.ui.h:30 +#: ../gtk/parameters.ui.h:33 msgid "Behind NAT / Firewall (use STUN to resolve)" msgstr "" -#: ../gtk/parameters.ui.h:31 +#: ../gtk/parameters.ui.h:34 msgid "Behind NAT / Firewall (use ICE)" msgstr "" -#: ../gtk/parameters.ui.h:32 +#: ../gtk/parameters.ui.h:35 msgid "Behind NAT / Firewall (use uPnP)" msgstr "" -#: ../gtk/parameters.ui.h:33 +#: ../gtk/parameters.ui.h:36 msgid "Public IP address:" msgstr "Openbaar IP-adres:" -#: ../gtk/parameters.ui.h:34 +#: ../gtk/parameters.ui.h:37 msgid "Stun server:" msgstr "Stun-server" -#: ../gtk/parameters.ui.h:35 +#: ../gtk/parameters.ui.h:38 msgid "NAT and Firewall" msgstr "NAT en Firewall" -#: ../gtk/parameters.ui.h:36 +#: ../gtk/parameters.ui.h:39 msgid "Network settings" msgstr "Netwerkinstellingen" -#: ../gtk/parameters.ui.h:37 +#: ../gtk/parameters.ui.h:40 msgid "Ring sound:" msgstr "Belgeluid:" -#: ../gtk/parameters.ui.h:38 +#: ../gtk/parameters.ui.h:41 msgid "ALSA special device (optional):" msgstr "ALSA speciaal apparaat (optioneel)" -#: ../gtk/parameters.ui.h:39 +#: ../gtk/parameters.ui.h:42 msgid "Capture device:" msgstr "Opnameapparaat:" -#: ../gtk/parameters.ui.h:40 +#: ../gtk/parameters.ui.h:43 msgid "Ring device:" msgstr "Belapparaat:" -#: ../gtk/parameters.ui.h:41 +#: ../gtk/parameters.ui.h:44 msgid "Playback device:" msgstr "Afspeelapparaat:" -#: ../gtk/parameters.ui.h:42 +#: ../gtk/parameters.ui.h:45 msgid "Enable echo cancellation" msgstr "Echo-onderdrukking inschakelen" -#: ../gtk/parameters.ui.h:43 +#: ../gtk/parameters.ui.h:46 msgid "Audio" msgstr "Audio" -#: ../gtk/parameters.ui.h:44 +#: ../gtk/parameters.ui.h:47 msgid "Video input device:" msgstr "Videoingang-apparaat:" -#: ../gtk/parameters.ui.h:45 +#: ../gtk/parameters.ui.h:48 msgid "Prefered video resolution:" msgstr "Voorkeursvideoresolutie:" -#: ../gtk/parameters.ui.h:46 +#: ../gtk/parameters.ui.h:49 msgid "Video output method:" msgstr "Videouitgangsmethode:" -#: ../gtk/parameters.ui.h:47 +#: ../gtk/parameters.ui.h:50 msgid "Show camera preview" msgstr "Cameravoorbeeld weergeven" -#: ../gtk/parameters.ui.h:48 +#: ../gtk/parameters.ui.h:51 msgid "Video" msgstr "Video" -#: ../gtk/parameters.ui.h:49 +#: ../gtk/parameters.ui.h:52 msgid "Multimedia settings" msgstr "Multimedia-instellingen" -#: ../gtk/parameters.ui.h:50 +#: ../gtk/parameters.ui.h:53 msgid "This section defines your SIP address when not using a SIP account" msgstr "" -#: ../gtk/parameters.ui.h:51 +#: ../gtk/parameters.ui.h:54 msgid "Your display name (eg: John Doe):" msgstr "Uw weergavenaam (bijv.: Jan Noniem):" -#: ../gtk/parameters.ui.h:52 +#: ../gtk/parameters.ui.h:55 msgid "Your username:" msgstr "Uw gebruikersnaam:" -#: ../gtk/parameters.ui.h:53 +#: ../gtk/parameters.ui.h:56 msgid "Your resulting SIP address:" msgstr "" -#: ../gtk/parameters.ui.h:54 +#: ../gtk/parameters.ui.h:57 msgid "Default identity" msgstr "Standaardidentiteit" -#: ../gtk/parameters.ui.h:55 +#: ../gtk/parameters.ui.h:58 msgid "Wizard" msgstr "Instelhulp" -#: ../gtk/parameters.ui.h:56 +#: ../gtk/parameters.ui.h:59 msgid "Add" msgstr "Toevoegen" -#: ../gtk/parameters.ui.h:57 +#: ../gtk/parameters.ui.h:60 msgid "Edit" msgstr "Bewerken" -#: ../gtk/parameters.ui.h:58 +#: ../gtk/parameters.ui.h:61 msgid "Remove" msgstr "Verwijderen" -#: ../gtk/parameters.ui.h:59 +#: ../gtk/parameters.ui.h:62 msgid "Proxy accounts" msgstr "" -#: ../gtk/parameters.ui.h:60 +#: ../gtk/parameters.ui.h:63 msgid "Erase all passwords" msgstr "" -#: ../gtk/parameters.ui.h:61 +#: ../gtk/parameters.ui.h:64 msgid "Privacy" msgstr "" -#: ../gtk/parameters.ui.h:62 +#: ../gtk/parameters.ui.h:65 msgid "Automatically answer when a call is received" msgstr "" -#: ../gtk/parameters.ui.h:63 +#: ../gtk/parameters.ui.h:66 +msgid "Delay before answering (ms)" +msgstr "" + +#: ../gtk/parameters.ui.h:67 msgid "Auto-answer" msgstr "" -#: ../gtk/parameters.ui.h:64 +#: ../gtk/parameters.ui.h:68 msgid "Manage SIP Accounts" msgstr "" -#: ../gtk/parameters.ui.h:65 ../gtk/tunnel_config.ui.h:4 +#: ../gtk/parameters.ui.h:69 ../gtk/tunnel_config.ui.h:4 msgid "Enable" msgstr "Aan" -#: ../gtk/parameters.ui.h:66 ../gtk/tunnel_config.ui.h:5 +#: ../gtk/parameters.ui.h:70 ../gtk/tunnel_config.ui.h:5 msgid "Disable" msgstr "Uit" -#: ../gtk/parameters.ui.h:67 +#: ../gtk/parameters.ui.h:71 msgid "Codecs" msgstr "" -#: ../gtk/parameters.ui.h:68 +#: ../gtk/parameters.ui.h:72 msgid "0 stands for \"unlimited\"" msgstr "" -#: ../gtk/parameters.ui.h:69 +#: ../gtk/parameters.ui.h:73 msgid "Upload speed limit in Kbit/sec:" msgstr "" -#: ../gtk/parameters.ui.h:70 +#: ../gtk/parameters.ui.h:74 msgid "Download speed limit in Kbit/sec:" msgstr "" -#: ../gtk/parameters.ui.h:71 +#: ../gtk/parameters.ui.h:75 msgid "Enable adaptive rate control" msgstr "" -#: ../gtk/parameters.ui.h:72 +#: ../gtk/parameters.ui.h:76 msgid "" "Adaptive rate control is a technique to dynamically guess the available " "bandwidth during a call." msgstr "" -#: ../gtk/parameters.ui.h:73 +#: ../gtk/parameters.ui.h:77 msgid "Bandwidth control" msgstr "" -#: ../gtk/parameters.ui.h:74 +#: ../gtk/parameters.ui.h:78 msgid "Codecs" msgstr "" -#: ../gtk/parameters.ui.h:75 +#: ../gtk/parameters.ui.h:79 msgid "Language" msgstr "" -#: ../gtk/parameters.ui.h:76 +#: ../gtk/parameters.ui.h:80 msgid "Show advanced settings" msgstr "" -#: ../gtk/parameters.ui.h:77 +#: ../gtk/parameters.ui.h:81 msgid "Level" msgstr "" -#: ../gtk/parameters.ui.h:78 +#: ../gtk/parameters.ui.h:82 msgid "User interface" msgstr "" -#: ../gtk/parameters.ui.h:79 ../gtk/ldap.ui.h:2 +#: ../gtk/parameters.ui.h:83 ../gtk/ldap.ui.h:2 msgid "Server address:" msgstr "" -#: ../gtk/parameters.ui.h:80 ../gtk/ldap.ui.h:3 +#: ../gtk/parameters.ui.h:84 ../gtk/ldap.ui.h:3 msgid "Authentication method:" msgstr "" -#: ../gtk/parameters.ui.h:82 +#: ../gtk/parameters.ui.h:86 msgid "LDAP Account setup" msgstr "" -#: ../gtk/parameters.ui.h:83 +#: ../gtk/parameters.ui.h:87 msgid "LDAP" msgstr "" -#: ../gtk/parameters.ui.h:84 +#: ../gtk/parameters.ui.h:88 msgid "Done" msgstr "" -#: ../gtk/parameters.ui.h:85 -msgid "SIP (UDP)" -msgstr "" - -#: ../gtk/parameters.ui.h:86 -msgid "SIP (TCP)" -msgstr "" - -#: ../gtk/parameters.ui.h:87 -msgid "SIP (TLS)" -msgstr "" - #: ../gtk/buddylookup.ui.h:1 msgid "Search contacts in directory" msgstr "" @@ -1695,60 +1699,60 @@ msgstr "" msgid "Please wait while fetching configuration from server..." msgstr "" -#: ../coreapi/linphonecore.c:1534 +#: ../coreapi/linphonecore.c:1538 msgid "Ready" msgstr "Gereed." -#: ../coreapi/linphonecore.c:2534 +#: ../coreapi/linphonecore.c:2550 msgid "Configuring" msgstr "" -#: ../coreapi/linphonecore.c:2708 +#: ../coreapi/linphonecore.c:2724 msgid "Looking for telephone number destination..." msgstr "Zoekt de lokatie van het telefoonnummer..." -#: ../coreapi/linphonecore.c:2710 +#: ../coreapi/linphonecore.c:2726 msgid "Could not resolve this number." msgstr "Kon dit nummer niet vinden." #. must be known at that time -#: ../coreapi/linphonecore.c:2996 +#: ../coreapi/linphonecore.c:3012 msgid "Contacting" msgstr "Verbinden" -#: ../coreapi/linphonecore.c:3001 +#: ../coreapi/linphonecore.c:3017 msgid "Could not call" msgstr "" -#: ../coreapi/linphonecore.c:3152 +#: ../coreapi/linphonecore.c:3168 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "" -#: ../coreapi/linphonecore.c:3310 +#: ../coreapi/linphonecore.c:3326 msgid "is contacting you" msgstr "" -#: ../coreapi/linphonecore.c:3311 +#: ../coreapi/linphonecore.c:3327 msgid " and asked autoanswer." msgstr "" -#: ../coreapi/linphonecore.c:3435 +#: ../coreapi/linphonecore.c:3451 msgid "Modifying call parameters..." msgstr "" -#: ../coreapi/linphonecore.c:3782 +#: ../coreapi/linphonecore.c:3798 msgid "Connected." msgstr "Verbonden." -#: ../coreapi/linphonecore.c:3807 +#: ../coreapi/linphonecore.c:3823 msgid "Call aborted" msgstr "" -#: ../coreapi/linphonecore.c:3997 +#: ../coreapi/linphonecore.c:4013 msgid "Could not pause the call" msgstr "" -#: ../coreapi/linphonecore.c:4000 +#: ../coreapi/linphonecore.c:4016 msgid "Pausing the current call..." msgstr "" @@ -1944,11 +1948,11 @@ msgstr "" msgid "Authentication token is %s" msgstr "" -#: ../coreapi/linphonecall.c:1305 +#: ../coreapi/linphonecall.c:1306 msgid "Call parameters were successfully modified." msgstr "" -#: ../coreapi/linphonecall.c:3659 +#: ../coreapi/linphonecall.c:3660 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." diff --git a/po/pl.po b/po/pl.po index 0b5ddec6c..a4a008819 100644 --- a/po/pl.po +++ b/po/pl.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: linphone-gtk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-27 14:40+0100\n" -"PO-Revision-Date: 2015-03-27 13:40+0000\n" +"POT-Creation-Date: 2015-04-01 16:25+0200\n" +"PO-Revision-Date: 2015-04-01 14:26+0000\n" "Last-Translator: Belledonne Communications \n" "Language-Team: Polish (http://www.transifex.com/projects/p/linphone-gtk/language/pl/)\n" "MIME-Version: 1.0\n" @@ -127,7 +127,7 @@ msgstr "" msgid "Run self test and exit 0 if succeed" msgstr "" -#: ../gtk/main.c:1059 +#: ../gtk/main.c:1069 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -135,76 +135,76 @@ msgid "" "If you answer no, this person will be temporarily blacklisted." msgstr "" -#: ../gtk/main.c:1136 +#: ../gtk/main.c:1146 #, c-format msgid "" "Please enter your password for username %s\n" " at realm %s:" msgstr "" -#: ../gtk/main.c:1257 +#: ../gtk/main.c:1267 msgid "Call error" msgstr "" -#: ../gtk/main.c:1260 ../coreapi/linphonecore.c:3826 +#: ../gtk/main.c:1270 ../coreapi/linphonecore.c:3842 msgid "Call ended" msgstr "" -#: ../gtk/main.c:1263 ../coreapi/call_log.c:221 +#: ../gtk/main.c:1273 ../coreapi/call_log.c:221 msgid "Incoming call" msgstr "" -#: ../gtk/main.c:1265 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 +#: ../gtk/main.c:1275 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 msgid "Answer" msgstr "" -#: ../gtk/main.c:1267 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1277 ../gtk/main.ui.h:6 msgid "Decline" msgstr "" -#: ../gtk/main.c:1273 +#: ../gtk/main.c:1283 msgid "Call paused" msgstr "" -#: ../gtk/main.c:1273 +#: ../gtk/main.c:1283 #, c-format msgid "by %s" msgstr "" -#: ../gtk/main.c:1343 +#: ../gtk/main.c:1353 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1505 +#: ../gtk/main.c:1516 msgid "Website link" msgstr "" -#: ../gtk/main.c:1554 +#: ../gtk/main.c:1565 msgid "Linphone - a video internet phone" msgstr "" -#: ../gtk/main.c:1646 +#: ../gtk/main.c:1657 #, c-format msgid "%s (Default)" msgstr "" -#: ../gtk/main.c:1978 ../coreapi/callbacks.c:1057 +#: ../gtk/main.c:1989 ../coreapi/callbacks.c:1057 #, c-format msgid "We are transferred to %s" msgstr "" -#: ../gtk/main.c:1988 +#: ../gtk/main.c:1999 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." msgstr "" -#: ../gtk/main.c:2136 +#: ../gtk/main.c:2147 msgid "A free SIP video-phone" msgstr "" -#: ../gtk/main.c:2241 +#: ../gtk/main.c:2252 #, c-format msgid "Hello\n" msgstr "" @@ -278,7 +278,7 @@ msgstr "Parametr" msgid "Enabled" msgstr "Włączone" -#: ../gtk/propertybox.c:622 ../gtk/propertybox.c:763 ../gtk/parameters.ui.h:17 +#: ../gtk/propertybox.c:622 ../gtk/propertybox.c:763 ../gtk/parameters.ui.h:20 msgid "Disabled" msgstr "Wyłączone" @@ -444,7 +444,7 @@ msgstr "" msgid "Enter your linphone.org username" msgstr "" -#: ../gtk/setupwizard.c:102 ../gtk/parameters.ui.h:81 ../gtk/ldap.ui.h:4 +#: ../gtk/setupwizard.c:102 ../gtk/parameters.ui.h:85 ../gtk/ldap.ui.h:4 msgid "Username:" msgstr "" @@ -1181,307 +1181,311 @@ msgid "C" msgstr "" #: ../gtk/parameters.ui.h:11 -msgid "Settings" +msgid "SIP (UDP)" msgstr "" #: ../gtk/parameters.ui.h:12 -msgid "Set Maximum Transmission Unit:" +msgid "SIP (TCP)" msgstr "" #: ../gtk/parameters.ui.h:13 -msgid "Send DTMFs as SIP info" +msgid "SIP (TLS)" msgstr "" #: ../gtk/parameters.ui.h:14 -msgid "Allow IPv6" +msgid "Settings" msgstr "" #: ../gtk/parameters.ui.h:15 -msgid "Transport" +msgid "Set Maximum Transmission Unit:" msgstr "" #: ../gtk/parameters.ui.h:16 -msgid "SIP/UDP port" +msgid "Send DTMFs as SIP info" +msgstr "" + +#: ../gtk/parameters.ui.h:17 +msgid "Allow IPv6" msgstr "" #: ../gtk/parameters.ui.h:18 -msgid "Random" +msgid "Transport" msgstr "" #: ../gtk/parameters.ui.h:19 -msgid "SIP/TCP port" -msgstr "" - -#: ../gtk/parameters.ui.h:20 -msgid "Audio RTP/UDP:" +msgid "SIP/UDP port" msgstr "" #: ../gtk/parameters.ui.h:21 -msgid "Fixed" +msgid "Random" msgstr "" #: ../gtk/parameters.ui.h:22 -msgid "Video RTP/UDP:" +msgid "SIP/TCP port" msgstr "" #: ../gtk/parameters.ui.h:23 -msgid "Media encryption type" +msgid "Audio RTP/UDP:" msgstr "" #: ../gtk/parameters.ui.h:24 -msgid "Media encryption is mandatory" +msgid "Fixed" msgstr "" #: ../gtk/parameters.ui.h:25 -msgid "Tunnel" +msgid "Video RTP/UDP:" msgstr "" #: ../gtk/parameters.ui.h:26 -msgid "DSCP fields" +msgid "Media encryption type" msgstr "" #: ../gtk/parameters.ui.h:27 -msgid "Network protocol and ports" +msgid "Media encryption is mandatory" msgstr "" #: ../gtk/parameters.ui.h:28 -msgid "Direct connection to the Internet" +msgid "Tunnel" msgstr "" #: ../gtk/parameters.ui.h:29 -msgid "Behind NAT / Firewall (specify gateway IP )" +msgid "DSCP fields" msgstr "" #: ../gtk/parameters.ui.h:30 -msgid "Behind NAT / Firewall (use STUN to resolve)" +msgid "Network protocol and ports" msgstr "" #: ../gtk/parameters.ui.h:31 -msgid "Behind NAT / Firewall (use ICE)" +msgid "Direct connection to the Internet" msgstr "" #: ../gtk/parameters.ui.h:32 -msgid "Behind NAT / Firewall (use uPnP)" +msgid "Behind NAT / Firewall (specify gateway IP )" msgstr "" #: ../gtk/parameters.ui.h:33 -msgid "Public IP address:" +msgid "Behind NAT / Firewall (use STUN to resolve)" msgstr "" #: ../gtk/parameters.ui.h:34 -msgid "Stun server:" +msgid "Behind NAT / Firewall (use ICE)" msgstr "" #: ../gtk/parameters.ui.h:35 -msgid "NAT and Firewall" +msgid "Behind NAT / Firewall (use uPnP)" msgstr "" #: ../gtk/parameters.ui.h:36 -msgid "Network settings" +msgid "Public IP address:" msgstr "" #: ../gtk/parameters.ui.h:37 -msgid "Ring sound:" +msgid "Stun server:" msgstr "" #: ../gtk/parameters.ui.h:38 -msgid "ALSA special device (optional):" +msgid "NAT and Firewall" msgstr "" #: ../gtk/parameters.ui.h:39 -msgid "Capture device:" +msgid "Network settings" msgstr "" #: ../gtk/parameters.ui.h:40 -msgid "Ring device:" +msgid "Ring sound:" msgstr "" #: ../gtk/parameters.ui.h:41 -msgid "Playback device:" +msgid "ALSA special device (optional):" msgstr "" #: ../gtk/parameters.ui.h:42 -msgid "Enable echo cancellation" +msgid "Capture device:" msgstr "" #: ../gtk/parameters.ui.h:43 -msgid "Audio" +msgid "Ring device:" msgstr "" #: ../gtk/parameters.ui.h:44 -msgid "Video input device:" +msgid "Playback device:" msgstr "" #: ../gtk/parameters.ui.h:45 -msgid "Prefered video resolution:" +msgid "Enable echo cancellation" msgstr "" #: ../gtk/parameters.ui.h:46 -msgid "Video output method:" +msgid "Audio" msgstr "" #: ../gtk/parameters.ui.h:47 -msgid "Show camera preview" +msgid "Video input device:" msgstr "" #: ../gtk/parameters.ui.h:48 -msgid "Video" +msgid "Prefered video resolution:" msgstr "" #: ../gtk/parameters.ui.h:49 -msgid "Multimedia settings" +msgid "Video output method:" msgstr "" #: ../gtk/parameters.ui.h:50 -msgid "This section defines your SIP address when not using a SIP account" +msgid "Show camera preview" msgstr "" #: ../gtk/parameters.ui.h:51 -msgid "Your display name (eg: John Doe):" +msgid "Video" msgstr "" #: ../gtk/parameters.ui.h:52 -msgid "Your username:" +msgid "Multimedia settings" msgstr "" #: ../gtk/parameters.ui.h:53 -msgid "Your resulting SIP address:" +msgid "This section defines your SIP address when not using a SIP account" msgstr "" #: ../gtk/parameters.ui.h:54 -msgid "Default identity" +msgid "Your display name (eg: John Doe):" msgstr "" #: ../gtk/parameters.ui.h:55 -msgid "Wizard" +msgid "Your username:" msgstr "" #: ../gtk/parameters.ui.h:56 -msgid "Add" +msgid "Your resulting SIP address:" msgstr "" #: ../gtk/parameters.ui.h:57 -msgid "Edit" +msgid "Default identity" msgstr "" #: ../gtk/parameters.ui.h:58 -msgid "Remove" +msgid "Wizard" msgstr "" #: ../gtk/parameters.ui.h:59 -msgid "Proxy accounts" +msgid "Add" msgstr "" #: ../gtk/parameters.ui.h:60 -msgid "Erase all passwords" +msgid "Edit" msgstr "" #: ../gtk/parameters.ui.h:61 -msgid "Privacy" +msgid "Remove" msgstr "" #: ../gtk/parameters.ui.h:62 -msgid "Automatically answer when a call is received" +msgid "Proxy accounts" msgstr "" #: ../gtk/parameters.ui.h:63 -msgid "Auto-answer" +msgid "Erase all passwords" msgstr "" #: ../gtk/parameters.ui.h:64 -msgid "Manage SIP Accounts" +msgid "Privacy" msgstr "" -#: ../gtk/parameters.ui.h:65 ../gtk/tunnel_config.ui.h:4 -msgid "Enable" -msgstr "Włączony" +#: ../gtk/parameters.ui.h:65 +msgid "Automatically answer when a call is received" +msgstr "" -#: ../gtk/parameters.ui.h:66 ../gtk/tunnel_config.ui.h:5 -msgid "Disable" -msgstr "Wyłącz" +#: ../gtk/parameters.ui.h:66 +msgid "Delay before answering (ms)" +msgstr "" #: ../gtk/parameters.ui.h:67 -msgid "Codecs" +msgid "Auto-answer" msgstr "" #: ../gtk/parameters.ui.h:68 -msgid "0 stands for \"unlimited\"" +msgid "Manage SIP Accounts" msgstr "" -#: ../gtk/parameters.ui.h:69 -msgid "Upload speed limit in Kbit/sec:" -msgstr "" +#: ../gtk/parameters.ui.h:69 ../gtk/tunnel_config.ui.h:4 +msgid "Enable" +msgstr "Włączony" -#: ../gtk/parameters.ui.h:70 -msgid "Download speed limit in Kbit/sec:" -msgstr "" +#: ../gtk/parameters.ui.h:70 ../gtk/tunnel_config.ui.h:5 +msgid "Disable" +msgstr "Wyłącz" #: ../gtk/parameters.ui.h:71 -msgid "Enable adaptive rate control" +msgid "Codecs" msgstr "" #: ../gtk/parameters.ui.h:72 +msgid "0 stands for \"unlimited\"" +msgstr "" + +#: ../gtk/parameters.ui.h:73 +msgid "Upload speed limit in Kbit/sec:" +msgstr "" + +#: ../gtk/parameters.ui.h:74 +msgid "Download speed limit in Kbit/sec:" +msgstr "" + +#: ../gtk/parameters.ui.h:75 +msgid "Enable adaptive rate control" +msgstr "" + +#: ../gtk/parameters.ui.h:76 msgid "" "Adaptive rate control is a technique to dynamically guess the available " "bandwidth during a call." msgstr "" -#: ../gtk/parameters.ui.h:73 +#: ../gtk/parameters.ui.h:77 msgid "Bandwidth control" msgstr "" -#: ../gtk/parameters.ui.h:74 +#: ../gtk/parameters.ui.h:78 msgid "Codecs" msgstr "" -#: ../gtk/parameters.ui.h:75 +#: ../gtk/parameters.ui.h:79 msgid "Language" msgstr "" -#: ../gtk/parameters.ui.h:76 +#: ../gtk/parameters.ui.h:80 msgid "Show advanced settings" msgstr "" -#: ../gtk/parameters.ui.h:77 +#: ../gtk/parameters.ui.h:81 msgid "Level" msgstr "" -#: ../gtk/parameters.ui.h:78 +#: ../gtk/parameters.ui.h:82 msgid "User interface" msgstr "" -#: ../gtk/parameters.ui.h:79 ../gtk/ldap.ui.h:2 +#: ../gtk/parameters.ui.h:83 ../gtk/ldap.ui.h:2 msgid "Server address:" msgstr "" -#: ../gtk/parameters.ui.h:80 ../gtk/ldap.ui.h:3 +#: ../gtk/parameters.ui.h:84 ../gtk/ldap.ui.h:3 msgid "Authentication method:" msgstr "" -#: ../gtk/parameters.ui.h:82 +#: ../gtk/parameters.ui.h:86 msgid "LDAP Account setup" msgstr "" -#: ../gtk/parameters.ui.h:83 +#: ../gtk/parameters.ui.h:87 msgid "LDAP" msgstr "" -#: ../gtk/parameters.ui.h:84 +#: ../gtk/parameters.ui.h:88 msgid "Done" msgstr "" -#: ../gtk/parameters.ui.h:85 -msgid "SIP (UDP)" -msgstr "" - -#: ../gtk/parameters.ui.h:86 -msgid "SIP (TCP)" -msgstr "" - -#: ../gtk/parameters.ui.h:87 -msgid "SIP (TLS)" -msgstr "" - #: ../gtk/buddylookup.ui.h:1 msgid "Search contacts in directory" msgstr "" @@ -1697,60 +1701,60 @@ msgstr "" msgid "Please wait while fetching configuration from server..." msgstr "" -#: ../coreapi/linphonecore.c:1534 +#: ../coreapi/linphonecore.c:1538 msgid "Ready" msgstr "" -#: ../coreapi/linphonecore.c:2534 +#: ../coreapi/linphonecore.c:2550 msgid "Configuring" msgstr "" -#: ../coreapi/linphonecore.c:2708 +#: ../coreapi/linphonecore.c:2724 msgid "Looking for telephone number destination..." msgstr "" -#: ../coreapi/linphonecore.c:2710 +#: ../coreapi/linphonecore.c:2726 msgid "Could not resolve this number." msgstr "" #. must be known at that time -#: ../coreapi/linphonecore.c:2996 +#: ../coreapi/linphonecore.c:3012 msgid "Contacting" msgstr "" -#: ../coreapi/linphonecore.c:3001 +#: ../coreapi/linphonecore.c:3017 msgid "Could not call" msgstr "" -#: ../coreapi/linphonecore.c:3152 +#: ../coreapi/linphonecore.c:3168 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "" -#: ../coreapi/linphonecore.c:3310 +#: ../coreapi/linphonecore.c:3326 msgid "is contacting you" msgstr "" -#: ../coreapi/linphonecore.c:3311 +#: ../coreapi/linphonecore.c:3327 msgid " and asked autoanswer." msgstr "" -#: ../coreapi/linphonecore.c:3435 +#: ../coreapi/linphonecore.c:3451 msgid "Modifying call parameters..." msgstr "" -#: ../coreapi/linphonecore.c:3782 +#: ../coreapi/linphonecore.c:3798 msgid "Connected." msgstr "Połączony" -#: ../coreapi/linphonecore.c:3807 +#: ../coreapi/linphonecore.c:3823 msgid "Call aborted" msgstr "" -#: ../coreapi/linphonecore.c:3997 +#: ../coreapi/linphonecore.c:4013 msgid "Could not pause the call" msgstr "" -#: ../coreapi/linphonecore.c:4000 +#: ../coreapi/linphonecore.c:4016 msgid "Pausing the current call..." msgstr "" @@ -1946,11 +1950,11 @@ msgstr "" msgid "Authentication token is %s" msgstr "" -#: ../coreapi/linphonecall.c:1305 +#: ../coreapi/linphonecall.c:1306 msgid "Call parameters were successfully modified." msgstr "" -#: ../coreapi/linphonecall.c:3659 +#: ../coreapi/linphonecall.c:3660 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." diff --git a/po/pt_BR.po b/po/pt_BR.po index 0ff0e6705..069605799 100644 --- a/po/pt_BR.po +++ b/po/pt_BR.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: linphone-gtk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-27 14:40+0100\n" -"PO-Revision-Date: 2015-03-27 13:40+0000\n" +"POT-Creation-Date: 2015-04-01 16:25+0200\n" +"PO-Revision-Date: 2015-04-01 14:26+0000\n" "Last-Translator: Belledonne Communications \n" "Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/linphone-gtk/language/pt_BR/)\n" "MIME-Version: 1.0\n" @@ -125,7 +125,7 @@ msgstr "" msgid "Run self test and exit 0 if succeed" msgstr "" -#: ../gtk/main.c:1059 +#: ../gtk/main.c:1069 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -133,76 +133,76 @@ msgid "" "If you answer no, this person will be temporarily blacklisted." msgstr "" -#: ../gtk/main.c:1136 +#: ../gtk/main.c:1146 #, c-format msgid "" "Please enter your password for username %s\n" " at realm %s:" msgstr "" -#: ../gtk/main.c:1257 +#: ../gtk/main.c:1267 msgid "Call error" msgstr "" -#: ../gtk/main.c:1260 ../coreapi/linphonecore.c:3826 +#: ../gtk/main.c:1270 ../coreapi/linphonecore.c:3842 msgid "Call ended" msgstr "" -#: ../gtk/main.c:1263 ../coreapi/call_log.c:221 +#: ../gtk/main.c:1273 ../coreapi/call_log.c:221 msgid "Incoming call" msgstr "Camadas recebidas" -#: ../gtk/main.c:1265 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 +#: ../gtk/main.c:1275 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 msgid "Answer" msgstr "" -#: ../gtk/main.c:1267 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1277 ../gtk/main.ui.h:6 msgid "Decline" msgstr "" -#: ../gtk/main.c:1273 +#: ../gtk/main.c:1283 msgid "Call paused" msgstr "" -#: ../gtk/main.c:1273 +#: ../gtk/main.c:1283 #, c-format msgid "by %s" msgstr "" -#: ../gtk/main.c:1343 +#: ../gtk/main.c:1353 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1505 +#: ../gtk/main.c:1516 msgid "Website link" msgstr "" -#: ../gtk/main.c:1554 +#: ../gtk/main.c:1565 msgid "Linphone - a video internet phone" msgstr "" -#: ../gtk/main.c:1646 +#: ../gtk/main.c:1657 #, c-format msgid "%s (Default)" msgstr "" -#: ../gtk/main.c:1978 ../coreapi/callbacks.c:1057 +#: ../gtk/main.c:1989 ../coreapi/callbacks.c:1057 #, c-format msgid "We are transferred to %s" msgstr "" -#: ../gtk/main.c:1988 +#: ../gtk/main.c:1999 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." msgstr "" -#: ../gtk/main.c:2136 +#: ../gtk/main.c:2147 msgid "A free SIP video-phone" msgstr "" -#: ../gtk/main.c:2241 +#: ../gtk/main.c:2252 #, c-format msgid "Hello\n" msgstr "" @@ -276,7 +276,7 @@ msgstr "Parâmetros" msgid "Enabled" msgstr "Ativado" -#: ../gtk/propertybox.c:622 ../gtk/propertybox.c:763 ../gtk/parameters.ui.h:17 +#: ../gtk/propertybox.c:622 ../gtk/propertybox.c:763 ../gtk/parameters.ui.h:20 msgid "Disabled" msgstr "Desativado" @@ -441,7 +441,7 @@ msgstr "" msgid "Enter your linphone.org username" msgstr "" -#: ../gtk/setupwizard.c:102 ../gtk/parameters.ui.h:81 ../gtk/ldap.ui.h:4 +#: ../gtk/setupwizard.c:102 ../gtk/parameters.ui.h:85 ../gtk/ldap.ui.h:4 msgid "Username:" msgstr "" @@ -1178,307 +1178,311 @@ msgid "C" msgstr "" #: ../gtk/parameters.ui.h:11 -msgid "Settings" +msgid "SIP (UDP)" msgstr "" #: ../gtk/parameters.ui.h:12 -msgid "Set Maximum Transmission Unit:" +msgid "SIP (TCP)" msgstr "" #: ../gtk/parameters.ui.h:13 -msgid "Send DTMFs as SIP info" +msgid "SIP (TLS)" msgstr "" #: ../gtk/parameters.ui.h:14 -msgid "Allow IPv6" +msgid "Settings" msgstr "" #: ../gtk/parameters.ui.h:15 -msgid "Transport" +msgid "Set Maximum Transmission Unit:" msgstr "" #: ../gtk/parameters.ui.h:16 -msgid "SIP/UDP port" +msgid "Send DTMFs as SIP info" +msgstr "" + +#: ../gtk/parameters.ui.h:17 +msgid "Allow IPv6" msgstr "" #: ../gtk/parameters.ui.h:18 -msgid "Random" +msgid "Transport" msgstr "" #: ../gtk/parameters.ui.h:19 -msgid "SIP/TCP port" -msgstr "" - -#: ../gtk/parameters.ui.h:20 -msgid "Audio RTP/UDP:" +msgid "SIP/UDP port" msgstr "" #: ../gtk/parameters.ui.h:21 -msgid "Fixed" +msgid "Random" msgstr "" #: ../gtk/parameters.ui.h:22 -msgid "Video RTP/UDP:" +msgid "SIP/TCP port" msgstr "" #: ../gtk/parameters.ui.h:23 -msgid "Media encryption type" +msgid "Audio RTP/UDP:" msgstr "" #: ../gtk/parameters.ui.h:24 -msgid "Media encryption is mandatory" +msgid "Fixed" msgstr "" #: ../gtk/parameters.ui.h:25 -msgid "Tunnel" +msgid "Video RTP/UDP:" msgstr "" #: ../gtk/parameters.ui.h:26 -msgid "DSCP fields" +msgid "Media encryption type" msgstr "" #: ../gtk/parameters.ui.h:27 -msgid "Network protocol and ports" +msgid "Media encryption is mandatory" msgstr "" #: ../gtk/parameters.ui.h:28 -msgid "Direct connection to the Internet" +msgid "Tunnel" msgstr "" #: ../gtk/parameters.ui.h:29 -msgid "Behind NAT / Firewall (specify gateway IP )" +msgid "DSCP fields" msgstr "" #: ../gtk/parameters.ui.h:30 -msgid "Behind NAT / Firewall (use STUN to resolve)" +msgid "Network protocol and ports" msgstr "" #: ../gtk/parameters.ui.h:31 -msgid "Behind NAT / Firewall (use ICE)" +msgid "Direct connection to the Internet" msgstr "" #: ../gtk/parameters.ui.h:32 -msgid "Behind NAT / Firewall (use uPnP)" +msgid "Behind NAT / Firewall (specify gateway IP )" msgstr "" #: ../gtk/parameters.ui.h:33 -msgid "Public IP address:" +msgid "Behind NAT / Firewall (use STUN to resolve)" msgstr "" #: ../gtk/parameters.ui.h:34 -msgid "Stun server:" +msgid "Behind NAT / Firewall (use ICE)" msgstr "" #: ../gtk/parameters.ui.h:35 -msgid "NAT and Firewall" +msgid "Behind NAT / Firewall (use uPnP)" msgstr "" #: ../gtk/parameters.ui.h:36 -msgid "Network settings" +msgid "Public IP address:" msgstr "" #: ../gtk/parameters.ui.h:37 -msgid "Ring sound:" +msgid "Stun server:" msgstr "" #: ../gtk/parameters.ui.h:38 -msgid "ALSA special device (optional):" +msgid "NAT and Firewall" msgstr "" #: ../gtk/parameters.ui.h:39 -msgid "Capture device:" +msgid "Network settings" msgstr "" #: ../gtk/parameters.ui.h:40 -msgid "Ring device:" +msgid "Ring sound:" msgstr "" #: ../gtk/parameters.ui.h:41 -msgid "Playback device:" +msgid "ALSA special device (optional):" msgstr "" #: ../gtk/parameters.ui.h:42 -msgid "Enable echo cancellation" +msgid "Capture device:" msgstr "" #: ../gtk/parameters.ui.h:43 -msgid "Audio" +msgid "Ring device:" msgstr "" #: ../gtk/parameters.ui.h:44 -msgid "Video input device:" +msgid "Playback device:" msgstr "" #: ../gtk/parameters.ui.h:45 -msgid "Prefered video resolution:" +msgid "Enable echo cancellation" msgstr "" #: ../gtk/parameters.ui.h:46 -msgid "Video output method:" +msgid "Audio" msgstr "" #: ../gtk/parameters.ui.h:47 -msgid "Show camera preview" +msgid "Video input device:" msgstr "" #: ../gtk/parameters.ui.h:48 -msgid "Video" +msgid "Prefered video resolution:" msgstr "" #: ../gtk/parameters.ui.h:49 -msgid "Multimedia settings" +msgid "Video output method:" msgstr "" #: ../gtk/parameters.ui.h:50 -msgid "This section defines your SIP address when not using a SIP account" +msgid "Show camera preview" msgstr "" #: ../gtk/parameters.ui.h:51 -msgid "Your display name (eg: John Doe):" +msgid "Video" msgstr "" #: ../gtk/parameters.ui.h:52 -msgid "Your username:" +msgid "Multimedia settings" msgstr "" #: ../gtk/parameters.ui.h:53 -msgid "Your resulting SIP address:" +msgid "This section defines your SIP address when not using a SIP account" msgstr "" #: ../gtk/parameters.ui.h:54 -msgid "Default identity" +msgid "Your display name (eg: John Doe):" msgstr "" #: ../gtk/parameters.ui.h:55 -msgid "Wizard" +msgid "Your username:" msgstr "" #: ../gtk/parameters.ui.h:56 -msgid "Add" +msgid "Your resulting SIP address:" msgstr "" #: ../gtk/parameters.ui.h:57 -msgid "Edit" -msgstr "Editar" +msgid "Default identity" +msgstr "" #: ../gtk/parameters.ui.h:58 -msgid "Remove" -msgstr "Remover" +msgid "Wizard" +msgstr "" #: ../gtk/parameters.ui.h:59 -msgid "Proxy accounts" +msgid "Add" msgstr "" #: ../gtk/parameters.ui.h:60 -msgid "Erase all passwords" -msgstr "" +msgid "Edit" +msgstr "Editar" #: ../gtk/parameters.ui.h:61 -msgid "Privacy" -msgstr "" +msgid "Remove" +msgstr "Remover" #: ../gtk/parameters.ui.h:62 -msgid "Automatically answer when a call is received" +msgid "Proxy accounts" msgstr "" #: ../gtk/parameters.ui.h:63 -msgid "Auto-answer" +msgid "Erase all passwords" msgstr "" #: ../gtk/parameters.ui.h:64 -msgid "Manage SIP Accounts" +msgid "Privacy" msgstr "" -#: ../gtk/parameters.ui.h:65 ../gtk/tunnel_config.ui.h:4 -msgid "Enable" -msgstr "Ativado" +#: ../gtk/parameters.ui.h:65 +msgid "Automatically answer when a call is received" +msgstr "" -#: ../gtk/parameters.ui.h:66 ../gtk/tunnel_config.ui.h:5 -msgid "Disable" -msgstr "Desativar" +#: ../gtk/parameters.ui.h:66 +msgid "Delay before answering (ms)" +msgstr "" #: ../gtk/parameters.ui.h:67 -msgid "Codecs" +msgid "Auto-answer" msgstr "" #: ../gtk/parameters.ui.h:68 -msgid "0 stands for \"unlimited\"" +msgid "Manage SIP Accounts" msgstr "" -#: ../gtk/parameters.ui.h:69 -msgid "Upload speed limit in Kbit/sec:" -msgstr "" +#: ../gtk/parameters.ui.h:69 ../gtk/tunnel_config.ui.h:4 +msgid "Enable" +msgstr "Ativado" -#: ../gtk/parameters.ui.h:70 -msgid "Download speed limit in Kbit/sec:" -msgstr "" +#: ../gtk/parameters.ui.h:70 ../gtk/tunnel_config.ui.h:5 +msgid "Disable" +msgstr "Desativar" #: ../gtk/parameters.ui.h:71 -msgid "Enable adaptive rate control" +msgid "Codecs" msgstr "" #: ../gtk/parameters.ui.h:72 +msgid "0 stands for \"unlimited\"" +msgstr "" + +#: ../gtk/parameters.ui.h:73 +msgid "Upload speed limit in Kbit/sec:" +msgstr "" + +#: ../gtk/parameters.ui.h:74 +msgid "Download speed limit in Kbit/sec:" +msgstr "" + +#: ../gtk/parameters.ui.h:75 +msgid "Enable adaptive rate control" +msgstr "" + +#: ../gtk/parameters.ui.h:76 msgid "" "Adaptive rate control is a technique to dynamically guess the available " "bandwidth during a call." msgstr "" -#: ../gtk/parameters.ui.h:73 +#: ../gtk/parameters.ui.h:77 msgid "Bandwidth control" msgstr "" -#: ../gtk/parameters.ui.h:74 +#: ../gtk/parameters.ui.h:78 msgid "Codecs" msgstr "" -#: ../gtk/parameters.ui.h:75 +#: ../gtk/parameters.ui.h:79 msgid "Language" msgstr "" -#: ../gtk/parameters.ui.h:76 +#: ../gtk/parameters.ui.h:80 msgid "Show advanced settings" msgstr "" -#: ../gtk/parameters.ui.h:77 +#: ../gtk/parameters.ui.h:81 msgid "Level" msgstr "" -#: ../gtk/parameters.ui.h:78 +#: ../gtk/parameters.ui.h:82 msgid "User interface" msgstr "" -#: ../gtk/parameters.ui.h:79 ../gtk/ldap.ui.h:2 +#: ../gtk/parameters.ui.h:83 ../gtk/ldap.ui.h:2 msgid "Server address:" msgstr "" -#: ../gtk/parameters.ui.h:80 ../gtk/ldap.ui.h:3 +#: ../gtk/parameters.ui.h:84 ../gtk/ldap.ui.h:3 msgid "Authentication method:" msgstr "" -#: ../gtk/parameters.ui.h:82 +#: ../gtk/parameters.ui.h:86 msgid "LDAP Account setup" msgstr "" -#: ../gtk/parameters.ui.h:83 +#: ../gtk/parameters.ui.h:87 msgid "LDAP" msgstr "" -#: ../gtk/parameters.ui.h:84 +#: ../gtk/parameters.ui.h:88 msgid "Done" msgstr "" -#: ../gtk/parameters.ui.h:85 -msgid "SIP (UDP)" -msgstr "" - -#: ../gtk/parameters.ui.h:86 -msgid "SIP (TCP)" -msgstr "" - -#: ../gtk/parameters.ui.h:87 -msgid "SIP (TLS)" -msgstr "" - #: ../gtk/buddylookup.ui.h:1 msgid "Search contacts in directory" msgstr "" @@ -1694,60 +1698,60 @@ msgstr "" msgid "Please wait while fetching configuration from server..." msgstr "" -#: ../coreapi/linphonecore.c:1534 +#: ../coreapi/linphonecore.c:1538 msgid "Ready" msgstr "" -#: ../coreapi/linphonecore.c:2534 +#: ../coreapi/linphonecore.c:2550 msgid "Configuring" msgstr "" -#: ../coreapi/linphonecore.c:2708 +#: ../coreapi/linphonecore.c:2724 msgid "Looking for telephone number destination..." msgstr "Procurando por telefone de destino..." -#: ../coreapi/linphonecore.c:2710 +#: ../coreapi/linphonecore.c:2726 msgid "Could not resolve this number." msgstr "Não foi possível encontrar este número." #. must be known at that time -#: ../coreapi/linphonecore.c:2996 +#: ../coreapi/linphonecore.c:3012 msgid "Contacting" msgstr "" -#: ../coreapi/linphonecore.c:3001 +#: ../coreapi/linphonecore.c:3017 msgid "Could not call" msgstr "" -#: ../coreapi/linphonecore.c:3152 +#: ../coreapi/linphonecore.c:3168 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "" -#: ../coreapi/linphonecore.c:3310 +#: ../coreapi/linphonecore.c:3326 msgid "is contacting you" msgstr "" -#: ../coreapi/linphonecore.c:3311 +#: ../coreapi/linphonecore.c:3327 msgid " and asked autoanswer." msgstr "" -#: ../coreapi/linphonecore.c:3435 +#: ../coreapi/linphonecore.c:3451 msgid "Modifying call parameters..." msgstr "" -#: ../coreapi/linphonecore.c:3782 +#: ../coreapi/linphonecore.c:3798 msgid "Connected." msgstr "Conectado." -#: ../coreapi/linphonecore.c:3807 +#: ../coreapi/linphonecore.c:3823 msgid "Call aborted" msgstr "" -#: ../coreapi/linphonecore.c:3997 +#: ../coreapi/linphonecore.c:4013 msgid "Could not pause the call" msgstr "" -#: ../coreapi/linphonecore.c:4000 +#: ../coreapi/linphonecore.c:4016 msgid "Pausing the current call..." msgstr "" @@ -1943,11 +1947,11 @@ msgstr "" msgid "Authentication token is %s" msgstr "" -#: ../coreapi/linphonecall.c:1305 +#: ../coreapi/linphonecall.c:1306 msgid "Call parameters were successfully modified." msgstr "" -#: ../coreapi/linphonecall.c:3659 +#: ../coreapi/linphonecall.c:3660 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." diff --git a/po/ru.po b/po/ru.po index cdffa1646..722ae362c 100644 --- a/po/ru.po +++ b/po/ru.po @@ -12,8 +12,8 @@ msgid "" msgstr "" "Project-Id-Version: linphone-gtk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-27 14:40+0100\n" -"PO-Revision-Date: 2015-03-28 09:22+0000\n" +"POT-Creation-Date: 2015-04-01 16:25+0200\n" +"PO-Revision-Date: 2015-04-02 06:40+0000\n" "Last-Translator: AlexL \n" "Language-Team: Russian (http://www.transifex.com/projects/p/linphone-gtk/language/ru/)\n" "MIME-Version: 1.0\n" @@ -132,7 +132,7 @@ msgstr "Запустить помощника аудио" msgid "Run self test and exit 0 if succeed" msgstr "Запустить самотест и выйти при успехе со статусом 0" -#: ../gtk/main.c:1059 +#: ../gtk/main.c:1069 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -140,76 +140,76 @@ msgid "" "If you answer no, this person will be temporarily blacklisted." msgstr "%s вы бы хотели быть добавленным в этот контактный лист.\nВы разрешаете ему(ей) видеть ваш статус присутствия или добавить в контактный лист?\nЕсли вы ответите Нет, эта персона будет временно в чёрном списке." -#: ../gtk/main.c:1136 +#: ../gtk/main.c:1146 #, c-format msgid "" "Please enter your password for username %s\n" " at realm %s:" msgstr "Пожалуйста, введите пароль для пользователя %s\n для реалм (рилм) %s:" -#: ../gtk/main.c:1257 +#: ../gtk/main.c:1267 msgid "Call error" msgstr "Ошибка звонка" -#: ../gtk/main.c:1260 ../coreapi/linphonecore.c:3826 +#: ../gtk/main.c:1270 ../coreapi/linphonecore.c:3842 msgid "Call ended" msgstr "Звонок окончен" -#: ../gtk/main.c:1263 ../coreapi/call_log.c:221 +#: ../gtk/main.c:1273 ../coreapi/call_log.c:221 msgid "Incoming call" msgstr "Входящий звонок" -#: ../gtk/main.c:1265 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 +#: ../gtk/main.c:1275 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 msgid "Answer" msgstr "Ответ" -#: ../gtk/main.c:1267 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1277 ../gtk/main.ui.h:6 msgid "Decline" msgstr "Отклонить" -#: ../gtk/main.c:1273 +#: ../gtk/main.c:1283 msgid "Call paused" msgstr "Звонок приостановлен" -#: ../gtk/main.c:1273 +#: ../gtk/main.c:1283 #, c-format msgid "by %s" msgstr "%s" -#: ../gtk/main.c:1343 +#: ../gtk/main.c:1353 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "%s предложил запустить видео. Вы принимаете?" -#: ../gtk/main.c:1505 +#: ../gtk/main.c:1516 msgid "Website link" msgstr "Домашняя страница" -#: ../gtk/main.c:1554 +#: ../gtk/main.c:1565 msgid "Linphone - a video internet phone" msgstr "Linphone - интернет видео телефон" -#: ../gtk/main.c:1646 +#: ../gtk/main.c:1657 #, c-format msgid "%s (Default)" msgstr "%s (по умолчанию)" -#: ../gtk/main.c:1978 ../coreapi/callbacks.c:1057 +#: ../gtk/main.c:1989 ../coreapi/callbacks.c:1057 #, c-format msgid "We are transferred to %s" msgstr "Мы передали в %s" -#: ../gtk/main.c:1988 +#: ../gtk/main.c:1999 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." msgstr "Звуковые карты не были обнаружены на этом компьютере.\nВы не сможете отправлять или получать аудио звонки." -#: ../gtk/main.c:2136 +#: ../gtk/main.c:2147 msgid "A free SIP video-phone" msgstr "Свободный SIP видео-телефон" -#: ../gtk/main.c:2241 +#: ../gtk/main.c:2252 #, c-format msgid "Hello\n" msgstr "Привет\n" @@ -283,7 +283,7 @@ msgstr "Параметры" msgid "Enabled" msgstr "Разрешён" -#: ../gtk/propertybox.c:622 ../gtk/propertybox.c:763 ../gtk/parameters.ui.h:17 +#: ../gtk/propertybox.c:622 ../gtk/propertybox.c:763 ../gtk/parameters.ui.h:20 msgid "Disabled" msgstr "Не разрешён" @@ -449,7 +449,7 @@ msgstr "Я хочу указать удалённую конфигурацию U msgid "Enter your linphone.org username" msgstr "Введите ваше имя пользователя для linphone.org" -#: ../gtk/setupwizard.c:102 ../gtk/parameters.ui.h:81 ../gtk/ldap.ui.h:4 +#: ../gtk/setupwizard.c:102 ../gtk/parameters.ui.h:85 ../gtk/ldap.ui.h:4 msgid "Username:" msgstr "Имя пользователя:" @@ -1186,307 +1186,311 @@ msgid "C" msgstr "C" #: ../gtk/parameters.ui.h:11 +msgid "SIP (UDP)" +msgstr "SIP (UDP)" + +#: ../gtk/parameters.ui.h:12 +msgid "SIP (TCP)" +msgstr "SIP (TCP)" + +#: ../gtk/parameters.ui.h:13 +msgid "SIP (TLS)" +msgstr "SIP (TLS)" + +#: ../gtk/parameters.ui.h:14 msgid "Settings" msgstr "Настройки" -#: ../gtk/parameters.ui.h:12 +#: ../gtk/parameters.ui.h:15 msgid "Set Maximum Transmission Unit:" msgstr "Установить MTU (максимально передаваемый блок):" -#: ../gtk/parameters.ui.h:13 +#: ../gtk/parameters.ui.h:16 msgid "Send DTMFs as SIP info" msgstr "Отправлять DTFM как SIP-информацию" -#: ../gtk/parameters.ui.h:14 +#: ../gtk/parameters.ui.h:17 msgid "Allow IPv6" msgstr "Разрешить IPv6" -#: ../gtk/parameters.ui.h:15 +#: ../gtk/parameters.ui.h:18 msgid "Transport" msgstr "Транспорт" -#: ../gtk/parameters.ui.h:16 +#: ../gtk/parameters.ui.h:19 msgid "SIP/UDP port" msgstr "Порт SIP/UDP" -#: ../gtk/parameters.ui.h:18 +#: ../gtk/parameters.ui.h:21 msgid "Random" msgstr "Случайно" -#: ../gtk/parameters.ui.h:19 +#: ../gtk/parameters.ui.h:22 msgid "SIP/TCP port" msgstr "Порт SIP/TCP" -#: ../gtk/parameters.ui.h:20 +#: ../gtk/parameters.ui.h:23 msgid "Audio RTP/UDP:" msgstr "Аудио RTP/UDP:" -#: ../gtk/parameters.ui.h:21 +#: ../gtk/parameters.ui.h:24 msgid "Fixed" msgstr "Фиксированный" -#: ../gtk/parameters.ui.h:22 +#: ../gtk/parameters.ui.h:25 msgid "Video RTP/UDP:" msgstr "Видео RTP/UDP:" -#: ../gtk/parameters.ui.h:23 +#: ../gtk/parameters.ui.h:26 msgid "Media encryption type" msgstr "Тип медиа-шифрования" -#: ../gtk/parameters.ui.h:24 +#: ../gtk/parameters.ui.h:27 msgid "Media encryption is mandatory" msgstr "Медиа-шифрование обязательно" -#: ../gtk/parameters.ui.h:25 +#: ../gtk/parameters.ui.h:28 msgid "Tunnel" msgstr "Тунель" -#: ../gtk/parameters.ui.h:26 +#: ../gtk/parameters.ui.h:29 msgid "DSCP fields" msgstr "Поля DSCP" -#: ../gtk/parameters.ui.h:27 +#: ../gtk/parameters.ui.h:30 msgid "Network protocol and ports" msgstr "Сетевые протоколы и порты" -#: ../gtk/parameters.ui.h:28 +#: ../gtk/parameters.ui.h:31 msgid "Direct connection to the Internet" msgstr "Прямое подключение к интернет" -#: ../gtk/parameters.ui.h:29 +#: ../gtk/parameters.ui.h:32 msgid "Behind NAT / Firewall (specify gateway IP )" msgstr "За NAT / брандмауэром (указать IP шлюза)" -#: ../gtk/parameters.ui.h:30 +#: ../gtk/parameters.ui.h:33 msgid "Behind NAT / Firewall (use STUN to resolve)" msgstr "За NAT / брандмауэром (использовать STUN)" -#: ../gtk/parameters.ui.h:31 +#: ../gtk/parameters.ui.h:34 msgid "Behind NAT / Firewall (use ICE)" msgstr "За NAT / брандмауэром (использовать ICE)" -#: ../gtk/parameters.ui.h:32 +#: ../gtk/parameters.ui.h:35 msgid "Behind NAT / Firewall (use uPnP)" msgstr "За NAT / брандмауэром (использовать uPnP)" -#: ../gtk/parameters.ui.h:33 +#: ../gtk/parameters.ui.h:36 msgid "Public IP address:" msgstr "Выделенный (публичный) IP-адрес:" -#: ../gtk/parameters.ui.h:34 +#: ../gtk/parameters.ui.h:37 msgid "Stun server:" msgstr "STUN сервер:" -#: ../gtk/parameters.ui.h:35 +#: ../gtk/parameters.ui.h:38 msgid "NAT and Firewall" msgstr "NAT и брандмауэр" -#: ../gtk/parameters.ui.h:36 +#: ../gtk/parameters.ui.h:39 msgid "Network settings" msgstr "Настройки сети" -#: ../gtk/parameters.ui.h:37 +#: ../gtk/parameters.ui.h:40 msgid "Ring sound:" msgstr "Мелодия звонка:" -#: ../gtk/parameters.ui.h:38 +#: ../gtk/parameters.ui.h:41 msgid "ALSA special device (optional):" msgstr "Специальное устройство ALSA (опционально)" -#: ../gtk/parameters.ui.h:39 +#: ../gtk/parameters.ui.h:42 msgid "Capture device:" msgstr "Устройство захвата:" -#: ../gtk/parameters.ui.h:40 +#: ../gtk/parameters.ui.h:43 msgid "Ring device:" msgstr "Устройство звонка:" -#: ../gtk/parameters.ui.h:41 +#: ../gtk/parameters.ui.h:44 msgid "Playback device:" msgstr "Устройство воспроизведения:" -#: ../gtk/parameters.ui.h:42 +#: ../gtk/parameters.ui.h:45 msgid "Enable echo cancellation" msgstr "Разрешить подавление эха" -#: ../gtk/parameters.ui.h:43 +#: ../gtk/parameters.ui.h:46 msgid "Audio" msgstr "Аудио" -#: ../gtk/parameters.ui.h:44 +#: ../gtk/parameters.ui.h:47 msgid "Video input device:" msgstr "Устройство для вывода видео:" -#: ../gtk/parameters.ui.h:45 +#: ../gtk/parameters.ui.h:48 msgid "Prefered video resolution:" msgstr "Предпочтительное разрешение видео:" -#: ../gtk/parameters.ui.h:46 +#: ../gtk/parameters.ui.h:49 msgid "Video output method:" msgstr "Метод вывода видео:" -#: ../gtk/parameters.ui.h:47 +#: ../gtk/parameters.ui.h:50 msgid "Show camera preview" msgstr "Показать предпросмотр с камеры" -#: ../gtk/parameters.ui.h:48 +#: ../gtk/parameters.ui.h:51 msgid "Video" msgstr "Видео" -#: ../gtk/parameters.ui.h:49 +#: ../gtk/parameters.ui.h:52 msgid "Multimedia settings" msgstr "Настройки мультимедиа" -#: ../gtk/parameters.ui.h:50 +#: ../gtk/parameters.ui.h:53 msgid "This section defines your SIP address when not using a SIP account" msgstr "Эта секция определяет ваш SIP адрес, когда вы не используете учётную запись SIP" -#: ../gtk/parameters.ui.h:51 +#: ../gtk/parameters.ui.h:54 msgid "Your display name (eg: John Doe):" msgstr "Отображаемое имя (например: Иван Сидоров):" -#: ../gtk/parameters.ui.h:52 +#: ../gtk/parameters.ui.h:55 msgid "Your username:" msgstr "Ваше имя пользователя:" -#: ../gtk/parameters.ui.h:53 +#: ../gtk/parameters.ui.h:56 msgid "Your resulting SIP address:" msgstr "Ваш результирующий SIP адрес:" -#: ../gtk/parameters.ui.h:54 +#: ../gtk/parameters.ui.h:57 msgid "Default identity" msgstr "Идентификатор по умолчанию" -#: ../gtk/parameters.ui.h:55 +#: ../gtk/parameters.ui.h:58 msgid "Wizard" msgstr "Мастер" -#: ../gtk/parameters.ui.h:56 +#: ../gtk/parameters.ui.h:59 msgid "Add" msgstr "Добавить" -#: ../gtk/parameters.ui.h:57 +#: ../gtk/parameters.ui.h:60 msgid "Edit" msgstr "Редактировать" -#: ../gtk/parameters.ui.h:58 +#: ../gtk/parameters.ui.h:61 msgid "Remove" msgstr "Удалить" -#: ../gtk/parameters.ui.h:59 +#: ../gtk/parameters.ui.h:62 msgid "Proxy accounts" msgstr "Учётные записи" -#: ../gtk/parameters.ui.h:60 +#: ../gtk/parameters.ui.h:63 msgid "Erase all passwords" msgstr "Стереть все пароли" -#: ../gtk/parameters.ui.h:61 +#: ../gtk/parameters.ui.h:64 msgid "Privacy" msgstr "Секретность" -#: ../gtk/parameters.ui.h:62 +#: ../gtk/parameters.ui.h:65 msgid "Automatically answer when a call is received" msgstr "Автоматический ответ при получении звонка" -#: ../gtk/parameters.ui.h:63 +#: ../gtk/parameters.ui.h:66 +msgid "Delay before answering (ms)" +msgstr "Задержка перед ответом (мс)" + +#: ../gtk/parameters.ui.h:67 msgid "Auto-answer" msgstr "Автоответ" -#: ../gtk/parameters.ui.h:64 +#: ../gtk/parameters.ui.h:68 msgid "Manage SIP Accounts" msgstr "Управление учётными записями SIP" -#: ../gtk/parameters.ui.h:65 ../gtk/tunnel_config.ui.h:4 +#: ../gtk/parameters.ui.h:69 ../gtk/tunnel_config.ui.h:4 msgid "Enable" msgstr "Разрешить" -#: ../gtk/parameters.ui.h:66 ../gtk/tunnel_config.ui.h:5 +#: ../gtk/parameters.ui.h:70 ../gtk/tunnel_config.ui.h:5 msgid "Disable" msgstr "Выключить" -#: ../gtk/parameters.ui.h:67 +#: ../gtk/parameters.ui.h:71 msgid "Codecs" msgstr "Кодеки" -#: ../gtk/parameters.ui.h:68 +#: ../gtk/parameters.ui.h:72 msgid "0 stands for \"unlimited\"" msgstr "0 означает \"безлимитный\"" -#: ../gtk/parameters.ui.h:69 +#: ../gtk/parameters.ui.h:73 msgid "Upload speed limit in Kbit/sec:" msgstr "Ограничение исходящего потока КБит/сек:" -#: ../gtk/parameters.ui.h:70 +#: ../gtk/parameters.ui.h:74 msgid "Download speed limit in Kbit/sec:" msgstr "Ограничение скорости входящего потока КБит/сек:" -#: ../gtk/parameters.ui.h:71 +#: ../gtk/parameters.ui.h:75 msgid "Enable adaptive rate control" msgstr "Разрешить адаптивное управление скоростью" -#: ../gtk/parameters.ui.h:72 +#: ../gtk/parameters.ui.h:76 msgid "" "Adaptive rate control is a technique to dynamically guess the available " "bandwidth during a call." msgstr "Адаптивное управление скоростью - это технология динамического угадывания доступной пропускной способности во время звонка." -#: ../gtk/parameters.ui.h:73 +#: ../gtk/parameters.ui.h:77 msgid "Bandwidth control" msgstr "Пропускная способность" -#: ../gtk/parameters.ui.h:74 +#: ../gtk/parameters.ui.h:78 msgid "Codecs" msgstr "Кодеки" -#: ../gtk/parameters.ui.h:75 +#: ../gtk/parameters.ui.h:79 msgid "Language" msgstr "Язык" -#: ../gtk/parameters.ui.h:76 +#: ../gtk/parameters.ui.h:80 msgid "Show advanced settings" msgstr "Показать дополнительные настройки" -#: ../gtk/parameters.ui.h:77 +#: ../gtk/parameters.ui.h:81 msgid "Level" msgstr "Уровень" -#: ../gtk/parameters.ui.h:78 +#: ../gtk/parameters.ui.h:82 msgid "User interface" msgstr "Пользовательский интерфейс" -#: ../gtk/parameters.ui.h:79 ../gtk/ldap.ui.h:2 +#: ../gtk/parameters.ui.h:83 ../gtk/ldap.ui.h:2 msgid "Server address:" msgstr "Адрес сервера:" -#: ../gtk/parameters.ui.h:80 ../gtk/ldap.ui.h:3 +#: ../gtk/parameters.ui.h:84 ../gtk/ldap.ui.h:3 msgid "Authentication method:" msgstr "Метод аутентификации:" -#: ../gtk/parameters.ui.h:82 +#: ../gtk/parameters.ui.h:86 msgid "LDAP Account setup" msgstr "Установка учётной записи LDAP" -#: ../gtk/parameters.ui.h:83 +#: ../gtk/parameters.ui.h:87 msgid "LDAP" msgstr "LDAP" -#: ../gtk/parameters.ui.h:84 +#: ../gtk/parameters.ui.h:88 msgid "Done" msgstr "Готово" -#: ../gtk/parameters.ui.h:85 -msgid "SIP (UDP)" -msgstr "SIP (UDP)" - -#: ../gtk/parameters.ui.h:86 -msgid "SIP (TCP)" -msgstr "SIP (TCP)" - -#: ../gtk/parameters.ui.h:87 -msgid "SIP (TLS)" -msgstr "SIP (TLS)" - #: ../gtk/buddylookup.ui.h:1 msgid "Search contacts in directory" msgstr "Поиск контактов в директории" @@ -1702,60 +1706,60 @@ msgstr "Конфигурирование..." msgid "Please wait while fetching configuration from server..." msgstr "Пожалуйста, подождите пока получается конфигурация с сервера..." -#: ../coreapi/linphonecore.c:1534 +#: ../coreapi/linphonecore.c:1538 msgid "Ready" msgstr "Готов" -#: ../coreapi/linphonecore.c:2534 +#: ../coreapi/linphonecore.c:2550 msgid "Configuring" msgstr "Конфигурирование" -#: ../coreapi/linphonecore.c:2708 +#: ../coreapi/linphonecore.c:2724 msgid "Looking for telephone number destination..." msgstr "Поиск назначения для телефонного номера.." -#: ../coreapi/linphonecore.c:2710 +#: ../coreapi/linphonecore.c:2726 msgid "Could not resolve this number." msgstr "Не получилось принять решение по этому номеру." #. must be known at that time -#: ../coreapi/linphonecore.c:2996 +#: ../coreapi/linphonecore.c:3012 msgid "Contacting" msgstr "Соединение" -#: ../coreapi/linphonecore.c:3001 +#: ../coreapi/linphonecore.c:3017 msgid "Could not call" msgstr "Невозможно позвонить" -#: ../coreapi/linphonecore.c:3152 +#: ../coreapi/linphonecore.c:3168 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "К сожалению, мы достигли максимального количества одновременных звонков" -#: ../coreapi/linphonecore.c:3310 +#: ../coreapi/linphonecore.c:3326 msgid "is contacting you" msgstr "контактирует с вами" -#: ../coreapi/linphonecore.c:3311 +#: ../coreapi/linphonecore.c:3327 msgid " and asked autoanswer." msgstr "и спросил автоматический ответ." -#: ../coreapi/linphonecore.c:3435 +#: ../coreapi/linphonecore.c:3451 msgid "Modifying call parameters..." msgstr "Изменение параметров звонка..." -#: ../coreapi/linphonecore.c:3782 +#: ../coreapi/linphonecore.c:3798 msgid "Connected." msgstr "Соединён." -#: ../coreapi/linphonecore.c:3807 +#: ../coreapi/linphonecore.c:3823 msgid "Call aborted" msgstr "Звонок отменён" -#: ../coreapi/linphonecore.c:3997 +#: ../coreapi/linphonecore.c:4013 msgid "Could not pause the call" msgstr "Невозможно приостановить звонок" -#: ../coreapi/linphonecore.c:4000 +#: ../coreapi/linphonecore.c:4016 msgid "Pausing the current call..." msgstr "Приостановка текущего звонка..." @@ -1951,11 +1955,11 @@ msgstr "Сервис недоступен, повтор" msgid "Authentication token is %s" msgstr "Маркер проверки подлинности: %s" -#: ../coreapi/linphonecall.c:1305 +#: ../coreapi/linphonecall.c:1306 msgid "Call parameters were successfully modified." msgstr "Параметры звонка были успешно изменены." -#: ../coreapi/linphonecall.c:3659 +#: ../coreapi/linphonecall.c:3660 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." diff --git a/po/sr.po b/po/sr.po index e27cd10ae..fa8be5c4d 100644 --- a/po/sr.po +++ b/po/sr.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: linphone-gtk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-27 14:40+0100\n" -"PO-Revision-Date: 2015-03-27 13:40+0000\n" +"POT-Creation-Date: 2015-04-01 16:25+0200\n" +"PO-Revision-Date: 2015-04-01 14:26+0000\n" "Last-Translator: Belledonne Communications \n" "Language-Team: Serbian (http://www.transifex.com/projects/p/linphone-gtk/language/sr/)\n" "MIME-Version: 1.0\n" @@ -128,7 +128,7 @@ msgstr "Покреће помоћника звука" msgid "Run self test and exit 0 if succeed" msgstr "Покреће самоиспробавање и излази 0 ако је успешно" -#: ../gtk/main.c:1059 +#: ../gtk/main.c:1069 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -136,76 +136,76 @@ msgid "" "If you answer no, this person will be temporarily blacklisted." msgstr "%s жели да вас дода на списак пријатеља.\nДа ли желите да му допустите да види ваше стање присуства или да га додате на ваш списак пријатеља ?\nАко одговорите са не, ова особа ће привремено бити стављена на списак забрана." -#: ../gtk/main.c:1136 +#: ../gtk/main.c:1146 #, c-format msgid "" "Please enter your password for username %s\n" " at realm %s:" msgstr "Унесите вашу лозинку за корисничко име %s\n на подручју %s:" -#: ../gtk/main.c:1257 +#: ../gtk/main.c:1267 msgid "Call error" msgstr "Грешка позива" -#: ../gtk/main.c:1260 ../coreapi/linphonecore.c:3826 +#: ../gtk/main.c:1270 ../coreapi/linphonecore.c:3842 msgid "Call ended" msgstr "Позив је завршен" -#: ../gtk/main.c:1263 ../coreapi/call_log.c:221 +#: ../gtk/main.c:1273 ../coreapi/call_log.c:221 msgid "Incoming call" msgstr "Долазни позив" -#: ../gtk/main.c:1265 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 +#: ../gtk/main.c:1275 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 msgid "Answer" msgstr "Јави се" -#: ../gtk/main.c:1267 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1277 ../gtk/main.ui.h:6 msgid "Decline" msgstr "Одбиј" -#: ../gtk/main.c:1273 +#: ../gtk/main.c:1283 msgid "Call paused" msgstr "Позив је заустављен" -#: ../gtk/main.c:1273 +#: ../gtk/main.c:1283 #, c-format msgid "by %s" msgstr "од %s" -#: ../gtk/main.c:1343 +#: ../gtk/main.c:1353 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "%s предлаже да започнете видео. Да ли прихватате ?" -#: ../gtk/main.c:1505 +#: ../gtk/main.c:1516 msgid "Website link" msgstr "Веза веб сајта" -#: ../gtk/main.c:1554 +#: ../gtk/main.c:1565 msgid "Linphone - a video internet phone" msgstr "Линфон — интернет телефон са снимком" -#: ../gtk/main.c:1646 +#: ../gtk/main.c:1657 #, c-format msgid "%s (Default)" msgstr "%s (основно)" -#: ../gtk/main.c:1978 ../coreapi/callbacks.c:1057 +#: ../gtk/main.c:1989 ../coreapi/callbacks.c:1057 #, c-format msgid "We are transferred to %s" msgstr "Преселили смо се на %s" -#: ../gtk/main.c:1988 +#: ../gtk/main.c:1999 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." msgstr "Ниједна звучна картица није откривена на овом рачунару.\nНећете бити у могућности да шаљете или да примате звучне позиве." -#: ../gtk/main.c:2136 +#: ../gtk/main.c:2147 msgid "A free SIP video-phone" msgstr "Слободан СИП телефон са снимком" -#: ../gtk/main.c:2241 +#: ../gtk/main.c:2252 #, c-format msgid "Hello\n" msgstr "" @@ -279,7 +279,7 @@ msgstr "Параметри" msgid "Enabled" msgstr "Укључено" -#: ../gtk/propertybox.c:622 ../gtk/propertybox.c:763 ../gtk/parameters.ui.h:17 +#: ../gtk/propertybox.c:622 ../gtk/propertybox.c:763 ../gtk/parameters.ui.h:20 msgid "Disabled" msgstr "Искључено" @@ -445,7 +445,7 @@ msgstr "Желим да наведем удаљену путању подеша msgid "Enter your linphone.org username" msgstr "Унесите ваше корисничко име линфон.орг-а" -#: ../gtk/setupwizard.c:102 ../gtk/parameters.ui.h:81 ../gtk/ldap.ui.h:4 +#: ../gtk/setupwizard.c:102 ../gtk/parameters.ui.h:85 ../gtk/ldap.ui.h:4 msgid "Username:" msgstr "Корисничко име:" @@ -1182,307 +1182,311 @@ msgid "C" msgstr "В" #: ../gtk/parameters.ui.h:11 +msgid "SIP (UDP)" +msgstr "СИП (УДП)" + +#: ../gtk/parameters.ui.h:12 +msgid "SIP (TCP)" +msgstr "СИП (ТЦП)" + +#: ../gtk/parameters.ui.h:13 +msgid "SIP (TLS)" +msgstr "СИП (ТЛС)" + +#: ../gtk/parameters.ui.h:14 msgid "Settings" msgstr "Подешавања" -#: ../gtk/parameters.ui.h:12 +#: ../gtk/parameters.ui.h:15 msgid "Set Maximum Transmission Unit:" msgstr "Подеси јединицу највећег преноса:" -#: ../gtk/parameters.ui.h:13 +#: ../gtk/parameters.ui.h:16 msgid "Send DTMFs as SIP info" msgstr "Пошаљи ДТМФ као СИП податке" -#: ../gtk/parameters.ui.h:14 +#: ../gtk/parameters.ui.h:17 msgid "Allow IPv6" msgstr "" -#: ../gtk/parameters.ui.h:15 +#: ../gtk/parameters.ui.h:18 msgid "Transport" msgstr "Пренос" -#: ../gtk/parameters.ui.h:16 +#: ../gtk/parameters.ui.h:19 msgid "SIP/UDP port" msgstr "СИП/УДП прикључник" -#: ../gtk/parameters.ui.h:18 +#: ../gtk/parameters.ui.h:21 msgid "Random" msgstr "Насумично" -#: ../gtk/parameters.ui.h:19 +#: ../gtk/parameters.ui.h:22 msgid "SIP/TCP port" msgstr "СИП/ТЦП прикључник" -#: ../gtk/parameters.ui.h:20 +#: ../gtk/parameters.ui.h:23 msgid "Audio RTP/UDP:" msgstr "РТП/УДП звука:" -#: ../gtk/parameters.ui.h:21 +#: ../gtk/parameters.ui.h:24 msgid "Fixed" msgstr "Неизмењиво" -#: ../gtk/parameters.ui.h:22 +#: ../gtk/parameters.ui.h:25 msgid "Video RTP/UDP:" msgstr "РТП/УДП снимка:" -#: ../gtk/parameters.ui.h:23 +#: ../gtk/parameters.ui.h:26 msgid "Media encryption type" msgstr "Врста шифровања медија" -#: ../gtk/parameters.ui.h:24 +#: ../gtk/parameters.ui.h:27 msgid "Media encryption is mandatory" msgstr "Шифровање медија је обавезно" -#: ../gtk/parameters.ui.h:25 +#: ../gtk/parameters.ui.h:28 msgid "Tunnel" msgstr "Тунел" -#: ../gtk/parameters.ui.h:26 +#: ../gtk/parameters.ui.h:29 msgid "DSCP fields" msgstr "ДСЦП поља" -#: ../gtk/parameters.ui.h:27 +#: ../gtk/parameters.ui.h:30 msgid "Network protocol and ports" msgstr "Мрежни протокол и прикључници" -#: ../gtk/parameters.ui.h:28 +#: ../gtk/parameters.ui.h:31 msgid "Direct connection to the Internet" msgstr "Непосредна веза на Интернет" -#: ../gtk/parameters.ui.h:29 +#: ../gtk/parameters.ui.h:32 msgid "Behind NAT / Firewall (specify gateway IP )" msgstr "Иза НАТ-а / мрежне баријере (наведите ИП мрежног пролаза)" -#: ../gtk/parameters.ui.h:30 +#: ../gtk/parameters.ui.h:33 msgid "Behind NAT / Firewall (use STUN to resolve)" msgstr "Иза НАТ-а / мрежне баријере (користите СТУН за решавање)" -#: ../gtk/parameters.ui.h:31 +#: ../gtk/parameters.ui.h:34 msgid "Behind NAT / Firewall (use ICE)" msgstr "Иза НАТ-а / мрежне баријере (користите ИЦЕ)" -#: ../gtk/parameters.ui.h:32 +#: ../gtk/parameters.ui.h:35 msgid "Behind NAT / Firewall (use uPnP)" msgstr "Иза НАТ-а / мрежне баријере (користите уПнП)" -#: ../gtk/parameters.ui.h:33 +#: ../gtk/parameters.ui.h:36 msgid "Public IP address:" msgstr "Јавна ИП адреса:" -#: ../gtk/parameters.ui.h:34 +#: ../gtk/parameters.ui.h:37 msgid "Stun server:" msgstr "Стун сервер:" -#: ../gtk/parameters.ui.h:35 +#: ../gtk/parameters.ui.h:38 msgid "NAT and Firewall" msgstr "НАТ и мрежна баријера" -#: ../gtk/parameters.ui.h:36 +#: ../gtk/parameters.ui.h:39 msgid "Network settings" msgstr "Мрежа" -#: ../gtk/parameters.ui.h:37 +#: ../gtk/parameters.ui.h:40 msgid "Ring sound:" msgstr "Звук звона:" -#: ../gtk/parameters.ui.h:38 +#: ../gtk/parameters.ui.h:41 msgid "ALSA special device (optional):" msgstr "АЛСА-ин посебни уређај (изборно):" -#: ../gtk/parameters.ui.h:39 +#: ../gtk/parameters.ui.h:42 msgid "Capture device:" msgstr "Уређај за снимање:" -#: ../gtk/parameters.ui.h:40 +#: ../gtk/parameters.ui.h:43 msgid "Ring device:" msgstr "Уређај за звоно:" -#: ../gtk/parameters.ui.h:41 +#: ../gtk/parameters.ui.h:44 msgid "Playback device:" msgstr "Уређај за пуштање:" -#: ../gtk/parameters.ui.h:42 +#: ../gtk/parameters.ui.h:45 msgid "Enable echo cancellation" msgstr "Укључи поништавање одјека" -#: ../gtk/parameters.ui.h:43 +#: ../gtk/parameters.ui.h:46 msgid "Audio" msgstr "Звук" -#: ../gtk/parameters.ui.h:44 +#: ../gtk/parameters.ui.h:47 msgid "Video input device:" msgstr "Улазни уређај снимка:" -#: ../gtk/parameters.ui.h:45 +#: ../gtk/parameters.ui.h:48 msgid "Prefered video resolution:" msgstr "Жељена резолуција снимка:" -#: ../gtk/parameters.ui.h:46 +#: ../gtk/parameters.ui.h:49 msgid "Video output method:" msgstr "Начин излаза снимка:" -#: ../gtk/parameters.ui.h:47 +#: ../gtk/parameters.ui.h:50 msgid "Show camera preview" msgstr "Прикажи претпреглед камерице" -#: ../gtk/parameters.ui.h:48 +#: ../gtk/parameters.ui.h:51 msgid "Video" msgstr "Снимак" -#: ../gtk/parameters.ui.h:49 +#: ../gtk/parameters.ui.h:52 msgid "Multimedia settings" msgstr "Мултимедија" -#: ../gtk/parameters.ui.h:50 +#: ../gtk/parameters.ui.h:53 msgid "This section defines your SIP address when not using a SIP account" msgstr "Овај одељак одређује вашу СИП адресу када не користите СИП налог" -#: ../gtk/parameters.ui.h:51 +#: ../gtk/parameters.ui.h:54 msgid "Your display name (eg: John Doe):" msgstr "Ваше приказано име (нпр: Пера Перић):" -#: ../gtk/parameters.ui.h:52 +#: ../gtk/parameters.ui.h:55 msgid "Your username:" msgstr "Ваше корисничко име:" -#: ../gtk/parameters.ui.h:53 +#: ../gtk/parameters.ui.h:56 msgid "Your resulting SIP address:" msgstr "Ваша резултирајућа СИП адреса:" -#: ../gtk/parameters.ui.h:54 +#: ../gtk/parameters.ui.h:57 msgid "Default identity" msgstr "Основни идентитет" -#: ../gtk/parameters.ui.h:55 +#: ../gtk/parameters.ui.h:58 msgid "Wizard" msgstr "Чаробњак" -#: ../gtk/parameters.ui.h:56 +#: ../gtk/parameters.ui.h:59 msgid "Add" msgstr "Додај" -#: ../gtk/parameters.ui.h:57 +#: ../gtk/parameters.ui.h:60 msgid "Edit" msgstr "Уреди" -#: ../gtk/parameters.ui.h:58 +#: ../gtk/parameters.ui.h:61 msgid "Remove" msgstr "Уклони" -#: ../gtk/parameters.ui.h:59 +#: ../gtk/parameters.ui.h:62 msgid "Proxy accounts" msgstr "Посреднички налози" -#: ../gtk/parameters.ui.h:60 +#: ../gtk/parameters.ui.h:63 msgid "Erase all passwords" msgstr "Обриши све лозинке" -#: ../gtk/parameters.ui.h:61 +#: ../gtk/parameters.ui.h:64 msgid "Privacy" msgstr "Приватност" -#: ../gtk/parameters.ui.h:62 +#: ../gtk/parameters.ui.h:65 msgid "Automatically answer when a call is received" msgstr "" -#: ../gtk/parameters.ui.h:63 +#: ../gtk/parameters.ui.h:66 +msgid "Delay before answering (ms)" +msgstr "" + +#: ../gtk/parameters.ui.h:67 msgid "Auto-answer" msgstr "" -#: ../gtk/parameters.ui.h:64 +#: ../gtk/parameters.ui.h:68 msgid "Manage SIP Accounts" msgstr "СИП налози" -#: ../gtk/parameters.ui.h:65 ../gtk/tunnel_config.ui.h:4 +#: ../gtk/parameters.ui.h:69 ../gtk/tunnel_config.ui.h:4 msgid "Enable" msgstr "Укључи" -#: ../gtk/parameters.ui.h:66 ../gtk/tunnel_config.ui.h:5 +#: ../gtk/parameters.ui.h:70 ../gtk/tunnel_config.ui.h:5 msgid "Disable" msgstr "Искључи" -#: ../gtk/parameters.ui.h:67 +#: ../gtk/parameters.ui.h:71 msgid "Codecs" msgstr "Кодеци" -#: ../gtk/parameters.ui.h:68 +#: ../gtk/parameters.ui.h:72 msgid "0 stands for \"unlimited\"" msgstr "0 значи „неограничено“" -#: ../gtk/parameters.ui.h:69 +#: ../gtk/parameters.ui.h:73 msgid "Upload speed limit in Kbit/sec:" msgstr "Ограничи брзину слања на (Kb/s):" -#: ../gtk/parameters.ui.h:70 +#: ../gtk/parameters.ui.h:74 msgid "Download speed limit in Kbit/sec:" msgstr "Ограничи брзину преузимања на (Kb/s):" -#: ../gtk/parameters.ui.h:71 +#: ../gtk/parameters.ui.h:75 msgid "Enable adaptive rate control" msgstr "Укључи прилагодљиво управљање протоком" -#: ../gtk/parameters.ui.h:72 +#: ../gtk/parameters.ui.h:76 msgid "" "Adaptive rate control is a technique to dynamically guess the available " "bandwidth during a call." msgstr "Прилагодљиво управљање протоком је техника за променљиво погађање доступног пропусног опсега за време позива." -#: ../gtk/parameters.ui.h:73 +#: ../gtk/parameters.ui.h:77 msgid "Bandwidth control" msgstr "Управљање пропусним опсегом" -#: ../gtk/parameters.ui.h:74 +#: ../gtk/parameters.ui.h:78 msgid "Codecs" msgstr "Kодеци" -#: ../gtk/parameters.ui.h:75 +#: ../gtk/parameters.ui.h:79 msgid "Language" msgstr "Језик" -#: ../gtk/parameters.ui.h:76 +#: ../gtk/parameters.ui.h:80 msgid "Show advanced settings" msgstr "Прикажи напредна подешавања" -#: ../gtk/parameters.ui.h:77 +#: ../gtk/parameters.ui.h:81 msgid "Level" msgstr "Ниво" -#: ../gtk/parameters.ui.h:78 +#: ../gtk/parameters.ui.h:82 msgid "User interface" msgstr "Корисничко сучеље" -#: ../gtk/parameters.ui.h:79 ../gtk/ldap.ui.h:2 +#: ../gtk/parameters.ui.h:83 ../gtk/ldap.ui.h:2 msgid "Server address:" msgstr "Адреса сервера:" -#: ../gtk/parameters.ui.h:80 ../gtk/ldap.ui.h:3 +#: ../gtk/parameters.ui.h:84 ../gtk/ldap.ui.h:3 msgid "Authentication method:" msgstr "Начин потврђивања идентитета:" -#: ../gtk/parameters.ui.h:82 +#: ../gtk/parameters.ui.h:86 msgid "LDAP Account setup" msgstr "Подешавања ЛДАП налога" -#: ../gtk/parameters.ui.h:83 +#: ../gtk/parameters.ui.h:87 msgid "LDAP" msgstr "ЛДАП" -#: ../gtk/parameters.ui.h:84 +#: ../gtk/parameters.ui.h:88 msgid "Done" msgstr "Готово" -#: ../gtk/parameters.ui.h:85 -msgid "SIP (UDP)" -msgstr "СИП (УДП)" - -#: ../gtk/parameters.ui.h:86 -msgid "SIP (TCP)" -msgstr "СИП (ТЦП)" - -#: ../gtk/parameters.ui.h:87 -msgid "SIP (TLS)" -msgstr "СИП (ТЛС)" - #: ../gtk/buddylookup.ui.h:1 msgid "Search contacts in directory" msgstr "Потражите пријатеље у директоријуму" @@ -1698,60 +1702,60 @@ msgstr "Подешавам..." msgid "Please wait while fetching configuration from server..." msgstr "Сачекајте док довучем подешавања са сервера..." -#: ../coreapi/linphonecore.c:1534 +#: ../coreapi/linphonecore.c:1538 msgid "Ready" msgstr "Спреман" -#: ../coreapi/linphonecore.c:2534 +#: ../coreapi/linphonecore.c:2550 msgid "Configuring" msgstr "Подешавам" -#: ../coreapi/linphonecore.c:2708 +#: ../coreapi/linphonecore.c:2724 msgid "Looking for telephone number destination..." msgstr "Тражим одредиште телефонског броја..." -#: ../coreapi/linphonecore.c:2710 +#: ../coreapi/linphonecore.c:2726 msgid "Could not resolve this number." msgstr "Не могу да решим овај број." #. must be known at that time -#: ../coreapi/linphonecore.c:2996 +#: ../coreapi/linphonecore.c:3012 msgid "Contacting" msgstr "Ступам у везу" -#: ../coreapi/linphonecore.c:3001 +#: ../coreapi/linphonecore.c:3017 msgid "Could not call" msgstr "Не могу да позовем" -#: ../coreapi/linphonecore.c:3152 +#: ../coreapi/linphonecore.c:3168 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "Извините, достигли смо највећи број истовремених позива" -#: ../coreapi/linphonecore.c:3310 +#: ../coreapi/linphonecore.c:3326 msgid "is contacting you" msgstr "вам се обраћа" -#: ../coreapi/linphonecore.c:3311 +#: ../coreapi/linphonecore.c:3327 msgid " and asked autoanswer." msgstr " и затражени само-одговор." -#: ../coreapi/linphonecore.c:3435 +#: ../coreapi/linphonecore.c:3451 msgid "Modifying call parameters..." msgstr "Мењам параметре позива..." -#: ../coreapi/linphonecore.c:3782 +#: ../coreapi/linphonecore.c:3798 msgid "Connected." msgstr "Повезан сам." -#: ../coreapi/linphonecore.c:3807 +#: ../coreapi/linphonecore.c:3823 msgid "Call aborted" msgstr "Позив је прекинут" -#: ../coreapi/linphonecore.c:3997 +#: ../coreapi/linphonecore.c:4013 msgid "Could not pause the call" msgstr "Не могу да зауставим позив" -#: ../coreapi/linphonecore.c:4000 +#: ../coreapi/linphonecore.c:4016 msgid "Pausing the current call..." msgstr "Заустављам тренутни позив..." @@ -1947,11 +1951,11 @@ msgstr "Услуга није доступна, поново покушавам" msgid "Authentication token is %s" msgstr "Симбол потврђивања идентитета је „%s“" -#: ../coreapi/linphonecall.c:1305 +#: ../coreapi/linphonecall.c:1306 msgid "Call parameters were successfully modified." msgstr "" -#: ../coreapi/linphonecall.c:3659 +#: ../coreapi/linphonecall.c:3660 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." diff --git a/po/sv.po b/po/sv.po index ef23005fe..9b05dff62 100644 --- a/po/sv.po +++ b/po/sv.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: linphone-gtk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-27 14:40+0100\n" -"PO-Revision-Date: 2015-03-27 13:40+0000\n" +"POT-Creation-Date: 2015-04-01 16:25+0200\n" +"PO-Revision-Date: 2015-04-01 14:26+0000\n" "Last-Translator: Belledonne Communications \n" "Language-Team: Swedish (http://www.transifex.com/projects/p/linphone-gtk/language/sv/)\n" "MIME-Version: 1.0\n" @@ -125,7 +125,7 @@ msgstr "" msgid "Run self test and exit 0 if succeed" msgstr "" -#: ../gtk/main.c:1059 +#: ../gtk/main.c:1069 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -133,76 +133,76 @@ msgid "" "If you answer no, this person will be temporarily blacklisted." msgstr "%s skulle vilja lägga till dig till hans/hennes kontaktlista.\nVill du tillåta honom/henne att se din närvarostatus eller lägga till honom/henne till din kontaktlista?\nOm du svarar nej, personen kommer att vara bannlyst." -#: ../gtk/main.c:1136 +#: ../gtk/main.c:1146 #, c-format msgid "" "Please enter your password for username %s\n" " at realm %s:" msgstr "" -#: ../gtk/main.c:1257 +#: ../gtk/main.c:1267 msgid "Call error" msgstr "" -#: ../gtk/main.c:1260 ../coreapi/linphonecore.c:3826 +#: ../gtk/main.c:1270 ../coreapi/linphonecore.c:3842 msgid "Call ended" msgstr "Samtalet slut" -#: ../gtk/main.c:1263 ../coreapi/call_log.c:221 +#: ../gtk/main.c:1273 ../coreapi/call_log.c:221 msgid "Incoming call" msgstr "Inkommande samtal" -#: ../gtk/main.c:1265 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 +#: ../gtk/main.c:1275 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 msgid "Answer" msgstr "" -#: ../gtk/main.c:1267 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1277 ../gtk/main.ui.h:6 msgid "Decline" msgstr "Avböj" -#: ../gtk/main.c:1273 +#: ../gtk/main.c:1283 msgid "Call paused" msgstr "" -#: ../gtk/main.c:1273 +#: ../gtk/main.c:1283 #, c-format msgid "by %s" msgstr "" -#: ../gtk/main.c:1343 +#: ../gtk/main.c:1353 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1505 +#: ../gtk/main.c:1516 msgid "Website link" msgstr "Webbsajt" -#: ../gtk/main.c:1554 +#: ../gtk/main.c:1565 msgid "Linphone - a video internet phone" msgstr "Linphone - en video Internet telefon" -#: ../gtk/main.c:1646 +#: ../gtk/main.c:1657 #, c-format msgid "%s (Default)" msgstr "%s (Default)" -#: ../gtk/main.c:1978 ../coreapi/callbacks.c:1057 +#: ../gtk/main.c:1989 ../coreapi/callbacks.c:1057 #, c-format msgid "We are transferred to %s" msgstr "" -#: ../gtk/main.c:1988 +#: ../gtk/main.c:1999 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." msgstr "" -#: ../gtk/main.c:2136 +#: ../gtk/main.c:2147 msgid "A free SIP video-phone" msgstr "En gratis SIP video-telefon" -#: ../gtk/main.c:2241 +#: ../gtk/main.c:2252 #, c-format msgid "Hello\n" msgstr "" @@ -276,7 +276,7 @@ msgstr "Parametrar" msgid "Enabled" msgstr "På" -#: ../gtk/propertybox.c:622 ../gtk/propertybox.c:763 ../gtk/parameters.ui.h:17 +#: ../gtk/propertybox.c:622 ../gtk/propertybox.c:763 ../gtk/parameters.ui.h:20 msgid "Disabled" msgstr "Av" @@ -441,7 +441,7 @@ msgstr "" msgid "Enter your linphone.org username" msgstr "" -#: ../gtk/setupwizard.c:102 ../gtk/parameters.ui.h:81 ../gtk/ldap.ui.h:4 +#: ../gtk/setupwizard.c:102 ../gtk/parameters.ui.h:85 ../gtk/ldap.ui.h:4 msgid "Username:" msgstr "Användarnamn:" @@ -1178,307 +1178,311 @@ msgid "C" msgstr "" #: ../gtk/parameters.ui.h:11 +msgid "SIP (UDP)" +msgstr "" + +#: ../gtk/parameters.ui.h:12 +msgid "SIP (TCP)" +msgstr "" + +#: ../gtk/parameters.ui.h:13 +msgid "SIP (TLS)" +msgstr "" + +#: ../gtk/parameters.ui.h:14 msgid "Settings" msgstr "Inställningar" -#: ../gtk/parameters.ui.h:12 +#: ../gtk/parameters.ui.h:15 msgid "Set Maximum Transmission Unit:" msgstr "Välj MTU (Maximum Transmission Unit):" -#: ../gtk/parameters.ui.h:13 +#: ../gtk/parameters.ui.h:16 msgid "Send DTMFs as SIP info" msgstr "Kicka DTMF koder som SIP info" -#: ../gtk/parameters.ui.h:14 +#: ../gtk/parameters.ui.h:17 msgid "Allow IPv6" msgstr "" -#: ../gtk/parameters.ui.h:15 +#: ../gtk/parameters.ui.h:18 msgid "Transport" msgstr "Transport" -#: ../gtk/parameters.ui.h:16 +#: ../gtk/parameters.ui.h:19 msgid "SIP/UDP port" msgstr "" -#: ../gtk/parameters.ui.h:18 +#: ../gtk/parameters.ui.h:21 msgid "Random" msgstr "" -#: ../gtk/parameters.ui.h:19 +#: ../gtk/parameters.ui.h:22 msgid "SIP/TCP port" msgstr "" -#: ../gtk/parameters.ui.h:20 +#: ../gtk/parameters.ui.h:23 msgid "Audio RTP/UDP:" msgstr "" -#: ../gtk/parameters.ui.h:21 +#: ../gtk/parameters.ui.h:24 msgid "Fixed" msgstr "" -#: ../gtk/parameters.ui.h:22 +#: ../gtk/parameters.ui.h:25 msgid "Video RTP/UDP:" msgstr "" -#: ../gtk/parameters.ui.h:23 +#: ../gtk/parameters.ui.h:26 msgid "Media encryption type" msgstr "" -#: ../gtk/parameters.ui.h:24 +#: ../gtk/parameters.ui.h:27 msgid "Media encryption is mandatory" msgstr "" -#: ../gtk/parameters.ui.h:25 +#: ../gtk/parameters.ui.h:28 msgid "Tunnel" msgstr "" -#: ../gtk/parameters.ui.h:26 +#: ../gtk/parameters.ui.h:29 msgid "DSCP fields" msgstr "" -#: ../gtk/parameters.ui.h:27 +#: ../gtk/parameters.ui.h:30 msgid "Network protocol and ports" msgstr "" -#: ../gtk/parameters.ui.h:28 +#: ../gtk/parameters.ui.h:31 msgid "Direct connection to the Internet" msgstr "Direkt förbindelse till Internet" -#: ../gtk/parameters.ui.h:29 +#: ../gtk/parameters.ui.h:32 msgid "Behind NAT / Firewall (specify gateway IP )" msgstr "" -#: ../gtk/parameters.ui.h:30 +#: ../gtk/parameters.ui.h:33 msgid "Behind NAT / Firewall (use STUN to resolve)" msgstr "Bakom en NAT / brandvägg (använd STUN för att avgöra adressen)" -#: ../gtk/parameters.ui.h:31 +#: ../gtk/parameters.ui.h:34 msgid "Behind NAT / Firewall (use ICE)" msgstr "" -#: ../gtk/parameters.ui.h:32 +#: ../gtk/parameters.ui.h:35 msgid "Behind NAT / Firewall (use uPnP)" msgstr "" -#: ../gtk/parameters.ui.h:33 +#: ../gtk/parameters.ui.h:36 msgid "Public IP address:" msgstr "Publik IP adress:" -#: ../gtk/parameters.ui.h:34 +#: ../gtk/parameters.ui.h:37 msgid "Stun server:" msgstr "STUN server:" -#: ../gtk/parameters.ui.h:35 +#: ../gtk/parameters.ui.h:38 msgid "NAT and Firewall" msgstr "NAT och Brandvägg" -#: ../gtk/parameters.ui.h:36 +#: ../gtk/parameters.ui.h:39 msgid "Network settings" msgstr "Nätverksinställningar" -#: ../gtk/parameters.ui.h:37 +#: ../gtk/parameters.ui.h:40 msgid "Ring sound:" msgstr "Ring signal:" -#: ../gtk/parameters.ui.h:38 +#: ../gtk/parameters.ui.h:41 msgid "ALSA special device (optional):" msgstr "ALSA speciell enhet (tillval):" -#: ../gtk/parameters.ui.h:39 +#: ../gtk/parameters.ui.h:42 msgid "Capture device:" msgstr "Mikrofon enhet:" -#: ../gtk/parameters.ui.h:40 +#: ../gtk/parameters.ui.h:43 msgid "Ring device:" msgstr "Ringning enhet:" -#: ../gtk/parameters.ui.h:41 +#: ../gtk/parameters.ui.h:44 msgid "Playback device:" msgstr "Uppspelningsenhet:" -#: ../gtk/parameters.ui.h:42 +#: ../gtk/parameters.ui.h:45 msgid "Enable echo cancellation" msgstr "Tillåta ekokancellering" -#: ../gtk/parameters.ui.h:43 +#: ../gtk/parameters.ui.h:46 msgid "Audio" msgstr "Audio" -#: ../gtk/parameters.ui.h:44 +#: ../gtk/parameters.ui.h:47 msgid "Video input device:" msgstr "Video ingångsenhet:" -#: ../gtk/parameters.ui.h:45 +#: ../gtk/parameters.ui.h:48 msgid "Prefered video resolution:" msgstr "Video upplösning:" -#: ../gtk/parameters.ui.h:46 +#: ../gtk/parameters.ui.h:49 msgid "Video output method:" msgstr "" -#: ../gtk/parameters.ui.h:47 +#: ../gtk/parameters.ui.h:50 msgid "Show camera preview" msgstr "" -#: ../gtk/parameters.ui.h:48 +#: ../gtk/parameters.ui.h:51 msgid "Video" msgstr "Video" -#: ../gtk/parameters.ui.h:49 +#: ../gtk/parameters.ui.h:52 msgid "Multimedia settings" msgstr "Multimedia inställningar" -#: ../gtk/parameters.ui.h:50 +#: ../gtk/parameters.ui.h:53 msgid "This section defines your SIP address when not using a SIP account" msgstr "Denna sektion specificerar din SIP adress när du inte använder ett SIP konto" -#: ../gtk/parameters.ui.h:51 +#: ../gtk/parameters.ui.h:54 msgid "Your display name (eg: John Doe):" msgstr "Ditt synliga namn, e.g. Kalle Karlsson:" -#: ../gtk/parameters.ui.h:52 +#: ../gtk/parameters.ui.h:55 msgid "Your username:" msgstr "Ditt användarnamn:" -#: ../gtk/parameters.ui.h:53 +#: ../gtk/parameters.ui.h:56 msgid "Your resulting SIP address:" msgstr "Din SIP adress:" -#: ../gtk/parameters.ui.h:54 +#: ../gtk/parameters.ui.h:57 msgid "Default identity" msgstr "Default identitet" -#: ../gtk/parameters.ui.h:55 +#: ../gtk/parameters.ui.h:58 msgid "Wizard" msgstr "" -#: ../gtk/parameters.ui.h:56 +#: ../gtk/parameters.ui.h:59 msgid "Add" msgstr "Lägg till" -#: ../gtk/parameters.ui.h:57 +#: ../gtk/parameters.ui.h:60 msgid "Edit" msgstr "Editera" -#: ../gtk/parameters.ui.h:58 +#: ../gtk/parameters.ui.h:61 msgid "Remove" msgstr "Ta bort" -#: ../gtk/parameters.ui.h:59 +#: ../gtk/parameters.ui.h:62 msgid "Proxy accounts" msgstr "Proxy konton" -#: ../gtk/parameters.ui.h:60 +#: ../gtk/parameters.ui.h:63 msgid "Erase all passwords" msgstr "Glöm alla lösenord" -#: ../gtk/parameters.ui.h:61 +#: ../gtk/parameters.ui.h:64 msgid "Privacy" msgstr "Integritet" -#: ../gtk/parameters.ui.h:62 +#: ../gtk/parameters.ui.h:65 msgid "Automatically answer when a call is received" msgstr "" -#: ../gtk/parameters.ui.h:63 +#: ../gtk/parameters.ui.h:66 +msgid "Delay before answering (ms)" +msgstr "" + +#: ../gtk/parameters.ui.h:67 msgid "Auto-answer" msgstr "" -#: ../gtk/parameters.ui.h:64 +#: ../gtk/parameters.ui.h:68 msgid "Manage SIP Accounts" msgstr "Hantera SIP konton" -#: ../gtk/parameters.ui.h:65 ../gtk/tunnel_config.ui.h:4 +#: ../gtk/parameters.ui.h:69 ../gtk/tunnel_config.ui.h:4 msgid "Enable" msgstr "Möjliggör" -#: ../gtk/parameters.ui.h:66 ../gtk/tunnel_config.ui.h:5 +#: ../gtk/parameters.ui.h:70 ../gtk/tunnel_config.ui.h:5 msgid "Disable" msgstr "Inaktivera" -#: ../gtk/parameters.ui.h:67 +#: ../gtk/parameters.ui.h:71 msgid "Codecs" msgstr "Codecs" -#: ../gtk/parameters.ui.h:68 +#: ../gtk/parameters.ui.h:72 msgid "0 stands for \"unlimited\"" msgstr "0 står för \"utan begränsning\"" -#: ../gtk/parameters.ui.h:69 +#: ../gtk/parameters.ui.h:73 msgid "Upload speed limit in Kbit/sec:" msgstr "Max upstream bandbreddshastighet i kbit/sek:" -#: ../gtk/parameters.ui.h:70 +#: ../gtk/parameters.ui.h:74 msgid "Download speed limit in Kbit/sec:" msgstr "Max downstream bandbreddshastighet i kbit/sek:" -#: ../gtk/parameters.ui.h:71 +#: ../gtk/parameters.ui.h:75 msgid "Enable adaptive rate control" msgstr "" -#: ../gtk/parameters.ui.h:72 +#: ../gtk/parameters.ui.h:76 msgid "" "Adaptive rate control is a technique to dynamically guess the available " "bandwidth during a call." msgstr "" -#: ../gtk/parameters.ui.h:73 +#: ../gtk/parameters.ui.h:77 msgid "Bandwidth control" msgstr "Bandbreddskontroll" -#: ../gtk/parameters.ui.h:74 +#: ../gtk/parameters.ui.h:78 msgid "Codecs" msgstr "Codecs" -#: ../gtk/parameters.ui.h:75 +#: ../gtk/parameters.ui.h:79 msgid "Language" msgstr "Språk" -#: ../gtk/parameters.ui.h:76 +#: ../gtk/parameters.ui.h:80 msgid "Show advanced settings" msgstr "Visa avancerade inställningar" -#: ../gtk/parameters.ui.h:77 +#: ../gtk/parameters.ui.h:81 msgid "Level" msgstr "Nivå" -#: ../gtk/parameters.ui.h:78 +#: ../gtk/parameters.ui.h:82 msgid "User interface" msgstr "Användarinterface" -#: ../gtk/parameters.ui.h:79 ../gtk/ldap.ui.h:2 +#: ../gtk/parameters.ui.h:83 ../gtk/ldap.ui.h:2 msgid "Server address:" msgstr "" -#: ../gtk/parameters.ui.h:80 ../gtk/ldap.ui.h:3 +#: ../gtk/parameters.ui.h:84 ../gtk/ldap.ui.h:3 msgid "Authentication method:" msgstr "" -#: ../gtk/parameters.ui.h:82 +#: ../gtk/parameters.ui.h:86 msgid "LDAP Account setup" msgstr "" -#: ../gtk/parameters.ui.h:83 +#: ../gtk/parameters.ui.h:87 msgid "LDAP" msgstr "" -#: ../gtk/parameters.ui.h:84 +#: ../gtk/parameters.ui.h:88 msgid "Done" msgstr "Klar" -#: ../gtk/parameters.ui.h:85 -msgid "SIP (UDP)" -msgstr "" - -#: ../gtk/parameters.ui.h:86 -msgid "SIP (TCP)" -msgstr "" - -#: ../gtk/parameters.ui.h:87 -msgid "SIP (TLS)" -msgstr "" - #: ../gtk/buddylookup.ui.h:1 msgid "Search contacts in directory" msgstr "Sök för kontakter i katalogen" @@ -1694,60 +1698,60 @@ msgstr "" msgid "Please wait while fetching configuration from server..." msgstr "" -#: ../coreapi/linphonecore.c:1534 +#: ../coreapi/linphonecore.c:1538 msgid "Ready" msgstr "Redo" -#: ../coreapi/linphonecore.c:2534 +#: ../coreapi/linphonecore.c:2550 msgid "Configuring" msgstr "" -#: ../coreapi/linphonecore.c:2708 +#: ../coreapi/linphonecore.c:2724 msgid "Looking for telephone number destination..." msgstr "Leta efter telefonnummer för destinationen..." -#: ../coreapi/linphonecore.c:2710 +#: ../coreapi/linphonecore.c:2726 msgid "Could not resolve this number." msgstr "Kan inte nå dett nummer." #. must be known at that time -#: ../coreapi/linphonecore.c:2996 +#: ../coreapi/linphonecore.c:3012 msgid "Contacting" msgstr "Kontaktar" -#: ../coreapi/linphonecore.c:3001 +#: ../coreapi/linphonecore.c:3017 msgid "Could not call" msgstr "" -#: ../coreapi/linphonecore.c:3152 +#: ../coreapi/linphonecore.c:3168 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "" -#: ../coreapi/linphonecore.c:3310 +#: ../coreapi/linphonecore.c:3326 msgid "is contacting you" msgstr "" -#: ../coreapi/linphonecore.c:3311 +#: ../coreapi/linphonecore.c:3327 msgid " and asked autoanswer." msgstr "" -#: ../coreapi/linphonecore.c:3435 +#: ../coreapi/linphonecore.c:3451 msgid "Modifying call parameters..." msgstr "" -#: ../coreapi/linphonecore.c:3782 +#: ../coreapi/linphonecore.c:3798 msgid "Connected." msgstr "Kopplad" -#: ../coreapi/linphonecore.c:3807 +#: ../coreapi/linphonecore.c:3823 msgid "Call aborted" msgstr "" -#: ../coreapi/linphonecore.c:3997 +#: ../coreapi/linphonecore.c:4013 msgid "Could not pause the call" msgstr "" -#: ../coreapi/linphonecore.c:4000 +#: ../coreapi/linphonecore.c:4016 msgid "Pausing the current call..." msgstr "" @@ -1943,11 +1947,11 @@ msgstr "" msgid "Authentication token is %s" msgstr "" -#: ../coreapi/linphonecall.c:1305 +#: ../coreapi/linphonecall.c:1306 msgid "Call parameters were successfully modified." msgstr "" -#: ../coreapi/linphonecall.c:3659 +#: ../coreapi/linphonecall.c:3660 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." diff --git a/po/tr.po b/po/tr.po index 97ef267a3..3805ddb69 100644 --- a/po/tr.po +++ b/po/tr.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: linphone-gtk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-27 14:40+0100\n" -"PO-Revision-Date: 2015-03-27 13:40+0000\n" -"Last-Translator: Belledonne Communications \n" +"POT-Creation-Date: 2015-04-01 16:25+0200\n" +"PO-Revision-Date: 2015-04-12 14:15+0000\n" +"Last-Translator: faradundamarti \n" "Language-Team: Turkish (http://www.transifex.com/projects/p/linphone-gtk/language/tr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -94,7 +94,7 @@ msgstr "" #: ../gtk/main.c:137 msgid "path to a file to write logs into." -msgstr "" +msgstr "Günlükleri içine yazmak için bir dosya yolu" #: ../gtk/main.c:138 msgid "Start linphone with video disabled." @@ -102,17 +102,17 @@ msgstr "Linphonu görüntü olmadan başlat" #: ../gtk/main.c:139 msgid "Start only in the system tray, do not show the main interface." -msgstr "" +msgstr "Sadece sistem tepsisinde başlat, ana arayüzü gösterme." #: ../gtk/main.c:140 msgid "address to call right now" -msgstr "" +msgstr "adres ara" #: ../gtk/main.c:141 msgid "" "Specifiy a working directory (should be the base of the installation, eg: " "c:\\Program Files\\Linphone)" -msgstr "" +msgstr "Bir çalışma dizini belirtin (kurulum temelinde olmalı,örneğin: c:\\Program Files\\Linphone)" #: ../gtk/main.c:142 msgid "Configuration file" @@ -126,7 +126,7 @@ msgstr "Ses yardımcısını çalıştır" msgid "Run self test and exit 0 if succeed" msgstr "" -#: ../gtk/main.c:1059 +#: ../gtk/main.c:1069 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -134,79 +134,79 @@ msgid "" "If you answer no, this person will be temporarily blacklisted." msgstr "" -#: ../gtk/main.c:1136 +#: ../gtk/main.c:1146 #, c-format msgid "" "Please enter your password for username %s\n" " at realm %s:" msgstr "" -#: ../gtk/main.c:1257 +#: ../gtk/main.c:1267 msgid "Call error" msgstr "Çağrı yanlış" -#: ../gtk/main.c:1260 ../coreapi/linphonecore.c:3826 +#: ../gtk/main.c:1270 ../coreapi/linphonecore.c:3842 msgid "Call ended" msgstr "Çağrı sonlandırıldı" -#: ../gtk/main.c:1263 ../coreapi/call_log.c:221 +#: ../gtk/main.c:1273 ../coreapi/call_log.c:221 msgid "Incoming call" msgstr "Gelen çağrı" -#: ../gtk/main.c:1265 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 +#: ../gtk/main.c:1275 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 msgid "Answer" msgstr "Yanıt" -#: ../gtk/main.c:1267 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1277 ../gtk/main.ui.h:6 msgid "Decline" msgstr "Reddet" -#: ../gtk/main.c:1273 +#: ../gtk/main.c:1283 msgid "Call paused" msgstr "Çağrı duraklatıldı" -#: ../gtk/main.c:1273 +#: ../gtk/main.c:1283 #, c-format msgid "by %s" msgstr "" -#: ../gtk/main.c:1343 +#: ../gtk/main.c:1353 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1505 +#: ../gtk/main.c:1516 msgid "Website link" msgstr "İnternet " -#: ../gtk/main.c:1554 +#: ../gtk/main.c:1565 msgid "Linphone - a video internet phone" msgstr "Linphone - görüntülü internet telefonu" -#: ../gtk/main.c:1646 +#: ../gtk/main.c:1657 #, c-format msgid "%s (Default)" msgstr "" -#: ../gtk/main.c:1978 ../coreapi/callbacks.c:1057 +#: ../gtk/main.c:1989 ../coreapi/callbacks.c:1057 #, c-format msgid "We are transferred to %s" msgstr "" -#: ../gtk/main.c:1988 +#: ../gtk/main.c:1999 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." msgstr "" -#: ../gtk/main.c:2136 +#: ../gtk/main.c:2147 msgid "A free SIP video-phone" -msgstr "" +msgstr "Özgür bir SİP görüntülü-telefon" -#: ../gtk/main.c:2241 +#: ../gtk/main.c:2252 #, c-format msgid "Hello\n" -msgstr "" +msgstr "Merhaba\n" #: ../gtk/friendlist.c:505 msgid "Add to addressbook" @@ -214,7 +214,7 @@ msgstr "Adres defterine ekle" #: ../gtk/friendlist.c:691 msgid "Presence status" -msgstr "" +msgstr "durum bilgisi" #: ../gtk/friendlist.c:709 ../gtk/propertybox.c:552 ../gtk/contact.ui.h:1 msgid "Name" @@ -259,7 +259,7 @@ msgstr "" #: ../gtk/propertybox.c:558 msgid "Rate (Hz)" -msgstr "" +msgstr "Hız (Hz)" #: ../gtk/propertybox.c:564 msgid "Status" @@ -267,7 +267,7 @@ msgstr "Durum" #: ../gtk/propertybox.c:570 msgid "IP Bitrate (kbit/s)" -msgstr "" +msgstr "İP Bit hızı (kbit/s)" #: ../gtk/propertybox.c:577 msgid "Parameters" @@ -277,7 +277,7 @@ msgstr "Değişkenler" msgid "Enabled" msgstr "Etkin" -#: ../gtk/propertybox.c:622 ../gtk/propertybox.c:763 ../gtk/parameters.ui.h:17 +#: ../gtk/propertybox.c:622 ../gtk/propertybox.c:763 ../gtk/parameters.ui.h:20 msgid "Disabled" msgstr "Devre dışı" @@ -442,7 +442,7 @@ msgstr "" msgid "Enter your linphone.org username" msgstr "linphone.org kullanıcı adınızı girin" -#: ../gtk/setupwizard.c:102 ../gtk/parameters.ui.h:81 ../gtk/ldap.ui.h:4 +#: ../gtk/setupwizard.c:102 ../gtk/parameters.ui.h:85 ../gtk/ldap.ui.h:4 msgid "Username:" msgstr "Kullanıcı adı:" @@ -508,7 +508,7 @@ msgstr "Teşekkürler. Hesabınız yapılandırıldı ve kullanıma hazır." msgid "" "Please validate your account by clicking on the link we just sent you by email.\n" "Then come back here and press Next button." -msgstr "" +msgstr "Lütfen size e-posta yoluyla gönderdiğimiz bağlantıyı tıklayarak hesabınızı doğrulayın.\nSonra buraya geri dönün ve İleri düğmesine basın." #: ../gtk/setupwizard.c:602 msgid "SIP account configuration assistant" @@ -570,7 +570,7 @@ msgstr "ICE başarısız" #: ../gtk/incall_view.c:225 msgid "ICE in progress" -msgstr "" +msgstr "ICE sürüyor" #: ../gtk/incall_view.c:227 msgid "Going through one or more NATs" @@ -627,7 +627,7 @@ msgstr "" #: ../gtk/incall_view.c:407 ../gtk/main.ui.h:12 ../gtk/videowindow.c:235 msgid "Hang up" -msgstr "" +msgstr "Telefonu kapatma" #: ../gtk/incall_view.c:511 msgid "Calling..." @@ -667,11 +667,11 @@ msgstr "kullanılamaz" #: ../gtk/incall_view.c:679 msgid "Secured by SRTP" -msgstr "" +msgstr "SRTP güvencesi altında" #: ../gtk/incall_view.c:685 msgid "Secured by DTLS" -msgstr "" +msgstr "DLTS güvencesi altında" #: ../gtk/incall_view.c:691 #, c-format @@ -704,15 +704,15 @@ msgstr "" #: ../gtk/incall_view.c:831 msgid "Transfer in progress" -msgstr "" +msgstr "Aktarım sürüyor" #: ../gtk/incall_view.c:834 msgid "Transfer done." -msgstr "" +msgstr "Aktarım tamam" #: ../gtk/incall_view.c:837 msgid "Transfer failed." -msgstr "" +msgstr "Aktarım başarısız" #: ../gtk/incall_view.c:881 msgid "Resume" @@ -766,7 +766,7 @@ msgstr "Çok yüksek" #: ../gtk/audio_assistant.c:183 msgid "Did you hear three beeps ?" -msgstr "" +msgstr "Üç bip sesi duydun mu?" #: ../gtk/audio_assistant.c:292 ../gtk/audio_assistant.c:297 msgid "Sound preferences not found " @@ -804,7 +804,7 @@ msgstr "Oynatma aygıtı" #: ../gtk/audio_assistant.c:370 msgid "Play three beeps" -msgstr "" +msgstr "Üç bip sesi çal" #: ../gtk/audio_assistant.c:403 msgid "Press the record button and say some words" @@ -812,15 +812,15 @@ msgstr "Kayıt tuşuna bas ve bazı kelimeler söyle" #: ../gtk/audio_assistant.c:404 msgid "Listen to your record voice" -msgstr "" +msgstr "Kaydettiğin sesi dinle" #: ../gtk/audio_assistant.c:405 msgid "Record" -msgstr "" +msgstr "Kayıt" #: ../gtk/audio_assistant.c:406 msgid "Play" -msgstr "" +msgstr "Çalma" #: ../gtk/audio_assistant.c:433 msgid "Let's start Linphone now" @@ -864,7 +864,7 @@ msgstr "" #: ../gtk/main.ui.h:8 msgid "Video" -msgstr "" +msgstr "Görüntü" #: ../gtk/main.ui.h:10 msgid "Mute" @@ -872,7 +872,7 @@ msgstr "Sessiz" #: ../gtk/main.ui.h:11 msgid "Transfer" -msgstr "" +msgstr "Aktarım" #: ../gtk/main.ui.h:14 msgid "In call" @@ -956,7 +956,7 @@ msgstr "Yeni bir arama başlat" #: ../gtk/main.ui.h:35 msgid "Contacts" -msgstr "" +msgstr "Bağlantılar" #: ../gtk/main.ui.h:36 msgid "Search" @@ -1004,7 +1004,7 @@ msgstr "" #: ../gtk/main.ui.h:47 msgid "Welcome!" -msgstr "" +msgstr "Hoşgeldiniz!" #: ../gtk/about.ui.h:1 msgid "About Linphone" @@ -1012,11 +1012,11 @@ msgstr "Linphone Hakkında" #: ../gtk/about.ui.h:2 msgid "(C) Belledonne Communications, 2010\n" -msgstr "" +msgstr "(C) Belledonne Communications, 2010\n\n" #: ../gtk/about.ui.h:4 msgid "An internet video phone using the standard SIP (rfc3261) protocol." -msgstr "" +msgstr "Standart SİP (rfc3261) protokolü kullanan görüntülü internet telefonu." #: ../gtk/about.ui.h:5 msgid "" @@ -1048,7 +1048,7 @@ msgstr "" #: ../gtk/contact.ui.h:5 msgid "Contact information" -msgstr "" +msgstr "Bağlantı bilgisi" #: ../gtk/log.ui.h:1 msgid "Linphone debug window" @@ -1080,7 +1080,7 @@ msgstr "Geri arama" #: ../gtk/sip_account.ui.h:1 msgid "Linphone - Configure a SIP account" -msgstr "" +msgstr "Linphone - Bir SİP hesabı yapılandır" #: ../gtk/sip_account.ui.h:2 msgid "Your SIP identity:" @@ -1120,7 +1120,7 @@ msgstr "" #: ../gtk/sip_account.ui.h:11 msgid "Transport" -msgstr "" +msgstr "Taşıma" #: ../gtk/sip_account.ui.h:12 msgid "Register" @@ -1132,11 +1132,11 @@ msgstr "" #: ../gtk/sip_account.ui.h:14 msgid "Enable AVPF" -msgstr "" +msgstr "AVPF'yi etkinleştir" #: ../gtk/sip_account.ui.h:15 msgid "Configure a SIP account" -msgstr "" +msgstr "Bir SİP hesabı yapılandır" #: ../gtk/parameters.ui.h:1 msgid "anonymous" @@ -1156,7 +1156,7 @@ msgstr "öntanımlı ses kartı" #: ../gtk/parameters.ui.h:5 msgid "a sound card" -msgstr "" +msgstr "Ses kartı" #: ../gtk/parameters.ui.h:6 msgid "default camera" @@ -1179,307 +1179,311 @@ msgid "C" msgstr "C" #: ../gtk/parameters.ui.h:11 +msgid "SIP (UDP)" +msgstr "SIP (UDP)" + +#: ../gtk/parameters.ui.h:12 +msgid "SIP (TCP)" +msgstr "SIP (TCP)" + +#: ../gtk/parameters.ui.h:13 +msgid "SIP (TLS)" +msgstr "SIP (TLS)" + +#: ../gtk/parameters.ui.h:14 msgid "Settings" msgstr "Ayarlar" -#: ../gtk/parameters.ui.h:12 +#: ../gtk/parameters.ui.h:15 msgid "Set Maximum Transmission Unit:" msgstr "" -#: ../gtk/parameters.ui.h:13 +#: ../gtk/parameters.ui.h:16 msgid "Send DTMFs as SIP info" msgstr "" -#: ../gtk/parameters.ui.h:14 +#: ../gtk/parameters.ui.h:17 msgid "Allow IPv6" msgstr "" -#: ../gtk/parameters.ui.h:15 +#: ../gtk/parameters.ui.h:18 msgid "Transport" msgstr "" -#: ../gtk/parameters.ui.h:16 +#: ../gtk/parameters.ui.h:19 msgid "SIP/UDP port" msgstr "SIP/UDP bağlantı noktası" -#: ../gtk/parameters.ui.h:18 +#: ../gtk/parameters.ui.h:21 msgid "Random" msgstr "Rastgele" -#: ../gtk/parameters.ui.h:19 +#: ../gtk/parameters.ui.h:22 msgid "SIP/TCP port" msgstr "SIP/TCP bağlantı noktası" -#: ../gtk/parameters.ui.h:20 +#: ../gtk/parameters.ui.h:23 msgid "Audio RTP/UDP:" msgstr "" -#: ../gtk/parameters.ui.h:21 +#: ../gtk/parameters.ui.h:24 msgid "Fixed" msgstr "Sabitlenmiş" -#: ../gtk/parameters.ui.h:22 +#: ../gtk/parameters.ui.h:25 msgid "Video RTP/UDP:" msgstr "" -#: ../gtk/parameters.ui.h:23 +#: ../gtk/parameters.ui.h:26 msgid "Media encryption type" msgstr "Ortam şifreleme türü" -#: ../gtk/parameters.ui.h:24 +#: ../gtk/parameters.ui.h:27 msgid "Media encryption is mandatory" msgstr "Ortam şifrelemesi zorunludur" -#: ../gtk/parameters.ui.h:25 +#: ../gtk/parameters.ui.h:28 msgid "Tunnel" msgstr "Tünel" -#: ../gtk/parameters.ui.h:26 +#: ../gtk/parameters.ui.h:29 msgid "DSCP fields" msgstr "" -#: ../gtk/parameters.ui.h:27 +#: ../gtk/parameters.ui.h:30 msgid "Network protocol and ports" msgstr "" -#: ../gtk/parameters.ui.h:28 +#: ../gtk/parameters.ui.h:31 msgid "Direct connection to the Internet" msgstr "İnternete doğrudan bağlantı" -#: ../gtk/parameters.ui.h:29 +#: ../gtk/parameters.ui.h:32 msgid "Behind NAT / Firewall (specify gateway IP )" msgstr "" -#: ../gtk/parameters.ui.h:30 +#: ../gtk/parameters.ui.h:33 msgid "Behind NAT / Firewall (use STUN to resolve)" msgstr "" -#: ../gtk/parameters.ui.h:31 +#: ../gtk/parameters.ui.h:34 msgid "Behind NAT / Firewall (use ICE)" msgstr "" -#: ../gtk/parameters.ui.h:32 +#: ../gtk/parameters.ui.h:35 msgid "Behind NAT / Firewall (use uPnP)" msgstr "" -#: ../gtk/parameters.ui.h:33 +#: ../gtk/parameters.ui.h:36 msgid "Public IP address:" msgstr "Ortak İP adresi:" -#: ../gtk/parameters.ui.h:34 +#: ../gtk/parameters.ui.h:37 msgid "Stun server:" msgstr "Stun sunucusu:" -#: ../gtk/parameters.ui.h:35 +#: ../gtk/parameters.ui.h:38 msgid "NAT and Firewall" msgstr "" -#: ../gtk/parameters.ui.h:36 +#: ../gtk/parameters.ui.h:39 msgid "Network settings" msgstr "Ağ ayarları" -#: ../gtk/parameters.ui.h:37 +#: ../gtk/parameters.ui.h:40 msgid "Ring sound:" msgstr "Zil sesi:" -#: ../gtk/parameters.ui.h:38 +#: ../gtk/parameters.ui.h:41 msgid "ALSA special device (optional):" -msgstr "" +msgstr "ALSA özel aygıt (seçmeli)" -#: ../gtk/parameters.ui.h:39 +#: ../gtk/parameters.ui.h:42 msgid "Capture device:" msgstr "Görüntü yakalama aygıtı" -#: ../gtk/parameters.ui.h:40 +#: ../gtk/parameters.ui.h:43 msgid "Ring device:" msgstr "Ses çalma aygıtı:" -#: ../gtk/parameters.ui.h:41 +#: ../gtk/parameters.ui.h:44 msgid "Playback device:" msgstr "Oynatma aygıtı:" -#: ../gtk/parameters.ui.h:42 +#: ../gtk/parameters.ui.h:45 msgid "Enable echo cancellation" msgstr "" -#: ../gtk/parameters.ui.h:43 +#: ../gtk/parameters.ui.h:46 msgid "Audio" -msgstr "" +msgstr "Ses" -#: ../gtk/parameters.ui.h:44 +#: ../gtk/parameters.ui.h:47 msgid "Video input device:" msgstr "Görüntü aygıtı:" -#: ../gtk/parameters.ui.h:45 +#: ../gtk/parameters.ui.h:48 msgid "Prefered video resolution:" msgstr "Tercih edilen görüntü çözünürlüğü:" -#: ../gtk/parameters.ui.h:46 +#: ../gtk/parameters.ui.h:49 msgid "Video output method:" msgstr "Görüntü çıkış yöntemi:" -#: ../gtk/parameters.ui.h:47 +#: ../gtk/parameters.ui.h:50 msgid "Show camera preview" msgstr "Kamera önizlemesi göster" -#: ../gtk/parameters.ui.h:48 +#: ../gtk/parameters.ui.h:51 msgid "Video" -msgstr "" +msgstr "Görüntü" -#: ../gtk/parameters.ui.h:49 +#: ../gtk/parameters.ui.h:52 msgid "Multimedia settings" msgstr "Çokluortam ayarları" -#: ../gtk/parameters.ui.h:50 +#: ../gtk/parameters.ui.h:53 msgid "This section defines your SIP address when not using a SIP account" msgstr "" -#: ../gtk/parameters.ui.h:51 +#: ../gtk/parameters.ui.h:54 msgid "Your display name (eg: John Doe):" -msgstr "" +msgstr "Görünecek adınız (örneğin: Faradunda Marti)" -#: ../gtk/parameters.ui.h:52 +#: ../gtk/parameters.ui.h:55 msgid "Your username:" msgstr "Kullanıcı adınız:" -#: ../gtk/parameters.ui.h:53 +#: ../gtk/parameters.ui.h:56 msgid "Your resulting SIP address:" msgstr "" -#: ../gtk/parameters.ui.h:54 +#: ../gtk/parameters.ui.h:57 msgid "Default identity" -msgstr "" +msgstr "Öntanımlı kimlik" -#: ../gtk/parameters.ui.h:55 +#: ../gtk/parameters.ui.h:58 msgid "Wizard" msgstr "Yardımcı" -#: ../gtk/parameters.ui.h:56 +#: ../gtk/parameters.ui.h:59 msgid "Add" msgstr "Ekle" -#: ../gtk/parameters.ui.h:57 +#: ../gtk/parameters.ui.h:60 msgid "Edit" msgstr "Düzenle" -#: ../gtk/parameters.ui.h:58 +#: ../gtk/parameters.ui.h:61 msgid "Remove" msgstr "Kaldır" -#: ../gtk/parameters.ui.h:59 +#: ../gtk/parameters.ui.h:62 msgid "Proxy accounts" msgstr "" -#: ../gtk/parameters.ui.h:60 +#: ../gtk/parameters.ui.h:63 msgid "Erase all passwords" msgstr "Bütün parolaları sil" -#: ../gtk/parameters.ui.h:61 +#: ../gtk/parameters.ui.h:64 msgid "Privacy" -msgstr "" +msgstr "Gizlilik" -#: ../gtk/parameters.ui.h:62 +#: ../gtk/parameters.ui.h:65 msgid "Automatically answer when a call is received" msgstr "" -#: ../gtk/parameters.ui.h:63 -msgid "Auto-answer" +#: ../gtk/parameters.ui.h:66 +msgid "Delay before answering (ms)" msgstr "" -#: ../gtk/parameters.ui.h:64 +#: ../gtk/parameters.ui.h:67 +msgid "Auto-answer" +msgstr "Otomatik yanıt" + +#: ../gtk/parameters.ui.h:68 msgid "Manage SIP Accounts" msgstr "SİP Hesaplarını Yönet" -#: ../gtk/parameters.ui.h:65 ../gtk/tunnel_config.ui.h:4 +#: ../gtk/parameters.ui.h:69 ../gtk/tunnel_config.ui.h:4 msgid "Enable" msgstr "Etkinleştirme" -#: ../gtk/parameters.ui.h:66 ../gtk/tunnel_config.ui.h:5 +#: ../gtk/parameters.ui.h:70 ../gtk/tunnel_config.ui.h:5 msgid "Disable" msgstr "Devre dışı" -#: ../gtk/parameters.ui.h:67 +#: ../gtk/parameters.ui.h:71 msgid "Codecs" -msgstr "" +msgstr "Çözücüler" -#: ../gtk/parameters.ui.h:68 +#: ../gtk/parameters.ui.h:72 msgid "0 stands for \"unlimited\"" msgstr "" -#: ../gtk/parameters.ui.h:69 +#: ../gtk/parameters.ui.h:73 msgid "Upload speed limit in Kbit/sec:" msgstr "Gönderim hız sınırı Kbit/saniye:" -#: ../gtk/parameters.ui.h:70 +#: ../gtk/parameters.ui.h:74 msgid "Download speed limit in Kbit/sec:" msgstr "İndirme hız sınırı Kbit/saniye:" -#: ../gtk/parameters.ui.h:71 +#: ../gtk/parameters.ui.h:75 msgid "Enable adaptive rate control" msgstr "" -#: ../gtk/parameters.ui.h:72 +#: ../gtk/parameters.ui.h:76 msgid "" "Adaptive rate control is a technique to dynamically guess the available " "bandwidth during a call." msgstr "" -#: ../gtk/parameters.ui.h:73 +#: ../gtk/parameters.ui.h:77 msgid "Bandwidth control" -msgstr "" +msgstr "Bantgenişliği denetimi" -#: ../gtk/parameters.ui.h:74 +#: ../gtk/parameters.ui.h:78 msgid "Codecs" msgstr "Çözücüler" -#: ../gtk/parameters.ui.h:75 +#: ../gtk/parameters.ui.h:79 msgid "Language" -msgstr "" +msgstr "Dil" -#: ../gtk/parameters.ui.h:76 +#: ../gtk/parameters.ui.h:80 msgid "Show advanced settings" msgstr "Gelişmiş ayarları göster" -#: ../gtk/parameters.ui.h:77 +#: ../gtk/parameters.ui.h:81 msgid "Level" -msgstr "" +msgstr "Aşama" -#: ../gtk/parameters.ui.h:78 +#: ../gtk/parameters.ui.h:82 msgid "User interface" msgstr "Kullanıcı arayüzü" -#: ../gtk/parameters.ui.h:79 ../gtk/ldap.ui.h:2 +#: ../gtk/parameters.ui.h:83 ../gtk/ldap.ui.h:2 msgid "Server address:" msgstr "Sunucu adresi:" -#: ../gtk/parameters.ui.h:80 ../gtk/ldap.ui.h:3 +#: ../gtk/parameters.ui.h:84 ../gtk/ldap.ui.h:3 msgid "Authentication method:" msgstr "Kimlik doğrulama yöntemi:" -#: ../gtk/parameters.ui.h:82 +#: ../gtk/parameters.ui.h:86 msgid "LDAP Account setup" -msgstr "" +msgstr "LDAP Hesap ayarı" -#: ../gtk/parameters.ui.h:83 +#: ../gtk/parameters.ui.h:87 msgid "LDAP" msgstr "LDAP" -#: ../gtk/parameters.ui.h:84 +#: ../gtk/parameters.ui.h:88 msgid "Done" msgstr "Tamam" -#: ../gtk/parameters.ui.h:85 -msgid "SIP (UDP)" -msgstr "SIP (UDP)" - -#: ../gtk/parameters.ui.h:86 -msgid "SIP (TCP)" -msgstr "SIP (TCP)" - -#: ../gtk/parameters.ui.h:87 -msgid "SIP (TLS)" -msgstr "SIP (TLS)" - #: ../gtk/buddylookup.ui.h:1 msgid "Search contacts in directory" msgstr "" @@ -1538,7 +1542,7 @@ msgstr "" #: ../gtk/call_statistics.ui.h:5 msgid "Audio Media connectivity" -msgstr "" +msgstr "Ses Ortamı bağlanırlığı" #: ../gtk/call_statistics.ui.h:6 msgid "Video IP bandwidth usage" @@ -1546,11 +1550,11 @@ msgstr "" #: ../gtk/call_statistics.ui.h:7 msgid "Video Media connectivity" -msgstr "" +msgstr "Görüntü Ortamı bağlanırlığı" #: ../gtk/call_statistics.ui.h:8 msgid "Round trip time" -msgstr "" +msgstr "Sinyal gidiş-dönüş süresi" #: ../gtk/call_statistics.ui.h:9 msgid "Video resolution received" @@ -1695,60 +1699,60 @@ msgstr "Yapılandırılıyor..." msgid "Please wait while fetching configuration from server..." msgstr "" -#: ../coreapi/linphonecore.c:1534 +#: ../coreapi/linphonecore.c:1538 msgid "Ready" msgstr "Hazır" -#: ../coreapi/linphonecore.c:2534 +#: ../coreapi/linphonecore.c:2550 msgid "Configuring" msgstr "Yapılandırılıyor" -#: ../coreapi/linphonecore.c:2708 +#: ../coreapi/linphonecore.c:2724 msgid "Looking for telephone number destination..." msgstr "" -#: ../coreapi/linphonecore.c:2710 +#: ../coreapi/linphonecore.c:2726 msgid "Could not resolve this number." msgstr "" #. must be known at that time -#: ../coreapi/linphonecore.c:2996 +#: ../coreapi/linphonecore.c:3012 msgid "Contacting" msgstr "Bağlanıyor" -#: ../coreapi/linphonecore.c:3001 +#: ../coreapi/linphonecore.c:3017 msgid "Could not call" msgstr "" -#: ../coreapi/linphonecore.c:3152 +#: ../coreapi/linphonecore.c:3168 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "" -#: ../coreapi/linphonecore.c:3310 +#: ../coreapi/linphonecore.c:3326 msgid "is contacting you" msgstr "" -#: ../coreapi/linphonecore.c:3311 +#: ../coreapi/linphonecore.c:3327 msgid " and asked autoanswer." msgstr "" -#: ../coreapi/linphonecore.c:3435 +#: ../coreapi/linphonecore.c:3451 msgid "Modifying call parameters..." msgstr "" -#: ../coreapi/linphonecore.c:3782 +#: ../coreapi/linphonecore.c:3798 msgid "Connected." msgstr "Bağlandı." -#: ../coreapi/linphonecore.c:3807 +#: ../coreapi/linphonecore.c:3823 msgid "Call aborted" msgstr "Çağrı iptal edildi" -#: ../coreapi/linphonecore.c:3997 +#: ../coreapi/linphonecore.c:4013 msgid "Could not pause the call" msgstr "" -#: ../coreapi/linphonecore.c:4000 +#: ../coreapi/linphonecore.c:4016 msgid "Pausing the current call..." msgstr "" @@ -1770,7 +1774,7 @@ msgstr "Meşgul" #: ../coreapi/friend.c:39 msgid "Be right back" -msgstr "" +msgstr "Hemen döneceğim" #: ../coreapi/friend.c:42 msgid "Away" @@ -1786,7 +1790,7 @@ msgstr "Yemekteyim" #: ../coreapi/friend.c:51 msgid "Do not disturb" -msgstr "" +msgstr "Rahatsız etmeyin" #: ../coreapi/friend.c:54 msgid "Moved" @@ -1794,7 +1798,7 @@ msgstr "Taşındı" #: ../coreapi/friend.c:57 msgid "Using another messaging service" -msgstr "" +msgstr "Diğer mesaj servisi kullanılıyor" #: ../coreapi/friend.c:60 msgid "Offline" @@ -1897,7 +1901,7 @@ msgstr "" #. char *retrymsg=_("%s. Retry after %i minute(s)."); #: ../coreapi/callbacks.c:807 msgid "User does not want to be disturbed." -msgstr "" +msgstr "Kullanıcı rahatsız edilmek istemiyor." #: ../coreapi/callbacks.c:808 msgid "Call declined." @@ -1936,7 +1940,7 @@ msgstr "" #: ../coreapi/callbacks.c:1016 msgid "Service unavailable, retrying" -msgstr "" +msgstr "Servis kullanımdışı, tekrar deneyin" #. if encryption is DTLS, no status to be displayed #: ../coreapi/linphonecall.c:180 @@ -1944,11 +1948,11 @@ msgstr "" msgid "Authentication token is %s" msgstr "" -#: ../coreapi/linphonecall.c:1305 +#: ../coreapi/linphonecall.c:1306 msgid "Call parameters were successfully modified." msgstr "" -#: ../coreapi/linphonecall.c:3659 +#: ../coreapi/linphonecall.c:3660 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." @@ -1969,7 +1973,7 @@ msgstr "Yanıtsız" #: ../coreapi/call_log.c:218 msgid "unknown" -msgstr "" +msgstr "bilinmeyen" #: ../coreapi/call_log.c:220 #, c-format diff --git a/po/zh_CN.po b/po/zh_CN.po index 2dfc0f91a..9febd0d72 100644 --- a/po/zh_CN.po +++ b/po/zh_CN.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: linphone-gtk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-27 14:40+0100\n" -"PO-Revision-Date: 2015-03-27 13:40+0000\n" +"POT-Creation-Date: 2015-04-01 16:25+0200\n" +"PO-Revision-Date: 2015-04-01 14:26+0000\n" "Last-Translator: Belledonne Communications \n" "Language-Team: Chinese (China) (http://www.transifex.com/projects/p/linphone-gtk/language/zh_CN/)\n" "MIME-Version: 1.0\n" @@ -123,7 +123,7 @@ msgstr "" msgid "Run self test and exit 0 if succeed" msgstr "" -#: ../gtk/main.c:1059 +#: ../gtk/main.c:1069 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -131,76 +131,76 @@ msgid "" "If you answer no, this person will be temporarily blacklisted." msgstr "%s 想加您为联系人。\n您是否允许他看到您的在线状态或者将它加为您的联系人允许?\n如果您回答否,则会将该人临时性的放入黑名单" -#: ../gtk/main.c:1136 +#: ../gtk/main.c:1146 #, c-format msgid "" "Please enter your password for username %s\n" " at realm %s:" msgstr "" -#: ../gtk/main.c:1257 +#: ../gtk/main.c:1267 msgid "Call error" msgstr "" -#: ../gtk/main.c:1260 ../coreapi/linphonecore.c:3826 +#: ../gtk/main.c:1270 ../coreapi/linphonecore.c:3842 msgid "Call ended" msgstr "呼叫结束" -#: ../gtk/main.c:1263 ../coreapi/call_log.c:221 +#: ../gtk/main.c:1273 ../coreapi/call_log.c:221 msgid "Incoming call" msgstr "呼入" -#: ../gtk/main.c:1265 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 +#: ../gtk/main.c:1275 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 msgid "Answer" msgstr "" -#: ../gtk/main.c:1267 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1277 ../gtk/main.ui.h:6 msgid "Decline" msgstr "拒绝" -#: ../gtk/main.c:1273 +#: ../gtk/main.c:1283 msgid "Call paused" msgstr "" -#: ../gtk/main.c:1273 +#: ../gtk/main.c:1283 #, c-format msgid "by %s" msgstr "" -#: ../gtk/main.c:1343 +#: ../gtk/main.c:1353 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1505 +#: ../gtk/main.c:1516 msgid "Website link" msgstr "网站" -#: ../gtk/main.c:1554 +#: ../gtk/main.c:1565 msgid "Linphone - a video internet phone" msgstr "Linphone - 互联网视频电话" -#: ../gtk/main.c:1646 +#: ../gtk/main.c:1657 #, c-format msgid "%s (Default)" msgstr "%s (默认)" -#: ../gtk/main.c:1978 ../coreapi/callbacks.c:1057 +#: ../gtk/main.c:1989 ../coreapi/callbacks.c:1057 #, c-format msgid "We are transferred to %s" msgstr "" -#: ../gtk/main.c:1988 +#: ../gtk/main.c:1999 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." msgstr "未在此计算机上检测到声卡。\n您无法发送或接收音频呼叫。" -#: ../gtk/main.c:2136 +#: ../gtk/main.c:2147 msgid "A free SIP video-phone" msgstr "免费的 SIP 视频电话" -#: ../gtk/main.c:2241 +#: ../gtk/main.c:2252 #, c-format msgid "Hello\n" msgstr "" @@ -274,7 +274,7 @@ msgstr "参数" msgid "Enabled" msgstr "启用" -#: ../gtk/propertybox.c:622 ../gtk/propertybox.c:763 ../gtk/parameters.ui.h:17 +#: ../gtk/propertybox.c:622 ../gtk/propertybox.c:763 ../gtk/parameters.ui.h:20 msgid "Disabled" msgstr "禁用" @@ -438,7 +438,7 @@ msgstr "" msgid "Enter your linphone.org username" msgstr "" -#: ../gtk/setupwizard.c:102 ../gtk/parameters.ui.h:81 ../gtk/ldap.ui.h:4 +#: ../gtk/setupwizard.c:102 ../gtk/parameters.ui.h:85 ../gtk/ldap.ui.h:4 msgid "Username:" msgstr "用户名:" @@ -1175,307 +1175,311 @@ msgid "C" msgstr "C" #: ../gtk/parameters.ui.h:11 +msgid "SIP (UDP)" +msgstr "" + +#: ../gtk/parameters.ui.h:12 +msgid "SIP (TCP)" +msgstr "" + +#: ../gtk/parameters.ui.h:13 +msgid "SIP (TLS)" +msgstr "" + +#: ../gtk/parameters.ui.h:14 msgid "Settings" msgstr "设置" -#: ../gtk/parameters.ui.h:12 +#: ../gtk/parameters.ui.h:15 msgid "Set Maximum Transmission Unit:" msgstr "设置最大传输单元(MTU):" -#: ../gtk/parameters.ui.h:13 +#: ../gtk/parameters.ui.h:16 msgid "Send DTMFs as SIP info" msgstr "以 SIP 消息发送 DTMF" -#: ../gtk/parameters.ui.h:14 +#: ../gtk/parameters.ui.h:17 msgid "Allow IPv6" msgstr "" -#: ../gtk/parameters.ui.h:15 +#: ../gtk/parameters.ui.h:18 msgid "Transport" msgstr "传输协议" -#: ../gtk/parameters.ui.h:16 +#: ../gtk/parameters.ui.h:19 msgid "SIP/UDP port" msgstr "" -#: ../gtk/parameters.ui.h:18 +#: ../gtk/parameters.ui.h:21 msgid "Random" msgstr "" -#: ../gtk/parameters.ui.h:19 +#: ../gtk/parameters.ui.h:22 msgid "SIP/TCP port" msgstr "" -#: ../gtk/parameters.ui.h:20 +#: ../gtk/parameters.ui.h:23 msgid "Audio RTP/UDP:" msgstr "音频 RTP/UDP:" -#: ../gtk/parameters.ui.h:21 +#: ../gtk/parameters.ui.h:24 msgid "Fixed" msgstr "" -#: ../gtk/parameters.ui.h:22 +#: ../gtk/parameters.ui.h:25 msgid "Video RTP/UDP:" msgstr "视频 RTP/UDP:" -#: ../gtk/parameters.ui.h:23 +#: ../gtk/parameters.ui.h:26 msgid "Media encryption type" msgstr "" -#: ../gtk/parameters.ui.h:24 +#: ../gtk/parameters.ui.h:27 msgid "Media encryption is mandatory" msgstr "" -#: ../gtk/parameters.ui.h:25 +#: ../gtk/parameters.ui.h:28 msgid "Tunnel" msgstr "" -#: ../gtk/parameters.ui.h:26 +#: ../gtk/parameters.ui.h:29 msgid "DSCP fields" msgstr "" -#: ../gtk/parameters.ui.h:27 +#: ../gtk/parameters.ui.h:30 msgid "Network protocol and ports" msgstr "" -#: ../gtk/parameters.ui.h:28 +#: ../gtk/parameters.ui.h:31 msgid "Direct connection to the Internet" msgstr "直接连接到互联网" -#: ../gtk/parameters.ui.h:29 +#: ../gtk/parameters.ui.h:32 msgid "Behind NAT / Firewall (specify gateway IP )" msgstr "" -#: ../gtk/parameters.ui.h:30 +#: ../gtk/parameters.ui.h:33 msgid "Behind NAT / Firewall (use STUN to resolve)" msgstr "在 NAT 或防火墙后(使用 STUN 解决)" -#: ../gtk/parameters.ui.h:31 +#: ../gtk/parameters.ui.h:34 msgid "Behind NAT / Firewall (use ICE)" msgstr "" -#: ../gtk/parameters.ui.h:32 +#: ../gtk/parameters.ui.h:35 msgid "Behind NAT / Firewall (use uPnP)" msgstr "" -#: ../gtk/parameters.ui.h:33 +#: ../gtk/parameters.ui.h:36 msgid "Public IP address:" msgstr "公网 IP 地址:" -#: ../gtk/parameters.ui.h:34 +#: ../gtk/parameters.ui.h:37 msgid "Stun server:" msgstr "Stun 服务器:" -#: ../gtk/parameters.ui.h:35 +#: ../gtk/parameters.ui.h:38 msgid "NAT and Firewall" msgstr "NAT 及防火墙" -#: ../gtk/parameters.ui.h:36 +#: ../gtk/parameters.ui.h:39 msgid "Network settings" msgstr "网络设置" -#: ../gtk/parameters.ui.h:37 +#: ../gtk/parameters.ui.h:40 msgid "Ring sound:" msgstr "铃声文件:" -#: ../gtk/parameters.ui.h:38 +#: ../gtk/parameters.ui.h:41 msgid "ALSA special device (optional):" msgstr "ALSA 特殊设备(可选):" -#: ../gtk/parameters.ui.h:39 +#: ../gtk/parameters.ui.h:42 msgid "Capture device:" msgstr "录音设备:" -#: ../gtk/parameters.ui.h:40 +#: ../gtk/parameters.ui.h:43 msgid "Ring device:" msgstr "响铃设备:" -#: ../gtk/parameters.ui.h:41 +#: ../gtk/parameters.ui.h:44 msgid "Playback device:" msgstr "回放设备:" -#: ../gtk/parameters.ui.h:42 +#: ../gtk/parameters.ui.h:45 msgid "Enable echo cancellation" msgstr "启用回声抑制" -#: ../gtk/parameters.ui.h:43 +#: ../gtk/parameters.ui.h:46 msgid "Audio" msgstr "音频" -#: ../gtk/parameters.ui.h:44 +#: ../gtk/parameters.ui.h:47 msgid "Video input device:" msgstr "视频输入设备:" -#: ../gtk/parameters.ui.h:45 +#: ../gtk/parameters.ui.h:48 msgid "Prefered video resolution:" msgstr "视频分辨率:" -#: ../gtk/parameters.ui.h:46 +#: ../gtk/parameters.ui.h:49 msgid "Video output method:" msgstr "" -#: ../gtk/parameters.ui.h:47 +#: ../gtk/parameters.ui.h:50 msgid "Show camera preview" msgstr "" -#: ../gtk/parameters.ui.h:48 +#: ../gtk/parameters.ui.h:51 msgid "Video" msgstr "视频" -#: ../gtk/parameters.ui.h:49 +#: ../gtk/parameters.ui.h:52 msgid "Multimedia settings" msgstr "音视频设置" -#: ../gtk/parameters.ui.h:50 +#: ../gtk/parameters.ui.h:53 msgid "This section defines your SIP address when not using a SIP account" msgstr "该段在您不使用SIP帐户时的SIP地址" -#: ../gtk/parameters.ui.h:51 +#: ../gtk/parameters.ui.h:54 msgid "Your display name (eg: John Doe):" msgstr "您的显示名:" -#: ../gtk/parameters.ui.h:52 +#: ../gtk/parameters.ui.h:55 msgid "Your username:" msgstr "您的用户名:" -#: ../gtk/parameters.ui.h:53 +#: ../gtk/parameters.ui.h:56 msgid "Your resulting SIP address:" msgstr "您的 SIP 地址结果:" -#: ../gtk/parameters.ui.h:54 +#: ../gtk/parameters.ui.h:57 msgid "Default identity" msgstr "默认帐户" -#: ../gtk/parameters.ui.h:55 +#: ../gtk/parameters.ui.h:58 msgid "Wizard" msgstr "" -#: ../gtk/parameters.ui.h:56 +#: ../gtk/parameters.ui.h:59 msgid "Add" msgstr "添加" -#: ../gtk/parameters.ui.h:57 +#: ../gtk/parameters.ui.h:60 msgid "Edit" msgstr "编辑" -#: ../gtk/parameters.ui.h:58 +#: ../gtk/parameters.ui.h:61 msgid "Remove" msgstr "移除" -#: ../gtk/parameters.ui.h:59 +#: ../gtk/parameters.ui.h:62 msgid "Proxy accounts" msgstr "代理帐户" -#: ../gtk/parameters.ui.h:60 +#: ../gtk/parameters.ui.h:63 msgid "Erase all passwords" msgstr "清除所有密码" -#: ../gtk/parameters.ui.h:61 +#: ../gtk/parameters.ui.h:64 msgid "Privacy" msgstr "隐私" -#: ../gtk/parameters.ui.h:62 +#: ../gtk/parameters.ui.h:65 msgid "Automatically answer when a call is received" msgstr "" -#: ../gtk/parameters.ui.h:63 +#: ../gtk/parameters.ui.h:66 +msgid "Delay before answering (ms)" +msgstr "" + +#: ../gtk/parameters.ui.h:67 msgid "Auto-answer" msgstr "" -#: ../gtk/parameters.ui.h:64 +#: ../gtk/parameters.ui.h:68 msgid "Manage SIP Accounts" msgstr "SIP 帐户管理" -#: ../gtk/parameters.ui.h:65 ../gtk/tunnel_config.ui.h:4 +#: ../gtk/parameters.ui.h:69 ../gtk/tunnel_config.ui.h:4 msgid "Enable" msgstr "启用" -#: ../gtk/parameters.ui.h:66 ../gtk/tunnel_config.ui.h:5 +#: ../gtk/parameters.ui.h:70 ../gtk/tunnel_config.ui.h:5 msgid "Disable" msgstr "禁用" -#: ../gtk/parameters.ui.h:67 +#: ../gtk/parameters.ui.h:71 msgid "Codecs" msgstr "编解码器" -#: ../gtk/parameters.ui.h:68 +#: ../gtk/parameters.ui.h:72 msgid "0 stands for \"unlimited\"" msgstr "0 表示 “没有限制”" -#: ../gtk/parameters.ui.h:69 +#: ../gtk/parameters.ui.h:73 msgid "Upload speed limit in Kbit/sec:" msgstr "上传速率限制 kbit/s:" -#: ../gtk/parameters.ui.h:70 +#: ../gtk/parameters.ui.h:74 msgid "Download speed limit in Kbit/sec:" msgstr "下载速率限制 kbit/s:" -#: ../gtk/parameters.ui.h:71 +#: ../gtk/parameters.ui.h:75 msgid "Enable adaptive rate control" msgstr "" -#: ../gtk/parameters.ui.h:72 +#: ../gtk/parameters.ui.h:76 msgid "" "Adaptive rate control is a technique to dynamically guess the available " "bandwidth during a call." msgstr "" -#: ../gtk/parameters.ui.h:73 +#: ../gtk/parameters.ui.h:77 msgid "Bandwidth control" msgstr "带宽控制" -#: ../gtk/parameters.ui.h:74 +#: ../gtk/parameters.ui.h:78 msgid "Codecs" msgstr "编解码器" -#: ../gtk/parameters.ui.h:75 +#: ../gtk/parameters.ui.h:79 msgid "Language" msgstr "语言" -#: ../gtk/parameters.ui.h:76 +#: ../gtk/parameters.ui.h:80 msgid "Show advanced settings" msgstr "显示高级设置" -#: ../gtk/parameters.ui.h:77 +#: ../gtk/parameters.ui.h:81 msgid "Level" msgstr "级别" -#: ../gtk/parameters.ui.h:78 +#: ../gtk/parameters.ui.h:82 msgid "User interface" msgstr "用户界面" -#: ../gtk/parameters.ui.h:79 ../gtk/ldap.ui.h:2 +#: ../gtk/parameters.ui.h:83 ../gtk/ldap.ui.h:2 msgid "Server address:" msgstr "" -#: ../gtk/parameters.ui.h:80 ../gtk/ldap.ui.h:3 +#: ../gtk/parameters.ui.h:84 ../gtk/ldap.ui.h:3 msgid "Authentication method:" msgstr "" -#: ../gtk/parameters.ui.h:82 +#: ../gtk/parameters.ui.h:86 msgid "LDAP Account setup" msgstr "" -#: ../gtk/parameters.ui.h:83 +#: ../gtk/parameters.ui.h:87 msgid "LDAP" msgstr "" -#: ../gtk/parameters.ui.h:84 +#: ../gtk/parameters.ui.h:88 msgid "Done" msgstr "完成" -#: ../gtk/parameters.ui.h:85 -msgid "SIP (UDP)" -msgstr "" - -#: ../gtk/parameters.ui.h:86 -msgid "SIP (TCP)" -msgstr "" - -#: ../gtk/parameters.ui.h:87 -msgid "SIP (TLS)" -msgstr "" - #: ../gtk/buddylookup.ui.h:1 msgid "Search contacts in directory" msgstr "查找联系人" @@ -1691,60 +1695,60 @@ msgstr "" msgid "Please wait while fetching configuration from server..." msgstr "" -#: ../coreapi/linphonecore.c:1534 +#: ../coreapi/linphonecore.c:1538 msgid "Ready" msgstr "就绪" -#: ../coreapi/linphonecore.c:2534 +#: ../coreapi/linphonecore.c:2550 msgid "Configuring" msgstr "" -#: ../coreapi/linphonecore.c:2708 +#: ../coreapi/linphonecore.c:2724 msgid "Looking for telephone number destination..." msgstr "查询电话号码目的地..." -#: ../coreapi/linphonecore.c:2710 +#: ../coreapi/linphonecore.c:2726 msgid "Could not resolve this number." msgstr "该号码无法解析。" #. must be known at that time -#: ../coreapi/linphonecore.c:2996 +#: ../coreapi/linphonecore.c:3012 msgid "Contacting" msgstr "联系中" -#: ../coreapi/linphonecore.c:3001 +#: ../coreapi/linphonecore.c:3017 msgid "Could not call" msgstr "" -#: ../coreapi/linphonecore.c:3152 +#: ../coreapi/linphonecore.c:3168 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "" -#: ../coreapi/linphonecore.c:3310 +#: ../coreapi/linphonecore.c:3326 msgid "is contacting you" msgstr "正在联系您" -#: ../coreapi/linphonecore.c:3311 +#: ../coreapi/linphonecore.c:3327 msgid " and asked autoanswer." msgstr " 并询问了自动回答。" -#: ../coreapi/linphonecore.c:3435 +#: ../coreapi/linphonecore.c:3451 msgid "Modifying call parameters..." msgstr "" -#: ../coreapi/linphonecore.c:3782 +#: ../coreapi/linphonecore.c:3798 msgid "Connected." msgstr "已连接。" -#: ../coreapi/linphonecore.c:3807 +#: ../coreapi/linphonecore.c:3823 msgid "Call aborted" msgstr "" -#: ../coreapi/linphonecore.c:3997 +#: ../coreapi/linphonecore.c:4013 msgid "Could not pause the call" msgstr "" -#: ../coreapi/linphonecore.c:4000 +#: ../coreapi/linphonecore.c:4016 msgid "Pausing the current call..." msgstr "" @@ -1940,11 +1944,11 @@ msgstr "" msgid "Authentication token is %s" msgstr "" -#: ../coreapi/linphonecall.c:1305 +#: ../coreapi/linphonecall.c:1306 msgid "Call parameters were successfully modified." msgstr "" -#: ../coreapi/linphonecall.c:3659 +#: ../coreapi/linphonecall.c:3660 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." diff --git a/po/zh_TW.po b/po/zh_TW.po index fcc1a2ea2..a7dd2877b 100644 --- a/po/zh_TW.po +++ b/po/zh_TW.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: linphone-gtk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-27 14:40+0100\n" -"PO-Revision-Date: 2015-03-27 13:40+0000\n" +"POT-Creation-Date: 2015-04-01 16:25+0200\n" +"PO-Revision-Date: 2015-04-01 14:26+0000\n" "Last-Translator: Belledonne Communications \n" "Language-Team: Chinese (Taiwan) (http://www.transifex.com/projects/p/linphone-gtk/language/zh_TW/)\n" "MIME-Version: 1.0\n" @@ -123,7 +123,7 @@ msgstr "" msgid "Run self test and exit 0 if succeed" msgstr "" -#: ../gtk/main.c:1059 +#: ../gtk/main.c:1069 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -131,76 +131,76 @@ msgid "" "If you answer no, this person will be temporarily blacklisted." msgstr "%s 想要加您加入他的連絡人清單。\n您是否要允許他看見您的上線狀態或將他加入您的連絡人清單?\n如果您回答否,這個人會被暫時列入黑名單。" -#: ../gtk/main.c:1136 +#: ../gtk/main.c:1146 #, c-format msgid "" "Please enter your password for username %s\n" " at realm %s:" msgstr "" -#: ../gtk/main.c:1257 +#: ../gtk/main.c:1267 msgid "Call error" msgstr "" -#: ../gtk/main.c:1260 ../coreapi/linphonecore.c:3826 +#: ../gtk/main.c:1270 ../coreapi/linphonecore.c:3842 msgid "Call ended" msgstr "通話已結束" -#: ../gtk/main.c:1263 ../coreapi/call_log.c:221 +#: ../gtk/main.c:1273 ../coreapi/call_log.c:221 msgid "Incoming call" msgstr "來電" -#: ../gtk/main.c:1265 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 +#: ../gtk/main.c:1275 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 msgid "Answer" msgstr "接聽" -#: ../gtk/main.c:1267 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1277 ../gtk/main.ui.h:6 msgid "Decline" msgstr "拒接" -#: ../gtk/main.c:1273 +#: ../gtk/main.c:1283 msgid "Call paused" msgstr "" -#: ../gtk/main.c:1273 +#: ../gtk/main.c:1283 #, c-format msgid "by %s" msgstr "" -#: ../gtk/main.c:1343 +#: ../gtk/main.c:1353 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1505 +#: ../gtk/main.c:1516 msgid "Website link" msgstr "網站連結" -#: ../gtk/main.c:1554 +#: ../gtk/main.c:1565 msgid "Linphone - a video internet phone" msgstr "Linphone - 網路視訊電話" -#: ../gtk/main.c:1646 +#: ../gtk/main.c:1657 #, c-format msgid "%s (Default)" msgstr "%s (預設值)" -#: ../gtk/main.c:1978 ../coreapi/callbacks.c:1057 +#: ../gtk/main.c:1989 ../coreapi/callbacks.c:1057 #, c-format msgid "We are transferred to %s" msgstr "我們被轉接到 %s" -#: ../gtk/main.c:1988 +#: ../gtk/main.c:1999 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." msgstr "在這臺電腦中偵測不到音效卡。\n您將無法傳送或接收語音電話。" -#: ../gtk/main.c:2136 +#: ../gtk/main.c:2147 msgid "A free SIP video-phone" msgstr "自由的 SIP 視訊電話" -#: ../gtk/main.c:2241 +#: ../gtk/main.c:2252 #, c-format msgid "Hello\n" msgstr "" @@ -274,7 +274,7 @@ msgstr "參數" msgid "Enabled" msgstr "已啟用" -#: ../gtk/propertybox.c:622 ../gtk/propertybox.c:763 ../gtk/parameters.ui.h:17 +#: ../gtk/propertybox.c:622 ../gtk/propertybox.c:763 ../gtk/parameters.ui.h:20 msgid "Disabled" msgstr "已停用" @@ -438,7 +438,7 @@ msgstr "" msgid "Enter your linphone.org username" msgstr "" -#: ../gtk/setupwizard.c:102 ../gtk/parameters.ui.h:81 ../gtk/ldap.ui.h:4 +#: ../gtk/setupwizard.c:102 ../gtk/parameters.ui.h:85 ../gtk/ldap.ui.h:4 msgid "Username:" msgstr "使用者名稱:" @@ -1175,307 +1175,311 @@ msgid "C" msgstr "C" #: ../gtk/parameters.ui.h:11 +msgid "SIP (UDP)" +msgstr "" + +#: ../gtk/parameters.ui.h:12 +msgid "SIP (TCP)" +msgstr "" + +#: ../gtk/parameters.ui.h:13 +msgid "SIP (TLS)" +msgstr "" + +#: ../gtk/parameters.ui.h:14 msgid "Settings" msgstr "設定值" -#: ../gtk/parameters.ui.h:12 +#: ../gtk/parameters.ui.h:15 msgid "Set Maximum Transmission Unit:" msgstr "設定最大傳輸單位:" -#: ../gtk/parameters.ui.h:13 +#: ../gtk/parameters.ui.h:16 msgid "Send DTMFs as SIP info" msgstr "傳送 DTMFs 為 SIP 資訊" -#: ../gtk/parameters.ui.h:14 +#: ../gtk/parameters.ui.h:17 msgid "Allow IPv6" msgstr "" -#: ../gtk/parameters.ui.h:15 +#: ../gtk/parameters.ui.h:18 msgid "Transport" msgstr "傳輸" -#: ../gtk/parameters.ui.h:16 +#: ../gtk/parameters.ui.h:19 msgid "SIP/UDP port" msgstr "" -#: ../gtk/parameters.ui.h:18 +#: ../gtk/parameters.ui.h:21 msgid "Random" msgstr "" -#: ../gtk/parameters.ui.h:19 +#: ../gtk/parameters.ui.h:22 msgid "SIP/TCP port" msgstr "" -#: ../gtk/parameters.ui.h:20 +#: ../gtk/parameters.ui.h:23 msgid "Audio RTP/UDP:" msgstr "音效 RTP/UDP:" -#: ../gtk/parameters.ui.h:21 +#: ../gtk/parameters.ui.h:24 msgid "Fixed" msgstr "" -#: ../gtk/parameters.ui.h:22 +#: ../gtk/parameters.ui.h:25 msgid "Video RTP/UDP:" msgstr "視訊 RTP/UDP:" -#: ../gtk/parameters.ui.h:23 +#: ../gtk/parameters.ui.h:26 msgid "Media encryption type" msgstr "" -#: ../gtk/parameters.ui.h:24 +#: ../gtk/parameters.ui.h:27 msgid "Media encryption is mandatory" msgstr "" -#: ../gtk/parameters.ui.h:25 +#: ../gtk/parameters.ui.h:28 msgid "Tunnel" msgstr "" -#: ../gtk/parameters.ui.h:26 +#: ../gtk/parameters.ui.h:29 msgid "DSCP fields" msgstr "" -#: ../gtk/parameters.ui.h:27 +#: ../gtk/parameters.ui.h:30 msgid "Network protocol and ports" msgstr "" -#: ../gtk/parameters.ui.h:28 +#: ../gtk/parameters.ui.h:31 msgid "Direct connection to the Internet" msgstr "直接連線到網際網路" -#: ../gtk/parameters.ui.h:29 +#: ../gtk/parameters.ui.h:32 msgid "Behind NAT / Firewall (specify gateway IP )" msgstr "" -#: ../gtk/parameters.ui.h:30 +#: ../gtk/parameters.ui.h:33 msgid "Behind NAT / Firewall (use STUN to resolve)" msgstr "在 NAT / 防火牆之後 (使用 STUN 解析)" -#: ../gtk/parameters.ui.h:31 +#: ../gtk/parameters.ui.h:34 msgid "Behind NAT / Firewall (use ICE)" msgstr "" -#: ../gtk/parameters.ui.h:32 +#: ../gtk/parameters.ui.h:35 msgid "Behind NAT / Firewall (use uPnP)" msgstr "" -#: ../gtk/parameters.ui.h:33 +#: ../gtk/parameters.ui.h:36 msgid "Public IP address:" msgstr "公共 IP 地址:" -#: ../gtk/parameters.ui.h:34 +#: ../gtk/parameters.ui.h:37 msgid "Stun server:" msgstr "Stun 伺服器:" -#: ../gtk/parameters.ui.h:35 +#: ../gtk/parameters.ui.h:38 msgid "NAT and Firewall" msgstr "NAT 與防火牆" -#: ../gtk/parameters.ui.h:36 +#: ../gtk/parameters.ui.h:39 msgid "Network settings" msgstr "網路設定值" -#: ../gtk/parameters.ui.h:37 +#: ../gtk/parameters.ui.h:40 msgid "Ring sound:" msgstr "鈴聲音效:" -#: ../gtk/parameters.ui.h:38 +#: ../gtk/parameters.ui.h:41 msgid "ALSA special device (optional):" msgstr "ALSA 特殊裝置 (選擇性):" -#: ../gtk/parameters.ui.h:39 +#: ../gtk/parameters.ui.h:42 msgid "Capture device:" msgstr "捕捉裝置:" -#: ../gtk/parameters.ui.h:40 +#: ../gtk/parameters.ui.h:43 msgid "Ring device:" msgstr "響鈴裝置:" -#: ../gtk/parameters.ui.h:41 +#: ../gtk/parameters.ui.h:44 msgid "Playback device:" msgstr "播放裝置" -#: ../gtk/parameters.ui.h:42 +#: ../gtk/parameters.ui.h:45 msgid "Enable echo cancellation" msgstr "啟用回音消除" -#: ../gtk/parameters.ui.h:43 +#: ../gtk/parameters.ui.h:46 msgid "Audio" msgstr "音效" -#: ../gtk/parameters.ui.h:44 +#: ../gtk/parameters.ui.h:47 msgid "Video input device:" msgstr "視訊輸入裝置:" -#: ../gtk/parameters.ui.h:45 +#: ../gtk/parameters.ui.h:48 msgid "Prefered video resolution:" msgstr "偏好的視訊解析度:" -#: ../gtk/parameters.ui.h:46 +#: ../gtk/parameters.ui.h:49 msgid "Video output method:" msgstr "" -#: ../gtk/parameters.ui.h:47 +#: ../gtk/parameters.ui.h:50 msgid "Show camera preview" msgstr "" -#: ../gtk/parameters.ui.h:48 +#: ../gtk/parameters.ui.h:51 msgid "Video" msgstr "視訊" -#: ../gtk/parameters.ui.h:49 +#: ../gtk/parameters.ui.h:52 msgid "Multimedia settings" msgstr "多媒體設定值" -#: ../gtk/parameters.ui.h:50 +#: ../gtk/parameters.ui.h:53 msgid "This section defines your SIP address when not using a SIP account" msgstr "這一區在不使用 SIP 帳號時定義您的 SIP 位址" -#: ../gtk/parameters.ui.h:51 +#: ../gtk/parameters.ui.h:54 msgid "Your display name (eg: John Doe):" msgstr "您的顯示名稱 (例如: John Doe):" -#: ../gtk/parameters.ui.h:52 +#: ../gtk/parameters.ui.h:55 msgid "Your username:" msgstr "您的使用者名稱:" -#: ../gtk/parameters.ui.h:53 +#: ../gtk/parameters.ui.h:56 msgid "Your resulting SIP address:" msgstr "您組成的 SIP 位址:" -#: ../gtk/parameters.ui.h:54 +#: ../gtk/parameters.ui.h:57 msgid "Default identity" msgstr "預設身分識別" -#: ../gtk/parameters.ui.h:55 +#: ../gtk/parameters.ui.h:58 msgid "Wizard" msgstr "" -#: ../gtk/parameters.ui.h:56 +#: ../gtk/parameters.ui.h:59 msgid "Add" msgstr "加入" -#: ../gtk/parameters.ui.h:57 +#: ../gtk/parameters.ui.h:60 msgid "Edit" msgstr "編輯" -#: ../gtk/parameters.ui.h:58 +#: ../gtk/parameters.ui.h:61 msgid "Remove" msgstr "移除" -#: ../gtk/parameters.ui.h:59 +#: ../gtk/parameters.ui.h:62 msgid "Proxy accounts" msgstr "代理伺服器帳號" -#: ../gtk/parameters.ui.h:60 +#: ../gtk/parameters.ui.h:63 msgid "Erase all passwords" msgstr "消除所有的密碼" -#: ../gtk/parameters.ui.h:61 +#: ../gtk/parameters.ui.h:64 msgid "Privacy" msgstr "隱私" -#: ../gtk/parameters.ui.h:62 +#: ../gtk/parameters.ui.h:65 msgid "Automatically answer when a call is received" msgstr "" -#: ../gtk/parameters.ui.h:63 +#: ../gtk/parameters.ui.h:66 +msgid "Delay before answering (ms)" +msgstr "" + +#: ../gtk/parameters.ui.h:67 msgid "Auto-answer" msgstr "" -#: ../gtk/parameters.ui.h:64 +#: ../gtk/parameters.ui.h:68 msgid "Manage SIP Accounts" msgstr "管理 SIP 帳號" -#: ../gtk/parameters.ui.h:65 ../gtk/tunnel_config.ui.h:4 +#: ../gtk/parameters.ui.h:69 ../gtk/tunnel_config.ui.h:4 msgid "Enable" msgstr "啟用" -#: ../gtk/parameters.ui.h:66 ../gtk/tunnel_config.ui.h:5 +#: ../gtk/parameters.ui.h:70 ../gtk/tunnel_config.ui.h:5 msgid "Disable" msgstr "停用" -#: ../gtk/parameters.ui.h:67 +#: ../gtk/parameters.ui.h:71 msgid "Codecs" msgstr "編碼解碼器" -#: ../gtk/parameters.ui.h:68 +#: ../gtk/parameters.ui.h:72 msgid "0 stands for \"unlimited\"" msgstr "0 表示「不限制」" -#: ../gtk/parameters.ui.h:69 +#: ../gtk/parameters.ui.h:73 msgid "Upload speed limit in Kbit/sec:" msgstr "上傳速度限制於 Kbit/sec:" -#: ../gtk/parameters.ui.h:70 +#: ../gtk/parameters.ui.h:74 msgid "Download speed limit in Kbit/sec:" msgstr "下載速度限制於 Kbit/sec:" -#: ../gtk/parameters.ui.h:71 +#: ../gtk/parameters.ui.h:75 msgid "Enable adaptive rate control" msgstr "" -#: ../gtk/parameters.ui.h:72 +#: ../gtk/parameters.ui.h:76 msgid "" "Adaptive rate control is a technique to dynamically guess the available " "bandwidth during a call." msgstr "" -#: ../gtk/parameters.ui.h:73 +#: ../gtk/parameters.ui.h:77 msgid "Bandwidth control" msgstr "頻寬控制" -#: ../gtk/parameters.ui.h:74 +#: ../gtk/parameters.ui.h:78 msgid "Codecs" msgstr "編碼解碼器" -#: ../gtk/parameters.ui.h:75 +#: ../gtk/parameters.ui.h:79 msgid "Language" msgstr "語言" -#: ../gtk/parameters.ui.h:76 +#: ../gtk/parameters.ui.h:80 msgid "Show advanced settings" msgstr "顯示進階設定值" -#: ../gtk/parameters.ui.h:77 +#: ../gtk/parameters.ui.h:81 msgid "Level" msgstr "級數" -#: ../gtk/parameters.ui.h:78 +#: ../gtk/parameters.ui.h:82 msgid "User interface" msgstr "使用者介面" -#: ../gtk/parameters.ui.h:79 ../gtk/ldap.ui.h:2 +#: ../gtk/parameters.ui.h:83 ../gtk/ldap.ui.h:2 msgid "Server address:" msgstr "" -#: ../gtk/parameters.ui.h:80 ../gtk/ldap.ui.h:3 +#: ../gtk/parameters.ui.h:84 ../gtk/ldap.ui.h:3 msgid "Authentication method:" msgstr "" -#: ../gtk/parameters.ui.h:82 +#: ../gtk/parameters.ui.h:86 msgid "LDAP Account setup" msgstr "" -#: ../gtk/parameters.ui.h:83 +#: ../gtk/parameters.ui.h:87 msgid "LDAP" msgstr "" -#: ../gtk/parameters.ui.h:84 +#: ../gtk/parameters.ui.h:88 msgid "Done" msgstr "完成" -#: ../gtk/parameters.ui.h:85 -msgid "SIP (UDP)" -msgstr "" - -#: ../gtk/parameters.ui.h:86 -msgid "SIP (TCP)" -msgstr "" - -#: ../gtk/parameters.ui.h:87 -msgid "SIP (TLS)" -msgstr "" - #: ../gtk/buddylookup.ui.h:1 msgid "Search contacts in directory" msgstr "在目錄中搜尋" @@ -1691,60 +1695,60 @@ msgstr "" msgid "Please wait while fetching configuration from server..." msgstr "" -#: ../coreapi/linphonecore.c:1534 +#: ../coreapi/linphonecore.c:1538 msgid "Ready" msgstr "準備就緒" -#: ../coreapi/linphonecore.c:2534 +#: ../coreapi/linphonecore.c:2550 msgid "Configuring" msgstr "" -#: ../coreapi/linphonecore.c:2708 +#: ../coreapi/linphonecore.c:2724 msgid "Looking for telephone number destination..." msgstr "尋找電話號碼目的端..." -#: ../coreapi/linphonecore.c:2710 +#: ../coreapi/linphonecore.c:2726 msgid "Could not resolve this number." msgstr "無法解析這個號碼。" #. must be known at that time -#: ../coreapi/linphonecore.c:2996 +#: ../coreapi/linphonecore.c:3012 msgid "Contacting" msgstr "正在連絡" -#: ../coreapi/linphonecore.c:3001 +#: ../coreapi/linphonecore.c:3017 msgid "Could not call" msgstr "無法通話" -#: ../coreapi/linphonecore.c:3152 +#: ../coreapi/linphonecore.c:3168 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "抱歉,我們已達瀏同步通話的最大數目" -#: ../coreapi/linphonecore.c:3310 +#: ../coreapi/linphonecore.c:3326 msgid "is contacting you" msgstr "正在連絡您" -#: ../coreapi/linphonecore.c:3311 +#: ../coreapi/linphonecore.c:3327 msgid " and asked autoanswer." msgstr "並要求自動接聽。" -#: ../coreapi/linphonecore.c:3435 +#: ../coreapi/linphonecore.c:3451 msgid "Modifying call parameters..." msgstr "修改通話參數..." -#: ../coreapi/linphonecore.c:3782 +#: ../coreapi/linphonecore.c:3798 msgid "Connected." msgstr "已連線。" -#: ../coreapi/linphonecore.c:3807 +#: ../coreapi/linphonecore.c:3823 msgid "Call aborted" msgstr "通話已放棄" -#: ../coreapi/linphonecore.c:3997 +#: ../coreapi/linphonecore.c:4013 msgid "Could not pause the call" msgstr "無法暫停通話" -#: ../coreapi/linphonecore.c:4000 +#: ../coreapi/linphonecore.c:4016 msgid "Pausing the current call..." msgstr "暫停目前的通話..." @@ -1940,11 +1944,11 @@ msgstr "" msgid "Authentication token is %s" msgstr "" -#: ../coreapi/linphonecall.c:1305 +#: ../coreapi/linphonecall.c:1306 msgid "Call parameters were successfully modified." msgstr "" -#: ../coreapi/linphonecall.c:3659 +#: ../coreapi/linphonecall.c:3660 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." From 9afcf491085d777e1aa2f67738abb5f14e46bd2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Grisez?= Date: Tue, 21 Apr 2015 12:02:34 +0200 Subject: [PATCH 044/157] Makes CMake to automatically generate the list of languages --- CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a3c505c56..94ef76c9a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -30,7 +30,8 @@ set(LINPHONE_MICRO_VERSION "1") set(LINPHONE_VERSION "${LINPHONE_MAJOR_VERSION}.${LINPHONE_MINOR_VERSION}.${LINPHONE_MICRO_VERSION}") set(LINPHONE_SO_VERSION "6") -set(LINPHONE_ALL_LANGS "cs de es fr he hu it ja nb_NO nl pl pt_BR ru sr sv zh_CN zh_TW") +file(GLOB LINPHONE_PO_FILES RELATIVE "po" "po/*.po") +string(REPLACE ".po" "" LINPHONE_ALL_LANGS "${LINPHONE_PO_FILES}") include(CMakeDependentOption) From ced44d17eb7a3ec9e1f70fb1ded728c4ceab42d0 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Tue, 21 Apr 2015 12:18:38 +0200 Subject: [PATCH 045/157] Add lpconfig option to set the default value for defer_update. --- coreapi/callbacks.c | 4 ++-- coreapi/linphonecore.c | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/coreapi/callbacks.c b/coreapi/callbacks.c index d1d7ce160..5b8d6450f 100644 --- a/coreapi/callbacks.c +++ b/coreapi/callbacks.c @@ -663,7 +663,7 @@ static void call_updated_by_remote(LinphoneCore *lc, LinphoneCall *call, bool_t if ( call->state == LinphoneCallStreamsRunning) { /*reINVITE and in-dialogs UPDATE go here*/ linphone_core_notify_display_status(lc,_("Call is updated by remote.")); - call->defer_update=FALSE; + call->defer_update = lp_config_get_int(lc->config, "sip", "defer_update_default", FALSE); linphone_call_set_state(call, LinphoneCallUpdatedByRemote,"Call updated by remote"); if (call->defer_update==FALSE){ linphone_core_accept_call_update(lc,call,NULL); @@ -676,7 +676,7 @@ static void call_updated_by_remote(LinphoneCore *lc, LinphoneCall *call, bool_t /* Case where no SDP is present and we were paused by remote. * We send back an ACK with our SDP and expect the remote to send its own. * No state change here until an answer is received. */ - call->defer_update=FALSE; + call->defer_update = lp_config_get_int(lc->config, "sip", "defer_update_default", FALSE); if (call->defer_update==FALSE){ _linphone_core_accept_call_update(lc,call,NULL,call->state,linphone_call_state_to_string(call->state)); } diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index ed8cae539..ad77696f6 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -3563,10 +3563,11 @@ int linphone_core_update_call(LinphoneCore *lc, LinphoneCall *call, const Linpho * When receiving a #LinphoneCallUpdatedByRemote state notification, prevent LinphoneCore from performing an automatic answer. * * When receiving a #LinphoneCallUpdatedByRemote state notification (ie an incoming reINVITE), the default behaviour of - * LinphoneCore is to automatically answer the reINIVTE with call parameters unchanged. + * LinphoneCore is defined by the "defer_update_default" option of the "sip" section of the config. If this option is 0 (the default) + * then the LinphoneCore automatically answers the reINIVTE with call parameters unchanged. * However when for example when the remote party updated the call to propose a video stream, it can be useful * to prompt the user before answering. This can be achieved by calling linphone_core_defer_call_update() during - * the call state notifiacation, to deactivate the automatic answer that would just confirm the audio but reject the video. + * the call state notification, to deactivate the automatic answer that would just confirm the audio but reject the video. * Then, when the user responds to dialog prompt, it becomes possible to call linphone_core_accept_call_update() to answer * the reINVITE, with eventually video enabled in the LinphoneCallParams argument. * From 594774d9919ccef61467afc5a71d5fdf81b8183c Mon Sep 17 00:00:00 2001 From: Margaux Clerc Date: Tue, 21 Apr 2015 12:31:08 +0200 Subject: [PATCH 046/157] Add isPhoneNumber function in JNI --- coreapi/linphonecore_jni.cc | 11 +++++++++++ .../common/org/linphone/core/LinphoneProxyConfig.java | 7 +++++++ .../org/linphone/core/LinphoneProxyConfigImpl.java | 6 ++++++ 3 files changed, 24 insertions(+) diff --git a/coreapi/linphonecore_jni.cc b/coreapi/linphonecore_jni.cc index a5a159684..a61091a68 100644 --- a/coreapi/linphonecore_jni.cc +++ b/coreapi/linphonecore_jni.cc @@ -3863,6 +3863,17 @@ JNIEXPORT jstring JNICALL Java_org_linphone_core_LinphoneProxyConfigImpl_getReal return jvalue; } +JNIEXPORT jboolean JNICALL Java_org_linphone_core_LinphoneProxyConfigImpl_isPhoneNumber(JNIEnv *env, jobject thiz, jlong ptr, jstring jusername) { + if(jusername){ + const char *username=env->GetStringUTFChars(jusername, NULL); + bool_t res = linphone_proxy_config_is_phone_number((LinphoneProxyConfig *)ptr, username); + env->ReleaseStringUTFChars(jusername,username); + return (jboolean) res; + } else { + return JNI_FALSE; + } +} + extern "C" jint Java_org_linphone_core_LinphoneCallImpl_getDuration(JNIEnv* env,jobject thiz,jlong ptr) { return (jint)linphone_call_get_duration((LinphoneCall *) ptr); } diff --git a/java/common/org/linphone/core/LinphoneProxyConfig.java b/java/common/org/linphone/core/LinphoneProxyConfig.java index 8b668da2e..e5381701e 100644 --- a/java/common/org/linphone/core/LinphoneProxyConfig.java +++ b/java/common/org/linphone/core/LinphoneProxyConfig.java @@ -306,6 +306,13 @@ public interface LinphoneProxyConfig { **/ void setUserData(Object obj); + /** + * Detect if the given input is a phone number or not. + * @param username string to parse. + * @return TRUE if input is a phone number, FALSE otherwise. + **/ + boolean isPhoneNumber(String username); + /** * Returns user data from a proxy config. return null if any * @return an Object. diff --git a/java/impl/org/linphone/core/LinphoneProxyConfigImpl.java b/java/impl/org/linphone/core/LinphoneProxyConfigImpl.java index f08980190..33ac36f8f 100644 --- a/java/impl/org/linphone/core/LinphoneProxyConfigImpl.java +++ b/java/impl/org/linphone/core/LinphoneProxyConfigImpl.java @@ -362,6 +362,12 @@ class LinphoneProxyConfigImpl implements LinphoneProxyConfig { return getPublishExpires(nativePtr); } + private native boolean isPhoneNumber(long nativePtr,String username); + @Override + public boolean isPhoneNumber(String username){ + return isPhoneNumber(nativePtr,username); + } + @Override public void setUserData(Object obj) { userData = obj; From 4142eeb4ce3128c736aebbddb5e5076779e589b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Grisez?= Date: Tue, 21 Apr 2015 14:56:05 +0200 Subject: [PATCH 047/157] Fix CMake issues about the generation of the list of languages --- CMakeLists.txt | 5 ++--- po/CMakeLists.txt | 3 +-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 94ef76c9a..66316a163 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -30,9 +30,8 @@ set(LINPHONE_MICRO_VERSION "1") set(LINPHONE_VERSION "${LINPHONE_MAJOR_VERSION}.${LINPHONE_MINOR_VERSION}.${LINPHONE_MICRO_VERSION}") set(LINPHONE_SO_VERSION "6") -file(GLOB LINPHONE_PO_FILES RELATIVE "po" "po/*.po") -string(REPLACE ".po" "" LINPHONE_ALL_LANGS "${LINPHONE_PO_FILES}") - +file(GLOB LINPHONE_PO_FILES RELATIVE "${CMAKE_SOURCE_DIR}/po" "${CMAKE_SOURCE_DIR}/po/*.po") +string(REGEX REPLACE "([a-zA-Z_]+)\\.po" "\\1" LINPHONE_ALL_LANGS "${LINPHONE_PO_FILES}") include(CMakeDependentOption) diff --git a/po/CMakeLists.txt b/po/CMakeLists.txt index 7c39caac6..9b856b482 100644 --- a/po/CMakeLists.txt +++ b/po/CMakeLists.txt @@ -21,8 +21,7 @@ ############################################################################ if(GETTEXT_FOUND) - string(REPLACE " " ";" LANGUAGES ${LINPHONE_ALL_LANGS}) - foreach(language ${LANGUAGES}) + foreach(language ${LINPHONE_ALL_LANGS}) GETTEXT_PROCESS_PO_FILES(${language} ALL PO_FILES ${language}.po) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${language}.gmo DESTINATION ${PACKAGE_LOCALE_DIR}/${language}/LC_MESSAGES From cd957dda224b602b006d154d864d4f28b5bf6f14 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Mon, 20 Apr 2015 19:12:35 +0200 Subject: [PATCH 048/157] add srtp case to test with stream inactive --- tester/call_tester.c | 31 ++++++++++++++++++++++++++----- tester/multicast_call_tester.c | 6 ++++++ 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/tester/call_tester.c b/tester/call_tester.c index 1b0b0ede2..63d8d922e 100644 --- a/tester/call_tester.c +++ b/tester/call_tester.c @@ -3911,12 +3911,13 @@ static void unsucessfull_call_with_transport_change_after_released(void) { } #ifdef VIDEO_ENABLED -static void video_call_with_re_invite_inactive_followed_by_re_invite_base(bool_t no_sdp) { +static void video_call_with_re_invite_inactive_followed_by_re_invite_base(LinphoneMediaEncryption mode, bool_t no_sdp) { int begin; int leaked_objects; LinphoneCoreManager* marie; LinphoneCoreManager* pauline; LinphoneCallParams *params; + const LinphoneCallParams *current_params; MSList *lcs=NULL; belle_sip_object_enable_leak_detector(TRUE); @@ -3931,7 +3932,7 @@ static void video_call_with_re_invite_inactive_followed_by_re_invite_base(bool_t lcs=ms_list_append(lcs,pauline->lc); lcs=ms_list_append(lcs,marie->lc); - video_call_base_2(marie,pauline,TRUE,LinphoneMediaEncryptionNone,TRUE,TRUE); + video_call_base_2(marie,pauline,TRUE,mode,TRUE,TRUE); if (linphone_core_get_current_call(marie->lc)) { params=linphone_core_create_call_params(marie->lc,linphone_core_get_current_call(marie->lc)); @@ -3970,6 +3971,12 @@ static void video_call_with_re_invite_inactive_followed_by_re_invite_base(bool_t check_media_direction(marie,linphone_core_get_current_call(marie->lc),lcs,LinphoneMediaDirectionSendRecv,LinphoneMediaDirectionSendRecv); check_media_direction(pauline,linphone_core_get_current_call(pauline->lc),lcs,LinphoneMediaDirectionSendRecv,LinphoneMediaDirectionSendRecv); + /*assert that after pause and resume, SRTP is still being used*/ + current_params = linphone_call_get_current_params(linphone_core_get_current_call(pauline->lc)); + CU_ASSERT_TRUE(linphone_call_params_get_media_encryption(current_params) == mode); + current_params = linphone_call_get_current_params(linphone_core_get_current_call(marie->lc)); + CU_ASSERT_TRUE(linphone_call_params_get_media_encryption(current_params) == mode); + } end_call(marie,pauline); linphone_core_manager_destroy(marie); @@ -3983,11 +3990,23 @@ static void video_call_with_re_invite_inactive_followed_by_re_invite_base(bool_t } static void video_call_with_re_invite_inactive_followed_by_re_invite() { - video_call_with_re_invite_inactive_followed_by_re_invite_base(FALSE); + video_call_with_re_invite_inactive_followed_by_re_invite_base(LinphoneMediaEncryptionNone,FALSE); } static void video_call_with_re_invite_inactive_followed_by_re_invite_no_sdp() { - video_call_with_re_invite_inactive_followed_by_re_invite_base(TRUE); + video_call_with_re_invite_inactive_followed_by_re_invite_base(LinphoneMediaEncryptionNone, TRUE); +} +static void srtp_video_call_with_re_invite_inactive_followed_by_re_invite() { + if (ms_srtp_supported()) + video_call_with_re_invite_inactive_followed_by_re_invite_base(LinphoneMediaEncryptionSRTP,FALSE); + else + ms_message("srtp_video_call_with_re_invite_inactive_followed_by_re_invite skipped, missing srtp support"); +} +static void srtp_video_call_with_re_invite_inactive_followed_by_re_invite_no_sdp() { + if (ms_srtp_supported()) + video_call_with_re_invite_inactive_followed_by_re_invite_base(LinphoneMediaEncryptionSRTP, TRUE); + else + ms_message("srtp_video_call_with_re_invite_inactive_followed_by_re_invite_no_sdp skipped, missing srtp support"); } static void video_call_ice_params() { LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); @@ -4078,7 +4097,9 @@ test_t call_tests[] = { { "2 Video call accepted in send only", two_accepted_call_in_send_only}, { "Video call with re-invite(inactive) followed by re-invite", video_call_with_re_invite_inactive_followed_by_re_invite}, { "Video call with re-invite(inactive) followed by re-invite(no sdp)", video_call_with_re_invite_inactive_followed_by_re_invite_no_sdp}, -#endif + { "SRTP Video call with re-invite(inactive) followed by re-invite", srtp_video_call_with_re_invite_inactive_followed_by_re_invite}, + { "SRTP Video call with re-invite(inactive) followed by re-invite(no sdp)", srtp_video_call_with_re_invite_inactive_followed_by_re_invite_no_sdp}, + #endif { "SRTP ice call", srtp_ice_call }, { "ZRTP ice call", zrtp_ice_call }, { "ZRTP ice call with relay", zrtp_ice_call_with_relay}, diff --git a/tester/multicast_call_tester.c b/tester/multicast_call_tester.c index e5a05c11e..fb4b58d6c 100644 --- a/tester/multicast_call_tester.c +++ b/tester/multicast_call_tester.c @@ -183,6 +183,12 @@ static void early_media_with_multicast_base(bool_t video) { CU_ASSERT_TRUE(wait_for_list(lcs, &marie->stat.number_of_LinphoneCallConnected, 1,1000)); CU_ASSERT_TRUE(wait_for_list(lcs, &marie->stat.number_of_LinphoneCallStreamsRunning, 1,1000)); + linphone_core_update_call( pauline->lc + , linphone_core_get_current_call(pauline->lc) + , linphone_call_get_current_params(linphone_core_get_current_call(pauline->lc))); + + CU_ASSERT_TRUE(wait_for_list(lcs, &marie->stat.number_of_LinphoneCallStreamsRunning, 2,1000)); + end_call(marie,pauline); } ms_free(lcs); From cae840d597a17354153316275b942d130d778b55 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Tue, 21 Apr 2015 09:56:34 +0200 Subject: [PATCH 049/157] fix attribute ssrc in video mline --- coreapi/linphonecall.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c index cbd70a9e1..92c5c8cc0 100644 --- a/coreapi/linphonecall.c +++ b/coreapi/linphonecall.c @@ -668,8 +668,8 @@ void linphone_call_make_local_media_description_with_params(LinphoneCore *lc, Li md->streams[1].payloads=l; if (call->videostream && call->videostream->ms.sessions.rtp_session) { char* me = linphone_address_as_string_uri_only(call->me); - md->streams[0].rtp_ssrc=rtp_session_get_send_ssrc(call->videostream->ms.sessions.rtp_session); - strncpy(md->streams[0].rtcp_cname,me,sizeof(md->streams[0].rtcp_cname)); + md->streams[1].rtp_ssrc=rtp_session_get_send_ssrc(call->videostream->ms.sessions.rtp_session); + strncpy(md->streams[1].rtcp_cname,me,sizeof(md->streams[1].rtcp_cname)); ms_free(me); } else From 42b997277057e0e9084b9fed2e39609fe8e4d07d Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Tue, 21 Apr 2015 15:58:49 +0200 Subject: [PATCH 050/157] improve get current param encryption mode --- coreapi/linphonecall.c | 39 ++++++++++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c index 92c5c8cc0..894d8cd08 100644 --- a/coreapi/linphonecall.c +++ b/coreapi/linphonecall.c @@ -1414,6 +1414,11 @@ LinphoneCall * linphone_call_ref(LinphoneCall *obj){ void linphone_call_unref(LinphoneCall *obj){ belle_sip_object_unref(obj); } +static unsigned int linphone_call_get_n_active_streams(const LinphoneCall *call) { + SalMediaDescription *md = sal_call_get_remote_media_description(call->op); + if (!md) return 0; + return sal_media_description_nb_active_streams_of_type(md, SalAudio) + sal_media_description_nb_active_streams_of_type(md, SalVideo); +} /** * Returns current parameters associated to the call. @@ -1437,20 +1442,32 @@ const LinphoneCallParams * linphone_call_get_current_params(LinphoneCall *call){ /* REVISITED * Previous code was buggy. - * Relying on the mediastream's state to know the current encryption is unreliable. - * For ZRTP it is though necessary. - * But for all others the current_params->media_encryption state should reflect what is agreed by the offer/answer - * mechanism. + * Relying on the mediastream's state (added by jehan: only) to know the current encryption is unreliable. + * For (added by jehan: both DTLS and) ZRTP it is though necessary. + * But for all others the current_params->media_encryption state should reflect (added by jehan: both) what is agreed by the offer/answer + * mechanism (added by jehan: and encryption status from media which is much stronger than only result of offer/answer ) * Typically there can be inactive streams for which the media layer has no idea of whether they are encrypted or not. */ - if (call->params->media_encryption == LinphoneMediaEncryptionZRTP){ - if (linphone_call_all_streams_encrypted(call)) { - if (linphone_call_get_authentication_token(call)) { - call->current_params->media_encryption=LinphoneMediaEncryptionZRTP; - } + + switch (call->params->media_encryption) { + case LinphoneMediaEncryptionZRTP: + if (linphone_call_all_streams_encrypted(call) && linphone_call_get_authentication_token(call)) { + call->current_params->media_encryption=LinphoneMediaEncryptionZRTP; + } else { + call->current_params->media_encryption=LinphoneMediaEncryptionNone; } - }else{ - call->current_params->media_encryption = call->params->media_encryption; + break; + case LinphoneMediaEncryptionDTLS: + case LinphoneMediaEncryptionSRTP: + if (linphone_call_get_n_active_streams(call)==0 || linphone_call_all_streams_encrypted(call)) { + call->current_params->media_encryption = call->params->media_encryption; + } else { + call->current_params->media_encryption=LinphoneMediaEncryptionNone; + } + break; + case LinphoneMediaEncryptionNone: + call->current_params->media_encryption=LinphoneMediaEncryptionNone; + break; } call->current_params->avpf_enabled = linphone_call_all_streams_avpf_enabled(call); From 6aacbf1af4db9acfcc65d87ae12497fe41dba80f Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Wed, 22 Apr 2015 10:01:54 +0200 Subject: [PATCH 051/157] submodules: update ms2 --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index c0893480a..2f9bbbd13 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit c0893480a148ac1724329ba0a5aca0165c65fc8e +Subproject commit 2f9bbbd1368261f3f88802aecb9306e7b2e56084 From 5a0c92bac32d086e176e2b10d13c7fd5bb4c1032 Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Wed, 22 Apr 2015 10:48:37 +0200 Subject: [PATCH 052/157] liblinphone_tester.mk: use correct bc_tester_utils.c source --- build/android/liblinphone_tester.mk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build/android/liblinphone_tester.mk b/build/android/liblinphone_tester.mk index 37cc4c579..e633116fc 100644 --- a/build/android/liblinphone_tester.mk +++ b/build/android/liblinphone_tester.mk @@ -1,7 +1,7 @@ LOCAL_PATH := $(call my-dir)/../../tester common_SRC_FILES := \ - ../../belle-sip/tester/common/bc_tester_utils.c \ + common/bc_tester_utils.c \ call_tester.c \ liblinphone_tester.c \ message_tester.c \ @@ -30,7 +30,7 @@ common_C_INCLUDES += \ $(LOCAL_PATH)/../coreapi \ $(LOCAL_PATH)/../oRTP/include \ $(LOCAL_PATH)/../mediastreamer2/include \ - $(LOCAL_PATH)/../../belle-sip/tester/common \ + $(LOCAL_PATH)/common include $(CLEAR_VARS) From d0bd6bf88398aeba3e143f7c635645dd2c74e068 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Grisez?= Date: Wed, 22 Apr 2015 22:18:15 +0200 Subject: [PATCH 053/157] Creates an interface which abstracts all ways to instanciate a status icon and create an implementation based on GtkStatusIcon --- gtk/CMakeLists.txt | 1 + gtk/Makefile.am | 1 + gtk/main.c | 92 ++++------------- gtk/status_icon.c | 241 +++++++++++++++++++++++++++++++++++++++++++++ gtk/status_icon.h | 42 ++++++++ 5 files changed, 303 insertions(+), 74 deletions(-) create mode 100644 gtk/status_icon.c create mode 100644 gtk/status_icon.h diff --git a/gtk/CMakeLists.txt b/gtk/CMakeLists.txt index ea923ea6d..bacbb448f 100644 --- a/gtk/CMakeLists.txt +++ b/gtk/CMakeLists.txt @@ -64,6 +64,7 @@ set(SOURCE_FILES main.c propertybox.c singleinstance.c + status_icon.c support.c update.c utils.c diff --git a/gtk/Makefile.am b/gtk/Makefile.am index f979376ef..03c209b55 100644 --- a/gtk/Makefile.am +++ b/gtk/Makefile.am @@ -55,6 +55,7 @@ linphone_SOURCES= \ config-fetching.c \ audio_assistant.c \ videowindow.c \ + status_icon.c \ linphone.h if BUILD_WIZARD linphone_SOURCES+= \ diff --git a/gtk/main.c b/gtk/main.c index aa993cf4c..d4f5d6718 100644 --- a/gtk/main.c +++ b/gtk/main.c @@ -55,6 +55,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #endif +#include "status_icon.h" const char *this_program_ident_string="linphone_ident_string=" LINPHONE_VERSION; @@ -1496,15 +1497,6 @@ void linphone_gtk_link_to_website(GtkWidget *item){ linphone_gtk_open_browser(home); } -#ifndef HAVE_GTK_OSX - -static GtkStatusIcon *icon=NULL; - -static void icon_popup_menu(GtkStatusIcon *status_icon, guint button, guint activate_time, gpointer user_data){ - GtkWidget *menu=(GtkWidget*)g_object_get_data(G_OBJECT(status_icon),"menu"); - gtk_menu_popup(GTK_MENU(menu),NULL,NULL,gtk_status_icon_position_menu,status_icon,button,activate_time); -} - static GtkWidget *create_icon_menu(){ GtkWidget *menu=gtk_menu_new(); GtkWidget *menu_item; @@ -1542,7 +1534,7 @@ void linphone_gtk_save_main_window_position(GtkWindow* mw, GdkEvent *event, gpoi gtk_window_get_position(GTK_WINDOW(mw), &main_window_x, &main_window_y); } -static void handle_icon_click() { +static void handle_icon_click(LinphoneStatusIcon *si, void *user_data) { GtkWidget *mw=linphone_gtk_get_main_window(); if (!gtk_window_is_active((GtkWindow*)mw)) { if(!gtk_widget_is_drawable(mw)){ @@ -1556,65 +1548,25 @@ static void handle_icon_click() { } } -static void linphone_gtk_init_status_icon(){ - const char *icon_path=linphone_gtk_get_ui_config("icon",LINPHONE_ICON); - const char *call_icon_path=linphone_gtk_get_ui_config("start_call_icon","startcall-green.png"); - GdkPixbuf *pbuf=create_pixbuf(icon_path); - GtkWidget *menu=create_icon_menu(); - const char *title; - title=linphone_gtk_get_ui_config("title",_("Linphone - a video internet phone")); - icon=gtk_status_icon_new_from_pixbuf(pbuf); -#if GTK_CHECK_VERSION(2,20,2) - gtk_status_icon_set_name(icon,title); -#endif - g_signal_connect_swapped(G_OBJECT(icon),"activate",(GCallback)handle_icon_click,NULL); - g_signal_connect(G_OBJECT(icon),"popup-menu",(GCallback)icon_popup_menu,NULL); - gtk_status_icon_set_tooltip(icon,title); - gtk_status_icon_set_visible(icon,TRUE); - g_object_set_data(G_OBJECT(icon),"menu",menu); - g_object_weak_ref(G_OBJECT(icon),(GWeakNotify)gtk_widget_destroy,menu); - g_object_set_data(G_OBJECT(icon),"icon",pbuf); - g_object_weak_ref(G_OBJECT(icon),(GWeakNotify)g_object_unref,pbuf); - pbuf=create_pixbuf(call_icon_path); - g_object_set_data(G_OBJECT(icon),"call_icon",pbuf); +static void linphone_gtk_init_status_icon(void) { + LinphoneStatusIcon *icon = linphone_status_icon_get(); + if(icon) { + GtkWidget *menu = create_icon_menu(); + LinphoneStatusIconParams *params = linphone_status_icon_params_new(); + linphone_status_icon_params_set_menu(params, menu); + linphone_status_icon_params_set_title(params, _("Linphone - a video internet phone")); + linphone_status_icon_params_set_on_click_cb(params, handle_icon_click, NULL); + linphone_status_icon_start(icon, params); + g_object_unref(G_OBJECT(menu)); + linphone_status_icon_params_unref(params); + } } -static gboolean do_icon_blink(GtkStatusIcon *gi){ - GdkPixbuf *call_icon=g_object_get_data(G_OBJECT(gi),"call_icon"); - GdkPixbuf *normal_icon=g_object_get_data(G_OBJECT(gi),"icon"); - GdkPixbuf *cur_icon=gtk_status_icon_get_pixbuf(gi); - if (cur_icon==call_icon){ - gtk_status_icon_set_from_pixbuf(gi,normal_icon); - }else{ - gtk_status_icon_set_from_pixbuf(gi,call_icon); +void linphone_gtk_status_icon_set_blinking(gboolean val) { + LinphoneStatusIcon *icon = linphone_status_icon_get(); + if(icon) { + linphone_status_icon_enable_blinking(icon, val); } - return TRUE; -} - -#endif - -void linphone_gtk_status_icon_set_blinking(gboolean val){ -#ifdef HAVE_GTK_OSX - static gint attention_id; - GtkosxApplication *theMacApp=gtkosx_application_get(); - if (val) - attention_id=gtkosx_application_attention_request(theMacApp,CRITICAL_REQUEST); - else gtkosx_application_cancel_attention_request(theMacApp,attention_id); -#else - if (icon!=NULL){ - guint tout; - tout=(unsigned)GPOINTER_TO_INT(g_object_get_data(G_OBJECT(icon),"timeout")); - if (val && tout==0){ - tout=g_timeout_add(500,(GSourceFunc)do_icon_blink,icon); - g_object_set_data(G_OBJECT(icon),"timeout",GINT_TO_POINTER(tout)); - }else if (!val && tout!=0){ - GdkPixbuf *normal_icon=g_object_get_data(G_OBJECT(icon),"icon"); - g_source_remove(tout); - g_object_set_data(G_OBJECT(icon),"timeout",NULL); - gtk_status_icon_set_from_pixbuf(icon,normal_icon); - } - } -#endif } void linphone_gtk_options_activate(GtkWidget *item){ @@ -2018,10 +1970,6 @@ static void linphone_gtk_quit(void){ quit_done=TRUE; linphone_gtk_quit_core(); linphone_gtk_uninit_instance(); -#ifndef HAVE_GTK_OSX - g_object_unref(icon); - icon=NULL; -#endif #ifdef HAVE_NOTIFY notify_uninit(); #endif @@ -2242,10 +2190,6 @@ core_start: goto core_start; } if (config_file) g_free(config_file); -#ifndef HAVE_GTK_OSX - /*workaround a bug on win32 that makes status icon still present in the systray even after program exit.*/ - if (icon) gtk_status_icon_set_visible(icon,FALSE); -#endif free(progpath); /*output a translated "hello" string to the terminal, which allows the builder to check that translations are working.*/ if (selftest){ diff --git a/gtk/status_icon.c b/gtk/status_icon.c new file mode 100644 index 000000000..d57a04f10 --- /dev/null +++ b/gtk/status_icon.c @@ -0,0 +1,241 @@ +/* +linphone, gtk-glade interface. +Copyright (C) 2015 Belledonne Communications + +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. +*/ + +#include +#include +#include "status_icon.h" +#include "linphone.h" + +struct _LinphoneStatusIconParams { + char *title; + GtkWidget *menu; + LinphoneStatusIconOnClickCallback on_click_cb; + void *user_data; + int ref; +}; + +LinphoneStatusIconParams *linphone_status_icon_params_new(void) { + return g_new0(LinphoneStatusIconParams, 1); +} + +LinphoneStatusIconParams *linphone_status_icon_params_ref(LinphoneStatusIconParams *obj) { + obj->ref++; + return obj; +} + +void linphone_status_icon_params_unref(LinphoneStatusIconParams *obj) { + obj->ref--; + if(obj->ref < 0) { + if(obj->title) g_free(obj->title); + if(obj->menu) g_object_unref(obj->menu); + g_free(obj); + } +} + +void linphone_status_icon_params_set_title(LinphoneStatusIconParams *obj, const char *title) { + if(obj->title) g_free(obj->title); + if(title) obj->title = g_strdup(title); + else obj->title = NULL; +} + +void linphone_status_icon_params_set_menu(LinphoneStatusIconParams *obj, GtkWidget *menu) { + if(obj->menu) g_object_unref(obj->menu); + if(menu) obj->menu = g_object_ref(menu); + else obj->menu = NULL; +} + +void linphone_status_icon_params_set_on_click_cb(LinphoneStatusIconParams *obj, LinphoneStatusIconOnClickCallback cb, void *user_data) { + obj->on_click_cb = cb; + obj->user_data = user_data; +} + + +typedef void (*LinphoneStatusIconDescInitFunc)(LinphoneStatusIcon *obj); +typedef void (*LinphoneStatusIconDescUninitFunc)(LinphoneStatusIcon *obj); +typedef void (*LinphoneStatusIconDescStartFunc)(LinphoneStatusIcon *obj); +typedef void (*LinphoneStatusIconDescEnableBlinkingFunc)(LinphoneStatusIcon *obj, gboolean enable); +typedef gboolean (*LinphoneStatusIconDescIsSupported)(void); + +typedef struct { + const char *impl_name; + LinphoneStatusIconDescInitFunc init; + LinphoneStatusIconDescUninitFunc uninit; + LinphoneStatusIconDescStartFunc start; + LinphoneStatusIconDescEnableBlinkingFunc enable_blinking; + LinphoneStatusIconDescIsSupported is_supported; +} _LinphoneStatusIconDesc; + +static const _LinphoneStatusIconDesc *_linphone_status_icon_impls[]; + +static const _LinphoneStatusIconDesc *_status_icon_find_instance(void) { + int i; + for(i=0; _linphone_status_icon_impls[i] && !_linphone_status_icon_impls[i]->is_supported(); i++); + return _linphone_status_icon_impls[i]; +} + + +struct _LinphoneStatusIcon { + const _LinphoneStatusIconDesc *desc; + LinphoneStatusIconParams *params; + void *data; +}; + +static LinphoneStatusIcon *_linphone_status_icon_new(const _LinphoneStatusIconDesc *desc) { + LinphoneStatusIcon *si = (LinphoneStatusIcon *)g_new0(LinphoneStatusIcon, 1); + si->desc = desc; + if(desc->init) desc->init(si); + return si; +} + +static void _linphone_status_icon_free(LinphoneStatusIcon *obj) { + if(obj->desc->uninit) obj->desc->uninit(obj->data); + g_free(obj); +} + +const char *linphone_status_icon_get_implementation_name(const LinphoneStatusIcon *obj) { + return obj->desc->impl_name; +} + +void linphone_status_icon_start(LinphoneStatusIcon *obj, LinphoneStatusIconParams *params) { + obj->params = linphone_status_icon_params_ref(params); + obj->desc->start(obj); +} + +void linphone_status_icon_enable_blinking(LinphoneStatusIcon *obj, gboolean enable) { + obj->desc->enable_blinking(obj, enable); +} + +static void _linphone_status_icon_notify_click(LinphoneStatusIcon *obj) { + if(obj->params->on_click_cb) { + obj->params->on_click_cb(obj, obj->params->user_data); + } +} + + +static LinphoneStatusIcon *_linphone_status_icon_instance = NULL; + +static void _linphone_status_icon_free_singleton(void) { + _linphone_status_icon_free(_linphone_status_icon_instance); +} + +LinphoneStatusIcon *linphone_status_icon_get(void) { + if(_linphone_status_icon_instance == NULL) { + const _LinphoneStatusIconDesc *desc = _status_icon_find_instance(); + if(desc) { + _linphone_status_icon_instance = _linphone_status_icon_new(desc); + atexit(_linphone_status_icon_free_singleton); + } + } + return _linphone_status_icon_instance; +} + + +/* GtkStatusIcon implementation */ +static void _linphone_status_icon_impl_gtk_on_click_cb(LinphoneStatusIcon *si) { + _linphone_status_icon_notify_click(si); +} + +static void _linphone_status_icon_impl_gtk_popup_menu(GtkStatusIcon *status_icon, guint button, guint activate_time, LinphoneStatusIcon *si){ + GtkWidget *menu = si->params->menu; + gtk_menu_popup(GTK_MENU(menu),NULL,NULL,gtk_status_icon_position_menu,status_icon,button,activate_time); +} + +static void _linphone_status_icon_impl_gtk_init(LinphoneStatusIcon *si) { + const char *icon_path=linphone_gtk_get_ui_config("icon",LINPHONE_ICON); + const char *call_icon_path=linphone_gtk_get_ui_config("start_call_icon","startcall-green.png"); + GdkPixbuf *pbuf=create_pixbuf(icon_path); + GtkStatusIcon *icon=gtk_status_icon_new_from_pixbuf(pbuf); + g_signal_connect_swapped(G_OBJECT(icon),"activate", G_CALLBACK(_linphone_status_icon_impl_gtk_on_click_cb), si); + g_signal_connect(G_OBJECT(icon), "popup-menu", G_CALLBACK(_linphone_status_icon_impl_gtk_popup_menu), si); + g_object_set_data(G_OBJECT(icon),"icon",pbuf); + g_object_unref(pbuf); + pbuf=create_pixbuf(call_icon_path); + g_object_set_data(G_OBJECT(icon),"call_icon",pbuf); + g_object_unref(pbuf); + si->data = icon; +} + +// static void _linphone_status_icon_impl_gtk_uninit(LinphoneStatusIcon *si) { +// g_object_unref((GtkStatusIcon *)si->data); +// } + +static void _linphone_status_icon_impl_gtk_start(LinphoneStatusIcon *si) { + GtkStatusIcon *icon = GTK_STATUS_ICON(si->data); +#if GTK_CHECK_VERSION(2,20,2) + gtk_status_icon_set_name(icon, si->params->title); +#endif + gtk_status_icon_set_visible(icon,TRUE); +} + +static gboolean _linphone_status_icon_impl_gtk_do_icon_blink_cb(GtkStatusIcon *gi){ + GdkPixbuf *call_icon=g_object_get_data(G_OBJECT(gi),"call_icon"); + GdkPixbuf *normal_icon=g_object_get_data(G_OBJECT(gi),"icon"); + GdkPixbuf *cur_icon=gtk_status_icon_get_pixbuf(gi); + if (cur_icon==call_icon){ + gtk_status_icon_set_from_pixbuf(gi,normal_icon); + }else{ + gtk_status_icon_set_from_pixbuf(gi,call_icon); + } + return TRUE; +} + +static void _linphone_status_icon_impl_enable_blinking(LinphoneStatusIcon *si, gboolean val) { + GtkStatusIcon *icon = GTK_STATUS_ICON(si->data); +#ifdef HAVE_GTK_OSX + static gint attention_id; + GtkosxApplication *theMacApp=gtkosx_application_get(); + if (val) + attention_id=gtkosx_application_attention_request(theMacApp,CRITICAL_REQUEST); + else gtkosx_application_cancel_attention_request(theMacApp,attention_id); +#else + guint tout; + tout=(unsigned)GPOINTER_TO_INT(g_object_get_data(G_OBJECT(icon),"timeout")); + if (val && tout==0){ + tout=g_timeout_add(500,(GSourceFunc)_linphone_status_icon_impl_gtk_do_icon_blink_cb,icon); + g_object_set_data(G_OBJECT(icon),"timeout",GINT_TO_POINTER(tout)); + }else if (!val && tout!=0){ + GdkPixbuf *normal_icon=g_object_get_data(G_OBJECT(icon),"icon"); + g_source_remove(tout); + g_object_set_data(G_OBJECT(icon),"timeout",NULL); + gtk_status_icon_set_from_pixbuf(icon,normal_icon); + } +#endif +} + +static gboolean _linphone_status_icon_impl_is_supported(void) { +#ifndef HAVE_GTK_OSX + return 1; +#else + return 0; +#endif +} + +static const _LinphoneStatusIconDesc _linphone_status_icon_impl_gtk_desc = { + .impl_name = "gtk_status_icon", + .init = _linphone_status_icon_impl_gtk_init, + .uninit = NULL, + .start = _linphone_status_icon_impl_gtk_start, + .enable_blinking = _linphone_status_icon_impl_enable_blinking, + .is_supported = _linphone_status_icon_impl_is_supported +}; + +static const _LinphoneStatusIconDesc *_linphone_status_icon_impls[] = { + &_linphone_status_icon_impl_gtk_desc, + NULL +}; diff --git a/gtk/status_icon.h b/gtk/status_icon.h new file mode 100644 index 000000000..630a7493e --- /dev/null +++ b/gtk/status_icon.h @@ -0,0 +1,42 @@ +/* +linphone, gtk-glade interface. +Copyright (C) 2015 Belledonne Communications + +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. +*/ + +#include + +struct _LinphoneStatusIcon; +typedef void (*LinphoneStatusIconOnClickCallback)(struct _LinphoneStatusIcon *si, void *user_data); + + +typedef struct _LinphoneStatusIconParams LinphoneStatusIconParams; + +LinphoneStatusIconParams *linphone_status_icon_params_new(void); +LinphoneStatusIconParams *linphone_status_icon_params_ref(LinphoneStatusIconParams *obj); +void linphone_status_icon_params_unref(LinphoneStatusIconParams *obj); + +void linphone_status_icon_params_set_title(LinphoneStatusIconParams *obj, const char *title); +void linphone_status_icon_params_set_menu(LinphoneStatusIconParams *obj, GtkWidget *menu); +void linphone_status_icon_params_set_on_click_cb(LinphoneStatusIconParams* obj, LinphoneStatusIconOnClickCallback cb, void *user_data); + + +typedef struct _LinphoneStatusIcon LinphoneStatusIcon; + +LinphoneStatusIcon *linphone_status_icon_get(void); +const char *linphone_status_icon_get_implementation_name(const LinphoneStatusIcon *obj); +void linphone_status_icon_start(LinphoneStatusIcon *obj, LinphoneStatusIconParams *params); +void linphone_status_icon_enable_blinking(LinphoneStatusIcon *obj, gboolean enable); From 752de821b097130350d9c8b435c8faa593037816 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Grisez?= Date: Wed, 22 Apr 2015 23:12:05 +0200 Subject: [PATCH 054/157] Add an implementation to the StatusIcon interface based on GtkosxApplication --- gtk/status_icon.c | 53 ++++++++++++++++++++++++++++++++++------------- gtk/status_icon.h | 1 + 2 files changed, 40 insertions(+), 14 deletions(-) diff --git a/gtk/status_icon.c b/gtk/status_icon.c index d57a04f10..4ff492468 100644 --- a/gtk/status_icon.c +++ b/gtk/status_icon.c @@ -17,11 +17,13 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#include -#include #include "status_icon.h" #include "linphone.h" +#ifdef HAVE_GTK_OSX +#include +#endif + struct _LinphoneStatusIconParams { char *title; GtkWidget *menu; @@ -147,6 +149,7 @@ LinphoneStatusIcon *linphone_status_icon_get(void) { /* GtkStatusIcon implementation */ +#ifndef HAVE_GTK_OSX static void _linphone_status_icon_impl_gtk_on_click_cb(LinphoneStatusIcon *si) { _linphone_status_icon_notify_click(si); } @@ -197,13 +200,6 @@ static gboolean _linphone_status_icon_impl_gtk_do_icon_blink_cb(GtkStatusIcon *g static void _linphone_status_icon_impl_enable_blinking(LinphoneStatusIcon *si, gboolean val) { GtkStatusIcon *icon = GTK_STATUS_ICON(si->data); -#ifdef HAVE_GTK_OSX - static gint attention_id; - GtkosxApplication *theMacApp=gtkosx_application_get(); - if (val) - attention_id=gtkosx_application_attention_request(theMacApp,CRITICAL_REQUEST); - else gtkosx_application_cancel_attention_request(theMacApp,attention_id); -#else guint tout; tout=(unsigned)GPOINTER_TO_INT(g_object_get_data(G_OBJECT(icon),"timeout")); if (val && tout==0){ @@ -215,15 +211,10 @@ static void _linphone_status_icon_impl_enable_blinking(LinphoneStatusIcon *si, g g_object_set_data(G_OBJECT(icon),"timeout",NULL); gtk_status_icon_set_from_pixbuf(icon,normal_icon); } -#endif } static gboolean _linphone_status_icon_impl_is_supported(void) { -#ifndef HAVE_GTK_OSX return 1; -#else - return 0; -#endif } static const _LinphoneStatusIconDesc _linphone_status_icon_impl_gtk_desc = { @@ -234,8 +225,42 @@ static const _LinphoneStatusIconDesc _linphone_status_icon_impl_gtk_desc = { .enable_blinking = _linphone_status_icon_impl_enable_blinking, .is_supported = _linphone_status_icon_impl_is_supported }; +#endif + + +/* GtkosxApplication implementation */ +#ifdef HAVE_GTK_OSX +static void _linphone_status_icon_impl_gtkosx_app_enable_blinking(StatusIcon *si, gboolean val) { + GtkosxApplication *theMacApp=gtkosx_application_get(); + gint *attention_id = (gint *)&si->data; + if (val && *attention_id == 0) { + *attention_id=gtkosx_application_attention_request(theMacApp,CRITICAL_REQUEST); + } else if(!val && *attention_id != 0) { + gtkosx_application_cancel_attention_request(theMacApp, *attention_id); + *attention_id = 0; + } +} + +static gboolean _linphone_satus_icon_impl_gtkosx_app_is_supported(void) { + return 1; +} + +static const _LinphoneStatusIconDesc _linphone_status_icon_impl_gtkosx_app_desc = { + .impl_name = "gtkosx_application", + .init = NULL, + .uninit = NULL, + .start = NULL, + .enable_blinking = _linphone_status_icon_impl_gtkosx_app_enable_blinking, + .is_supported = _linphone_satus_icon_impl_gtkosx_app_is_supported +}; +#endif + static const _LinphoneStatusIconDesc *_linphone_status_icon_impls[] = { +#ifndef HAVE_GTK_OSX &_linphone_status_icon_impl_gtk_desc, +#else + &_linphone_status_icon_impl_gtkosx_app_desc, +#endif NULL }; diff --git a/gtk/status_icon.h b/gtk/status_icon.h index 630a7493e..0abaa60d7 100644 --- a/gtk/status_icon.h +++ b/gtk/status_icon.h @@ -17,6 +17,7 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +#include #include struct _LinphoneStatusIcon; From a0c195aa8f1548f32d730f88e30b30581356cf5c Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Thu, 23 Apr 2015 09:24:51 +0200 Subject: [PATCH 055/157] bc_tester_utils: fix include paths --- mediastreamer2 | 2 +- tester/common/bc_tester_utils.c | 2 +- tester/common/bc_tester_utils.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mediastreamer2 b/mediastreamer2 index 2f9bbbd13..56c2598ce 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 2f9bbbd1368261f3f88802aecb9306e7b2e56084 +Subproject commit 56c2598ce0d7c7b4aca22d89e35d882ccbd88f81 diff --git a/tester/common/bc_tester_utils.c b/tester/common/bc_tester_utils.c index 22d74cd02..77eb0372c 100644 --- a/tester/common/bc_tester_utils.c +++ b/tester/common/bc_tester_utils.c @@ -22,8 +22,8 @@ along with this program. If not, see . #include "bc_tester_utils.h" -#include #include + #include "CUnit/Automated.h" #if WINAPI_FAMILY_PHONE_APP diff --git a/tester/common/bc_tester_utils.h b/tester/common/bc_tester_utils.h index 815e74eb6..d035c4b57 100644 --- a/tester/common/bc_tester_utils.h +++ b/tester/common/bc_tester_utils.h @@ -21,7 +21,7 @@ #define TESTER_UTILS_H #include "CUnit/Basic.h" -#include +#include extern const char *bc_tester_read_dir_prefix; extern const char *bc_tester_writable_dir_prefix; From dd885db59a6b2353627f777ae195ef3072a73286 Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Thu, 23 Apr 2015 11:02:19 +0200 Subject: [PATCH 056/157] bc_tester_utils.h: fix missing stdarg.h --- mediastreamer2 | 2 +- tester/common/bc_tester_utils.h | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index 56c2598ce..cbf8b3e2c 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 56c2598ce0d7c7b4aca22d89e35d882ccbd88f81 +Subproject commit cbf8b3e2cb1312ec361a3123e26d68aa4dc8ef81 diff --git a/tester/common/bc_tester_utils.h b/tester/common/bc_tester_utils.h index d035c4b57..32fdf89a8 100644 --- a/tester/common/bc_tester_utils.h +++ b/tester/common/bc_tester_utils.h @@ -22,6 +22,7 @@ #include "CUnit/Basic.h" #include +#include extern const char *bc_tester_read_dir_prefix; extern const char *bc_tester_writable_dir_prefix; From 9cb0974eb4fb262c33ad95e9191c52c218379033 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Grisez?= Date: Thu, 23 Apr 2015 23:31:52 +0200 Subject: [PATCH 057/157] Support of asynchrone status icon implementations --- gtk/main.c | 23 ++++---- gtk/status_icon.c | 136 ++++++++++++++++++++++++++++++++++++++++------ gtk/status_icon.h | 4 ++ 3 files changed, 135 insertions(+), 28 deletions(-) diff --git a/gtk/main.c b/gtk/main.c index d4f5d6718..eb24746cf 100644 --- a/gtk/main.c +++ b/gtk/main.c @@ -1549,16 +1549,18 @@ static void handle_icon_click(LinphoneStatusIcon *si, void *user_data) { } static void linphone_gtk_init_status_icon(void) { - LinphoneStatusIcon *icon = linphone_status_icon_get(); - if(icon) { - GtkWidget *menu = create_icon_menu(); - LinphoneStatusIconParams *params = linphone_status_icon_params_new(); - linphone_status_icon_params_set_menu(params, menu); - linphone_status_icon_params_set_title(params, _("Linphone - a video internet phone")); - linphone_status_icon_params_set_on_click_cb(params, handle_icon_click, NULL); - linphone_status_icon_start(icon, params); - g_object_unref(G_OBJECT(menu)); - linphone_status_icon_params_unref(params); + if(linphone_status_icon_init(NULL, NULL)) { + LinphoneStatusIcon *icon = linphone_status_icon_get(); + if(icon) { + GtkWidget *menu = create_icon_menu(); + LinphoneStatusIconParams *params = linphone_status_icon_params_new(); + linphone_status_icon_params_set_menu(params, menu); + linphone_status_icon_params_set_title(params, _("Linphone - a video internet phone")); + linphone_status_icon_params_set_on_click_cb(params, handle_icon_click, NULL); + linphone_status_icon_start(icon, params); + g_object_unref(G_OBJECT(menu)); + linphone_status_icon_params_unref(params); + } } } @@ -1973,6 +1975,7 @@ static void linphone_gtk_quit(void){ #ifdef HAVE_NOTIFY notify_uninit(); #endif + linphone_status_icon_uninit(); gtk_widget_destroy(the_ui); the_ui=NULL; gdk_threads_leave(); diff --git a/gtk/status_icon.c b/gtk/status_icon.c index 4ff492468..0b46aecb6 100644 --- a/gtk/status_icon.c +++ b/gtk/status_icon.c @@ -24,6 +24,13 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #endif +typedef struct __LinphoneStatusIconDesc _LinphoneStatusIconDesc; + +static LinphoneStatusIcon *_linphone_status_icon_instance = NULL; +static const _LinphoneStatusIconDesc *_linphone_status_icon_selected_desc = NULL; +static const _LinphoneStatusIconDesc *_linphone_status_icon_impls[]; + + struct _LinphoneStatusIconParams { char *title; GtkWidget *menu; @@ -72,23 +79,91 @@ typedef void (*LinphoneStatusIconDescInitFunc)(LinphoneStatusIcon *obj); typedef void (*LinphoneStatusIconDescUninitFunc)(LinphoneStatusIcon *obj); typedef void (*LinphoneStatusIconDescStartFunc)(LinphoneStatusIcon *obj); typedef void (*LinphoneStatusIconDescEnableBlinkingFunc)(LinphoneStatusIcon *obj, gboolean enable); -typedef gboolean (*LinphoneStatusIconDescIsSupported)(void); +typedef void (*LinphoneStatusIconDescIsSupportedResultCb)(const _LinphoneStatusIconDesc *obj, gboolean result, void *user_data); +typedef gboolean (*LinphoneStatusIconDescIsSupportedFunc)( + const _LinphoneStatusIconDesc *desc, + gboolean *result, + LinphoneStatusIconDescIsSupportedResultCb cb, + void *user_data +); +typedef void (*LinphoneStatusIconDescFindResultCb)(const _LinphoneStatusIconDesc *desc, void *user_data); -typedef struct { +struct __LinphoneStatusIconDesc { const char *impl_name; LinphoneStatusIconDescInitFunc init; LinphoneStatusIconDescUninitFunc uninit; LinphoneStatusIconDescStartFunc start; LinphoneStatusIconDescEnableBlinkingFunc enable_blinking; - LinphoneStatusIconDescIsSupported is_supported; -} _LinphoneStatusIconDesc; + LinphoneStatusIconDescIsSupportedFunc is_supported; +}; -static const _LinphoneStatusIconDesc *_linphone_status_icon_impls[]; +static gboolean _linphone_status_icon_desc_is_supported( + const _LinphoneStatusIconDesc *desc, + gboolean *result, + LinphoneStatusIconDescIsSupportedResultCb cb, + void *user_data) { + + return desc->is_supported(desc, result, cb, user_data); +} -static const _LinphoneStatusIconDesc *_status_icon_find_instance(void) { +typedef struct { int i; - for(i=0; _linphone_status_icon_impls[i] && !_linphone_status_icon_impls[i]->is_supported(); i++); - return _linphone_status_icon_impls[i]; + LinphoneStatusIconDescFindResultCb cb; + void *user_data; +} _LinphoneStatusIconDescSearchCtx; + +static void _linphone_status_icon_desc_is_supprted_result_cb( + const _LinphoneStatusIconDesc *desc, + gboolean result, + _LinphoneStatusIconDescSearchCtx *ctx) { + + if(!result) { + ctx->i++; + for(; _linphone_status_icon_impls[ctx->i]; ctx->i++) { + if(_linphone_status_icon_desc_is_supported( + _linphone_status_icon_impls[ctx->i], + &result, + (LinphoneStatusIconDescIsSupportedResultCb)_linphone_status_icon_desc_is_supprted_result_cb, + ctx)) { + + if(result) break; + } else return; + } + } + if(ctx->cb) ctx->cb(_linphone_status_icon_impls[ctx->i], ctx->user_data); + g_free(ctx); +} + +static gboolean _linphone_status_icon_find_first_available_impl( + const _LinphoneStatusIconDesc **desc, + LinphoneStatusIconDescFindResultCb cb, + void *user_data) { + + gboolean result; + _LinphoneStatusIconDescSearchCtx *ctx = g_new0(_LinphoneStatusIconDescSearchCtx, 1); + ctx->cb = cb; + ctx->user_data = user_data; + + for(ctx->i=0; _linphone_status_icon_impls[ctx->i]; ctx->i++) { + if(_linphone_status_icon_desc_is_supported( + _linphone_status_icon_impls[ctx->i], + &result, + (LinphoneStatusIconDescIsSupportedResultCb)_linphone_status_icon_desc_is_supprted_result_cb, + ctx)) { + + if(result) { + *desc = _linphone_status_icon_impls[ctx->i]; + goto sync_return; + } + } else { + return 0; + } + } + *desc = NULL; + +sync_return: + g_free(ctx); + return 1; } @@ -130,19 +205,32 @@ static void _linphone_status_icon_notify_click(LinphoneStatusIcon *obj) { } -static LinphoneStatusIcon *_linphone_status_icon_instance = NULL; +void _linphone_status_icon_init_cb(const _LinphoneStatusIconDesc *desc, void *user_data) { + void **ctx = (void **)user_data; + LinphoneStatusIconReadyCb cb = (LinphoneStatusIconReadyCb)ctx[0]; + _linphone_status_icon_selected_desc = desc; + if(cb) cb(ctx[1]); + g_free(ctx); +} -static void _linphone_status_icon_free_singleton(void) { - _linphone_status_icon_free(_linphone_status_icon_instance); +gboolean linphone_status_icon_init(LinphoneStatusIconReadyCb ready_cb, void *user_data) { + const _LinphoneStatusIconDesc *desc; + void **ctx = g_new(void *, 2); + if(_linphone_status_icon_find_first_available_impl(&desc, _linphone_status_icon_init_cb, ctx)) { + _linphone_status_icon_selected_desc = desc; + g_free(ctx); + return 1; + } else return 0; +} + +void linphone_status_icon_uninit(void) { + if(_linphone_status_icon_instance) _linphone_status_icon_free(_linphone_status_icon_instance); } LinphoneStatusIcon *linphone_status_icon_get(void) { if(_linphone_status_icon_instance == NULL) { - const _LinphoneStatusIconDesc *desc = _status_icon_find_instance(); - if(desc) { - _linphone_status_icon_instance = _linphone_status_icon_new(desc); - atexit(_linphone_status_icon_free_singleton); - } + if(_linphone_status_icon_selected_desc) + _linphone_status_icon_instance = _linphone_status_icon_new(_linphone_status_icon_selected_desc); } return _linphone_status_icon_instance; } @@ -213,7 +301,13 @@ static void _linphone_status_icon_impl_enable_blinking(LinphoneStatusIcon *si, g } } -static gboolean _linphone_status_icon_impl_is_supported(void) { +static gboolean _linphone_status_icon_impl_is_supported( + const _LinphoneStatusIconDesc *desc, + gboolean *result, + LinphoneStatusIconDescIsSupportedResultCb cb, + void *user_data) { + + *result = 1; return 1; } @@ -241,7 +335,13 @@ static void _linphone_status_icon_impl_gtkosx_app_enable_blinking(StatusIcon *si } } -static gboolean _linphone_satus_icon_impl_gtkosx_app_is_supported(void) { +static gboolean _linphone_satus_icon_impl_gtkosx_app_is_supported( + const _LinphoneStatusIconDesc *desc, + gboolean *result, + LinphoneStatusIconDescIsSupportedResultCb cb, + void *user_data) { + + *result = 1; return 1; } diff --git a/gtk/status_icon.h b/gtk/status_icon.h index 0abaa60d7..de0dd9951 100644 --- a/gtk/status_icon.h +++ b/gtk/status_icon.h @@ -35,8 +35,12 @@ void linphone_status_icon_params_set_menu(LinphoneStatusIconParams *obj, GtkWidg void linphone_status_icon_params_set_on_click_cb(LinphoneStatusIconParams* obj, LinphoneStatusIconOnClickCallback cb, void *user_data); +typedef void (*LinphoneStatusIconReadyCb)(void *user_data); + typedef struct _LinphoneStatusIcon LinphoneStatusIcon; +gboolean linphone_status_icon_init(LinphoneStatusIconReadyCb ready_cb, void* user_data); +void linphone_status_icon_uninit(void); LinphoneStatusIcon *linphone_status_icon_get(void); const char *linphone_status_icon_get_implementation_name(const LinphoneStatusIcon *obj); void linphone_status_icon_start(LinphoneStatusIcon *obj, LinphoneStatusIconParams *params); From 7a969dbd7a60aff6faf9d268c0eec0c6bac1382b Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Thu, 23 Apr 2015 16:45:09 +0200 Subject: [PATCH 058/157] linphonecore: add linphone_call_stats_get_rtp_stats API to easily retrieve rtp stats --- coreapi/linphonecall.c | 28 ++++++++++++++++------------ coreapi/linphonecore.h | 1 + 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c index 894d8cd08..4c149b6a2 100644 --- a/coreapi/linphonecall.c +++ b/coreapi/linphonecall.c @@ -3267,23 +3267,27 @@ float linphone_call_stats_get_receiver_interarrival_jitter(const LinphoneCallSta return (float)report_block_get_interarrival_jitter(rrb) / (float)pt->clock_rate; } +rtp_stats_t linphone_call_stats_get_rtp_stats(const LinphoneCallStats *stats, LinphoneCall *call) { + rtp_stats_t rtp_stats; + memset(&rtp_stats, 0, sizeof(rtp_stats)); + + if (stats && call) { + if (stats->type == LINPHONE_CALL_STATS_AUDIO && call->audiostream != NULL) + audio_stream_get_local_rtp_stats(call->audiostream, &rtp_stats); + #ifdef VIDEO_ENABLED + else if (call->videostream != NULL) + video_stream_get_local_rtp_stats(call->videostream, &rtp_stats); + #endif + } + return rtp_stats; +} + /** * Gets the cumulative number of late packets * @return The cumulative number of late packets **/ uint64_t linphone_call_stats_get_late_packets_cumulative_number(const LinphoneCallStats *stats, LinphoneCall *call) { - rtp_stats_t rtp_stats; - - if (!stats || !call) - return 0; - memset(&rtp_stats, 0, sizeof(rtp_stats)); - if (stats->type == LINPHONE_CALL_STATS_AUDIO && call->audiostream != NULL) - audio_stream_get_local_rtp_stats(call->audiostream, &rtp_stats); -#ifdef VIDEO_ENABLED - else if (call->videostream != NULL) - video_stream_get_local_rtp_stats(call->videostream, &rtp_stats); -#endif - return rtp_stats.outoftime; + return linphone_call_stats_get_rtp_stats(stats, call).outoftime; } /** diff --git a/coreapi/linphonecore.h b/coreapi/linphonecore.h index 662637bba..c2488a050 100644 --- a/coreapi/linphonecore.h +++ b/coreapi/linphonecore.h @@ -561,6 +561,7 @@ LINPHONE_PUBLIC float linphone_call_stats_get_sender_loss_rate(const LinphoneCal LINPHONE_PUBLIC float linphone_call_stats_get_receiver_loss_rate(const LinphoneCallStats *stats); LINPHONE_PUBLIC float linphone_call_stats_get_sender_interarrival_jitter(const LinphoneCallStats *stats, LinphoneCall *call); LINPHONE_PUBLIC float linphone_call_stats_get_receiver_interarrival_jitter(const LinphoneCallStats *stats, LinphoneCall *call); +LINPHONE_PUBLIC rtp_stats_t linphone_call_stats_get_rtp_stats(const LinphoneCallStats *statss, LinphoneCall *call); LINPHONE_PUBLIC uint64_t linphone_call_stats_get_late_packets_cumulative_number(const LinphoneCallStats *stats, LinphoneCall *call); LINPHONE_PUBLIC float linphone_call_stats_get_download_bandwidth(const LinphoneCallStats *stats); LINPHONE_PUBLIC float linphone_call_stats_get_upload_bandwidth(const LinphoneCallStats *stats); From 76e77e59b0edf2c4ad7de0f9870f0b305743e63c Mon Sep 17 00:00:00 2001 From: Guillaume BIENKOWSKI Date: Fri, 24 Apr 2015 14:31:20 +0200 Subject: [PATCH 059/157] Some typos in README --- README | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README b/README index 0de3185c3..94ad9602a 100644 --- a/README +++ b/README @@ -59,14 +59,14 @@ For windows compilation see README.mingw. For macOS X, see README.macos -******************************** notes for developers: ***************************** +******************************** Notes for developers ***************************** Here is a short description of the content of the source tree. - oRTP/ is a poweful implementation of the RTP protocol. See the oRTP/README for more details. - It is used by the mediastreamer to send and receive streams to the network. + It is used by mediastreamer2 to send and receive streams to the network. -- mediastreamer2/ is one of the important part of linphone. It is a framework library for audio +- mediastreamer2/ is one of the important part of linphone. It is a framework for audio and video processing. It contains several objects for grabing audio and video and outputing it (through rtp, to file). It contains also codec objects to compress audio and video streams. From 8c80a9912b196526ecdd0c67ddfd059282b21b3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Grisez?= Date: Sat, 25 Apr 2015 20:36:06 +0200 Subject: [PATCH 060/157] Add the StatusNotifier implementation --- gtk/CMakeLists.txt | 1 + gtk/Makefile.am | 1 + gtk/main.c | 28 +- gtk/status_icon.c | 121 +++++++- gtk/status_notifier.c | 633 ++++++++++++++++++++++++++++++++++++++++++ gtk/status_notifier.h | 156 +++++++++++ 6 files changed, 931 insertions(+), 9 deletions(-) create mode 100644 gtk/status_notifier.c create mode 100644 gtk/status_notifier.h diff --git a/gtk/CMakeLists.txt b/gtk/CMakeLists.txt index bacbb448f..848a872b9 100644 --- a/gtk/CMakeLists.txt +++ b/gtk/CMakeLists.txt @@ -65,6 +65,7 @@ set(SOURCE_FILES propertybox.c singleinstance.c status_icon.c + status_notifier.c support.c update.c utils.c diff --git a/gtk/Makefile.am b/gtk/Makefile.am index 03c209b55..95a06789d 100644 --- a/gtk/Makefile.am +++ b/gtk/Makefile.am @@ -56,6 +56,7 @@ linphone_SOURCES= \ audio_assistant.c \ videowindow.c \ status_icon.c \ + status_notifier.c \ linphone.h if BUILD_WIZARD linphone_SOURCES+= \ diff --git a/gtk/main.c b/gtk/main.c index eb24746cf..fc689a5b6 100644 --- a/gtk/main.c +++ b/gtk/main.c @@ -1548,19 +1548,31 @@ static void handle_icon_click(LinphoneStatusIcon *si, void *user_data) { } } +static void linphone_gtk_status_icon_initialised_cb(LinphoneStatusIconParams *params) { + LinphoneStatusIcon *icon = linphone_status_icon_get(); + if(icon) { + linphone_status_icon_start(icon, params); + } + linphone_status_icon_params_unref(params); +} + static void linphone_gtk_init_status_icon(void) { - if(linphone_status_icon_init(NULL, NULL)) { + GtkWidget *menu = create_icon_menu(); + LinphoneStatusIconParams *params = linphone_status_icon_params_new(); + linphone_status_icon_params_set_menu(params, menu); + linphone_status_icon_params_set_title(params, _("Linphone - a video internet phone")); + linphone_status_icon_params_set_on_click_cb(params, handle_icon_click, NULL); + g_object_unref(G_OBJECT(menu)); + + if(linphone_status_icon_init( + (LinphoneStatusIconReadyCb)linphone_gtk_status_icon_initialised_cb, + params)) { + LinphoneStatusIcon *icon = linphone_status_icon_get(); if(icon) { - GtkWidget *menu = create_icon_menu(); - LinphoneStatusIconParams *params = linphone_status_icon_params_new(); - linphone_status_icon_params_set_menu(params, menu); - linphone_status_icon_params_set_title(params, _("Linphone - a video internet phone")); - linphone_status_icon_params_set_on_click_cb(params, handle_icon_click, NULL); linphone_status_icon_start(icon, params); - g_object_unref(G_OBJECT(menu)); - linphone_status_icon_params_unref(params); } + linphone_status_icon_params_unref(params); } } diff --git a/gtk/status_icon.c b/gtk/status_icon.c index 0b46aecb6..daf00203d 100644 --- a/gtk/status_icon.c +++ b/gtk/status_icon.c @@ -24,6 +24,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #endif +#include "status_notifier.h" + typedef struct __LinphoneStatusIconDesc _LinphoneStatusIconDesc; static LinphoneStatusIcon *_linphone_status_icon_instance = NULL; @@ -216,6 +218,8 @@ void _linphone_status_icon_init_cb(const _LinphoneStatusIconDesc *desc, void *us gboolean linphone_status_icon_init(LinphoneStatusIconReadyCb ready_cb, void *user_data) { const _LinphoneStatusIconDesc *desc; void **ctx = g_new(void *, 2); + ctx[0] = ready_cb; + ctx[1] = user_data; if(_linphone_status_icon_find_first_available_impl(&desc, _linphone_status_icon_init_cb, ctx)) { _linphone_status_icon_selected_desc = desc; g_free(ctx); @@ -335,7 +339,7 @@ static void _linphone_status_icon_impl_gtkosx_app_enable_blinking(StatusIcon *si } } -static gboolean _linphone_satus_icon_impl_gtkosx_app_is_supported( +static gboolean _linphone_status_icon_impl_gtkosx_app_is_supported( const _LinphoneStatusIconDesc *desc, gboolean *result, LinphoneStatusIconDescIsSupportedResultCb cb, @@ -356,7 +360,122 @@ static const _LinphoneStatusIconDesc _linphone_status_icon_impl_gtkosx_app_desc #endif +/* Implementation based on the StatusNotifier Freedesktop standard */ +typedef struct { + int x; + int y; +} _LinphoneStatusIconPosition; + +static void _linphone_status_icon_impl_sn_init(LinphoneStatusIcon *si) { + si->data = bc_status_notifier_new(); +} + +static void _linphone_status_icon_impl_sn_uninit(LinphoneStatusIcon *si) { + bc_status_notifier_unref((BcStatusNotifier *)si->data); +} + +static void _linphone_status_icon_impl_sn_activated_cb(BcStatusNotifier *sn, int x, int y, void *user_data) { + LinphoneStatusIcon *si = (LinphoneStatusIcon *)user_data; + _linphone_status_icon_notify_click(si); +} + +static void _linphone_status_icon_impr_sn_get_position(GtkMenu *menu, int *x, int *y, gboolean *push_in, gpointer data) { + _LinphoneStatusIconPosition *pos = (_LinphoneStatusIconPosition *)data; + *x = pos->x; + *y = pos->y; + *push_in = TRUE; +} + +static void _linphone_status_icon_impl_sn_menu_called_cb(BcStatusNotifier *sn, int x, int y, void *user_data) { + LinphoneStatusIcon *si = (LinphoneStatusIcon *)user_data; + GtkWidget *menu = si->params->menu; + _LinphoneStatusIconPosition pos = {x, y}; + gtk_menu_popup( + GTK_MENU(menu), + NULL, + NULL, + _linphone_status_icon_impr_sn_get_position, + &pos, + 0, + gtk_get_current_event_time() + ); +} + +static void _linphone_status_icon_impl_sn_start(LinphoneStatusIcon *si) { + BcStatusNotifier *sn = (BcStatusNotifier *)si->data; + BcStatusNotifierParams *params; + BcStatusNotifierToolTip *tooltip = bc_status_notifier_tool_tip_new("linphone", "Linphone", NULL); + BcStatusNotifierSignalsVTable vtable = {NULL}; + + vtable.activate_called_cb = _linphone_status_icon_impl_sn_activated_cb; + vtable.context_menu_called_cb = _linphone_status_icon_impl_sn_menu_called_cb; + + params = bc_status_notifier_params_new(); + bc_status_notifier_params_set_dbus_prefix(params, "org.kde"); + bc_status_notifier_params_set_category(params, BcStatusNotifierCategoryCommunications); + bc_status_notifier_params_set_id(params, "linphone"); + bc_status_notifier_params_set_title(params, "Linphone"); + bc_status_notifier_params_set_icon_name(params, "linphone"); + bc_status_notifier_params_set_tool_tip(params, tooltip); + bc_status_notifier_params_set_vtable(params, &vtable, si); + + bc_status_notifier_start(sn, params, NULL, NULL); + + bc_status_notifier_tool_tip_unref(tooltip); + bc_status_notifier_params_unref(params); +} + +static void _linphone_status_icon_impl_sn_enable_blinking(LinphoneStatusIcon *si, gboolean val) { + BcStatusNotifier *sn = (BcStatusNotifier *)si->data; + if(val) { + bc_status_notifier_update_status(sn, BcStatusNotifierStatusNeedsAttention); + } else { + bc_status_notifier_update_status(sn, BcStatusNotifierStatusPassive); + } +} + +static void _linphone_status_icon_impl_is_supported_cb(const char *prefix, gboolean result, void **data) { + _LinphoneStatusIconDesc *desc = (_LinphoneStatusIconDesc *)data[0]; + LinphoneStatusIconDescIsSupportedResultCb cb = (LinphoneStatusIconDescIsSupportedResultCb)data[1]; + if(cb) cb(desc, result, data[2]); + g_free(data); + g_free(desc); +} + +static gboolean _linphone_status_icon_impl_sn_is_supported( + const _LinphoneStatusIconDesc *desc, + gboolean *result, + LinphoneStatusIconDescIsSupportedResultCb cb, + void *user_data) { + + _LinphoneStatusIconDesc *desc2 = g_new(_LinphoneStatusIconDesc, 1); + void **data = g_new(void *, 3); + + *desc2 = *desc; + data[0] = desc2; + data[1] = cb; + data[2] = user_data; + bc_status_notifier_is_supported( + "org.kde", + (BcStatusNotifierSupportDetectionCb)_linphone_status_icon_impl_is_supported_cb, + data + ); + return 0; +} + +static const _LinphoneStatusIconDesc _linphone_status_icon_impl_status_notifier = { + .impl_name = "status_notifier", + .init = _linphone_status_icon_impl_sn_init, + .uninit = _linphone_status_icon_impl_sn_uninit, + .start = _linphone_status_icon_impl_sn_start, + .enable_blinking = _linphone_status_icon_impl_sn_enable_blinking, + .is_supported = _linphone_status_icon_impl_sn_is_supported +}; + + +/* List of implementations */ static const _LinphoneStatusIconDesc *_linphone_status_icon_impls[] = { + &_linphone_status_icon_impl_status_notifier, #ifndef HAVE_GTK_OSX &_linphone_status_icon_impl_gtk_desc, #else diff --git a/gtk/status_notifier.c b/gtk/status_notifier.c new file mode 100644 index 000000000..141308ff6 --- /dev/null +++ b/gtk/status_notifier.c @@ -0,0 +1,633 @@ +/* +linphone, gtk-glade interface. +Copyright (C) 2015 Belledonne Communications + +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. +*/ + +#include "status_notifier.h" +#include +#include +#include + + +static const gchar *_bc_status_notifier_category_to_string[] = { + "ApplicationStatus", + "Communications", + "SystemServices", + "Hardware" +}; + +const gchar *bc_status_notifier_category_to_string(BcStatusNotifierCategory c) { + return _bc_status_notifier_category_to_string[c]; +} + + +static const gchar *_bc_status_notifier_status_to_string[] = { + "Passive", + "Active" + "NeedsAttention" +}; + +const gchar *bc_status_notifier_status_to_string(BcStatusNotifierStatus s) { + return _bc_status_notifier_status_to_string[s]; +}; + + +struct _BcStatusNotifierToolTip { + char *icon_name; + char *title; + char *text; + int ref; +}; + +BcStatusNotifierToolTip *bc_status_notifier_tool_tip_new(const char *icon_name, const char *title, const char *text) { + BcStatusNotifierToolTip *obj = (BcStatusNotifierToolTip *)g_new0(BcStatusNotifierToolTip, 1); + if(icon_name) obj->icon_name = g_strdup(icon_name); + if(title) obj->title = g_strdup(title); + if(text) obj->text = g_strdup(text); + return obj; +} + +BcStatusNotifierToolTip *bc_status_notifier_tool_tip_ref(BcStatusNotifierToolTip *obj) { + obj->ref++; + return obj; +} + +void bc_status_notifier_tool_tip_unref(BcStatusNotifierToolTip *obj) { + obj->ref--; + if(obj->ref < 0) { + if(obj->icon_name) g_free(obj->icon_name); + if(obj->title) g_free(obj->title); + if(obj->text) g_free(obj->text); + g_free(obj); + } +} + +static GVariant *_bc_status_notifier_tool_tip_to_variant(const BcStatusNotifierToolTip *obj) { + GVariant *attr[] = { + g_variant_new_string(obj->icon_name ? obj->icon_name : ""), + g_variant_new_array(G_VARIANT_TYPE_VARIANT, NULL, 0), + g_variant_new_string(obj->title ? obj->title : ""), + g_variant_new_string(obj->text ? obj->text : ""), + }; + return g_variant_new_tuple(attr, 4); +} + + +static const char *_bc_status_notifier_to_string[] = { + "vertical", + "horizontal", + NULL +}; + +static BcStatusNotifierOrientation _bc_status_notifier_orientation_from_string(const char *s) { + int i; + for(i=0; _bc_status_notifier_to_string[i] && g_strcmp0(s, _bc_status_notifier_to_string[i]) == 0; i++); + if(_bc_status_notifier_to_string[i]) return i; + else return BcStatusNotifierOrientationVertical; +} + + +struct _BcStatusNotifierParams{ + char *prefix; + int item_id; + BcStatusNotifierCategory category; + char *id; + char *title; + BcStatusNotifierStatus status; + guint32 window_id; + char *icon_name; + char *overlay_icon_name; + char *attention_icon_name; + char *attention_movie_name; + BcStatusNotifierToolTip *tool_tip; + BcStatusNotifierSignalsVTable vtable; + void *user_data; + int ref; +}; + +#define DEFAULT_PREFIX "org.freedesktop" + +BcStatusNotifierParams *bc_status_notifier_params_new(void) { + BcStatusNotifierParams *obj = (BcStatusNotifierParams *)g_new0(BcStatusNotifierParams, 1); + obj->prefix = g_strdup(DEFAULT_PREFIX); + return obj; +} + +BcStatusNotifierParams *bc_status_notifier_params_ref(BcStatusNotifierParams *obj) { + obj->ref++; + return obj; +} + +void bc_status_notifier_params_unref(BcStatusNotifierParams *obj) { + obj->ref--; + if(obj->ref < 0) { + if(obj->prefix) g_free(obj->prefix); + if(obj->id) g_free(obj->id); + if(obj->title) g_free(obj->title); + if(obj->icon_name) g_free(obj->icon_name); + if(obj->overlay_icon_name) g_free(obj->overlay_icon_name); + if(obj->attention_icon_name) g_free(obj->attention_icon_name); + if(obj->attention_movie_name) g_free(obj->attention_movie_name); + if(obj->tool_tip) bc_status_notifier_tool_tip_unref(obj->tool_tip); + g_free(obj); + } +} + +void bc_status_notifier_params_set_dbus_prefix(BcStatusNotifierParams *obj, const char *prefix) { + if(obj->prefix) g_free(obj->prefix); + if(prefix) obj->prefix = g_strdup(prefix); + else obj->prefix = NULL; +} + +const char *bc_satus_notifier_params_get_dbus_prefix(const BcStatusNotifierParams *obj) { + return obj->prefix; +} + +void bc_status_notifier_params_set_item_id(BcStatusNotifierParams *obj, int item_id) { + obj->item_id = item_id; +} + +int bc_status_notifier_params_get_item_id(const BcStatusNotifierParams *obj) { + return obj->item_id; +} + +void bc_status_notifier_params_set_category(BcStatusNotifierParams *obj, BcStatusNotifierCategory category) { + obj->category = category; +} + +BcStatusNotifierCategory bc_status_notifier_params_get_category(const BcStatusNotifierParams *obj) { + return obj->category; +} + +void bc_status_notifier_params_set_id(BcStatusNotifierParams *obj, const char *id) { + if(obj->id) g_free(obj->id); + if(id) obj->id = g_strdup(id); + else obj->id = NULL; +} + +const char *bc_status_notifier_params_get_id(const BcStatusNotifierParams *obj) { + return obj->id; +} + +void bc_status_notifier_params_set_title(BcStatusNotifierParams *obj, const char *title) { + if(obj->title) g_free(obj->title); + if(title) obj->title = g_strdup(title); + else obj->title = NULL; +} + +const char *bc_status_notifier_params_get_title(const BcStatusNotifierParams *obj) { + return obj->title; +} + +void bc_status_notifier_params_set_status(BcStatusNotifierParams *obj, BcStatusNotifierStatus status) { + obj->status = status; +} + +BcStatusNotifierStatus bc_status_notifier_params_get_status(const BcStatusNotifierParams *obj) { + return obj->status; +} + +void bc_status_notifier_params_set_window_id(BcStatusNotifierParams *obj, guint32 window_id) { + obj->window_id = window_id; +} + +guint32 bc_status_notifier_params_get_window_id(const BcStatusNotifierParams *obj) { + return obj->window_id; +} + +void bc_status_notifier_params_set_icon_name(BcStatusNotifierParams *obj, const char *name) { + if(obj->icon_name) g_free(obj->icon_name); + if(name) obj->icon_name = g_strdup(name); + else obj->icon_name = NULL; +} + +const char *bc_status_notifier_params_get_icon_name(const BcStatusNotifierParams *obj) { + return obj->icon_name; +} + +void bc_status_notifier_params_set_overlay_icon_name(BcStatusNotifierParams *obj, const char *name) { + if(obj->overlay_icon_name) g_free(obj->overlay_icon_name); + if(name) obj->overlay_icon_name = g_strdup(name); + else obj->overlay_icon_name = NULL; +} + +const char *bc_status_notifier_params_get_overlay_icon_name(const BcStatusNotifierParams *obj) { + return obj->overlay_icon_name; +} + +void bc_status_notifier_params_set_attention_icon_name(BcStatusNotifierParams *obj, const char *name) { + if(obj->attention_icon_name) g_free(obj->attention_icon_name); + if(name) obj->attention_icon_name = g_strdup(name); + else obj->attention_icon_name = NULL; +} + +const char *bc_status_notifier_params_get_attention_icon_name(const BcStatusNotifierParams *obj) { + return obj->attention_icon_name; +} + +void bc_status_notifier_params_set_attention_movie_name(BcStatusNotifierParams *obj, const char *name) { + if(obj->attention_movie_name) g_free(obj->attention_movie_name); + if(name) obj->attention_movie_name = g_strdup(name); + else obj->attention_movie_name = NULL; +} + +const char *bc_status_notifier_params_get_attention_movie_name(const BcStatusNotifierParams *obj) { + return obj->attention_movie_name; +} + +void bc_status_notifier_params_set_tool_tip(BcStatusNotifierParams *obj, BcStatusNotifierToolTip *tool_tip) { + if(obj->tool_tip) bc_status_notifier_tool_tip_unref(obj->tool_tip); + if(tool_tip) obj->tool_tip = bc_status_notifier_tool_tip_ref(tool_tip); + else obj->tool_tip = NULL; +} + +const BcStatusNotifierToolTip *bc_status_notifier_params_get_tool_tip(const BcStatusNotifierParams *obj) { + return obj->tool_tip; +} + +void bc_status_notifier_params_set_vtable(BcStatusNotifierParams *obj, const BcStatusNotifierSignalsVTable *vtable, void *user_data) { + obj->vtable = *vtable; + obj->user_data = user_data; +} + + +struct _BcStatusNotifier { + BcStatusNotifierParams *params; + guint bus_owner_id; + GDBusConnection *conn; + BcStatusNotifierState state; + BcStatusNotifierStateVTable vtable; + void *user_data; + int ref; +}; + +#define ITEM_NAME "StatusNotifierItem" +#define WATCHER_NAME "StatusNotifierWatcher" +#define CALL_TIMEOUT 1000 + +#define STATUS_NOTIFIER_INTROSPECTION_DATA \ + " \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + " + +BcStatusNotifier *bc_status_notifier_new(void) { + return (BcStatusNotifier *)g_new0(BcStatusNotifier, 1); +} + +BcStatusNotifier *bc_status_notifier_ref(BcStatusNotifier *obj) { + obj->ref++; + return obj; +} + +void bc_status_notifier_unref(BcStatusNotifier *obj) { + obj->ref--; + if(obj->ref < 0) { + bc_status_notifier_stop(obj); + if(obj->params) bc_status_notifier_params_unref(obj->params); + g_free(obj); + } +} + +static GVariant *_bc_status_notifier_get_property_cb( + GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *property_name, + GError **error, + BcStatusNotifier *sn) { + + + GVariant *value = NULL; + if(g_strcmp0(property_name, "Category") == 0) { + value = g_variant_new_string(bc_status_notifier_category_to_string(sn->params->category)); + } else if(g_strcmp0(property_name, "Id") == 0) { + value = g_variant_new_string(sn->params->id ? sn->params->id : ""); + } else if(g_strcmp0(property_name, "Title") == 0) { + value = g_variant_new_string(sn->params->title ? sn->params->title : ""); + } else if(g_strcmp0(property_name, "Status") == 0) { + value = g_variant_new_string(bc_status_notifier_status_to_string(sn->params->status)); + } else if(g_strcmp0(property_name, "WindowId") == 0) { + value = g_variant_new_uint32(sn->params->window_id); + } else if(g_strcmp0(property_name, "IconName") == 0) { + value = g_variant_new_string(sn->params->icon_name ? sn->params->icon_name : ""); + } else if(g_strcmp0(property_name, "IconPixmap") == 0) { + value = g_variant_new_array(G_VARIANT_TYPE_VARIANT, NULL, 0); + } else if(g_strcmp0(property_name, "OverlayIconName") == 0) { + value = g_variant_new_string(sn->params->overlay_icon_name ? sn->params->overlay_icon_name : ""); + } else if(g_strcmp0(property_name, "OverlayIconPixmap") == 0) { + value = g_variant_new_array(G_VARIANT_TYPE_VARIANT, NULL, 0); + } else if(g_strcmp0(property_name, "AttentionIconName") == 0) { + value = g_variant_new_string(sn->params->attention_icon_name ? sn->params->attention_icon_name : ""); + } else if(g_strcmp0(property_name, "AttentionIconPixmap") == 0) { + value = g_variant_new_array(G_VARIANT_TYPE_VARIANT, NULL, 0); + } else if(g_strcmp0(property_name, "AttentionMovieName") == 0) { + value = g_variant_new_string(sn->params->attention_movie_name ? sn->params->attention_movie_name : ""); + } else if(g_strcmp0(property_name, "ToolTip") == 0) { + if(sn->params->tool_tip) { + value = _bc_status_notifier_tool_tip_to_variant(sn->params->tool_tip); + } else { + BcStatusNotifierToolTip *tool_tip = bc_status_notifier_tool_tip_new("", "", ""); + value = _bc_status_notifier_tool_tip_to_variant(tool_tip); + bc_status_notifier_tool_tip_unref(tool_tip); + } + } + return value; +} + +static void _bc_status_notifier_method_call_cb( + GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + GDBusMethodInvocation *invocation, + BcStatusNotifier *sn) { + + if(g_strcmp0(method_name, "ContextMenu") == 0) { + if(sn->params->vtable.context_menu_called_cb) { + int x, y; + g_variant_get_child(parameters, 0, "i", &x); + g_variant_get_child(parameters, 1, "i", &y); + sn->params->vtable.context_menu_called_cb(sn, x, y, sn->params->user_data); + } + } else if(g_strcmp0(method_name, "Activate") == 0) { + if(sn->params->vtable.activate_called_cb) { + int x, y; + g_variant_get_child(parameters, 0, "i", &x); + g_variant_get_child(parameters, 1, "i", &y); + sn->params->vtable.activate_called_cb(sn, x, y, sn->params->user_data); + } + } else if(g_strcmp0(method_name, "SecondaryActivate") == 0) { + if(sn->params->vtable.secondary_activate_called_cb) { + int x, y; + g_variant_get_child(parameters, 0, "i", &x); + g_variant_get_child(parameters, 1, "i", &y); + sn->params->vtable.secondary_activate_called_cb(sn, x, y, sn->params->user_data); + } + } else if(g_strcmp0(method_name, "Scroll") == 0) { + if(sn->params->vtable.scroll_called_cb) { + int delta; + BcStatusNotifierOrientation orient; + char *orient_str; + g_variant_get_child(parameters, 0, "i", &delta); + g_variant_get_child(parameters, 1, "&s", &orient_str); + orient = _bc_status_notifier_orientation_from_string(orient_str); + sn->params->vtable.scroll_called_cb(sn, delta, orient, sn->params->user_data); + } + } + g_dbus_method_invocation_return_value(invocation, NULL); +} + +static void _bc_status_notifier_bus_acquired_cb(GDBusConnection *conn, const gchar *name, BcStatusNotifier *sn) { + char *interface_name = g_strdup_printf("%s.%s", sn->params->prefix, ITEM_NAME); + char *item_path = g_strdup_printf("/%s", ITEM_NAME); + GDBusInterfaceVTable vtable = { + (GDBusInterfaceMethodCallFunc)_bc_status_notifier_method_call_cb, + (GDBusInterfaceGetPropertyFunc)_bc_status_notifier_get_property_cb, + NULL + }; + + GDBusNodeInfo *node_info = g_dbus_node_info_new_for_xml(STATUS_NOTIFIER_INTROSPECTION_DATA, NULL); + GDBusInterfaceInfo *interface = g_dbus_node_info_lookup_interface( + node_info, + interface_name + ); + g_free(interface_name); + + sn->conn = conn; + + g_dbus_connection_register_object( + conn, + item_path, + interface, + &vtable, + bc_status_notifier_ref(sn), + (GDestroyNotify)bc_status_notifier_unref, + NULL + ); + g_free(item_path); + + g_dbus_node_info_unref(node_info); +} + +static void _bc_status_notifier_name_acquired_cb(GDBusConnection *conn, const gchar *name, BcStatusNotifier *sn) { + GVariant *item_name = g_variant_new_string(name); + GVariant *parameters = g_variant_new_tuple(&item_name, 1); + char *watcher_bus_name = g_strdup_printf("%s.%s", sn->params->prefix, WATCHER_NAME); + char *watcher_interface_name = watcher_bus_name; + char *watcher_path = g_strdup_printf("/%s", WATCHER_NAME); + + g_dbus_connection_call( + conn, + watcher_bus_name, + watcher_path, + watcher_interface_name, + "RegisterStatusNotifierItem", + parameters, + NULL, + G_DBUS_CALL_FLAGS_NONE, + CALL_TIMEOUT, + NULL, + NULL, + NULL + ); + g_free(watcher_bus_name); + g_free(watcher_path); + + sn->state = BcStatusNotifierStateRunning; + if(sn->vtable.success) sn->vtable.success(sn, sn->user_data); +} + +static void _bc_status_notifier_name_lost(GDBusConnection *conn, const gchar *name, BcStatusNotifier *sn) { + if(conn == NULL) { + sn->state = BcStatusNotifierStateStopped; + if(sn->vtable.fail) sn->vtable.fail(sn, sn->user_data); + } +} + +void bc_status_notifier_start(BcStatusNotifier* obj, BcStatusNotifierParams* params, const BcStatusNotifierStateVTable *vtable, void *user_data) { + if(obj->state == BcStatusNotifierStateStopped) { + pid_t pid = getpid(); + char *dbus_name = g_strdup_printf("%s.%s-%d-%d", params->prefix, ITEM_NAME, pid, params->item_id); + + if(obj->params) bc_status_notifier_params_unref(obj->params); + obj->params = bc_status_notifier_params_ref(params); + if(vtable) obj->vtable = *vtable; + else { + obj->vtable.success = NULL; + obj->vtable.fail = NULL; + } + obj->user_data = user_data; + obj->state = BcStatusNotifierStateStarting; + obj->bus_owner_id = g_bus_own_name( + G_BUS_TYPE_SESSION, + dbus_name, + G_BUS_NAME_OWNER_FLAGS_NONE, + (GBusAcquiredCallback)_bc_status_notifier_bus_acquired_cb, + (GBusNameAcquiredCallback)_bc_status_notifier_name_acquired_cb, + (GBusNameLostCallback)_bc_status_notifier_name_lost, + bc_status_notifier_ref(obj), + (GDestroyNotify)bc_status_notifier_unref + ); + g_free(dbus_name); + } +} + +void bc_status_notifier_stop(BcStatusNotifier *obj) { + if(obj->state == BcStatusNotifierStateRunning) { + g_bus_unown_name(obj->bus_owner_id); + obj->bus_owner_id = 0; + obj->conn = NULL; + obj->state = BcStatusNotifierStateStopped; + } +} + +const BcStatusNotifierParams *bc_status_notifier_get_params(const BcStatusNotifier *obj) { + return obj->params; +} + +static void _bc_status_notifier_emit_signal(const BcStatusNotifier *obj, const char *sig_name, GVariant *parameters) { + char *item_interface_name = g_strdup_printf("%s.%s", obj->params->prefix, ITEM_NAME); + char *item_path = g_strdup_printf("/%s", ITEM_NAME); + g_dbus_connection_emit_signal( + obj->conn, + NULL, + item_path, + item_interface_name, + sig_name, + parameters, + NULL + ); + g_free(item_interface_name); + g_free(item_path); +} + +void bc_status_notifier_update_title(BcStatusNotifier *obj, const char *title) { + bc_status_notifier_params_set_title(obj->params, title); + _bc_status_notifier_emit_signal(obj, "NewTitle", NULL); +} + +void bc_status_notifier_update_icon(BcStatusNotifier *obj, const char *icon_name) { + bc_status_notifier_params_set_icon_name(obj->params, icon_name); + _bc_status_notifier_emit_signal(obj, "NewIcon", NULL); +} + +void bc_status_notifier_update_attention_icon(BcStatusNotifier *obj, const char *icon_name) { + bc_status_notifier_params_set_attention_icon_name(obj->params, icon_name); + _bc_status_notifier_emit_signal(obj, "NewAttentionIcon", NULL); +} + +void bc_status_notifier_update_overlay_icon(BcStatusNotifier *obj, const char *icon_name) { + bc_status_notifier_params_set_overlay_icon_name(obj->params, icon_name); + _bc_status_notifier_emit_signal(obj, "NewOverlayIcon", NULL); +} + +void bc_status_notifier_update_tool_tip(BcStatusNotifier *obj, BcStatusNotifierToolTip *tool_tip) { + bc_status_notifier_params_set_tool_tip(obj->params, tool_tip); + _bc_status_notifier_emit_signal(obj, "NewToolTip", NULL); +} + +void bc_status_notifier_update_status(BcStatusNotifier *obj, BcStatusNotifierStatus status) { + GVariant *status_var = g_variant_new_string(bc_status_notifier_status_to_string(status)); + GVariant *parameter = g_variant_new_tuple(&status_var, 1); + bc_status_notifier_params_set_status(obj->params, status); + _bc_status_notifier_emit_signal(obj, "NewStatus", parameter); +} + + +typedef struct _BcWatcherDetectionCtx { + char *prefix; + guint watcher_id; + BcStatusNotifierSupportDetectionCb cb; + void *user_data; +} BcWatcherDetectionCtx; + +static void _bc_watcher_detection_ctx_free(BcWatcherDetectionCtx *obj) { + g_free(obj->prefix); + g_free(obj); +} + +static void _bc_watcher_name_appeared_cb(GDBusConnection *conn, const char *name, const char *name_owner, BcWatcherDetectionCtx *ctx) { + g_bus_unwatch_name(ctx->watcher_id); + if(ctx->cb) ctx->cb(ctx->prefix, 1, ctx->user_data); +} + +static void _bc_watcher_name_vannished_cb(GDBusConnection *conn, const char *name, BcWatcherDetectionCtx *ctx) { + g_bus_unwatch_name(ctx->watcher_id); + if(ctx->cb) ctx->cb(ctx->prefix, 0, ctx->user_data); +} + +void bc_status_notifier_is_supported(const char* prefix, BcStatusNotifierSupportDetectionCb cb, void *user_data) { + char *bus_name = g_strdup_printf("%s.%s", prefix, WATCHER_NAME); + BcWatcherDetectionCtx *ctx = (BcWatcherDetectionCtx *)g_new0(BcWatcherDetectionCtx, 1); + ctx->prefix = g_strdup(prefix); + ctx->cb = cb; + ctx->user_data = user_data; + + ctx->watcher_id = g_bus_watch_name( + G_BUS_TYPE_SESSION, + bus_name, + G_BUS_NAME_WATCHER_FLAGS_NONE, + (GBusNameAppearedCallback)_bc_watcher_name_appeared_cb, + (GBusNameVanishedCallback)_bc_watcher_name_vannished_cb, + ctx, + (GDestroyNotify)_bc_watcher_detection_ctx_free + ); + g_free(bus_name); +} diff --git a/gtk/status_notifier.h b/gtk/status_notifier.h new file mode 100644 index 000000000..c357b20b0 --- /dev/null +++ b/gtk/status_notifier.h @@ -0,0 +1,156 @@ +/* +linphone, gtk-glade interface. +Copyright (C) 2015 Belledonne Communications + +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. +*/ + +#ifndef STATUS_NOTIFIER_H +#define STATUS_NOTIFIER_H + +#include + +struct _BcStatusNotifier; + + +typedef enum { + BcStatusNotifierCategoryApplicationStatus, + BcStatusNotifierCategoryCommunications, + BcStatusNotifierCategorySystemService, + BcStatusNotifierCategoryHardware +} BcStatusNotifierCategory; + +const gchar *bc_status_notifier_category_to_string(BcStatusNotifierCategory c); + + +typedef enum { + BcStatusNotifierStatusPassive, + BcStatusNotifierStatusActive, + BcStatusNotifierStatusNeedsAttention +} BcStatusNotifierStatus; + +const gchar *bc_status_notifier_status_to_string(BcStatusNotifierStatus s); + + +typedef struct _BcStatusNotifierToolTip BcStatusNotifierToolTip; + +BcStatusNotifierToolTip *bc_status_notifier_tool_tip_new(const char *icon_name, const char *title, const char *text); +BcStatusNotifierToolTip *bc_status_notifier_tool_tip_ref(BcStatusNotifierToolTip *obj); +void bc_status_notifier_tool_tip_unref(BcStatusNotifierToolTip *obj); + + +typedef enum _BcStatusNotifierOrientation { + BcStatusNotifierOrientationVertical, + BcStatusNotifierOrientationHorizontal +} BcStatusNotifierOrientation; + + +typedef void (*BcStatusNotifierContextMenuCalledCb)(struct _BcStatusNotifier *sn, int x, int y, void *user_data); +typedef void (*BcStatusNotifierActivateCalledCb)(struct _BcStatusNotifier *sn, int x, int y, void *user_data); +typedef void (*BcStatusNotifierSecondaryActivateCb)(struct _BcStatusNotifier *sn, int x, int y, void *user_data); +typedef void (*BcStatusNotifierScrollCalledCb)(struct _BcStatusNotifier *sn, int delta, BcStatusNotifierOrientation o, void *user_data); + +typedef struct _BcStatusNotifierSignalsVTable { + BcStatusNotifierContextMenuCalledCb context_menu_called_cb; + BcStatusNotifierActivateCalledCb activate_called_cb; + BcStatusNotifierSecondaryActivateCb secondary_activate_called_cb; + BcStatusNotifierScrollCalledCb scroll_called_cb; +} BcStatusNotifierSignalsVTable; + + +typedef struct _BcStatusNotifierParams BcStatusNotifierParams; + +BcStatusNotifierParams *bc_status_notifier_params_new(void); +BcStatusNotifierParams *bc_status_notifier_params_ref(BcStatusNotifierParams *obj); +void bc_status_notifier_params_unref(BcStatusNotifierParams *obj); + +void bc_status_notifier_params_set_dbus_prefix(BcStatusNotifierParams *obj, const char *prefix); +const char *bc_satus_notifier_params_get_dbus_prefix(const BcStatusNotifierParams *obj); + +void bc_status_notifier_params_set_item_id(BcStatusNotifierParams *obj, int item_id); +int bc_status_notifier_params_get_item_id(const BcStatusNotifierParams *obj); + +void bc_status_notifier_params_set_category(BcStatusNotifierParams *obj, BcStatusNotifierCategory category); +BcStatusNotifierCategory bc_status_notifier_params_get_category(const BcStatusNotifierParams *obj); + +void bc_status_notifier_params_set_id(BcStatusNotifierParams *obj, const char *id); +const char *bc_status_notifier_params_get_id(const BcStatusNotifierParams *obj); + +void bc_status_notifier_params_set_title(BcStatusNotifierParams *obj, const char *title); +const char *bc_status_notifier_params_get_title(const BcStatusNotifierParams *obj); + +void bc_status_notifier_params_set_status(BcStatusNotifierParams *obj, BcStatusNotifierStatus status); +BcStatusNotifierStatus bc_status_notifier_params_get_status(const BcStatusNotifierParams *obj); + +void bc_status_notifier_params_set_window_id(BcStatusNotifierParams *obj, guint32 window_id); +guint32 bc_status_notifier_params_get_window_id(const BcStatusNotifierParams *obj); + +void bc_status_notifier_params_set_icon_name(BcStatusNotifierParams *obj, const char *name); +const char *bc_status_notifier_params_get_icon_name(const BcStatusNotifierParams *obj); + +void bc_status_notifier_params_set_overlay_icon_name(BcStatusNotifierParams *obj, const char *name); +const char *bc_status_notifier_params_get_overlay_icon_name(const BcStatusNotifierParams *obj); + +void bc_status_notifier_params_set_attention_icon_name(BcStatusNotifierParams *obj, const char *icon_name); +const char *bc_status_notifier_params_get_attention_icon_name(const BcStatusNotifierParams *obj); + +void bc_status_notifier_params_set_attention_movie_name(BcStatusNotifierParams *obj, const char *name); +const char *bc_status_notifier_params_get_attention_movie_name(const BcStatusNotifierParams *obj); + +void bc_status_notifier_params_set_tool_tip(BcStatusNotifierParams *obj, BcStatusNotifierToolTip *tool_tip); +const BcStatusNotifierToolTip *bc_status_notifier_params_get_tool_tip(const BcStatusNotifierParams *obj); + +void bc_status_notifier_params_set_vtable(BcStatusNotifierParams *obj, const BcStatusNotifierSignalsVTable *vtable, void *user_data); + + +typedef enum _BcStatusNotifierState { + BcStatusNotifierStateStopped, + BcStatusNotifierStateStarting, + BcStatusNotifierStateRunning +} BcStatusNotifierState; + + +typedef void (*BcStatusNotifierStartedCb)(struct _BcStatusNotifier *sn, void *user_data); +typedef void (*BcStatusNotifierStartingFailedCb)(struct _BcStatusNotifier *sn, void *user_data); + +typedef struct _BcStatusNotifierStateVTable { + BcStatusNotifierStartedCb success; + BcStatusNotifierStartingFailedCb fail; +} BcStatusNotifierStateVTable; + + +typedef struct _BcStatusNotifier BcStatusNotifier; + +BcStatusNotifier *bc_status_notifier_new(void); +BcStatusNotifier *bc_status_notifier_ref(BcStatusNotifier *obj); +void bc_status_notifier_unref(BcStatusNotifier *obj); + +void bc_status_notifier_start(BcStatusNotifier* obj, BcStatusNotifierParams* params, const BcStatusNotifierStateVTable* vtable, void* user_data); +void bc_status_notifier_stop(BcStatusNotifier* obj); + +const BcStatusNotifierParams *bc_status_notifier_get_params(const BcStatusNotifier *obj); +void bc_status_notifier_update_title(BcStatusNotifier* obj, const char* title); +void bc_status_notifier_update_icon(BcStatusNotifier* obj, const char* icon_name); +void bc_status_notifier_update_attention_icon(BcStatusNotifier* obj, const char* icon_name); +void bc_status_notifier_update_overlay_icon(BcStatusNotifier* obj, const char* icon_name); +void bc_status_notifier_update_tool_tip(BcStatusNotifier* obj, BcStatusNotifierToolTip* tool_tip); +void bc_status_notifier_update_status(BcStatusNotifier* obj, BcStatusNotifierStatus status); + + +typedef void (*BcStatusNotifierSupportDetectionCb)(const char *prefix, gboolean is_supported, void *user_data); + +void bc_status_notifier_is_supported(const char* prefix, BcStatusNotifierSupportDetectionCb cb, void *user_data); + +#endif \ No newline at end of file From 70c42b98232f67cec7fb4cb2aa01133b55e7ff04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Grisez?= Date: Sun, 26 Apr 2015 21:42:16 +0200 Subject: [PATCH 061/157] Add a methode to the LinphoneStatusIcon interface to set the description to display in the tooltip --- gtk/main.c | 3 ++- gtk/status_icon.c | 15 ++++++++++++--- gtk/status_icon.h | 1 + 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/gtk/main.c b/gtk/main.c index fc689a5b6..22eeef4a2 100644 --- a/gtk/main.c +++ b/gtk/main.c @@ -1560,7 +1560,8 @@ static void linphone_gtk_init_status_icon(void) { GtkWidget *menu = create_icon_menu(); LinphoneStatusIconParams *params = linphone_status_icon_params_new(); linphone_status_icon_params_set_menu(params, menu); - linphone_status_icon_params_set_title(params, _("Linphone - a video internet phone")); + linphone_status_icon_params_set_title(params, _("Linphone")); + linphone_status_icon_params_set_description(params, _("A video internet phone")); linphone_status_icon_params_set_on_click_cb(params, handle_icon_click, NULL); g_object_unref(G_OBJECT(menu)); diff --git a/gtk/status_icon.c b/gtk/status_icon.c index daf00203d..c652653a3 100644 --- a/gtk/status_icon.c +++ b/gtk/status_icon.c @@ -35,6 +35,7 @@ static const _LinphoneStatusIconDesc *_linphone_status_icon_impls[]; struct _LinphoneStatusIconParams { char *title; + char *desc; GtkWidget *menu; LinphoneStatusIconOnClickCallback on_click_cb; void *user_data; @@ -65,6 +66,12 @@ void linphone_status_icon_params_set_title(LinphoneStatusIconParams *obj, const else obj->title = NULL; } +void linphone_status_icon_params_set_description(LinphoneStatusIconParams *obj, const char *desc) { + if(obj->desc) g_free(obj->desc); + if(desc) obj->desc = g_strdup(desc); + else obj->desc = NULL; +} + void linphone_status_icon_params_set_menu(LinphoneStatusIconParams *obj, GtkWidget *menu) { if(obj->menu) g_object_unref(obj->menu); if(menu) obj->menu = g_object_ref(menu); @@ -273,7 +280,9 @@ static void _linphone_status_icon_impl_gtk_init(LinphoneStatusIcon *si) { static void _linphone_status_icon_impl_gtk_start(LinphoneStatusIcon *si) { GtkStatusIcon *icon = GTK_STATUS_ICON(si->data); #if GTK_CHECK_VERSION(2,20,2) - gtk_status_icon_set_name(icon, si->params->title); + char *name = g_strdup_printf("%s - %s", si->params->title, si->params->desc); + gtk_status_icon_set_name(icon, name); + g_free(name); #endif gtk_status_icon_set_visible(icon,TRUE); } @@ -404,7 +413,7 @@ static void _linphone_status_icon_impl_sn_menu_called_cb(BcStatusNotifier *sn, i static void _linphone_status_icon_impl_sn_start(LinphoneStatusIcon *si) { BcStatusNotifier *sn = (BcStatusNotifier *)si->data; BcStatusNotifierParams *params; - BcStatusNotifierToolTip *tooltip = bc_status_notifier_tool_tip_new("linphone", "Linphone", NULL); + BcStatusNotifierToolTip *tooltip = bc_status_notifier_tool_tip_new("linphone", si->params->title, si->params->desc); BcStatusNotifierSignalsVTable vtable = {NULL}; vtable.activate_called_cb = _linphone_status_icon_impl_sn_activated_cb; @@ -414,7 +423,7 @@ static void _linphone_status_icon_impl_sn_start(LinphoneStatusIcon *si) { bc_status_notifier_params_set_dbus_prefix(params, "org.kde"); bc_status_notifier_params_set_category(params, BcStatusNotifierCategoryCommunications); bc_status_notifier_params_set_id(params, "linphone"); - bc_status_notifier_params_set_title(params, "Linphone"); + bc_status_notifier_params_set_title(params, si->params->title); bc_status_notifier_params_set_icon_name(params, "linphone"); bc_status_notifier_params_set_tool_tip(params, tooltip); bc_status_notifier_params_set_vtable(params, &vtable, si); diff --git a/gtk/status_icon.h b/gtk/status_icon.h index de0dd9951..07d7a34a4 100644 --- a/gtk/status_icon.h +++ b/gtk/status_icon.h @@ -31,6 +31,7 @@ LinphoneStatusIconParams *linphone_status_icon_params_ref(LinphoneStatusIconPara void linphone_status_icon_params_unref(LinphoneStatusIconParams *obj); void linphone_status_icon_params_set_title(LinphoneStatusIconParams *obj, const char *title); +void linphone_status_icon_params_set_description(LinphoneStatusIconParams *obj, const char *desc); void linphone_status_icon_params_set_menu(LinphoneStatusIconParams *obj, GtkWidget *menu); void linphone_status_icon_params_set_on_click_cb(LinphoneStatusIconParams* obj, LinphoneStatusIconOnClickCallback cb, void *user_data); From 04c7c09037bb556e63caa20ac95b517188a36f7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Grisez?= Date: Mon, 27 Apr 2015 14:22:11 +0200 Subject: [PATCH 062/157] Add Turkish and Arabic translation for GTK+ in the Windows installer --- gtk+-2.24.8.filelist | 11 +++++++++++ linphone.iss.in | 22 +++++++++++++++------- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/gtk+-2.24.8.filelist b/gtk+-2.24.8.filelist index 019823eae..f893fafa0 100644 --- a/gtk+-2.24.8.filelist +++ b/gtk+-2.24.8.filelist @@ -45,6 +45,11 @@ etc/gtk-2.0/gtk.immodules etc/gtk-2.0/im-multipress.conf etc/pango etc/pango/pango.modules +share/locale/ar/LC_MESSAGES/atk10.mo +share/locale/ar/LC_MESSAGES/gdk-pixbuf.mo +share/locale/ar/LC_MESSAGES/glib20.mo +share/locale/ar/LC_MESSAGES/gtk20-properties.mo +share/locale/ar/LC_MESSAGES/gtk20.mo share/locale/cs share/locale/cs/LC_MESSAGES share/locale/cs/LC_MESSAGES/atk10.mo @@ -171,6 +176,12 @@ share/locale/sv/LC_MESSAGES/gettext-runtime.mo share/locale/sv/LC_MESSAGES/glib20.mo share/locale/sv/LC_MESSAGES/gtk20-properties.mo share/locale/sv/LC_MESSAGES/gtk20.mo +share/locale/tr/LC_MESSAGES/atk10.mo +share/locale/tr/LC_MESSAGES/gdk-pixbuf.mo +share/locale/tr/LC_MESSAGES/gettext-runtime.mo +share/locale/tr/LC_MESSAGES/glib20.mo +share/locale/tr/LC_MESSAGES/gtk20-properties.mo +share/locale/tr/LC_MESSAGES/gtk20.mo share/locale/zh_CN share/locale/zh_CN/LC_MESSAGES share/locale/zh_CN/LC_MESSAGES/atk10.mo diff --git a/linphone.iss.in b/linphone.iss.in index de88854d3..aa700200c 100644 --- a/linphone.iss.in +++ b/linphone.iss.in @@ -16,13 +16,21 @@ ShowLanguageDialog=yes UninstallDisplayIcon={app}\bin\linphone.exe [Languages] -Name: "english"; MessagesFile: "compiler:Default.isl" -Name: "italian"; MessagesFile: "compiler:Languages\Italian.isl"; -Name: "french"; MessagesFile: "compiler:Languages\French.isl" -Name: "czech"; MessagesFile: "compiler:Languages\Czech.isl" -Name: "german"; MessagesFile: "compiler:Languages\German.isl" -Name: "spanish"; MessagesFile: "compiler:Languages\Spanish.isl" - +Name: "czech"; MessagesFile: "compiler:Languages\Czech.isl" +Name: "english"; MessagesFile: "compiler:Default.isl" +Name: "french"; MessagesFile: "compiler:Languages\French.isl" +Name: "german"; MessagesFile: "compiler:Languages\German.isl" +Name: "hebrew"; MessagesFile: "compiler:Languages\Hebrew.isl" +Name: "hungarian"; MessagesFile: "compiler:Languages\Hungarian.isl" +Name: "italian"; MessagesFile: "compiler:Languages\Italian.isl"; +Name: "japanese"; MessagesFile: "compiler:Languages\Japanese.isl" +Name: "norwegian"; MessagesFile: "compiler:Languages\Norwegian.isl" +Name: "polish"; MessagesFile: "compiler:Languages\Polish.isl" +Name: "portuguese"; MessagesFile: "compiler:Languages\Portuguese.isl" +Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl" +Name: "slovenian"; MessagesFile: "compiler:Languages\Slovenian.isl" +Name: "spanish"; MessagesFile: "compiler:Languages\Spanish.isl" +Name: "turkish"; MessagesFile: "compiler:Languages\Turkish.isl" [Tasks] Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked From a188779a77c5a3c3b220dc19b970e53a65d89d29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Grisez?= Date: Mon, 27 Apr 2015 17:51:12 +0200 Subject: [PATCH 063/157] Fix build issues on MacOSX --- gtk/main.c | 4 ++++ gtk/status_icon.c | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/gtk/main.c b/gtk/main.c index 22eeef4a2..78e320532 100644 --- a/gtk/main.c +++ b/gtk/main.c @@ -1530,11 +1530,14 @@ static GtkWidget *create_icon_menu(){ return menu; } +#ifndef HAVE_GTK_OSX void linphone_gtk_save_main_window_position(GtkWindow* mw, GdkEvent *event, gpointer data){ gtk_window_get_position(GTK_WINDOW(mw), &main_window_x, &main_window_y); } +#endif static void handle_icon_click(LinphoneStatusIcon *si, void *user_data) { +#ifndef HAVE_GTK_OSX GtkWidget *mw=linphone_gtk_get_main_window(); if (!gtk_window_is_active((GtkWindow*)mw)) { if(!gtk_widget_is_drawable(mw)){ @@ -1546,6 +1549,7 @@ static void handle_icon_click(LinphoneStatusIcon *si, void *user_data) { linphone_gtk_save_main_window_position((GtkWindow*)mw, NULL, NULL); gtk_widget_hide(mw); } +#endif } static void linphone_gtk_status_icon_initialised_cb(LinphoneStatusIconParams *params) { diff --git a/gtk/status_icon.c b/gtk/status_icon.c index c652653a3..08445a468 100644 --- a/gtk/status_icon.c +++ b/gtk/status_icon.c @@ -337,7 +337,7 @@ static const _LinphoneStatusIconDesc _linphone_status_icon_impl_gtk_desc = { /* GtkosxApplication implementation */ #ifdef HAVE_GTK_OSX -static void _linphone_status_icon_impl_gtkosx_app_enable_blinking(StatusIcon *si, gboolean val) { +static void _linphone_status_icon_impl_gtkosx_app_enable_blinking(LinphoneStatusIcon *si, gboolean val) { GtkosxApplication *theMacApp=gtkosx_application_get(); gint *attention_id = (gint *)&si->data; if (val && *attention_id == 0) { @@ -364,7 +364,7 @@ static const _LinphoneStatusIconDesc _linphone_status_icon_impl_gtkosx_app_desc .uninit = NULL, .start = NULL, .enable_blinking = _linphone_status_icon_impl_gtkosx_app_enable_blinking, - .is_supported = _linphone_satus_icon_impl_gtkosx_app_is_supported + .is_supported = _linphone_status_icon_impl_gtkosx_app_is_supported }; #endif From 2677fbd10be242a58b4d3f0436bfe78e6a0d17a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Grisez?= Date: Mon, 27 Apr 2015 22:46:31 +0200 Subject: [PATCH 064/157] Add a light description of LinphoneStatusIcon and BcStatusNotifier --- gtk/status_icon.h | 5 +++++ gtk/status_notifier.h | 7 +++++++ 2 files changed, 12 insertions(+) diff --git a/gtk/status_icon.h b/gtk/status_icon.h index 07d7a34a4..233733724 100644 --- a/gtk/status_icon.h +++ b/gtk/status_icon.h @@ -17,6 +17,11 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +/* + * LinphoneStatusIcon is an singleton interface which abstracts the + * technology used to manage the status icon. + */ + #include #include diff --git a/gtk/status_notifier.h b/gtk/status_notifier.h index c357b20b0..b8067fdeb 100644 --- a/gtk/status_notifier.h +++ b/gtk/status_notifier.h @@ -17,6 +17,13 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +/** + * BcStatusNotifier is an implementation of the StatusNotiferItem standard defined by freedesktop.org. + * It is a new way to manage status icons on GNU/Linux systems by using D-Bus. It is implemented by + * Unity desktop environmemt and it is the only way to create status icons on KDE 5. + * Visit http://freedesktop.org/wiki/Specifications/StatusNotifierItem/ for more information. + */ + #ifndef STATUS_NOTIFIER_H #define STATUS_NOTIFIER_H From 7b31dd3c55380194a54c542a8f976fb1d3bb1a3c Mon Sep 17 00:00:00 2001 From: Johan Pascal Date: Mon, 27 Apr 2015 23:45:33 +0200 Subject: [PATCH 065/157] update mediastreamer2 --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index cbf8b3e2c..5747c5ce0 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit cbf8b3e2cb1312ec361a3123e26d68aa4dc8ef81 +Subproject commit 5747c5ce0e5faecb0dc2122ee96b07c3c901e514 From ab5f8f642d48dd55918718e6da6bd494a50ff5bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Grisez?= Date: Tue, 28 Apr 2015 11:17:27 +0200 Subject: [PATCH 066/157] Fix distcheck --- gtk/Makefile.am | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gtk/Makefile.am b/gtk/Makefile.am index 95a06789d..88625688e 100644 --- a/gtk/Makefile.am +++ b/gtk/Makefile.am @@ -55,8 +55,8 @@ linphone_SOURCES= \ config-fetching.c \ audio_assistant.c \ videowindow.c \ - status_icon.c \ - status_notifier.c \ + status_icon.c status_icon.h \ + status_notifier.c status_notifier.h \ linphone.h if BUILD_WIZARD linphone_SOURCES+= \ From f61cd11b5c738345523cf9d8a2663e04681f7694 Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Tue, 28 Apr 2015 13:08:26 +0200 Subject: [PATCH 067/157] call_tester.c: use another WAV for Call with file player test to reduce computation time --- tester/call_tester.c | 78 ++++++++++++++++----------------- tester/common/bc_tester_utils.h | 2 +- 2 files changed, 40 insertions(+), 40 deletions(-) diff --git a/tester/call_tester.c b/tester/call_tester.c index 63d8d922e..ccb7784f1 100644 --- a/tester/call_tester.c +++ b/tester/call_tester.c @@ -448,7 +448,7 @@ static void phone_number_normalization(void){ LinphoneCoreManager *marie = linphone_core_manager_new( "marie_rc"); LinphoneProxyConfig *cfg = linphone_core_create_proxy_config(marie->lc); char result[128]; - + linphone_proxy_config_set_dial_prefix(cfg, "33"); linphone_proxy_config_normalize_number(cfg, "0952636505", result, sizeof(result)); CU_ASSERT_STRING_EQUAL(result, "+33952636505"); @@ -464,7 +464,7 @@ static void phone_number_normalization(void){ CU_ASSERT_STRING_EQUAL(result, "+33952636505"); linphone_proxy_config_normalize_number(cfg, "toto", result, sizeof(result)); CU_ASSERT_STRING_EQUAL(result, "toto"); - + linphone_proxy_config_set_dial_escape_plus(cfg, TRUE); linphone_proxy_config_normalize_number(cfg, "0033952636505", result, sizeof(result)); CU_ASSERT_STRING_EQUAL(result, "0033952636505"); @@ -472,7 +472,7 @@ static void phone_number_normalization(void){ CU_ASSERT_STRING_EQUAL(result, "0033952636505"); linphone_proxy_config_normalize_number(cfg, "+34952636505", result, sizeof(result)); CU_ASSERT_STRING_EQUAL(result, "0034952636505"); - + linphone_proxy_config_unref(cfg); linphone_core_manager_destroy(marie); } @@ -1042,7 +1042,7 @@ static bool_t check_ice(LinphoneCoreManager* caller, LinphoneCoreManager* callee static void _call_with_ice_base(LinphoneCoreManager* pauline,LinphoneCoreManager* marie, bool_t caller_with_ice, bool_t callee_with_ice, bool_t random_ports) { bool_t call_ok; - + if (callee_with_ice){ linphone_core_set_firewall_policy(marie->lc,LinphonePolicyUseIce); } @@ -1199,9 +1199,9 @@ void call_paused_resumed_base(bool_t multicast) { linphone_core_enable_audio_multicast(pauline->lc,multicast); CU_ASSERT_TRUE((call_ok=call(pauline,marie))); - + if (!call_ok) goto end; - + call_pauline = linphone_core_get_current_call(pauline->lc); wait_for_until(pauline->lc, marie->lc, NULL, 5, 3000); @@ -1397,7 +1397,7 @@ static void audio_call_with_ice_no_matching_audio_codecs(void) { linphone_core_enable_payload_type(marie->lc, linphone_core_find_payload_type(marie->lc, "PCMA", 8000, 1), TRUE); /* Enable PCMA */ linphone_core_set_firewall_policy(marie->lc, LinphonePolicyUseIce); linphone_core_set_firewall_policy(pauline->lc, LinphonePolicyUseIce); - + out_call = linphone_core_invite_address(marie->lc, pauline->identity); linphone_call_ref(out_call); CU_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &marie->stat.number_of_LinphoneCallOutgoingInit, 1)); @@ -1530,7 +1530,7 @@ static void call_with_video_added(void) { LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc"); bool_t call_ok; - + CU_ASSERT_TRUE((call_ok=call(pauline,marie))); if (!call_ok) goto end; @@ -1539,7 +1539,7 @@ static void call_with_video_added(void) { linphone_core_terminate_all_calls(pauline->lc); CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallEnd,1)); CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallEnd,1)); - + end: linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); @@ -1552,8 +1552,8 @@ static void call_with_video_added_2(void) { /*in this variant marie is already in automatically accept*/ LinphoneVideoPolicy marie_policy; marie_policy.automatically_accept=TRUE; - - + + linphone_core_set_video_policy(marie->lc,&marie_policy); linphone_core_enable_video_capture(marie->lc, TRUE); linphone_core_enable_video_display(marie->lc, FALSE); @@ -1600,7 +1600,7 @@ static void call_with_several_video_switches(void) { LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc"); bool_t call_ok; CU_ASSERT_TRUE(call_ok=call(pauline,marie)); - + if (!call_ok) goto end; CU_ASSERT_TRUE(add_video(pauline,marie)); @@ -1657,7 +1657,7 @@ static void call_with_declined_video_base(bool_t using_policy) { LinphoneVideoPolicy marie_policy, pauline_policy; LinphoneCallTestParams caller_test_params = {0}, callee_test_params = {0}; bool_t call_ok; - + linphone_core_enable_video_capture(marie->lc, TRUE); linphone_core_enable_video_display(marie->lc, TRUE); linphone_core_enable_video_capture(pauline->lc, TRUE); @@ -1875,7 +1875,7 @@ static void _call_with_ice_video(LinphoneVideoPolicy caller_policy, LinphoneVide LinphoneCoreManager *marie = linphone_core_manager_new("marie_rc"); LinphoneCoreManager *pauline = linphone_core_manager_new("pauline_rc"); bool_t call_ok; - + linphone_core_set_video_policy(pauline->lc, &caller_policy); linphone_core_set_video_policy(marie->lc, &callee_policy); linphone_core_set_firewall_policy(marie->lc, LinphonePolicyUseIce); @@ -1967,7 +1967,7 @@ static void video_call_with_early_media_no_matching_audio_codecs(void) { pauline_call = linphone_core_get_current_call(pauline->lc); if (!pauline_call) goto end; - + linphone_core_accept_early_media(pauline->lc, pauline_call); CU_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &pauline->stat.number_of_LinphoneCallIncomingEarlyMedia, 1)); @@ -2016,7 +2016,7 @@ static void _call_with_media_relay(bool_t random_ports) { LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc"); bool_t call_ok; - + linphone_core_set_user_agent(marie->lc,"Natted Linphone",NULL); linphone_core_set_user_agent(pauline->lc,"Natted Linphone",NULL); @@ -2089,7 +2089,7 @@ static void call_with_privacy(void) { linphone_proxy_config_set_privacy(pauline_proxy,LinphonePrivacyId); CU_ASSERT_TRUE(call(pauline,marie)); - + c1=linphone_core_get_current_call(pauline->lc); c2=linphone_core_get_current_call(marie->lc); @@ -2245,7 +2245,7 @@ static void call_srtp_paused_and_resumed(void) { LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc"); const LinphoneCallParams *params; LinphoneCall *pauline_call; - + if (!linphone_core_media_encryption_supported(marie->lc,LinphoneMediaEncryptionSRTP)) goto end; linphone_core_set_media_encryption(pauline->lc,LinphoneMediaEncryptionSRTP); @@ -2254,25 +2254,25 @@ static void call_srtp_paused_and_resumed(void) { if (!BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallIncomingReceived,1))) goto end; pauline_call = linphone_core_get_current_call(pauline->lc); linphone_core_accept_call(marie->lc, linphone_core_get_current_call(marie->lc)); - + if (!BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallStreamsRunning,1))) goto end; if (!BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallStreamsRunning,1))) goto end; - + linphone_core_pause_call(pauline->lc, pauline_call); - + CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallPaused,1)); CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallPausedByRemote,1)); - + linphone_core_resume_call(pauline->lc, pauline_call); if (!BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallStreamsRunning,2))) goto end; if (!BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallStreamsRunning,2))) goto end; - + /*assert that after pause and resume, SRTP is still being used*/ params = linphone_call_get_current_params(linphone_core_get_current_call(pauline->lc)); CU_ASSERT_TRUE(linphone_call_params_get_media_encryption(params) == LinphoneMediaEncryptionSRTP); params = linphone_call_get_current_params(linphone_core_get_current_call(marie->lc)); CU_ASSERT_TRUE(linphone_call_params_get_media_encryption(params) == LinphoneMediaEncryptionSRTP); - + linphone_core_terminate_all_calls(marie->lc); CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallEnd,1)); CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallEnd,1)); @@ -2297,7 +2297,7 @@ static void call_with_file_player(void) { /*make sure the record file doesn't already exists, otherwise this test will append new samples to it*/ unlink(recordpath); - snprintf(hellopath,sizeof(hellopath), "%s/sounds/hello8000.wav", bc_tester_read_dir_prefix); + snprintf(hellopath,sizeof(hellopath), "%s/sounds/ahbahouaismaisbon.wav", bc_tester_read_dir_prefix); /*caller uses files instead of soundcard in order to avoid mixing soundcard input with file played using call's player*/ linphone_core_use_files(marie->lc,TRUE); @@ -2317,8 +2317,8 @@ static void call_with_file_player(void) { CU_ASSERT_TRUE(linphone_player_start(player)==0); } - /* This assert should be modified to be at least as long as the hello8000.wav file */ - CU_ASSERT_TRUE(wait_for_until(pauline->lc,marie->lc,&marie->stat.number_of_player_eof,1,23000)); + /* This assert should be modified to be at least as long as the WAV file */ + CU_ASSERT_TRUE(wait_for_until(pauline->lc,marie->lc,&marie->stat.number_of_player_eof,1,10000)); /*just to sleep*/ linphone_core_terminate_all_calls(marie->lc); @@ -2329,11 +2329,11 @@ static void call_with_file_player(void) { #if !defined(__arm__) && !defined(__arm64__) && !TARGET_IPHONE_SIMULATOR && !defined(ANDROID) { double similar; - const double threshold = 0.9; - CU_ASSERT_TRUE(ms_audio_diff(hellopath,recordpath,&similar,NULL,NULL)==0); - CU_ASSERT_TRUE(similar>threshold); - CU_ASSERT_TRUE(similar<=1.0); - if(similar > threshold && similar <=1.0) { + const int threshold = 90; + BC_ASSERT_EQUAL_INT(ms_audio_diff(hellopath,recordpath,&similar,NULL,NULL), 0); + BC_ASSERT_GREATER_INT(100*similar, threshold); + BC_ASSERT_LOWER_INT(100*similar, 100); + if (threshold < 100*similar && 100*similar < 100) { remove(recordpath); } } @@ -2430,7 +2430,7 @@ void call_base_with_configfile(LinphoneMediaEncryption mode, bool_t enable_video LinphoneCoreManager* marie = linphone_core_manager_new(marie_rc); LinphoneCoreManager* pauline = linphone_core_manager_new(pauline_rc); bool_t call_ok; - + if (enable_relay) { linphone_core_set_user_agent(marie->lc,"Natted Linphone",NULL); linphone_core_set_user_agent(pauline->lc,"Natted Linphone",NULL); @@ -2657,7 +2657,7 @@ static void early_media_call_with_update_base(bool_t media_change){ CU_ASSERT_TRUE(wait_for_list(lcs, &pauline->stat.number_of_LinphoneCallIncomingReceived,1,5000)); CU_ASSERT_TRUE(wait_for_list(lcs, &marie->stat.number_of_LinphoneCallOutgoingRinging,1,5000)); - + pauline_call = linphone_core_get_current_call(pauline->lc); if (!pauline_call) goto end; /* send a 183 to initiate the early media */ @@ -2665,7 +2665,7 @@ static void early_media_call_with_update_base(bool_t media_change){ CU_ASSERT_TRUE( wait_for_list(lcs, &pauline->stat.number_of_LinphoneCallIncomingEarlyMedia,1,1000) ); CU_ASSERT_TRUE( wait_for_list(lcs, &marie->stat.number_of_LinphoneCallOutgoingEarlyMedia,1,5000) ); - + pauline_params = linphone_call_params_copy(linphone_call_get_current_params(pauline_call)); if (media_change) { @@ -3355,7 +3355,7 @@ static void call_with_in_dialog_update(void) { pauline = linphone_core_manager_new( "pauline_rc"); CU_ASSERT_TRUE(call_ok=call(pauline,marie)); if (!call_ok) goto end; - + liblinphone_tester_check_rtcp(marie,pauline); params=linphone_core_create_call_params(marie->lc,linphone_core_get_current_call(marie->lc)); params->no_user_consent=TRUE; @@ -3366,7 +3366,7 @@ static void call_with_in_dialog_update(void) { CU_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&pauline->stat.number_of_LinphoneCallUpdatedByRemote,1)); CU_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&pauline->stat.number_of_LinphoneCallStreamsRunning,2)); end_call(marie,pauline); - + end: linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); @@ -3393,7 +3393,7 @@ static void call_with_in_dialog_codec_change_base(bool_t no_sdp) { pauline = linphone_core_manager_new( "pauline_rc"); CU_ASSERT_TRUE(call_ok=call(pauline,marie)); if (!call_ok) goto end; - + liblinphone_tester_check_rtcp(marie,pauline); params=linphone_core_create_call_params(marie->lc,linphone_core_get_current_call(marie->lc)); @@ -3489,7 +3489,7 @@ static void call_log_from_taken_from_p_asserted_id(void) { CU_ASSERT_TRUE(call_ok=call_with_caller_params(pauline,marie,params)); - + if (!call_ok) goto end; c1=linphone_core_get_current_call(pauline->lc); diff --git a/tester/common/bc_tester_utils.h b/tester/common/bc_tester_utils.h index 32fdf89a8..a6c5db6d4 100644 --- a/tester/common/bc_tester_utils.h +++ b/tester/common/bc_tester_utils.h @@ -121,7 +121,7 @@ char * bc_tester_res(const char *name); #define BC_ASSERT_DOUBLE_NOT_EQUAL(actual, expected, granularity) CU_assertImplementation(((fabs((double)(actual) - (expected)) > fabs((double)(granularity)))), __LINE__, ("CU_ASSERT_DOUBLE_NOT_EQUAL(" #actual "," #expected "," #granularity ")"), __FILE__, "", CU_FALSE) #define BC_ASSERT_DOUBLE_NOT_EQUAL_FATAL(actual, expected, granularity) CU_assertImplementation(((fabs((double)(actual) - (expected)) > fabs((double)(granularity)))), __LINE__, ("CU_ASSERT_DOUBLE_NOT_EQUAL_FATAL(" #actual "," #expected "," #granularity ")"), __FILE__, "", CU_TRUE) #define BC_ASSERT_GREATER(actual, expected) CU_assertImplementation(((actual) >= (expected)), __LINE__, ("CU_ASSERT_GREATER(" #actual "," #expected ")"), __FILE__, "", CU_FALSE) -#define BC_ASSERT_LOWER(actual, expected) CU_assertImplementation((actual) <= (expected)), __LINE__, ("CU_ASSERT_LOWER(" #actual "," #expected ")"), __FILE__, "", CU_FALSE) +#define BC_ASSERT_LOWER(actual, expected) CU_assertImplementation(((actual) <= (expected)), __LINE__, ("CU_ASSERT_LOWER(" #actual "," #expected ")"), __FILE__, "", CU_FALSE) /*Add some custom defines with logs in case of fail*/ #define BC_ASSERT_EQUAL_INT(actual, expected) { \ From 8fd0b3cccbb348ac8463a97cd487b424eb5dbb55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Grisez?= Date: Tue, 28 Apr 2015 13:53:57 +0200 Subject: [PATCH 068/157] Bugfix: no response when receiving a video call proposition and the dialog box disapeares because of time out --- gtk/main.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/gtk/main.c b/gtk/main.c index 78e320532..da8439e19 100644 --- a/gtk/main.c +++ b/gtk/main.c @@ -1313,7 +1313,8 @@ static void linphone_gtk_global_state_changed(LinphoneCore *lc, LinphoneGlobalSt } } -static void on_call_updated_response(GtkWidget *dialog, gint responseid, LinphoneCall *call){ +static void on_call_updated_response(GtkWidget *dialog, gint responseid, gpointer user_data){ + LinphoneCall *call = (LinphoneCall *)g_object_get_data(G_OBJECT(dialog), "call"); if (linphone_call_get_state(call)==LinphoneCallUpdatedByRemote){ LinphoneCore *lc=linphone_call_get_core(call); LinphoneCallParams *params=linphone_call_params_copy(linphone_call_get_current_params(call)); @@ -1321,13 +1322,12 @@ static void on_call_updated_response(GtkWidget *dialog, gint responseid, Linphon linphone_core_accept_call_update(lc,call,params); linphone_call_params_destroy(params); } - linphone_call_unref(call); g_source_remove_by_user_data(dialog); gtk_widget_destroy(dialog); } static void on_call_updated_timeout(GtkWidget *dialog){ - gtk_widget_destroy(dialog); + on_call_updated_response(dialog, GTK_RESPONSE_NO, NULL); } static void linphone_gtk_call_updated_by_remote(LinphoneCall *call){ @@ -1339,7 +1339,7 @@ static void linphone_gtk_call_updated_by_remote(LinphoneCall *call){ gboolean video_used=linphone_call_params_video_enabled(current_params); g_message("Video used=%i, video requested=%i, automatically_accept=%i", video_used,video_requested,pol->automatically_accept); - if (video_used==FALSE && video_requested && !pol->automatically_accept){ + if (!video_used && video_requested && !pol->automatically_accept){ linphone_core_defer_call_update(lc,call); { const LinphoneAddress *addr=linphone_call_get_remote_address(call); @@ -1352,8 +1352,9 @@ static void linphone_gtk_call_updated_by_remote(LinphoneCall *call){ GTK_MESSAGE_WARNING, GTK_BUTTONS_YES_NO, _("%s proposed to start video. Do you accept ?"),dname); - g_signal_connect(G_OBJECT(dialog),"response",(GCallback)on_call_updated_response,linphone_call_ref(call)); - g_timeout_add(20000,(GSourceFunc)on_call_updated_timeout,dialog); + g_object_set_data_full(G_OBJECT(dialog), "call", linphone_call_ref(call), (GDestroyNotify)linphone_call_unref); + g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK(on_call_updated_response), NULL); + g_timeout_add(20000,(GSourceFunc)on_call_updated_timeout,dialog); gtk_widget_show(dialog); } } From 86863cd0895bea72555f0d9849d5afab017ce998 Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Tue, 28 Apr 2015 14:25:19 +0200 Subject: [PATCH 069/157] quality_reporting_tester.c: Fix "Interval report if interval is configured" test by resetting RTCP SR count at each report --- tester/quality_reporting_tester.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tester/quality_reporting_tester.c b/tester/quality_reporting_tester.c index 33df384be..ca8f563e1 100644 --- a/tester/quality_reporting_tester.c +++ b/tester/quality_reporting_tester.c @@ -70,6 +70,8 @@ void on_report_send_mandatory(const LinphoneCall *call, int stream_type, const L CU_ASSERT_PTR_NOT_NULL(body=__strstr(body, "DialogID:")); if (report->remote_metrics.rtcp_sr_count&&ms!=NULL&&ms->rc!=NULL){ + /* Hack: reset rtcp_sr_count to 0 because in case of interval reports, we need one RTCP SR by interval */ + report->remote_metrics.rtcp_sr_count=0; CU_ASSERT_PTR_NOT_NULL(body=__strstr(body, "AdaptiveAlg:")); } } From 9001632e91b399b0eb240d0d7a360af8b2e7ce2a Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Tue, 28 Apr 2015 17:03:55 +0200 Subject: [PATCH 070/157] Fix compilation of GTK status notifier with Visual Studio. --- gtk/status_notifier.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/gtk/status_notifier.c b/gtk/status_notifier.c index 141308ff6..fffb0f162 100644 --- a/gtk/status_notifier.c +++ b/gtk/status_notifier.c @@ -19,9 +19,16 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "status_notifier.h" #include -#include #include +#ifdef _MSC_VER +#include +#define getpid() _getpid() +typedef int lppid_t; +#else +#include +typedef pid_t lppid_t; +#endif static const gchar *_bc_status_notifier_category_to_string[] = { "ApplicationStatus", @@ -503,7 +510,7 @@ static void _bc_status_notifier_name_lost(GDBusConnection *conn, const gchar *na void bc_status_notifier_start(BcStatusNotifier* obj, BcStatusNotifierParams* params, const BcStatusNotifierStateVTable *vtable, void *user_data) { if(obj->state == BcStatusNotifierStateStopped) { - pid_t pid = getpid(); + lppid_t pid = getpid(); char *dbus_name = g_strdup_printf("%s.%s-%d-%d", params->prefix, ITEM_NAME, pid, params->item_id); if(obj->params) bc_status_notifier_params_unref(obj->params); From 9c365d8ed426eda03c8417a2da7d811c43a74b6e Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Wed, 29 Apr 2015 11:16:10 +0200 Subject: [PATCH 071/157] set .so version to 7 (wasn't changed since 3.7.0) --- CMakeLists.txt | 2 +- configure.ac | 2 +- oRTP | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 66316a163..d08dedc4d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -28,7 +28,7 @@ set(LINPHONE_MAJOR_VERSION "3") set(LINPHONE_MINOR_VERSION "8") set(LINPHONE_MICRO_VERSION "1") set(LINPHONE_VERSION "${LINPHONE_MAJOR_VERSION}.${LINPHONE_MINOR_VERSION}.${LINPHONE_MICRO_VERSION}") -set(LINPHONE_SO_VERSION "6") +set(LINPHONE_SO_VERSION "7") file(GLOB LINPHONE_PO_FILES RELATIVE "${CMAKE_SOURCE_DIR}/po" "${CMAKE_SOURCE_DIR}/po/*.po") string(REGEX REPLACE "([a-zA-Z_]+)\\.po" "\\1" LINPHONE_ALL_LANGS "${LINPHONE_PO_FILES}") diff --git a/configure.ac b/configure.ac index 2eabeb943..068c35e52 100644 --- a/configure.ac +++ b/configure.ac @@ -17,7 +17,7 @@ if test "$LINPHONE_EXTRA_VERSION" != "" ;then LINPHONE_VERSION=$LINPHONE_VERSION.${LINPHONE_EXTRA_VERSION} fi -LIBLINPHONE_SO_CURRENT=6 dnl increment this number when you add/change/remove an interface +LIBLINPHONE_SO_CURRENT=7 dnl increment this number when you add/change/remove an interface LIBLINPHONE_SO_REVISION=0 dnl increment this number when you change source code, without changing interfaces; set to 0 when incrementing CURRENT LIBLINPHONE_SO_AGE=0 dnl increment this number when you add an interface, set to 0 if you remove an interface diff --git a/oRTP b/oRTP index a024f905f..01491a543 160000 --- a/oRTP +++ b/oRTP @@ -1 +1 @@ -Subproject commit a024f905fd42d7b90c16dd7562b226f0afc4c59e +Subproject commit 01491a5437b5328349428aa18e38253f399addf2 From 406857d1a4c207e721f4ffd8d4c70eba25759818 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Grisez?= Date: Wed, 29 Apr 2015 11:16:10 +0200 Subject: [PATCH 072/157] Fix build with Visual Studio --- gtk/status_icon.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gtk/status_icon.c b/gtk/status_icon.c index 08445a468..bdfe6dab0 100644 --- a/gtk/status_icon.c +++ b/gtk/status_icon.c @@ -30,7 +30,7 @@ typedef struct __LinphoneStatusIconDesc _LinphoneStatusIconDesc; static LinphoneStatusIcon *_linphone_status_icon_instance = NULL; static const _LinphoneStatusIconDesc *_linphone_status_icon_selected_desc = NULL; -static const _LinphoneStatusIconDesc *_linphone_status_icon_impls[]; +static const _LinphoneStatusIconDesc *_linphone_status_icon_impls[3]; struct _LinphoneStatusIconParams { @@ -483,7 +483,7 @@ static const _LinphoneStatusIconDesc _linphone_status_icon_impl_status_notifier /* List of implementations */ -static const _LinphoneStatusIconDesc *_linphone_status_icon_impls[] = { +static const _LinphoneStatusIconDesc *_linphone_status_icon_impls[3] = { &_linphone_status_icon_impl_status_notifier, #ifndef HAVE_GTK_OSX &_linphone_status_icon_impl_gtk_desc, From 03ba680b99d945d97e27467454d9f6c331fce256 Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Wed, 29 Apr 2015 14:11:07 +0200 Subject: [PATCH 073/157] submodules: update ms2 --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index 5747c5ce0..43c71f20f 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 5747c5ce0e5faecb0dc2122ee96b07c3c901e514 +Subproject commit 43c71f20f7a3fc9ea66f6e7ed923abd1caaf0508 From 7f5acfd6a95b99c2219e6637405240a2e662887b Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Wed, 29 Apr 2015 13:14:49 +0200 Subject: [PATCH 074/157] Fix a bug in ICE where the session state was not correct when a peer added a video stream during a call and the other peer refused it. --- coreapi/callbacks.c | 1 + coreapi/linphonecore.c | 1 + coreapi/misc.c | 2 + mediastreamer2 | 2 +- tester/call_tester.c | 87 +++++++++++++++++++++---------------- tester/liblinphone_tester.h | 2 +- tester/transport_tester.c | 2 +- 7 files changed, 57 insertions(+), 40 deletions(-) diff --git a/coreapi/callbacks.c b/coreapi/callbacks.c index 5b8d6450f..836d2b8a8 100644 --- a/coreapi/callbacks.c +++ b/coreapi/callbacks.c @@ -526,6 +526,7 @@ static void call_accepted(SalOp *op){ if (md && !sal_media_description_empty(md) && !linphone_core_incompatible_security(lc,md)){ linphone_call_update_remote_session_id_and_ver(call); + linphone_core_update_ice_state_in_call_stats(call); if (sal_media_description_has_dir(md,SalStreamSendOnly) || sal_media_description_has_dir(md,SalStreamInactive)){ { diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index ad77696f6..89c62000f 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -3593,6 +3593,7 @@ int linphone_core_start_accept_call_update(LinphoneCore *lc, LinphoneCall *call, linphone_call_make_local_media_description(lc,call); linphone_call_update_remote_session_id_and_ver(call); + linphone_call_stop_ice_for_inactive_streams(call); sal_call_set_local_media_description(call->op,call->localdesc); sal_call_accept(call->op); md=sal_call_get_final_media_description(call->op); diff --git a/coreapi/misc.c b/coreapi/misc.c index 5f34b21ff..83a732365 100644 --- a/coreapi/misc.c +++ b/coreapi/misc.c @@ -732,6 +732,8 @@ void linphone_call_stop_ice_for_inactive_streams(LinphoneCall *call) { clear_ice_check_list(call, cl); } } + + linphone_core_update_ice_state_in_call_stats(call); } void _update_local_media_description_from_ice(SalMediaDescription *desc, IceSession *session) { diff --git a/mediastreamer2 b/mediastreamer2 index 43c71f20f..0d8287da4 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 43c71f20f7a3fc9ea66f6e7ed923abd1caaf0508 +Subproject commit 0d8287da41ea367cc12d79590798ba8c6811c9e4 diff --git a/tester/call_tester.c b/tester/call_tester.c index ccb7784f1..c1e234e4c 100644 --- a/tester/call_tester.c +++ b/tester/call_tester.c @@ -1413,7 +1413,7 @@ static void audio_call_with_ice_no_matching_audio_codecs(void) { } #ifdef VIDEO_ENABLED -static LinphoneCall* setup_video(LinphoneCoreManager* caller,LinphoneCoreManager* callee) { +static LinphoneCall* setup_video(LinphoneCoreManager* caller,LinphoneCoreManager* callee, bool_t change_video_policy) { LinphoneVideoPolicy caller_policy; LinphoneCallParams* callee_params; LinphoneCall* call_obj; @@ -1424,13 +1424,15 @@ static LinphoneCall* setup_video(LinphoneCoreManager* caller,LinphoneCoreManager return NULL; } - caller_policy.automatically_accept=TRUE; - caller_policy.automatically_initiate=TRUE; + if (change_video_policy) { + caller_policy.automatically_accept=TRUE; + caller_policy.automatically_initiate=TRUE; + linphone_core_set_video_policy(caller->lc,&caller_policy); + } linphone_core_enable_video_capture(callee->lc, TRUE); linphone_core_enable_video_display(callee->lc, TRUE); linphone_core_enable_video_capture(caller->lc, TRUE); linphone_core_enable_video_display(caller->lc, FALSE); - linphone_core_set_video_policy(caller->lc,&caller_policy); if ((call_obj = linphone_core_get_current_call(callee->lc))) { callee_params = linphone_call_params_copy(linphone_call_get_current_params(call_obj)); @@ -1441,18 +1443,25 @@ static LinphoneCall* setup_video(LinphoneCoreManager* caller,LinphoneCoreManager return call_obj; } -bool_t add_video(LinphoneCoreManager* caller,LinphoneCoreManager* callee) { +bool_t add_video(LinphoneCoreManager* caller,LinphoneCoreManager* callee, bool_t change_video_policy) { stats initial_caller_stat=caller->stat; stats initial_callee_stat=callee->stat; + const LinphoneVideoPolicy *video_policy; LinphoneCall *call_obj; - if ((call_obj=setup_video(caller, callee))){ + if ((call_obj=setup_video(caller, callee, change_video_policy))){ CU_ASSERT_TRUE(wait_for(caller->lc,callee->lc,&caller->stat.number_of_LinphoneCallUpdatedByRemote,initial_caller_stat.number_of_LinphoneCallUpdatedByRemote+1)); CU_ASSERT_TRUE(wait_for(caller->lc,callee->lc,&callee->stat.number_of_LinphoneCallUpdating,initial_callee_stat.number_of_LinphoneCallUpdating+1)); CU_ASSERT_TRUE(wait_for(caller->lc,callee->lc,&callee->stat.number_of_LinphoneCallStreamsRunning,initial_callee_stat.number_of_LinphoneCallStreamsRunning+1)); CU_ASSERT_TRUE(wait_for(caller->lc,callee->lc,&caller->stat.number_of_LinphoneCallStreamsRunning,initial_caller_stat.number_of_LinphoneCallStreamsRunning+1)); - CU_ASSERT_TRUE(linphone_call_params_video_enabled(linphone_call_get_current_params(linphone_core_get_current_call(callee->lc)))); - CU_ASSERT_TRUE(linphone_call_params_video_enabled(linphone_call_get_current_params(linphone_core_get_current_call(caller->lc)))); + video_policy = linphone_core_get_video_policy(caller->lc); + if (video_policy->automatically_accept) { + CU_ASSERT_TRUE(linphone_call_params_video_enabled(linphone_call_get_current_params(linphone_core_get_current_call(callee->lc)))); + CU_ASSERT_TRUE(linphone_call_params_video_enabled(linphone_call_get_current_params(linphone_core_get_current_call(caller->lc)))); + } else { + CU_ASSERT_FALSE(linphone_call_params_video_enabled(linphone_call_get_current_params(linphone_core_get_current_call(callee->lc)))); + CU_ASSERT_FALSE(linphone_call_params_video_enabled(linphone_call_get_current_params(linphone_core_get_current_call(caller->lc)))); + } if (linphone_core_get_media_encryption(caller->lc) != LinphoneMediaEncryptionNone && linphone_core_get_media_encryption(callee->lc) != LinphoneMediaEncryptionNone) { const LinphoneCallParams* call_param; @@ -1484,10 +1493,14 @@ bool_t add_video(LinphoneCoreManager* caller,LinphoneCoreManager* callee) { } - linphone_call_set_next_video_frame_decoded_callback(call_obj,linphone_call_cb,callee->lc); - /*send vfu*/ - linphone_call_send_vfu_request(call_obj); - return wait_for(caller->lc,callee->lc,&callee->stat.number_of_IframeDecoded,initial_callee_stat.number_of_IframeDecoded+1); + if (video_policy->automatically_accept) { + linphone_call_set_next_video_frame_decoded_callback(call_obj,linphone_call_cb,callee->lc); + /*send vfu*/ + linphone_call_send_vfu_request(call_obj); + return wait_for(caller->lc,callee->lc,&callee->stat.number_of_IframeDecoded,initial_callee_stat.number_of_IframeDecoded+1); + } else { + return TRUE; + } } return FALSE; } @@ -1534,7 +1547,7 @@ static void call_with_video_added(void) { CU_ASSERT_TRUE((call_ok=call(pauline,marie))); if (!call_ok) goto end; - CU_ASSERT_TRUE(add_video(pauline,marie)); + CU_ASSERT_TRUE(add_video(pauline,marie, TRUE)); /*just to sleep*/ linphone_core_terminate_all_calls(pauline->lc); CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallEnd,1)); @@ -1561,7 +1574,7 @@ static void call_with_video_added_2(void) { CU_ASSERT_TRUE(call_ok=call(pauline,marie)); if (!call_ok) goto end; - CU_ASSERT_TRUE(add_video(marie,pauline)); + CU_ASSERT_TRUE(add_video(marie,pauline, TRUE)); /*just to sleep*/ linphone_core_terminate_all_calls(pauline->lc); CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallEnd,1)); @@ -1584,7 +1597,7 @@ static void call_with_video_added_random_ports(void) { CU_ASSERT_TRUE(call_ok=call(pauline,marie)); if (!call_ok) goto end; - CU_ASSERT_TRUE(add_video(pauline,marie)); + CU_ASSERT_TRUE(add_video(pauline,marie, TRUE)); /*just to sleep*/ linphone_core_terminate_all_calls(pauline->lc); CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallEnd,1)); @@ -1603,10 +1616,10 @@ static void call_with_several_video_switches(void) { if (!call_ok) goto end; - CU_ASSERT_TRUE(add_video(pauline,marie)); + CU_ASSERT_TRUE(add_video(pauline,marie, TRUE)); wait_for_until(pauline->lc,marie->lc,&dummy,1,1000); /* Wait for VFU request exchanges to be finished. */ CU_ASSERT_TRUE(remove_video(pauline,marie)); - CU_ASSERT_TRUE(add_video(pauline,marie)); + CU_ASSERT_TRUE(add_video(pauline,marie, TRUE)); wait_for_until(pauline->lc,marie->lc,&dummy,1,1000); /* Wait for VFU request exchanges to be finished. */ CU_ASSERT_TRUE(remove_video(pauline,marie)); /*just to sleep*/ @@ -1631,10 +1644,10 @@ static void srtp_call_with_several_video_switches(void) { CU_ASSERT_TRUE(call_ok=call(pauline,marie)); if (!call_ok) goto end; - CU_ASSERT_TRUE(add_video(pauline,marie)); + CU_ASSERT_TRUE(add_video(pauline,marie, TRUE)); wait_for_until(pauline->lc,marie->lc,&dummy,1,1000); /* Wait for VFU request exchanges to be finished. */ CU_ASSERT_TRUE(remove_video(pauline,marie)); - CU_ASSERT_TRUE(add_video(pauline,marie)); + CU_ASSERT_TRUE(add_video(pauline,marie, TRUE)); wait_for_until(pauline->lc,marie->lc,&dummy,1,1000); /* Wait for VFU request exchanges to be finished. */ CU_ASSERT_TRUE(remove_video(pauline,marie)); /*just to sleep*/ @@ -1889,32 +1902,27 @@ static void _call_with_ice_video(LinphoneVideoPolicy caller_policy, LinphoneVide CU_ASSERT_TRUE(call_ok = call(pauline, marie)); if (!call_ok) goto end; CU_ASSERT_TRUE(check_ice(pauline, marie, LinphoneIceStateHostConnection)); - CU_ASSERT_EQUAL(linphone_call_params_video_enabled(linphone_call_get_current_params(linphone_core_get_current_call(pauline->lc))), callee_policy.automatically_accept); /* Wait for ICE reINVITEs to complete. */ CU_ASSERT_TRUE(wait_for(pauline->lc, marie->lc, &pauline->stat.number_of_LinphoneCallStreamsRunning, 2) && wait_for(pauline->lc, pauline->lc, &marie->stat.number_of_LinphoneCallStreamsRunning, 2)); if (video_added_by_caller) { - CU_ASSERT_TRUE(add_video(pauline, marie)); + CU_ASSERT_TRUE(add_video(marie, pauline, FALSE)); } else if (video_added_by_callee) { - CU_ASSERT_TRUE(add_video(marie, pauline)); + CU_ASSERT_TRUE(add_video(pauline, marie, FALSE)); } if (video_added_by_caller || video_added_by_callee) { CU_ASSERT_TRUE(check_ice(pauline, marie, LinphoneIceStateHostConnection)); - CU_ASSERT_TRUE(linphone_call_params_video_enabled(linphone_call_get_current_params(linphone_core_get_current_call(pauline->lc)))); - CU_ASSERT_TRUE(linphone_call_params_video_enabled(linphone_call_get_current_params(linphone_core_get_current_call(marie->lc)))); } if (video_removed_by_caller) { - CU_ASSERT_TRUE(remove_video(pauline, marie)); - } else if (video_removed_by_callee) { CU_ASSERT_TRUE(remove_video(marie, pauline)); + } else if (video_removed_by_callee) { + CU_ASSERT_TRUE(remove_video(pauline, marie)); } if (video_removed_by_caller || video_removed_by_callee) { CU_ASSERT_TRUE(check_ice(pauline, marie, LinphoneIceStateHostConnection)); - CU_ASSERT_FALSE(linphone_call_params_video_enabled(linphone_call_get_current_params(linphone_core_get_current_call(pauline->lc)))); - CU_ASSERT_FALSE(linphone_call_params_video_enabled(linphone_call_get_current_params(linphone_core_get_current_call(marie->lc)))); } end: @@ -1923,20 +1931,24 @@ end: } static void call_with_ice_video_added(void) { - LinphoneVideoPolicy vpol = { FALSE, FALSE }; + LinphoneVideoPolicy vpol = { TRUE, TRUE }; _call_with_ice_video(vpol, vpol, TRUE, FALSE, TRUE, FALSE); } static void call_with_ice_video_added_2(void) { - LinphoneVideoPolicy caller_policy = { TRUE, TRUE }; - LinphoneVideoPolicy callee_policy = { FALSE, FALSE }; - _call_with_ice_video(caller_policy, callee_policy, TRUE, FALSE, FALSE, TRUE); + LinphoneVideoPolicy vpol = { TRUE, TRUE }; + _call_with_ice_video(vpol, vpol, TRUE, FALSE, FALSE, TRUE); } static void call_with_ice_video_added_3(void) { + LinphoneVideoPolicy vpol = { TRUE, TRUE }; + _call_with_ice_video(vpol, vpol, FALSE, TRUE, TRUE, FALSE); +} + +static void call_with_ice_video_added_and_refused(void) { LinphoneVideoPolicy caller_policy = { TRUE, TRUE }; LinphoneVideoPolicy callee_policy = { FALSE, FALSE }; - _call_with_ice_video(caller_policy, callee_policy, FALSE, TRUE, TRUE, FALSE); + _call_with_ice_video(caller_policy, callee_policy, TRUE, FALSE, FALSE, FALSE); } @@ -2032,7 +2044,7 @@ static void _call_with_media_relay(bool_t random_ports) { liblinphone_tester_check_rtcp(pauline,marie); #ifdef VIDEO_ENABLED - CU_ASSERT_TRUE(add_video(pauline,marie)); + CU_ASSERT_TRUE(add_video(pauline,marie, TRUE)); liblinphone_tester_check_rtcp(pauline,marie); #endif /*just to sleep*/ @@ -2499,7 +2511,7 @@ void call_base_with_configfile(LinphoneMediaEncryption mode, bool_t enable_video #ifdef VIDEO_ENABLED if (enable_video) { if (linphone_core_video_supported(marie->lc)) { - add_video(pauline,marie); + add_video(pauline,marie, TRUE); if (policy == LinphonePolicyUseIce) CU_ASSERT_TRUE(check_ice(pauline,marie,enable_tunnel?LinphoneIceStateReflexiveConnection:LinphoneIceStateHostConnection)); @@ -3562,7 +3574,7 @@ static void incoming_reinvite_with_invalid_ack_sdp(){ stats initial_caller_stat=caller->stat; stats initial_callee_stat=callee->stat; sal_call_set_sdp_handling(inc_call->op, SalOpSDPSimulateError); /* will force a parse error for the ACK SDP*/ - CU_ASSERT_PTR_NOT_NULL(setup_video(caller, callee)); + CU_ASSERT_PTR_NOT_NULL(setup_video(caller, callee, TRUE)); CU_ASSERT_TRUE(wait_for(caller->lc,callee->lc,&callee->stat.number_of_LinphoneCallUpdating,initial_callee_stat.number_of_LinphoneCallUpdating+1)); CU_ASSERT_TRUE(wait_for(caller->lc,callee->lc,&callee->stat.number_of_LinphoneCallStreamsRunning,initial_callee_stat.number_of_LinphoneCallStreamsRunning+1)); CU_ASSERT_TRUE(wait_for(caller->lc,callee->lc,&caller->stat.number_of_LinphoneCallStreamsRunning,initial_caller_stat.number_of_LinphoneCallStreamsRunning)); @@ -3603,7 +3615,7 @@ static void outgoing_reinvite_with_invalid_ack_sdp() { stats initial_caller_stat=caller->stat; stats initial_callee_stat=callee->stat; sal_call_set_sdp_handling(out_call->op, SalOpSDPSimulateError); /* will force a parse error for the ACK SDP*/ - CU_ASSERT_PTR_NOT_NULL(setup_video(caller, callee)); + CU_ASSERT_PTR_NOT_NULL(setup_video(caller, callee, TRUE)); CU_ASSERT_TRUE(wait_for(caller->lc,callee->lc,&callee->stat.number_of_LinphoneCallUpdating,initial_callee_stat.number_of_LinphoneCallUpdating+1)); CU_ASSERT_TRUE(wait_for(caller->lc,callee->lc,&callee->stat.number_of_LinphoneCallStreamsRunning,initial_callee_stat.number_of_LinphoneCallStreamsRunning+1)); CU_ASSERT_TRUE(wait_for(caller->lc,callee->lc,&caller->stat.number_of_LinphoneCallStreamsRunning,initial_caller_stat.number_of_LinphoneCallStreamsRunning)); @@ -4084,6 +4096,7 @@ test_t call_tests[] = { { "Call with ICE and video added", call_with_ice_video_added }, { "Call with ICE and video added 2", call_with_ice_video_added_2 }, { "Call with ICE and video added 3", call_with_ice_video_added_3 }, + { "Call with ICE and video added and refused", call_with_ice_video_added_and_refused }, { "Video call with ICE accepted using call params",video_call_ice_params}, { "Video call recording", video_call_recording_test }, { "Snapshot", video_call_snapshot }, diff --git a/tester/liblinphone_tester.h b/tester/liblinphone_tester.h index a8c00f987..2069b1d04 100644 --- a/tester/liblinphone_tester.h +++ b/tester/liblinphone_tester.h @@ -283,7 +283,7 @@ bool_t call_with_test_params(LinphoneCoreManager* caller_mgr ,const LinphoneCallTestParams *callee_test_params); bool_t call(LinphoneCoreManager* caller_mgr,LinphoneCoreManager* callee_mgr); -bool_t add_video(LinphoneCoreManager* caller,LinphoneCoreManager* callee); +bool_t add_video(LinphoneCoreManager* caller,LinphoneCoreManager* callee, bool_t change_video_policy); void end_call(LinphoneCoreManager *m1, LinphoneCoreManager *m2); void disable_all_audio_codecs_except_one(LinphoneCore *lc, const char *mime, int rate); void disable_all_video_codecs_except_one(LinphoneCore *lc, const char *mime); diff --git a/tester/transport_tester.c b/tester/transport_tester.c index f50946a5b..7cd8c5ac2 100644 --- a/tester/transport_tester.c +++ b/tester/transport_tester.c @@ -159,7 +159,7 @@ static void call_with_transport_base(LinphoneTunnelMode tunnel_mode, bool_t with } #ifdef VIDEO_ENABLED if (with_video_and_ice){ - CU_ASSERT_TRUE(add_video(pauline, marie)); + CU_ASSERT_TRUE(add_video(pauline, marie, TRUE)); } #endif end_call(pauline,marie); From 0eba7d71c71f92465b0c7123dc919ce15162f61d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Grisez?= Date: Wed, 29 Apr 2015 15:38:56 +0200 Subject: [PATCH 075/157] Do not build the status notifier implementation whether glib version < 2.26.0 --- configure.ac | 4 +++ gtk/Makefile.am | 8 +++++- gtk/status_icon.c | 64 +++++++++++++++++++++++++++++------------------ 3 files changed, 51 insertions(+), 25 deletions(-) diff --git a/configure.ac b/configure.ac index 068c35e52..e8103004d 100644 --- a/configure.ac +++ b/configure.ac @@ -347,10 +347,14 @@ if test "$gtk_ui" = "true" ; then fi AC_DEFINE([HAVE_GTK_OSX],[1],[Defined when gtk osx is used]) fi + + PKG_CHECK_MODULES(LIBGLIB, [glib-2.0 >= 2.26.0], [build_status_notifier=yes], [build_status_notifier=no]) else echo "GTK interface compilation is disabled." fi +AM_CONDITIONAL([BUILD_STATUS_NOTIFIER], [test "$build_status_notifier" = "yes"]) + AC_ARG_ENABLE(notify, [AS_HELP_STRING([--enable-notify=[yes/no]], [Enable libnotify support (default=yes)])], [case "${enableval}" in diff --git a/gtk/Makefile.am b/gtk/Makefile.am index 88625688e..32656c993 100644 --- a/gtk/Makefile.am +++ b/gtk/Makefile.am @@ -56,8 +56,14 @@ linphone_SOURCES= \ audio_assistant.c \ videowindow.c \ status_icon.c status_icon.h \ - status_notifier.c status_notifier.h \ linphone.h + +if BUILD_STATUS_NOTIFIER +linphone_SOURCES+= \ + status_notifier.c \ + status_notifier.h +endif + if BUILD_WIZARD linphone_SOURCES+= \ setupwizard.c diff --git a/gtk/status_icon.c b/gtk/status_icon.c index bdfe6dab0..50d48fcf2 100644 --- a/gtk/status_icon.c +++ b/gtk/status_icon.c @@ -24,13 +24,23 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #endif +#define STATUS_NOTIFIER_IS_USABLE GLIB_CHECK_VERSION(2, 26, 0) + #include "status_notifier.h" typedef struct __LinphoneStatusIconDesc _LinphoneStatusIconDesc; static LinphoneStatusIcon *_linphone_status_icon_instance = NULL; static const _LinphoneStatusIconDesc *_linphone_status_icon_selected_desc = NULL; -static const _LinphoneStatusIconDesc *_linphone_status_icon_impls[3]; +static GSList *_linphone_status_icon_impls = NULL; +#if STATUS_NOTIFIER_IS_USABLE +static const _LinphoneStatusIconDesc _linphone_status_icon_impl_status_notifier; +#endif +#ifdef HAVE_GTK_OSX +static const _LinphoneStatusIconDesc _linphone_status_icon_impl_gtkosx_app_desc; +#else +static const _LinphoneStatusIconDesc _linphone_status_icon_impl_gtk_desc; +#endif struct _LinphoneStatusIconParams { @@ -116,30 +126,30 @@ static gboolean _linphone_status_icon_desc_is_supported( } typedef struct { - int i; + GSList *i; LinphoneStatusIconDescFindResultCb cb; void *user_data; } _LinphoneStatusIconDescSearchCtx; -static void _linphone_status_icon_desc_is_supprted_result_cb( +static void _linphone_status_icon_desc_is_supported_result_cb( const _LinphoneStatusIconDesc *desc, gboolean result, _LinphoneStatusIconDescSearchCtx *ctx) { if(!result) { - ctx->i++; - for(; _linphone_status_icon_impls[ctx->i]; ctx->i++) { + ; + for(; ctx->i; ctx->i = g_slist_next(ctx->i)) { if(_linphone_status_icon_desc_is_supported( - _linphone_status_icon_impls[ctx->i], + (const _LinphoneStatusIconDesc *)g_slist_nth_data(ctx->i, 0), &result, - (LinphoneStatusIconDescIsSupportedResultCb)_linphone_status_icon_desc_is_supprted_result_cb, + (LinphoneStatusIconDescIsSupportedResultCb)_linphone_status_icon_desc_is_supported_result_cb, ctx)) { if(result) break; } else return; } } - if(ctx->cb) ctx->cb(_linphone_status_icon_impls[ctx->i], ctx->user_data); + if(ctx->cb) ctx->cb((const _LinphoneStatusIconDesc *)g_slist_nth_data(ctx->i, 0), ctx->user_data); g_free(ctx); } @@ -153,15 +163,15 @@ static gboolean _linphone_status_icon_find_first_available_impl( ctx->cb = cb; ctx->user_data = user_data; - for(ctx->i=0; _linphone_status_icon_impls[ctx->i]; ctx->i++) { + for(ctx->i=_linphone_status_icon_impls; ctx->i; ctx->i = g_slist_next(ctx->i)) { if(_linphone_status_icon_desc_is_supported( - _linphone_status_icon_impls[ctx->i], + (const _LinphoneStatusIconDesc *)g_slist_nth_data(ctx->i, 0), &result, - (LinphoneStatusIconDescIsSupportedResultCb)_linphone_status_icon_desc_is_supprted_result_cb, + (LinphoneStatusIconDescIsSupportedResultCb)_linphone_status_icon_desc_is_supported_result_cb, ctx)) { if(result) { - *desc = _linphone_status_icon_impls[ctx->i]; + *desc = (const _LinphoneStatusIconDesc *)g_slist_nth_data(ctx->i, 0); goto sync_return; } } else { @@ -222,9 +232,24 @@ void _linphone_status_icon_init_cb(const _LinphoneStatusIconDesc *desc, void *us g_free(ctx); } +void _linphone_status_icon_create_implementations_list(void) { +#if STATUS_NOTIFIER_IS_USABLE + _linphone_status_icon_impls = g_slist_prepend(_linphone_status_icon_impls, (void *)&_linphone_status_icon_impl_status_notifier); +#endif +#if HAVE_GTK_OSX + _linphone_status_icon_impls = g_slist_prepend(_linphone_status_icon_impls, (void *)&_linphone_status_icon_impl_gtkosx_app_desc); +#else + _linphone_status_icon_impls = g_slist_prepend(_linphone_status_icon_impls, (void *)&_linphone_status_icon_impl_gtk_desc); +#endif +} + gboolean linphone_status_icon_init(LinphoneStatusIconReadyCb ready_cb, void *user_data) { const _LinphoneStatusIconDesc *desc; - void **ctx = g_new(void *, 2); + void **ctx; + + _linphone_status_icon_create_implementations_list(); + + ctx = g_new(void *, 2); ctx[0] = ready_cb; ctx[1] = user_data; if(_linphone_status_icon_find_first_available_impl(&desc, _linphone_status_icon_init_cb, ctx)) { @@ -236,6 +261,7 @@ gboolean linphone_status_icon_init(LinphoneStatusIconReadyCb ready_cb, void *use void linphone_status_icon_uninit(void) { if(_linphone_status_icon_instance) _linphone_status_icon_free(_linphone_status_icon_instance); + if(_linphone_status_icon_impls) g_slist_free(_linphone_status_icon_impls); } LinphoneStatusIcon *linphone_status_icon_get(void) { @@ -370,6 +396,7 @@ static const _LinphoneStatusIconDesc _linphone_status_icon_impl_gtkosx_app_desc /* Implementation based on the StatusNotifier Freedesktop standard */ +#if STATUS_NOTIFIER_IS_USABLE typedef struct { int x; int y; @@ -480,15 +507,4 @@ static const _LinphoneStatusIconDesc _linphone_status_icon_impl_status_notifier .enable_blinking = _linphone_status_icon_impl_sn_enable_blinking, .is_supported = _linphone_status_icon_impl_sn_is_supported }; - - -/* List of implementations */ -static const _LinphoneStatusIconDesc *_linphone_status_icon_impls[3] = { - &_linphone_status_icon_impl_status_notifier, -#ifndef HAVE_GTK_OSX - &_linphone_status_icon_impl_gtk_desc, -#else - &_linphone_status_icon_impl_gtkosx_app_desc, #endif - NULL -}; From c34316fd1ed6787fffbffc6f4a7a688bf407a6f9 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Wed, 29 Apr 2015 17:51:20 +0200 Subject: [PATCH 076/157] Fix build with Visual Studio. --- gtk/status_icon.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/gtk/status_icon.c b/gtk/status_icon.c index 50d48fcf2..f5e09733c 100644 --- a/gtk/status_icon.c +++ b/gtk/status_icon.c @@ -33,14 +33,6 @@ typedef struct __LinphoneStatusIconDesc _LinphoneStatusIconDesc; static LinphoneStatusIcon *_linphone_status_icon_instance = NULL; static const _LinphoneStatusIconDesc *_linphone_status_icon_selected_desc = NULL; static GSList *_linphone_status_icon_impls = NULL; -#if STATUS_NOTIFIER_IS_USABLE -static const _LinphoneStatusIconDesc _linphone_status_icon_impl_status_notifier; -#endif -#ifdef HAVE_GTK_OSX -static const _LinphoneStatusIconDesc _linphone_status_icon_impl_gtkosx_app_desc; -#else -static const _LinphoneStatusIconDesc _linphone_status_icon_impl_gtk_desc; -#endif struct _LinphoneStatusIconParams { @@ -232,6 +224,15 @@ void _linphone_status_icon_init_cb(const _LinphoneStatusIconDesc *desc, void *us g_free(ctx); } +#if STATUS_NOTIFIER_IS_USABLE +static const _LinphoneStatusIconDesc _linphone_status_icon_impl_status_notifier; +#endif +#ifdef HAVE_GTK_OSX +static const _LinphoneStatusIconDesc _linphone_status_icon_impl_gtkosx_app_desc; +#else +static const _LinphoneStatusIconDesc _linphone_status_icon_impl_gtk_desc; +#endif + void _linphone_status_icon_create_implementations_list(void) { #if STATUS_NOTIFIER_IS_USABLE _linphone_status_icon_impls = g_slist_prepend(_linphone_status_icon_impls, (void *)&_linphone_status_icon_impl_status_notifier); From 02afad411f783477579900f7fd83c9315085d526 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Wed, 29 Apr 2015 21:17:55 +0200 Subject: [PATCH 077/157] update NEWS --- NEWS | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/NEWS b/NEWS index 650178962..875608a41 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,8 @@ +linphone-3.8.2 -- Aril 30th, 2015 + * fix audio bug with opus codec + * fix ICE corner case not properly handled and resulting bad final ice status + * update SO version to 7 (it should have been done in 3.8.0) + linphone-3.8.1 -- March 31th, 2015 Application level improvements: * Auto-answer ability From c05da28a45469fa3ef75186d632fb145d8c57576 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Grisez?= Date: Wed, 29 Apr 2015 22:25:23 +0200 Subject: [PATCH 078/157] Bugfix: implementations of LinphoneStatusIcon was stored in a bad order --- gtk/status_icon.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/gtk/status_icon.c b/gtk/status_icon.c index f5e09733c..c7ff07770 100644 --- a/gtk/status_icon.c +++ b/gtk/status_icon.c @@ -193,6 +193,7 @@ static LinphoneStatusIcon *_linphone_status_icon_new(const _LinphoneStatusIconDe static void _linphone_status_icon_free(LinphoneStatusIcon *obj) { if(obj->desc->uninit) obj->desc->uninit(obj->data); + if(obj->params) linphone_status_icon_params_unref(obj->params); g_free(obj); } @@ -235,12 +236,12 @@ static const _LinphoneStatusIconDesc _linphone_status_icon_impl_gtk_desc; void _linphone_status_icon_create_implementations_list(void) { #if STATUS_NOTIFIER_IS_USABLE - _linphone_status_icon_impls = g_slist_prepend(_linphone_status_icon_impls, (void *)&_linphone_status_icon_impl_status_notifier); + _linphone_status_icon_impls = g_slist_append(_linphone_status_icon_impls, (void *)&_linphone_status_icon_impl_status_notifier); #endif #if HAVE_GTK_OSX - _linphone_status_icon_impls = g_slist_prepend(_linphone_status_icon_impls, (void *)&_linphone_status_icon_impl_gtkosx_app_desc); + _linphone_status_icon_impls = g_slist_append(_linphone_status_icon_impls, (void *)&_linphone_status_icon_impl_gtkosx_app_desc); #else - _linphone_status_icon_impls = g_slist_prepend(_linphone_status_icon_impls, (void *)&_linphone_status_icon_impl_gtk_desc); + _linphone_status_icon_impls = g_slist_append(_linphone_status_icon_impls, (void *)&_linphone_status_icon_impl_gtk_desc); #endif } From 7c8abd503b31186b5ba3d4d4d3dfab2262e70111 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Grisez?= Date: Wed, 29 Apr 2015 22:31:56 +0200 Subject: [PATCH 079/157] Update NEWS about the implementation of StatusNotifier --- NEWS | 1 + 1 file changed, 1 insertion(+) diff --git a/NEWS b/NEWS index 875608a41..4023db3ac 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,7 @@ linphone-3.8.2 -- Aril 30th, 2015 * fix audio bug with opus codec * fix ICE corner case not properly handled and resulting bad final ice status * update SO version to 7 (it should have been done in 3.8.0) + * add support of the StatusNotifier standard to display a status icon on KDE5 linphone-3.8.1 -- March 31th, 2015 Application level improvements: From 6eda32d77244d5bdd4c8496891dfde8ca6f6069a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Grisez?= Date: Thu, 30 Apr 2015 00:34:54 +0200 Subject: [PATCH 080/157] Fix some memory leaks about pixbufs --- gtk/main.c | 20 ++++++++++++-------- gtk/setupwizard.c | 15 ++++++++++++--- gtk/status_icon.c | 4 ++-- 3 files changed, 26 insertions(+), 13 deletions(-) diff --git a/gtk/main.c b/gtk/main.c index da8439e19..79ec308b1 100644 --- a/gtk/main.c +++ b/gtk/main.c @@ -343,7 +343,7 @@ static void linphone_gtk_configure_window(GtkWidget *w, const char *window_name) linphone_gtk_visibility_set(shown,window_name,w,TRUE); if (icon_path) { GdkPixbuf *pbuf=create_pixbuf(icon_path); - if(pbuf != NULL) { + if(pbuf) { GList *pbuf_list = NULL; GdkPixbuf *pbuf_16=gdk_pixbuf_scale_simple(pbuf, 16, 16, GDK_INTERP_BILINEAR); GdkPixbuf *pbuf_32=gdk_pixbuf_scale_simple(pbuf, 32, 32, GDK_INTERP_BILINEAR); @@ -352,10 +352,7 @@ static void linphone_gtk_configure_window(GtkWidget *w, const char *window_name) pbuf_list = g_list_append(pbuf_list, pbuf_32); gtk_window_set_icon_list(GTK_WINDOW(w), pbuf_list); gtk_window_set_default_icon_list(pbuf_list); - g_object_unref(G_OBJECT(pbuf_16)); - g_object_unref(G_OBJECT(pbuf_32)); - g_object_unref(G_OBJECT(pbuf)); - g_list_free(pbuf_list); + g_list_free_full(pbuf_list, g_object_unref); } } } @@ -546,7 +543,10 @@ void linphone_gtk_show_about(void){ gtk_about_dialog_set_version(GTK_ABOUT_DIALOG(about),LIBLINPHONE_GIT_VERSION); gtk_about_dialog_set_program_name(GTK_ABOUT_DIALOG(about),linphone_gtk_get_ui_config("title","Linphone")); gtk_about_dialog_set_website(GTK_ABOUT_DIALOG(about),linphone_gtk_get_ui_config("home","http://www.linphone.org")); - if (logo) gtk_about_dialog_set_logo(GTK_ABOUT_DIALOG(about),logo); + if (logo) { + gtk_about_dialog_set_logo(GTK_ABOUT_DIALOG(about), logo); + g_object_unref(logo); + } tmp=linphone_gtk_get_ui_config("artists",defcfg); if (tmp!=defcfg){ const char *tmp2[2]; @@ -1735,7 +1735,7 @@ static void linphone_gtk_configure_main_window(){ } if (search_icon){ GdkPixbuf *pbuf=create_pixbuf(search_icon); - if(pbuf != NULL) { + if(pbuf) { gtk_image_set_from_pixbuf(GTK_IMAGE(linphone_gtk_get_widget(w,"directory_search_button_icon")),pbuf); g_object_unref(G_OBJECT(pbuf)); } @@ -1760,6 +1760,7 @@ static void linphone_gtk_configure_main_window(){ if (pbuf) { GtkButton *button=GTK_BUTTON(linphone_gtk_get_widget(w,"keypad")); gtk_button_set_image(button,gtk_image_new_from_pixbuf (pbuf)); + g_object_unref(pbuf); } } if (linphone_gtk_can_manage_accounts()) { @@ -2169,7 +2170,10 @@ int main(int argc, char *argv[]){ } g_set_application_name(app_name); pbuf=create_pixbuf(icon_path); - if (pbuf!=NULL) gtk_window_set_default_icon(pbuf); + if (pbuf) { + gtk_window_set_default_icon(pbuf); + g_object_unref(pbuf); + } #ifdef HAVE_GTK_OSX GtkosxApplication *theMacApp = gtkosx_application_get(); diff --git a/gtk/setupwizard.c b/gtk/setupwizard.c index 8e269e266..335062a01 100644 --- a/gtk/setupwizard.c +++ b/gtk/setupwizard.c @@ -26,8 +26,6 @@ static const int PASSWORD_MIN_SIZE = 6; static const int LOGIN_MIN_SIZE = 4; static GtkWidget *the_assistant=NULL; -static GdkPixbuf *ok; -static GdkPixbuf *notok; static GtkWidget *create_intro(){ GtkWidget *vbox=gtk_vbox_new(FALSE,2); @@ -205,10 +203,12 @@ static void account_email_changed(GtkEntry *entry, GtkWidget *w) { GtkWidget *assistant=gtk_widget_get_toplevel(w); if (g_regex_match_simple("^[a-z0-9]+([_\\.-][a-z0-9]+)*@([a-z0-9]+([\\.-][a-z0-9]+)*)+\\.[a-z]{2,}$", gtk_entry_get_text(email), 0, 0)) { + GdkPixbuf *ok = GDK_PIXBUF(g_object_get_data(G_OBJECT(the_assistant), "ok")); g_object_set_data(G_OBJECT(w),"is_email_correct",GINT_TO_POINTER(1)); gtk_image_set_from_pixbuf(isEmailOk, ok); } else { + GdkPixbuf *notok = GDK_PIXBUF(g_object_get_data(G_OBJECT(the_assistant), "notok")); g_object_set_data(G_OBJECT(w),"is_email_correct",GINT_TO_POINTER(0)); gtk_image_set_from_pixbuf(isEmailOk, notok); } @@ -227,11 +227,13 @@ static void account_password_changed(GtkEntry *entry, GtkWidget *w) { if (gtk_entry_get_text_length(password) >= PASSWORD_MIN_SIZE && g_ascii_strcasecmp(gtk_entry_get_text(password), gtk_entry_get_text(password_confirm)) == 0) { + GdkPixbuf *ok = GDK_PIXBUF(g_object_get_data(G_OBJECT(the_assistant), "ok")); g_object_set_data(G_OBJECT(w),"is_password_correct",GINT_TO_POINTER(1)); gtk_image_set_from_pixbuf(isPasswordOk, ok); gtk_label_set_text(passwordError, ""); } else { + GdkPixbuf *notok = GDK_PIXBUF(g_object_get_data(G_OBJECT(the_assistant), "notok")); if (gtk_entry_get_text_length(password) < PASSWORD_MIN_SIZE) { gtk_label_set_text(passwordError, "Password is too short !"); } @@ -252,11 +254,13 @@ gboolean update_interface_with_username_availability(gpointer *w) { int account_existing = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(w),"is_username_used")); if (account_existing == 0) { + GdkPixbuf *ok = GDK_PIXBUF(g_object_get_data(G_OBJECT(the_assistant), "ok")); g_object_set_data(G_OBJECT(w),"is_username_available",GINT_TO_POINTER(1)); gtk_image_set_from_pixbuf(isUsernameOk, ok); gtk_label_set_text(usernameError, ""); } else { + GdkPixbuf *notok = GDK_PIXBUF(g_object_get_data(G_OBJECT(the_assistant), "notok")); gtk_label_set_text(usernameError, "Username is already in use !"); g_object_set_data(G_OBJECT(w),"is_username_available",GINT_TO_POINTER(0)); gtk_image_set_from_pixbuf(isUsernameOk, notok); @@ -297,6 +301,7 @@ static void account_username_changed(GtkEntry *entry, GtkWidget *w) { #endif } else { + GdkPixbuf *notok = GDK_PIXBUF(g_object_get_data(G_OBJECT(the_assistant), "notok")); if (gtk_entry_get_text_length(username) < LOGIN_MIN_SIZE) { gtk_label_set_text(usernameError, "Username is too short"); } @@ -313,7 +318,7 @@ static void account_username_changed(GtkEntry *entry, GtkWidget *w) { static GtkWidget *create_account_information_page() { GtkWidget *vbox=gtk_table_new(7, 3, FALSE); - + GdkPixbuf *notok = GDK_PIXBUF(g_object_get_data(G_OBJECT(the_assistant), "notok")); GtkWidget *label=gtk_label_new(_("(*) Required fields")); GtkWidget *labelUsername=gtk_label_new(_("Username: (*)")); GtkWidget *isUsernameOk=gtk_image_new_from_pixbuf(notok); @@ -595,6 +600,8 @@ void linphone_gtk_show_assistant(void){ GtkWidget *validate; GtkWidget *error; GtkWidget *end; + GdkPixbuf *ok; + GdkPixbuf *notok; if(the_assistant!=NULL) return; w=the_assistant=gtk_assistant_new(); @@ -602,7 +609,9 @@ void linphone_gtk_show_assistant(void){ gtk_window_set_title(GTK_WINDOW(w),_("SIP account configuration assistant")); ok = create_pixbuf(linphone_gtk_get_ui_config("ok","ok.png")); + g_object_set_data_full(G_OBJECT(the_assistant), "ok", ok, g_object_unref); notok = create_pixbuf(linphone_gtk_get_ui_config("notok","notok.png")); + g_object_set_data_full(G_OBJECT(the_assistant), "notok", notok, g_object_unref); p1=create_intro(); p2=create_setup_signin_choice(); diff --git a/gtk/status_icon.c b/gtk/status_icon.c index c7ff07770..5a8be1dbb 100644 --- a/gtk/status_icon.c +++ b/gtk/status_icon.c @@ -293,10 +293,10 @@ static void _linphone_status_icon_impl_gtk_init(LinphoneStatusIcon *si) { GtkStatusIcon *icon=gtk_status_icon_new_from_pixbuf(pbuf); g_signal_connect_swapped(G_OBJECT(icon),"activate", G_CALLBACK(_linphone_status_icon_impl_gtk_on_click_cb), si); g_signal_connect(G_OBJECT(icon), "popup-menu", G_CALLBACK(_linphone_status_icon_impl_gtk_popup_menu), si); - g_object_set_data(G_OBJECT(icon),"icon",pbuf); + g_object_set_data_full(G_OBJECT(icon),"icon",pbuf, g_object_unref); g_object_unref(pbuf); pbuf=create_pixbuf(call_icon_path); - g_object_set_data(G_OBJECT(icon),"call_icon",pbuf); + g_object_set_data_full(G_OBJECT(icon),"call_icon",pbuf, g_object_unref); g_object_unref(pbuf); si->data = icon; } From b03c70b06a6af594a2d7f5a222946611f4012c63 Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Thu, 30 Apr 2015 10:28:44 +0200 Subject: [PATCH 081/157] gtk: only text area can have focus in chat window --- gtk/main.ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtk/main.ui b/gtk/main.ui index 48e5a61d6..8af36fcb8 100644 --- a/gtk/main.ui +++ b/gtk/main.ui @@ -116,7 +116,7 @@ True - True + False 4 From c0a07de3b6d6934fc3af6a5ad35c07363d8932be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Grisez?= Date: Thu, 30 Apr 2015 10:37:01 +0200 Subject: [PATCH 082/157] Update traductions --- po/ar.po | 320 ++++++++++++++++++++++++++-------------------------- po/cs.po | 272 ++++++++++++++++++++++---------------------- po/de.po | 272 ++++++++++++++++++++++---------------------- po/es.po | 272 ++++++++++++++++++++++---------------------- po/fr.po | 272 ++++++++++++++++++++++---------------------- po/he.po | 272 ++++++++++++++++++++++---------------------- po/hu.po | 272 ++++++++++++++++++++++---------------------- po/it.po | 270 ++++++++++++++++++++++---------------------- po/ja.po | 272 ++++++++++++++++++++++---------------------- po/nb_NO.po | 272 ++++++++++++++++++++++---------------------- po/nl.po | 272 ++++++++++++++++++++++---------------------- po/pl.po | 270 ++++++++++++++++++++++---------------------- po/pt_BR.po | 270 ++++++++++++++++++++++---------------------- po/ru.po | 274 ++++++++++++++++++++++---------------------- po/sr.po | 272 ++++++++++++++++++++++---------------------- po/sv.po | 272 ++++++++++++++++++++++---------------------- po/tr.po | 274 ++++++++++++++++++++++---------------------- po/zh_CN.po | 272 ++++++++++++++++++++++---------------------- po/zh_TW.po | 272 ++++++++++++++++++++++---------------------- 19 files changed, 2607 insertions(+), 2607 deletions(-) diff --git a/po/ar.po b/po/ar.po index 84c207abd..d5b7711d4 100644 --- a/po/ar.po +++ b/po/ar.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: linphone-gtk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-04-01 16:25+0200\n" -"PO-Revision-Date: 2015-04-12 14:07+0000\n" -"Last-Translator: محيي الدين \n" +"POT-Creation-Date: 2015-04-30 10:13+0200\n" +"PO-Revision-Date: 2015-04-30 08:13+0000\n" +"Last-Translator: Belledonne Communications \n" "Language-Team: Arabic (http://www.transifex.com/projects/p/linphone-gtk/language/ar/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -97,122 +97,126 @@ msgstr "أنا" msgid "Couldn't find pixmap file: %s" msgstr "أيقونة غير موجودة : %s" -#: ../gtk/main.c:136 +#: ../gtk/main.c:137 msgid "log to stdout some debug information while running." msgstr "أظهِرْ بعض معلومات التنقيح خلال التشغيل." -#: ../gtk/main.c:137 +#: ../gtk/main.c:138 msgid "path to a file to write logs into." msgstr "الدليل إلى الملف الذي سيُكتَب فيه سجل الوقائع." -#: ../gtk/main.c:138 +#: ../gtk/main.c:139 msgid "Start linphone with video disabled." msgstr "ابدأ لِنْفُونْ لكن دون تفعيل الفيديو." -#: ../gtk/main.c:139 +#: ../gtk/main.c:140 msgid "Start only in the system tray, do not show the main interface." msgstr "شغِّله مُصغَّرا، ولا تُظهِر الواجهة الرئيسية." -#: ../gtk/main.c:140 +#: ../gtk/main.c:141 msgid "address to call right now" msgstr "العنوان المُراد الاتصال به الآن" -#: ../gtk/main.c:141 +#: ../gtk/main.c:142 msgid "" "Specifiy a working directory (should be the base of the installation, eg: " "c:\\Program Files\\Linphone)" msgstr "حدِّد مجلد العمل (الذي سيكون مجلد التثبيت، مثلا c:\\Program Files\\Linphone)" -#: ../gtk/main.c:142 +#: ../gtk/main.c:143 msgid "Configuration file" msgstr "ملف التهيئة" -#: ../gtk/main.c:143 +#: ../gtk/main.c:144 msgid "Run the audio assistant" msgstr "ابدأ مرشد الصوت" -#: ../gtk/main.c:144 +#: ../gtk/main.c:145 msgid "Run self test and exit 0 if succeed" msgstr "شغِّل الاختبار الذاتي ثم اخرِجْ 0 إذا نجح" -#: ../gtk/main.c:1069 +#: ../gtk/main.c:1070 #, c-format msgid "" "%s would like to add you to his contact list.\n" "Would you allow him to see your presence status or add him to your contact list ?\n" "If you answer no, this person will be temporarily blacklisted." -msgstr "%s يريد إضافتك إلى جهة اتصاله.\nهل تريد السماح له برؤية معلومات حضورك وكذا إضافته إلى جهة اتصالك أيضا ؟ إذا أجبت ب لا، سيُحظَر هذا الشخص مؤقتا." +msgstr "%s يريد إضافتك إلى جهة اتصاله.\nهل تريد السماح له برؤية معلومات حضورك وكذا إضافته إلى جهة اتصالك أيضا ؟ إذا أجبت بلا، سيُحظَر هذا الشخص مؤقتا." -#: ../gtk/main.c:1146 +#: ../gtk/main.c:1147 #, c-format msgid "" "Please enter your password for username %s\n" " at realm %s:" -msgstr "ادخل كلمة السر ل %s\n في نطاق %s:" +msgstr "ادخل كلمة السر لـ %s\n في نطاق %s:" -#: ../gtk/main.c:1267 +#: ../gtk/main.c:1268 msgid "Call error" msgstr "خطأ في المكالمة" -#: ../gtk/main.c:1270 ../coreapi/linphonecore.c:3842 +#: ../gtk/main.c:1271 ../coreapi/linphonecore.c:3846 msgid "Call ended" msgstr "إنتهت المكالمة" -#: ../gtk/main.c:1273 ../coreapi/call_log.c:221 +#: ../gtk/main.c:1274 ../coreapi/call_log.c:221 msgid "Incoming call" msgstr "مكالمة واردة" -#: ../gtk/main.c:1275 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 +#: ../gtk/main.c:1276 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 msgid "Answer" msgstr "أجِبْ" -#: ../gtk/main.c:1277 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1278 ../gtk/main.ui.h:6 msgid "Decline" msgstr "ارفضْ" -#: ../gtk/main.c:1283 +#: ../gtk/main.c:1284 msgid "Call paused" msgstr "المكالمة متوقفة" -#: ../gtk/main.c:1283 +#: ../gtk/main.c:1284 #, c-format msgid "by %s" msgstr "بواسطة %s" -#: ../gtk/main.c:1353 +#: ../gtk/main.c:1354 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "يود %s تشغيل الفيديو. هل تقبل ذلك ؟" -#: ../gtk/main.c:1516 +#: ../gtk/main.c:1509 msgid "Website link" msgstr "وصلة إلى الموقع وِبْ" -#: ../gtk/main.c:1565 -msgid "Linphone - a video internet phone" -msgstr "لِنْفُونْ - الهاتف المرئي عبر الإنترنت" +#: ../gtk/main.c:1568 ../gtk/waiting.ui.h:1 +msgid "Linphone" +msgstr "لِنْفُونْ" -#: ../gtk/main.c:1657 +#: ../gtk/main.c:1569 +msgid "A video internet phone" +msgstr "" + +#: ../gtk/main.c:1629 #, c-format msgid "%s (Default)" msgstr "%s (افتراضي)" -#: ../gtk/main.c:1989 ../coreapi/callbacks.c:1057 +#: ../gtk/main.c:1962 ../coreapi/callbacks.c:1063 #, c-format msgid "We are transferred to %s" msgstr "التحويل إلى %s" -#: ../gtk/main.c:1999 +#: ../gtk/main.c:1972 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." msgstr "لا وجود للوحة الصوت على هذا الحاسوب.\nلن تتمكن من تلقي أو إجراء أي مكالمة." -#: ../gtk/main.c:2147 +#: ../gtk/main.c:2117 msgid "A free SIP video-phone" msgstr "هاتف SIP المرئي الحر" -#: ../gtk/main.c:2252 +#: ../gtk/main.c:2221 #, c-format msgid "Hello\n" msgstr "أهلا\n" @@ -225,9 +229,9 @@ msgstr "أضف إلى دفتر العناوين" msgid "Presence status" msgstr "معلومة الحضور" -#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:552 ../gtk/contact.ui.h:1 +#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:569 ../gtk/contact.ui.h:1 msgid "Name" -msgstr "الإسم" +msgstr "الاسم" #: ../gtk/friendlist.c:721 msgid "Call" @@ -266,124 +270,124 @@ msgstr "احذف تاريخ دردشات '%s'" msgid "Add new contact from %s directory" msgstr "اضف جهة اتصال انطلاقا من الدليل %s" -#: ../gtk/propertybox.c:558 +#: ../gtk/propertybox.c:575 msgid "Rate (Hz)" msgstr "التردد (هرتز)" -#: ../gtk/propertybox.c:564 +#: ../gtk/propertybox.c:581 msgid "Status" msgstr "الحالة" -#: ../gtk/propertybox.c:570 +#: ../gtk/propertybox.c:587 msgid "IP Bitrate (kbit/s)" msgstr "صبيب IP (ك.بِتْ/ثانية)" -#: ../gtk/propertybox.c:577 +#: ../gtk/propertybox.c:596 msgid "Parameters" msgstr "الإعدادات" -#: ../gtk/propertybox.c:620 ../gtk/propertybox.c:763 +#: ../gtk/propertybox.c:639 ../gtk/propertybox.c:782 msgid "Enabled" msgstr "مفعَّل" -#: ../gtk/propertybox.c:622 ../gtk/propertybox.c:763 ../gtk/parameters.ui.h:20 +#: ../gtk/propertybox.c:641 ../gtk/propertybox.c:782 ../gtk/parameters.ui.h:20 msgid "Disabled" msgstr "غير مفعَّل" -#: ../gtk/propertybox.c:809 +#: ../gtk/propertybox.c:828 msgid "Account" msgstr "الحساب" -#: ../gtk/propertybox.c:1072 +#: ../gtk/propertybox.c:1091 msgid "English" msgstr "الإنجليزية" -#: ../gtk/propertybox.c:1073 +#: ../gtk/propertybox.c:1092 msgid "French" msgstr "الفرنسية" -#: ../gtk/propertybox.c:1074 +#: ../gtk/propertybox.c:1093 msgid "Swedish" msgstr "السويدية" -#: ../gtk/propertybox.c:1075 +#: ../gtk/propertybox.c:1094 msgid "Italian" msgstr "الإيطالية" -#: ../gtk/propertybox.c:1076 +#: ../gtk/propertybox.c:1095 msgid "Spanish" msgstr "الإسبانية" -#: ../gtk/propertybox.c:1077 +#: ../gtk/propertybox.c:1096 msgid "Brazilian Portugese" msgstr "البرتغالية البرازيلية" -#: ../gtk/propertybox.c:1078 +#: ../gtk/propertybox.c:1097 msgid "Polish" msgstr "البولونية" -#: ../gtk/propertybox.c:1079 +#: ../gtk/propertybox.c:1098 msgid "German" msgstr "الألمانية" -#: ../gtk/propertybox.c:1080 +#: ../gtk/propertybox.c:1099 msgid "Russian" msgstr "الروسية" -#: ../gtk/propertybox.c:1081 +#: ../gtk/propertybox.c:1100 msgid "Japanese" msgstr "اليابانية" -#: ../gtk/propertybox.c:1082 +#: ../gtk/propertybox.c:1101 msgid "Dutch" msgstr "الهولندية" -#: ../gtk/propertybox.c:1083 +#: ../gtk/propertybox.c:1102 msgid "Hungarian" msgstr "الهنغارية" -#: ../gtk/propertybox.c:1084 +#: ../gtk/propertybox.c:1103 msgid "Czech" msgstr "التشيكية" -#: ../gtk/propertybox.c:1085 +#: ../gtk/propertybox.c:1104 msgid "Chinese" msgstr "الصينية المبسَّطة" -#: ../gtk/propertybox.c:1086 +#: ../gtk/propertybox.c:1105 msgid "Traditional Chinese" msgstr "الصينية التقليدية" -#: ../gtk/propertybox.c:1087 +#: ../gtk/propertybox.c:1106 msgid "Norwegian" msgstr "النرويجية" -#: ../gtk/propertybox.c:1088 +#: ../gtk/propertybox.c:1107 msgid "Hebrew" msgstr "العبرية" -#: ../gtk/propertybox.c:1089 +#: ../gtk/propertybox.c:1108 msgid "Serbian" msgstr "الصربية" -#: ../gtk/propertybox.c:1156 +#: ../gtk/propertybox.c:1175 msgid "" "You need to restart linphone for the new language selection to take effect." msgstr "يجب إعادة تشغيل لِنْفُونْ لكي تٌفعَّل اللغة المختارة." -#: ../gtk/propertybox.c:1236 +#: ../gtk/propertybox.c:1255 msgid "None" msgstr "بدون" -#: ../gtk/propertybox.c:1240 +#: ../gtk/propertybox.c:1259 msgid "SRTP" msgstr "SRTP" -#: ../gtk/propertybox.c:1246 +#: ../gtk/propertybox.c:1265 msgid "DTLS" msgstr "DTLS" -#: ../gtk/propertybox.c:1253 +#: ../gtk/propertybox.c:1272 msgid "ZRTP" msgstr "ZRTP" @@ -400,7 +404,7 @@ msgstr "أنت تستخدم الإصدار الأحدث." #: ../gtk/buddylookup.c:85 msgid "Firstname, Lastname" -msgstr "الإسم، اللقب" +msgstr "الاسم، اللقب" #: ../gtk/buddylookup.c:160 msgid "Error communicating with server." @@ -429,133 +433,133 @@ msgstr[3] "عُثِر على %i جهات اتصال" msgstr[4] "عُثِر على %i جهة اتصال" msgstr[5] "عُثِر على %i جهة اتصال" -#: ../gtk/setupwizard.c:34 +#: ../gtk/setupwizard.c:32 msgid "" "Welcome!\n" "This assistant will help you to use a SIP account for your calls." msgstr "مرحبا !\nسيمكنك هذا المرشد من إعداد حسابك SIP لإجراء المكالمات." -#: ../gtk/setupwizard.c:43 +#: ../gtk/setupwizard.c:41 msgid "Create an account on linphone.org" msgstr "إنشاء حساب في linphone.org" -#: ../gtk/setupwizard.c:44 +#: ../gtk/setupwizard.c:42 msgid "I have already a linphone.org account and I just want to use it" msgstr "أتوفر مسبقا على حساب في linphone.org وأريد فقط استخدامه" -#: ../gtk/setupwizard.c:45 +#: ../gtk/setupwizard.c:43 msgid "I have already a sip account and I just want to use it" msgstr "أتوفر مسبقا على حساب sip وأريد فقط استخدامه" -#: ../gtk/setupwizard.c:46 +#: ../gtk/setupwizard.c:44 msgid "I want to specify a remote configuration URI" msgstr "أريد تحديد عنوان التهيئة عن بعد" -#: ../gtk/setupwizard.c:89 +#: ../gtk/setupwizard.c:87 msgid "Enter your linphone.org username" -msgstr "أدخِلْ إسم المستخدم في linphone.org" +msgstr "أدخِل اسم المستخدم في linphone.org" -#: ../gtk/setupwizard.c:102 ../gtk/parameters.ui.h:85 ../gtk/ldap.ui.h:4 +#: ../gtk/setupwizard.c:100 ../gtk/parameters.ui.h:85 ../gtk/ldap.ui.h:4 msgid "Username:" -msgstr "إسم المستخدم :" +msgstr "اسم المستخدم :" -#: ../gtk/setupwizard.c:104 ../gtk/password.ui.h:4 ../gtk/ldap.ui.h:5 +#: ../gtk/setupwizard.c:102 ../gtk/password.ui.h:4 ../gtk/ldap.ui.h:5 msgid "Password:" msgstr "كلمة السر :" -#: ../gtk/setupwizard.c:124 +#: ../gtk/setupwizard.c:122 msgid "Enter your account informations" msgstr "أدخل معلومات حسابك" -#: ../gtk/setupwizard.c:140 +#: ../gtk/setupwizard.c:138 msgid "Username*" -msgstr "إسم المستخدم*" +msgstr "اسم المستخدم*" -#: ../gtk/setupwizard.c:141 +#: ../gtk/setupwizard.c:139 msgid "Password*" msgstr "كلمة السر*" -#: ../gtk/setupwizard.c:144 +#: ../gtk/setupwizard.c:142 msgid "Domain*" msgstr "النطاق*" -#: ../gtk/setupwizard.c:145 +#: ../gtk/setupwizard.c:143 msgid "Proxy" msgstr "الوكيل" -#: ../gtk/setupwizard.c:317 +#: ../gtk/setupwizard.c:322 msgid "(*) Required fields" msgstr "(*) حقول ضرورية" -#: ../gtk/setupwizard.c:318 +#: ../gtk/setupwizard.c:323 msgid "Username: (*)" -msgstr "إسم المستخدم* : (*)" +msgstr "اسم المستخدم* : (*)" -#: ../gtk/setupwizard.c:320 +#: ../gtk/setupwizard.c:325 msgid "Password: (*)" msgstr "كلمة السر* : (*)" -#: ../gtk/setupwizard.c:322 +#: ../gtk/setupwizard.c:327 msgid "Email: (*)" msgstr "البريد الالكتروني : (*)" -#: ../gtk/setupwizard.c:324 +#: ../gtk/setupwizard.c:329 msgid "Confirm your password: (*)" msgstr "أكِّد كلمة السر : (*)" -#: ../gtk/setupwizard.c:338 +#: ../gtk/setupwizard.c:343 msgid "Keep me informed with linphone updates" msgstr "أحطني علما بتحديثات لِنْفُونْ" -#: ../gtk/setupwizard.c:394 +#: ../gtk/setupwizard.c:399 msgid "" "Error, account not validated, username already used or server unreachable.\n" "Please go back and try again." -msgstr "خطأ، لم يتم تأكيد الحساب، إسم المستخدم سبق استخدامه أو تعذر الوصول للخادم.\nيُرجى إعادة المحاولة لاحقا." +msgstr "خطأ، لم يتم تأكيد الحساب، سبق استخدام اسم المستخدم أو تعذر الوصول للخادم.\nيُرجى إعادة المحاولة لاحقا." -#: ../gtk/setupwizard.c:405 +#: ../gtk/setupwizard.c:410 msgid "Thank you. Your account is now configured and ready for use." msgstr "شكرا لك، لقد جرت تهيئة حسابك وهو الآن قابل للاستخدام." -#: ../gtk/setupwizard.c:413 +#: ../gtk/setupwizard.c:418 msgid "" "Please validate your account by clicking on the link we just sent you by email.\n" "Then come back here and press Next button." msgstr "يُرجى تأكيد حسابك وذلك بالضغط على الوصلة التي أرسلناها لك بالبريد الإلكتروني.\nثم ارجع إلى هنا واضغط على زر التالي." -#: ../gtk/setupwizard.c:602 +#: ../gtk/setupwizard.c:609 msgid "SIP account configuration assistant" msgstr "مرشد تهيئة حساب SIP" -#: ../gtk/setupwizard.c:620 +#: ../gtk/setupwizard.c:629 msgid "Welcome to the account setup assistant" msgstr "مرحبا بك في مرشد إعداد الحساب" -#: ../gtk/setupwizard.c:625 +#: ../gtk/setupwizard.c:634 msgid "Account setup assistant" msgstr "مرشد تهيئة الحساب" -#: ../gtk/setupwizard.c:631 +#: ../gtk/setupwizard.c:640 msgid "Configure your account (step 1/1)" msgstr "تهيئة حسابك (المرحلة 1/1)" -#: ../gtk/setupwizard.c:636 +#: ../gtk/setupwizard.c:645 msgid "Enter your sip username (step 1/1)" -msgstr "أدخل إسم المستخدم SIP لديك (المرحلة 1/1)" +msgstr "أدخل اسم المستخدم SIP (المرحلة 1/1)" -#: ../gtk/setupwizard.c:640 +#: ../gtk/setupwizard.c:649 msgid "Enter account information (step 1/2)" msgstr "أدخل معلومات حسابك (المرحلة 1/2)" -#: ../gtk/setupwizard.c:649 +#: ../gtk/setupwizard.c:658 msgid "Validation (step 2/2)" msgstr "تأكيد (المرحلة 2/2)" -#: ../gtk/setupwizard.c:654 +#: ../gtk/setupwizard.c:663 msgid "Error" msgstr "خطأ" -#: ../gtk/setupwizard.c:658 ../gtk/audio_assistant.c:534 +#: ../gtk/setupwizard.c:667 ../gtk/audio_assistant.c:534 msgid "Terminating" msgstr "في طور الإنهاء" @@ -861,7 +865,7 @@ msgstr "سَجِّل واقرأ " #: ../gtk/main.ui.h:1 msgid "Callee name" -msgstr "إسم المنادَى" +msgstr "اسم المنادَى" #: ../gtk/main.ui.h:2 msgid "Send" @@ -937,11 +941,11 @@ msgstr "شغِّل الفيديو دائما" #: ../gtk/main.ui.h:26 msgid "Enable self-view" -msgstr "تفعيل رؤية نفسي" +msgstr "فعِّل رؤية نفسي" #: ../gtk/main.ui.h:27 msgid "_Help" -msgstr "_مساعدة" +msgstr "ال_مساعدة" #: ../gtk/main.ui.h:28 msgid "Show debug window" @@ -993,7 +997,7 @@ msgstr "هويتي الحالية :" #: ../gtk/main.ui.h:41 ../gtk/tunnel_config.ui.h:7 msgid "Username" -msgstr "إسم المستخدم" +msgstr "اسم المستخدم" #: ../gtk/main.ui.h:42 ../gtk/tunnel_config.ui.h:8 msgid "Password" @@ -1029,7 +1033,7 @@ msgstr "(C) Belledonne Communications, 2010\n" #: ../gtk/about.ui.h:4 msgid "An internet video phone using the standard SIP (rfc3261) protocol." -msgstr "الهاتف المرئي للإنترنت الموافق للبروتوكول المعياري SIP (rfc3261)." +msgstr "الهاتف المرئي للإنترنت الموافق للبروتوكول المعياري SIP (rfc3261)‎." #: ../gtk/about.ui.h:5 msgid "" @@ -1361,11 +1365,11 @@ msgstr "هذه الفقرة تحدد عنوانك SIP إن كنت لا تستخ #: ../gtk/parameters.ui.h:54 msgid "Your display name (eg: John Doe):" -msgstr "إسمك المعروض (مثلا : زيد عمرو) :" +msgstr "اسمك المعروض (مثلا : زيد عمرو) :" #: ../gtk/parameters.ui.h:55 msgid "Your username:" -msgstr "إسم المستخدم لديك :" +msgstr "اسم المستخدم :" #: ../gtk/parameters.ui.h:56 msgid "Your resulting SIP address:" @@ -1509,10 +1513,6 @@ msgstr "الإضافة إلى قائمتي" msgid "Search somebody" msgstr "البحث عن شخص" -#: ../gtk/waiting.ui.h:1 -msgid "Linphone" -msgstr "لِنْفُونْ" - #: ../gtk/waiting.ui.h:2 msgid "Please wait" msgstr "يُرجى الانتظار" @@ -1627,7 +1627,7 @@ msgstr "ربط DN" #: ../gtk/ldap.ui.h:10 msgid "Authname" -msgstr "إسم الهوية" +msgstr "اسم الهوية" #: ../gtk/ldap.ui.h:11 msgid "Realm" @@ -1644,11 +1644,11 @@ msgstr "الكائن الأساسي :" #: ../gtk/ldap.ui.h:15 #, no-c-format msgid "Filter (%s for name):" -msgstr "رشِّح (%s كإسم) :" +msgstr "رشِّح (%s كاسم) :" #: ../gtk/ldap.ui.h:16 msgid "Name Attribute:" -msgstr "خاصية الإسم :" +msgstr "خاصية الاسم :" #: ../gtk/ldap.ui.h:17 msgid "SIP address attribute:" @@ -1712,68 +1712,68 @@ msgstr "تجري التهيئة..." msgid "Please wait while fetching configuration from server..." msgstr "رجاءً انتظر ريثما ينتهي من جلب الإعدادات من الخادم..." -#: ../coreapi/linphonecore.c:1538 +#: ../coreapi/linphonecore.c:1539 msgid "Ready" msgstr "جاهز" -#: ../coreapi/linphonecore.c:2550 +#: ../coreapi/linphonecore.c:2551 msgid "Configuring" msgstr "تجري التهيئة" -#: ../coreapi/linphonecore.c:2724 +#: ../coreapi/linphonecore.c:2725 msgid "Looking for telephone number destination..." msgstr "يجري البحث عن وجهة رقم الهاتف..." -#: ../coreapi/linphonecore.c:2726 +#: ../coreapi/linphonecore.c:2727 msgid "Could not resolve this number." msgstr "لم يتمكن من إيجاد هذا الرقم." #. must be known at that time -#: ../coreapi/linphonecore.c:3012 +#: ../coreapi/linphonecore.c:3013 msgid "Contacting" msgstr "يتصل ب" -#: ../coreapi/linphonecore.c:3017 +#: ../coreapi/linphonecore.c:3018 msgid "Could not call" msgstr "لم يتمكن من الاتصال" -#: ../coreapi/linphonecore.c:3168 +#: ../coreapi/linphonecore.c:3169 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "آسف، وصل عدد المكالمات الآنية إلى حده الأقصى" -#: ../coreapi/linphonecore.c:3326 +#: ../coreapi/linphonecore.c:3327 msgid "is contacting you" msgstr "يتصل بك" -#: ../coreapi/linphonecore.c:3327 +#: ../coreapi/linphonecore.c:3328 msgid " and asked autoanswer." msgstr "ويطلب ردا تلقائيا." -#: ../coreapi/linphonecore.c:3451 +#: ../coreapi/linphonecore.c:3452 msgid "Modifying call parameters..." msgstr "يجري تعديل إعدادات المكالمة..." -#: ../coreapi/linphonecore.c:3798 +#: ../coreapi/linphonecore.c:3802 msgid "Connected." msgstr "متصل." -#: ../coreapi/linphonecore.c:3823 +#: ../coreapi/linphonecore.c:3827 msgid "Call aborted" msgstr "أُلغيت المكالمة" -#: ../coreapi/linphonecore.c:4013 +#: ../coreapi/linphonecore.c:4024 msgid "Could not pause the call" msgstr "لم يتمكن من توقيف المكالمة مؤقتا" -#: ../coreapi/linphonecore.c:4016 +#: ../coreapi/linphonecore.c:4027 msgid "Pausing the current call..." msgstr "وضع المكالمة قيد الانتظار..." -#: ../coreapi/misc.c:433 +#: ../coreapi/misc.c:434 msgid "Stun lookup in progress..." msgstr "يجري بحث STUN..." -#: ../coreapi/misc.c:614 +#: ../coreapi/misc.c:615 msgid "ICE local candidates gathering in progress..." msgstr "يجري جلب مرشَّحي ICE المحلين..." @@ -1811,7 +1811,7 @@ msgstr "ذهبتُ" #: ../coreapi/friend.c:57 msgid "Using another messaging service" -msgstr "استخدام خدمة أخرى للتراسل الفوري" +msgstr "أستخدم خدمة أخرى للتراسل الفوري" #: ../coreapi/friend.c:60 msgid "Offline" @@ -1833,13 +1833,13 @@ msgstr "حالة مجهولة" msgid "" "The sip proxy address you entered is invalid, it must start with \"sip:\" " "followed by a hostname." -msgstr "عنوان SIP الذي أدخلت غير صالح، يجب أن يبدأ ب \"sip:\" متبوعا بإسم النطاق." +msgstr "إن عنوان SIP الذي أدخلت غير صحيح، يجب أن يبدأ بـ \"sip:‎\" متبوعا باسم المضيف." #: ../coreapi/proxy.c:334 msgid "" "The sip identity you entered is invalid.\n" "It should look like sip:username@proxydomain, such as sip:alice@example.net" -msgstr "هوية SIP التي أدخلت غير صحيحة.\nيجب أن تشبه هذا النمط sip:username@proxydomain، مثلا sip:alice@example.net" +msgstr "إن هوية SIP التي أدخلت غير صحيحة.\nيجب أن تكون بهذا النمط sip:username@proxydomain، مثلا sip:alice@example.net" #: ../coreapi/proxy.c:1416 #, c-format @@ -1858,100 +1858,100 @@ msgstr "يرن الجرس عن بعد..." msgid "Early media." msgstr "أخذ المكالمة مبكرا." -#: ../coreapi/callbacks.c:533 +#: ../coreapi/callbacks.c:534 #, c-format msgid "Call with %s is paused." msgstr "المكاملة مع %s متوقفة." -#: ../coreapi/callbacks.c:546 +#: ../coreapi/callbacks.c:547 #, c-format msgid "Call answered by %s - on hold." msgstr "يجيب %s عن المكالمة - في وضع الانتظار." -#: ../coreapi/callbacks.c:556 +#: ../coreapi/callbacks.c:557 msgid "Call resumed." msgstr "استُعيدت المكالمة." -#: ../coreapi/callbacks.c:560 +#: ../coreapi/callbacks.c:561 #, c-format msgid "Call answered by %s." msgstr "أجاب عن المكالمة %s." -#: ../coreapi/callbacks.c:583 +#: ../coreapi/callbacks.c:584 msgid "Incompatible, check codecs or security settings..." msgstr "غير موائم، تحقق من المراميز أو إعدادات الأمان..." -#: ../coreapi/callbacks.c:588 ../coreapi/callbacks.c:900 +#: ../coreapi/callbacks.c:589 ../coreapi/callbacks.c:906 msgid "Incompatible media parameters." msgstr "إعدادات الوسائط غير موائمة." -#: ../coreapi/callbacks.c:618 +#: ../coreapi/callbacks.c:619 msgid "We have been resumed." msgstr "استُأنِفت المكالمة." #. we are being paused -#: ../coreapi/callbacks.c:626 +#: ../coreapi/callbacks.c:628 msgid "We are paused by other party." msgstr "وُقِّفت المكالمة مؤقتا من طرف آخر." #. reINVITE and in-dialogs UPDATE go here -#: ../coreapi/callbacks.c:660 +#: ../coreapi/callbacks.c:666 msgid "Call is updated by remote." msgstr "حُدِّث الاتصال من البعيد." -#: ../coreapi/callbacks.c:776 +#: ../coreapi/callbacks.c:782 msgid "Call terminated." msgstr "أُنهيت المكالمة." -#: ../coreapi/callbacks.c:804 +#: ../coreapi/callbacks.c:810 msgid "User is busy." msgstr "المستخدم مشغول." -#: ../coreapi/callbacks.c:805 +#: ../coreapi/callbacks.c:811 msgid "User is temporarily unavailable." msgstr "المستخدم غير متاح مؤقتا." #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:807 +#: ../coreapi/callbacks.c:813 msgid "User does not want to be disturbed." msgstr "لا يريد المستخدم أي إزعاج." -#: ../coreapi/callbacks.c:808 +#: ../coreapi/callbacks.c:814 msgid "Call declined." msgstr "تم تجاهل المكالمة." -#: ../coreapi/callbacks.c:823 +#: ../coreapi/callbacks.c:829 msgid "Request timeout." msgstr "انتهت مهلة الطلب." -#: ../coreapi/callbacks.c:854 +#: ../coreapi/callbacks.c:860 msgid "Redirected" msgstr "مُوجَّه" -#: ../coreapi/callbacks.c:909 +#: ../coreapi/callbacks.c:915 msgid "Call failed." msgstr "فشل الاتصال." -#: ../coreapi/callbacks.c:987 +#: ../coreapi/callbacks.c:993 #, c-format msgid "Registration on %s successful." msgstr "تم التسجيل في %s بنجاح." -#: ../coreapi/callbacks.c:988 +#: ../coreapi/callbacks.c:994 #, c-format msgid "Unregistration on %s done." msgstr "أُلغي التسجيل في %s ." -#: ../coreapi/callbacks.c:1006 +#: ../coreapi/callbacks.c:1012 msgid "no response timeout" msgstr "لا إجابة قبل انتهاء المهلة" -#: ../coreapi/callbacks.c:1009 +#: ../coreapi/callbacks.c:1015 #, c-format msgid "Registration on %s failed: %s" msgstr "فَشِل التسجيل في %s: %s" -#: ../coreapi/callbacks.c:1016 +#: ../coreapi/callbacks.c:1022 msgid "Service unavailable, retrying" msgstr "خدمة غير متاحة، تجري الإعادة" @@ -1961,11 +1961,11 @@ msgstr "خدمة غير متاحة، تجري الإعادة" msgid "Authentication token is %s" msgstr "شارة التحقق من الهوية هي %s" -#: ../coreapi/linphonecall.c:1306 +#: ../coreapi/linphonecall.c:1310 msgid "Call parameters were successfully modified." msgstr "عُدِّلت معاملات المكالمات بنجاج." -#: ../coreapi/linphonecall.c:3660 +#: ../coreapi/linphonecall.c:3686 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." diff --git a/po/cs.po b/po/cs.po index 100d76bf2..cdb192696 100644 --- a/po/cs.po +++ b/po/cs.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: linphone-gtk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-04-01 16:25+0200\n" -"PO-Revision-Date: 2015-04-01 14:26+0000\n" +"POT-Creation-Date: 2015-04-30 10:13+0200\n" +"PO-Revision-Date: 2015-04-30 08:13+0000\n" "Last-Translator: Belledonne Communications \n" "Language-Team: Czech (http://www.transifex.com/projects/p/linphone-gtk/language/cs/)\n" "MIME-Version: 1.0\n" @@ -91,45 +91,45 @@ msgstr "Já" msgid "Couldn't find pixmap file: %s" msgstr "Nelze najít soubor s obrázkem: %s" -#: ../gtk/main.c:136 +#: ../gtk/main.c:137 msgid "log to stdout some debug information while running." msgstr "Za běhu vypisuje některé ladicí informace na standardní výstup." -#: ../gtk/main.c:137 +#: ../gtk/main.c:138 msgid "path to a file to write logs into." msgstr "Soubor, kam zapisovat protokol." -#: ../gtk/main.c:138 +#: ../gtk/main.c:139 msgid "Start linphone with video disabled." msgstr "Spustí linphone se zakázaným obrazem." -#: ../gtk/main.c:139 +#: ../gtk/main.c:140 msgid "Start only in the system tray, do not show the main interface." msgstr "Spustí se pouze do systémové oblasti, nezobrazí hlavní okno." -#: ../gtk/main.c:140 +#: ../gtk/main.c:141 msgid "address to call right now" msgstr "Zavolá právě teď na tuto adresu" -#: ../gtk/main.c:141 +#: ../gtk/main.c:142 msgid "" "Specifiy a working directory (should be the base of the installation, eg: " "c:\\Program Files\\Linphone)" msgstr "Zadejte pracovní adresář (měl by být základní instalační adresář, například c:\\Program Files\\Linphone)" -#: ../gtk/main.c:142 +#: ../gtk/main.c:143 msgid "Configuration file" msgstr "" -#: ../gtk/main.c:143 +#: ../gtk/main.c:144 msgid "Run the audio assistant" msgstr "" -#: ../gtk/main.c:144 +#: ../gtk/main.c:145 msgid "Run self test and exit 0 if succeed" msgstr "" -#: ../gtk/main.c:1069 +#: ../gtk/main.c:1070 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -137,76 +137,80 @@ msgid "" "If you answer no, this person will be temporarily blacklisted." msgstr "%s si vás chce přidat do svého adresáře.\nDovolíte mu, aby viděl váš stav přítomnosti, nebo si ho také chcete přidat do svého adresáře?\nOdpovíte-li ne, tato osobo bude dočasně blokována." -#: ../gtk/main.c:1146 +#: ../gtk/main.c:1147 #, c-format msgid "" "Please enter your password for username %s\n" " at realm %s:" msgstr "" -#: ../gtk/main.c:1267 +#: ../gtk/main.c:1268 msgid "Call error" msgstr "Chyba hovoru" -#: ../gtk/main.c:1270 ../coreapi/linphonecore.c:3842 +#: ../gtk/main.c:1271 ../coreapi/linphonecore.c:3846 msgid "Call ended" msgstr "Hovor ukončen" -#: ../gtk/main.c:1273 ../coreapi/call_log.c:221 +#: ../gtk/main.c:1274 ../coreapi/call_log.c:221 msgid "Incoming call" msgstr "Příchozí hovor" -#: ../gtk/main.c:1275 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 +#: ../gtk/main.c:1276 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 msgid "Answer" msgstr "Odpovědět" -#: ../gtk/main.c:1277 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1278 ../gtk/main.ui.h:6 msgid "Decline" msgstr "Odmítnout" -#: ../gtk/main.c:1283 +#: ../gtk/main.c:1284 msgid "Call paused" msgstr "Hovor odložen" -#: ../gtk/main.c:1283 +#: ../gtk/main.c:1284 #, c-format msgid "by %s" msgstr "kým: %s" -#: ../gtk/main.c:1353 +#: ../gtk/main.c:1354 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "%s navrhuje začít videohovor. Přijímáte?" -#: ../gtk/main.c:1516 +#: ../gtk/main.c:1509 msgid "Website link" msgstr "Odkaz na webovou stránku" -#: ../gtk/main.c:1565 -msgid "Linphone - a video internet phone" -msgstr "Lipnhone – internetový videofon" +#: ../gtk/main.c:1568 ../gtk/waiting.ui.h:1 +msgid "Linphone" +msgstr "Linphone" -#: ../gtk/main.c:1657 +#: ../gtk/main.c:1569 +msgid "A video internet phone" +msgstr "" + +#: ../gtk/main.c:1629 #, c-format msgid "%s (Default)" msgstr "%s (Výchozí)" -#: ../gtk/main.c:1989 ../coreapi/callbacks.c:1057 +#: ../gtk/main.c:1962 ../coreapi/callbacks.c:1063 #, c-format msgid "We are transferred to %s" msgstr "Byly jsme přepojeni na %s" -#: ../gtk/main.c:1999 +#: ../gtk/main.c:1972 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." msgstr "Na tomto počítači nebyla objevena žádná zvuková karta.\nNebudete moci vytáčet a přijímat a zvukové hovory." -#: ../gtk/main.c:2147 +#: ../gtk/main.c:2117 msgid "A free SIP video-phone" msgstr "Volný SIP videofon" -#: ../gtk/main.c:2252 +#: ../gtk/main.c:2221 #, c-format msgid "Hello\n" msgstr "" @@ -219,7 +223,7 @@ msgstr "Přidat do adresáře" msgid "Presence status" msgstr "Stav" -#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:552 ../gtk/contact.ui.h:1 +#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:569 ../gtk/contact.ui.h:1 msgid "Name" msgstr "Jméno" @@ -260,124 +264,124 @@ msgstr "Odstranit historii diskuze u kontaktu „%s“" msgid "Add new contact from %s directory" msgstr "Přidat nový kontakt z adresáře %s" -#: ../gtk/propertybox.c:558 +#: ../gtk/propertybox.c:575 msgid "Rate (Hz)" msgstr "Kmitočet (Hz)" -#: ../gtk/propertybox.c:564 +#: ../gtk/propertybox.c:581 msgid "Status" msgstr "Stav" -#: ../gtk/propertybox.c:570 +#: ../gtk/propertybox.c:587 msgid "IP Bitrate (kbit/s)" msgstr "" -#: ../gtk/propertybox.c:577 +#: ../gtk/propertybox.c:596 msgid "Parameters" msgstr "Parametry" -#: ../gtk/propertybox.c:620 ../gtk/propertybox.c:763 +#: ../gtk/propertybox.c:639 ../gtk/propertybox.c:782 msgid "Enabled" msgstr "Povoleno" -#: ../gtk/propertybox.c:622 ../gtk/propertybox.c:763 ../gtk/parameters.ui.h:20 +#: ../gtk/propertybox.c:641 ../gtk/propertybox.c:782 ../gtk/parameters.ui.h:20 msgid "Disabled" msgstr "Zakázáno" -#: ../gtk/propertybox.c:809 +#: ../gtk/propertybox.c:828 msgid "Account" msgstr "Účet" -#: ../gtk/propertybox.c:1072 +#: ../gtk/propertybox.c:1091 msgid "English" msgstr "angličtina" -#: ../gtk/propertybox.c:1073 +#: ../gtk/propertybox.c:1092 msgid "French" msgstr "francouzština" -#: ../gtk/propertybox.c:1074 +#: ../gtk/propertybox.c:1093 msgid "Swedish" msgstr "švédština" -#: ../gtk/propertybox.c:1075 +#: ../gtk/propertybox.c:1094 msgid "Italian" msgstr "italština" -#: ../gtk/propertybox.c:1076 +#: ../gtk/propertybox.c:1095 msgid "Spanish" msgstr "španělština" -#: ../gtk/propertybox.c:1077 +#: ../gtk/propertybox.c:1096 msgid "Brazilian Portugese" msgstr "brazilská portugalština" -#: ../gtk/propertybox.c:1078 +#: ../gtk/propertybox.c:1097 msgid "Polish" msgstr "polština" -#: ../gtk/propertybox.c:1079 +#: ../gtk/propertybox.c:1098 msgid "German" msgstr "němčina" -#: ../gtk/propertybox.c:1080 +#: ../gtk/propertybox.c:1099 msgid "Russian" msgstr "ruština" -#: ../gtk/propertybox.c:1081 +#: ../gtk/propertybox.c:1100 msgid "Japanese" msgstr "japonština" -#: ../gtk/propertybox.c:1082 +#: ../gtk/propertybox.c:1101 msgid "Dutch" msgstr "dánština" -#: ../gtk/propertybox.c:1083 +#: ../gtk/propertybox.c:1102 msgid "Hungarian" msgstr "maďarština" -#: ../gtk/propertybox.c:1084 +#: ../gtk/propertybox.c:1103 msgid "Czech" msgstr "čeština" -#: ../gtk/propertybox.c:1085 +#: ../gtk/propertybox.c:1104 msgid "Chinese" msgstr "čínština" -#: ../gtk/propertybox.c:1086 +#: ../gtk/propertybox.c:1105 msgid "Traditional Chinese" msgstr "tradiční čínština" -#: ../gtk/propertybox.c:1087 +#: ../gtk/propertybox.c:1106 msgid "Norwegian" msgstr "norština" -#: ../gtk/propertybox.c:1088 +#: ../gtk/propertybox.c:1107 msgid "Hebrew" msgstr "hebrejština" -#: ../gtk/propertybox.c:1089 +#: ../gtk/propertybox.c:1108 msgid "Serbian" msgstr "srbština" -#: ../gtk/propertybox.c:1156 +#: ../gtk/propertybox.c:1175 msgid "" "You need to restart linphone for the new language selection to take effect." msgstr "Aby se projevil výběr nového jazyka, je nutné znovu spustit linphone." -#: ../gtk/propertybox.c:1236 +#: ../gtk/propertybox.c:1255 msgid "None" msgstr "Žádné" -#: ../gtk/propertybox.c:1240 +#: ../gtk/propertybox.c:1259 msgid "SRTP" msgstr "SRTP" -#: ../gtk/propertybox.c:1246 +#: ../gtk/propertybox.c:1265 msgid "DTLS" msgstr "" -#: ../gtk/propertybox.c:1253 +#: ../gtk/propertybox.c:1272 msgid "ZRTP" msgstr "ZRTP" @@ -420,133 +424,133 @@ msgstr[0] "Nalezen %i kontakt" msgstr[1] "Nalezeny %i kontakty" msgstr[2] "Nalezeno %i kontaktů" -#: ../gtk/setupwizard.c:34 +#: ../gtk/setupwizard.c:32 msgid "" "Welcome!\n" "This assistant will help you to use a SIP account for your calls." msgstr "" -#: ../gtk/setupwizard.c:43 +#: ../gtk/setupwizard.c:41 msgid "Create an account on linphone.org" msgstr "Vytvořit účet na linphone.org" -#: ../gtk/setupwizard.c:44 +#: ../gtk/setupwizard.c:42 msgid "I have already a linphone.org account and I just want to use it" msgstr "Účet na linphone.org již mám a chci jej použít" -#: ../gtk/setupwizard.c:45 +#: ../gtk/setupwizard.c:43 msgid "I have already a sip account and I just want to use it" msgstr "SIP účet již mám a chci jej použít" -#: ../gtk/setupwizard.c:46 +#: ../gtk/setupwizard.c:44 msgid "I want to specify a remote configuration URI" msgstr "" -#: ../gtk/setupwizard.c:89 +#: ../gtk/setupwizard.c:87 msgid "Enter your linphone.org username" msgstr "Zadejte uživatelské jméno na linphone.org" -#: ../gtk/setupwizard.c:102 ../gtk/parameters.ui.h:85 ../gtk/ldap.ui.h:4 +#: ../gtk/setupwizard.c:100 ../gtk/parameters.ui.h:85 ../gtk/ldap.ui.h:4 msgid "Username:" msgstr "Uživatelské jméno:" -#: ../gtk/setupwizard.c:104 ../gtk/password.ui.h:4 ../gtk/ldap.ui.h:5 +#: ../gtk/setupwizard.c:102 ../gtk/password.ui.h:4 ../gtk/ldap.ui.h:5 msgid "Password:" msgstr "Heslo:" -#: ../gtk/setupwizard.c:124 +#: ../gtk/setupwizard.c:122 msgid "Enter your account informations" msgstr "Zadejte údaje o vašem účtu" -#: ../gtk/setupwizard.c:140 +#: ../gtk/setupwizard.c:138 msgid "Username*" msgstr "Uživatelské jméno*" -#: ../gtk/setupwizard.c:141 +#: ../gtk/setupwizard.c:139 msgid "Password*" msgstr "Heslo*" -#: ../gtk/setupwizard.c:144 +#: ../gtk/setupwizard.c:142 msgid "Domain*" msgstr "Doména*" -#: ../gtk/setupwizard.c:145 +#: ../gtk/setupwizard.c:143 msgid "Proxy" msgstr "Proxy" -#: ../gtk/setupwizard.c:317 +#: ../gtk/setupwizard.c:322 msgid "(*) Required fields" msgstr "(*) Povinné položky" -#: ../gtk/setupwizard.c:318 +#: ../gtk/setupwizard.c:323 msgid "Username: (*)" msgstr "Uživatelské jméno: (*)" -#: ../gtk/setupwizard.c:320 +#: ../gtk/setupwizard.c:325 msgid "Password: (*)" msgstr "Heslo: (*)" -#: ../gtk/setupwizard.c:322 +#: ../gtk/setupwizard.c:327 msgid "Email: (*)" msgstr "E-mail: (*)" -#: ../gtk/setupwizard.c:324 +#: ../gtk/setupwizard.c:329 msgid "Confirm your password: (*)" msgstr "Potvrďte heslo: (*)" -#: ../gtk/setupwizard.c:338 +#: ../gtk/setupwizard.c:343 msgid "Keep me informed with linphone updates" msgstr "" -#: ../gtk/setupwizard.c:394 +#: ../gtk/setupwizard.c:399 msgid "" "Error, account not validated, username already used or server unreachable.\n" "Please go back and try again." msgstr "Došlo k chybě (účet nebyl ověřen, uživatelské jméno již existuje nebo server není dostupný).\nProsím, vraťte se a zkoste to znovu." -#: ../gtk/setupwizard.c:405 +#: ../gtk/setupwizard.c:410 msgid "Thank you. Your account is now configured and ready for use." msgstr "Děkujeme vám. Váš účet je nyní nastaven a připraven k použití." -#: ../gtk/setupwizard.c:413 +#: ../gtk/setupwizard.c:418 msgid "" "Please validate your account by clicking on the link we just sent you by email.\n" "Then come back here and press Next button." msgstr "Prosím, ověřte svůj účet tak, že kliknete na odkaz, který jsme vám právě zaslali e-mailem.\nPak se sem vraťte a stiskněte tlačítko Další." -#: ../gtk/setupwizard.c:602 +#: ../gtk/setupwizard.c:609 msgid "SIP account configuration assistant" msgstr "" -#: ../gtk/setupwizard.c:620 +#: ../gtk/setupwizard.c:629 msgid "Welcome to the account setup assistant" msgstr "Vítejte v průvodci nastavení účtu" -#: ../gtk/setupwizard.c:625 +#: ../gtk/setupwizard.c:634 msgid "Account setup assistant" msgstr "Průvodce nastavením účtu" -#: ../gtk/setupwizard.c:631 +#: ../gtk/setupwizard.c:640 msgid "Configure your account (step 1/1)" msgstr "Nastavit účet (krok 1/1)" -#: ../gtk/setupwizard.c:636 +#: ../gtk/setupwizard.c:645 msgid "Enter your sip username (step 1/1)" msgstr "Zadejte vaše sipové uživatelské jméno (krok 1/1)" -#: ../gtk/setupwizard.c:640 +#: ../gtk/setupwizard.c:649 msgid "Enter account information (step 1/2)" msgstr "Zadejte údaje o účtu (krok 1/2)" -#: ../gtk/setupwizard.c:649 +#: ../gtk/setupwizard.c:658 msgid "Validation (step 2/2)" msgstr "Ověření (krok 2/2)" -#: ../gtk/setupwizard.c:654 +#: ../gtk/setupwizard.c:663 msgid "Error" msgstr "Chyba" -#: ../gtk/setupwizard.c:658 ../gtk/audio_assistant.c:534 +#: ../gtk/setupwizard.c:667 ../gtk/audio_assistant.c:534 msgid "Terminating" msgstr "Ukončuje se" @@ -1500,10 +1504,6 @@ msgstr "Přidat na svůj seznam" msgid "Search somebody" msgstr "Hledat někoho" -#: ../gtk/waiting.ui.h:1 -msgid "Linphone" -msgstr "Linphone" - #: ../gtk/waiting.ui.h:2 msgid "Please wait" msgstr "Prosím, čekejte" @@ -1703,68 +1703,68 @@ msgstr "" msgid "Please wait while fetching configuration from server..." msgstr "" -#: ../coreapi/linphonecore.c:1538 +#: ../coreapi/linphonecore.c:1539 msgid "Ready" msgstr "Připraven." -#: ../coreapi/linphonecore.c:2550 +#: ../coreapi/linphonecore.c:2551 msgid "Configuring" msgstr "" -#: ../coreapi/linphonecore.c:2724 +#: ../coreapi/linphonecore.c:2725 msgid "Looking for telephone number destination..." msgstr "Vyhledává se umístění čísla…" -#: ../coreapi/linphonecore.c:2726 +#: ../coreapi/linphonecore.c:2727 msgid "Could not resolve this number." msgstr "Toto číslo nelze vyhledat." #. must be known at that time -#: ../coreapi/linphonecore.c:3012 +#: ../coreapi/linphonecore.c:3013 msgid "Contacting" msgstr "Navazuje se spojení" -#: ../coreapi/linphonecore.c:3017 +#: ../coreapi/linphonecore.c:3018 msgid "Could not call" msgstr "Nelze volat" -#: ../coreapi/linphonecore.c:3168 +#: ../coreapi/linphonecore.c:3169 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "Je nám líto, ale byl dosažen maximální počet současných hovorů." -#: ../coreapi/linphonecore.c:3326 +#: ../coreapi/linphonecore.c:3327 msgid "is contacting you" msgstr "vás volá" -#: ../coreapi/linphonecore.c:3327 +#: ../coreapi/linphonecore.c:3328 msgid " and asked autoanswer." msgstr " a požaduje automatickou zvednutí." -#: ../coreapi/linphonecore.c:3451 +#: ../coreapi/linphonecore.c:3452 msgid "Modifying call parameters..." msgstr "Upravují se parametry hovoru…" -#: ../coreapi/linphonecore.c:3798 +#: ../coreapi/linphonecore.c:3802 msgid "Connected." msgstr "Připojeno." -#: ../coreapi/linphonecore.c:3823 +#: ../coreapi/linphonecore.c:3827 msgid "Call aborted" msgstr "Hovor přerušen" -#: ../coreapi/linphonecore.c:4013 +#: ../coreapi/linphonecore.c:4024 msgid "Could not pause the call" msgstr "Hovor nebylo možné odložit" -#: ../coreapi/linphonecore.c:4016 +#: ../coreapi/linphonecore.c:4027 msgid "Pausing the current call..." msgstr "Současný hovor se odkládá…" -#: ../coreapi/misc.c:433 +#: ../coreapi/misc.c:434 msgid "Stun lookup in progress..." msgstr "Hledá se adresa pomocí STUN…" -#: ../coreapi/misc.c:614 +#: ../coreapi/misc.c:615 msgid "ICE local candidates gathering in progress..." msgstr "Shromažďují se místní kandidáti ICE…" @@ -1849,100 +1849,100 @@ msgstr "Vyzvání na druhé straně…" msgid "Early media." msgstr "Časná média." -#: ../coreapi/callbacks.c:533 +#: ../coreapi/callbacks.c:534 #, c-format msgid "Call with %s is paused." msgstr "Hovor s %s je odložen." -#: ../coreapi/callbacks.c:546 +#: ../coreapi/callbacks.c:547 #, c-format msgid "Call answered by %s - on hold." msgstr "Hovor přijat kým: %s – odložen." -#: ../coreapi/callbacks.c:556 +#: ../coreapi/callbacks.c:557 msgid "Call resumed." msgstr "Hovor obnoven." -#: ../coreapi/callbacks.c:560 +#: ../coreapi/callbacks.c:561 #, c-format msgid "Call answered by %s." msgstr "Hovor přijat kým: %s." -#: ../coreapi/callbacks.c:583 +#: ../coreapi/callbacks.c:584 msgid "Incompatible, check codecs or security settings..." msgstr "Není slučitelné. Zkontrolujte nastavení kodeků a zabezpečení…" -#: ../coreapi/callbacks.c:588 ../coreapi/callbacks.c:900 +#: ../coreapi/callbacks.c:589 ../coreapi/callbacks.c:906 msgid "Incompatible media parameters." msgstr "Neslučitelné parametry médií." -#: ../coreapi/callbacks.c:618 +#: ../coreapi/callbacks.c:619 msgid "We have been resumed." msgstr "Byli jsme obnoveni." #. we are being paused -#: ../coreapi/callbacks.c:626 +#: ../coreapi/callbacks.c:628 msgid "We are paused by other party." msgstr "Byli jsme odloženi protistranou." #. reINVITE and in-dialogs UPDATE go here -#: ../coreapi/callbacks.c:660 +#: ../coreapi/callbacks.c:666 msgid "Call is updated by remote." msgstr "Hovor byl aktualizován protistranou." -#: ../coreapi/callbacks.c:776 +#: ../coreapi/callbacks.c:782 msgid "Call terminated." msgstr "Hovor ukončen." -#: ../coreapi/callbacks.c:804 +#: ../coreapi/callbacks.c:810 msgid "User is busy." msgstr "Uživatel je zaneprázdněn." -#: ../coreapi/callbacks.c:805 +#: ../coreapi/callbacks.c:811 msgid "User is temporarily unavailable." msgstr "Uživatel je dočasně nedostupný." #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:807 +#: ../coreapi/callbacks.c:813 msgid "User does not want to be disturbed." msgstr "Uživatel si nepřeje být rušen." -#: ../coreapi/callbacks.c:808 +#: ../coreapi/callbacks.c:814 msgid "Call declined." msgstr "Volání odmítnuto." -#: ../coreapi/callbacks.c:823 +#: ../coreapi/callbacks.c:829 msgid "Request timeout." msgstr "" -#: ../coreapi/callbacks.c:854 +#: ../coreapi/callbacks.c:860 msgid "Redirected" msgstr "Přesměrováno" -#: ../coreapi/callbacks.c:909 +#: ../coreapi/callbacks.c:915 msgid "Call failed." msgstr "Volání se nezdařilo." -#: ../coreapi/callbacks.c:987 +#: ../coreapi/callbacks.c:993 #, c-format msgid "Registration on %s successful." msgstr "Registrace na %s byla úspěšná." -#: ../coreapi/callbacks.c:988 +#: ../coreapi/callbacks.c:994 #, c-format msgid "Unregistration on %s done." msgstr "Odregistrování z %s hotovo." -#: ../coreapi/callbacks.c:1006 +#: ../coreapi/callbacks.c:1012 msgid "no response timeout" msgstr "odpověď nedorazila včas" -#: ../coreapi/callbacks.c:1009 +#: ../coreapi/callbacks.c:1015 #, c-format msgid "Registration on %s failed: %s" msgstr "Registrace na %s selhala: %s" -#: ../coreapi/callbacks.c:1016 +#: ../coreapi/callbacks.c:1022 msgid "Service unavailable, retrying" msgstr "" @@ -1952,11 +1952,11 @@ msgstr "" msgid "Authentication token is %s" msgstr "Klíč k ověření totožnosti je %s" -#: ../coreapi/linphonecall.c:1306 +#: ../coreapi/linphonecall.c:1310 msgid "Call parameters were successfully modified." msgstr "" -#: ../coreapi/linphonecall.c:3660 +#: ../coreapi/linphonecall.c:3686 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." diff --git a/po/de.po b/po/de.po index 7ed76bcf5..6a6e30e83 100644 --- a/po/de.po +++ b/po/de.po @@ -11,8 +11,8 @@ msgid "" msgstr "" "Project-Id-Version: linphone-gtk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-04-01 16:25+0200\n" -"PO-Revision-Date: 2015-04-01 14:26+0000\n" +"POT-Creation-Date: 2015-04-30 10:13+0200\n" +"PO-Revision-Date: 2015-04-30 08:13+0000\n" "Last-Translator: Belledonne Communications \n" "Language-Team: German (http://www.transifex.com/projects/p/linphone-gtk/language/de/)\n" "MIME-Version: 1.0\n" @@ -91,45 +91,45 @@ msgstr "Eigenes Telefon" msgid "Couldn't find pixmap file: %s" msgstr "Pixmapdatei %s kann nicht gefunden werden." -#: ../gtk/main.c:136 +#: ../gtk/main.c:137 msgid "log to stdout some debug information while running." msgstr "Ausgabe von Debug-Informationen auf stdout während der Laufzeit" -#: ../gtk/main.c:137 +#: ../gtk/main.c:138 msgid "path to a file to write logs into." msgstr "Pfad zu einer Datei, in die Protokolle geschrieben werden." -#: ../gtk/main.c:138 +#: ../gtk/main.c:139 msgid "Start linphone with video disabled." msgstr "Linphone mit ausgeschaltetem Video starten." -#: ../gtk/main.c:139 +#: ../gtk/main.c:140 msgid "Start only in the system tray, do not show the main interface." msgstr "Nur im Systemabschnitt der Kontrollleiste starten, aber das Hauptfenster nicht zeigen." -#: ../gtk/main.c:140 +#: ../gtk/main.c:141 msgid "address to call right now" msgstr "Im Moment anzurufende Adresse" -#: ../gtk/main.c:141 +#: ../gtk/main.c:142 msgid "" "Specifiy a working directory (should be the base of the installation, eg: " "c:\\Program Files\\Linphone)" msgstr "Geben Sie einen Arbeitsordner an (sollte der Installationsordner sein, z. B. C:\\Programme\\Linphone)" -#: ../gtk/main.c:142 +#: ../gtk/main.c:143 msgid "Configuration file" msgstr "Konfigurationsdatei" -#: ../gtk/main.c:143 +#: ../gtk/main.c:144 msgid "Run the audio assistant" msgstr "Starte den Audio-Assistent" -#: ../gtk/main.c:144 +#: ../gtk/main.c:145 msgid "Run self test and exit 0 if succeed" msgstr "" -#: ../gtk/main.c:1069 +#: ../gtk/main.c:1070 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -137,76 +137,80 @@ msgid "" "If you answer no, this person will be temporarily blacklisted." msgstr "%s möchte Sie zu seiner Kontaktliste hinzufügen.\nMöchten Sie ihm erlauben, Ihren Anwesenheitsstatus zu sehen, oder ihn zu Ihrer Kontaktliste hinzufügen?\nWenn Sie mit Nein antworten, wird diese Person vorläufig blockiert." -#: ../gtk/main.c:1146 +#: ../gtk/main.c:1147 #, c-format msgid "" "Please enter your password for username %s\n" " at realm %s:" msgstr "Bitte geben Sie Ihr Passwort für den Benutzernamen %s\n für Bereich %s ein:" -#: ../gtk/main.c:1267 +#: ../gtk/main.c:1268 msgid "Call error" msgstr "Anruf fehlgeschlagen" -#: ../gtk/main.c:1270 ../coreapi/linphonecore.c:3842 +#: ../gtk/main.c:1271 ../coreapi/linphonecore.c:3846 msgid "Call ended" msgstr "Anruf beendet" -#: ../gtk/main.c:1273 ../coreapi/call_log.c:221 +#: ../gtk/main.c:1274 ../coreapi/call_log.c:221 msgid "Incoming call" msgstr "Eingehender Anruf" -#: ../gtk/main.c:1275 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 +#: ../gtk/main.c:1276 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 msgid "Answer" msgstr "Annehmen" -#: ../gtk/main.c:1277 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1278 ../gtk/main.ui.h:6 msgid "Decline" msgstr "Abweisen" -#: ../gtk/main.c:1283 +#: ../gtk/main.c:1284 msgid "Call paused" msgstr "Anruf wird gehalten" -#: ../gtk/main.c:1283 +#: ../gtk/main.c:1284 #, c-format msgid "by %s" msgstr "von %s" -#: ../gtk/main.c:1353 +#: ../gtk/main.c:1354 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "%s schlägt vor, eine Videoübertragung zu starten. Nehmen Sie an?" -#: ../gtk/main.c:1516 +#: ../gtk/main.c:1509 msgid "Website link" msgstr "Website-Verknüpfung" -#: ../gtk/main.c:1565 -msgid "Linphone - a video internet phone" -msgstr "Linphone - ein Internet-Video-Telefon" +#: ../gtk/main.c:1568 ../gtk/waiting.ui.h:1 +msgid "Linphone" +msgstr "Linphone" -#: ../gtk/main.c:1657 +#: ../gtk/main.c:1569 +msgid "A video internet phone" +msgstr "" + +#: ../gtk/main.c:1629 #, c-format msgid "%s (Default)" msgstr "%s (Vorgabe)" -#: ../gtk/main.c:1989 ../coreapi/callbacks.c:1057 +#: ../gtk/main.c:1962 ../coreapi/callbacks.c:1063 #, c-format msgid "We are transferred to %s" msgstr "Vermittlung nach %s" -#: ../gtk/main.c:1999 +#: ../gtk/main.c:1972 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." msgstr "Auf diesem Rechner können keine Soundkarten gefunden werden.\nSie können keine Audio-Anrufe tätigen oder entgegennehmen." -#: ../gtk/main.c:2147 +#: ../gtk/main.c:2117 msgid "A free SIP video-phone" msgstr "Ein freies SIP-Video-Telefon" -#: ../gtk/main.c:2252 +#: ../gtk/main.c:2221 #, c-format msgid "Hello\n" msgstr "" @@ -219,7 +223,7 @@ msgstr "Zum Adressbuch hinzufügen" msgid "Presence status" msgstr "Anwesenheitsstatus" -#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:552 ../gtk/contact.ui.h:1 +#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:569 ../gtk/contact.ui.h:1 msgid "Name" msgstr "Name" @@ -260,124 +264,124 @@ msgstr "Lösche Gesprächshistorie von '%s'" msgid "Add new contact from %s directory" msgstr "Einen neuen Kontakt aus dem %s-Verzeichnis hinzufügen" -#: ../gtk/propertybox.c:558 +#: ../gtk/propertybox.c:575 msgid "Rate (Hz)" msgstr "Rate (Hz)" -#: ../gtk/propertybox.c:564 +#: ../gtk/propertybox.c:581 msgid "Status" msgstr "Status" -#: ../gtk/propertybox.c:570 +#: ../gtk/propertybox.c:587 msgid "IP Bitrate (kbit/s)" msgstr "IP Bit-Rate (kbit/s)" -#: ../gtk/propertybox.c:577 +#: ../gtk/propertybox.c:596 msgid "Parameters" msgstr "Parameter" -#: ../gtk/propertybox.c:620 ../gtk/propertybox.c:763 +#: ../gtk/propertybox.c:639 ../gtk/propertybox.c:782 msgid "Enabled" msgstr "Freigegeben" -#: ../gtk/propertybox.c:622 ../gtk/propertybox.c:763 ../gtk/parameters.ui.h:20 +#: ../gtk/propertybox.c:641 ../gtk/propertybox.c:782 ../gtk/parameters.ui.h:20 msgid "Disabled" msgstr "Gesperrt" -#: ../gtk/propertybox.c:809 +#: ../gtk/propertybox.c:828 msgid "Account" msgstr "Konto" -#: ../gtk/propertybox.c:1072 +#: ../gtk/propertybox.c:1091 msgid "English" msgstr "Englisch" -#: ../gtk/propertybox.c:1073 +#: ../gtk/propertybox.c:1092 msgid "French" msgstr "Französisch" -#: ../gtk/propertybox.c:1074 +#: ../gtk/propertybox.c:1093 msgid "Swedish" msgstr "Schwedisch" -#: ../gtk/propertybox.c:1075 +#: ../gtk/propertybox.c:1094 msgid "Italian" msgstr "Italienisch" -#: ../gtk/propertybox.c:1076 +#: ../gtk/propertybox.c:1095 msgid "Spanish" msgstr "Spanisch" -#: ../gtk/propertybox.c:1077 +#: ../gtk/propertybox.c:1096 msgid "Brazilian Portugese" msgstr "Brasilianisches Portugiesisch" -#: ../gtk/propertybox.c:1078 +#: ../gtk/propertybox.c:1097 msgid "Polish" msgstr "Polnisch" -#: ../gtk/propertybox.c:1079 +#: ../gtk/propertybox.c:1098 msgid "German" msgstr "Deutsch" -#: ../gtk/propertybox.c:1080 +#: ../gtk/propertybox.c:1099 msgid "Russian" msgstr "Russisch" -#: ../gtk/propertybox.c:1081 +#: ../gtk/propertybox.c:1100 msgid "Japanese" msgstr "Japanisch" -#: ../gtk/propertybox.c:1082 +#: ../gtk/propertybox.c:1101 msgid "Dutch" msgstr "Niederländisch" -#: ../gtk/propertybox.c:1083 +#: ../gtk/propertybox.c:1102 msgid "Hungarian" msgstr "Ungarisch" -#: ../gtk/propertybox.c:1084 +#: ../gtk/propertybox.c:1103 msgid "Czech" msgstr "Tschechisch" -#: ../gtk/propertybox.c:1085 +#: ../gtk/propertybox.c:1104 msgid "Chinese" msgstr "Chinesisch" -#: ../gtk/propertybox.c:1086 +#: ../gtk/propertybox.c:1105 msgid "Traditional Chinese" msgstr "Traditionelles Chinesisch" -#: ../gtk/propertybox.c:1087 +#: ../gtk/propertybox.c:1106 msgid "Norwegian" msgstr "Norwegisch" -#: ../gtk/propertybox.c:1088 +#: ../gtk/propertybox.c:1107 msgid "Hebrew" msgstr "Hebräisch" -#: ../gtk/propertybox.c:1089 +#: ../gtk/propertybox.c:1108 msgid "Serbian" msgstr "Serbisch" -#: ../gtk/propertybox.c:1156 +#: ../gtk/propertybox.c:1175 msgid "" "You need to restart linphone for the new language selection to take effect." msgstr "Linphone muss neu gestartet werden, damit die neue Spracheinstellung wirksam wird." -#: ../gtk/propertybox.c:1236 +#: ../gtk/propertybox.c:1255 msgid "None" msgstr "Keinen" -#: ../gtk/propertybox.c:1240 +#: ../gtk/propertybox.c:1259 msgid "SRTP" msgstr "SRTP" -#: ../gtk/propertybox.c:1246 +#: ../gtk/propertybox.c:1265 msgid "DTLS" msgstr "" -#: ../gtk/propertybox.c:1253 +#: ../gtk/propertybox.c:1272 msgid "ZRTP" msgstr "ZRTP" @@ -419,133 +423,133 @@ msgid_plural "Found %i contacts" msgstr[0] "%i Kontakt gefunden" msgstr[1] "%i Kontakte gefunden" -#: ../gtk/setupwizard.c:34 +#: ../gtk/setupwizard.c:32 msgid "" "Welcome!\n" "This assistant will help you to use a SIP account for your calls." msgstr "Willkommen!\nDieser Assistent hilft Ihnen dabei ein SIP-Konto einzurichten." -#: ../gtk/setupwizard.c:43 +#: ../gtk/setupwizard.c:41 msgid "Create an account on linphone.org" msgstr "Ein Konto bei linphone.org erstellen." -#: ../gtk/setupwizard.c:44 +#: ../gtk/setupwizard.c:42 msgid "I have already a linphone.org account and I just want to use it" msgstr "Ich habe bereits ein Konto bei linphone.org und möchte es jetzt benutzen." -#: ../gtk/setupwizard.c:45 +#: ../gtk/setupwizard.c:43 msgid "I have already a sip account and I just want to use it" msgstr "Ich habe bereits ein SIP-Konto und möchte es jetzt benutzen." -#: ../gtk/setupwizard.c:46 +#: ../gtk/setupwizard.c:44 msgid "I want to specify a remote configuration URI" msgstr "Ich möchte eine URI zur Fernkonfiguration angeben" -#: ../gtk/setupwizard.c:89 +#: ../gtk/setupwizard.c:87 msgid "Enter your linphone.org username" msgstr "Geben Sie Ihren Benutzernamen bei linphone.org ein." -#: ../gtk/setupwizard.c:102 ../gtk/parameters.ui.h:85 ../gtk/ldap.ui.h:4 +#: ../gtk/setupwizard.c:100 ../gtk/parameters.ui.h:85 ../gtk/ldap.ui.h:4 msgid "Username:" msgstr "Benutzername:" -#: ../gtk/setupwizard.c:104 ../gtk/password.ui.h:4 ../gtk/ldap.ui.h:5 +#: ../gtk/setupwizard.c:102 ../gtk/password.ui.h:4 ../gtk/ldap.ui.h:5 msgid "Password:" msgstr "Passwort:" -#: ../gtk/setupwizard.c:124 +#: ../gtk/setupwizard.c:122 msgid "Enter your account informations" msgstr "Geben Sie Ihre Zugangsdaten ein." -#: ../gtk/setupwizard.c:140 +#: ../gtk/setupwizard.c:138 msgid "Username*" msgstr "Benutzername*" -#: ../gtk/setupwizard.c:141 +#: ../gtk/setupwizard.c:139 msgid "Password*" msgstr "Passwort*" -#: ../gtk/setupwizard.c:144 +#: ../gtk/setupwizard.c:142 msgid "Domain*" msgstr "Domäne*" -#: ../gtk/setupwizard.c:145 +#: ../gtk/setupwizard.c:143 msgid "Proxy" msgstr "Proxy" -#: ../gtk/setupwizard.c:317 +#: ../gtk/setupwizard.c:322 msgid "(*) Required fields" msgstr "(*) erforderliche Felder" -#: ../gtk/setupwizard.c:318 +#: ../gtk/setupwizard.c:323 msgid "Username: (*)" msgstr "Benutzername: (*)" -#: ../gtk/setupwizard.c:320 +#: ../gtk/setupwizard.c:325 msgid "Password: (*)" msgstr "Passwort: (*)" -#: ../gtk/setupwizard.c:322 +#: ../gtk/setupwizard.c:327 msgid "Email: (*)" msgstr "E-Mail: (*)" -#: ../gtk/setupwizard.c:324 +#: ../gtk/setupwizard.c:329 msgid "Confirm your password: (*)" msgstr "Bestätigen Sie Ihr Passwort: (*)" -#: ../gtk/setupwizard.c:338 +#: ../gtk/setupwizard.c:343 msgid "Keep me informed with linphone updates" msgstr "Halte mich über linphone Aktualisierungen auf dem laufenden" -#: ../gtk/setupwizard.c:394 +#: ../gtk/setupwizard.c:399 msgid "" "Error, account not validated, username already used or server unreachable.\n" "Please go back and try again." msgstr "Fehler, Konto kann nicht bestätigt werden. Der Benutzername wird bereits\nverwendet oder der Server ist unerreichbar.\nBitte gehen Sie zurück und versuchen Sie es noch einmal." -#: ../gtk/setupwizard.c:405 +#: ../gtk/setupwizard.c:410 msgid "Thank you. Your account is now configured and ready for use." msgstr "Danke. Ihr Konto ist nun fertig eingerichtet und kann verwendet werden." -#: ../gtk/setupwizard.c:413 +#: ../gtk/setupwizard.c:418 msgid "" "Please validate your account by clicking on the link we just sent you by email.\n" "Then come back here and press Next button." msgstr "Bitte bestätigen Sie Ihr Konto, indem Sie auf die Verknüpfung klicken, die wir Ihnen soeben per E-Mail geschickt haben.\nDanach gehen Sie hierher zurück und drücken auf „Vor“." -#: ../gtk/setupwizard.c:602 +#: ../gtk/setupwizard.c:609 msgid "SIP account configuration assistant" msgstr "SIP-Konto-Einrichtungsassistent" -#: ../gtk/setupwizard.c:620 +#: ../gtk/setupwizard.c:629 msgid "Welcome to the account setup assistant" msgstr "Willkommen zum Konto-Einrichtungsassistenten" -#: ../gtk/setupwizard.c:625 +#: ../gtk/setupwizard.c:634 msgid "Account setup assistant" msgstr "Konto-Einrichtungsassistent" -#: ../gtk/setupwizard.c:631 +#: ../gtk/setupwizard.c:640 msgid "Configure your account (step 1/1)" msgstr "Konto einrichten (Schritt 1/1)" -#: ../gtk/setupwizard.c:636 +#: ../gtk/setupwizard.c:645 msgid "Enter your sip username (step 1/1)" msgstr "Geben Sie Ihren SIP-Benutzernamen ein (Schritt 1/1)" -#: ../gtk/setupwizard.c:640 +#: ../gtk/setupwizard.c:649 msgid "Enter account information (step 1/2)" msgstr "Geben Sie Ihre Zugangsdaten ein (Schritt 1/2)" -#: ../gtk/setupwizard.c:649 +#: ../gtk/setupwizard.c:658 msgid "Validation (step 2/2)" msgstr "Bestätigung (Schritt 2/2)" -#: ../gtk/setupwizard.c:654 +#: ../gtk/setupwizard.c:663 msgid "Error" msgstr "Fehler" -#: ../gtk/setupwizard.c:658 ../gtk/audio_assistant.c:534 +#: ../gtk/setupwizard.c:667 ../gtk/audio_assistant.c:534 msgid "Terminating" msgstr "Fertigstellen" @@ -1499,10 +1503,6 @@ msgstr "Zur Kontaktliste hinzufügen" msgid "Search somebody" msgstr "Kontaktsuche" -#: ../gtk/waiting.ui.h:1 -msgid "Linphone" -msgstr "Linphone" - #: ../gtk/waiting.ui.h:2 msgid "Please wait" msgstr "Bitte warten" @@ -1702,68 +1702,68 @@ msgstr "Einstellen..." msgid "Please wait while fetching configuration from server..." msgstr "Bitte warten Sie während die Einstellungen vom Server abgerufen werden..." -#: ../coreapi/linphonecore.c:1538 +#: ../coreapi/linphonecore.c:1539 msgid "Ready" msgstr "Bereit" -#: ../coreapi/linphonecore.c:2550 +#: ../coreapi/linphonecore.c:2551 msgid "Configuring" msgstr "Einstellen" -#: ../coreapi/linphonecore.c:2724 +#: ../coreapi/linphonecore.c:2725 msgid "Looking for telephone number destination..." msgstr "Telefonnummernziel wird gesucht..." -#: ../coreapi/linphonecore.c:2726 +#: ../coreapi/linphonecore.c:2727 msgid "Could not resolve this number." msgstr "Diese Nummer kann nicht aufgelöst werden." #. must be known at that time -#: ../coreapi/linphonecore.c:3012 +#: ../coreapi/linphonecore.c:3013 msgid "Contacting" msgstr "Verbindungsaufbau" -#: ../coreapi/linphonecore.c:3017 +#: ../coreapi/linphonecore.c:3018 msgid "Could not call" msgstr "Anruf kann nicht getätigt werden." -#: ../coreapi/linphonecore.c:3168 +#: ../coreapi/linphonecore.c:3169 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "Die maximale Anzahl der gleichzeitigen Anrufe ist erreicht." -#: ../coreapi/linphonecore.c:3326 +#: ../coreapi/linphonecore.c:3327 msgid "is contacting you" msgstr "ruft Sie an" -#: ../coreapi/linphonecore.c:3327 +#: ../coreapi/linphonecore.c:3328 msgid " and asked autoanswer." msgstr " und fragt nach automatischer Antwort." -#: ../coreapi/linphonecore.c:3451 +#: ../coreapi/linphonecore.c:3452 msgid "Modifying call parameters..." msgstr "Die Anrufparameter werden verändert..." -#: ../coreapi/linphonecore.c:3798 +#: ../coreapi/linphonecore.c:3802 msgid "Connected." msgstr "Verbunden." -#: ../coreapi/linphonecore.c:3823 +#: ../coreapi/linphonecore.c:3827 msgid "Call aborted" msgstr "Anruf abgebrochen" -#: ../coreapi/linphonecore.c:4013 +#: ../coreapi/linphonecore.c:4024 msgid "Could not pause the call" msgstr "Anruf kann nicht gehalten werden" -#: ../coreapi/linphonecore.c:4016 +#: ../coreapi/linphonecore.c:4027 msgid "Pausing the current call..." msgstr "Aktueller Anruf wird gehalten..." -#: ../coreapi/misc.c:433 +#: ../coreapi/misc.c:434 msgid "Stun lookup in progress..." msgstr "STUN-Ermittlung läuft..." -#: ../coreapi/misc.c:614 +#: ../coreapi/misc.c:615 msgid "ICE local candidates gathering in progress..." msgstr "Lokale Kandidaten für ICE werden zusammengestellt..." @@ -1848,100 +1848,100 @@ msgstr "Klingeln bei der Gegenseite..." msgid "Early media." msgstr "nicht kompatibel, prüfe Codecs oder Sicherheitseinstellungen..." -#: ../coreapi/callbacks.c:533 +#: ../coreapi/callbacks.c:534 #, c-format msgid "Call with %s is paused." msgstr "Anruf mit %s wird gehalten." -#: ../coreapi/callbacks.c:546 +#: ../coreapi/callbacks.c:547 #, c-format msgid "Call answered by %s - on hold." msgstr "Der von %s entgegengenommene Anruf wird gehalten." -#: ../coreapi/callbacks.c:556 +#: ../coreapi/callbacks.c:557 msgid "Call resumed." msgstr "Anruf fortgesetzt." -#: ../coreapi/callbacks.c:560 +#: ../coreapi/callbacks.c:561 #, c-format msgid "Call answered by %s." msgstr "Anruf wird von %s entgegengenommen." -#: ../coreapi/callbacks.c:583 +#: ../coreapi/callbacks.c:584 msgid "Incompatible, check codecs or security settings..." msgstr "Inkompatibel, prüfe Codecs oder Sicherheitseinstellungen..." -#: ../coreapi/callbacks.c:588 ../coreapi/callbacks.c:900 +#: ../coreapi/callbacks.c:589 ../coreapi/callbacks.c:906 msgid "Incompatible media parameters." msgstr "Inkompatible Medienparameter." -#: ../coreapi/callbacks.c:618 +#: ../coreapi/callbacks.c:619 msgid "We have been resumed." msgstr "Anruf wird fortgesetzt." #. we are being paused -#: ../coreapi/callbacks.c:626 +#: ../coreapi/callbacks.c:628 msgid "We are paused by other party." msgstr "Anruf wird von der Gegenseite gehalten." #. reINVITE and in-dialogs UPDATE go here -#: ../coreapi/callbacks.c:660 +#: ../coreapi/callbacks.c:666 msgid "Call is updated by remote." msgstr "Anruf ist von der Gegenseite aktualisiert worden." -#: ../coreapi/callbacks.c:776 +#: ../coreapi/callbacks.c:782 msgid "Call terminated." msgstr "Anruf beendet." -#: ../coreapi/callbacks.c:804 +#: ../coreapi/callbacks.c:810 msgid "User is busy." msgstr "Teilnehmer ist besetzt." -#: ../coreapi/callbacks.c:805 +#: ../coreapi/callbacks.c:811 msgid "User is temporarily unavailable." msgstr "Teilnehmer zur Zeit nicht verfügbar." #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:807 +#: ../coreapi/callbacks.c:813 msgid "User does not want to be disturbed." msgstr "Teilnehmer möchte nicht gestört werden." -#: ../coreapi/callbacks.c:808 +#: ../coreapi/callbacks.c:814 msgid "Call declined." msgstr "Anruf abgewiesen" -#: ../coreapi/callbacks.c:823 +#: ../coreapi/callbacks.c:829 msgid "Request timeout." msgstr "Zeitüberschreitung bei der Anfrage" -#: ../coreapi/callbacks.c:854 +#: ../coreapi/callbacks.c:860 msgid "Redirected" msgstr "Umgeleitet" -#: ../coreapi/callbacks.c:909 +#: ../coreapi/callbacks.c:915 msgid "Call failed." msgstr "Anruf fehlgeschlagen." -#: ../coreapi/callbacks.c:987 +#: ../coreapi/callbacks.c:993 #, c-format msgid "Registration on %s successful." msgstr "Registrierung auf %s erfolgreich." -#: ../coreapi/callbacks.c:988 +#: ../coreapi/callbacks.c:994 #, c-format msgid "Unregistration on %s done." msgstr "Abmeldung von %s ist erfolgt." -#: ../coreapi/callbacks.c:1006 +#: ../coreapi/callbacks.c:1012 msgid "no response timeout" msgstr "Zeitüberschreitung bei der Antwort" -#: ../coreapi/callbacks.c:1009 +#: ../coreapi/callbacks.c:1015 #, c-format msgid "Registration on %s failed: %s" msgstr "Registrierung auf %s fehlgeschlagen: %s" -#: ../coreapi/callbacks.c:1016 +#: ../coreapi/callbacks.c:1022 msgid "Service unavailable, retrying" msgstr "Service nicht verfügbar, versuche erneut" @@ -1951,11 +1951,11 @@ msgstr "Service nicht verfügbar, versuche erneut" msgid "Authentication token is %s" msgstr "Authentifizierungs-Token ist %s" -#: ../coreapi/linphonecall.c:1306 +#: ../coreapi/linphonecall.c:1310 msgid "Call parameters were successfully modified." msgstr "" -#: ../coreapi/linphonecall.c:3660 +#: ../coreapi/linphonecall.c:3686 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." diff --git a/po/es.po b/po/es.po index 8394b8241..54548cf24 100644 --- a/po/es.po +++ b/po/es.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: linphone-gtk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-04-01 16:25+0200\n" -"PO-Revision-Date: 2015-04-01 14:26+0000\n" +"POT-Creation-Date: 2015-04-30 10:13+0200\n" +"PO-Revision-Date: 2015-04-30 08:13+0000\n" "Last-Translator: Belledonne Communications \n" "Language-Team: Spanish (http://www.transifex.com/projects/p/linphone-gtk/language/es/)\n" "MIME-Version: 1.0\n" @@ -87,45 +87,45 @@ msgstr "Yo" msgid "Couldn't find pixmap file: %s" msgstr "No se pudo encontrar el archivo pixmap: %s" -#: ../gtk/main.c:136 +#: ../gtk/main.c:137 msgid "log to stdout some debug information while running." msgstr "registra a stdout cierta información de depuración durante la ejecución." -#: ../gtk/main.c:137 +#: ../gtk/main.c:138 msgid "path to a file to write logs into." msgstr "ruta a un fichero donde escribir logs." -#: ../gtk/main.c:138 +#: ../gtk/main.c:139 msgid "Start linphone with video disabled." msgstr "" -#: ../gtk/main.c:139 +#: ../gtk/main.c:140 msgid "Start only in the system tray, do not show the main interface." msgstr "Iniciar sólo en la barra de tareas, no mostrar la interfaz principal." -#: ../gtk/main.c:140 +#: ../gtk/main.c:141 msgid "address to call right now" msgstr "dirección a la que llamar inmediatamente" -#: ../gtk/main.c:141 +#: ../gtk/main.c:142 msgid "" "Specifiy a working directory (should be the base of the installation, eg: " "c:\\Program Files\\Linphone)" msgstr "Especifique un directorio de trabajo (debería ser la raíz de la instalación, ej: c:\\Archivos de Programa\\Linphone)" -#: ../gtk/main.c:142 +#: ../gtk/main.c:143 msgid "Configuration file" msgstr "" -#: ../gtk/main.c:143 +#: ../gtk/main.c:144 msgid "Run the audio assistant" msgstr "" -#: ../gtk/main.c:144 +#: ../gtk/main.c:145 msgid "Run self test and exit 0 if succeed" msgstr "" -#: ../gtk/main.c:1069 +#: ../gtk/main.c:1070 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -133,76 +133,80 @@ msgid "" "If you answer no, this person will be temporarily blacklisted." msgstr "%s desea añadirle a su lista de contactos.\n¿Desea permitirle ver su estado de presencia o añadirle a su lista de contactos?\nSi responde no, esta persona será bloqueada temporalmente." -#: ../gtk/main.c:1146 +#: ../gtk/main.c:1147 #, c-format msgid "" "Please enter your password for username %s\n" " at realm %s:" msgstr "" -#: ../gtk/main.c:1267 +#: ../gtk/main.c:1268 msgid "Call error" msgstr "" -#: ../gtk/main.c:1270 ../coreapi/linphonecore.c:3842 +#: ../gtk/main.c:1271 ../coreapi/linphonecore.c:3846 msgid "Call ended" msgstr "" -#: ../gtk/main.c:1273 ../coreapi/call_log.c:221 +#: ../gtk/main.c:1274 ../coreapi/call_log.c:221 msgid "Incoming call" msgstr "Llamada entrante" -#: ../gtk/main.c:1275 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 +#: ../gtk/main.c:1276 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 msgid "Answer" msgstr "Contestar" -#: ../gtk/main.c:1277 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1278 ../gtk/main.ui.h:6 msgid "Decline" msgstr "" -#: ../gtk/main.c:1283 +#: ../gtk/main.c:1284 msgid "Call paused" msgstr "" -#: ../gtk/main.c:1283 +#: ../gtk/main.c:1284 #, c-format msgid "by %s" msgstr "" -#: ../gtk/main.c:1353 +#: ../gtk/main.c:1354 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1516 +#: ../gtk/main.c:1509 msgid "Website link" msgstr "Enlace a la Web" -#: ../gtk/main.c:1565 -msgid "Linphone - a video internet phone" -msgstr "Linphone - un video-teléfono a través de Internet" +#: ../gtk/main.c:1568 ../gtk/waiting.ui.h:1 +msgid "Linphone" +msgstr "" -#: ../gtk/main.c:1657 +#: ../gtk/main.c:1569 +msgid "A video internet phone" +msgstr "" + +#: ../gtk/main.c:1629 #, c-format msgid "%s (Default)" msgstr "%s (Opción predeterminada)" -#: ../gtk/main.c:1989 ../coreapi/callbacks.c:1057 +#: ../gtk/main.c:1962 ../coreapi/callbacks.c:1063 #, c-format msgid "We are transferred to %s" msgstr "Somos transferidos a %s" -#: ../gtk/main.c:1999 +#: ../gtk/main.c:1972 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." msgstr "No se ha encontrado una tarjeta de sonido en este equipo.\nNo será posible realizar o recibir llamadas de audio." -#: ../gtk/main.c:2147 +#: ../gtk/main.c:2117 msgid "A free SIP video-phone" msgstr "Un video-teléfono SIP gratuito" -#: ../gtk/main.c:2252 +#: ../gtk/main.c:2221 #, c-format msgid "Hello\n" msgstr "" @@ -215,7 +219,7 @@ msgstr "" msgid "Presence status" msgstr "" -#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:552 ../gtk/contact.ui.h:1 +#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:569 ../gtk/contact.ui.h:1 msgid "Name" msgstr "Nombre" @@ -256,124 +260,124 @@ msgstr "" msgid "Add new contact from %s directory" msgstr "Añadir nuevo contacto desde el directorio %s" -#: ../gtk/propertybox.c:558 +#: ../gtk/propertybox.c:575 msgid "Rate (Hz)" msgstr "Frecuencia (Hz)" -#: ../gtk/propertybox.c:564 +#: ../gtk/propertybox.c:581 msgid "Status" msgstr "Estado" -#: ../gtk/propertybox.c:570 +#: ../gtk/propertybox.c:587 msgid "IP Bitrate (kbit/s)" msgstr "" -#: ../gtk/propertybox.c:577 +#: ../gtk/propertybox.c:596 msgid "Parameters" msgstr "Parámetros" -#: ../gtk/propertybox.c:620 ../gtk/propertybox.c:763 +#: ../gtk/propertybox.c:639 ../gtk/propertybox.c:782 msgid "Enabled" msgstr "Activado" -#: ../gtk/propertybox.c:622 ../gtk/propertybox.c:763 ../gtk/parameters.ui.h:20 +#: ../gtk/propertybox.c:641 ../gtk/propertybox.c:782 ../gtk/parameters.ui.h:20 msgid "Disabled" msgstr "Desactivado" -#: ../gtk/propertybox.c:809 +#: ../gtk/propertybox.c:828 msgid "Account" msgstr "Cuenta" -#: ../gtk/propertybox.c:1072 +#: ../gtk/propertybox.c:1091 msgid "English" msgstr "Inglés" -#: ../gtk/propertybox.c:1073 +#: ../gtk/propertybox.c:1092 msgid "French" msgstr "Francés" -#: ../gtk/propertybox.c:1074 +#: ../gtk/propertybox.c:1093 msgid "Swedish" msgstr "Sueco" -#: ../gtk/propertybox.c:1075 +#: ../gtk/propertybox.c:1094 msgid "Italian" msgstr "Italiano" -#: ../gtk/propertybox.c:1076 +#: ../gtk/propertybox.c:1095 msgid "Spanish" msgstr "Español" -#: ../gtk/propertybox.c:1077 +#: ../gtk/propertybox.c:1096 msgid "Brazilian Portugese" msgstr "Portugués de Brasil" -#: ../gtk/propertybox.c:1078 +#: ../gtk/propertybox.c:1097 msgid "Polish" msgstr "Polaco" -#: ../gtk/propertybox.c:1079 +#: ../gtk/propertybox.c:1098 msgid "German" msgstr "Alemán" -#: ../gtk/propertybox.c:1080 +#: ../gtk/propertybox.c:1099 msgid "Russian" msgstr "Ruso" -#: ../gtk/propertybox.c:1081 +#: ../gtk/propertybox.c:1100 msgid "Japanese" msgstr "Japonés" -#: ../gtk/propertybox.c:1082 +#: ../gtk/propertybox.c:1101 msgid "Dutch" msgstr "Holandés" -#: ../gtk/propertybox.c:1083 +#: ../gtk/propertybox.c:1102 msgid "Hungarian" msgstr "Húngaro" -#: ../gtk/propertybox.c:1084 +#: ../gtk/propertybox.c:1103 msgid "Czech" msgstr "Checo" -#: ../gtk/propertybox.c:1085 +#: ../gtk/propertybox.c:1104 msgid "Chinese" msgstr "Chino" -#: ../gtk/propertybox.c:1086 +#: ../gtk/propertybox.c:1105 msgid "Traditional Chinese" msgstr "Chino Tradicional" -#: ../gtk/propertybox.c:1087 +#: ../gtk/propertybox.c:1106 msgid "Norwegian" msgstr "Noruego" -#: ../gtk/propertybox.c:1088 +#: ../gtk/propertybox.c:1107 msgid "Hebrew" msgstr "" -#: ../gtk/propertybox.c:1089 +#: ../gtk/propertybox.c:1108 msgid "Serbian" msgstr "" -#: ../gtk/propertybox.c:1156 +#: ../gtk/propertybox.c:1175 msgid "" "You need to restart linphone for the new language selection to take effect." msgstr "Deberá reiniciar linphone para aplicar la nueva selección de lenguaje" -#: ../gtk/propertybox.c:1236 +#: ../gtk/propertybox.c:1255 msgid "None" msgstr "" -#: ../gtk/propertybox.c:1240 +#: ../gtk/propertybox.c:1259 msgid "SRTP" msgstr "SRTP" -#: ../gtk/propertybox.c:1246 +#: ../gtk/propertybox.c:1265 msgid "DTLS" msgstr "" -#: ../gtk/propertybox.c:1253 +#: ../gtk/propertybox.c:1272 msgid "ZRTP" msgstr "ZRTP" @@ -415,133 +419,133 @@ msgid_plural "Found %i contacts" msgstr[0] "Se encontró %i contacto" msgstr[1] "Se encontraron %i contactos" -#: ../gtk/setupwizard.c:34 +#: ../gtk/setupwizard.c:32 msgid "" "Welcome!\n" "This assistant will help you to use a SIP account for your calls." msgstr "" -#: ../gtk/setupwizard.c:43 +#: ../gtk/setupwizard.c:41 msgid "Create an account on linphone.org" msgstr "" -#: ../gtk/setupwizard.c:44 +#: ../gtk/setupwizard.c:42 msgid "I have already a linphone.org account and I just want to use it" msgstr "" -#: ../gtk/setupwizard.c:45 +#: ../gtk/setupwizard.c:43 msgid "I have already a sip account and I just want to use it" msgstr "" -#: ../gtk/setupwizard.c:46 +#: ../gtk/setupwizard.c:44 msgid "I want to specify a remote configuration URI" msgstr "" -#: ../gtk/setupwizard.c:89 +#: ../gtk/setupwizard.c:87 msgid "Enter your linphone.org username" msgstr "" -#: ../gtk/setupwizard.c:102 ../gtk/parameters.ui.h:85 ../gtk/ldap.ui.h:4 +#: ../gtk/setupwizard.c:100 ../gtk/parameters.ui.h:85 ../gtk/ldap.ui.h:4 msgid "Username:" msgstr "" -#: ../gtk/setupwizard.c:104 ../gtk/password.ui.h:4 ../gtk/ldap.ui.h:5 +#: ../gtk/setupwizard.c:102 ../gtk/password.ui.h:4 ../gtk/ldap.ui.h:5 msgid "Password:" msgstr "" -#: ../gtk/setupwizard.c:124 +#: ../gtk/setupwizard.c:122 msgid "Enter your account informations" msgstr "" -#: ../gtk/setupwizard.c:140 +#: ../gtk/setupwizard.c:138 msgid "Username*" msgstr "" -#: ../gtk/setupwizard.c:141 +#: ../gtk/setupwizard.c:139 msgid "Password*" msgstr "" -#: ../gtk/setupwizard.c:144 +#: ../gtk/setupwizard.c:142 msgid "Domain*" msgstr "" -#: ../gtk/setupwizard.c:145 +#: ../gtk/setupwizard.c:143 msgid "Proxy" msgstr "" -#: ../gtk/setupwizard.c:317 +#: ../gtk/setupwizard.c:322 msgid "(*) Required fields" msgstr "" -#: ../gtk/setupwizard.c:318 +#: ../gtk/setupwizard.c:323 msgid "Username: (*)" msgstr "" -#: ../gtk/setupwizard.c:320 +#: ../gtk/setupwizard.c:325 msgid "Password: (*)" msgstr "" -#: ../gtk/setupwizard.c:322 +#: ../gtk/setupwizard.c:327 msgid "Email: (*)" msgstr "" -#: ../gtk/setupwizard.c:324 +#: ../gtk/setupwizard.c:329 msgid "Confirm your password: (*)" msgstr "" -#: ../gtk/setupwizard.c:338 +#: ../gtk/setupwizard.c:343 msgid "Keep me informed with linphone updates" msgstr "" -#: ../gtk/setupwizard.c:394 +#: ../gtk/setupwizard.c:399 msgid "" "Error, account not validated, username already used or server unreachable.\n" "Please go back and try again." msgstr "" -#: ../gtk/setupwizard.c:405 +#: ../gtk/setupwizard.c:410 msgid "Thank you. Your account is now configured and ready for use." msgstr "Gracias. Su cuenta está configurada y lista para su utilización." -#: ../gtk/setupwizard.c:413 +#: ../gtk/setupwizard.c:418 msgid "" "Please validate your account by clicking on the link we just sent you by email.\n" "Then come back here and press Next button." msgstr "" -#: ../gtk/setupwizard.c:602 +#: ../gtk/setupwizard.c:609 msgid "SIP account configuration assistant" msgstr "" -#: ../gtk/setupwizard.c:620 +#: ../gtk/setupwizard.c:629 msgid "Welcome to the account setup assistant" msgstr "Bienvenido al asistente de configuración de cuenta" -#: ../gtk/setupwizard.c:625 +#: ../gtk/setupwizard.c:634 msgid "Account setup assistant" msgstr "Asistente de configuración de cuenta" -#: ../gtk/setupwizard.c:631 +#: ../gtk/setupwizard.c:640 msgid "Configure your account (step 1/1)" msgstr "" -#: ../gtk/setupwizard.c:636 +#: ../gtk/setupwizard.c:645 msgid "Enter your sip username (step 1/1)" msgstr "" -#: ../gtk/setupwizard.c:640 +#: ../gtk/setupwizard.c:649 msgid "Enter account information (step 1/2)" msgstr "" -#: ../gtk/setupwizard.c:649 +#: ../gtk/setupwizard.c:658 msgid "Validation (step 2/2)" msgstr "" -#: ../gtk/setupwizard.c:654 +#: ../gtk/setupwizard.c:663 msgid "Error" msgstr "" -#: ../gtk/setupwizard.c:658 ../gtk/audio_assistant.c:534 +#: ../gtk/setupwizard.c:667 ../gtk/audio_assistant.c:534 msgid "Terminating" msgstr "" @@ -1495,10 +1499,6 @@ msgstr "Añadir a mi lista" msgid "Search somebody" msgstr "" -#: ../gtk/waiting.ui.h:1 -msgid "Linphone" -msgstr "" - #: ../gtk/waiting.ui.h:2 msgid "Please wait" msgstr "Espere por favor" @@ -1698,68 +1698,68 @@ msgstr "" msgid "Please wait while fetching configuration from server..." msgstr "" -#: ../coreapi/linphonecore.c:1538 +#: ../coreapi/linphonecore.c:1539 msgid "Ready" msgstr "" -#: ../coreapi/linphonecore.c:2550 +#: ../coreapi/linphonecore.c:2551 msgid "Configuring" msgstr "" -#: ../coreapi/linphonecore.c:2724 +#: ../coreapi/linphonecore.c:2725 msgid "Looking for telephone number destination..." msgstr "Buscando el número de teléfono del destinatario…" -#: ../coreapi/linphonecore.c:2726 +#: ../coreapi/linphonecore.c:2727 msgid "Could not resolve this number." msgstr "No se ha podido resolver este número." #. must be known at that time -#: ../coreapi/linphonecore.c:3012 +#: ../coreapi/linphonecore.c:3013 msgid "Contacting" msgstr "" -#: ../coreapi/linphonecore.c:3017 +#: ../coreapi/linphonecore.c:3018 msgid "Could not call" msgstr "" -#: ../coreapi/linphonecore.c:3168 +#: ../coreapi/linphonecore.c:3169 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "Disculpe, se ha alcanzado el máximo número de llamadas simultáneas" -#: ../coreapi/linphonecore.c:3326 +#: ../coreapi/linphonecore.c:3327 msgid "is contacting you" msgstr "" -#: ../coreapi/linphonecore.c:3327 +#: ../coreapi/linphonecore.c:3328 msgid " and asked autoanswer." msgstr "y ha solicitado auto respuesta." -#: ../coreapi/linphonecore.c:3451 +#: ../coreapi/linphonecore.c:3452 msgid "Modifying call parameters..." msgstr "Modificando parámetros de llamada…" -#: ../coreapi/linphonecore.c:3798 +#: ../coreapi/linphonecore.c:3802 msgid "Connected." msgstr "Conectado." -#: ../coreapi/linphonecore.c:3823 +#: ../coreapi/linphonecore.c:3827 msgid "Call aborted" msgstr "" -#: ../coreapi/linphonecore.c:4013 +#: ../coreapi/linphonecore.c:4024 msgid "Could not pause the call" msgstr "No se pudo pausar la llamada" -#: ../coreapi/linphonecore.c:4016 +#: ../coreapi/linphonecore.c:4027 msgid "Pausing the current call..." msgstr "Pausando la llamada actual..." -#: ../coreapi/misc.c:433 +#: ../coreapi/misc.c:434 msgid "Stun lookup in progress..." msgstr "Búsqueda STUN en proceso…" -#: ../coreapi/misc.c:614 +#: ../coreapi/misc.c:615 msgid "ICE local candidates gathering in progress..." msgstr "" @@ -1844,100 +1844,100 @@ msgstr "" msgid "Early media." msgstr "Medios iniciales." -#: ../coreapi/callbacks.c:533 +#: ../coreapi/callbacks.c:534 #, c-format msgid "Call with %s is paused." msgstr "La llamada con %s está puesta en pausa." -#: ../coreapi/callbacks.c:546 +#: ../coreapi/callbacks.c:547 #, c-format msgid "Call answered by %s - on hold." msgstr "Llamada respondida por %s - en espera." -#: ../coreapi/callbacks.c:556 +#: ../coreapi/callbacks.c:557 msgid "Call resumed." msgstr "" -#: ../coreapi/callbacks.c:560 +#: ../coreapi/callbacks.c:561 #, c-format msgid "Call answered by %s." msgstr "" -#: ../coreapi/callbacks.c:583 +#: ../coreapi/callbacks.c:584 msgid "Incompatible, check codecs or security settings..." msgstr "" -#: ../coreapi/callbacks.c:588 ../coreapi/callbacks.c:900 +#: ../coreapi/callbacks.c:589 ../coreapi/callbacks.c:906 msgid "Incompatible media parameters." msgstr "" -#: ../coreapi/callbacks.c:618 +#: ../coreapi/callbacks.c:619 msgid "We have been resumed." msgstr "" #. we are being paused -#: ../coreapi/callbacks.c:626 +#: ../coreapi/callbacks.c:628 msgid "We are paused by other party." msgstr "" #. reINVITE and in-dialogs UPDATE go here -#: ../coreapi/callbacks.c:660 +#: ../coreapi/callbacks.c:666 msgid "Call is updated by remote." msgstr "" -#: ../coreapi/callbacks.c:776 +#: ../coreapi/callbacks.c:782 msgid "Call terminated." msgstr "" -#: ../coreapi/callbacks.c:804 +#: ../coreapi/callbacks.c:810 msgid "User is busy." msgstr "El usuario está ocupado." -#: ../coreapi/callbacks.c:805 +#: ../coreapi/callbacks.c:811 msgid "User is temporarily unavailable." msgstr "El usuario no está disponible temporalmente." #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:807 +#: ../coreapi/callbacks.c:813 msgid "User does not want to be disturbed." msgstr "El usuario no quiere que le molesten." -#: ../coreapi/callbacks.c:808 +#: ../coreapi/callbacks.c:814 msgid "Call declined." msgstr "Llamada rechazada." -#: ../coreapi/callbacks.c:823 +#: ../coreapi/callbacks.c:829 msgid "Request timeout." msgstr "" -#: ../coreapi/callbacks.c:854 +#: ../coreapi/callbacks.c:860 msgid "Redirected" msgstr "Redigirida" -#: ../coreapi/callbacks.c:909 +#: ../coreapi/callbacks.c:915 msgid "Call failed." msgstr "" -#: ../coreapi/callbacks.c:987 +#: ../coreapi/callbacks.c:993 #, c-format msgid "Registration on %s successful." msgstr "" -#: ../coreapi/callbacks.c:988 +#: ../coreapi/callbacks.c:994 #, c-format msgid "Unregistration on %s done." msgstr "" -#: ../coreapi/callbacks.c:1006 +#: ../coreapi/callbacks.c:1012 msgid "no response timeout" msgstr "timeout sin respuesta" -#: ../coreapi/callbacks.c:1009 +#: ../coreapi/callbacks.c:1015 #, c-format msgid "Registration on %s failed: %s" msgstr "" -#: ../coreapi/callbacks.c:1016 +#: ../coreapi/callbacks.c:1022 msgid "Service unavailable, retrying" msgstr "" @@ -1947,11 +1947,11 @@ msgstr "" msgid "Authentication token is %s" msgstr "" -#: ../coreapi/linphonecall.c:1306 +#: ../coreapi/linphonecall.c:1310 msgid "Call parameters were successfully modified." msgstr "" -#: ../coreapi/linphonecall.c:3660 +#: ../coreapi/linphonecall.c:3686 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." diff --git a/po/fr.po b/po/fr.po index f95029574..652612561 100644 --- a/po/fr.po +++ b/po/fr.po @@ -12,8 +12,8 @@ msgid "" msgstr "" "Project-Id-Version: linphone-gtk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-04-01 16:25+0200\n" -"PO-Revision-Date: 2015-04-15 07:34+0000\n" +"POT-Creation-Date: 2015-04-30 10:13+0200\n" +"PO-Revision-Date: 2015-04-30 08:35+0000\n" "Last-Translator: Belledonne Communications \n" "Language-Team: French (http://www.transifex.com/projects/p/linphone-gtk/language/fr/)\n" "MIME-Version: 1.0\n" @@ -92,45 +92,45 @@ msgstr "Moi" msgid "Couldn't find pixmap file: %s" msgstr "Icone non trouvée: %s" -#: ../gtk/main.c:136 +#: ../gtk/main.c:137 msgid "log to stdout some debug information while running." msgstr "affiche des informations de debogage" -#: ../gtk/main.c:137 +#: ../gtk/main.c:138 msgid "path to a file to write logs into." msgstr "chemin vers le fichier de logs." -#: ../gtk/main.c:138 +#: ../gtk/main.c:139 msgid "Start linphone with video disabled." msgstr "Démarrer linphone avec la vidéo désactivée." -#: ../gtk/main.c:139 +#: ../gtk/main.c:140 msgid "Start only in the system tray, do not show the main interface." msgstr "Démarre iconifié, sans interface principale." -#: ../gtk/main.c:140 +#: ../gtk/main.c:141 msgid "address to call right now" msgstr "adresse à appeler maintenant" -#: ../gtk/main.c:141 +#: ../gtk/main.c:142 msgid "" "Specifiy a working directory (should be the base of the installation, eg: " "c:\\Program Files\\Linphone)" msgstr "Spécifie un répertoire de travail (qui devrait être le répertoire d'installation, par exemple c:\\Program Files\\Linphone)" -#: ../gtk/main.c:142 +#: ../gtk/main.c:143 msgid "Configuration file" msgstr "Ficher de configuration" -#: ../gtk/main.c:143 +#: ../gtk/main.c:144 msgid "Run the audio assistant" msgstr "Démarre l'assistant audio" -#: ../gtk/main.c:144 +#: ../gtk/main.c:145 msgid "Run self test and exit 0 if succeed" msgstr "Exécuter le test local et retourner 0 en cas de succès" -#: ../gtk/main.c:1069 +#: ../gtk/main.c:1070 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -138,76 +138,80 @@ msgid "" "If you answer no, this person will be temporarily blacklisted." msgstr "%s souhaite vous ajouter à sa liste de contact.\nSouhaitez vous l'autoriser à voir votre information de présence et l'ajouter à votre liste également ?\nSi vous répondez non, cette personne sera mise temporairement sur liste noire." -#: ../gtk/main.c:1146 +#: ../gtk/main.c:1147 #, c-format msgid "" "Please enter your password for username %s\n" " at realm %s:" msgstr "Entrez le mot de passe pour %s\n sur le domaine %s:" -#: ../gtk/main.c:1267 +#: ../gtk/main.c:1268 msgid "Call error" msgstr "Erreur lors de l'appel" -#: ../gtk/main.c:1270 ../coreapi/linphonecore.c:3842 +#: ../gtk/main.c:1271 ../coreapi/linphonecore.c:3846 msgid "Call ended" msgstr "Appel terminé." -#: ../gtk/main.c:1273 ../coreapi/call_log.c:221 +#: ../gtk/main.c:1274 ../coreapi/call_log.c:221 msgid "Incoming call" msgstr "Appel entrant" -#: ../gtk/main.c:1275 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 +#: ../gtk/main.c:1276 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 msgid "Answer" msgstr "Répondre" -#: ../gtk/main.c:1277 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1278 ../gtk/main.ui.h:6 msgid "Decline" msgstr "Refuser" -#: ../gtk/main.c:1283 +#: ../gtk/main.c:1284 msgid "Call paused" msgstr "Appel en pause" -#: ../gtk/main.c:1283 +#: ../gtk/main.c:1284 #, c-format msgid "by %s" msgstr "b>par %s" -#: ../gtk/main.c:1353 +#: ../gtk/main.c:1354 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "%s propose de démarrer la vidéo. Acceptez-vous ?" -#: ../gtk/main.c:1516 +#: ../gtk/main.c:1509 msgid "Website link" msgstr "Lien site web" -#: ../gtk/main.c:1565 -msgid "Linphone - a video internet phone" -msgstr "Linphone - un téléphone video pour l'internet" +#: ../gtk/main.c:1568 ../gtk/waiting.ui.h:1 +msgid "Linphone" +msgstr "Linphone" -#: ../gtk/main.c:1657 +#: ../gtk/main.c:1569 +msgid "A video internet phone" +msgstr "Appels vidéo via internet" + +#: ../gtk/main.c:1629 #, c-format msgid "%s (Default)" msgstr "%s (par défaut)" -#: ../gtk/main.c:1989 ../coreapi/callbacks.c:1057 +#: ../gtk/main.c:1962 ../coreapi/callbacks.c:1063 #, c-format msgid "We are transferred to %s" msgstr "Transfert vers %s" -#: ../gtk/main.c:1999 +#: ../gtk/main.c:1972 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." msgstr "Aucune carte son n'a été détectée sur cet ordinateur.\nVous ne pourrez pas effectuer d'appels audio." -#: ../gtk/main.c:2147 +#: ../gtk/main.c:2117 msgid "A free SIP video-phone" msgstr "Un visiophone libre" -#: ../gtk/main.c:2252 +#: ../gtk/main.c:2221 #, c-format msgid "Hello\n" msgstr "Bonjour\n" @@ -220,7 +224,7 @@ msgstr "Ajouter au carnet d'adresse" msgid "Presence status" msgstr "Info de présence" -#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:552 ../gtk/contact.ui.h:1 +#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:569 ../gtk/contact.ui.h:1 msgid "Name" msgstr "Nom" @@ -261,124 +265,124 @@ msgstr "Supprimer l'historique de chat de '%s'" msgid "Add new contact from %s directory" msgstr "Ajouter un contact depuis l'annuaire %s" -#: ../gtk/propertybox.c:558 +#: ../gtk/propertybox.c:575 msgid "Rate (Hz)" msgstr "Fréquence (Hz)" -#: ../gtk/propertybox.c:564 +#: ../gtk/propertybox.c:581 msgid "Status" msgstr "Etat" -#: ../gtk/propertybox.c:570 +#: ../gtk/propertybox.c:587 msgid "IP Bitrate (kbit/s)" msgstr "Débit IP (kbit/s)" -#: ../gtk/propertybox.c:577 +#: ../gtk/propertybox.c:596 msgid "Parameters" msgstr "Paramètres" -#: ../gtk/propertybox.c:620 ../gtk/propertybox.c:763 +#: ../gtk/propertybox.c:639 ../gtk/propertybox.c:782 msgid "Enabled" msgstr "Activé" -#: ../gtk/propertybox.c:622 ../gtk/propertybox.c:763 ../gtk/parameters.ui.h:20 +#: ../gtk/propertybox.c:641 ../gtk/propertybox.c:782 ../gtk/parameters.ui.h:20 msgid "Disabled" msgstr "Désactivé" -#: ../gtk/propertybox.c:809 +#: ../gtk/propertybox.c:828 msgid "Account" msgstr "Compte" -#: ../gtk/propertybox.c:1072 +#: ../gtk/propertybox.c:1091 msgid "English" msgstr "Anglais" -#: ../gtk/propertybox.c:1073 +#: ../gtk/propertybox.c:1092 msgid "French" msgstr "Français" -#: ../gtk/propertybox.c:1074 +#: ../gtk/propertybox.c:1093 msgid "Swedish" msgstr "Suédois" -#: ../gtk/propertybox.c:1075 +#: ../gtk/propertybox.c:1094 msgid "Italian" msgstr "Italien" -#: ../gtk/propertybox.c:1076 +#: ../gtk/propertybox.c:1095 msgid "Spanish" msgstr "Espagnol" -#: ../gtk/propertybox.c:1077 +#: ../gtk/propertybox.c:1096 msgid "Brazilian Portugese" msgstr "Portugais brésilien" -#: ../gtk/propertybox.c:1078 +#: ../gtk/propertybox.c:1097 msgid "Polish" msgstr "Polonais" -#: ../gtk/propertybox.c:1079 +#: ../gtk/propertybox.c:1098 msgid "German" msgstr "Allemand" -#: ../gtk/propertybox.c:1080 +#: ../gtk/propertybox.c:1099 msgid "Russian" msgstr "Russe" -#: ../gtk/propertybox.c:1081 +#: ../gtk/propertybox.c:1100 msgid "Japanese" msgstr "日本語" -#: ../gtk/propertybox.c:1082 +#: ../gtk/propertybox.c:1101 msgid "Dutch" msgstr "Néérlandais" -#: ../gtk/propertybox.c:1083 +#: ../gtk/propertybox.c:1102 msgid "Hungarian" msgstr "Hongrois" -#: ../gtk/propertybox.c:1084 +#: ../gtk/propertybox.c:1103 msgid "Czech" msgstr "Tchèque" -#: ../gtk/propertybox.c:1085 +#: ../gtk/propertybox.c:1104 msgid "Chinese" msgstr "简体中文" -#: ../gtk/propertybox.c:1086 +#: ../gtk/propertybox.c:1105 msgid "Traditional Chinese" msgstr "Chinois traditionnel" -#: ../gtk/propertybox.c:1087 +#: ../gtk/propertybox.c:1106 msgid "Norwegian" msgstr "Norvégien" -#: ../gtk/propertybox.c:1088 +#: ../gtk/propertybox.c:1107 msgid "Hebrew" msgstr "Hébreu" -#: ../gtk/propertybox.c:1089 +#: ../gtk/propertybox.c:1108 msgid "Serbian" msgstr "Serbe" -#: ../gtk/propertybox.c:1156 +#: ../gtk/propertybox.c:1175 msgid "" "You need to restart linphone for the new language selection to take effect." msgstr "La nouvelle selection de langue prendra effet au prochain démarrage de linphone." -#: ../gtk/propertybox.c:1236 +#: ../gtk/propertybox.c:1255 msgid "None" msgstr "Aucun" -#: ../gtk/propertybox.c:1240 +#: ../gtk/propertybox.c:1259 msgid "SRTP" msgstr "SRTP" -#: ../gtk/propertybox.c:1246 +#: ../gtk/propertybox.c:1265 msgid "DTLS" msgstr "DTLS" -#: ../gtk/propertybox.c:1253 +#: ../gtk/propertybox.c:1272 msgid "ZRTP" msgstr "ZRTP" @@ -420,133 +424,133 @@ msgid_plural "Found %i contacts" msgstr[0] "%i contact trouvé." msgstr[1] "%i contacts trouvés." -#: ../gtk/setupwizard.c:34 +#: ../gtk/setupwizard.c:32 msgid "" "Welcome!\n" "This assistant will help you to use a SIP account for your calls." msgstr "Bienvenue !\nCet assistant va vous aider à utiliser un compte SIP pour vos appels." -#: ../gtk/setupwizard.c:43 +#: ../gtk/setupwizard.c:41 msgid "Create an account on linphone.org" msgstr "Créer un compte sur linphone.org" -#: ../gtk/setupwizard.c:44 +#: ../gtk/setupwizard.c:42 msgid "I have already a linphone.org account and I just want to use it" msgstr "J'ai déjà un compte linphone.org et je souhaite l'utiliser" -#: ../gtk/setupwizard.c:45 +#: ../gtk/setupwizard.c:43 msgid "I have already a sip account and I just want to use it" msgstr "J'ai déjà un compte Sip et je souhaite l'utiliser" -#: ../gtk/setupwizard.c:46 +#: ../gtk/setupwizard.c:44 msgid "I want to specify a remote configuration URI" msgstr "Je veux spécifier une URI de configuration" -#: ../gtk/setupwizard.c:89 +#: ../gtk/setupwizard.c:87 msgid "Enter your linphone.org username" msgstr "Entrez votre identifiant linphone.org" -#: ../gtk/setupwizard.c:102 ../gtk/parameters.ui.h:85 ../gtk/ldap.ui.h:4 +#: ../gtk/setupwizard.c:100 ../gtk/parameters.ui.h:85 ../gtk/ldap.ui.h:4 msgid "Username:" msgstr "Nom d'utilisateur:" -#: ../gtk/setupwizard.c:104 ../gtk/password.ui.h:4 ../gtk/ldap.ui.h:5 +#: ../gtk/setupwizard.c:102 ../gtk/password.ui.h:4 ../gtk/ldap.ui.h:5 msgid "Password:" msgstr "Mot de passe:" -#: ../gtk/setupwizard.c:124 +#: ../gtk/setupwizard.c:122 msgid "Enter your account informations" msgstr "Entrez les informations concernant votre compte" -#: ../gtk/setupwizard.c:140 +#: ../gtk/setupwizard.c:138 msgid "Username*" msgstr "Nom d'utilisateur*" -#: ../gtk/setupwizard.c:141 +#: ../gtk/setupwizard.c:139 msgid "Password*" msgstr "Mot de passe*" -#: ../gtk/setupwizard.c:144 +#: ../gtk/setupwizard.c:142 msgid "Domain*" msgstr "Domaine*" -#: ../gtk/setupwizard.c:145 +#: ../gtk/setupwizard.c:143 msgid "Proxy" msgstr "Proxy" -#: ../gtk/setupwizard.c:317 +#: ../gtk/setupwizard.c:322 msgid "(*) Required fields" msgstr "(*) Champs requis" -#: ../gtk/setupwizard.c:318 +#: ../gtk/setupwizard.c:323 msgid "Username: (*)" msgstr "Nom d'utilisateur: (*)" -#: ../gtk/setupwizard.c:320 +#: ../gtk/setupwizard.c:325 msgid "Password: (*)" msgstr "Mot de passe: (*)" -#: ../gtk/setupwizard.c:322 +#: ../gtk/setupwizard.c:327 msgid "Email: (*)" msgstr "Email : (*)" -#: ../gtk/setupwizard.c:324 +#: ../gtk/setupwizard.c:329 msgid "Confirm your password: (*)" msgstr "Confirmez votre mot de passe: (*)" -#: ../gtk/setupwizard.c:338 +#: ../gtk/setupwizard.c:343 msgid "Keep me informed with linphone updates" msgstr "Me tenir informer des mises à jour de Linphone " -#: ../gtk/setupwizard.c:394 +#: ../gtk/setupwizard.c:399 msgid "" "Error, account not validated, username already used or server unreachable.\n" "Please go back and try again." msgstr "Erreur, le compte n'est pas validé, l'identifiant est déjà utilisé ou le serveur n'est pas accessible.\nMerci d'essayer à nouveau." -#: ../gtk/setupwizard.c:405 +#: ../gtk/setupwizard.c:410 msgid "Thank you. Your account is now configured and ready for use." msgstr "Merci. Votre compte est maintenant configuré et prêt à être utilisé." -#: ../gtk/setupwizard.c:413 +#: ../gtk/setupwizard.c:418 msgid "" "Please validate your account by clicking on the link we just sent you by email.\n" "Then come back here and press Next button." msgstr "Merci de valider votre compte en cliquant sur le lien que nous avons envoyé par email.\nPuis appuyez sur suivant." -#: ../gtk/setupwizard.c:602 +#: ../gtk/setupwizard.c:609 msgid "SIP account configuration assistant" msgstr "Assistant de configuration de compte." -#: ../gtk/setupwizard.c:620 +#: ../gtk/setupwizard.c:629 msgid "Welcome to the account setup assistant" msgstr "Bienvenue dans l'assistant de configuration de compte." -#: ../gtk/setupwizard.c:625 +#: ../gtk/setupwizard.c:634 msgid "Account setup assistant" msgstr "Assistant de configuration de compte." -#: ../gtk/setupwizard.c:631 +#: ../gtk/setupwizard.c:640 msgid "Configure your account (step 1/1)" msgstr "Configurez votre compte (étape 1/1)" -#: ../gtk/setupwizard.c:636 +#: ../gtk/setupwizard.c:645 msgid "Enter your sip username (step 1/1)" msgstr "Entrez votre identifiant sip (étape 1/1)" -#: ../gtk/setupwizard.c:640 +#: ../gtk/setupwizard.c:649 msgid "Enter account information (step 1/2)" msgstr "Entrez les informations concernant votre compte (étape 1/2)" -#: ../gtk/setupwizard.c:649 +#: ../gtk/setupwizard.c:658 msgid "Validation (step 2/2)" msgstr "Validation (étape 2/2)" -#: ../gtk/setupwizard.c:654 +#: ../gtk/setupwizard.c:663 msgid "Error" msgstr "Erreur" -#: ../gtk/setupwizard.c:658 ../gtk/audio_assistant.c:534 +#: ../gtk/setupwizard.c:667 ../gtk/audio_assistant.c:534 msgid "Terminating" msgstr "En cours d’arrêt." @@ -1500,10 +1504,6 @@ msgstr "Ajouter à ma liste" msgid "Search somebody" msgstr "Rechercher une personne" -#: ../gtk/waiting.ui.h:1 -msgid "Linphone" -msgstr "Linphone" - #: ../gtk/waiting.ui.h:2 msgid "Please wait" msgstr "En attente" @@ -1703,68 +1703,68 @@ msgstr "Configuration en cours" msgid "Please wait while fetching configuration from server..." msgstr "Veuillez patenter un instant pendant le chargement de la configuration distante..." -#: ../coreapi/linphonecore.c:1538 +#: ../coreapi/linphonecore.c:1539 msgid "Ready" msgstr "Prêt." -#: ../coreapi/linphonecore.c:2550 +#: ../coreapi/linphonecore.c:2551 msgid "Configuring" msgstr "Configuration en cours" -#: ../coreapi/linphonecore.c:2724 +#: ../coreapi/linphonecore.c:2725 msgid "Looking for telephone number destination..." msgstr "Recherche de la destination du numéro de téléphone..." -#: ../coreapi/linphonecore.c:2726 +#: ../coreapi/linphonecore.c:2727 msgid "Could not resolve this number." msgstr "La destination n'a pu être trouvée." #. must be known at that time -#: ../coreapi/linphonecore.c:3012 +#: ../coreapi/linphonecore.c:3013 msgid "Contacting" msgstr "Appel de" -#: ../coreapi/linphonecore.c:3017 +#: ../coreapi/linphonecore.c:3018 msgid "Could not call" msgstr "Echec de l'appel" -#: ../coreapi/linphonecore.c:3168 +#: ../coreapi/linphonecore.c:3169 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "Désolé, le nombre maximum d'appels simultanés est atteint." -#: ../coreapi/linphonecore.c:3326 +#: ../coreapi/linphonecore.c:3327 msgid "is contacting you" msgstr "vous appelle" -#: ../coreapi/linphonecore.c:3327 +#: ../coreapi/linphonecore.c:3328 msgid " and asked autoanswer." msgstr "et sollicite un décrochage automatique." -#: ../coreapi/linphonecore.c:3451 +#: ../coreapi/linphonecore.c:3452 msgid "Modifying call parameters..." msgstr "Modifications des paramètres d'appels..." -#: ../coreapi/linphonecore.c:3798 +#: ../coreapi/linphonecore.c:3802 msgid "Connected." msgstr "En ligne." -#: ../coreapi/linphonecore.c:3823 +#: ../coreapi/linphonecore.c:3827 msgid "Call aborted" msgstr "Appel abandonné" -#: ../coreapi/linphonecore.c:4013 +#: ../coreapi/linphonecore.c:4024 msgid "Could not pause the call" msgstr "La mise en attente a échoué" -#: ../coreapi/linphonecore.c:4016 +#: ../coreapi/linphonecore.c:4027 msgid "Pausing the current call..." msgstr "Mise en attente de l'appel..." -#: ../coreapi/misc.c:433 +#: ../coreapi/misc.c:434 msgid "Stun lookup in progress..." msgstr "Découverte STUN en cours" -#: ../coreapi/misc.c:614 +#: ../coreapi/misc.c:615 msgid "ICE local candidates gathering in progress..." msgstr "Collection des candidats locaux ICE en cours..." @@ -1849,100 +1849,100 @@ msgstr "Sonnerie distante..." msgid "Early media." msgstr "Prise d'appel anticipée." -#: ../coreapi/callbacks.c:533 +#: ../coreapi/callbacks.c:534 #, c-format msgid "Call with %s is paused." msgstr "%s est maintenant en attente." -#: ../coreapi/callbacks.c:546 +#: ../coreapi/callbacks.c:547 #, c-format msgid "Call answered by %s - on hold." msgstr "Appel répondu par %s - en attente" -#: ../coreapi/callbacks.c:556 +#: ../coreapi/callbacks.c:557 msgid "Call resumed." msgstr "Appel repris." -#: ../coreapi/callbacks.c:560 +#: ../coreapi/callbacks.c:561 #, c-format msgid "Call answered by %s." msgstr "Appel répondu par %s." -#: ../coreapi/callbacks.c:583 +#: ../coreapi/callbacks.c:584 msgid "Incompatible, check codecs or security settings..." msgstr "Incompatible, vérfiez les codecs ou les paramètres de sécurité..." -#: ../coreapi/callbacks.c:588 ../coreapi/callbacks.c:900 +#: ../coreapi/callbacks.c:589 ../coreapi/callbacks.c:906 msgid "Incompatible media parameters." msgstr "Paramètres media incompatibles." -#: ../coreapi/callbacks.c:618 +#: ../coreapi/callbacks.c:619 msgid "We have been resumed." msgstr "Appel repris." #. we are being paused -#: ../coreapi/callbacks.c:626 +#: ../coreapi/callbacks.c:628 msgid "We are paused by other party." msgstr "L'appel a été mis en attente." #. reINVITE and in-dialogs UPDATE go here -#: ../coreapi/callbacks.c:660 +#: ../coreapi/callbacks.c:666 msgid "Call is updated by remote." msgstr "L'appel est modifié par la partie distante." -#: ../coreapi/callbacks.c:776 +#: ../coreapi/callbacks.c:782 msgid "Call terminated." msgstr "Appel terminé." -#: ../coreapi/callbacks.c:804 +#: ../coreapi/callbacks.c:810 msgid "User is busy." msgstr "Occupé..." -#: ../coreapi/callbacks.c:805 +#: ../coreapi/callbacks.c:811 msgid "User is temporarily unavailable." msgstr "L'usager est temporairement indisponible." #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:807 +#: ../coreapi/callbacks.c:813 msgid "User does not want to be disturbed." msgstr "L'usager ne souhaite pas être dérangé" -#: ../coreapi/callbacks.c:808 +#: ../coreapi/callbacks.c:814 msgid "Call declined." msgstr "Appel décliné." -#: ../coreapi/callbacks.c:823 +#: ../coreapi/callbacks.c:829 msgid "Request timeout." msgstr "Délai d'attente de la requête dépassé." -#: ../coreapi/callbacks.c:854 +#: ../coreapi/callbacks.c:860 msgid "Redirected" msgstr "Redirection" -#: ../coreapi/callbacks.c:909 +#: ../coreapi/callbacks.c:915 msgid "Call failed." msgstr "L'appel a échoué." -#: ../coreapi/callbacks.c:987 +#: ../coreapi/callbacks.c:993 #, c-format msgid "Registration on %s successful." msgstr "Enregistrement sur %s effectué." -#: ../coreapi/callbacks.c:988 +#: ../coreapi/callbacks.c:994 #, c-format msgid "Unregistration on %s done." msgstr "Désenregistrement sur %s effectué." -#: ../coreapi/callbacks.c:1006 +#: ../coreapi/callbacks.c:1012 msgid "no response timeout" msgstr "Pas de réponse" -#: ../coreapi/callbacks.c:1009 +#: ../coreapi/callbacks.c:1015 #, c-format msgid "Registration on %s failed: %s" msgstr "Echec de l'enregistrement sur %s: %s" -#: ../coreapi/callbacks.c:1016 +#: ../coreapi/callbacks.c:1022 msgid "Service unavailable, retrying" msgstr "Service indisponible, nouvelle tentative" @@ -1952,11 +1952,11 @@ msgstr "Service indisponible, nouvelle tentative" msgid "Authentication token is %s" msgstr "Le jeton d'authentification est %s" -#: ../coreapi/linphonecall.c:1306 +#: ../coreapi/linphonecall.c:1310 msgid "Call parameters were successfully modified." msgstr "Les paramètres d'appel ont été modifiés avec succès." -#: ../coreapi/linphonecall.c:3660 +#: ../coreapi/linphonecall.c:3686 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." diff --git a/po/he.po b/po/he.po index 8b7e19670..08c49042c 100644 --- a/po/he.po +++ b/po/he.po @@ -12,8 +12,8 @@ msgid "" msgstr "" "Project-Id-Version: linphone-gtk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-04-01 16:25+0200\n" -"PO-Revision-Date: 2015-04-01 14:26+0000\n" +"POT-Creation-Date: 2015-04-30 10:13+0200\n" +"PO-Revision-Date: 2015-04-30 08:13+0000\n" "Last-Translator: Belledonne Communications \n" "Language-Team: Hebrew (http://www.transifex.com/projects/p/linphone-gtk/language/he/)\n" "MIME-Version: 1.0\n" @@ -92,45 +92,45 @@ msgstr "אני" msgid "Couldn't find pixmap file: %s" msgstr "לא ניתן למצוא קובץ ‫pixmap: ‫%s" -#: ../gtk/main.c:136 +#: ../gtk/main.c:137 msgid "log to stdout some debug information while running." msgstr "" -#: ../gtk/main.c:137 +#: ../gtk/main.c:138 msgid "path to a file to write logs into." msgstr "" -#: ../gtk/main.c:138 +#: ../gtk/main.c:139 msgid "Start linphone with video disabled." msgstr "" -#: ../gtk/main.c:139 +#: ../gtk/main.c:140 msgid "Start only in the system tray, do not show the main interface." msgstr "" -#: ../gtk/main.c:140 +#: ../gtk/main.c:141 msgid "address to call right now" msgstr "" -#: ../gtk/main.c:141 +#: ../gtk/main.c:142 msgid "" "Specifiy a working directory (should be the base of the installation, eg: " "c:\\Program Files\\Linphone)" msgstr "" -#: ../gtk/main.c:142 +#: ../gtk/main.c:143 msgid "Configuration file" msgstr "" -#: ../gtk/main.c:143 +#: ../gtk/main.c:144 msgid "Run the audio assistant" msgstr "" -#: ../gtk/main.c:144 +#: ../gtk/main.c:145 msgid "Run self test and exit 0 if succeed" msgstr "" -#: ../gtk/main.c:1069 +#: ../gtk/main.c:1070 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -138,76 +138,80 @@ msgid "" "If you answer no, this person will be temporarily blacklisted." msgstr "‫%s מעוניין להוסיפך אל רשימת אנשי הקשר שלו.\nהאם ברצונך להרשות להם לראות את מצב נוכחותך או להוסיפם אל רשימת אנשי הקשר שלך ?\nהיה ותשובתך תהיה לא, אדם זה יהיה מסומן באופן זמני ברשימה השחורה." -#: ../gtk/main.c:1146 +#: ../gtk/main.c:1147 #, c-format msgid "" "Please enter your password for username %s\n" " at realm %s:" msgstr "אנא הזן סיסמה עבור משתמש %s\nבמתחם %s:" -#: ../gtk/main.c:1267 +#: ../gtk/main.c:1268 msgid "Call error" msgstr "שגיאת קריאה" -#: ../gtk/main.c:1270 ../coreapi/linphonecore.c:3842 +#: ../gtk/main.c:1271 ../coreapi/linphonecore.c:3846 msgid "Call ended" msgstr "שיחה הסתיימה" -#: ../gtk/main.c:1273 ../coreapi/call_log.c:221 +#: ../gtk/main.c:1274 ../coreapi/call_log.c:221 msgid "Incoming call" msgstr "קריאה נכנסת" -#: ../gtk/main.c:1275 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 +#: ../gtk/main.c:1276 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 msgid "Answer" msgstr "לענות" -#: ../gtk/main.c:1277 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1278 ../gtk/main.ui.h:6 msgid "Decline" msgstr "לדחות" -#: ../gtk/main.c:1283 +#: ../gtk/main.c:1284 msgid "Call paused" msgstr "שיחה הושהתה" -#: ../gtk/main.c:1283 +#: ../gtk/main.c:1284 #, c-format msgid "by %s" msgstr "על ידי %s" -#: ../gtk/main.c:1353 +#: ../gtk/main.c:1354 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "‏%s רוצה להתחיל וידאו. האם אתה מסכים ?" -#: ../gtk/main.c:1516 +#: ../gtk/main.c:1509 msgid "Website link" msgstr "קישור אתר רשת" -#: ../gtk/main.c:1565 -msgid "Linphone - a video internet phone" -msgstr "‫Linphone - וידאופון אינטרנטי" +#: ../gtk/main.c:1568 ../gtk/waiting.ui.h:1 +msgid "Linphone" +msgstr "Linphone" -#: ../gtk/main.c:1657 +#: ../gtk/main.c:1569 +msgid "A video internet phone" +msgstr "" + +#: ../gtk/main.c:1629 #, c-format msgid "%s (Default)" msgstr "‫%s (ברירת מחדל)" -#: ../gtk/main.c:1989 ../coreapi/callbacks.c:1057 +#: ../gtk/main.c:1962 ../coreapi/callbacks.c:1063 #, c-format msgid "We are transferred to %s" msgstr "אנחנו מועברים אל %s" -#: ../gtk/main.c:1999 +#: ../gtk/main.c:1972 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." msgstr "לא אותרו כרטיסי קול במחשב זה.\nלא תהיה ביכולתך לשלוח או לקבל שיחות אודיו." -#: ../gtk/main.c:2147 +#: ../gtk/main.c:2117 msgid "A free SIP video-phone" msgstr "וידאופון SIP חופשי" -#: ../gtk/main.c:2252 +#: ../gtk/main.c:2221 #, c-format msgid "Hello\n" msgstr "" @@ -220,7 +224,7 @@ msgstr "הוסף אל ספר כתובות" msgid "Presence status" msgstr "מצב נוכחות" -#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:552 ../gtk/contact.ui.h:1 +#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:569 ../gtk/contact.ui.h:1 msgid "Name" msgstr "שם" @@ -261,124 +265,124 @@ msgstr "מחק היסטוריית שיחה של '%s'" msgid "Add new contact from %s directory" msgstr "הוסף איש קשר חדש מן מדור %s" -#: ../gtk/propertybox.c:558 +#: ../gtk/propertybox.c:575 msgid "Rate (Hz)" msgstr "שיעור (הרץ)" -#: ../gtk/propertybox.c:564 +#: ../gtk/propertybox.c:581 msgid "Status" msgstr "מצב" -#: ../gtk/propertybox.c:570 +#: ../gtk/propertybox.c:587 msgid "IP Bitrate (kbit/s)" msgstr "" -#: ../gtk/propertybox.c:577 +#: ../gtk/propertybox.c:596 msgid "Parameters" msgstr "פרמטרים" -#: ../gtk/propertybox.c:620 ../gtk/propertybox.c:763 +#: ../gtk/propertybox.c:639 ../gtk/propertybox.c:782 msgid "Enabled" msgstr "מופעל" -#: ../gtk/propertybox.c:622 ../gtk/propertybox.c:763 ../gtk/parameters.ui.h:20 +#: ../gtk/propertybox.c:641 ../gtk/propertybox.c:782 ../gtk/parameters.ui.h:20 msgid "Disabled" msgstr "לא מופעל" -#: ../gtk/propertybox.c:809 +#: ../gtk/propertybox.c:828 msgid "Account" msgstr "חשבון" -#: ../gtk/propertybox.c:1072 +#: ../gtk/propertybox.c:1091 msgid "English" msgstr "English" -#: ../gtk/propertybox.c:1073 +#: ../gtk/propertybox.c:1092 msgid "French" msgstr "Français" -#: ../gtk/propertybox.c:1074 +#: ../gtk/propertybox.c:1093 msgid "Swedish" msgstr "Svenska" -#: ../gtk/propertybox.c:1075 +#: ../gtk/propertybox.c:1094 msgid "Italian" msgstr "Italiano" -#: ../gtk/propertybox.c:1076 +#: ../gtk/propertybox.c:1095 msgid "Spanish" msgstr "Español" -#: ../gtk/propertybox.c:1077 +#: ../gtk/propertybox.c:1096 msgid "Brazilian Portugese" msgstr "português brasileiro" -#: ../gtk/propertybox.c:1078 +#: ../gtk/propertybox.c:1097 msgid "Polish" msgstr "Polski" -#: ../gtk/propertybox.c:1079 +#: ../gtk/propertybox.c:1098 msgid "German" msgstr "Deutsch" -#: ../gtk/propertybox.c:1080 +#: ../gtk/propertybox.c:1099 msgid "Russian" msgstr "Русский" -#: ../gtk/propertybox.c:1081 +#: ../gtk/propertybox.c:1100 msgid "Japanese" msgstr "日本語" -#: ../gtk/propertybox.c:1082 +#: ../gtk/propertybox.c:1101 msgid "Dutch" msgstr "Nederlands" -#: ../gtk/propertybox.c:1083 +#: ../gtk/propertybox.c:1102 msgid "Hungarian" msgstr "Magyar" -#: ../gtk/propertybox.c:1084 +#: ../gtk/propertybox.c:1103 msgid "Czech" msgstr "Česky" -#: ../gtk/propertybox.c:1085 +#: ../gtk/propertybox.c:1104 msgid "Chinese" msgstr "中文" -#: ../gtk/propertybox.c:1086 +#: ../gtk/propertybox.c:1105 msgid "Traditional Chinese" msgstr "繁體字" -#: ../gtk/propertybox.c:1087 +#: ../gtk/propertybox.c:1106 msgid "Norwegian" msgstr "norsk" -#: ../gtk/propertybox.c:1088 +#: ../gtk/propertybox.c:1107 msgid "Hebrew" msgstr "עברית" -#: ../gtk/propertybox.c:1089 +#: ../gtk/propertybox.c:1108 msgid "Serbian" msgstr "српски srpski" -#: ../gtk/propertybox.c:1156 +#: ../gtk/propertybox.c:1175 msgid "" "You need to restart linphone for the new language selection to take effect." msgstr "עליך לאתחל את לינפון כדי שהשפה החדשה תיכנס לתוקף." -#: ../gtk/propertybox.c:1236 +#: ../gtk/propertybox.c:1255 msgid "None" msgstr "ללא" -#: ../gtk/propertybox.c:1240 +#: ../gtk/propertybox.c:1259 msgid "SRTP" msgstr "" -#: ../gtk/propertybox.c:1246 +#: ../gtk/propertybox.c:1265 msgid "DTLS" msgstr "" -#: ../gtk/propertybox.c:1253 +#: ../gtk/propertybox.c:1272 msgid "ZRTP" msgstr "" @@ -420,133 +424,133 @@ msgid_plural "Found %i contacts" msgstr[0] "נמצא איש קשר %i" msgstr[1] "נמצאו %i אנשי קשר" -#: ../gtk/setupwizard.c:34 +#: ../gtk/setupwizard.c:32 msgid "" "Welcome!\n" "This assistant will help you to use a SIP account for your calls." msgstr "" -#: ../gtk/setupwizard.c:43 +#: ../gtk/setupwizard.c:41 msgid "Create an account on linphone.org" msgstr "צור חשבון אצל linphone.org" -#: ../gtk/setupwizard.c:44 +#: ../gtk/setupwizard.c:42 msgid "I have already a linphone.org account and I just want to use it" msgstr "כבר קיים חשבון linphone.org ברשותי וברצוני לעשות בו שימוש" -#: ../gtk/setupwizard.c:45 +#: ../gtk/setupwizard.c:43 msgid "I have already a sip account and I just want to use it" msgstr "כבר קיים חשבון sip ברשותי וברצוני לעשות בו שימוש" -#: ../gtk/setupwizard.c:46 +#: ../gtk/setupwizard.c:44 msgid "I want to specify a remote configuration URI" msgstr "" -#: ../gtk/setupwizard.c:89 +#: ../gtk/setupwizard.c:87 msgid "Enter your linphone.org username" msgstr "הזן את שם משתמשך אצל linphone.org" -#: ../gtk/setupwizard.c:102 ../gtk/parameters.ui.h:85 ../gtk/ldap.ui.h:4 +#: ../gtk/setupwizard.c:100 ../gtk/parameters.ui.h:85 ../gtk/ldap.ui.h:4 msgid "Username:" msgstr "שם משתמש:" -#: ../gtk/setupwizard.c:104 ../gtk/password.ui.h:4 ../gtk/ldap.ui.h:5 +#: ../gtk/setupwizard.c:102 ../gtk/password.ui.h:4 ../gtk/ldap.ui.h:5 msgid "Password:" msgstr "סיסמה:" -#: ../gtk/setupwizard.c:124 +#: ../gtk/setupwizard.c:122 msgid "Enter your account informations" msgstr "הזן את מידע חשבונך" -#: ../gtk/setupwizard.c:140 +#: ../gtk/setupwizard.c:138 msgid "Username*" msgstr "שם משתמש*" -#: ../gtk/setupwizard.c:141 +#: ../gtk/setupwizard.c:139 msgid "Password*" msgstr "סיסמה*" -#: ../gtk/setupwizard.c:144 +#: ../gtk/setupwizard.c:142 msgid "Domain*" msgstr "מתחם*" -#: ../gtk/setupwizard.c:145 +#: ../gtk/setupwizard.c:143 msgid "Proxy" msgstr "פרוקסי" -#: ../gtk/setupwizard.c:317 +#: ../gtk/setupwizard.c:322 msgid "(*) Required fields" msgstr "(*) שדות חובה" -#: ../gtk/setupwizard.c:318 +#: ../gtk/setupwizard.c:323 msgid "Username: (*)" msgstr "שם משתמש: (*)" -#: ../gtk/setupwizard.c:320 +#: ../gtk/setupwizard.c:325 msgid "Password: (*)" msgstr "סיסמה: (*)" -#: ../gtk/setupwizard.c:322 +#: ../gtk/setupwizard.c:327 msgid "Email: (*)" msgstr "דוא״ל: (*)" -#: ../gtk/setupwizard.c:324 +#: ../gtk/setupwizard.c:329 msgid "Confirm your password: (*)" msgstr "אימות סיסמתך: (*)" -#: ../gtk/setupwizard.c:338 +#: ../gtk/setupwizard.c:343 msgid "Keep me informed with linphone updates" msgstr "" -#: ../gtk/setupwizard.c:394 +#: ../gtk/setupwizard.c:399 msgid "" "Error, account not validated, username already used or server unreachable.\n" "Please go back and try again." msgstr "שגיאה, חשבון לא אומת, שם משתמש כבר בשימוש או שרת לא ניתן להשגה.\nנא לחזור ולנסות שוב." -#: ../gtk/setupwizard.c:405 +#: ../gtk/setupwizard.c:410 msgid "Thank you. Your account is now configured and ready for use." msgstr "תודה לך. חשבונך מוגדר ומוכן לשימוש כעת." -#: ../gtk/setupwizard.c:413 +#: ../gtk/setupwizard.c:418 msgid "" "Please validate your account by clicking on the link we just sent you by email.\n" "Then come back here and press Next button." msgstr "נא לאמת את חשבונך באמצעות הקלקה על הקישור ששלחנו לך עתה באמצעות דוא״ל.\nאחרי כן נא לחזור לכאן וללחוץ על הלחצן 'קדימה'." -#: ../gtk/setupwizard.c:602 +#: ../gtk/setupwizard.c:609 msgid "SIP account configuration assistant" msgstr "" -#: ../gtk/setupwizard.c:620 +#: ../gtk/setupwizard.c:629 msgid "Welcome to the account setup assistant" msgstr "ברוך בואך אל אשף הגדרת החשבון" -#: ../gtk/setupwizard.c:625 +#: ../gtk/setupwizard.c:634 msgid "Account setup assistant" msgstr "אשף הגדרת חשבון" -#: ../gtk/setupwizard.c:631 +#: ../gtk/setupwizard.c:640 msgid "Configure your account (step 1/1)" msgstr "הגדרת חשבונך (צעד 1/1)" -#: ../gtk/setupwizard.c:636 +#: ../gtk/setupwizard.c:645 msgid "Enter your sip username (step 1/1)" msgstr "הזנת שם משתמש sip (צעד 1/1)" -#: ../gtk/setupwizard.c:640 +#: ../gtk/setupwizard.c:649 msgid "Enter account information (step 1/2)" msgstr "הזנת מידע חשבון (צעד 1/2)" -#: ../gtk/setupwizard.c:649 +#: ../gtk/setupwizard.c:658 msgid "Validation (step 2/2)" msgstr "אימות (צעד 2/2)" -#: ../gtk/setupwizard.c:654 +#: ../gtk/setupwizard.c:663 msgid "Error" msgstr "שגיאה" -#: ../gtk/setupwizard.c:658 ../gtk/audio_assistant.c:534 +#: ../gtk/setupwizard.c:667 ../gtk/audio_assistant.c:534 msgid "Terminating" msgstr "מסיים כעת" @@ -1500,10 +1504,6 @@ msgstr "הוסף אל הרשימה שלי" msgid "Search somebody" msgstr "חיפוש אחר מישהו" -#: ../gtk/waiting.ui.h:1 -msgid "Linphone" -msgstr "Linphone" - #: ../gtk/waiting.ui.h:2 msgid "Please wait" msgstr "נא להמתין" @@ -1703,68 +1703,68 @@ msgstr "" msgid "Please wait while fetching configuration from server..." msgstr "" -#: ../coreapi/linphonecore.c:1538 +#: ../coreapi/linphonecore.c:1539 msgid "Ready" msgstr "מוכן" -#: ../coreapi/linphonecore.c:2550 +#: ../coreapi/linphonecore.c:2551 msgid "Configuring" msgstr "" -#: ../coreapi/linphonecore.c:2724 +#: ../coreapi/linphonecore.c:2725 msgid "Looking for telephone number destination..." msgstr "מחפש כעת עבור יעד מספר טלפון..." -#: ../coreapi/linphonecore.c:2726 +#: ../coreapi/linphonecore.c:2727 msgid "Could not resolve this number." msgstr "לא ניתן לפתור את מספר זה." #. must be known at that time -#: ../coreapi/linphonecore.c:3012 +#: ../coreapi/linphonecore.c:3013 msgid "Contacting" msgstr "מתקשר כעת" -#: ../coreapi/linphonecore.c:3017 +#: ../coreapi/linphonecore.c:3018 msgid "Could not call" msgstr "לא ניתן להתקשר" -#: ../coreapi/linphonecore.c:3168 +#: ../coreapi/linphonecore.c:3169 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "הגענו אל המספר המרבי של שיחות מקבילות, עמך הסליחה" -#: ../coreapi/linphonecore.c:3326 +#: ../coreapi/linphonecore.c:3327 msgid "is contacting you" msgstr "מתקשר/ת אליך" -#: ../coreapi/linphonecore.c:3327 +#: ../coreapi/linphonecore.c:3328 msgid " and asked autoanswer." msgstr " ומבקש/ת מענה אוטומטי." -#: ../coreapi/linphonecore.c:3451 +#: ../coreapi/linphonecore.c:3452 msgid "Modifying call parameters..." msgstr "מתאים כעת פרמטרים של שיחה..." -#: ../coreapi/linphonecore.c:3798 +#: ../coreapi/linphonecore.c:3802 msgid "Connected." msgstr "מקושר." -#: ../coreapi/linphonecore.c:3823 +#: ../coreapi/linphonecore.c:3827 msgid "Call aborted" msgstr "קריאה בוטלה" -#: ../coreapi/linphonecore.c:4013 +#: ../coreapi/linphonecore.c:4024 msgid "Could not pause the call" msgstr "לא ניתן להשהות את השיחה" -#: ../coreapi/linphonecore.c:4016 +#: ../coreapi/linphonecore.c:4027 msgid "Pausing the current call..." msgstr "משהה כעת שיחה נוכחית..." -#: ../coreapi/misc.c:433 +#: ../coreapi/misc.c:434 msgid "Stun lookup in progress..." msgstr "בדיקת STUN מצויה כעת בעיצומה..." -#: ../coreapi/misc.c:614 +#: ../coreapi/misc.c:615 msgid "ICE local candidates gathering in progress..." msgstr "צבירת מועמדים מקומיים של ICE מצויה כעת בעיצומה..." @@ -1849,100 +1849,100 @@ msgstr "צלצול מרוחק..." msgid "Early media." msgstr "מדיה מוקדמת." -#: ../coreapi/callbacks.c:533 +#: ../coreapi/callbacks.c:534 #, c-format msgid "Call with %s is paused." msgstr "שיחה עם %s מושהית." -#: ../coreapi/callbacks.c:546 +#: ../coreapi/callbacks.c:547 #, c-format msgid "Call answered by %s - on hold." msgstr "קריאה נענתה על ידי %s - בהמתנה." -#: ../coreapi/callbacks.c:556 +#: ../coreapi/callbacks.c:557 msgid "Call resumed." msgstr "קריאה חודשה." -#: ../coreapi/callbacks.c:560 +#: ../coreapi/callbacks.c:561 #, c-format msgid "Call answered by %s." msgstr "קריאה נענתה על ידי %s." -#: ../coreapi/callbacks.c:583 +#: ../coreapi/callbacks.c:584 msgid "Incompatible, check codecs or security settings..." msgstr "חוסר תאימות, בדוק קודקים או הגדרות אבטחה..." -#: ../coreapi/callbacks.c:588 ../coreapi/callbacks.c:900 +#: ../coreapi/callbacks.c:589 ../coreapi/callbacks.c:906 msgid "Incompatible media parameters." msgstr "פרמטריי מדיה חסרי תואמים." -#: ../coreapi/callbacks.c:618 +#: ../coreapi/callbacks.c:619 msgid "We have been resumed." msgstr "חזרנו." #. we are being paused -#: ../coreapi/callbacks.c:626 +#: ../coreapi/callbacks.c:628 msgid "We are paused by other party." msgstr "אנו מושהים על ידי צד אחר." #. reINVITE and in-dialogs UPDATE go here -#: ../coreapi/callbacks.c:660 +#: ../coreapi/callbacks.c:666 msgid "Call is updated by remote." msgstr "שיחה עודכנה מרחוק." -#: ../coreapi/callbacks.c:776 +#: ../coreapi/callbacks.c:782 msgid "Call terminated." msgstr "קריאה הסתיימה." -#: ../coreapi/callbacks.c:804 +#: ../coreapi/callbacks.c:810 msgid "User is busy." msgstr "משתמש עסוק כעת." -#: ../coreapi/callbacks.c:805 +#: ../coreapi/callbacks.c:811 msgid "User is temporarily unavailable." msgstr "משתמש לא זמין זמנית." #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:807 +#: ../coreapi/callbacks.c:813 msgid "User does not want to be disturbed." msgstr "משתמש לא מעוניין שיפריעו לו." -#: ../coreapi/callbacks.c:808 +#: ../coreapi/callbacks.c:814 msgid "Call declined." msgstr "קריאה סורבה." -#: ../coreapi/callbacks.c:823 +#: ../coreapi/callbacks.c:829 msgid "Request timeout." msgstr "" -#: ../coreapi/callbacks.c:854 +#: ../coreapi/callbacks.c:860 msgid "Redirected" msgstr "מכוון מחדש" -#: ../coreapi/callbacks.c:909 +#: ../coreapi/callbacks.c:915 msgid "Call failed." msgstr "קריאה נכשלה." -#: ../coreapi/callbacks.c:987 +#: ../coreapi/callbacks.c:993 #, c-format msgid "Registration on %s successful." msgstr "רישום אצל %s הושלם בהצלחה." -#: ../coreapi/callbacks.c:988 +#: ../coreapi/callbacks.c:994 #, c-format msgid "Unregistration on %s done." msgstr "אי רישום אצל %s סוים." -#: ../coreapi/callbacks.c:1006 +#: ../coreapi/callbacks.c:1012 msgid "no response timeout" msgstr "אין היענות תוך זמן מוגדר" -#: ../coreapi/callbacks.c:1009 +#: ../coreapi/callbacks.c:1015 #, c-format msgid "Registration on %s failed: %s" msgstr "רישום אצל %s נכשל: %s" -#: ../coreapi/callbacks.c:1016 +#: ../coreapi/callbacks.c:1022 msgid "Service unavailable, retrying" msgstr "" @@ -1952,11 +1952,11 @@ msgstr "" msgid "Authentication token is %s" msgstr "אות האימות הינה %s" -#: ../coreapi/linphonecall.c:1306 +#: ../coreapi/linphonecall.c:1310 msgid "Call parameters were successfully modified." msgstr "" -#: ../coreapi/linphonecall.c:3660 +#: ../coreapi/linphonecall.c:3686 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." diff --git a/po/hu.po b/po/hu.po index 0ab15b250..1a20cf6c7 100644 --- a/po/hu.po +++ b/po/hu.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: linphone-gtk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-04-01 16:25+0200\n" -"PO-Revision-Date: 2015-04-01 14:26+0000\n" +"POT-Creation-Date: 2015-04-30 10:13+0200\n" +"PO-Revision-Date: 2015-04-30 08:13+0000\n" "Last-Translator: Belledonne Communications \n" "Language-Team: Hungarian (http://www.transifex.com/projects/p/linphone-gtk/language/hu/)\n" "MIME-Version: 1.0\n" @@ -87,45 +87,45 @@ msgstr "én" msgid "Couldn't find pixmap file: %s" msgstr "Nemtalálható a pixmap fájl: %s" -#: ../gtk/main.c:136 +#: ../gtk/main.c:137 msgid "log to stdout some debug information while running." msgstr "Futás közben némi hibakeresési információ az stdout-ra naplózása." -#: ../gtk/main.c:137 +#: ../gtk/main.c:138 msgid "path to a file to write logs into." msgstr "fájl elérési útja, melybe a naplók kerülnek." -#: ../gtk/main.c:138 +#: ../gtk/main.c:139 msgid "Start linphone with video disabled." msgstr "Linphone indítása, videó kikpacsolva. " -#: ../gtk/main.c:139 +#: ../gtk/main.c:140 msgid "Start only in the system tray, do not show the main interface." msgstr "Csak a tálcaikon indítása, ne mutassa a fő ablakot." -#: ../gtk/main.c:140 +#: ../gtk/main.c:141 msgid "address to call right now" msgstr "Cím azonnali híváshoz" -#: ../gtk/main.c:141 +#: ../gtk/main.c:142 msgid "" "Specifiy a working directory (should be the base of the installation, eg: " "c:\\Program Files\\Linphone)" msgstr "Adjon meg egy munkakönyvtárat (ennek az installációs könyvtárnak kéne lennie, pl. C:\\Program Files\\Linphone)" -#: ../gtk/main.c:142 +#: ../gtk/main.c:143 msgid "Configuration file" msgstr "" -#: ../gtk/main.c:143 +#: ../gtk/main.c:144 msgid "Run the audio assistant" msgstr "" -#: ../gtk/main.c:144 +#: ../gtk/main.c:145 msgid "Run self test and exit 0 if succeed" msgstr "" -#: ../gtk/main.c:1069 +#: ../gtk/main.c:1070 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -133,76 +133,80 @@ msgid "" "If you answer no, this person will be temporarily blacklisted." msgstr "%s szeretné Önt hozzáadni partnerlistájához.\nSzeretné megengedni neki, hogy lássa az Ön jelenlétét, illetve hozzá szeretné adni a partnerlistához?\nHa nemmel válaszol, ez a személy átmenetileg tiltólistára kerül." -#: ../gtk/main.c:1146 +#: ../gtk/main.c:1147 #, c-format msgid "" "Please enter your password for username %s\n" " at realm %s:" msgstr "" -#: ../gtk/main.c:1267 +#: ../gtk/main.c:1268 msgid "Call error" msgstr "Hiba a hívás közben" -#: ../gtk/main.c:1270 ../coreapi/linphonecore.c:3842 +#: ../gtk/main.c:1271 ../coreapi/linphonecore.c:3846 msgid "Call ended" msgstr "Hívás vége" -#: ../gtk/main.c:1273 ../coreapi/call_log.c:221 +#: ../gtk/main.c:1274 ../coreapi/call_log.c:221 msgid "Incoming call" msgstr "Beérkező hívás" -#: ../gtk/main.c:1275 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 +#: ../gtk/main.c:1276 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 msgid "Answer" msgstr "Hívás fogadása" -#: ../gtk/main.c:1277 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1278 ../gtk/main.ui.h:6 msgid "Decline" msgstr "Elutasítás" -#: ../gtk/main.c:1283 +#: ../gtk/main.c:1284 msgid "Call paused" msgstr "Hívás várakoztatva" -#: ../gtk/main.c:1283 +#: ../gtk/main.c:1284 #, c-format msgid "by %s" msgstr "a következő által: %s" -#: ../gtk/main.c:1353 +#: ../gtk/main.c:1354 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "%s szerené elidítani a videót. Elfogadja?" -#: ../gtk/main.c:1516 +#: ../gtk/main.c:1509 msgid "Website link" msgstr "Internetes oldal" -#: ../gtk/main.c:1565 -msgid "Linphone - a video internet phone" -msgstr "Linphone - internetes videó telefon" +#: ../gtk/main.c:1568 ../gtk/waiting.ui.h:1 +msgid "Linphone" +msgstr "Linphone" -#: ../gtk/main.c:1657 +#: ../gtk/main.c:1569 +msgid "A video internet phone" +msgstr "" + +#: ../gtk/main.c:1629 #, c-format msgid "%s (Default)" msgstr "%s (Alapértelmezett)" -#: ../gtk/main.c:1989 ../coreapi/callbacks.c:1057 +#: ../gtk/main.c:1962 ../coreapi/callbacks.c:1063 #, c-format msgid "We are transferred to %s" msgstr "Át vagyunk irányítva ide: %s" -#: ../gtk/main.c:1999 +#: ../gtk/main.c:1972 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." msgstr "Hangkártya nincs érzékelve ezen a számítógépen.\nNem fog tudni hang hívásokat küldeni vagy fogadni." -#: ../gtk/main.c:2147 +#: ../gtk/main.c:2117 msgid "A free SIP video-phone" msgstr "Egy ingyenes SIP video-telefon" -#: ../gtk/main.c:2252 +#: ../gtk/main.c:2221 #, c-format msgid "Hello\n" msgstr "" @@ -215,7 +219,7 @@ msgstr "Hozzáadás címjegyzékhez" msgid "Presence status" msgstr "Jelenlét státusz" -#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:552 ../gtk/contact.ui.h:1 +#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:569 ../gtk/contact.ui.h:1 msgid "Name" msgstr "Név" @@ -256,124 +260,124 @@ msgstr "" msgid "Add new contact from %s directory" msgstr "Új partner hozzáadása ebből a könyvtárból: %s" -#: ../gtk/propertybox.c:558 +#: ../gtk/propertybox.c:575 msgid "Rate (Hz)" msgstr "Érték (Hz)" -#: ../gtk/propertybox.c:564 +#: ../gtk/propertybox.c:581 msgid "Status" msgstr "Állapot" -#: ../gtk/propertybox.c:570 +#: ../gtk/propertybox.c:587 msgid "IP Bitrate (kbit/s)" msgstr "" -#: ../gtk/propertybox.c:577 +#: ../gtk/propertybox.c:596 msgid "Parameters" msgstr "Paraméterek" -#: ../gtk/propertybox.c:620 ../gtk/propertybox.c:763 +#: ../gtk/propertybox.c:639 ../gtk/propertybox.c:782 msgid "Enabled" msgstr "Engedélyezve" -#: ../gtk/propertybox.c:622 ../gtk/propertybox.c:763 ../gtk/parameters.ui.h:20 +#: ../gtk/propertybox.c:641 ../gtk/propertybox.c:782 ../gtk/parameters.ui.h:20 msgid "Disabled" msgstr "Tiltva" -#: ../gtk/propertybox.c:809 +#: ../gtk/propertybox.c:828 msgid "Account" msgstr "Hozzáférés" -#: ../gtk/propertybox.c:1072 +#: ../gtk/propertybox.c:1091 msgid "English" msgstr "angol" -#: ../gtk/propertybox.c:1073 +#: ../gtk/propertybox.c:1092 msgid "French" msgstr "francia" -#: ../gtk/propertybox.c:1074 +#: ../gtk/propertybox.c:1093 msgid "Swedish" msgstr "svéd" -#: ../gtk/propertybox.c:1075 +#: ../gtk/propertybox.c:1094 msgid "Italian" msgstr "olasz" -#: ../gtk/propertybox.c:1076 +#: ../gtk/propertybox.c:1095 msgid "Spanish" msgstr "spanyol" -#: ../gtk/propertybox.c:1077 +#: ../gtk/propertybox.c:1096 msgid "Brazilian Portugese" msgstr "brazil-portugál" -#: ../gtk/propertybox.c:1078 +#: ../gtk/propertybox.c:1097 msgid "Polish" msgstr "lengyel" -#: ../gtk/propertybox.c:1079 +#: ../gtk/propertybox.c:1098 msgid "German" msgstr "német" -#: ../gtk/propertybox.c:1080 +#: ../gtk/propertybox.c:1099 msgid "Russian" msgstr "orosz" -#: ../gtk/propertybox.c:1081 +#: ../gtk/propertybox.c:1100 msgid "Japanese" msgstr "japán" -#: ../gtk/propertybox.c:1082 +#: ../gtk/propertybox.c:1101 msgid "Dutch" msgstr "holland" -#: ../gtk/propertybox.c:1083 +#: ../gtk/propertybox.c:1102 msgid "Hungarian" msgstr "magyar" -#: ../gtk/propertybox.c:1084 +#: ../gtk/propertybox.c:1103 msgid "Czech" msgstr "cseh" -#: ../gtk/propertybox.c:1085 +#: ../gtk/propertybox.c:1104 msgid "Chinese" msgstr "egyszerúsített kínai" -#: ../gtk/propertybox.c:1086 +#: ../gtk/propertybox.c:1105 msgid "Traditional Chinese" msgstr "tradícionális kínai" -#: ../gtk/propertybox.c:1087 +#: ../gtk/propertybox.c:1106 msgid "Norwegian" msgstr "norvég" -#: ../gtk/propertybox.c:1088 +#: ../gtk/propertybox.c:1107 msgid "Hebrew" msgstr "héber" -#: ../gtk/propertybox.c:1089 +#: ../gtk/propertybox.c:1108 msgid "Serbian" msgstr "" -#: ../gtk/propertybox.c:1156 +#: ../gtk/propertybox.c:1175 msgid "" "You need to restart linphone for the new language selection to take effect." msgstr "Újra kell indítania a linphone-t, hogy az új nyelv kiválasztása érvényre jusson. " -#: ../gtk/propertybox.c:1236 +#: ../gtk/propertybox.c:1255 msgid "None" msgstr "Nincs" -#: ../gtk/propertybox.c:1240 +#: ../gtk/propertybox.c:1259 msgid "SRTP" msgstr "SRTP" -#: ../gtk/propertybox.c:1246 +#: ../gtk/propertybox.c:1265 msgid "DTLS" msgstr "" -#: ../gtk/propertybox.c:1253 +#: ../gtk/propertybox.c:1272 msgid "ZRTP" msgstr "ZRTP" @@ -415,133 +419,133 @@ msgid_plural "Found %i contacts" msgstr[0] "" msgstr[1] "" -#: ../gtk/setupwizard.c:34 +#: ../gtk/setupwizard.c:32 msgid "" "Welcome!\n" "This assistant will help you to use a SIP account for your calls." msgstr "" -#: ../gtk/setupwizard.c:43 +#: ../gtk/setupwizard.c:41 msgid "Create an account on linphone.org" msgstr "Fiók létrehozása a linphone.org -on" -#: ../gtk/setupwizard.c:44 +#: ../gtk/setupwizard.c:42 msgid "I have already a linphone.org account and I just want to use it" msgstr "Már rendelkezem linphone.org fiókkal, azt szeretném használni" -#: ../gtk/setupwizard.c:45 +#: ../gtk/setupwizard.c:43 msgid "I have already a sip account and I just want to use it" msgstr "Már rendelkezem sip fiókkal, azt szeretném használni" -#: ../gtk/setupwizard.c:46 +#: ../gtk/setupwizard.c:44 msgid "I want to specify a remote configuration URI" msgstr "" -#: ../gtk/setupwizard.c:89 +#: ../gtk/setupwizard.c:87 msgid "Enter your linphone.org username" msgstr "Adja meg linphone.org felhasználónevét" -#: ../gtk/setupwizard.c:102 ../gtk/parameters.ui.h:85 ../gtk/ldap.ui.h:4 +#: ../gtk/setupwizard.c:100 ../gtk/parameters.ui.h:85 ../gtk/ldap.ui.h:4 msgid "Username:" msgstr "Felhasználónév:" -#: ../gtk/setupwizard.c:104 ../gtk/password.ui.h:4 ../gtk/ldap.ui.h:5 +#: ../gtk/setupwizard.c:102 ../gtk/password.ui.h:4 ../gtk/ldap.ui.h:5 msgid "Password:" msgstr "Jelszó:" -#: ../gtk/setupwizard.c:124 +#: ../gtk/setupwizard.c:122 msgid "Enter your account informations" msgstr "Írja be fiókinformációit" -#: ../gtk/setupwizard.c:140 +#: ../gtk/setupwizard.c:138 msgid "Username*" msgstr "Felhasználónév*" -#: ../gtk/setupwizard.c:141 +#: ../gtk/setupwizard.c:139 msgid "Password*" msgstr "Jelszó*" -#: ../gtk/setupwizard.c:144 +#: ../gtk/setupwizard.c:142 msgid "Domain*" msgstr "Tartomány" -#: ../gtk/setupwizard.c:145 +#: ../gtk/setupwizard.c:143 msgid "Proxy" msgstr "Proxy" -#: ../gtk/setupwizard.c:317 +#: ../gtk/setupwizard.c:322 msgid "(*) Required fields" msgstr "(*) Mező kitöltése szükséges" -#: ../gtk/setupwizard.c:318 +#: ../gtk/setupwizard.c:323 msgid "Username: (*)" msgstr "Felhasználónév: (*)" -#: ../gtk/setupwizard.c:320 +#: ../gtk/setupwizard.c:325 msgid "Password: (*)" msgstr "Jelszó: (*)" -#: ../gtk/setupwizard.c:322 +#: ../gtk/setupwizard.c:327 msgid "Email: (*)" msgstr "E-mail: (*)" -#: ../gtk/setupwizard.c:324 +#: ../gtk/setupwizard.c:329 msgid "Confirm your password: (*)" msgstr "Jelszó megerősítése: (*)" -#: ../gtk/setupwizard.c:338 +#: ../gtk/setupwizard.c:343 msgid "Keep me informed with linphone updates" msgstr "" -#: ../gtk/setupwizard.c:394 +#: ../gtk/setupwizard.c:399 msgid "" "Error, account not validated, username already used or server unreachable.\n" "Please go back and try again." msgstr "Hiba, a fiók nincs érvényesítve. Valaki már használja ezt a felhasználónevet vagy a kiszolgáló nem elérhető.\nKérjük, lépjen vissza és próbálja újra." -#: ../gtk/setupwizard.c:405 +#: ../gtk/setupwizard.c:410 msgid "Thank you. Your account is now configured and ready for use." msgstr "Köszönjük! Az Ön fiókját beállítottuk és használatra kész." -#: ../gtk/setupwizard.c:413 +#: ../gtk/setupwizard.c:418 msgid "" "Please validate your account by clicking on the link we just sent you by email.\n" "Then come back here and press Next button." msgstr "Kérjük, érvényesítse fiókját az általunk elektronikus levélben küldött hivatkozásra kattintva.\nAzután térjen vissza ide és kattintson a Következő gombra." -#: ../gtk/setupwizard.c:602 +#: ../gtk/setupwizard.c:609 msgid "SIP account configuration assistant" msgstr "" -#: ../gtk/setupwizard.c:620 +#: ../gtk/setupwizard.c:629 msgid "Welcome to the account setup assistant" msgstr "A fiók beállítása varázsló üdvözli Önt" -#: ../gtk/setupwizard.c:625 +#: ../gtk/setupwizard.c:634 msgid "Account setup assistant" msgstr "Fiók beállítása varázsló" -#: ../gtk/setupwizard.c:631 +#: ../gtk/setupwizard.c:640 msgid "Configure your account (step 1/1)" msgstr "Az Ön fiókjának beállítása (1/1 lépés)" -#: ../gtk/setupwizard.c:636 +#: ../gtk/setupwizard.c:645 msgid "Enter your sip username (step 1/1)" msgstr "Adja meg sip felhasználónevét (1/2 lépés)" -#: ../gtk/setupwizard.c:640 +#: ../gtk/setupwizard.c:649 msgid "Enter account information (step 1/2)" msgstr "Adja meg a fiókinformációt (1/2 lépés)" -#: ../gtk/setupwizard.c:649 +#: ../gtk/setupwizard.c:658 msgid "Validation (step 2/2)" msgstr "Érvényesítés (2/2 lépés)" -#: ../gtk/setupwizard.c:654 +#: ../gtk/setupwizard.c:663 msgid "Error" msgstr "Hiba" -#: ../gtk/setupwizard.c:658 ../gtk/audio_assistant.c:534 +#: ../gtk/setupwizard.c:667 ../gtk/audio_assistant.c:534 msgid "Terminating" msgstr "Befejezés" @@ -1495,10 +1499,6 @@ msgstr "Hozzáadása a listámhoz" msgid "Search somebody" msgstr "Keres valakit" -#: ../gtk/waiting.ui.h:1 -msgid "Linphone" -msgstr "Linphone" - #: ../gtk/waiting.ui.h:2 msgid "Please wait" msgstr "Kérem várjon" @@ -1698,68 +1698,68 @@ msgstr "" msgid "Please wait while fetching configuration from server..." msgstr "" -#: ../coreapi/linphonecore.c:1538 +#: ../coreapi/linphonecore.c:1539 msgid "Ready" msgstr "Kész" -#: ../coreapi/linphonecore.c:2550 +#: ../coreapi/linphonecore.c:2551 msgid "Configuring" msgstr "" -#: ../coreapi/linphonecore.c:2724 +#: ../coreapi/linphonecore.c:2725 msgid "Looking for telephone number destination..." msgstr "Telefonszám-cél keresése..." -#: ../coreapi/linphonecore.c:2726 +#: ../coreapi/linphonecore.c:2727 msgid "Could not resolve this number." msgstr "Nem sikkerült értelmezni a számot." #. must be known at that time -#: ../coreapi/linphonecore.c:3012 +#: ../coreapi/linphonecore.c:3013 msgid "Contacting" msgstr "Kapcsolódás" -#: ../coreapi/linphonecore.c:3017 +#: ../coreapi/linphonecore.c:3018 msgid "Could not call" msgstr "Nem sikerült hívni" -#: ../coreapi/linphonecore.c:3168 +#: ../coreapi/linphonecore.c:3169 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "Elnézést, elértük a egyidejű hívások maximális számát" -#: ../coreapi/linphonecore.c:3326 +#: ../coreapi/linphonecore.c:3327 msgid "is contacting you" msgstr "kapcsolatba lépett veled." -#: ../coreapi/linphonecore.c:3327 +#: ../coreapi/linphonecore.c:3328 msgid " and asked autoanswer." msgstr "és automatikus választ kért." -#: ../coreapi/linphonecore.c:3451 +#: ../coreapi/linphonecore.c:3452 msgid "Modifying call parameters..." msgstr "A hívási jellemzők módosítása..." -#: ../coreapi/linphonecore.c:3798 +#: ../coreapi/linphonecore.c:3802 msgid "Connected." msgstr "Kapcsolódva." -#: ../coreapi/linphonecore.c:3823 +#: ../coreapi/linphonecore.c:3827 msgid "Call aborted" msgstr "Hívás megszakítva" -#: ../coreapi/linphonecore.c:4013 +#: ../coreapi/linphonecore.c:4024 msgid "Could not pause the call" msgstr "Nem sikerült várakoztatni a hívást" -#: ../coreapi/linphonecore.c:4016 +#: ../coreapi/linphonecore.c:4027 msgid "Pausing the current call..." msgstr "Jelenlegi hívás várakoztatásának aktiválása..." -#: ../coreapi/misc.c:433 +#: ../coreapi/misc.c:434 msgid "Stun lookup in progress..." msgstr "Stun keresés folyamatban..." -#: ../coreapi/misc.c:614 +#: ../coreapi/misc.c:615 msgid "ICE local candidates gathering in progress..." msgstr "ICE helyi jelentkezők begyűjtése folyamatban..." @@ -1844,100 +1844,100 @@ msgstr "Távoli csengés..." msgid "Early media." msgstr "Korai médiák." -#: ../coreapi/callbacks.c:533 +#: ../coreapi/callbacks.c:534 #, c-format msgid "Call with %s is paused." msgstr "A hívás a következővel: %s várakoztatva" -#: ../coreapi/callbacks.c:546 +#: ../coreapi/callbacks.c:547 #, c-format msgid "Call answered by %s - on hold." msgstr "%s fogadta a hívást - várakoztatva." -#: ../coreapi/callbacks.c:556 +#: ../coreapi/callbacks.c:557 msgid "Call resumed." msgstr "Hívás visszatért" -#: ../coreapi/callbacks.c:560 +#: ../coreapi/callbacks.c:561 #, c-format msgid "Call answered by %s." msgstr "%s válaszolt a hívásra." -#: ../coreapi/callbacks.c:583 +#: ../coreapi/callbacks.c:584 msgid "Incompatible, check codecs or security settings..." msgstr "Nem kompatibilis, ellenőrizze a kódek- vagy a biztonsági beállításokat..." -#: ../coreapi/callbacks.c:588 ../coreapi/callbacks.c:900 +#: ../coreapi/callbacks.c:589 ../coreapi/callbacks.c:906 msgid "Incompatible media parameters." msgstr "Nem kompatibilis médiajellemzők." -#: ../coreapi/callbacks.c:618 +#: ../coreapi/callbacks.c:619 msgid "We have been resumed." msgstr "Visszatértünk." #. we are being paused -#: ../coreapi/callbacks.c:626 +#: ../coreapi/callbacks.c:628 msgid "We are paused by other party." msgstr "Megállítva a másik fél által." #. reINVITE and in-dialogs UPDATE go here -#: ../coreapi/callbacks.c:660 +#: ../coreapi/callbacks.c:666 msgid "Call is updated by remote." msgstr "A hívás távolról frissítve." -#: ../coreapi/callbacks.c:776 +#: ../coreapi/callbacks.c:782 msgid "Call terminated." msgstr "A hívás befejezve." -#: ../coreapi/callbacks.c:804 +#: ../coreapi/callbacks.c:810 msgid "User is busy." msgstr "A felhasználó foglalt." -#: ../coreapi/callbacks.c:805 +#: ../coreapi/callbacks.c:811 msgid "User is temporarily unavailable." msgstr "A felhasználó ideiglenesen nem elérhető" #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:807 +#: ../coreapi/callbacks.c:813 msgid "User does not want to be disturbed." msgstr "A felhasználó nem akarja, hogy zavarják." -#: ../coreapi/callbacks.c:808 +#: ../coreapi/callbacks.c:814 msgid "Call declined." msgstr "Hívás elutasítva" -#: ../coreapi/callbacks.c:823 +#: ../coreapi/callbacks.c:829 msgid "Request timeout." msgstr "" -#: ../coreapi/callbacks.c:854 +#: ../coreapi/callbacks.c:860 msgid "Redirected" msgstr "Átirányítva" -#: ../coreapi/callbacks.c:909 +#: ../coreapi/callbacks.c:915 msgid "Call failed." msgstr "Nem sikerült a hívás." -#: ../coreapi/callbacks.c:987 +#: ../coreapi/callbacks.c:993 #, c-format msgid "Registration on %s successful." msgstr "A regisztáció a %s -n sikerült." -#: ../coreapi/callbacks.c:988 +#: ../coreapi/callbacks.c:994 #, c-format msgid "Unregistration on %s done." msgstr "A kiregisztrálás kész a következőn: %s ." -#: ../coreapi/callbacks.c:1006 +#: ../coreapi/callbacks.c:1012 msgid "no response timeout" msgstr "időtúllépés után nincs válasz" -#: ../coreapi/callbacks.c:1009 +#: ../coreapi/callbacks.c:1015 #, c-format msgid "Registration on %s failed: %s" msgstr "A regisztáció a %s -n nem sikerült: %s" -#: ../coreapi/callbacks.c:1016 +#: ../coreapi/callbacks.c:1022 msgid "Service unavailable, retrying" msgstr "" @@ -1947,11 +1947,11 @@ msgstr "" msgid "Authentication token is %s" msgstr "Hitelesítési jel: %s" -#: ../coreapi/linphonecall.c:1306 +#: ../coreapi/linphonecall.c:1310 msgid "Call parameters were successfully modified." msgstr "" -#: ../coreapi/linphonecall.c:3660 +#: ../coreapi/linphonecall.c:3686 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." diff --git a/po/it.po b/po/it.po index 8c0c860b2..a801a9acf 100644 --- a/po/it.po +++ b/po/it.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: linphone-gtk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-04-01 16:25+0200\n" -"PO-Revision-Date: 2015-04-01 14:26+0000\n" +"POT-Creation-Date: 2015-04-30 10:13+0200\n" +"PO-Revision-Date: 2015-04-30 08:13+0000\n" "Last-Translator: Belledonne Communications \n" "Language-Team: Italian (http://www.transifex.com/projects/p/linphone-gtk/language/it/)\n" "MIME-Version: 1.0\n" @@ -87,45 +87,45 @@ msgstr "" msgid "Couldn't find pixmap file: %s" msgstr "" -#: ../gtk/main.c:136 +#: ../gtk/main.c:137 msgid "log to stdout some debug information while running." msgstr "" -#: ../gtk/main.c:137 +#: ../gtk/main.c:138 msgid "path to a file to write logs into." msgstr "" -#: ../gtk/main.c:138 +#: ../gtk/main.c:139 msgid "Start linphone with video disabled." msgstr "" -#: ../gtk/main.c:139 +#: ../gtk/main.c:140 msgid "Start only in the system tray, do not show the main interface." msgstr "" -#: ../gtk/main.c:140 +#: ../gtk/main.c:141 msgid "address to call right now" msgstr "" -#: ../gtk/main.c:141 +#: ../gtk/main.c:142 msgid "" "Specifiy a working directory (should be the base of the installation, eg: " "c:\\Program Files\\Linphone)" msgstr "" -#: ../gtk/main.c:142 +#: ../gtk/main.c:143 msgid "Configuration file" msgstr "" -#: ../gtk/main.c:143 +#: ../gtk/main.c:144 msgid "Run the audio assistant" msgstr "" -#: ../gtk/main.c:144 +#: ../gtk/main.c:145 msgid "Run self test and exit 0 if succeed" msgstr "" -#: ../gtk/main.c:1069 +#: ../gtk/main.c:1070 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -133,76 +133,80 @@ msgid "" "If you answer no, this person will be temporarily blacklisted." msgstr "%s voui aggiungere il tuo contatto alla sua listaVoui permettere che lui veda il tuo stato o aggiungerlo alla tua lista dei contatti Se rispondi no questo utente sarà momentaneamente bloccato." -#: ../gtk/main.c:1146 +#: ../gtk/main.c:1147 #, c-format msgid "" "Please enter your password for username %s\n" " at realm %s:" msgstr "" -#: ../gtk/main.c:1267 +#: ../gtk/main.c:1268 msgid "Call error" msgstr "" -#: ../gtk/main.c:1270 ../coreapi/linphonecore.c:3842 +#: ../gtk/main.c:1271 ../coreapi/linphonecore.c:3846 msgid "Call ended" msgstr "Chiamata terminata" -#: ../gtk/main.c:1273 ../coreapi/call_log.c:221 +#: ../gtk/main.c:1274 ../coreapi/call_log.c:221 msgid "Incoming call" msgstr "Chimata in entrata" -#: ../gtk/main.c:1275 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 +#: ../gtk/main.c:1276 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 msgid "Answer" msgstr "" -#: ../gtk/main.c:1277 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1278 ../gtk/main.ui.h:6 msgid "Decline" msgstr "Rifiuta" -#: ../gtk/main.c:1283 +#: ../gtk/main.c:1284 msgid "Call paused" msgstr "" -#: ../gtk/main.c:1283 +#: ../gtk/main.c:1284 #, c-format msgid "by %s" msgstr "" -#: ../gtk/main.c:1353 +#: ../gtk/main.c:1354 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1516 +#: ../gtk/main.c:1509 msgid "Website link" msgstr "" -#: ../gtk/main.c:1565 -msgid "Linphone - a video internet phone" +#: ../gtk/main.c:1568 ../gtk/waiting.ui.h:1 +msgid "Linphone" +msgstr "Linphone" + +#: ../gtk/main.c:1569 +msgid "A video internet phone" msgstr "" -#: ../gtk/main.c:1657 +#: ../gtk/main.c:1629 #, c-format msgid "%s (Default)" msgstr "%s (Default)" -#: ../gtk/main.c:1989 ../coreapi/callbacks.c:1057 +#: ../gtk/main.c:1962 ../coreapi/callbacks.c:1063 #, c-format msgid "We are transferred to %s" msgstr "" -#: ../gtk/main.c:1999 +#: ../gtk/main.c:1972 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." msgstr "" -#: ../gtk/main.c:2147 +#: ../gtk/main.c:2117 msgid "A free SIP video-phone" msgstr "" -#: ../gtk/main.c:2252 +#: ../gtk/main.c:2221 #, c-format msgid "Hello\n" msgstr "" @@ -215,7 +219,7 @@ msgstr "" msgid "Presence status" msgstr "Presenza" -#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:552 ../gtk/contact.ui.h:1 +#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:569 ../gtk/contact.ui.h:1 msgid "Name" msgstr "Nome" @@ -256,124 +260,124 @@ msgstr "" msgid "Add new contact from %s directory" msgstr "Aggiungi nuovo contatto dalla directory %s" -#: ../gtk/propertybox.c:558 +#: ../gtk/propertybox.c:575 msgid "Rate (Hz)" msgstr "" -#: ../gtk/propertybox.c:564 +#: ../gtk/propertybox.c:581 msgid "Status" msgstr "Stato" -#: ../gtk/propertybox.c:570 +#: ../gtk/propertybox.c:587 msgid "IP Bitrate (kbit/s)" msgstr "" -#: ../gtk/propertybox.c:577 +#: ../gtk/propertybox.c:596 msgid "Parameters" msgstr "Parametri" -#: ../gtk/propertybox.c:620 ../gtk/propertybox.c:763 +#: ../gtk/propertybox.c:639 ../gtk/propertybox.c:782 msgid "Enabled" msgstr "Attivato" -#: ../gtk/propertybox.c:622 ../gtk/propertybox.c:763 ../gtk/parameters.ui.h:20 +#: ../gtk/propertybox.c:641 ../gtk/propertybox.c:782 ../gtk/parameters.ui.h:20 msgid "Disabled" msgstr "Disattivato" -#: ../gtk/propertybox.c:809 +#: ../gtk/propertybox.c:828 msgid "Account" msgstr "Account" -#: ../gtk/propertybox.c:1072 +#: ../gtk/propertybox.c:1091 msgid "English" msgstr "Inglese" -#: ../gtk/propertybox.c:1073 +#: ../gtk/propertybox.c:1092 msgid "French" msgstr "Francese" -#: ../gtk/propertybox.c:1074 +#: ../gtk/propertybox.c:1093 msgid "Swedish" msgstr "Svedese" -#: ../gtk/propertybox.c:1075 +#: ../gtk/propertybox.c:1094 msgid "Italian" msgstr "Italiano" -#: ../gtk/propertybox.c:1076 +#: ../gtk/propertybox.c:1095 msgid "Spanish" msgstr "Spagnolo" -#: ../gtk/propertybox.c:1077 +#: ../gtk/propertybox.c:1096 msgid "Brazilian Portugese" msgstr "" -#: ../gtk/propertybox.c:1078 +#: ../gtk/propertybox.c:1097 msgid "Polish" msgstr "Polacco" -#: ../gtk/propertybox.c:1079 +#: ../gtk/propertybox.c:1098 msgid "German" msgstr "Tedesco" -#: ../gtk/propertybox.c:1080 +#: ../gtk/propertybox.c:1099 msgid "Russian" msgstr "Russo" -#: ../gtk/propertybox.c:1081 +#: ../gtk/propertybox.c:1100 msgid "Japanese" msgstr "Giapponese" -#: ../gtk/propertybox.c:1082 +#: ../gtk/propertybox.c:1101 msgid "Dutch" msgstr "Olandese" -#: ../gtk/propertybox.c:1083 +#: ../gtk/propertybox.c:1102 msgid "Hungarian" msgstr "Ungherese" -#: ../gtk/propertybox.c:1084 +#: ../gtk/propertybox.c:1103 msgid "Czech" msgstr "Ceco" -#: ../gtk/propertybox.c:1085 +#: ../gtk/propertybox.c:1104 msgid "Chinese" msgstr "" -#: ../gtk/propertybox.c:1086 +#: ../gtk/propertybox.c:1105 msgid "Traditional Chinese" msgstr "" -#: ../gtk/propertybox.c:1087 +#: ../gtk/propertybox.c:1106 msgid "Norwegian" msgstr "" -#: ../gtk/propertybox.c:1088 +#: ../gtk/propertybox.c:1107 msgid "Hebrew" msgstr "" -#: ../gtk/propertybox.c:1089 +#: ../gtk/propertybox.c:1108 msgid "Serbian" msgstr "" -#: ../gtk/propertybox.c:1156 +#: ../gtk/propertybox.c:1175 msgid "" "You need to restart linphone for the new language selection to take effect." msgstr "Riavviare il software per utilizzare la nuova lingua selezionata" -#: ../gtk/propertybox.c:1236 +#: ../gtk/propertybox.c:1255 msgid "None" msgstr "" -#: ../gtk/propertybox.c:1240 +#: ../gtk/propertybox.c:1259 msgid "SRTP" msgstr "" -#: ../gtk/propertybox.c:1246 +#: ../gtk/propertybox.c:1265 msgid "DTLS" msgstr "" -#: ../gtk/propertybox.c:1253 +#: ../gtk/propertybox.c:1272 msgid "ZRTP" msgstr "" @@ -415,133 +419,133 @@ msgid_plural "Found %i contacts" msgstr[0] "Trovato %i contatto" msgstr[1] "Trovato %i contatti" -#: ../gtk/setupwizard.c:34 +#: ../gtk/setupwizard.c:32 msgid "" "Welcome!\n" "This assistant will help you to use a SIP account for your calls." msgstr "" -#: ../gtk/setupwizard.c:43 +#: ../gtk/setupwizard.c:41 msgid "Create an account on linphone.org" msgstr "" -#: ../gtk/setupwizard.c:44 +#: ../gtk/setupwizard.c:42 msgid "I have already a linphone.org account and I just want to use it" msgstr "" -#: ../gtk/setupwizard.c:45 +#: ../gtk/setupwizard.c:43 msgid "I have already a sip account and I just want to use it" msgstr "" -#: ../gtk/setupwizard.c:46 +#: ../gtk/setupwizard.c:44 msgid "I want to specify a remote configuration URI" msgstr "" -#: ../gtk/setupwizard.c:89 +#: ../gtk/setupwizard.c:87 msgid "Enter your linphone.org username" msgstr "" -#: ../gtk/setupwizard.c:102 ../gtk/parameters.ui.h:85 ../gtk/ldap.ui.h:4 +#: ../gtk/setupwizard.c:100 ../gtk/parameters.ui.h:85 ../gtk/ldap.ui.h:4 msgid "Username:" msgstr "Manuale utente" -#: ../gtk/setupwizard.c:104 ../gtk/password.ui.h:4 ../gtk/ldap.ui.h:5 +#: ../gtk/setupwizard.c:102 ../gtk/password.ui.h:4 ../gtk/ldap.ui.h:5 msgid "Password:" msgstr "Password:" -#: ../gtk/setupwizard.c:124 +#: ../gtk/setupwizard.c:122 msgid "Enter your account informations" msgstr "" -#: ../gtk/setupwizard.c:140 +#: ../gtk/setupwizard.c:138 msgid "Username*" msgstr "" -#: ../gtk/setupwizard.c:141 +#: ../gtk/setupwizard.c:139 msgid "Password*" msgstr "" -#: ../gtk/setupwizard.c:144 +#: ../gtk/setupwizard.c:142 msgid "Domain*" msgstr "" -#: ../gtk/setupwizard.c:145 +#: ../gtk/setupwizard.c:143 msgid "Proxy" msgstr "" -#: ../gtk/setupwizard.c:317 +#: ../gtk/setupwizard.c:322 msgid "(*) Required fields" msgstr "" -#: ../gtk/setupwizard.c:318 +#: ../gtk/setupwizard.c:323 msgid "Username: (*)" msgstr "" -#: ../gtk/setupwizard.c:320 +#: ../gtk/setupwizard.c:325 msgid "Password: (*)" msgstr "" -#: ../gtk/setupwizard.c:322 +#: ../gtk/setupwizard.c:327 msgid "Email: (*)" msgstr "" -#: ../gtk/setupwizard.c:324 +#: ../gtk/setupwizard.c:329 msgid "Confirm your password: (*)" msgstr "" -#: ../gtk/setupwizard.c:338 +#: ../gtk/setupwizard.c:343 msgid "Keep me informed with linphone updates" msgstr "" -#: ../gtk/setupwizard.c:394 +#: ../gtk/setupwizard.c:399 msgid "" "Error, account not validated, username already used or server unreachable.\n" "Please go back and try again." msgstr "" -#: ../gtk/setupwizard.c:405 +#: ../gtk/setupwizard.c:410 msgid "Thank you. Your account is now configured and ready for use." msgstr "Grazie. Il tuo account è configurato e pronto all'uso" -#: ../gtk/setupwizard.c:413 +#: ../gtk/setupwizard.c:418 msgid "" "Please validate your account by clicking on the link we just sent you by email.\n" "Then come back here and press Next button." msgstr "" -#: ../gtk/setupwizard.c:602 +#: ../gtk/setupwizard.c:609 msgid "SIP account configuration assistant" msgstr "" -#: ../gtk/setupwizard.c:620 +#: ../gtk/setupwizard.c:629 msgid "Welcome to the account setup assistant" msgstr "Benvenuto nel configuratore di account" -#: ../gtk/setupwizard.c:625 +#: ../gtk/setupwizard.c:634 msgid "Account setup assistant" msgstr "Configuratore di account" -#: ../gtk/setupwizard.c:631 +#: ../gtk/setupwizard.c:640 msgid "Configure your account (step 1/1)" msgstr "" -#: ../gtk/setupwizard.c:636 +#: ../gtk/setupwizard.c:645 msgid "Enter your sip username (step 1/1)" msgstr "" -#: ../gtk/setupwizard.c:640 +#: ../gtk/setupwizard.c:649 msgid "Enter account information (step 1/2)" msgstr "" -#: ../gtk/setupwizard.c:649 +#: ../gtk/setupwizard.c:658 msgid "Validation (step 2/2)" msgstr "" -#: ../gtk/setupwizard.c:654 +#: ../gtk/setupwizard.c:663 msgid "Error" msgstr "" -#: ../gtk/setupwizard.c:658 ../gtk/audio_assistant.c:534 +#: ../gtk/setupwizard.c:667 ../gtk/audio_assistant.c:534 msgid "Terminating" msgstr "" @@ -1495,10 +1499,6 @@ msgstr "Aggiungi alla mia lista" msgid "Search somebody" msgstr "Cerca" -#: ../gtk/waiting.ui.h:1 -msgid "Linphone" -msgstr "Linphone" - #: ../gtk/waiting.ui.h:2 msgid "Please wait" msgstr "Prego attendere" @@ -1698,68 +1698,68 @@ msgstr "" msgid "Please wait while fetching configuration from server..." msgstr "" -#: ../coreapi/linphonecore.c:1538 +#: ../coreapi/linphonecore.c:1539 msgid "Ready" msgstr "Pronto" -#: ../coreapi/linphonecore.c:2550 +#: ../coreapi/linphonecore.c:2551 msgid "Configuring" msgstr "" -#: ../coreapi/linphonecore.c:2724 +#: ../coreapi/linphonecore.c:2725 msgid "Looking for telephone number destination..." msgstr "Ricerca numero destinazione..." -#: ../coreapi/linphonecore.c:2726 +#: ../coreapi/linphonecore.c:2727 msgid "Could not resolve this number." msgstr "Impossibile risolvere il numero." #. must be known at that time -#: ../coreapi/linphonecore.c:3012 +#: ../coreapi/linphonecore.c:3013 msgid "Contacting" msgstr "In connessione" -#: ../coreapi/linphonecore.c:3017 +#: ../coreapi/linphonecore.c:3018 msgid "Could not call" msgstr "" -#: ../coreapi/linphonecore.c:3168 +#: ../coreapi/linphonecore.c:3169 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "" -#: ../coreapi/linphonecore.c:3326 +#: ../coreapi/linphonecore.c:3327 msgid "is contacting you" msgstr "" -#: ../coreapi/linphonecore.c:3327 +#: ../coreapi/linphonecore.c:3328 msgid " and asked autoanswer." msgstr "" -#: ../coreapi/linphonecore.c:3451 +#: ../coreapi/linphonecore.c:3452 msgid "Modifying call parameters..." msgstr "" -#: ../coreapi/linphonecore.c:3798 +#: ../coreapi/linphonecore.c:3802 msgid "Connected." msgstr "Connessione" -#: ../coreapi/linphonecore.c:3823 +#: ../coreapi/linphonecore.c:3827 msgid "Call aborted" msgstr "" -#: ../coreapi/linphonecore.c:4013 +#: ../coreapi/linphonecore.c:4024 msgid "Could not pause the call" msgstr "" -#: ../coreapi/linphonecore.c:4016 +#: ../coreapi/linphonecore.c:4027 msgid "Pausing the current call..." msgstr "" -#: ../coreapi/misc.c:433 +#: ../coreapi/misc.c:434 msgid "Stun lookup in progress..." msgstr "Ricerca Stun in progresso ..." -#: ../coreapi/misc.c:614 +#: ../coreapi/misc.c:615 msgid "ICE local candidates gathering in progress..." msgstr "" @@ -1844,100 +1844,100 @@ msgstr "" msgid "Early media." msgstr "" -#: ../coreapi/callbacks.c:533 +#: ../coreapi/callbacks.c:534 #, c-format msgid "Call with %s is paused." msgstr "" -#: ../coreapi/callbacks.c:546 +#: ../coreapi/callbacks.c:547 #, c-format msgid "Call answered by %s - on hold." msgstr "" -#: ../coreapi/callbacks.c:556 +#: ../coreapi/callbacks.c:557 msgid "Call resumed." msgstr "" -#: ../coreapi/callbacks.c:560 +#: ../coreapi/callbacks.c:561 #, c-format msgid "Call answered by %s." msgstr "" -#: ../coreapi/callbacks.c:583 +#: ../coreapi/callbacks.c:584 msgid "Incompatible, check codecs or security settings..." msgstr "" -#: ../coreapi/callbacks.c:588 ../coreapi/callbacks.c:900 +#: ../coreapi/callbacks.c:589 ../coreapi/callbacks.c:906 msgid "Incompatible media parameters." msgstr "" -#: ../coreapi/callbacks.c:618 +#: ../coreapi/callbacks.c:619 msgid "We have been resumed." msgstr "" #. we are being paused -#: ../coreapi/callbacks.c:626 +#: ../coreapi/callbacks.c:628 msgid "We are paused by other party." msgstr "" #. reINVITE and in-dialogs UPDATE go here -#: ../coreapi/callbacks.c:660 +#: ../coreapi/callbacks.c:666 msgid "Call is updated by remote." msgstr "" -#: ../coreapi/callbacks.c:776 +#: ../coreapi/callbacks.c:782 msgid "Call terminated." msgstr "Chiamata terminata." -#: ../coreapi/callbacks.c:804 +#: ../coreapi/callbacks.c:810 msgid "User is busy." msgstr "Utente occupato" -#: ../coreapi/callbacks.c:805 +#: ../coreapi/callbacks.c:811 msgid "User is temporarily unavailable." msgstr "Utente non disponibile" #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:807 +#: ../coreapi/callbacks.c:813 msgid "User does not want to be disturbed." msgstr "L'utente non vuole essere disturbato" -#: ../coreapi/callbacks.c:808 +#: ../coreapi/callbacks.c:814 msgid "Call declined." msgstr "Chiamata rifiutata" -#: ../coreapi/callbacks.c:823 +#: ../coreapi/callbacks.c:829 msgid "Request timeout." msgstr "" -#: ../coreapi/callbacks.c:854 +#: ../coreapi/callbacks.c:860 msgid "Redirected" msgstr "" -#: ../coreapi/callbacks.c:909 +#: ../coreapi/callbacks.c:915 msgid "Call failed." msgstr "" -#: ../coreapi/callbacks.c:987 +#: ../coreapi/callbacks.c:993 #, c-format msgid "Registration on %s successful." msgstr "Registrazione su %s attiva" -#: ../coreapi/callbacks.c:988 +#: ../coreapi/callbacks.c:994 #, c-format msgid "Unregistration on %s done." msgstr "Unregistrazione su %s" -#: ../coreapi/callbacks.c:1006 +#: ../coreapi/callbacks.c:1012 msgid "no response timeout" msgstr "timeout no risposta" -#: ../coreapi/callbacks.c:1009 +#: ../coreapi/callbacks.c:1015 #, c-format msgid "Registration on %s failed: %s" msgstr "Registrazione su %s fallita: %s" -#: ../coreapi/callbacks.c:1016 +#: ../coreapi/callbacks.c:1022 msgid "Service unavailable, retrying" msgstr "" @@ -1947,11 +1947,11 @@ msgstr "" msgid "Authentication token is %s" msgstr "" -#: ../coreapi/linphonecall.c:1306 +#: ../coreapi/linphonecall.c:1310 msgid "Call parameters were successfully modified." msgstr "" -#: ../coreapi/linphonecall.c:3660 +#: ../coreapi/linphonecall.c:3686 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." diff --git a/po/ja.po b/po/ja.po index 2f9366905..3707eeab9 100644 --- a/po/ja.po +++ b/po/ja.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: linphone-gtk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-04-01 16:25+0200\n" -"PO-Revision-Date: 2015-04-01 14:26+0000\n" +"POT-Creation-Date: 2015-04-30 10:13+0200\n" +"PO-Revision-Date: 2015-04-30 08:13+0000\n" "Last-Translator: Belledonne Communications \n" "Language-Team: Japanese (http://www.transifex.com/projects/p/linphone-gtk/language/ja/)\n" "MIME-Version: 1.0\n" @@ -87,45 +87,45 @@ msgstr "自分" msgid "Couldn't find pixmap file: %s" msgstr "pixmapファイルが見つかりません %s" -#: ../gtk/main.c:136 +#: ../gtk/main.c:137 msgid "log to stdout some debug information while running." msgstr "実行中にいくつかのデバッグ情報をstdoutに送信します。" -#: ../gtk/main.c:137 +#: ../gtk/main.c:138 msgid "path to a file to write logs into." msgstr "ログを書き込むファイルへのパス。" -#: ../gtk/main.c:138 +#: ../gtk/main.c:139 msgid "Start linphone with video disabled." msgstr "ビデオを無効にしてLinphoneを開始します。" -#: ../gtk/main.c:139 +#: ../gtk/main.c:140 msgid "Start only in the system tray, do not show the main interface." msgstr "主なインターフェイスを表示しないでシステムトレイに移動します。" -#: ../gtk/main.c:140 +#: ../gtk/main.c:141 msgid "address to call right now" msgstr "今すぐに呼び出す" -#: ../gtk/main.c:141 +#: ../gtk/main.c:142 msgid "" "Specifiy a working directory (should be the base of the installation, eg: " "c:\\Program Files\\Linphone)" msgstr "作業ディレクトリをSpecifiy (インストールした時のベースである必要があります。例:c:\\Program Files\\Linphone)" -#: ../gtk/main.c:142 +#: ../gtk/main.c:143 msgid "Configuration file" msgstr "設定ファイル" -#: ../gtk/main.c:143 +#: ../gtk/main.c:144 msgid "Run the audio assistant" msgstr "オーディオアシスタントを実行" -#: ../gtk/main.c:144 +#: ../gtk/main.c:145 msgid "Run self test and exit 0 if succeed" msgstr "" -#: ../gtk/main.c:1069 +#: ../gtk/main.c:1070 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -133,76 +133,80 @@ msgid "" "If you answer no, this person will be temporarily blacklisted." msgstr "%s が連絡相手にあなたを追加しようとしています。\nあなたのステータスを参照させるか、もしくは連絡先リストに追加することができます。\nあなたが拒否すると、この人は一時的にブラックリストへ登録されます。" -#: ../gtk/main.c:1146 +#: ../gtk/main.c:1147 #, c-format msgid "" "Please enter your password for username %s\n" " at realm %s:" msgstr "" -#: ../gtk/main.c:1267 +#: ../gtk/main.c:1268 msgid "Call error" msgstr "呼出エラー" -#: ../gtk/main.c:1270 ../coreapi/linphonecore.c:3842 +#: ../gtk/main.c:1271 ../coreapi/linphonecore.c:3846 msgid "Call ended" msgstr "呼出終了" -#: ../gtk/main.c:1273 ../coreapi/call_log.c:221 +#: ../gtk/main.c:1274 ../coreapi/call_log.c:221 msgid "Incoming call" msgstr "着信" -#: ../gtk/main.c:1275 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 +#: ../gtk/main.c:1276 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 msgid "Answer" msgstr "応答" -#: ../gtk/main.c:1277 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1278 ../gtk/main.ui.h:6 msgid "Decline" msgstr "拒否" -#: ../gtk/main.c:1283 +#: ../gtk/main.c:1284 msgid "Call paused" msgstr "呼び出しの一時停止" -#: ../gtk/main.c:1283 +#: ../gtk/main.c:1284 #, c-format msgid "by %s" msgstr "%s" -#: ../gtk/main.c:1353 +#: ../gtk/main.c:1354 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1516 +#: ../gtk/main.c:1509 msgid "Website link" msgstr "ウェブサイトリンク" -#: ../gtk/main.c:1565 -msgid "Linphone - a video internet phone" -msgstr "Linphone - ビデオインターネット電話" +#: ../gtk/main.c:1568 ../gtk/waiting.ui.h:1 +msgid "Linphone" +msgstr "Linphone" -#: ../gtk/main.c:1657 +#: ../gtk/main.c:1569 +msgid "A video internet phone" +msgstr "" + +#: ../gtk/main.c:1629 #, c-format msgid "%s (Default)" msgstr "%s (デフォルト)" -#: ../gtk/main.c:1989 ../coreapi/callbacks.c:1057 +#: ../gtk/main.c:1962 ../coreapi/callbacks.c:1063 #, c-format msgid "We are transferred to %s" msgstr "%s に転送しました" -#: ../gtk/main.c:1999 +#: ../gtk/main.c:1972 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." msgstr "" -#: ../gtk/main.c:2147 +#: ../gtk/main.c:2117 msgid "A free SIP video-phone" msgstr "無料 SIP ビデオ-電話" -#: ../gtk/main.c:2252 +#: ../gtk/main.c:2221 #, c-format msgid "Hello\n" msgstr "" @@ -215,7 +219,7 @@ msgstr "電話帳に追加する" msgid "Presence status" msgstr "状態のステータス" -#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:552 ../gtk/contact.ui.h:1 +#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:569 ../gtk/contact.ui.h:1 msgid "Name" msgstr "名前" @@ -256,124 +260,124 @@ msgstr "'%s' のチャット履歴を削除" msgid "Add new contact from %s directory" msgstr "" -#: ../gtk/propertybox.c:558 +#: ../gtk/propertybox.c:575 msgid "Rate (Hz)" msgstr "レート (Hz)" -#: ../gtk/propertybox.c:564 +#: ../gtk/propertybox.c:581 msgid "Status" msgstr "状態" -#: ../gtk/propertybox.c:570 +#: ../gtk/propertybox.c:587 msgid "IP Bitrate (kbit/s)" msgstr "IP ビットレート (kbit/s)" -#: ../gtk/propertybox.c:577 +#: ../gtk/propertybox.c:596 msgid "Parameters" msgstr "パラメーター" -#: ../gtk/propertybox.c:620 ../gtk/propertybox.c:763 +#: ../gtk/propertybox.c:639 ../gtk/propertybox.c:782 msgid "Enabled" msgstr "使用する" -#: ../gtk/propertybox.c:622 ../gtk/propertybox.c:763 ../gtk/parameters.ui.h:20 +#: ../gtk/propertybox.c:641 ../gtk/propertybox.c:782 ../gtk/parameters.ui.h:20 msgid "Disabled" msgstr "使用しない" -#: ../gtk/propertybox.c:809 +#: ../gtk/propertybox.c:828 msgid "Account" msgstr "アカウント" -#: ../gtk/propertybox.c:1072 +#: ../gtk/propertybox.c:1091 msgid "English" msgstr "English" -#: ../gtk/propertybox.c:1073 +#: ../gtk/propertybox.c:1092 msgid "French" msgstr "Français" -#: ../gtk/propertybox.c:1074 +#: ../gtk/propertybox.c:1093 msgid "Swedish" msgstr "Svenska" -#: ../gtk/propertybox.c:1075 +#: ../gtk/propertybox.c:1094 msgid "Italian" msgstr "Italiano" -#: ../gtk/propertybox.c:1076 +#: ../gtk/propertybox.c:1095 msgid "Spanish" msgstr "Español" -#: ../gtk/propertybox.c:1077 +#: ../gtk/propertybox.c:1096 msgid "Brazilian Portugese" msgstr "Português do Brasil" -#: ../gtk/propertybox.c:1078 +#: ../gtk/propertybox.c:1097 msgid "Polish" msgstr "Polski" -#: ../gtk/propertybox.c:1079 +#: ../gtk/propertybox.c:1098 msgid "German" msgstr "Deutsch" -#: ../gtk/propertybox.c:1080 +#: ../gtk/propertybox.c:1099 msgid "Russian" msgstr "Pусский" -#: ../gtk/propertybox.c:1081 +#: ../gtk/propertybox.c:1100 msgid "Japanese" msgstr "日本語" -#: ../gtk/propertybox.c:1082 +#: ../gtk/propertybox.c:1101 msgid "Dutch" msgstr "Nederlands" -#: ../gtk/propertybox.c:1083 +#: ../gtk/propertybox.c:1102 msgid "Hungarian" msgstr "Magyar" -#: ../gtk/propertybox.c:1084 +#: ../gtk/propertybox.c:1103 msgid "Czech" msgstr "čeština" -#: ../gtk/propertybox.c:1085 +#: ../gtk/propertybox.c:1104 msgid "Chinese" msgstr "简体中文" -#: ../gtk/propertybox.c:1086 +#: ../gtk/propertybox.c:1105 msgid "Traditional Chinese" msgstr "繁体中文" -#: ../gtk/propertybox.c:1087 +#: ../gtk/propertybox.c:1106 msgid "Norwegian" msgstr "Norsk" -#: ../gtk/propertybox.c:1088 +#: ../gtk/propertybox.c:1107 msgid "Hebrew" msgstr "עברית" -#: ../gtk/propertybox.c:1089 +#: ../gtk/propertybox.c:1108 msgid "Serbian" msgstr "Cрпски" -#: ../gtk/propertybox.c:1156 +#: ../gtk/propertybox.c:1175 msgid "" "You need to restart linphone for the new language selection to take effect." msgstr "言語の選択を有効にするには、 Linphoneを再起動する必要があります。" -#: ../gtk/propertybox.c:1236 +#: ../gtk/propertybox.c:1255 msgid "None" msgstr "なし" -#: ../gtk/propertybox.c:1240 +#: ../gtk/propertybox.c:1259 msgid "SRTP" msgstr "SRTP" -#: ../gtk/propertybox.c:1246 +#: ../gtk/propertybox.c:1265 msgid "DTLS" msgstr "" -#: ../gtk/propertybox.c:1253 +#: ../gtk/propertybox.c:1272 msgid "ZRTP" msgstr "ZRTP" @@ -414,133 +418,133 @@ msgid "Found %i contact" msgid_plural "Found %i contacts" msgstr[0] "%i 件発見" -#: ../gtk/setupwizard.c:34 +#: ../gtk/setupwizard.c:32 msgid "" "Welcome!\n" "This assistant will help you to use a SIP account for your calls." msgstr "ようこそ!\nあなたの通話のためのSIPアカウント設定をお手伝いします。" -#: ../gtk/setupwizard.c:43 +#: ../gtk/setupwizard.c:41 msgid "Create an account on linphone.org" msgstr "linphone.orgのアカウントを作成" -#: ../gtk/setupwizard.c:44 +#: ../gtk/setupwizard.c:42 msgid "I have already a linphone.org account and I just want to use it" msgstr "linphone.orgのアカウントを持っているのでそれを使います" -#: ../gtk/setupwizard.c:45 +#: ../gtk/setupwizard.c:43 msgid "I have already a sip account and I just want to use it" msgstr "SIPアカウントを持っているのでそれを使います" -#: ../gtk/setupwizard.c:46 +#: ../gtk/setupwizard.c:44 msgid "I want to specify a remote configuration URI" msgstr "" -#: ../gtk/setupwizard.c:89 +#: ../gtk/setupwizard.c:87 msgid "Enter your linphone.org username" msgstr "linphone.orgで取得したユーザー名を入力" -#: ../gtk/setupwizard.c:102 ../gtk/parameters.ui.h:85 ../gtk/ldap.ui.h:4 +#: ../gtk/setupwizard.c:100 ../gtk/parameters.ui.h:85 ../gtk/ldap.ui.h:4 msgid "Username:" msgstr "ユーザー名:" -#: ../gtk/setupwizard.c:104 ../gtk/password.ui.h:4 ../gtk/ldap.ui.h:5 +#: ../gtk/setupwizard.c:102 ../gtk/password.ui.h:4 ../gtk/ldap.ui.h:5 msgid "Password:" msgstr "パスワード:" -#: ../gtk/setupwizard.c:124 +#: ../gtk/setupwizard.c:122 msgid "Enter your account informations" msgstr "アカウント情報を入力" -#: ../gtk/setupwizard.c:140 +#: ../gtk/setupwizard.c:138 msgid "Username*" msgstr "ユーザー名*" -#: ../gtk/setupwizard.c:141 +#: ../gtk/setupwizard.c:139 msgid "Password*" msgstr "パスワード*" -#: ../gtk/setupwizard.c:144 +#: ../gtk/setupwizard.c:142 msgid "Domain*" msgstr "ドメイン*" -#: ../gtk/setupwizard.c:145 +#: ../gtk/setupwizard.c:143 msgid "Proxy" msgstr "プロキシ*" -#: ../gtk/setupwizard.c:317 +#: ../gtk/setupwizard.c:322 msgid "(*) Required fields" msgstr "(*) 必須" -#: ../gtk/setupwizard.c:318 +#: ../gtk/setupwizard.c:323 msgid "Username: (*)" msgstr "ユーザー名: (*)" -#: ../gtk/setupwizard.c:320 +#: ../gtk/setupwizard.c:325 msgid "Password: (*)" msgstr "パスワード: (*)" -#: ../gtk/setupwizard.c:322 +#: ../gtk/setupwizard.c:327 msgid "Email: (*)" msgstr "メールアドレス: (*)" -#: ../gtk/setupwizard.c:324 +#: ../gtk/setupwizard.c:329 msgid "Confirm your password: (*)" msgstr "パスワードを再入力: (*)" -#: ../gtk/setupwizard.c:338 +#: ../gtk/setupwizard.c:343 msgid "Keep me informed with linphone updates" msgstr "アップデートでLinphoneを常に最新にする" -#: ../gtk/setupwizard.c:394 +#: ../gtk/setupwizard.c:399 msgid "" "Error, account not validated, username already used or server unreachable.\n" "Please go back and try again." msgstr "" -#: ../gtk/setupwizard.c:405 +#: ../gtk/setupwizard.c:410 msgid "Thank you. Your account is now configured and ready for use." msgstr "ありがとう。あなたのアカウントは無事に設定され、使用する準備ができました。" -#: ../gtk/setupwizard.c:413 +#: ../gtk/setupwizard.c:418 msgid "" "Please validate your account by clicking on the link we just sent you by email.\n" "Then come back here and press Next button." msgstr "送信されたメールの本文内にあるリンクをクリックしてアカウントを有効にしてください。\nその後こちらへ戻って「次へ」を押してください。" -#: ../gtk/setupwizard.c:602 +#: ../gtk/setupwizard.c:609 msgid "SIP account configuration assistant" msgstr "SIPアカウント設定アシスタント" -#: ../gtk/setupwizard.c:620 +#: ../gtk/setupwizard.c:629 msgid "Welcome to the account setup assistant" msgstr "アカウント設定アシスタントへようこそ" -#: ../gtk/setupwizard.c:625 +#: ../gtk/setupwizard.c:634 msgid "Account setup assistant" msgstr "アカウント設定アシスタント" -#: ../gtk/setupwizard.c:631 +#: ../gtk/setupwizard.c:640 msgid "Configure your account (step 1/1)" msgstr "アカウントを設定します (1/1)" -#: ../gtk/setupwizard.c:636 +#: ../gtk/setupwizard.c:645 msgid "Enter your sip username (step 1/1)" msgstr "SIPのユーザー名を入力してください (1/1)" -#: ../gtk/setupwizard.c:640 +#: ../gtk/setupwizard.c:649 msgid "Enter account information (step 1/2)" msgstr "アカウント情報を入力してください (1/2)" -#: ../gtk/setupwizard.c:649 +#: ../gtk/setupwizard.c:658 msgid "Validation (step 2/2)" msgstr "検証します (2/2)" -#: ../gtk/setupwizard.c:654 +#: ../gtk/setupwizard.c:663 msgid "Error" msgstr "エラー" -#: ../gtk/setupwizard.c:658 ../gtk/audio_assistant.c:534 +#: ../gtk/setupwizard.c:667 ../gtk/audio_assistant.c:534 msgid "Terminating" msgstr "終了" @@ -1494,10 +1498,6 @@ msgstr "" msgid "Search somebody" msgstr "" -#: ../gtk/waiting.ui.h:1 -msgid "Linphone" -msgstr "Linphone" - #: ../gtk/waiting.ui.h:2 msgid "Please wait" msgstr "お待ちください" @@ -1697,68 +1697,68 @@ msgstr "" msgid "Please wait while fetching configuration from server..." msgstr "" -#: ../coreapi/linphonecore.c:1538 +#: ../coreapi/linphonecore.c:1539 msgid "Ready" msgstr "準備" -#: ../coreapi/linphonecore.c:2550 +#: ../coreapi/linphonecore.c:2551 msgid "Configuring" msgstr "" -#: ../coreapi/linphonecore.c:2724 +#: ../coreapi/linphonecore.c:2725 msgid "Looking for telephone number destination..." msgstr "" -#: ../coreapi/linphonecore.c:2726 +#: ../coreapi/linphonecore.c:2727 msgid "Could not resolve this number." msgstr "" #. must be known at that time -#: ../coreapi/linphonecore.c:3012 +#: ../coreapi/linphonecore.c:3013 msgid "Contacting" msgstr "" -#: ../coreapi/linphonecore.c:3017 +#: ../coreapi/linphonecore.c:3018 msgid "Could not call" msgstr "" -#: ../coreapi/linphonecore.c:3168 +#: ../coreapi/linphonecore.c:3169 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "" -#: ../coreapi/linphonecore.c:3326 +#: ../coreapi/linphonecore.c:3327 msgid "is contacting you" msgstr "" -#: ../coreapi/linphonecore.c:3327 +#: ../coreapi/linphonecore.c:3328 msgid " and asked autoanswer." msgstr "と自動応答を尋ねる" -#: ../coreapi/linphonecore.c:3451 +#: ../coreapi/linphonecore.c:3452 msgid "Modifying call parameters..." msgstr "コールパラメーターの変更..." -#: ../coreapi/linphonecore.c:3798 +#: ../coreapi/linphonecore.c:3802 msgid "Connected." msgstr "接続しました。" -#: ../coreapi/linphonecore.c:3823 +#: ../coreapi/linphonecore.c:3827 msgid "Call aborted" msgstr "呼び出しを打ち切る" -#: ../coreapi/linphonecore.c:4013 +#: ../coreapi/linphonecore.c:4024 msgid "Could not pause the call" msgstr "呼び出しを一時停止できませんでした" -#: ../coreapi/linphonecore.c:4016 +#: ../coreapi/linphonecore.c:4027 msgid "Pausing the current call..." msgstr "現在の通話を一時停止..." -#: ../coreapi/misc.c:433 +#: ../coreapi/misc.c:434 msgid "Stun lookup in progress..." msgstr "Stunによるルックアップの進行中…" -#: ../coreapi/misc.c:614 +#: ../coreapi/misc.c:615 msgid "ICE local candidates gathering in progress..." msgstr "" @@ -1843,100 +1843,100 @@ msgstr "" msgid "Early media." msgstr "Early media." -#: ../coreapi/callbacks.c:533 +#: ../coreapi/callbacks.c:534 #, c-format msgid "Call with %s is paused." msgstr "" -#: ../coreapi/callbacks.c:546 +#: ../coreapi/callbacks.c:547 #, c-format msgid "Call answered by %s - on hold." msgstr "" -#: ../coreapi/callbacks.c:556 +#: ../coreapi/callbacks.c:557 msgid "Call resumed." msgstr "" -#: ../coreapi/callbacks.c:560 +#: ../coreapi/callbacks.c:561 #, c-format msgid "Call answered by %s." msgstr "" -#: ../coreapi/callbacks.c:583 +#: ../coreapi/callbacks.c:584 msgid "Incompatible, check codecs or security settings..." msgstr "" -#: ../coreapi/callbacks.c:588 ../coreapi/callbacks.c:900 +#: ../coreapi/callbacks.c:589 ../coreapi/callbacks.c:906 msgid "Incompatible media parameters." msgstr "" -#: ../coreapi/callbacks.c:618 +#: ../coreapi/callbacks.c:619 msgid "We have been resumed." msgstr "" #. we are being paused -#: ../coreapi/callbacks.c:626 +#: ../coreapi/callbacks.c:628 msgid "We are paused by other party." msgstr "" #. reINVITE and in-dialogs UPDATE go here -#: ../coreapi/callbacks.c:660 +#: ../coreapi/callbacks.c:666 msgid "Call is updated by remote." msgstr "" -#: ../coreapi/callbacks.c:776 +#: ../coreapi/callbacks.c:782 msgid "Call terminated." msgstr "呼び出し終了。" -#: ../coreapi/callbacks.c:804 +#: ../coreapi/callbacks.c:810 msgid "User is busy." msgstr "相手はビジーです。" -#: ../coreapi/callbacks.c:805 +#: ../coreapi/callbacks.c:811 msgid "User is temporarily unavailable." msgstr "相手は、今出られません。" #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:807 +#: ../coreapi/callbacks.c:813 msgid "User does not want to be disturbed." msgstr "相手は手が離せないようです。" -#: ../coreapi/callbacks.c:808 +#: ../coreapi/callbacks.c:814 msgid "Call declined." msgstr "通話は拒否されました。" -#: ../coreapi/callbacks.c:823 +#: ../coreapi/callbacks.c:829 msgid "Request timeout." msgstr "リクエストは時間切れです。" -#: ../coreapi/callbacks.c:854 +#: ../coreapi/callbacks.c:860 msgid "Redirected" msgstr "" -#: ../coreapi/callbacks.c:909 +#: ../coreapi/callbacks.c:915 msgid "Call failed." msgstr "" -#: ../coreapi/callbacks.c:987 +#: ../coreapi/callbacks.c:993 #, c-format msgid "Registration on %s successful." msgstr "" -#: ../coreapi/callbacks.c:988 +#: ../coreapi/callbacks.c:994 #, c-format msgid "Unregistration on %s done." msgstr "" -#: ../coreapi/callbacks.c:1006 +#: ../coreapi/callbacks.c:1012 msgid "no response timeout" msgstr "" -#: ../coreapi/callbacks.c:1009 +#: ../coreapi/callbacks.c:1015 #, c-format msgid "Registration on %s failed: %s" msgstr "" -#: ../coreapi/callbacks.c:1016 +#: ../coreapi/callbacks.c:1022 msgid "Service unavailable, retrying" msgstr "" @@ -1946,11 +1946,11 @@ msgstr "" msgid "Authentication token is %s" msgstr "" -#: ../coreapi/linphonecall.c:1306 +#: ../coreapi/linphonecall.c:1310 msgid "Call parameters were successfully modified." msgstr "" -#: ../coreapi/linphonecall.c:3660 +#: ../coreapi/linphonecall.c:3686 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." diff --git a/po/nb_NO.po b/po/nb_NO.po index a59e02e36..0d6edd4df 100644 --- a/po/nb_NO.po +++ b/po/nb_NO.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: linphone-gtk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-04-01 16:25+0200\n" -"PO-Revision-Date: 2015-04-01 14:26+0000\n" +"POT-Creation-Date: 2015-04-30 10:13+0200\n" +"PO-Revision-Date: 2015-04-30 08:13+0000\n" "Last-Translator: Belledonne Communications \n" "Language-Team: Norwegian Bokmål (Norway) (http://www.transifex.com/projects/p/linphone-gtk/language/nb_NO/)\n" "MIME-Version: 1.0\n" @@ -88,45 +88,45 @@ msgstr "" msgid "Couldn't find pixmap file: %s" msgstr "Fant ikke pixmap fli: %s" -#: ../gtk/main.c:136 +#: ../gtk/main.c:137 msgid "log to stdout some debug information while running." msgstr "skriv logg-informasjon under kjøring" -#: ../gtk/main.c:137 +#: ../gtk/main.c:138 msgid "path to a file to write logs into." msgstr "" -#: ../gtk/main.c:138 +#: ../gtk/main.c:139 msgid "Start linphone with video disabled." msgstr "" -#: ../gtk/main.c:139 +#: ../gtk/main.c:140 msgid "Start only in the system tray, do not show the main interface." msgstr "Start skjult i systemkurven, ikke vis programbildet." -#: ../gtk/main.c:140 +#: ../gtk/main.c:141 msgid "address to call right now" msgstr "address som skal ringes nå" -#: ../gtk/main.c:141 +#: ../gtk/main.c:142 msgid "" "Specifiy a working directory (should be the base of the installation, eg: " "c:\\Program Files\\Linphone)" msgstr "Spesifiser arbeidsmappe (bør være base for installasjonen, f.eks: c:\\Programfiler\\Linphone)" -#: ../gtk/main.c:142 +#: ../gtk/main.c:143 msgid "Configuration file" msgstr "" -#: ../gtk/main.c:143 +#: ../gtk/main.c:144 msgid "Run the audio assistant" msgstr "" -#: ../gtk/main.c:144 +#: ../gtk/main.c:145 msgid "Run self test and exit 0 if succeed" msgstr "" -#: ../gtk/main.c:1069 +#: ../gtk/main.c:1070 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -134,76 +134,80 @@ msgid "" "If you answer no, this person will be temporarily blacklisted." msgstr "%s vil legge deg til i hans/hennes kontaktliste.\nVil du tillate vedkommende å se din tilstedestatus eller legge vedkommende i din kontaktliste?\nHvis du svarer nei vil personen bli svartelyst midlertidig." -#: ../gtk/main.c:1146 +#: ../gtk/main.c:1147 #, c-format msgid "" "Please enter your password for username %s\n" " at realm %s:" msgstr "" -#: ../gtk/main.c:1267 +#: ../gtk/main.c:1268 msgid "Call error" msgstr "" -#: ../gtk/main.c:1270 ../coreapi/linphonecore.c:3842 +#: ../gtk/main.c:1271 ../coreapi/linphonecore.c:3846 msgid "Call ended" msgstr "Samtale avsluttet" -#: ../gtk/main.c:1273 ../coreapi/call_log.c:221 +#: ../gtk/main.c:1274 ../coreapi/call_log.c:221 msgid "Incoming call" msgstr "Innkommende samtale" -#: ../gtk/main.c:1275 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 +#: ../gtk/main.c:1276 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 msgid "Answer" msgstr "Svarer" -#: ../gtk/main.c:1277 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1278 ../gtk/main.ui.h:6 msgid "Decline" msgstr "Avvis" -#: ../gtk/main.c:1283 +#: ../gtk/main.c:1284 msgid "Call paused" msgstr "" -#: ../gtk/main.c:1283 +#: ../gtk/main.c:1284 #, c-format msgid "by %s" msgstr "" -#: ../gtk/main.c:1353 +#: ../gtk/main.c:1354 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1516 +#: ../gtk/main.c:1509 msgid "Website link" msgstr "Peker til nettsted" -#: ../gtk/main.c:1565 -msgid "Linphone - a video internet phone" -msgstr "Linphone - en video Internet telefon" +#: ../gtk/main.c:1568 ../gtk/waiting.ui.h:1 +msgid "Linphone" +msgstr "Linphone" -#: ../gtk/main.c:1657 +#: ../gtk/main.c:1569 +msgid "A video internet phone" +msgstr "" + +#: ../gtk/main.c:1629 #, c-format msgid "%s (Default)" msgstr "%s (Standard)" -#: ../gtk/main.c:1989 ../coreapi/callbacks.c:1057 +#: ../gtk/main.c:1962 ../coreapi/callbacks.c:1063 #, c-format msgid "We are transferred to %s" msgstr "Vi er overført til %s" -#: ../gtk/main.c:1999 +#: ../gtk/main.c:1972 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." msgstr "Klarte ikke å finne noe lydkort på denne datamaskinen.\nDu vil ikke kunne sende eller motta lydsamtaler." -#: ../gtk/main.c:2147 +#: ../gtk/main.c:2117 msgid "A free SIP video-phone" msgstr "En gratis SIP video-telefon" -#: ../gtk/main.c:2252 +#: ../gtk/main.c:2221 #, c-format msgid "Hello\n" msgstr "" @@ -216,7 +220,7 @@ msgstr "" msgid "Presence status" msgstr "Tilstedestatus" -#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:552 ../gtk/contact.ui.h:1 +#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:569 ../gtk/contact.ui.h:1 msgid "Name" msgstr "Navn" @@ -257,124 +261,124 @@ msgstr "" msgid "Add new contact from %s directory" msgstr "Legg til kontakt fra %s katalogen" -#: ../gtk/propertybox.c:558 +#: ../gtk/propertybox.c:575 msgid "Rate (Hz)" msgstr "Frekvens (Hz)" -#: ../gtk/propertybox.c:564 +#: ../gtk/propertybox.c:581 msgid "Status" msgstr "Status" -#: ../gtk/propertybox.c:570 +#: ../gtk/propertybox.c:587 msgid "IP Bitrate (kbit/s)" msgstr "" -#: ../gtk/propertybox.c:577 +#: ../gtk/propertybox.c:596 msgid "Parameters" msgstr "Parametere" -#: ../gtk/propertybox.c:620 ../gtk/propertybox.c:763 +#: ../gtk/propertybox.c:639 ../gtk/propertybox.c:782 msgid "Enabled" msgstr "På" -#: ../gtk/propertybox.c:622 ../gtk/propertybox.c:763 ../gtk/parameters.ui.h:20 +#: ../gtk/propertybox.c:641 ../gtk/propertybox.c:782 ../gtk/parameters.ui.h:20 msgid "Disabled" msgstr "Av" -#: ../gtk/propertybox.c:809 +#: ../gtk/propertybox.c:828 msgid "Account" msgstr "Konto" -#: ../gtk/propertybox.c:1072 +#: ../gtk/propertybox.c:1091 msgid "English" msgstr "Engelsk" -#: ../gtk/propertybox.c:1073 +#: ../gtk/propertybox.c:1092 msgid "French" msgstr "Fransk" -#: ../gtk/propertybox.c:1074 +#: ../gtk/propertybox.c:1093 msgid "Swedish" msgstr "Svensk" -#: ../gtk/propertybox.c:1075 +#: ../gtk/propertybox.c:1094 msgid "Italian" msgstr "Italisensk" -#: ../gtk/propertybox.c:1076 +#: ../gtk/propertybox.c:1095 msgid "Spanish" msgstr "Spansk" -#: ../gtk/propertybox.c:1077 +#: ../gtk/propertybox.c:1096 msgid "Brazilian Portugese" msgstr "Portugisisk" -#: ../gtk/propertybox.c:1078 +#: ../gtk/propertybox.c:1097 msgid "Polish" msgstr "Polsk" -#: ../gtk/propertybox.c:1079 +#: ../gtk/propertybox.c:1098 msgid "German" msgstr "Tysk" -#: ../gtk/propertybox.c:1080 +#: ../gtk/propertybox.c:1099 msgid "Russian" msgstr "Russisk" -#: ../gtk/propertybox.c:1081 +#: ../gtk/propertybox.c:1100 msgid "Japanese" msgstr "Japansk" -#: ../gtk/propertybox.c:1082 +#: ../gtk/propertybox.c:1101 msgid "Dutch" msgstr "Nederlandsk" -#: ../gtk/propertybox.c:1083 +#: ../gtk/propertybox.c:1102 msgid "Hungarian" msgstr "Ungarsk" -#: ../gtk/propertybox.c:1084 +#: ../gtk/propertybox.c:1103 msgid "Czech" msgstr "Tjekkisk" -#: ../gtk/propertybox.c:1085 +#: ../gtk/propertybox.c:1104 msgid "Chinese" msgstr "Kinesisk" -#: ../gtk/propertybox.c:1086 +#: ../gtk/propertybox.c:1105 msgid "Traditional Chinese" msgstr "" -#: ../gtk/propertybox.c:1087 +#: ../gtk/propertybox.c:1106 msgid "Norwegian" msgstr "" -#: ../gtk/propertybox.c:1088 +#: ../gtk/propertybox.c:1107 msgid "Hebrew" msgstr "" -#: ../gtk/propertybox.c:1089 +#: ../gtk/propertybox.c:1108 msgid "Serbian" msgstr "" -#: ../gtk/propertybox.c:1156 +#: ../gtk/propertybox.c:1175 msgid "" "You need to restart linphone for the new language selection to take effect." msgstr "Du må restarte linphone for at det nye språkvalget skal iverksettes." -#: ../gtk/propertybox.c:1236 +#: ../gtk/propertybox.c:1255 msgid "None" msgstr "" -#: ../gtk/propertybox.c:1240 +#: ../gtk/propertybox.c:1259 msgid "SRTP" msgstr "" -#: ../gtk/propertybox.c:1246 +#: ../gtk/propertybox.c:1265 msgid "DTLS" msgstr "" -#: ../gtk/propertybox.c:1253 +#: ../gtk/propertybox.c:1272 msgid "ZRTP" msgstr "" @@ -416,133 +420,133 @@ msgid_plural "Found %i contacts" msgstr[0] "Fant kontakt %i" msgstr[1] "Hittat kontakt %i" -#: ../gtk/setupwizard.c:34 +#: ../gtk/setupwizard.c:32 msgid "" "Welcome!\n" "This assistant will help you to use a SIP account for your calls." msgstr "" -#: ../gtk/setupwizard.c:43 +#: ../gtk/setupwizard.c:41 msgid "Create an account on linphone.org" msgstr "" -#: ../gtk/setupwizard.c:44 +#: ../gtk/setupwizard.c:42 msgid "I have already a linphone.org account and I just want to use it" msgstr "" -#: ../gtk/setupwizard.c:45 +#: ../gtk/setupwizard.c:43 msgid "I have already a sip account and I just want to use it" msgstr "" -#: ../gtk/setupwizard.c:46 +#: ../gtk/setupwizard.c:44 msgid "I want to specify a remote configuration URI" msgstr "" -#: ../gtk/setupwizard.c:89 +#: ../gtk/setupwizard.c:87 msgid "Enter your linphone.org username" msgstr "" -#: ../gtk/setupwizard.c:102 ../gtk/parameters.ui.h:85 ../gtk/ldap.ui.h:4 +#: ../gtk/setupwizard.c:100 ../gtk/parameters.ui.h:85 ../gtk/ldap.ui.h:4 msgid "Username:" msgstr "Brukernavn:" -#: ../gtk/setupwizard.c:104 ../gtk/password.ui.h:4 ../gtk/ldap.ui.h:5 +#: ../gtk/setupwizard.c:102 ../gtk/password.ui.h:4 ../gtk/ldap.ui.h:5 msgid "Password:" msgstr "Passord:" -#: ../gtk/setupwizard.c:124 +#: ../gtk/setupwizard.c:122 msgid "Enter your account informations" msgstr "" -#: ../gtk/setupwizard.c:140 +#: ../gtk/setupwizard.c:138 msgid "Username*" msgstr "" -#: ../gtk/setupwizard.c:141 +#: ../gtk/setupwizard.c:139 msgid "Password*" msgstr "" -#: ../gtk/setupwizard.c:144 +#: ../gtk/setupwizard.c:142 msgid "Domain*" msgstr "" -#: ../gtk/setupwizard.c:145 +#: ../gtk/setupwizard.c:143 msgid "Proxy" msgstr "" -#: ../gtk/setupwizard.c:317 +#: ../gtk/setupwizard.c:322 msgid "(*) Required fields" msgstr "" -#: ../gtk/setupwizard.c:318 +#: ../gtk/setupwizard.c:323 msgid "Username: (*)" msgstr "" -#: ../gtk/setupwizard.c:320 +#: ../gtk/setupwizard.c:325 msgid "Password: (*)" msgstr "" -#: ../gtk/setupwizard.c:322 +#: ../gtk/setupwizard.c:327 msgid "Email: (*)" msgstr "" -#: ../gtk/setupwizard.c:324 +#: ../gtk/setupwizard.c:329 msgid "Confirm your password: (*)" msgstr "" -#: ../gtk/setupwizard.c:338 +#: ../gtk/setupwizard.c:343 msgid "Keep me informed with linphone updates" msgstr "" -#: ../gtk/setupwizard.c:394 +#: ../gtk/setupwizard.c:399 msgid "" "Error, account not validated, username already used or server unreachable.\n" "Please go back and try again." msgstr "" -#: ../gtk/setupwizard.c:405 +#: ../gtk/setupwizard.c:410 msgid "Thank you. Your account is now configured and ready for use." msgstr "Takk. Ditt konto er nå satt opp og klart til bruk." -#: ../gtk/setupwizard.c:413 +#: ../gtk/setupwizard.c:418 msgid "" "Please validate your account by clicking on the link we just sent you by email.\n" "Then come back here and press Next button." msgstr "" -#: ../gtk/setupwizard.c:602 +#: ../gtk/setupwizard.c:609 msgid "SIP account configuration assistant" msgstr "" -#: ../gtk/setupwizard.c:620 +#: ../gtk/setupwizard.c:629 msgid "Welcome to the account setup assistant" msgstr "Velkommen til brukerkontoveiviseren" -#: ../gtk/setupwizard.c:625 +#: ../gtk/setupwizard.c:634 msgid "Account setup assistant" msgstr "Brukerkontoveiviser" -#: ../gtk/setupwizard.c:631 +#: ../gtk/setupwizard.c:640 msgid "Configure your account (step 1/1)" msgstr "" -#: ../gtk/setupwizard.c:636 +#: ../gtk/setupwizard.c:645 msgid "Enter your sip username (step 1/1)" msgstr "" -#: ../gtk/setupwizard.c:640 +#: ../gtk/setupwizard.c:649 msgid "Enter account information (step 1/2)" msgstr "" -#: ../gtk/setupwizard.c:649 +#: ../gtk/setupwizard.c:658 msgid "Validation (step 2/2)" msgstr "" -#: ../gtk/setupwizard.c:654 +#: ../gtk/setupwizard.c:663 msgid "Error" msgstr "" -#: ../gtk/setupwizard.c:658 ../gtk/audio_assistant.c:534 +#: ../gtk/setupwizard.c:667 ../gtk/audio_assistant.c:534 msgid "Terminating" msgstr "" @@ -1496,10 +1500,6 @@ msgstr "Legg til listen min" msgid "Search somebody" msgstr "Søk noen" -#: ../gtk/waiting.ui.h:1 -msgid "Linphone" -msgstr "Linphone" - #: ../gtk/waiting.ui.h:2 msgid "Please wait" msgstr "Vennligst vent" @@ -1699,68 +1699,68 @@ msgstr "" msgid "Please wait while fetching configuration from server..." msgstr "" -#: ../coreapi/linphonecore.c:1538 +#: ../coreapi/linphonecore.c:1539 msgid "Ready" msgstr "Klar" -#: ../coreapi/linphonecore.c:2550 +#: ../coreapi/linphonecore.c:2551 msgid "Configuring" msgstr "" -#: ../coreapi/linphonecore.c:2724 +#: ../coreapi/linphonecore.c:2725 msgid "Looking for telephone number destination..." msgstr "Ser etter telefonnummer for destinasjonen..." -#: ../coreapi/linphonecore.c:2726 +#: ../coreapi/linphonecore.c:2727 msgid "Could not resolve this number." msgstr "Kan ikke tilkoble dette nummeret." #. must be known at that time -#: ../coreapi/linphonecore.c:3012 +#: ../coreapi/linphonecore.c:3013 msgid "Contacting" msgstr "Tilknytter" -#: ../coreapi/linphonecore.c:3017 +#: ../coreapi/linphonecore.c:3018 msgid "Could not call" msgstr "Kunne ikke ringe" -#: ../coreapi/linphonecore.c:3168 +#: ../coreapi/linphonecore.c:3169 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "Beklager, du har nådd maksimalt antall samtidige samtaler" -#: ../coreapi/linphonecore.c:3326 +#: ../coreapi/linphonecore.c:3327 msgid "is contacting you" msgstr "Kontakter deg." -#: ../coreapi/linphonecore.c:3327 +#: ../coreapi/linphonecore.c:3328 msgid " and asked autoanswer." msgstr " og ba om autosvar." -#: ../coreapi/linphonecore.c:3451 +#: ../coreapi/linphonecore.c:3452 msgid "Modifying call parameters..." msgstr "Endrer ringeparametre..." -#: ../coreapi/linphonecore.c:3798 +#: ../coreapi/linphonecore.c:3802 msgid "Connected." msgstr "Tilkoblet" -#: ../coreapi/linphonecore.c:3823 +#: ../coreapi/linphonecore.c:3827 msgid "Call aborted" msgstr "Samtale avbrutt" -#: ../coreapi/linphonecore.c:4013 +#: ../coreapi/linphonecore.c:4024 msgid "Could not pause the call" msgstr "Kunne ikke pause samtalen" -#: ../coreapi/linphonecore.c:4016 +#: ../coreapi/linphonecore.c:4027 msgid "Pausing the current call..." msgstr "Pauser nåværende samtale" -#: ../coreapi/misc.c:433 +#: ../coreapi/misc.c:434 msgid "Stun lookup in progress..." msgstr "STUN oppslag pågår..." -#: ../coreapi/misc.c:614 +#: ../coreapi/misc.c:615 msgid "ICE local candidates gathering in progress..." msgstr "" @@ -1845,100 +1845,100 @@ msgstr "" msgid "Early media." msgstr "Tidlig media" -#: ../coreapi/callbacks.c:533 +#: ../coreapi/callbacks.c:534 #, c-format msgid "Call with %s is paused." msgstr "Samtalen med %s er pauset." -#: ../coreapi/callbacks.c:546 +#: ../coreapi/callbacks.c:547 #, c-format msgid "Call answered by %s - on hold." msgstr "Samtale besvart av %s - på vent." -#: ../coreapi/callbacks.c:556 +#: ../coreapi/callbacks.c:557 msgid "Call resumed." msgstr "Samtale gjenopptatt." -#: ../coreapi/callbacks.c:560 +#: ../coreapi/callbacks.c:561 #, c-format msgid "Call answered by %s." msgstr "Samtale besvart av %s." -#: ../coreapi/callbacks.c:583 +#: ../coreapi/callbacks.c:584 msgid "Incompatible, check codecs or security settings..." msgstr "" -#: ../coreapi/callbacks.c:588 ../coreapi/callbacks.c:900 +#: ../coreapi/callbacks.c:589 ../coreapi/callbacks.c:906 msgid "Incompatible media parameters." msgstr "" -#: ../coreapi/callbacks.c:618 +#: ../coreapi/callbacks.c:619 msgid "We have been resumed." msgstr "" #. we are being paused -#: ../coreapi/callbacks.c:626 +#: ../coreapi/callbacks.c:628 msgid "We are paused by other party." msgstr "" #. reINVITE and in-dialogs UPDATE go here -#: ../coreapi/callbacks.c:660 +#: ../coreapi/callbacks.c:666 msgid "Call is updated by remote." msgstr "" -#: ../coreapi/callbacks.c:776 +#: ../coreapi/callbacks.c:782 msgid "Call terminated." msgstr "Samtale avsluttet." -#: ../coreapi/callbacks.c:804 +#: ../coreapi/callbacks.c:810 msgid "User is busy." msgstr "Brukeren er opptatt." -#: ../coreapi/callbacks.c:805 +#: ../coreapi/callbacks.c:811 msgid "User is temporarily unavailable." msgstr "Brukeren er midlertidig ikke tilgjengelig." #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:807 +#: ../coreapi/callbacks.c:813 msgid "User does not want to be disturbed." msgstr "Brukeren vil ikke bli forstyrret." -#: ../coreapi/callbacks.c:808 +#: ../coreapi/callbacks.c:814 msgid "Call declined." msgstr "Samtale avvist." -#: ../coreapi/callbacks.c:823 +#: ../coreapi/callbacks.c:829 msgid "Request timeout." msgstr "" -#: ../coreapi/callbacks.c:854 +#: ../coreapi/callbacks.c:860 msgid "Redirected" msgstr "Omdirigert" -#: ../coreapi/callbacks.c:909 +#: ../coreapi/callbacks.c:915 msgid "Call failed." msgstr "Samtale feilet." -#: ../coreapi/callbacks.c:987 +#: ../coreapi/callbacks.c:993 #, c-format msgid "Registration on %s successful." msgstr "Registrering hos %s lykkes." -#: ../coreapi/callbacks.c:988 +#: ../coreapi/callbacks.c:994 #, c-format msgid "Unregistration on %s done." msgstr "Avregistrering hos %s lykkes." -#: ../coreapi/callbacks.c:1006 +#: ../coreapi/callbacks.c:1012 msgid "no response timeout" msgstr "ingen svar innen angitt tid" -#: ../coreapi/callbacks.c:1009 +#: ../coreapi/callbacks.c:1015 #, c-format msgid "Registration on %s failed: %s" msgstr "Registrering hos %s mislykkes: %s" -#: ../coreapi/callbacks.c:1016 +#: ../coreapi/callbacks.c:1022 msgid "Service unavailable, retrying" msgstr "" @@ -1948,11 +1948,11 @@ msgstr "" msgid "Authentication token is %s" msgstr "" -#: ../coreapi/linphonecall.c:1306 +#: ../coreapi/linphonecall.c:1310 msgid "Call parameters were successfully modified." msgstr "" -#: ../coreapi/linphonecall.c:3660 +#: ../coreapi/linphonecall.c:3686 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." diff --git a/po/nl.po b/po/nl.po index 8f445639d..98034aaaf 100644 --- a/po/nl.po +++ b/po/nl.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: linphone-gtk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-04-01 16:25+0200\n" -"PO-Revision-Date: 2015-04-01 14:26+0000\n" +"POT-Creation-Date: 2015-04-30 10:13+0200\n" +"PO-Revision-Date: 2015-04-30 08:13+0000\n" "Last-Translator: Belledonne Communications \n" "Language-Team: Dutch (http://www.transifex.com/projects/p/linphone-gtk/language/nl/)\n" "MIME-Version: 1.0\n" @@ -88,45 +88,45 @@ msgstr "Ik" msgid "Couldn't find pixmap file: %s" msgstr "Het pixmap-bestand %s kon niet worden gevonden" -#: ../gtk/main.c:136 +#: ../gtk/main.c:137 msgid "log to stdout some debug information while running." msgstr "loggen naar stdout om wat foutopsporingsinformatie te verkrijgen tijdens uitvoeren." -#: ../gtk/main.c:137 +#: ../gtk/main.c:138 msgid "path to a file to write logs into." msgstr "Pad naar een bestand om logbestanden heen te schrijven." -#: ../gtk/main.c:138 +#: ../gtk/main.c:139 msgid "Start linphone with video disabled." msgstr "Linphone opstarten met uitgeschakelde video." -#: ../gtk/main.c:139 +#: ../gtk/main.c:140 msgid "Start only in the system tray, do not show the main interface." msgstr "Alleen in het systeemvak opstarten, niet met venster en al." -#: ../gtk/main.c:140 +#: ../gtk/main.c:141 msgid "address to call right now" msgstr "adres om nu naar toe te bellen" -#: ../gtk/main.c:141 +#: ../gtk/main.c:142 msgid "" "Specifiy a working directory (should be the base of the installation, eg: " "c:\\Program Files\\Linphone)" msgstr "Specificeer een werkmap (dit moet de basis van uw installatie zijn, bijv.: C:\\Program Files\\Linphone)" -#: ../gtk/main.c:142 +#: ../gtk/main.c:143 msgid "Configuration file" msgstr "Configuratiebestand" -#: ../gtk/main.c:143 +#: ../gtk/main.c:144 msgid "Run the audio assistant" msgstr "Doorloop de audio-instelwizard" -#: ../gtk/main.c:144 +#: ../gtk/main.c:145 msgid "Run self test and exit 0 if succeed" msgstr "Draai een zelftest en exit 0 wanneer succesvol" -#: ../gtk/main.c:1069 +#: ../gtk/main.c:1070 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -134,76 +134,80 @@ msgid "" "If you answer no, this person will be temporarily blacklisted." msgstr "%s wil u toevoegen aan zijn/haar contactpersonenlijst.\nWilt u toestaan dat hij/zij uw aanwezigheidsstatus ziet of hem/haar toevoegen aan uw contactpersonenljst?\nIndien u nee antwoordt, zal deze persoon tijdelijk op de zwarte lijst worden gezet." -#: ../gtk/main.c:1146 +#: ../gtk/main.c:1147 #, c-format msgid "" "Please enter your password for username %s\n" " at realm %s:" msgstr "Vul uw wachtwoord in voor gebruikersnaam %s\nop realm %s" -#: ../gtk/main.c:1267 +#: ../gtk/main.c:1268 msgid "Call error" msgstr "Oproepfout" -#: ../gtk/main.c:1270 ../coreapi/linphonecore.c:3842 +#: ../gtk/main.c:1271 ../coreapi/linphonecore.c:3846 msgid "Call ended" msgstr "Oproep beëindigd" -#: ../gtk/main.c:1273 ../coreapi/call_log.c:221 +#: ../gtk/main.c:1274 ../coreapi/call_log.c:221 msgid "Incoming call" msgstr "Inkomende oproep" -#: ../gtk/main.c:1275 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 +#: ../gtk/main.c:1276 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 msgid "Answer" msgstr "Opnemen" -#: ../gtk/main.c:1277 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1278 ../gtk/main.ui.h:6 msgid "Decline" msgstr "Weigeren" -#: ../gtk/main.c:1283 +#: ../gtk/main.c:1284 msgid "Call paused" msgstr "Oproep gepauzeerd" -#: ../gtk/main.c:1283 +#: ../gtk/main.c:1284 #, c-format msgid "by %s" msgstr "door %s" -#: ../gtk/main.c:1353 +#: ../gtk/main.c:1354 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "%s stelt u voor om video in te schakelen. Wilt u dit accepteren?" -#: ../gtk/main.c:1516 +#: ../gtk/main.c:1509 msgid "Website link" msgstr "Websitelink" -#: ../gtk/main.c:1565 -msgid "Linphone - a video internet phone" -msgstr "Linphone - een video-internettelefoon" +#: ../gtk/main.c:1568 ../gtk/waiting.ui.h:1 +msgid "Linphone" +msgstr "Linphone" -#: ../gtk/main.c:1657 +#: ../gtk/main.c:1569 +msgid "A video internet phone" +msgstr "" + +#: ../gtk/main.c:1629 #, c-format msgid "%s (Default)" msgstr "%s (Standaard)" -#: ../gtk/main.c:1989 ../coreapi/callbacks.c:1057 +#: ../gtk/main.c:1962 ../coreapi/callbacks.c:1063 #, c-format msgid "We are transferred to %s" msgstr "We zijn overgeschakeld naar %s" -#: ../gtk/main.c:1999 +#: ../gtk/main.c:1972 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." msgstr "Er zijn geluidskaarten aangetroffen op deze computer.\nU zult niet in staat zijn om audio-oproepen te ontvangen of versturen." -#: ../gtk/main.c:2147 +#: ../gtk/main.c:2117 msgid "A free SIP video-phone" msgstr "Een gratis SIP-videotelefoon" -#: ../gtk/main.c:2252 +#: ../gtk/main.c:2221 #, c-format msgid "Hello\n" msgstr "" @@ -216,7 +220,7 @@ msgstr "Toevoegen aan adresboek" msgid "Presence status" msgstr "Aanwezigheidsstatus" -#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:552 ../gtk/contact.ui.h:1 +#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:569 ../gtk/contact.ui.h:1 msgid "Name" msgstr "Naam" @@ -257,124 +261,124 @@ msgstr "Chatgeschiedenis van '%s' verwijderen" msgid "Add new contact from %s directory" msgstr "Nieuw contactpersoon toevoegen vanuit de map %s" -#: ../gtk/propertybox.c:558 +#: ../gtk/propertybox.c:575 msgid "Rate (Hz)" msgstr "Frequentie (Hz)" -#: ../gtk/propertybox.c:564 +#: ../gtk/propertybox.c:581 msgid "Status" msgstr "Status" -#: ../gtk/propertybox.c:570 +#: ../gtk/propertybox.c:587 msgid "IP Bitrate (kbit/s)" msgstr "IP-bitrate (kbit/s)" -#: ../gtk/propertybox.c:577 +#: ../gtk/propertybox.c:596 msgid "Parameters" msgstr "Argumenten" -#: ../gtk/propertybox.c:620 ../gtk/propertybox.c:763 +#: ../gtk/propertybox.c:639 ../gtk/propertybox.c:782 msgid "Enabled" msgstr "Ingeschakeld" -#: ../gtk/propertybox.c:622 ../gtk/propertybox.c:763 ../gtk/parameters.ui.h:20 +#: ../gtk/propertybox.c:641 ../gtk/propertybox.c:782 ../gtk/parameters.ui.h:20 msgid "Disabled" msgstr "Uitgeschakeld" -#: ../gtk/propertybox.c:809 +#: ../gtk/propertybox.c:828 msgid "Account" msgstr "Account" -#: ../gtk/propertybox.c:1072 +#: ../gtk/propertybox.c:1091 msgid "English" msgstr "Engels" -#: ../gtk/propertybox.c:1073 +#: ../gtk/propertybox.c:1092 msgid "French" msgstr "Frans" -#: ../gtk/propertybox.c:1074 +#: ../gtk/propertybox.c:1093 msgid "Swedish" msgstr "Zweeds" -#: ../gtk/propertybox.c:1075 +#: ../gtk/propertybox.c:1094 msgid "Italian" msgstr "Italiaans" -#: ../gtk/propertybox.c:1076 +#: ../gtk/propertybox.c:1095 msgid "Spanish" msgstr "Spaans" -#: ../gtk/propertybox.c:1077 +#: ../gtk/propertybox.c:1096 msgid "Brazilian Portugese" msgstr "Braziliaans Portugees" -#: ../gtk/propertybox.c:1078 +#: ../gtk/propertybox.c:1097 msgid "Polish" msgstr "Pools" -#: ../gtk/propertybox.c:1079 +#: ../gtk/propertybox.c:1098 msgid "German" msgstr "Duits" -#: ../gtk/propertybox.c:1080 +#: ../gtk/propertybox.c:1099 msgid "Russian" msgstr "Russisch" -#: ../gtk/propertybox.c:1081 +#: ../gtk/propertybox.c:1100 msgid "Japanese" msgstr "Japans" -#: ../gtk/propertybox.c:1082 +#: ../gtk/propertybox.c:1101 msgid "Dutch" msgstr "Nederlands" -#: ../gtk/propertybox.c:1083 +#: ../gtk/propertybox.c:1102 msgid "Hungarian" msgstr "Hongaars" -#: ../gtk/propertybox.c:1084 +#: ../gtk/propertybox.c:1103 msgid "Czech" msgstr "Tjechisch" -#: ../gtk/propertybox.c:1085 +#: ../gtk/propertybox.c:1104 msgid "Chinese" msgstr "Chinees" -#: ../gtk/propertybox.c:1086 +#: ../gtk/propertybox.c:1105 msgid "Traditional Chinese" msgstr "Traditioneel Chinees" -#: ../gtk/propertybox.c:1087 +#: ../gtk/propertybox.c:1106 msgid "Norwegian" msgstr "Noors" -#: ../gtk/propertybox.c:1088 +#: ../gtk/propertybox.c:1107 msgid "Hebrew" msgstr "Hebreeuws" -#: ../gtk/propertybox.c:1089 +#: ../gtk/propertybox.c:1108 msgid "Serbian" msgstr "Servisch" -#: ../gtk/propertybox.c:1156 +#: ../gtk/propertybox.c:1175 msgid "" "You need to restart linphone for the new language selection to take effect." msgstr "U moet linphone herstarten om de nieuw geselecteerde taal toe te passen." -#: ../gtk/propertybox.c:1236 +#: ../gtk/propertybox.c:1255 msgid "None" msgstr "Geen" -#: ../gtk/propertybox.c:1240 +#: ../gtk/propertybox.c:1259 msgid "SRTP" msgstr "SRTP" -#: ../gtk/propertybox.c:1246 +#: ../gtk/propertybox.c:1265 msgid "DTLS" msgstr "DTLS" -#: ../gtk/propertybox.c:1253 +#: ../gtk/propertybox.c:1272 msgid "ZRTP" msgstr "ZRTP" @@ -416,133 +420,133 @@ msgid_plural "Found %i contacts" msgstr[0] "%i contactpersoon gevonden" msgstr[1] "%i contactpersonen gevonden" -#: ../gtk/setupwizard.c:34 +#: ../gtk/setupwizard.c:32 msgid "" "Welcome!\n" "This assistant will help you to use a SIP account for your calls." msgstr "Welkom!\nDeze instelwizard zal u begeleiden bij het gebruiken van een SIP-account voor oproepen." -#: ../gtk/setupwizard.c:43 +#: ../gtk/setupwizard.c:41 msgid "Create an account on linphone.org" msgstr "Creëer een account op linphone.org" -#: ../gtk/setupwizard.c:44 +#: ../gtk/setupwizard.c:42 msgid "I have already a linphone.org account and I just want to use it" msgstr "Ik heb al een linphone.org-account en wil deze graag gebruiken" -#: ../gtk/setupwizard.c:45 +#: ../gtk/setupwizard.c:43 msgid "I have already a sip account and I just want to use it" msgstr "Ik heb al een SIP-account en wil deze graag gebruiken" -#: ../gtk/setupwizard.c:46 +#: ../gtk/setupwizard.c:44 msgid "I want to specify a remote configuration URI" msgstr "Ik wil een externe URI-configuratie opgeven" -#: ../gtk/setupwizard.c:89 +#: ../gtk/setupwizard.c:87 msgid "Enter your linphone.org username" msgstr "Vul uw linphone.org-gebruikersnaam in" -#: ../gtk/setupwizard.c:102 ../gtk/parameters.ui.h:85 ../gtk/ldap.ui.h:4 +#: ../gtk/setupwizard.c:100 ../gtk/parameters.ui.h:85 ../gtk/ldap.ui.h:4 msgid "Username:" msgstr "Gebruikersnaam:" -#: ../gtk/setupwizard.c:104 ../gtk/password.ui.h:4 ../gtk/ldap.ui.h:5 +#: ../gtk/setupwizard.c:102 ../gtk/password.ui.h:4 ../gtk/ldap.ui.h:5 msgid "Password:" msgstr "Wachtwoord:" -#: ../gtk/setupwizard.c:124 +#: ../gtk/setupwizard.c:122 msgid "Enter your account informations" msgstr "Vul uw accountinformatie in" -#: ../gtk/setupwizard.c:140 +#: ../gtk/setupwizard.c:138 msgid "Username*" msgstr "Gebruikersnaam*" -#: ../gtk/setupwizard.c:141 +#: ../gtk/setupwizard.c:139 msgid "Password*" msgstr "Wachtwoord*" -#: ../gtk/setupwizard.c:144 +#: ../gtk/setupwizard.c:142 msgid "Domain*" msgstr "Domeinnaam*" -#: ../gtk/setupwizard.c:145 +#: ../gtk/setupwizard.c:143 msgid "Proxy" msgstr "Proxy" -#: ../gtk/setupwizard.c:317 +#: ../gtk/setupwizard.c:322 msgid "(*) Required fields" msgstr "(*) Verplichte velden" -#: ../gtk/setupwizard.c:318 +#: ../gtk/setupwizard.c:323 msgid "Username: (*)" msgstr "Gebruikersnaam: (*)" -#: ../gtk/setupwizard.c:320 +#: ../gtk/setupwizard.c:325 msgid "Password: (*)" msgstr "Wachtwoord: (*)" -#: ../gtk/setupwizard.c:322 +#: ../gtk/setupwizard.c:327 msgid "Email: (*)" msgstr "E-mailadres: (*)" -#: ../gtk/setupwizard.c:324 +#: ../gtk/setupwizard.c:329 msgid "Confirm your password: (*)" msgstr "Bevestig uw wachtwoord: (*)" -#: ../gtk/setupwizard.c:338 +#: ../gtk/setupwizard.c:343 msgid "Keep me informed with linphone updates" msgstr "Houdt me op de hoogte van linphone-updates" -#: ../gtk/setupwizard.c:394 +#: ../gtk/setupwizard.c:399 msgid "" "Error, account not validated, username already used or server unreachable.\n" "Please go back and try again." msgstr "Er is een fout opgetreden: uw account is niet gevalideerd, de gebruikersnaam wordt al door iemand anders gebruikt of de server is onbereikbaar.\nGa terug en probeer het opnieuw." -#: ../gtk/setupwizard.c:405 +#: ../gtk/setupwizard.c:410 msgid "Thank you. Your account is now configured and ready for use." msgstr "Bedankt. Uw account is nu ingesteld en klaar voor gebruik." -#: ../gtk/setupwizard.c:413 +#: ../gtk/setupwizard.c:418 msgid "" "Please validate your account by clicking on the link we just sent you by email.\n" "Then come back here and press Next button." msgstr "Valideer uw account door te klikken op de link die we zojuist naar uw e-mailadres hebben verstuurd.\nKom dan terug naar dit venster en klik op de knop Volgende." -#: ../gtk/setupwizard.c:602 +#: ../gtk/setupwizard.c:609 msgid "SIP account configuration assistant" msgstr "SIP-account-instelwizard" -#: ../gtk/setupwizard.c:620 +#: ../gtk/setupwizard.c:629 msgid "Welcome to the account setup assistant" msgstr "Welkom bij de account-instelwizard" -#: ../gtk/setupwizard.c:625 +#: ../gtk/setupwizard.c:634 msgid "Account setup assistant" msgstr "Account-instelwizard" -#: ../gtk/setupwizard.c:631 +#: ../gtk/setupwizard.c:640 msgid "Configure your account (step 1/1)" msgstr "Uw account instellen (stap 1/1)" -#: ../gtk/setupwizard.c:636 +#: ../gtk/setupwizard.c:645 msgid "Enter your sip username (step 1/1)" msgstr "Vul uw SIP-gebruikersnaam in (stap 1/1)" -#: ../gtk/setupwizard.c:640 +#: ../gtk/setupwizard.c:649 msgid "Enter account information (step 1/2)" msgstr "Vul uw accountinformatie in (stap 1/2)" -#: ../gtk/setupwizard.c:649 +#: ../gtk/setupwizard.c:658 msgid "Validation (step 2/2)" msgstr "Geldigheid (stap 2/2)" -#: ../gtk/setupwizard.c:654 +#: ../gtk/setupwizard.c:663 msgid "Error" msgstr "Fout" -#: ../gtk/setupwizard.c:658 ../gtk/audio_assistant.c:534 +#: ../gtk/setupwizard.c:667 ../gtk/audio_assistant.c:534 msgid "Terminating" msgstr "Bezig met vernietigen" @@ -1496,10 +1500,6 @@ msgstr "" msgid "Search somebody" msgstr "" -#: ../gtk/waiting.ui.h:1 -msgid "Linphone" -msgstr "Linphone" - #: ../gtk/waiting.ui.h:2 msgid "Please wait" msgstr "" @@ -1699,68 +1699,68 @@ msgstr "" msgid "Please wait while fetching configuration from server..." msgstr "" -#: ../coreapi/linphonecore.c:1538 +#: ../coreapi/linphonecore.c:1539 msgid "Ready" msgstr "Gereed." -#: ../coreapi/linphonecore.c:2550 +#: ../coreapi/linphonecore.c:2551 msgid "Configuring" msgstr "" -#: ../coreapi/linphonecore.c:2724 +#: ../coreapi/linphonecore.c:2725 msgid "Looking for telephone number destination..." msgstr "Zoekt de lokatie van het telefoonnummer..." -#: ../coreapi/linphonecore.c:2726 +#: ../coreapi/linphonecore.c:2727 msgid "Could not resolve this number." msgstr "Kon dit nummer niet vinden." #. must be known at that time -#: ../coreapi/linphonecore.c:3012 +#: ../coreapi/linphonecore.c:3013 msgid "Contacting" msgstr "Verbinden" -#: ../coreapi/linphonecore.c:3017 +#: ../coreapi/linphonecore.c:3018 msgid "Could not call" msgstr "" -#: ../coreapi/linphonecore.c:3168 +#: ../coreapi/linphonecore.c:3169 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "" -#: ../coreapi/linphonecore.c:3326 +#: ../coreapi/linphonecore.c:3327 msgid "is contacting you" msgstr "" -#: ../coreapi/linphonecore.c:3327 +#: ../coreapi/linphonecore.c:3328 msgid " and asked autoanswer." msgstr "" -#: ../coreapi/linphonecore.c:3451 +#: ../coreapi/linphonecore.c:3452 msgid "Modifying call parameters..." msgstr "" -#: ../coreapi/linphonecore.c:3798 +#: ../coreapi/linphonecore.c:3802 msgid "Connected." msgstr "Verbonden." -#: ../coreapi/linphonecore.c:3823 +#: ../coreapi/linphonecore.c:3827 msgid "Call aborted" msgstr "" -#: ../coreapi/linphonecore.c:4013 +#: ../coreapi/linphonecore.c:4024 msgid "Could not pause the call" msgstr "" -#: ../coreapi/linphonecore.c:4016 +#: ../coreapi/linphonecore.c:4027 msgid "Pausing the current call..." msgstr "" -#: ../coreapi/misc.c:433 +#: ../coreapi/misc.c:434 msgid "Stun lookup in progress..." msgstr "STUN adres wordt opgezocht..." -#: ../coreapi/misc.c:614 +#: ../coreapi/misc.c:615 msgid "ICE local candidates gathering in progress..." msgstr "" @@ -1845,100 +1845,100 @@ msgstr "" msgid "Early media." msgstr "" -#: ../coreapi/callbacks.c:533 +#: ../coreapi/callbacks.c:534 #, c-format msgid "Call with %s is paused." msgstr "" -#: ../coreapi/callbacks.c:546 +#: ../coreapi/callbacks.c:547 #, c-format msgid "Call answered by %s - on hold." msgstr "" -#: ../coreapi/callbacks.c:556 +#: ../coreapi/callbacks.c:557 msgid "Call resumed." msgstr "" -#: ../coreapi/callbacks.c:560 +#: ../coreapi/callbacks.c:561 #, c-format msgid "Call answered by %s." msgstr "" -#: ../coreapi/callbacks.c:583 +#: ../coreapi/callbacks.c:584 msgid "Incompatible, check codecs or security settings..." msgstr "" -#: ../coreapi/callbacks.c:588 ../coreapi/callbacks.c:900 +#: ../coreapi/callbacks.c:589 ../coreapi/callbacks.c:906 msgid "Incompatible media parameters." msgstr "" -#: ../coreapi/callbacks.c:618 +#: ../coreapi/callbacks.c:619 msgid "We have been resumed." msgstr "" #. we are being paused -#: ../coreapi/callbacks.c:626 +#: ../coreapi/callbacks.c:628 msgid "We are paused by other party." msgstr "" #. reINVITE and in-dialogs UPDATE go here -#: ../coreapi/callbacks.c:660 +#: ../coreapi/callbacks.c:666 msgid "Call is updated by remote." msgstr "" -#: ../coreapi/callbacks.c:776 +#: ../coreapi/callbacks.c:782 msgid "Call terminated." msgstr "Oproep beeindigd." -#: ../coreapi/callbacks.c:804 +#: ../coreapi/callbacks.c:810 msgid "User is busy." msgstr "Gebruiker is bezet." -#: ../coreapi/callbacks.c:805 +#: ../coreapi/callbacks.c:811 msgid "User is temporarily unavailable." msgstr "Gebruiker is tijdelijk niet beschikbaar." #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:807 +#: ../coreapi/callbacks.c:813 msgid "User does not want to be disturbed." msgstr "De gebruiker wenst niet gestoord te worden." -#: ../coreapi/callbacks.c:808 +#: ../coreapi/callbacks.c:814 msgid "Call declined." msgstr "Oproep geweigerd." -#: ../coreapi/callbacks.c:823 +#: ../coreapi/callbacks.c:829 msgid "Request timeout." msgstr "" -#: ../coreapi/callbacks.c:854 +#: ../coreapi/callbacks.c:860 msgid "Redirected" msgstr "" -#: ../coreapi/callbacks.c:909 +#: ../coreapi/callbacks.c:915 msgid "Call failed." msgstr "" -#: ../coreapi/callbacks.c:987 +#: ../coreapi/callbacks.c:993 #, c-format msgid "Registration on %s successful." msgstr "Registratie op %s gelukt." -#: ../coreapi/callbacks.c:988 +#: ../coreapi/callbacks.c:994 #, c-format msgid "Unregistration on %s done." msgstr "" -#: ../coreapi/callbacks.c:1006 +#: ../coreapi/callbacks.c:1012 msgid "no response timeout" msgstr "" -#: ../coreapi/callbacks.c:1009 +#: ../coreapi/callbacks.c:1015 #, c-format msgid "Registration on %s failed: %s" msgstr "" -#: ../coreapi/callbacks.c:1016 +#: ../coreapi/callbacks.c:1022 msgid "Service unavailable, retrying" msgstr "" @@ -1948,11 +1948,11 @@ msgstr "" msgid "Authentication token is %s" msgstr "" -#: ../coreapi/linphonecall.c:1306 +#: ../coreapi/linphonecall.c:1310 msgid "Call parameters were successfully modified." msgstr "" -#: ../coreapi/linphonecall.c:3660 +#: ../coreapi/linphonecall.c:3686 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." diff --git a/po/pl.po b/po/pl.po index a4a008819..6dbfbfdb0 100644 --- a/po/pl.po +++ b/po/pl.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: linphone-gtk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-04-01 16:25+0200\n" -"PO-Revision-Date: 2015-04-01 14:26+0000\n" +"POT-Creation-Date: 2015-04-30 10:13+0200\n" +"PO-Revision-Date: 2015-04-30 08:13+0000\n" "Last-Translator: Belledonne Communications \n" "Language-Team: Polish (http://www.transifex.com/projects/p/linphone-gtk/language/pl/)\n" "MIME-Version: 1.0\n" @@ -89,45 +89,45 @@ msgstr "" msgid "Couldn't find pixmap file: %s" msgstr "Nie można znaleźć pixmapy: %s" -#: ../gtk/main.c:136 +#: ../gtk/main.c:137 msgid "log to stdout some debug information while running." msgstr "" -#: ../gtk/main.c:137 +#: ../gtk/main.c:138 msgid "path to a file to write logs into." msgstr "" -#: ../gtk/main.c:138 +#: ../gtk/main.c:139 msgid "Start linphone with video disabled." msgstr "" -#: ../gtk/main.c:139 +#: ../gtk/main.c:140 msgid "Start only in the system tray, do not show the main interface." msgstr "" -#: ../gtk/main.c:140 +#: ../gtk/main.c:141 msgid "address to call right now" msgstr "" -#: ../gtk/main.c:141 +#: ../gtk/main.c:142 msgid "" "Specifiy a working directory (should be the base of the installation, eg: " "c:\\Program Files\\Linphone)" msgstr "" -#: ../gtk/main.c:142 +#: ../gtk/main.c:143 msgid "Configuration file" msgstr "" -#: ../gtk/main.c:143 +#: ../gtk/main.c:144 msgid "Run the audio assistant" msgstr "" -#: ../gtk/main.c:144 +#: ../gtk/main.c:145 msgid "Run self test and exit 0 if succeed" msgstr "" -#: ../gtk/main.c:1069 +#: ../gtk/main.c:1070 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -135,76 +135,80 @@ msgid "" "If you answer no, this person will be temporarily blacklisted." msgstr "" -#: ../gtk/main.c:1146 +#: ../gtk/main.c:1147 #, c-format msgid "" "Please enter your password for username %s\n" " at realm %s:" msgstr "" -#: ../gtk/main.c:1267 +#: ../gtk/main.c:1268 msgid "Call error" msgstr "" -#: ../gtk/main.c:1270 ../coreapi/linphonecore.c:3842 +#: ../gtk/main.c:1271 ../coreapi/linphonecore.c:3846 msgid "Call ended" msgstr "" -#: ../gtk/main.c:1273 ../coreapi/call_log.c:221 +#: ../gtk/main.c:1274 ../coreapi/call_log.c:221 msgid "Incoming call" msgstr "" -#: ../gtk/main.c:1275 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 +#: ../gtk/main.c:1276 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 msgid "Answer" msgstr "" -#: ../gtk/main.c:1277 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1278 ../gtk/main.ui.h:6 msgid "Decline" msgstr "" -#: ../gtk/main.c:1283 +#: ../gtk/main.c:1284 msgid "Call paused" msgstr "" -#: ../gtk/main.c:1283 +#: ../gtk/main.c:1284 #, c-format msgid "by %s" msgstr "" -#: ../gtk/main.c:1353 +#: ../gtk/main.c:1354 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1516 +#: ../gtk/main.c:1509 msgid "Website link" msgstr "" -#: ../gtk/main.c:1565 -msgid "Linphone - a video internet phone" +#: ../gtk/main.c:1568 ../gtk/waiting.ui.h:1 +msgid "Linphone" msgstr "" -#: ../gtk/main.c:1657 +#: ../gtk/main.c:1569 +msgid "A video internet phone" +msgstr "" + +#: ../gtk/main.c:1629 #, c-format msgid "%s (Default)" msgstr "" -#: ../gtk/main.c:1989 ../coreapi/callbacks.c:1057 +#: ../gtk/main.c:1962 ../coreapi/callbacks.c:1063 #, c-format msgid "We are transferred to %s" msgstr "" -#: ../gtk/main.c:1999 +#: ../gtk/main.c:1972 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." msgstr "" -#: ../gtk/main.c:2147 +#: ../gtk/main.c:2117 msgid "A free SIP video-phone" msgstr "" -#: ../gtk/main.c:2252 +#: ../gtk/main.c:2221 #, c-format msgid "Hello\n" msgstr "" @@ -217,7 +221,7 @@ msgstr "" msgid "Presence status" msgstr "" -#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:552 ../gtk/contact.ui.h:1 +#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:569 ../gtk/contact.ui.h:1 msgid "Name" msgstr "Nazwa" @@ -258,124 +262,124 @@ msgstr "" msgid "Add new contact from %s directory" msgstr "" -#: ../gtk/propertybox.c:558 +#: ../gtk/propertybox.c:575 msgid "Rate (Hz)" msgstr "Jakość (Hz)" -#: ../gtk/propertybox.c:564 +#: ../gtk/propertybox.c:581 msgid "Status" msgstr "Status" -#: ../gtk/propertybox.c:570 +#: ../gtk/propertybox.c:587 msgid "IP Bitrate (kbit/s)" msgstr "" -#: ../gtk/propertybox.c:577 +#: ../gtk/propertybox.c:596 msgid "Parameters" msgstr "Parametr" -#: ../gtk/propertybox.c:620 ../gtk/propertybox.c:763 +#: ../gtk/propertybox.c:639 ../gtk/propertybox.c:782 msgid "Enabled" msgstr "Włączone" -#: ../gtk/propertybox.c:622 ../gtk/propertybox.c:763 ../gtk/parameters.ui.h:20 +#: ../gtk/propertybox.c:641 ../gtk/propertybox.c:782 ../gtk/parameters.ui.h:20 msgid "Disabled" msgstr "Wyłączone" -#: ../gtk/propertybox.c:809 +#: ../gtk/propertybox.c:828 msgid "Account" msgstr "" -#: ../gtk/propertybox.c:1072 +#: ../gtk/propertybox.c:1091 msgid "English" msgstr "" -#: ../gtk/propertybox.c:1073 +#: ../gtk/propertybox.c:1092 msgid "French" msgstr "" -#: ../gtk/propertybox.c:1074 +#: ../gtk/propertybox.c:1093 msgid "Swedish" msgstr "" -#: ../gtk/propertybox.c:1075 +#: ../gtk/propertybox.c:1094 msgid "Italian" msgstr "" -#: ../gtk/propertybox.c:1076 +#: ../gtk/propertybox.c:1095 msgid "Spanish" msgstr "" -#: ../gtk/propertybox.c:1077 +#: ../gtk/propertybox.c:1096 msgid "Brazilian Portugese" msgstr "" -#: ../gtk/propertybox.c:1078 +#: ../gtk/propertybox.c:1097 msgid "Polish" msgstr "" -#: ../gtk/propertybox.c:1079 +#: ../gtk/propertybox.c:1098 msgid "German" msgstr "" -#: ../gtk/propertybox.c:1080 +#: ../gtk/propertybox.c:1099 msgid "Russian" msgstr "" -#: ../gtk/propertybox.c:1081 +#: ../gtk/propertybox.c:1100 msgid "Japanese" msgstr "" -#: ../gtk/propertybox.c:1082 +#: ../gtk/propertybox.c:1101 msgid "Dutch" msgstr "" -#: ../gtk/propertybox.c:1083 +#: ../gtk/propertybox.c:1102 msgid "Hungarian" msgstr "" -#: ../gtk/propertybox.c:1084 +#: ../gtk/propertybox.c:1103 msgid "Czech" msgstr "" -#: ../gtk/propertybox.c:1085 +#: ../gtk/propertybox.c:1104 msgid "Chinese" msgstr "" -#: ../gtk/propertybox.c:1086 +#: ../gtk/propertybox.c:1105 msgid "Traditional Chinese" msgstr "" -#: ../gtk/propertybox.c:1087 +#: ../gtk/propertybox.c:1106 msgid "Norwegian" msgstr "" -#: ../gtk/propertybox.c:1088 +#: ../gtk/propertybox.c:1107 msgid "Hebrew" msgstr "" -#: ../gtk/propertybox.c:1089 +#: ../gtk/propertybox.c:1108 msgid "Serbian" msgstr "" -#: ../gtk/propertybox.c:1156 +#: ../gtk/propertybox.c:1175 msgid "" "You need to restart linphone for the new language selection to take effect." msgstr "" -#: ../gtk/propertybox.c:1236 +#: ../gtk/propertybox.c:1255 msgid "None" msgstr "" -#: ../gtk/propertybox.c:1240 +#: ../gtk/propertybox.c:1259 msgid "SRTP" msgstr "" -#: ../gtk/propertybox.c:1246 +#: ../gtk/propertybox.c:1265 msgid "DTLS" msgstr "" -#: ../gtk/propertybox.c:1253 +#: ../gtk/propertybox.c:1272 msgid "ZRTP" msgstr "" @@ -418,133 +422,133 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: ../gtk/setupwizard.c:34 +#: ../gtk/setupwizard.c:32 msgid "" "Welcome!\n" "This assistant will help you to use a SIP account for your calls." msgstr "" -#: ../gtk/setupwizard.c:43 +#: ../gtk/setupwizard.c:41 msgid "Create an account on linphone.org" msgstr "" -#: ../gtk/setupwizard.c:44 +#: ../gtk/setupwizard.c:42 msgid "I have already a linphone.org account and I just want to use it" msgstr "" -#: ../gtk/setupwizard.c:45 +#: ../gtk/setupwizard.c:43 msgid "I have already a sip account and I just want to use it" msgstr "" -#: ../gtk/setupwizard.c:46 +#: ../gtk/setupwizard.c:44 msgid "I want to specify a remote configuration URI" msgstr "" -#: ../gtk/setupwizard.c:89 +#: ../gtk/setupwizard.c:87 msgid "Enter your linphone.org username" msgstr "" -#: ../gtk/setupwizard.c:102 ../gtk/parameters.ui.h:85 ../gtk/ldap.ui.h:4 +#: ../gtk/setupwizard.c:100 ../gtk/parameters.ui.h:85 ../gtk/ldap.ui.h:4 msgid "Username:" msgstr "" -#: ../gtk/setupwizard.c:104 ../gtk/password.ui.h:4 ../gtk/ldap.ui.h:5 +#: ../gtk/setupwizard.c:102 ../gtk/password.ui.h:4 ../gtk/ldap.ui.h:5 msgid "Password:" msgstr "" -#: ../gtk/setupwizard.c:124 +#: ../gtk/setupwizard.c:122 msgid "Enter your account informations" msgstr "" -#: ../gtk/setupwizard.c:140 +#: ../gtk/setupwizard.c:138 msgid "Username*" msgstr "" -#: ../gtk/setupwizard.c:141 +#: ../gtk/setupwizard.c:139 msgid "Password*" msgstr "" -#: ../gtk/setupwizard.c:144 +#: ../gtk/setupwizard.c:142 msgid "Domain*" msgstr "" -#: ../gtk/setupwizard.c:145 +#: ../gtk/setupwizard.c:143 msgid "Proxy" msgstr "" -#: ../gtk/setupwizard.c:317 +#: ../gtk/setupwizard.c:322 msgid "(*) Required fields" msgstr "" -#: ../gtk/setupwizard.c:318 +#: ../gtk/setupwizard.c:323 msgid "Username: (*)" msgstr "" -#: ../gtk/setupwizard.c:320 +#: ../gtk/setupwizard.c:325 msgid "Password: (*)" msgstr "" -#: ../gtk/setupwizard.c:322 +#: ../gtk/setupwizard.c:327 msgid "Email: (*)" msgstr "" -#: ../gtk/setupwizard.c:324 +#: ../gtk/setupwizard.c:329 msgid "Confirm your password: (*)" msgstr "" -#: ../gtk/setupwizard.c:338 +#: ../gtk/setupwizard.c:343 msgid "Keep me informed with linphone updates" msgstr "" -#: ../gtk/setupwizard.c:394 +#: ../gtk/setupwizard.c:399 msgid "" "Error, account not validated, username already used or server unreachable.\n" "Please go back and try again." msgstr "" -#: ../gtk/setupwizard.c:405 +#: ../gtk/setupwizard.c:410 msgid "Thank you. Your account is now configured and ready for use." msgstr "" -#: ../gtk/setupwizard.c:413 +#: ../gtk/setupwizard.c:418 msgid "" "Please validate your account by clicking on the link we just sent you by email.\n" "Then come back here and press Next button." msgstr "" -#: ../gtk/setupwizard.c:602 +#: ../gtk/setupwizard.c:609 msgid "SIP account configuration assistant" msgstr "" -#: ../gtk/setupwizard.c:620 +#: ../gtk/setupwizard.c:629 msgid "Welcome to the account setup assistant" msgstr "" -#: ../gtk/setupwizard.c:625 +#: ../gtk/setupwizard.c:634 msgid "Account setup assistant" msgstr "" -#: ../gtk/setupwizard.c:631 +#: ../gtk/setupwizard.c:640 msgid "Configure your account (step 1/1)" msgstr "" -#: ../gtk/setupwizard.c:636 +#: ../gtk/setupwizard.c:645 msgid "Enter your sip username (step 1/1)" msgstr "" -#: ../gtk/setupwizard.c:640 +#: ../gtk/setupwizard.c:649 msgid "Enter account information (step 1/2)" msgstr "" -#: ../gtk/setupwizard.c:649 +#: ../gtk/setupwizard.c:658 msgid "Validation (step 2/2)" msgstr "" -#: ../gtk/setupwizard.c:654 +#: ../gtk/setupwizard.c:663 msgid "Error" msgstr "" -#: ../gtk/setupwizard.c:658 ../gtk/audio_assistant.c:534 +#: ../gtk/setupwizard.c:667 ../gtk/audio_assistant.c:534 msgid "Terminating" msgstr "" @@ -1498,10 +1502,6 @@ msgstr "" msgid "Search somebody" msgstr "" -#: ../gtk/waiting.ui.h:1 -msgid "Linphone" -msgstr "" - #: ../gtk/waiting.ui.h:2 msgid "Please wait" msgstr "" @@ -1701,68 +1701,68 @@ msgstr "" msgid "Please wait while fetching configuration from server..." msgstr "" -#: ../coreapi/linphonecore.c:1538 +#: ../coreapi/linphonecore.c:1539 msgid "Ready" msgstr "" -#: ../coreapi/linphonecore.c:2550 +#: ../coreapi/linphonecore.c:2551 msgid "Configuring" msgstr "" -#: ../coreapi/linphonecore.c:2724 +#: ../coreapi/linphonecore.c:2725 msgid "Looking for telephone number destination..." msgstr "" -#: ../coreapi/linphonecore.c:2726 +#: ../coreapi/linphonecore.c:2727 msgid "Could not resolve this number." msgstr "" #. must be known at that time -#: ../coreapi/linphonecore.c:3012 +#: ../coreapi/linphonecore.c:3013 msgid "Contacting" msgstr "" -#: ../coreapi/linphonecore.c:3017 +#: ../coreapi/linphonecore.c:3018 msgid "Could not call" msgstr "" -#: ../coreapi/linphonecore.c:3168 +#: ../coreapi/linphonecore.c:3169 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "" -#: ../coreapi/linphonecore.c:3326 +#: ../coreapi/linphonecore.c:3327 msgid "is contacting you" msgstr "" -#: ../coreapi/linphonecore.c:3327 +#: ../coreapi/linphonecore.c:3328 msgid " and asked autoanswer." msgstr "" -#: ../coreapi/linphonecore.c:3451 +#: ../coreapi/linphonecore.c:3452 msgid "Modifying call parameters..." msgstr "" -#: ../coreapi/linphonecore.c:3798 +#: ../coreapi/linphonecore.c:3802 msgid "Connected." msgstr "Połączony" -#: ../coreapi/linphonecore.c:3823 +#: ../coreapi/linphonecore.c:3827 msgid "Call aborted" msgstr "" -#: ../coreapi/linphonecore.c:4013 +#: ../coreapi/linphonecore.c:4024 msgid "Could not pause the call" msgstr "" -#: ../coreapi/linphonecore.c:4016 +#: ../coreapi/linphonecore.c:4027 msgid "Pausing the current call..." msgstr "" -#: ../coreapi/misc.c:433 +#: ../coreapi/misc.c:434 msgid "Stun lookup in progress..." msgstr "" -#: ../coreapi/misc.c:614 +#: ../coreapi/misc.c:615 msgid "ICE local candidates gathering in progress..." msgstr "" @@ -1847,100 +1847,100 @@ msgstr "" msgid "Early media." msgstr "" -#: ../coreapi/callbacks.c:533 +#: ../coreapi/callbacks.c:534 #, c-format msgid "Call with %s is paused." msgstr "" -#: ../coreapi/callbacks.c:546 +#: ../coreapi/callbacks.c:547 #, c-format msgid "Call answered by %s - on hold." msgstr "" -#: ../coreapi/callbacks.c:556 +#: ../coreapi/callbacks.c:557 msgid "Call resumed." msgstr "" -#: ../coreapi/callbacks.c:560 +#: ../coreapi/callbacks.c:561 #, c-format msgid "Call answered by %s." msgstr "" -#: ../coreapi/callbacks.c:583 +#: ../coreapi/callbacks.c:584 msgid "Incompatible, check codecs or security settings..." msgstr "" -#: ../coreapi/callbacks.c:588 ../coreapi/callbacks.c:900 +#: ../coreapi/callbacks.c:589 ../coreapi/callbacks.c:906 msgid "Incompatible media parameters." msgstr "" -#: ../coreapi/callbacks.c:618 +#: ../coreapi/callbacks.c:619 msgid "We have been resumed." msgstr "" #. we are being paused -#: ../coreapi/callbacks.c:626 +#: ../coreapi/callbacks.c:628 msgid "We are paused by other party." msgstr "" #. reINVITE and in-dialogs UPDATE go here -#: ../coreapi/callbacks.c:660 +#: ../coreapi/callbacks.c:666 msgid "Call is updated by remote." msgstr "" -#: ../coreapi/callbacks.c:776 +#: ../coreapi/callbacks.c:782 msgid "Call terminated." msgstr "" -#: ../coreapi/callbacks.c:804 +#: ../coreapi/callbacks.c:810 msgid "User is busy." msgstr "Osoba jest zajęta." -#: ../coreapi/callbacks.c:805 +#: ../coreapi/callbacks.c:811 msgid "User is temporarily unavailable." msgstr "Osoba jest tymczasowo niedostępna." #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:807 +#: ../coreapi/callbacks.c:813 msgid "User does not want to be disturbed." msgstr "Osoba nie chce, aby jej przeszkadzać." -#: ../coreapi/callbacks.c:808 +#: ../coreapi/callbacks.c:814 msgid "Call declined." msgstr "Rozmowa odrzucona." -#: ../coreapi/callbacks.c:823 +#: ../coreapi/callbacks.c:829 msgid "Request timeout." msgstr "" -#: ../coreapi/callbacks.c:854 +#: ../coreapi/callbacks.c:860 msgid "Redirected" msgstr "" -#: ../coreapi/callbacks.c:909 +#: ../coreapi/callbacks.c:915 msgid "Call failed." msgstr "" -#: ../coreapi/callbacks.c:987 +#: ../coreapi/callbacks.c:993 #, c-format msgid "Registration on %s successful." msgstr "" -#: ../coreapi/callbacks.c:988 +#: ../coreapi/callbacks.c:994 #, c-format msgid "Unregistration on %s done." msgstr "" -#: ../coreapi/callbacks.c:1006 +#: ../coreapi/callbacks.c:1012 msgid "no response timeout" msgstr "" -#: ../coreapi/callbacks.c:1009 +#: ../coreapi/callbacks.c:1015 #, c-format msgid "Registration on %s failed: %s" msgstr "" -#: ../coreapi/callbacks.c:1016 +#: ../coreapi/callbacks.c:1022 msgid "Service unavailable, retrying" msgstr "" @@ -1950,11 +1950,11 @@ msgstr "" msgid "Authentication token is %s" msgstr "" -#: ../coreapi/linphonecall.c:1306 +#: ../coreapi/linphonecall.c:1310 msgid "Call parameters were successfully modified." msgstr "" -#: ../coreapi/linphonecall.c:3660 +#: ../coreapi/linphonecall.c:3686 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." diff --git a/po/pt_BR.po b/po/pt_BR.po index 069605799..00d0b57e3 100644 --- a/po/pt_BR.po +++ b/po/pt_BR.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: linphone-gtk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-04-01 16:25+0200\n" -"PO-Revision-Date: 2015-04-01 14:26+0000\n" +"POT-Creation-Date: 2015-04-30 10:13+0200\n" +"PO-Revision-Date: 2015-04-30 08:13+0000\n" "Last-Translator: Belledonne Communications \n" "Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/linphone-gtk/language/pt_BR/)\n" "MIME-Version: 1.0\n" @@ -87,45 +87,45 @@ msgstr "" msgid "Couldn't find pixmap file: %s" msgstr "Não é possível achar arquivo pixmap: %s" -#: ../gtk/main.c:136 +#: ../gtk/main.c:137 msgid "log to stdout some debug information while running." msgstr "" -#: ../gtk/main.c:137 +#: ../gtk/main.c:138 msgid "path to a file to write logs into." msgstr "" -#: ../gtk/main.c:138 +#: ../gtk/main.c:139 msgid "Start linphone with video disabled." msgstr "" -#: ../gtk/main.c:139 +#: ../gtk/main.c:140 msgid "Start only in the system tray, do not show the main interface." msgstr "" -#: ../gtk/main.c:140 +#: ../gtk/main.c:141 msgid "address to call right now" msgstr "" -#: ../gtk/main.c:141 +#: ../gtk/main.c:142 msgid "" "Specifiy a working directory (should be the base of the installation, eg: " "c:\\Program Files\\Linphone)" msgstr "" -#: ../gtk/main.c:142 +#: ../gtk/main.c:143 msgid "Configuration file" msgstr "" -#: ../gtk/main.c:143 +#: ../gtk/main.c:144 msgid "Run the audio assistant" msgstr "" -#: ../gtk/main.c:144 +#: ../gtk/main.c:145 msgid "Run self test and exit 0 if succeed" msgstr "" -#: ../gtk/main.c:1069 +#: ../gtk/main.c:1070 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -133,76 +133,80 @@ msgid "" "If you answer no, this person will be temporarily blacklisted." msgstr "" -#: ../gtk/main.c:1146 +#: ../gtk/main.c:1147 #, c-format msgid "" "Please enter your password for username %s\n" " at realm %s:" msgstr "" -#: ../gtk/main.c:1267 +#: ../gtk/main.c:1268 msgid "Call error" msgstr "" -#: ../gtk/main.c:1270 ../coreapi/linphonecore.c:3842 +#: ../gtk/main.c:1271 ../coreapi/linphonecore.c:3846 msgid "Call ended" msgstr "" -#: ../gtk/main.c:1273 ../coreapi/call_log.c:221 +#: ../gtk/main.c:1274 ../coreapi/call_log.c:221 msgid "Incoming call" msgstr "Camadas recebidas" -#: ../gtk/main.c:1275 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 +#: ../gtk/main.c:1276 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 msgid "Answer" msgstr "" -#: ../gtk/main.c:1277 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1278 ../gtk/main.ui.h:6 msgid "Decline" msgstr "" -#: ../gtk/main.c:1283 +#: ../gtk/main.c:1284 msgid "Call paused" msgstr "" -#: ../gtk/main.c:1283 +#: ../gtk/main.c:1284 #, c-format msgid "by %s" msgstr "" -#: ../gtk/main.c:1353 +#: ../gtk/main.c:1354 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1516 +#: ../gtk/main.c:1509 msgid "Website link" msgstr "" -#: ../gtk/main.c:1565 -msgid "Linphone - a video internet phone" +#: ../gtk/main.c:1568 ../gtk/waiting.ui.h:1 +msgid "Linphone" msgstr "" -#: ../gtk/main.c:1657 +#: ../gtk/main.c:1569 +msgid "A video internet phone" +msgstr "" + +#: ../gtk/main.c:1629 #, c-format msgid "%s (Default)" msgstr "" -#: ../gtk/main.c:1989 ../coreapi/callbacks.c:1057 +#: ../gtk/main.c:1962 ../coreapi/callbacks.c:1063 #, c-format msgid "We are transferred to %s" msgstr "" -#: ../gtk/main.c:1999 +#: ../gtk/main.c:1972 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." msgstr "" -#: ../gtk/main.c:2147 +#: ../gtk/main.c:2117 msgid "A free SIP video-phone" msgstr "" -#: ../gtk/main.c:2252 +#: ../gtk/main.c:2221 #, c-format msgid "Hello\n" msgstr "" @@ -215,7 +219,7 @@ msgstr "" msgid "Presence status" msgstr "Status de presença" -#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:552 ../gtk/contact.ui.h:1 +#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:569 ../gtk/contact.ui.h:1 msgid "Name" msgstr "Nome" @@ -256,124 +260,124 @@ msgstr "" msgid "Add new contact from %s directory" msgstr "" -#: ../gtk/propertybox.c:558 +#: ../gtk/propertybox.c:575 msgid "Rate (Hz)" msgstr "Taxa (Hz)" -#: ../gtk/propertybox.c:564 +#: ../gtk/propertybox.c:581 msgid "Status" msgstr "" -#: ../gtk/propertybox.c:570 +#: ../gtk/propertybox.c:587 msgid "IP Bitrate (kbit/s)" msgstr "" -#: ../gtk/propertybox.c:577 +#: ../gtk/propertybox.c:596 msgid "Parameters" msgstr "Parâmetros" -#: ../gtk/propertybox.c:620 ../gtk/propertybox.c:763 +#: ../gtk/propertybox.c:639 ../gtk/propertybox.c:782 msgid "Enabled" msgstr "Ativado" -#: ../gtk/propertybox.c:622 ../gtk/propertybox.c:763 ../gtk/parameters.ui.h:20 +#: ../gtk/propertybox.c:641 ../gtk/propertybox.c:782 ../gtk/parameters.ui.h:20 msgid "Disabled" msgstr "Desativado" -#: ../gtk/propertybox.c:809 +#: ../gtk/propertybox.c:828 msgid "Account" msgstr "" -#: ../gtk/propertybox.c:1072 +#: ../gtk/propertybox.c:1091 msgid "English" msgstr "" -#: ../gtk/propertybox.c:1073 +#: ../gtk/propertybox.c:1092 msgid "French" msgstr "" -#: ../gtk/propertybox.c:1074 +#: ../gtk/propertybox.c:1093 msgid "Swedish" msgstr "" -#: ../gtk/propertybox.c:1075 +#: ../gtk/propertybox.c:1094 msgid "Italian" msgstr "" -#: ../gtk/propertybox.c:1076 +#: ../gtk/propertybox.c:1095 msgid "Spanish" msgstr "" -#: ../gtk/propertybox.c:1077 +#: ../gtk/propertybox.c:1096 msgid "Brazilian Portugese" msgstr "" -#: ../gtk/propertybox.c:1078 +#: ../gtk/propertybox.c:1097 msgid "Polish" msgstr "" -#: ../gtk/propertybox.c:1079 +#: ../gtk/propertybox.c:1098 msgid "German" msgstr "" -#: ../gtk/propertybox.c:1080 +#: ../gtk/propertybox.c:1099 msgid "Russian" msgstr "" -#: ../gtk/propertybox.c:1081 +#: ../gtk/propertybox.c:1100 msgid "Japanese" msgstr "" -#: ../gtk/propertybox.c:1082 +#: ../gtk/propertybox.c:1101 msgid "Dutch" msgstr "" -#: ../gtk/propertybox.c:1083 +#: ../gtk/propertybox.c:1102 msgid "Hungarian" msgstr "" -#: ../gtk/propertybox.c:1084 +#: ../gtk/propertybox.c:1103 msgid "Czech" msgstr "" -#: ../gtk/propertybox.c:1085 +#: ../gtk/propertybox.c:1104 msgid "Chinese" msgstr "" -#: ../gtk/propertybox.c:1086 +#: ../gtk/propertybox.c:1105 msgid "Traditional Chinese" msgstr "" -#: ../gtk/propertybox.c:1087 +#: ../gtk/propertybox.c:1106 msgid "Norwegian" msgstr "" -#: ../gtk/propertybox.c:1088 +#: ../gtk/propertybox.c:1107 msgid "Hebrew" msgstr "" -#: ../gtk/propertybox.c:1089 +#: ../gtk/propertybox.c:1108 msgid "Serbian" msgstr "" -#: ../gtk/propertybox.c:1156 +#: ../gtk/propertybox.c:1175 msgid "" "You need to restart linphone for the new language selection to take effect." msgstr "" -#: ../gtk/propertybox.c:1236 +#: ../gtk/propertybox.c:1255 msgid "None" msgstr "Nenhum" -#: ../gtk/propertybox.c:1240 +#: ../gtk/propertybox.c:1259 msgid "SRTP" msgstr "" -#: ../gtk/propertybox.c:1246 +#: ../gtk/propertybox.c:1265 msgid "DTLS" msgstr "" -#: ../gtk/propertybox.c:1253 +#: ../gtk/propertybox.c:1272 msgid "ZRTP" msgstr "" @@ -415,133 +419,133 @@ msgid_plural "Found %i contacts" msgstr[0] "" msgstr[1] "" -#: ../gtk/setupwizard.c:34 +#: ../gtk/setupwizard.c:32 msgid "" "Welcome!\n" "This assistant will help you to use a SIP account for your calls." msgstr "" -#: ../gtk/setupwizard.c:43 +#: ../gtk/setupwizard.c:41 msgid "Create an account on linphone.org" msgstr "" -#: ../gtk/setupwizard.c:44 +#: ../gtk/setupwizard.c:42 msgid "I have already a linphone.org account and I just want to use it" msgstr "" -#: ../gtk/setupwizard.c:45 +#: ../gtk/setupwizard.c:43 msgid "I have already a sip account and I just want to use it" msgstr "" -#: ../gtk/setupwizard.c:46 +#: ../gtk/setupwizard.c:44 msgid "I want to specify a remote configuration URI" msgstr "" -#: ../gtk/setupwizard.c:89 +#: ../gtk/setupwizard.c:87 msgid "Enter your linphone.org username" msgstr "" -#: ../gtk/setupwizard.c:102 ../gtk/parameters.ui.h:85 ../gtk/ldap.ui.h:4 +#: ../gtk/setupwizard.c:100 ../gtk/parameters.ui.h:85 ../gtk/ldap.ui.h:4 msgid "Username:" msgstr "" -#: ../gtk/setupwizard.c:104 ../gtk/password.ui.h:4 ../gtk/ldap.ui.h:5 +#: ../gtk/setupwizard.c:102 ../gtk/password.ui.h:4 ../gtk/ldap.ui.h:5 msgid "Password:" msgstr "" -#: ../gtk/setupwizard.c:124 +#: ../gtk/setupwizard.c:122 msgid "Enter your account informations" msgstr "" -#: ../gtk/setupwizard.c:140 +#: ../gtk/setupwizard.c:138 msgid "Username*" msgstr "" -#: ../gtk/setupwizard.c:141 +#: ../gtk/setupwizard.c:139 msgid "Password*" msgstr "" -#: ../gtk/setupwizard.c:144 +#: ../gtk/setupwizard.c:142 msgid "Domain*" msgstr "" -#: ../gtk/setupwizard.c:145 +#: ../gtk/setupwizard.c:143 msgid "Proxy" msgstr "" -#: ../gtk/setupwizard.c:317 +#: ../gtk/setupwizard.c:322 msgid "(*) Required fields" msgstr "" -#: ../gtk/setupwizard.c:318 +#: ../gtk/setupwizard.c:323 msgid "Username: (*)" msgstr "" -#: ../gtk/setupwizard.c:320 +#: ../gtk/setupwizard.c:325 msgid "Password: (*)" msgstr "" -#: ../gtk/setupwizard.c:322 +#: ../gtk/setupwizard.c:327 msgid "Email: (*)" msgstr "" -#: ../gtk/setupwizard.c:324 +#: ../gtk/setupwizard.c:329 msgid "Confirm your password: (*)" msgstr "" -#: ../gtk/setupwizard.c:338 +#: ../gtk/setupwizard.c:343 msgid "Keep me informed with linphone updates" msgstr "" -#: ../gtk/setupwizard.c:394 +#: ../gtk/setupwizard.c:399 msgid "" "Error, account not validated, username already used or server unreachable.\n" "Please go back and try again." msgstr "" -#: ../gtk/setupwizard.c:405 +#: ../gtk/setupwizard.c:410 msgid "Thank you. Your account is now configured and ready for use." msgstr "" -#: ../gtk/setupwizard.c:413 +#: ../gtk/setupwizard.c:418 msgid "" "Please validate your account by clicking on the link we just sent you by email.\n" "Then come back here and press Next button." msgstr "" -#: ../gtk/setupwizard.c:602 +#: ../gtk/setupwizard.c:609 msgid "SIP account configuration assistant" msgstr "" -#: ../gtk/setupwizard.c:620 +#: ../gtk/setupwizard.c:629 msgid "Welcome to the account setup assistant" msgstr "" -#: ../gtk/setupwizard.c:625 +#: ../gtk/setupwizard.c:634 msgid "Account setup assistant" msgstr "" -#: ../gtk/setupwizard.c:631 +#: ../gtk/setupwizard.c:640 msgid "Configure your account (step 1/1)" msgstr "" -#: ../gtk/setupwizard.c:636 +#: ../gtk/setupwizard.c:645 msgid "Enter your sip username (step 1/1)" msgstr "" -#: ../gtk/setupwizard.c:640 +#: ../gtk/setupwizard.c:649 msgid "Enter account information (step 1/2)" msgstr "" -#: ../gtk/setupwizard.c:649 +#: ../gtk/setupwizard.c:658 msgid "Validation (step 2/2)" msgstr "" -#: ../gtk/setupwizard.c:654 +#: ../gtk/setupwizard.c:663 msgid "Error" msgstr "" -#: ../gtk/setupwizard.c:658 ../gtk/audio_assistant.c:534 +#: ../gtk/setupwizard.c:667 ../gtk/audio_assistant.c:534 msgid "Terminating" msgstr "" @@ -1495,10 +1499,6 @@ msgstr "" msgid "Search somebody" msgstr "" -#: ../gtk/waiting.ui.h:1 -msgid "Linphone" -msgstr "" - #: ../gtk/waiting.ui.h:2 msgid "Please wait" msgstr "" @@ -1698,68 +1698,68 @@ msgstr "" msgid "Please wait while fetching configuration from server..." msgstr "" -#: ../coreapi/linphonecore.c:1538 +#: ../coreapi/linphonecore.c:1539 msgid "Ready" msgstr "" -#: ../coreapi/linphonecore.c:2550 +#: ../coreapi/linphonecore.c:2551 msgid "Configuring" msgstr "" -#: ../coreapi/linphonecore.c:2724 +#: ../coreapi/linphonecore.c:2725 msgid "Looking for telephone number destination..." msgstr "Procurando por telefone de destino..." -#: ../coreapi/linphonecore.c:2726 +#: ../coreapi/linphonecore.c:2727 msgid "Could not resolve this number." msgstr "Não foi possível encontrar este número." #. must be known at that time -#: ../coreapi/linphonecore.c:3012 +#: ../coreapi/linphonecore.c:3013 msgid "Contacting" msgstr "" -#: ../coreapi/linphonecore.c:3017 +#: ../coreapi/linphonecore.c:3018 msgid "Could not call" msgstr "" -#: ../coreapi/linphonecore.c:3168 +#: ../coreapi/linphonecore.c:3169 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "" -#: ../coreapi/linphonecore.c:3326 +#: ../coreapi/linphonecore.c:3327 msgid "is contacting you" msgstr "" -#: ../coreapi/linphonecore.c:3327 +#: ../coreapi/linphonecore.c:3328 msgid " and asked autoanswer." msgstr "" -#: ../coreapi/linphonecore.c:3451 +#: ../coreapi/linphonecore.c:3452 msgid "Modifying call parameters..." msgstr "" -#: ../coreapi/linphonecore.c:3798 +#: ../coreapi/linphonecore.c:3802 msgid "Connected." msgstr "Conectado." -#: ../coreapi/linphonecore.c:3823 +#: ../coreapi/linphonecore.c:3827 msgid "Call aborted" msgstr "" -#: ../coreapi/linphonecore.c:4013 +#: ../coreapi/linphonecore.c:4024 msgid "Could not pause the call" msgstr "" -#: ../coreapi/linphonecore.c:4016 +#: ../coreapi/linphonecore.c:4027 msgid "Pausing the current call..." msgstr "" -#: ../coreapi/misc.c:433 +#: ../coreapi/misc.c:434 msgid "Stun lookup in progress..." msgstr "" -#: ../coreapi/misc.c:614 +#: ../coreapi/misc.c:615 msgid "ICE local candidates gathering in progress..." msgstr "" @@ -1844,100 +1844,100 @@ msgstr "" msgid "Early media." msgstr "" -#: ../coreapi/callbacks.c:533 +#: ../coreapi/callbacks.c:534 #, c-format msgid "Call with %s is paused." msgstr "" -#: ../coreapi/callbacks.c:546 +#: ../coreapi/callbacks.c:547 #, c-format msgid "Call answered by %s - on hold." msgstr "" -#: ../coreapi/callbacks.c:556 +#: ../coreapi/callbacks.c:557 msgid "Call resumed." msgstr "" -#: ../coreapi/callbacks.c:560 +#: ../coreapi/callbacks.c:561 #, c-format msgid "Call answered by %s." msgstr "" -#: ../coreapi/callbacks.c:583 +#: ../coreapi/callbacks.c:584 msgid "Incompatible, check codecs or security settings..." msgstr "" -#: ../coreapi/callbacks.c:588 ../coreapi/callbacks.c:900 +#: ../coreapi/callbacks.c:589 ../coreapi/callbacks.c:906 msgid "Incompatible media parameters." msgstr "" -#: ../coreapi/callbacks.c:618 +#: ../coreapi/callbacks.c:619 msgid "We have been resumed." msgstr "" #. we are being paused -#: ../coreapi/callbacks.c:626 +#: ../coreapi/callbacks.c:628 msgid "We are paused by other party." msgstr "" #. reINVITE and in-dialogs UPDATE go here -#: ../coreapi/callbacks.c:660 +#: ../coreapi/callbacks.c:666 msgid "Call is updated by remote." msgstr "" -#: ../coreapi/callbacks.c:776 +#: ../coreapi/callbacks.c:782 msgid "Call terminated." msgstr "" -#: ../coreapi/callbacks.c:804 +#: ../coreapi/callbacks.c:810 msgid "User is busy." msgstr "Usuário está ocupado." -#: ../coreapi/callbacks.c:805 +#: ../coreapi/callbacks.c:811 msgid "User is temporarily unavailable." msgstr "Usuário está temporáriamente indisponível." #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:807 +#: ../coreapi/callbacks.c:813 msgid "User does not want to be disturbed." msgstr "" -#: ../coreapi/callbacks.c:808 +#: ../coreapi/callbacks.c:814 msgid "Call declined." msgstr "" -#: ../coreapi/callbacks.c:823 +#: ../coreapi/callbacks.c:829 msgid "Request timeout." msgstr "" -#: ../coreapi/callbacks.c:854 +#: ../coreapi/callbacks.c:860 msgid "Redirected" msgstr "" -#: ../coreapi/callbacks.c:909 +#: ../coreapi/callbacks.c:915 msgid "Call failed." msgstr "" -#: ../coreapi/callbacks.c:987 +#: ../coreapi/callbacks.c:993 #, c-format msgid "Registration on %s successful." msgstr "" -#: ../coreapi/callbacks.c:988 +#: ../coreapi/callbacks.c:994 #, c-format msgid "Unregistration on %s done." msgstr "" -#: ../coreapi/callbacks.c:1006 +#: ../coreapi/callbacks.c:1012 msgid "no response timeout" msgstr "" -#: ../coreapi/callbacks.c:1009 +#: ../coreapi/callbacks.c:1015 #, c-format msgid "Registration on %s failed: %s" msgstr "" -#: ../coreapi/callbacks.c:1016 +#: ../coreapi/callbacks.c:1022 msgid "Service unavailable, retrying" msgstr "" @@ -1947,11 +1947,11 @@ msgstr "" msgid "Authentication token is %s" msgstr "" -#: ../coreapi/linphonecall.c:1306 +#: ../coreapi/linphonecall.c:1310 msgid "Call parameters were successfully modified." msgstr "" -#: ../coreapi/linphonecall.c:3660 +#: ../coreapi/linphonecall.c:3686 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." diff --git a/po/ru.po b/po/ru.po index 722ae362c..a82543013 100644 --- a/po/ru.po +++ b/po/ru.po @@ -12,9 +12,9 @@ msgid "" msgstr "" "Project-Id-Version: linphone-gtk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-04-01 16:25+0200\n" -"PO-Revision-Date: 2015-04-02 06:40+0000\n" -"Last-Translator: AlexL \n" +"POT-Creation-Date: 2015-04-30 10:13+0200\n" +"PO-Revision-Date: 2015-04-30 08:13+0000\n" +"Last-Translator: Belledonne Communications \n" "Language-Team: Russian (http://www.transifex.com/projects/p/linphone-gtk/language/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -94,45 +94,45 @@ msgstr "Мне" msgid "Couldn't find pixmap file: %s" msgstr "Невозможно найти графический файл: %s" -#: ../gtk/main.c:136 +#: ../gtk/main.c:137 msgid "log to stdout some debug information while running." msgstr "Вывод некоторой отладочной информации на устройство стандартного вывода во время работы." -#: ../gtk/main.c:137 +#: ../gtk/main.c:138 msgid "path to a file to write logs into." msgstr "Путь к файлу для записи логов." -#: ../gtk/main.c:138 +#: ../gtk/main.c:139 msgid "Start linphone with video disabled." msgstr "Запуск linphone с видео отключен." -#: ../gtk/main.c:139 +#: ../gtk/main.c:140 msgid "Start only in the system tray, do not show the main interface." msgstr "Показывать только в системном лотке, не запуская главное окно." -#: ../gtk/main.c:140 +#: ../gtk/main.c:141 msgid "address to call right now" msgstr "Адрес для звонка прямо сейчас." -#: ../gtk/main.c:141 +#: ../gtk/main.c:142 msgid "" "Specifiy a working directory (should be the base of the installation, eg: " "c:\\Program Files\\Linphone)" msgstr "Определить рабочий каталог (относительно каталога установки, например: c:\\Program Files\\Linphone)" -#: ../gtk/main.c:142 +#: ../gtk/main.c:143 msgid "Configuration file" msgstr "Файл конфигурации" -#: ../gtk/main.c:143 +#: ../gtk/main.c:144 msgid "Run the audio assistant" msgstr "Запустить помощника аудио" -#: ../gtk/main.c:144 +#: ../gtk/main.c:145 msgid "Run self test and exit 0 if succeed" msgstr "Запустить самотест и выйти при успехе со статусом 0" -#: ../gtk/main.c:1069 +#: ../gtk/main.c:1070 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -140,76 +140,80 @@ msgid "" "If you answer no, this person will be temporarily blacklisted." msgstr "%s вы бы хотели быть добавленным в этот контактный лист.\nВы разрешаете ему(ей) видеть ваш статус присутствия или добавить в контактный лист?\nЕсли вы ответите Нет, эта персона будет временно в чёрном списке." -#: ../gtk/main.c:1146 +#: ../gtk/main.c:1147 #, c-format msgid "" "Please enter your password for username %s\n" " at realm %s:" msgstr "Пожалуйста, введите пароль для пользователя %s\n для реалм (рилм) %s:" -#: ../gtk/main.c:1267 +#: ../gtk/main.c:1268 msgid "Call error" msgstr "Ошибка звонка" -#: ../gtk/main.c:1270 ../coreapi/linphonecore.c:3842 +#: ../gtk/main.c:1271 ../coreapi/linphonecore.c:3846 msgid "Call ended" msgstr "Звонок окончен" -#: ../gtk/main.c:1273 ../coreapi/call_log.c:221 +#: ../gtk/main.c:1274 ../coreapi/call_log.c:221 msgid "Incoming call" msgstr "Входящий звонок" -#: ../gtk/main.c:1275 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 +#: ../gtk/main.c:1276 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 msgid "Answer" msgstr "Ответ" -#: ../gtk/main.c:1277 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1278 ../gtk/main.ui.h:6 msgid "Decline" msgstr "Отклонить" -#: ../gtk/main.c:1283 +#: ../gtk/main.c:1284 msgid "Call paused" msgstr "Звонок приостановлен" -#: ../gtk/main.c:1283 +#: ../gtk/main.c:1284 #, c-format msgid "by %s" msgstr "%s" -#: ../gtk/main.c:1353 +#: ../gtk/main.c:1354 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "%s предложил запустить видео. Вы принимаете?" -#: ../gtk/main.c:1516 +#: ../gtk/main.c:1509 msgid "Website link" msgstr "Домашняя страница" -#: ../gtk/main.c:1565 -msgid "Linphone - a video internet phone" -msgstr "Linphone - интернет видео телефон" +#: ../gtk/main.c:1568 ../gtk/waiting.ui.h:1 +msgid "Linphone" +msgstr "Linphone" -#: ../gtk/main.c:1657 +#: ../gtk/main.c:1569 +msgid "A video internet phone" +msgstr "" + +#: ../gtk/main.c:1629 #, c-format msgid "%s (Default)" msgstr "%s (по умолчанию)" -#: ../gtk/main.c:1989 ../coreapi/callbacks.c:1057 +#: ../gtk/main.c:1962 ../coreapi/callbacks.c:1063 #, c-format msgid "We are transferred to %s" msgstr "Мы передали в %s" -#: ../gtk/main.c:1999 +#: ../gtk/main.c:1972 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." msgstr "Звуковые карты не были обнаружены на этом компьютере.\nВы не сможете отправлять или получать аудио звонки." -#: ../gtk/main.c:2147 +#: ../gtk/main.c:2117 msgid "A free SIP video-phone" msgstr "Свободный SIP видео-телефон" -#: ../gtk/main.c:2252 +#: ../gtk/main.c:2221 #, c-format msgid "Hello\n" msgstr "Привет\n" @@ -222,7 +226,7 @@ msgstr "Добавить в адресную книгу" msgid "Presence status" msgstr "Статус присутствия" -#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:552 ../gtk/contact.ui.h:1 +#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:569 ../gtk/contact.ui.h:1 msgid "Name" msgstr "Имя" @@ -263,124 +267,124 @@ msgstr "Удалить историю чата для '%s'" msgid "Add new contact from %s directory" msgstr "Добавить новый контакт из директории '%s'" -#: ../gtk/propertybox.c:558 +#: ../gtk/propertybox.c:575 msgid "Rate (Hz)" msgstr "Частота (Гц)" -#: ../gtk/propertybox.c:564 +#: ../gtk/propertybox.c:581 msgid "Status" msgstr "Статус" -#: ../gtk/propertybox.c:570 +#: ../gtk/propertybox.c:587 msgid "IP Bitrate (kbit/s)" msgstr "IP битрейт (КБит/сек)" -#: ../gtk/propertybox.c:577 +#: ../gtk/propertybox.c:596 msgid "Parameters" msgstr "Параметры" -#: ../gtk/propertybox.c:620 ../gtk/propertybox.c:763 +#: ../gtk/propertybox.c:639 ../gtk/propertybox.c:782 msgid "Enabled" msgstr "Разрешён" -#: ../gtk/propertybox.c:622 ../gtk/propertybox.c:763 ../gtk/parameters.ui.h:20 +#: ../gtk/propertybox.c:641 ../gtk/propertybox.c:782 ../gtk/parameters.ui.h:20 msgid "Disabled" msgstr "Не разрешён" -#: ../gtk/propertybox.c:809 +#: ../gtk/propertybox.c:828 msgid "Account" msgstr "Учётная запись" -#: ../gtk/propertybox.c:1072 +#: ../gtk/propertybox.c:1091 msgid "English" msgstr "Английский" -#: ../gtk/propertybox.c:1073 +#: ../gtk/propertybox.c:1092 msgid "French" msgstr "Французский" -#: ../gtk/propertybox.c:1074 +#: ../gtk/propertybox.c:1093 msgid "Swedish" msgstr "Шведский" -#: ../gtk/propertybox.c:1075 +#: ../gtk/propertybox.c:1094 msgid "Italian" msgstr "Итальянский" -#: ../gtk/propertybox.c:1076 +#: ../gtk/propertybox.c:1095 msgid "Spanish" msgstr "Испанский" -#: ../gtk/propertybox.c:1077 +#: ../gtk/propertybox.c:1096 msgid "Brazilian Portugese" msgstr "Бразильский португальский" -#: ../gtk/propertybox.c:1078 +#: ../gtk/propertybox.c:1097 msgid "Polish" msgstr "Польский" -#: ../gtk/propertybox.c:1079 +#: ../gtk/propertybox.c:1098 msgid "German" msgstr "Немецкий" -#: ../gtk/propertybox.c:1080 +#: ../gtk/propertybox.c:1099 msgid "Russian" msgstr "Русский" -#: ../gtk/propertybox.c:1081 +#: ../gtk/propertybox.c:1100 msgid "Japanese" msgstr "Японский" -#: ../gtk/propertybox.c:1082 +#: ../gtk/propertybox.c:1101 msgid "Dutch" msgstr "Датский" -#: ../gtk/propertybox.c:1083 +#: ../gtk/propertybox.c:1102 msgid "Hungarian" msgstr "Венгерский" -#: ../gtk/propertybox.c:1084 +#: ../gtk/propertybox.c:1103 msgid "Czech" msgstr "Чешский" -#: ../gtk/propertybox.c:1085 +#: ../gtk/propertybox.c:1104 msgid "Chinese" msgstr "Китайский" -#: ../gtk/propertybox.c:1086 +#: ../gtk/propertybox.c:1105 msgid "Traditional Chinese" msgstr "Традиционный китайский" -#: ../gtk/propertybox.c:1087 +#: ../gtk/propertybox.c:1106 msgid "Norwegian" msgstr "Норвежский" -#: ../gtk/propertybox.c:1088 +#: ../gtk/propertybox.c:1107 msgid "Hebrew" msgstr "Иврит" -#: ../gtk/propertybox.c:1089 +#: ../gtk/propertybox.c:1108 msgid "Serbian" msgstr "Сербский" -#: ../gtk/propertybox.c:1156 +#: ../gtk/propertybox.c:1175 msgid "" "You need to restart linphone for the new language selection to take effect." msgstr "Вы должны перезагрузить linphone для того, чтобы языковые настройки вступили в силу." -#: ../gtk/propertybox.c:1236 +#: ../gtk/propertybox.c:1255 msgid "None" msgstr "Нет" -#: ../gtk/propertybox.c:1240 +#: ../gtk/propertybox.c:1259 msgid "SRTP" msgstr "SRTP" -#: ../gtk/propertybox.c:1246 +#: ../gtk/propertybox.c:1265 msgid "DTLS" msgstr "DTLS" -#: ../gtk/propertybox.c:1253 +#: ../gtk/propertybox.c:1272 msgid "ZRTP" msgstr "ZRTP" @@ -423,133 +427,133 @@ msgstr[0] "Найден %i контакт" msgstr[1] "Найдено %i контакта" msgstr[2] "Найдено %i контактов" -#: ../gtk/setupwizard.c:34 +#: ../gtk/setupwizard.c:32 msgid "" "Welcome!\n" "This assistant will help you to use a SIP account for your calls." msgstr "Добро пожаловать!\nЭтот ассистент поможет вам использовать SIP аккаунт для ваших звонков." -#: ../gtk/setupwizard.c:43 +#: ../gtk/setupwizard.c:41 msgid "Create an account on linphone.org" msgstr "Создать учётную запись на linphone.org" -#: ../gtk/setupwizard.c:44 +#: ../gtk/setupwizard.c:42 msgid "I have already a linphone.org account and I just want to use it" msgstr "Я уже имею учётную запись на linphone.org и только хочу использовать её" -#: ../gtk/setupwizard.c:45 +#: ../gtk/setupwizard.c:43 msgid "I have already a sip account and I just want to use it" msgstr "Я уже имею учётную запись sip и только хочу использовать её" -#: ../gtk/setupwizard.c:46 +#: ../gtk/setupwizard.c:44 msgid "I want to specify a remote configuration URI" msgstr "Я хочу указать удалённую конфигурацию URI" -#: ../gtk/setupwizard.c:89 +#: ../gtk/setupwizard.c:87 msgid "Enter your linphone.org username" msgstr "Введите ваше имя пользователя для linphone.org" -#: ../gtk/setupwizard.c:102 ../gtk/parameters.ui.h:85 ../gtk/ldap.ui.h:4 +#: ../gtk/setupwizard.c:100 ../gtk/parameters.ui.h:85 ../gtk/ldap.ui.h:4 msgid "Username:" msgstr "Имя пользователя:" -#: ../gtk/setupwizard.c:104 ../gtk/password.ui.h:4 ../gtk/ldap.ui.h:5 +#: ../gtk/setupwizard.c:102 ../gtk/password.ui.h:4 ../gtk/ldap.ui.h:5 msgid "Password:" msgstr "Пароль:" -#: ../gtk/setupwizard.c:124 +#: ../gtk/setupwizard.c:122 msgid "Enter your account informations" msgstr "Введите вашу информацию об учётной записи" -#: ../gtk/setupwizard.c:140 +#: ../gtk/setupwizard.c:138 msgid "Username*" msgstr "Имя пользователя*" -#: ../gtk/setupwizard.c:141 +#: ../gtk/setupwizard.c:139 msgid "Password*" msgstr "Пароль*" -#: ../gtk/setupwizard.c:144 +#: ../gtk/setupwizard.c:142 msgid "Domain*" msgstr "Домен*" -#: ../gtk/setupwizard.c:145 +#: ../gtk/setupwizard.c:143 msgid "Proxy" msgstr "Прокси" -#: ../gtk/setupwizard.c:317 +#: ../gtk/setupwizard.c:322 msgid "(*) Required fields" msgstr "(*) Обязательные поля" -#: ../gtk/setupwizard.c:318 +#: ../gtk/setupwizard.c:323 msgid "Username: (*)" msgstr "Имя пользователя: (*)" -#: ../gtk/setupwizard.c:320 +#: ../gtk/setupwizard.c:325 msgid "Password: (*)" msgstr "Пароль: (*)" -#: ../gtk/setupwizard.c:322 +#: ../gtk/setupwizard.c:327 msgid "Email: (*)" msgstr "Электронная почта: (*)" -#: ../gtk/setupwizard.c:324 +#: ../gtk/setupwizard.c:329 msgid "Confirm your password: (*)" msgstr "Подтвердите ваш пароль: (*)" -#: ../gtk/setupwizard.c:338 +#: ../gtk/setupwizard.c:343 msgid "Keep me informed with linphone updates" msgstr "Информировать об обновлениях linphone" -#: ../gtk/setupwizard.c:394 +#: ../gtk/setupwizard.c:399 msgid "" "Error, account not validated, username already used or server unreachable.\n" "Please go back and try again." msgstr "Ошибка, учётная запись не подтверждена, имя пользователя уже используется или\nсервер недоступен. Пожалуйста, зайдите снова и попробуйте ещё раз." -#: ../gtk/setupwizard.c:405 +#: ../gtk/setupwizard.c:410 msgid "Thank you. Your account is now configured and ready for use." msgstr "Спасибо! Учётная запись успешно настроена и готова к использованию." -#: ../gtk/setupwizard.c:413 +#: ../gtk/setupwizard.c:418 msgid "" "Please validate your account by clicking on the link we just sent you by email.\n" "Then come back here and press Next button." msgstr "Пожалуйста, подтвердите вашу учётную запись, щёлкнув на ссылку, которую вы только\nчто получили по электронной почте. Затем вернитесь сюда и нажмите кнопку Далее." -#: ../gtk/setupwizard.c:602 +#: ../gtk/setupwizard.c:609 msgid "SIP account configuration assistant" msgstr "Помощник настройки учётной записи SIP" -#: ../gtk/setupwizard.c:620 +#: ../gtk/setupwizard.c:629 msgid "Welcome to the account setup assistant" msgstr "Добро пожаловать в помощник настройки учётной записи" -#: ../gtk/setupwizard.c:625 +#: ../gtk/setupwizard.c:634 msgid "Account setup assistant" msgstr "Помощник настройки учётной записи" -#: ../gtk/setupwizard.c:631 +#: ../gtk/setupwizard.c:640 msgid "Configure your account (step 1/1)" msgstr "Настроить вашу учётную запись (шаг 1/1)" -#: ../gtk/setupwizard.c:636 +#: ../gtk/setupwizard.c:645 msgid "Enter your sip username (step 1/1)" msgstr "Введите ваше sip имя пользователя (шаг 1/1)" -#: ../gtk/setupwizard.c:640 +#: ../gtk/setupwizard.c:649 msgid "Enter account information (step 1/2)" msgstr "Введите информацию об учётной записи (шаг 1/2)" -#: ../gtk/setupwizard.c:649 +#: ../gtk/setupwizard.c:658 msgid "Validation (step 2/2)" msgstr "Подтверждение (шаг 2/2)" -#: ../gtk/setupwizard.c:654 +#: ../gtk/setupwizard.c:663 msgid "Error" msgstr "Ошибка" -#: ../gtk/setupwizard.c:658 ../gtk/audio_assistant.c:534 +#: ../gtk/setupwizard.c:667 ../gtk/audio_assistant.c:534 msgid "Terminating" msgstr "Прерывание" @@ -1503,10 +1507,6 @@ msgstr "Добавить в мой список" msgid "Search somebody" msgstr "Поиск кого-нибудь" -#: ../gtk/waiting.ui.h:1 -msgid "Linphone" -msgstr "Linphone" - #: ../gtk/waiting.ui.h:2 msgid "Please wait" msgstr "Пожалуйста, подождите" @@ -1706,68 +1706,68 @@ msgstr "Конфигурирование..." msgid "Please wait while fetching configuration from server..." msgstr "Пожалуйста, подождите пока получается конфигурация с сервера..." -#: ../coreapi/linphonecore.c:1538 +#: ../coreapi/linphonecore.c:1539 msgid "Ready" msgstr "Готов" -#: ../coreapi/linphonecore.c:2550 +#: ../coreapi/linphonecore.c:2551 msgid "Configuring" msgstr "Конфигурирование" -#: ../coreapi/linphonecore.c:2724 +#: ../coreapi/linphonecore.c:2725 msgid "Looking for telephone number destination..." msgstr "Поиск назначения для телефонного номера.." -#: ../coreapi/linphonecore.c:2726 +#: ../coreapi/linphonecore.c:2727 msgid "Could not resolve this number." msgstr "Не получилось принять решение по этому номеру." #. must be known at that time -#: ../coreapi/linphonecore.c:3012 +#: ../coreapi/linphonecore.c:3013 msgid "Contacting" msgstr "Соединение" -#: ../coreapi/linphonecore.c:3017 +#: ../coreapi/linphonecore.c:3018 msgid "Could not call" msgstr "Невозможно позвонить" -#: ../coreapi/linphonecore.c:3168 +#: ../coreapi/linphonecore.c:3169 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "К сожалению, мы достигли максимального количества одновременных звонков" -#: ../coreapi/linphonecore.c:3326 +#: ../coreapi/linphonecore.c:3327 msgid "is contacting you" msgstr "контактирует с вами" -#: ../coreapi/linphonecore.c:3327 +#: ../coreapi/linphonecore.c:3328 msgid " and asked autoanswer." msgstr "и спросил автоматический ответ." -#: ../coreapi/linphonecore.c:3451 +#: ../coreapi/linphonecore.c:3452 msgid "Modifying call parameters..." msgstr "Изменение параметров звонка..." -#: ../coreapi/linphonecore.c:3798 +#: ../coreapi/linphonecore.c:3802 msgid "Connected." msgstr "Соединён." -#: ../coreapi/linphonecore.c:3823 +#: ../coreapi/linphonecore.c:3827 msgid "Call aborted" msgstr "Звонок отменён" -#: ../coreapi/linphonecore.c:4013 +#: ../coreapi/linphonecore.c:4024 msgid "Could not pause the call" msgstr "Невозможно приостановить звонок" -#: ../coreapi/linphonecore.c:4016 +#: ../coreapi/linphonecore.c:4027 msgid "Pausing the current call..." msgstr "Приостановка текущего звонка..." -#: ../coreapi/misc.c:433 +#: ../coreapi/misc.c:434 msgid "Stun lookup in progress..." msgstr "Идет поиск STUN..." -#: ../coreapi/misc.c:614 +#: ../coreapi/misc.c:615 msgid "ICE local candidates gathering in progress..." msgstr "Сбор локальных кандидатов ICE в прогрессе..." @@ -1852,100 +1852,100 @@ msgstr "Дистанционный звонок..." msgid "Early media." msgstr "Предответное проключение." -#: ../coreapi/callbacks.c:533 +#: ../coreapi/callbacks.c:534 #, c-format msgid "Call with %s is paused." msgstr "Звонок с %s приостановлен." -#: ../coreapi/callbacks.c:546 +#: ../coreapi/callbacks.c:547 #, c-format msgid "Call answered by %s - on hold." msgstr "На звонок ответил %s - на удержании." -#: ../coreapi/callbacks.c:556 +#: ../coreapi/callbacks.c:557 msgid "Call resumed." msgstr "Звонок возобновлён." -#: ../coreapi/callbacks.c:560 +#: ../coreapi/callbacks.c:561 #, c-format msgid "Call answered by %s." msgstr "На звонок ответил %s." -#: ../coreapi/callbacks.c:583 +#: ../coreapi/callbacks.c:584 msgid "Incompatible, check codecs or security settings..." msgstr "Несовместимость, проверьте кодеки или параметры безопасности..." -#: ../coreapi/callbacks.c:588 ../coreapi/callbacks.c:900 +#: ../coreapi/callbacks.c:589 ../coreapi/callbacks.c:906 msgid "Incompatible media parameters." msgstr "Несовместимость медиа-параметров." -#: ../coreapi/callbacks.c:618 +#: ../coreapi/callbacks.c:619 msgid "We have been resumed." msgstr "Мы возобновили." #. we are being paused -#: ../coreapi/callbacks.c:626 +#: ../coreapi/callbacks.c:628 msgid "We are paused by other party." msgstr "Мы приостановлены другой стороной." #. reINVITE and in-dialogs UPDATE go here -#: ../coreapi/callbacks.c:660 +#: ../coreapi/callbacks.c:666 msgid "Call is updated by remote." msgstr "Звонок был дистанционно обновлён." -#: ../coreapi/callbacks.c:776 +#: ../coreapi/callbacks.c:782 msgid "Call terminated." msgstr "Звонок прерван." -#: ../coreapi/callbacks.c:804 +#: ../coreapi/callbacks.c:810 msgid "User is busy." msgstr "Пользователь занят." -#: ../coreapi/callbacks.c:805 +#: ../coreapi/callbacks.c:811 msgid "User is temporarily unavailable." msgstr "Пользователь временно недоступен." #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:807 +#: ../coreapi/callbacks.c:813 msgid "User does not want to be disturbed." msgstr "Пользователь не хочет чтобы его беспокоили." -#: ../coreapi/callbacks.c:808 +#: ../coreapi/callbacks.c:814 msgid "Call declined." msgstr "Звонок отклонён." -#: ../coreapi/callbacks.c:823 +#: ../coreapi/callbacks.c:829 msgid "Request timeout." msgstr "Таймаут запроса." -#: ../coreapi/callbacks.c:854 +#: ../coreapi/callbacks.c:860 msgid "Redirected" msgstr "Переадресован" -#: ../coreapi/callbacks.c:909 +#: ../coreapi/callbacks.c:915 msgid "Call failed." msgstr "Звонок не удался." -#: ../coreapi/callbacks.c:987 +#: ../coreapi/callbacks.c:993 #, c-format msgid "Registration on %s successful." msgstr "Регистрация на %s прошла успешно." -#: ../coreapi/callbacks.c:988 +#: ../coreapi/callbacks.c:994 #, c-format msgid "Unregistration on %s done." msgstr "Отмена регистрации на %s завершена." -#: ../coreapi/callbacks.c:1006 +#: ../coreapi/callbacks.c:1012 msgid "no response timeout" msgstr "время ожидания истекло" -#: ../coreapi/callbacks.c:1009 +#: ../coreapi/callbacks.c:1015 #, c-format msgid "Registration on %s failed: %s" msgstr "Регистрация на %s не удалась: %s" -#: ../coreapi/callbacks.c:1016 +#: ../coreapi/callbacks.c:1022 msgid "Service unavailable, retrying" msgstr "Сервис недоступен, повтор" @@ -1955,11 +1955,11 @@ msgstr "Сервис недоступен, повтор" msgid "Authentication token is %s" msgstr "Маркер проверки подлинности: %s" -#: ../coreapi/linphonecall.c:1306 +#: ../coreapi/linphonecall.c:1310 msgid "Call parameters were successfully modified." msgstr "Параметры звонка были успешно изменены." -#: ../coreapi/linphonecall.c:3660 +#: ../coreapi/linphonecall.c:3686 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." diff --git a/po/sr.po b/po/sr.po index fa8be5c4d..6adc05f37 100644 --- a/po/sr.po +++ b/po/sr.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: linphone-gtk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-04-01 16:25+0200\n" -"PO-Revision-Date: 2015-04-01 14:26+0000\n" +"POT-Creation-Date: 2015-04-30 10:13+0200\n" +"PO-Revision-Date: 2015-04-30 08:13+0000\n" "Last-Translator: Belledonne Communications \n" "Language-Team: Serbian (http://www.transifex.com/projects/p/linphone-gtk/language/sr/)\n" "MIME-Version: 1.0\n" @@ -90,45 +90,45 @@ msgstr "Ја" msgid "Couldn't find pixmap file: %s" msgstr "Не могу да пронађем датотеку сличице: %s" -#: ../gtk/main.c:136 +#: ../gtk/main.c:137 msgid "log to stdout some debug information while running." msgstr "бележи на стандардни излаз неке податке прочишћавања док ради." -#: ../gtk/main.c:137 +#: ../gtk/main.c:138 msgid "path to a file to write logs into." msgstr "путања до датотеке за уписивање дневника." -#: ../gtk/main.c:138 +#: ../gtk/main.c:139 msgid "Start linphone with video disabled." msgstr "Покреће линфон са искљученим видеом." -#: ../gtk/main.c:139 +#: ../gtk/main.c:140 msgid "Start only in the system tray, do not show the main interface." msgstr "Покреће се само у системској фиоци, не приказује главно сучеље." -#: ../gtk/main.c:140 +#: ../gtk/main.c:141 msgid "address to call right now" msgstr "адреса за позивање управо сада" -#: ../gtk/main.c:141 +#: ../gtk/main.c:142 msgid "" "Specifiy a working directory (should be the base of the installation, eg: " "c:\\Program Files\\Linphone)" msgstr "Наводи радни директоријум (треба да буде основа инсталације, нпр: „c:\\Program Files\\Linphone“)" -#: ../gtk/main.c:142 +#: ../gtk/main.c:143 msgid "Configuration file" msgstr "Датотека подешавања" -#: ../gtk/main.c:143 +#: ../gtk/main.c:144 msgid "Run the audio assistant" msgstr "Покреће помоћника звука" -#: ../gtk/main.c:144 +#: ../gtk/main.c:145 msgid "Run self test and exit 0 if succeed" msgstr "Покреће самоиспробавање и излази 0 ако је успешно" -#: ../gtk/main.c:1069 +#: ../gtk/main.c:1070 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -136,76 +136,80 @@ msgid "" "If you answer no, this person will be temporarily blacklisted." msgstr "%s жели да вас дода на списак пријатеља.\nДа ли желите да му допустите да види ваше стање присуства или да га додате на ваш списак пријатеља ?\nАко одговорите са не, ова особа ће привремено бити стављена на списак забрана." -#: ../gtk/main.c:1146 +#: ../gtk/main.c:1147 #, c-format msgid "" "Please enter your password for username %s\n" " at realm %s:" msgstr "Унесите вашу лозинку за корисничко име %s\n на подручју %s:" -#: ../gtk/main.c:1267 +#: ../gtk/main.c:1268 msgid "Call error" msgstr "Грешка позива" -#: ../gtk/main.c:1270 ../coreapi/linphonecore.c:3842 +#: ../gtk/main.c:1271 ../coreapi/linphonecore.c:3846 msgid "Call ended" msgstr "Позив је завршен" -#: ../gtk/main.c:1273 ../coreapi/call_log.c:221 +#: ../gtk/main.c:1274 ../coreapi/call_log.c:221 msgid "Incoming call" msgstr "Долазни позив" -#: ../gtk/main.c:1275 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 +#: ../gtk/main.c:1276 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 msgid "Answer" msgstr "Јави се" -#: ../gtk/main.c:1277 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1278 ../gtk/main.ui.h:6 msgid "Decline" msgstr "Одбиј" -#: ../gtk/main.c:1283 +#: ../gtk/main.c:1284 msgid "Call paused" msgstr "Позив је заустављен" -#: ../gtk/main.c:1283 +#: ../gtk/main.c:1284 #, c-format msgid "by %s" msgstr "од %s" -#: ../gtk/main.c:1353 +#: ../gtk/main.c:1354 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "%s предлаже да започнете видео. Да ли прихватате ?" -#: ../gtk/main.c:1516 +#: ../gtk/main.c:1509 msgid "Website link" msgstr "Веза веб сајта" -#: ../gtk/main.c:1565 -msgid "Linphone - a video internet phone" -msgstr "Линфон — интернет телефон са снимком" +#: ../gtk/main.c:1568 ../gtk/waiting.ui.h:1 +msgid "Linphone" +msgstr "Линфон" -#: ../gtk/main.c:1657 +#: ../gtk/main.c:1569 +msgid "A video internet phone" +msgstr "" + +#: ../gtk/main.c:1629 #, c-format msgid "%s (Default)" msgstr "%s (основно)" -#: ../gtk/main.c:1989 ../coreapi/callbacks.c:1057 +#: ../gtk/main.c:1962 ../coreapi/callbacks.c:1063 #, c-format msgid "We are transferred to %s" msgstr "Преселили смо се на %s" -#: ../gtk/main.c:1999 +#: ../gtk/main.c:1972 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." msgstr "Ниједна звучна картица није откривена на овом рачунару.\nНећете бити у могућности да шаљете или да примате звучне позиве." -#: ../gtk/main.c:2147 +#: ../gtk/main.c:2117 msgid "A free SIP video-phone" msgstr "Слободан СИП телефон са снимком" -#: ../gtk/main.c:2252 +#: ../gtk/main.c:2221 #, c-format msgid "Hello\n" msgstr "" @@ -218,7 +222,7 @@ msgstr "Додајте у адресар" msgid "Presence status" msgstr "Стање присуства" -#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:552 ../gtk/contact.ui.h:1 +#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:569 ../gtk/contact.ui.h:1 msgid "Name" msgstr "Име" @@ -259,124 +263,124 @@ msgstr "Обришите историјат ћаскања за „%s“" msgid "Add new contact from %s directory" msgstr "Додајте нови контакт из директоријума „%s“" -#: ../gtk/propertybox.c:558 +#: ../gtk/propertybox.c:575 msgid "Rate (Hz)" msgstr "Проток (Hz)" -#: ../gtk/propertybox.c:564 +#: ../gtk/propertybox.c:581 msgid "Status" msgstr "Стање" -#: ../gtk/propertybox.c:570 +#: ../gtk/propertybox.c:587 msgid "IP Bitrate (kbit/s)" msgstr "Проток бита ИП-а (kbit/s)" -#: ../gtk/propertybox.c:577 +#: ../gtk/propertybox.c:596 msgid "Parameters" msgstr "Параметри" -#: ../gtk/propertybox.c:620 ../gtk/propertybox.c:763 +#: ../gtk/propertybox.c:639 ../gtk/propertybox.c:782 msgid "Enabled" msgstr "Укључено" -#: ../gtk/propertybox.c:622 ../gtk/propertybox.c:763 ../gtk/parameters.ui.h:20 +#: ../gtk/propertybox.c:641 ../gtk/propertybox.c:782 ../gtk/parameters.ui.h:20 msgid "Disabled" msgstr "Искључено" -#: ../gtk/propertybox.c:809 +#: ../gtk/propertybox.c:828 msgid "Account" msgstr "Налог" -#: ../gtk/propertybox.c:1072 +#: ../gtk/propertybox.c:1091 msgid "English" msgstr "Енглески" -#: ../gtk/propertybox.c:1073 +#: ../gtk/propertybox.c:1092 msgid "French" msgstr "Француски" -#: ../gtk/propertybox.c:1074 +#: ../gtk/propertybox.c:1093 msgid "Swedish" msgstr "Шведски" -#: ../gtk/propertybox.c:1075 +#: ../gtk/propertybox.c:1094 msgid "Italian" msgstr "Италијански" -#: ../gtk/propertybox.c:1076 +#: ../gtk/propertybox.c:1095 msgid "Spanish" msgstr "Шпански" -#: ../gtk/propertybox.c:1077 +#: ../gtk/propertybox.c:1096 msgid "Brazilian Portugese" msgstr "Бразилски португалски" -#: ../gtk/propertybox.c:1078 +#: ../gtk/propertybox.c:1097 msgid "Polish" msgstr "Пољски" -#: ../gtk/propertybox.c:1079 +#: ../gtk/propertybox.c:1098 msgid "German" msgstr "Немачки" -#: ../gtk/propertybox.c:1080 +#: ../gtk/propertybox.c:1099 msgid "Russian" msgstr "Руски" -#: ../gtk/propertybox.c:1081 +#: ../gtk/propertybox.c:1100 msgid "Japanese" msgstr "Јапански" -#: ../gtk/propertybox.c:1082 +#: ../gtk/propertybox.c:1101 msgid "Dutch" msgstr "Холандски" -#: ../gtk/propertybox.c:1083 +#: ../gtk/propertybox.c:1102 msgid "Hungarian" msgstr "Мађарски" -#: ../gtk/propertybox.c:1084 +#: ../gtk/propertybox.c:1103 msgid "Czech" msgstr "Чешки" -#: ../gtk/propertybox.c:1085 +#: ../gtk/propertybox.c:1104 msgid "Chinese" msgstr "Кинески" -#: ../gtk/propertybox.c:1086 +#: ../gtk/propertybox.c:1105 msgid "Traditional Chinese" msgstr "Традиционални кинески" -#: ../gtk/propertybox.c:1087 +#: ../gtk/propertybox.c:1106 msgid "Norwegian" msgstr "Норвешки" -#: ../gtk/propertybox.c:1088 +#: ../gtk/propertybox.c:1107 msgid "Hebrew" msgstr "Јеврејски" -#: ../gtk/propertybox.c:1089 +#: ../gtk/propertybox.c:1108 msgid "Serbian" msgstr "Српски" -#: ../gtk/propertybox.c:1156 +#: ../gtk/propertybox.c:1175 msgid "" "You need to restart linphone for the new language selection to take effect." msgstr "Треба поново да покренете линфон да би нови изабрани језик ступио у дејство." -#: ../gtk/propertybox.c:1236 +#: ../gtk/propertybox.c:1255 msgid "None" msgstr "Ништа" -#: ../gtk/propertybox.c:1240 +#: ../gtk/propertybox.c:1259 msgid "SRTP" msgstr "СРТП" -#: ../gtk/propertybox.c:1246 +#: ../gtk/propertybox.c:1265 msgid "DTLS" msgstr "" -#: ../gtk/propertybox.c:1253 +#: ../gtk/propertybox.c:1272 msgid "ZRTP" msgstr "ЗРТП" @@ -419,133 +423,133 @@ msgstr[0] "Нашао сам %i контакт" msgstr[1] "Нашао сам %i контакта" msgstr[2] "Нашао сам %i контаката" -#: ../gtk/setupwizard.c:34 +#: ../gtk/setupwizard.c:32 msgid "" "Welcome!\n" "This assistant will help you to use a SIP account for your calls." msgstr "Добро дошли!\nОвај помоћник ће вам помоћи да користите СИП налог за ваше позиве." -#: ../gtk/setupwizard.c:43 +#: ../gtk/setupwizard.c:41 msgid "Create an account on linphone.org" msgstr "Направи налог на линфон.орг-у" -#: ../gtk/setupwizard.c:44 +#: ../gtk/setupwizard.c:42 msgid "I have already a linphone.org account and I just want to use it" msgstr "Већ имам налог линфон.орг-а и желим да га користим" -#: ../gtk/setupwizard.c:45 +#: ../gtk/setupwizard.c:43 msgid "I have already a sip account and I just want to use it" msgstr "Већ имам сип налог и желим да га користим" -#: ../gtk/setupwizard.c:46 +#: ../gtk/setupwizard.c:44 msgid "I want to specify a remote configuration URI" msgstr "Желим да наведем удаљену путању подешавања" -#: ../gtk/setupwizard.c:89 +#: ../gtk/setupwizard.c:87 msgid "Enter your linphone.org username" msgstr "Унесите ваше корисничко име линфон.орг-а" -#: ../gtk/setupwizard.c:102 ../gtk/parameters.ui.h:85 ../gtk/ldap.ui.h:4 +#: ../gtk/setupwizard.c:100 ../gtk/parameters.ui.h:85 ../gtk/ldap.ui.h:4 msgid "Username:" msgstr "Корисничко име:" -#: ../gtk/setupwizard.c:104 ../gtk/password.ui.h:4 ../gtk/ldap.ui.h:5 +#: ../gtk/setupwizard.c:102 ../gtk/password.ui.h:4 ../gtk/ldap.ui.h:5 msgid "Password:" msgstr "Лозинка:" -#: ../gtk/setupwizard.c:124 +#: ../gtk/setupwizard.c:122 msgid "Enter your account informations" msgstr "Унесите податке вашег налога" -#: ../gtk/setupwizard.c:140 +#: ../gtk/setupwizard.c:138 msgid "Username*" msgstr "Корисник*" -#: ../gtk/setupwizard.c:141 +#: ../gtk/setupwizard.c:139 msgid "Password*" msgstr "Лозинка*" -#: ../gtk/setupwizard.c:144 +#: ../gtk/setupwizard.c:142 msgid "Domain*" msgstr "Домен*" -#: ../gtk/setupwizard.c:145 +#: ../gtk/setupwizard.c:143 msgid "Proxy" msgstr "Посредник" -#: ../gtk/setupwizard.c:317 +#: ../gtk/setupwizard.c:322 msgid "(*) Required fields" msgstr "(*) Обавезна поља" -#: ../gtk/setupwizard.c:318 +#: ../gtk/setupwizard.c:323 msgid "Username: (*)" msgstr "Корисник: (*)" -#: ../gtk/setupwizard.c:320 +#: ../gtk/setupwizard.c:325 msgid "Password: (*)" msgstr "Лозинка: (*)" -#: ../gtk/setupwizard.c:322 +#: ../gtk/setupwizard.c:327 msgid "Email: (*)" msgstr "Ел. пошта: (*)" -#: ../gtk/setupwizard.c:324 +#: ../gtk/setupwizard.c:329 msgid "Confirm your password: (*)" msgstr "Потврдите вашу лозинку: (*)" -#: ../gtk/setupwizard.c:338 +#: ../gtk/setupwizard.c:343 msgid "Keep me informed with linphone updates" msgstr "Обавештавај ме о ажурирањима линфона" -#: ../gtk/setupwizard.c:394 +#: ../gtk/setupwizard.c:399 msgid "" "Error, account not validated, username already used or server unreachable.\n" "Please go back and try again." msgstr "Грешка, налог није потврђен, корисничко име је већ у употреби или је сервер недоступан.\nВратите се назад и покушајте опет." -#: ../gtk/setupwizard.c:405 +#: ../gtk/setupwizard.c:410 msgid "Thank you. Your account is now configured and ready for use." msgstr "Хвала вам. Ваш налог је сада подешен и спреман за употребу." -#: ../gtk/setupwizard.c:413 +#: ../gtk/setupwizard.c:418 msgid "" "Please validate your account by clicking on the link we just sent you by email.\n" "Then come back here and press Next button." msgstr "Потврдите ваш налог притиском на везу коју смо вам управо послали ел. поштом.\nЗатим се вратите овде и притисните дугме „Напред“." -#: ../gtk/setupwizard.c:602 +#: ../gtk/setupwizard.c:609 msgid "SIP account configuration assistant" msgstr "Помоћник подешавања СИП налога" -#: ../gtk/setupwizard.c:620 +#: ../gtk/setupwizard.c:629 msgid "Welcome to the account setup assistant" msgstr "Добро дошли у помоћника подешавања налога" -#: ../gtk/setupwizard.c:625 +#: ../gtk/setupwizard.c:634 msgid "Account setup assistant" msgstr "Помоћник подешавања налога" -#: ../gtk/setupwizard.c:631 +#: ../gtk/setupwizard.c:640 msgid "Configure your account (step 1/1)" msgstr "Подесите ваш налог (корак 1/1)" -#: ../gtk/setupwizard.c:636 +#: ../gtk/setupwizard.c:645 msgid "Enter your sip username (step 1/1)" msgstr "Унесите ваше корисничко име сип-а (корак 1/1)" -#: ../gtk/setupwizard.c:640 +#: ../gtk/setupwizard.c:649 msgid "Enter account information (step 1/2)" msgstr "Унесите податке налога (корак 1/2)" -#: ../gtk/setupwizard.c:649 +#: ../gtk/setupwizard.c:658 msgid "Validation (step 2/2)" msgstr "Потврђивање (корак 2/2)" -#: ../gtk/setupwizard.c:654 +#: ../gtk/setupwizard.c:663 msgid "Error" msgstr "Грешка" -#: ../gtk/setupwizard.c:658 ../gtk/audio_assistant.c:534 +#: ../gtk/setupwizard.c:667 ../gtk/audio_assistant.c:534 msgid "Terminating" msgstr "Завршавам" @@ -1499,10 +1503,6 @@ msgstr "Додај на мој списак" msgid "Search somebody" msgstr "Потражите неког" -#: ../gtk/waiting.ui.h:1 -msgid "Linphone" -msgstr "Линфон" - #: ../gtk/waiting.ui.h:2 msgid "Please wait" msgstr "Сачекајте мало" @@ -1702,68 +1702,68 @@ msgstr "Подешавам..." msgid "Please wait while fetching configuration from server..." msgstr "Сачекајте док довучем подешавања са сервера..." -#: ../coreapi/linphonecore.c:1538 +#: ../coreapi/linphonecore.c:1539 msgid "Ready" msgstr "Спреман" -#: ../coreapi/linphonecore.c:2550 +#: ../coreapi/linphonecore.c:2551 msgid "Configuring" msgstr "Подешавам" -#: ../coreapi/linphonecore.c:2724 +#: ../coreapi/linphonecore.c:2725 msgid "Looking for telephone number destination..." msgstr "Тражим одредиште телефонског броја..." -#: ../coreapi/linphonecore.c:2726 +#: ../coreapi/linphonecore.c:2727 msgid "Could not resolve this number." msgstr "Не могу да решим овај број." #. must be known at that time -#: ../coreapi/linphonecore.c:3012 +#: ../coreapi/linphonecore.c:3013 msgid "Contacting" msgstr "Ступам у везу" -#: ../coreapi/linphonecore.c:3017 +#: ../coreapi/linphonecore.c:3018 msgid "Could not call" msgstr "Не могу да позовем" -#: ../coreapi/linphonecore.c:3168 +#: ../coreapi/linphonecore.c:3169 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "Извините, достигли смо највећи број истовремених позива" -#: ../coreapi/linphonecore.c:3326 +#: ../coreapi/linphonecore.c:3327 msgid "is contacting you" msgstr "вам се обраћа" -#: ../coreapi/linphonecore.c:3327 +#: ../coreapi/linphonecore.c:3328 msgid " and asked autoanswer." msgstr " и затражени само-одговор." -#: ../coreapi/linphonecore.c:3451 +#: ../coreapi/linphonecore.c:3452 msgid "Modifying call parameters..." msgstr "Мењам параметре позива..." -#: ../coreapi/linphonecore.c:3798 +#: ../coreapi/linphonecore.c:3802 msgid "Connected." msgstr "Повезан сам." -#: ../coreapi/linphonecore.c:3823 +#: ../coreapi/linphonecore.c:3827 msgid "Call aborted" msgstr "Позив је прекинут" -#: ../coreapi/linphonecore.c:4013 +#: ../coreapi/linphonecore.c:4024 msgid "Could not pause the call" msgstr "Не могу да зауставим позив" -#: ../coreapi/linphonecore.c:4016 +#: ../coreapi/linphonecore.c:4027 msgid "Pausing the current call..." msgstr "Заустављам тренутни позив..." -#: ../coreapi/misc.c:433 +#: ../coreapi/misc.c:434 msgid "Stun lookup in progress..." msgstr "У току је тражење стуна..." -#: ../coreapi/misc.c:614 +#: ../coreapi/misc.c:615 msgid "ICE local candidates gathering in progress..." msgstr "Прикупљање месних ИЦЕ кандидата је у току..." @@ -1848,100 +1848,100 @@ msgstr "Удаљено звоњење..." msgid "Early media." msgstr "Ранији медиј." -#: ../coreapi/callbacks.c:533 +#: ../coreapi/callbacks.c:534 #, c-format msgid "Call with %s is paused." msgstr "Позив са „%s“ је заустављен." -#: ../coreapi/callbacks.c:546 +#: ../coreapi/callbacks.c:547 #, c-format msgid "Call answered by %s - on hold." msgstr "Позив на који је одговорио „%s“ — на чекању." -#: ../coreapi/callbacks.c:556 +#: ../coreapi/callbacks.c:557 msgid "Call resumed." msgstr "Позив је настављен." -#: ../coreapi/callbacks.c:560 +#: ../coreapi/callbacks.c:561 #, c-format msgid "Call answered by %s." msgstr "На позив је одговорио „%s“." -#: ../coreapi/callbacks.c:583 +#: ../coreapi/callbacks.c:584 msgid "Incompatible, check codecs or security settings..." msgstr "Несагласно, проверите кодеке или безбедносна подешавања..." -#: ../coreapi/callbacks.c:588 ../coreapi/callbacks.c:900 +#: ../coreapi/callbacks.c:589 ../coreapi/callbacks.c:906 msgid "Incompatible media parameters." msgstr "Медијски параметри су несагласни." -#: ../coreapi/callbacks.c:618 +#: ../coreapi/callbacks.c:619 msgid "We have been resumed." msgstr "Наставили смо." #. we are being paused -#: ../coreapi/callbacks.c:626 +#: ../coreapi/callbacks.c:628 msgid "We are paused by other party." msgstr "Друга страна нас је паузирала." #. reINVITE and in-dialogs UPDATE go here -#: ../coreapi/callbacks.c:660 +#: ../coreapi/callbacks.c:666 msgid "Call is updated by remote." msgstr "Позив је освежен удаљеним." -#: ../coreapi/callbacks.c:776 +#: ../coreapi/callbacks.c:782 msgid "Call terminated." msgstr "Позив је завршен." -#: ../coreapi/callbacks.c:804 +#: ../coreapi/callbacks.c:810 msgid "User is busy." msgstr "Корисник је заузет." -#: ../coreapi/callbacks.c:805 +#: ../coreapi/callbacks.c:811 msgid "User is temporarily unavailable." msgstr "Корисник је привремено недоступан." #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:807 +#: ../coreapi/callbacks.c:813 msgid "User does not want to be disturbed." msgstr "Корисник не жели да буде узнемираван." -#: ../coreapi/callbacks.c:808 +#: ../coreapi/callbacks.c:814 msgid "Call declined." msgstr "Позив је одбијен." -#: ../coreapi/callbacks.c:823 +#: ../coreapi/callbacks.c:829 msgid "Request timeout." msgstr "Истекло је време захтева." -#: ../coreapi/callbacks.c:854 +#: ../coreapi/callbacks.c:860 msgid "Redirected" msgstr "Преусмерен" -#: ../coreapi/callbacks.c:909 +#: ../coreapi/callbacks.c:915 msgid "Call failed." msgstr "Позив није успео." -#: ../coreapi/callbacks.c:987 +#: ../coreapi/callbacks.c:993 #, c-format msgid "Registration on %s successful." msgstr "Уписивање на „%s“ је успело." -#: ../coreapi/callbacks.c:988 +#: ../coreapi/callbacks.c:994 #, c-format msgid "Unregistration on %s done." msgstr "Исписивање са „%s“ је обављено." -#: ../coreapi/callbacks.c:1006 +#: ../coreapi/callbacks.c:1012 msgid "no response timeout" msgstr "нема ограничења одговора" -#: ../coreapi/callbacks.c:1009 +#: ../coreapi/callbacks.c:1015 #, c-format msgid "Registration on %s failed: %s" msgstr "Уписивање на „%s“ није успело: %s" -#: ../coreapi/callbacks.c:1016 +#: ../coreapi/callbacks.c:1022 msgid "Service unavailable, retrying" msgstr "Услуга није доступна, поново покушавам" @@ -1951,11 +1951,11 @@ msgstr "Услуга није доступна, поново покушавам" msgid "Authentication token is %s" msgstr "Симбол потврђивања идентитета је „%s“" -#: ../coreapi/linphonecall.c:1306 +#: ../coreapi/linphonecall.c:1310 msgid "Call parameters were successfully modified." msgstr "" -#: ../coreapi/linphonecall.c:3660 +#: ../coreapi/linphonecall.c:3686 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." diff --git a/po/sv.po b/po/sv.po index 9b05dff62..bbc77c665 100644 --- a/po/sv.po +++ b/po/sv.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: linphone-gtk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-04-01 16:25+0200\n" -"PO-Revision-Date: 2015-04-01 14:26+0000\n" +"POT-Creation-Date: 2015-04-30 10:13+0200\n" +"PO-Revision-Date: 2015-04-30 08:13+0000\n" "Last-Translator: Belledonne Communications \n" "Language-Team: Swedish (http://www.transifex.com/projects/p/linphone-gtk/language/sv/)\n" "MIME-Version: 1.0\n" @@ -87,45 +87,45 @@ msgstr "" msgid "Couldn't find pixmap file: %s" msgstr "Kunde inte hitta pixmap filen: %s" -#: ../gtk/main.c:136 +#: ../gtk/main.c:137 msgid "log to stdout some debug information while running." msgstr "skriv loggning information under körning" -#: ../gtk/main.c:137 +#: ../gtk/main.c:138 msgid "path to a file to write logs into." msgstr "" -#: ../gtk/main.c:138 +#: ../gtk/main.c:139 msgid "Start linphone with video disabled." msgstr "" -#: ../gtk/main.c:139 +#: ../gtk/main.c:140 msgid "Start only in the system tray, do not show the main interface." msgstr "Starta ikonifierat, visa inte huvudfönstret" -#: ../gtk/main.c:140 +#: ../gtk/main.c:141 msgid "address to call right now" msgstr "Samtalsmottagare" -#: ../gtk/main.c:141 +#: ../gtk/main.c:142 msgid "" "Specifiy a working directory (should be the base of the installation, eg: " "c:\\Program Files\\Linphone)" msgstr "Välj en arbetskatalog som ska vara basen för installationen, såsom C:\\Program\\Linphone" -#: ../gtk/main.c:142 +#: ../gtk/main.c:143 msgid "Configuration file" msgstr "" -#: ../gtk/main.c:143 +#: ../gtk/main.c:144 msgid "Run the audio assistant" msgstr "" -#: ../gtk/main.c:144 +#: ../gtk/main.c:145 msgid "Run self test and exit 0 if succeed" msgstr "" -#: ../gtk/main.c:1069 +#: ../gtk/main.c:1070 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -133,76 +133,80 @@ msgid "" "If you answer no, this person will be temporarily blacklisted." msgstr "%s skulle vilja lägga till dig till hans/hennes kontaktlista.\nVill du tillåta honom/henne att se din närvarostatus eller lägga till honom/henne till din kontaktlista?\nOm du svarar nej, personen kommer att vara bannlyst." -#: ../gtk/main.c:1146 +#: ../gtk/main.c:1147 #, c-format msgid "" "Please enter your password for username %s\n" " at realm %s:" msgstr "" -#: ../gtk/main.c:1267 +#: ../gtk/main.c:1268 msgid "Call error" msgstr "" -#: ../gtk/main.c:1270 ../coreapi/linphonecore.c:3842 +#: ../gtk/main.c:1271 ../coreapi/linphonecore.c:3846 msgid "Call ended" msgstr "Samtalet slut" -#: ../gtk/main.c:1273 ../coreapi/call_log.c:221 +#: ../gtk/main.c:1274 ../coreapi/call_log.c:221 msgid "Incoming call" msgstr "Inkommande samtal" -#: ../gtk/main.c:1275 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 +#: ../gtk/main.c:1276 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 msgid "Answer" msgstr "" -#: ../gtk/main.c:1277 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1278 ../gtk/main.ui.h:6 msgid "Decline" msgstr "Avböj" -#: ../gtk/main.c:1283 +#: ../gtk/main.c:1284 msgid "Call paused" msgstr "" -#: ../gtk/main.c:1283 +#: ../gtk/main.c:1284 #, c-format msgid "by %s" msgstr "" -#: ../gtk/main.c:1353 +#: ../gtk/main.c:1354 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1516 +#: ../gtk/main.c:1509 msgid "Website link" msgstr "Webbsajt" -#: ../gtk/main.c:1565 -msgid "Linphone - a video internet phone" -msgstr "Linphone - en video Internet telefon" +#: ../gtk/main.c:1568 ../gtk/waiting.ui.h:1 +msgid "Linphone" +msgstr "Linphone" -#: ../gtk/main.c:1657 +#: ../gtk/main.c:1569 +msgid "A video internet phone" +msgstr "" + +#: ../gtk/main.c:1629 #, c-format msgid "%s (Default)" msgstr "%s (Default)" -#: ../gtk/main.c:1989 ../coreapi/callbacks.c:1057 +#: ../gtk/main.c:1962 ../coreapi/callbacks.c:1063 #, c-format msgid "We are transferred to %s" msgstr "" -#: ../gtk/main.c:1999 +#: ../gtk/main.c:1972 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." msgstr "" -#: ../gtk/main.c:2147 +#: ../gtk/main.c:2117 msgid "A free SIP video-phone" msgstr "En gratis SIP video-telefon" -#: ../gtk/main.c:2252 +#: ../gtk/main.c:2221 #, c-format msgid "Hello\n" msgstr "" @@ -215,7 +219,7 @@ msgstr "" msgid "Presence status" msgstr "Närvarostatus" -#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:552 ../gtk/contact.ui.h:1 +#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:569 ../gtk/contact.ui.h:1 msgid "Name" msgstr "Namn" @@ -256,124 +260,124 @@ msgstr "" msgid "Add new contact from %s directory" msgstr "Lägg till kontakt ifrån %s katalogen" -#: ../gtk/propertybox.c:558 +#: ../gtk/propertybox.c:575 msgid "Rate (Hz)" msgstr "Frekvens (Hz)" -#: ../gtk/propertybox.c:564 +#: ../gtk/propertybox.c:581 msgid "Status" msgstr "Status" -#: ../gtk/propertybox.c:570 +#: ../gtk/propertybox.c:587 msgid "IP Bitrate (kbit/s)" msgstr "" -#: ../gtk/propertybox.c:577 +#: ../gtk/propertybox.c:596 msgid "Parameters" msgstr "Parametrar" -#: ../gtk/propertybox.c:620 ../gtk/propertybox.c:763 +#: ../gtk/propertybox.c:639 ../gtk/propertybox.c:782 msgid "Enabled" msgstr "På" -#: ../gtk/propertybox.c:622 ../gtk/propertybox.c:763 ../gtk/parameters.ui.h:20 +#: ../gtk/propertybox.c:641 ../gtk/propertybox.c:782 ../gtk/parameters.ui.h:20 msgid "Disabled" msgstr "Av" -#: ../gtk/propertybox.c:809 +#: ../gtk/propertybox.c:828 msgid "Account" msgstr "Konto" -#: ../gtk/propertybox.c:1072 +#: ../gtk/propertybox.c:1091 msgid "English" msgstr "Engelska" -#: ../gtk/propertybox.c:1073 +#: ../gtk/propertybox.c:1092 msgid "French" msgstr "Fransk" -#: ../gtk/propertybox.c:1074 +#: ../gtk/propertybox.c:1093 msgid "Swedish" msgstr "Svenska" -#: ../gtk/propertybox.c:1075 +#: ../gtk/propertybox.c:1094 msgid "Italian" msgstr "Italiensk" -#: ../gtk/propertybox.c:1076 +#: ../gtk/propertybox.c:1095 msgid "Spanish" msgstr "Spanska" -#: ../gtk/propertybox.c:1077 +#: ../gtk/propertybox.c:1096 msgid "Brazilian Portugese" msgstr "Portugisiska" -#: ../gtk/propertybox.c:1078 +#: ../gtk/propertybox.c:1097 msgid "Polish" msgstr "Polska" -#: ../gtk/propertybox.c:1079 +#: ../gtk/propertybox.c:1098 msgid "German" msgstr "Tyska" -#: ../gtk/propertybox.c:1080 +#: ../gtk/propertybox.c:1099 msgid "Russian" msgstr "Ryska" -#: ../gtk/propertybox.c:1081 +#: ../gtk/propertybox.c:1100 msgid "Japanese" msgstr "Japanska" -#: ../gtk/propertybox.c:1082 +#: ../gtk/propertybox.c:1101 msgid "Dutch" msgstr "Nederländksa" -#: ../gtk/propertybox.c:1083 +#: ../gtk/propertybox.c:1102 msgid "Hungarian" msgstr "Hungerska" -#: ../gtk/propertybox.c:1084 +#: ../gtk/propertybox.c:1103 msgid "Czech" msgstr "Tjekiska" -#: ../gtk/propertybox.c:1085 +#: ../gtk/propertybox.c:1104 msgid "Chinese" msgstr "Kinesiska" -#: ../gtk/propertybox.c:1086 +#: ../gtk/propertybox.c:1105 msgid "Traditional Chinese" msgstr "" -#: ../gtk/propertybox.c:1087 +#: ../gtk/propertybox.c:1106 msgid "Norwegian" msgstr "" -#: ../gtk/propertybox.c:1088 +#: ../gtk/propertybox.c:1107 msgid "Hebrew" msgstr "" -#: ../gtk/propertybox.c:1089 +#: ../gtk/propertybox.c:1108 msgid "Serbian" msgstr "" -#: ../gtk/propertybox.c:1156 +#: ../gtk/propertybox.c:1175 msgid "" "You need to restart linphone for the new language selection to take effect." msgstr "Du behöver starta om programmet för att det nya språket ska synas." -#: ../gtk/propertybox.c:1236 +#: ../gtk/propertybox.c:1255 msgid "None" msgstr "" -#: ../gtk/propertybox.c:1240 +#: ../gtk/propertybox.c:1259 msgid "SRTP" msgstr "" -#: ../gtk/propertybox.c:1246 +#: ../gtk/propertybox.c:1265 msgid "DTLS" msgstr "" -#: ../gtk/propertybox.c:1253 +#: ../gtk/propertybox.c:1272 msgid "ZRTP" msgstr "" @@ -415,133 +419,133 @@ msgid_plural "Found %i contacts" msgstr[0] "Hittat kontakt %i" msgstr[1] "Hittat kontakt %i" -#: ../gtk/setupwizard.c:34 +#: ../gtk/setupwizard.c:32 msgid "" "Welcome!\n" "This assistant will help you to use a SIP account for your calls." msgstr "" -#: ../gtk/setupwizard.c:43 +#: ../gtk/setupwizard.c:41 msgid "Create an account on linphone.org" msgstr "" -#: ../gtk/setupwizard.c:44 +#: ../gtk/setupwizard.c:42 msgid "I have already a linphone.org account and I just want to use it" msgstr "" -#: ../gtk/setupwizard.c:45 +#: ../gtk/setupwizard.c:43 msgid "I have already a sip account and I just want to use it" msgstr "" -#: ../gtk/setupwizard.c:46 +#: ../gtk/setupwizard.c:44 msgid "I want to specify a remote configuration URI" msgstr "" -#: ../gtk/setupwizard.c:89 +#: ../gtk/setupwizard.c:87 msgid "Enter your linphone.org username" msgstr "" -#: ../gtk/setupwizard.c:102 ../gtk/parameters.ui.h:85 ../gtk/ldap.ui.h:4 +#: ../gtk/setupwizard.c:100 ../gtk/parameters.ui.h:85 ../gtk/ldap.ui.h:4 msgid "Username:" msgstr "Användarnamn:" -#: ../gtk/setupwizard.c:104 ../gtk/password.ui.h:4 ../gtk/ldap.ui.h:5 +#: ../gtk/setupwizard.c:102 ../gtk/password.ui.h:4 ../gtk/ldap.ui.h:5 msgid "Password:" msgstr "Lösenord:" -#: ../gtk/setupwizard.c:124 +#: ../gtk/setupwizard.c:122 msgid "Enter your account informations" msgstr "" -#: ../gtk/setupwizard.c:140 +#: ../gtk/setupwizard.c:138 msgid "Username*" msgstr "" -#: ../gtk/setupwizard.c:141 +#: ../gtk/setupwizard.c:139 msgid "Password*" msgstr "" -#: ../gtk/setupwizard.c:144 +#: ../gtk/setupwizard.c:142 msgid "Domain*" msgstr "" -#: ../gtk/setupwizard.c:145 +#: ../gtk/setupwizard.c:143 msgid "Proxy" msgstr "" -#: ../gtk/setupwizard.c:317 +#: ../gtk/setupwizard.c:322 msgid "(*) Required fields" msgstr "" -#: ../gtk/setupwizard.c:318 +#: ../gtk/setupwizard.c:323 msgid "Username: (*)" msgstr "" -#: ../gtk/setupwizard.c:320 +#: ../gtk/setupwizard.c:325 msgid "Password: (*)" msgstr "" -#: ../gtk/setupwizard.c:322 +#: ../gtk/setupwizard.c:327 msgid "Email: (*)" msgstr "" -#: ../gtk/setupwizard.c:324 +#: ../gtk/setupwizard.c:329 msgid "Confirm your password: (*)" msgstr "" -#: ../gtk/setupwizard.c:338 +#: ../gtk/setupwizard.c:343 msgid "Keep me informed with linphone updates" msgstr "" -#: ../gtk/setupwizard.c:394 +#: ../gtk/setupwizard.c:399 msgid "" "Error, account not validated, username already used or server unreachable.\n" "Please go back and try again." msgstr "" -#: ../gtk/setupwizard.c:405 +#: ../gtk/setupwizard.c:410 msgid "Thank you. Your account is now configured and ready for use." msgstr "Tack. Ditt konto är nu konfigurerad och färdig att användas." -#: ../gtk/setupwizard.c:413 +#: ../gtk/setupwizard.c:418 msgid "" "Please validate your account by clicking on the link we just sent you by email.\n" "Then come back here and press Next button." msgstr "" -#: ../gtk/setupwizard.c:602 +#: ../gtk/setupwizard.c:609 msgid "SIP account configuration assistant" msgstr "" -#: ../gtk/setupwizard.c:620 +#: ../gtk/setupwizard.c:629 msgid "Welcome to the account setup assistant" msgstr "Välkommen till kontoinstallationsassistenten" -#: ../gtk/setupwizard.c:625 +#: ../gtk/setupwizard.c:634 msgid "Account setup assistant" msgstr "Kontoinstallationsassistenten" -#: ../gtk/setupwizard.c:631 +#: ../gtk/setupwizard.c:640 msgid "Configure your account (step 1/1)" msgstr "" -#: ../gtk/setupwizard.c:636 +#: ../gtk/setupwizard.c:645 msgid "Enter your sip username (step 1/1)" msgstr "" -#: ../gtk/setupwizard.c:640 +#: ../gtk/setupwizard.c:649 msgid "Enter account information (step 1/2)" msgstr "" -#: ../gtk/setupwizard.c:649 +#: ../gtk/setupwizard.c:658 msgid "Validation (step 2/2)" msgstr "" -#: ../gtk/setupwizard.c:654 +#: ../gtk/setupwizard.c:663 msgid "Error" msgstr "" -#: ../gtk/setupwizard.c:658 ../gtk/audio_assistant.c:534 +#: ../gtk/setupwizard.c:667 ../gtk/audio_assistant.c:534 msgid "Terminating" msgstr "" @@ -1495,10 +1499,6 @@ msgstr "Lägg till min lista" msgid "Search somebody" msgstr "Sök efter kontakter" -#: ../gtk/waiting.ui.h:1 -msgid "Linphone" -msgstr "Linphone" - #: ../gtk/waiting.ui.h:2 msgid "Please wait" msgstr "Vänta" @@ -1698,68 +1698,68 @@ msgstr "" msgid "Please wait while fetching configuration from server..." msgstr "" -#: ../coreapi/linphonecore.c:1538 +#: ../coreapi/linphonecore.c:1539 msgid "Ready" msgstr "Redo" -#: ../coreapi/linphonecore.c:2550 +#: ../coreapi/linphonecore.c:2551 msgid "Configuring" msgstr "" -#: ../coreapi/linphonecore.c:2724 +#: ../coreapi/linphonecore.c:2725 msgid "Looking for telephone number destination..." msgstr "Leta efter telefonnummer för destinationen..." -#: ../coreapi/linphonecore.c:2726 +#: ../coreapi/linphonecore.c:2727 msgid "Could not resolve this number." msgstr "Kan inte nå dett nummer." #. must be known at that time -#: ../coreapi/linphonecore.c:3012 +#: ../coreapi/linphonecore.c:3013 msgid "Contacting" msgstr "Kontaktar" -#: ../coreapi/linphonecore.c:3017 +#: ../coreapi/linphonecore.c:3018 msgid "Could not call" msgstr "" -#: ../coreapi/linphonecore.c:3168 +#: ../coreapi/linphonecore.c:3169 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "" -#: ../coreapi/linphonecore.c:3326 +#: ../coreapi/linphonecore.c:3327 msgid "is contacting you" msgstr "" -#: ../coreapi/linphonecore.c:3327 +#: ../coreapi/linphonecore.c:3328 msgid " and asked autoanswer." msgstr "" -#: ../coreapi/linphonecore.c:3451 +#: ../coreapi/linphonecore.c:3452 msgid "Modifying call parameters..." msgstr "" -#: ../coreapi/linphonecore.c:3798 +#: ../coreapi/linphonecore.c:3802 msgid "Connected." msgstr "Kopplad" -#: ../coreapi/linphonecore.c:3823 +#: ../coreapi/linphonecore.c:3827 msgid "Call aborted" msgstr "" -#: ../coreapi/linphonecore.c:4013 +#: ../coreapi/linphonecore.c:4024 msgid "Could not pause the call" msgstr "" -#: ../coreapi/linphonecore.c:4016 +#: ../coreapi/linphonecore.c:4027 msgid "Pausing the current call..." msgstr "" -#: ../coreapi/misc.c:433 +#: ../coreapi/misc.c:434 msgid "Stun lookup in progress..." msgstr "STUN uppslagning pågår..." -#: ../coreapi/misc.c:614 +#: ../coreapi/misc.c:615 msgid "ICE local candidates gathering in progress..." msgstr "" @@ -1844,100 +1844,100 @@ msgstr "" msgid "Early media." msgstr "Tidig media" -#: ../coreapi/callbacks.c:533 +#: ../coreapi/callbacks.c:534 #, c-format msgid "Call with %s is paused." msgstr "" -#: ../coreapi/callbacks.c:546 +#: ../coreapi/callbacks.c:547 #, c-format msgid "Call answered by %s - on hold." msgstr "" -#: ../coreapi/callbacks.c:556 +#: ../coreapi/callbacks.c:557 msgid "Call resumed." msgstr "" -#: ../coreapi/callbacks.c:560 +#: ../coreapi/callbacks.c:561 #, c-format msgid "Call answered by %s." msgstr "" -#: ../coreapi/callbacks.c:583 +#: ../coreapi/callbacks.c:584 msgid "Incompatible, check codecs or security settings..." msgstr "" -#: ../coreapi/callbacks.c:588 ../coreapi/callbacks.c:900 +#: ../coreapi/callbacks.c:589 ../coreapi/callbacks.c:906 msgid "Incompatible media parameters." msgstr "" -#: ../coreapi/callbacks.c:618 +#: ../coreapi/callbacks.c:619 msgid "We have been resumed." msgstr "" #. we are being paused -#: ../coreapi/callbacks.c:626 +#: ../coreapi/callbacks.c:628 msgid "We are paused by other party." msgstr "" #. reINVITE and in-dialogs UPDATE go here -#: ../coreapi/callbacks.c:660 +#: ../coreapi/callbacks.c:666 msgid "Call is updated by remote." msgstr "" -#: ../coreapi/callbacks.c:776 +#: ../coreapi/callbacks.c:782 msgid "Call terminated." msgstr "Samtalet slut." -#: ../coreapi/callbacks.c:804 +#: ../coreapi/callbacks.c:810 msgid "User is busy." msgstr "Användare upptagen." -#: ../coreapi/callbacks.c:805 +#: ../coreapi/callbacks.c:811 msgid "User is temporarily unavailable." msgstr "Användaren temporärt inte tillgänglig." #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:807 +#: ../coreapi/callbacks.c:813 msgid "User does not want to be disturbed." msgstr "Användaren vill inte bli störd." -#: ../coreapi/callbacks.c:808 +#: ../coreapi/callbacks.c:814 msgid "Call declined." msgstr "Samtalet avböjdes." -#: ../coreapi/callbacks.c:823 +#: ../coreapi/callbacks.c:829 msgid "Request timeout." msgstr "" -#: ../coreapi/callbacks.c:854 +#: ../coreapi/callbacks.c:860 msgid "Redirected" msgstr "" -#: ../coreapi/callbacks.c:909 +#: ../coreapi/callbacks.c:915 msgid "Call failed." msgstr "" -#: ../coreapi/callbacks.c:987 +#: ../coreapi/callbacks.c:993 #, c-format msgid "Registration on %s successful." msgstr "Registrering hos %s lyckades." -#: ../coreapi/callbacks.c:988 +#: ../coreapi/callbacks.c:994 #, c-format msgid "Unregistration on %s done." msgstr "Avregistrering hos %s lyckades." -#: ../coreapi/callbacks.c:1006 +#: ../coreapi/callbacks.c:1012 msgid "no response timeout" msgstr "Inget svar inom angiven tid" -#: ../coreapi/callbacks.c:1009 +#: ../coreapi/callbacks.c:1015 #, c-format msgid "Registration on %s failed: %s" msgstr "Registrering hos %s mislyckades: %s" -#: ../coreapi/callbacks.c:1016 +#: ../coreapi/callbacks.c:1022 msgid "Service unavailable, retrying" msgstr "" @@ -1947,11 +1947,11 @@ msgstr "" msgid "Authentication token is %s" msgstr "" -#: ../coreapi/linphonecall.c:1306 +#: ../coreapi/linphonecall.c:1310 msgid "Call parameters were successfully modified." msgstr "" -#: ../coreapi/linphonecall.c:3660 +#: ../coreapi/linphonecall.c:3686 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." diff --git a/po/tr.po b/po/tr.po index 3805ddb69..e2d9c815e 100644 --- a/po/tr.po +++ b/po/tr.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: linphone-gtk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-04-01 16:25+0200\n" -"PO-Revision-Date: 2015-04-12 14:15+0000\n" -"Last-Translator: faradundamarti \n" +"POT-Creation-Date: 2015-04-30 10:13+0200\n" +"PO-Revision-Date: 2015-04-30 08:13+0000\n" +"Last-Translator: Belledonne Communications \n" "Language-Team: Turkish (http://www.transifex.com/projects/p/linphone-gtk/language/tr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -88,45 +88,45 @@ msgstr "" msgid "Couldn't find pixmap file: %s" msgstr "" -#: ../gtk/main.c:136 +#: ../gtk/main.c:137 msgid "log to stdout some debug information while running." msgstr "" -#: ../gtk/main.c:137 +#: ../gtk/main.c:138 msgid "path to a file to write logs into." msgstr "Günlükleri içine yazmak için bir dosya yolu" -#: ../gtk/main.c:138 +#: ../gtk/main.c:139 msgid "Start linphone with video disabled." msgstr "Linphonu görüntü olmadan başlat" -#: ../gtk/main.c:139 +#: ../gtk/main.c:140 msgid "Start only in the system tray, do not show the main interface." msgstr "Sadece sistem tepsisinde başlat, ana arayüzü gösterme." -#: ../gtk/main.c:140 +#: ../gtk/main.c:141 msgid "address to call right now" msgstr "adres ara" -#: ../gtk/main.c:141 +#: ../gtk/main.c:142 msgid "" "Specifiy a working directory (should be the base of the installation, eg: " "c:\\Program Files\\Linphone)" msgstr "Bir çalışma dizini belirtin (kurulum temelinde olmalı,örneğin: c:\\Program Files\\Linphone)" -#: ../gtk/main.c:142 +#: ../gtk/main.c:143 msgid "Configuration file" msgstr "Yapılandırma dosyası" -#: ../gtk/main.c:143 +#: ../gtk/main.c:144 msgid "Run the audio assistant" msgstr "Ses yardımcısını çalıştır" -#: ../gtk/main.c:144 +#: ../gtk/main.c:145 msgid "Run self test and exit 0 if succeed" msgstr "" -#: ../gtk/main.c:1069 +#: ../gtk/main.c:1070 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -134,76 +134,80 @@ msgid "" "If you answer no, this person will be temporarily blacklisted." msgstr "" -#: ../gtk/main.c:1146 +#: ../gtk/main.c:1147 #, c-format msgid "" "Please enter your password for username %s\n" " at realm %s:" msgstr "" -#: ../gtk/main.c:1267 +#: ../gtk/main.c:1268 msgid "Call error" msgstr "Çağrı yanlış" -#: ../gtk/main.c:1270 ../coreapi/linphonecore.c:3842 +#: ../gtk/main.c:1271 ../coreapi/linphonecore.c:3846 msgid "Call ended" msgstr "Çağrı sonlandırıldı" -#: ../gtk/main.c:1273 ../coreapi/call_log.c:221 +#: ../gtk/main.c:1274 ../coreapi/call_log.c:221 msgid "Incoming call" msgstr "Gelen çağrı" -#: ../gtk/main.c:1275 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 +#: ../gtk/main.c:1276 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 msgid "Answer" msgstr "Yanıt" -#: ../gtk/main.c:1277 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1278 ../gtk/main.ui.h:6 msgid "Decline" msgstr "Reddet" -#: ../gtk/main.c:1283 +#: ../gtk/main.c:1284 msgid "Call paused" msgstr "Çağrı duraklatıldı" -#: ../gtk/main.c:1283 +#: ../gtk/main.c:1284 #, c-format msgid "by %s" msgstr "" -#: ../gtk/main.c:1353 +#: ../gtk/main.c:1354 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1516 +#: ../gtk/main.c:1509 msgid "Website link" msgstr "İnternet " -#: ../gtk/main.c:1565 -msgid "Linphone - a video internet phone" -msgstr "Linphone - görüntülü internet telefonu" +#: ../gtk/main.c:1568 ../gtk/waiting.ui.h:1 +msgid "Linphone" +msgstr "Linphone" -#: ../gtk/main.c:1657 +#: ../gtk/main.c:1569 +msgid "A video internet phone" +msgstr "" + +#: ../gtk/main.c:1629 #, c-format msgid "%s (Default)" msgstr "" -#: ../gtk/main.c:1989 ../coreapi/callbacks.c:1057 +#: ../gtk/main.c:1962 ../coreapi/callbacks.c:1063 #, c-format msgid "We are transferred to %s" msgstr "" -#: ../gtk/main.c:1999 +#: ../gtk/main.c:1972 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." msgstr "" -#: ../gtk/main.c:2147 +#: ../gtk/main.c:2117 msgid "A free SIP video-phone" msgstr "Özgür bir SİP görüntülü-telefon" -#: ../gtk/main.c:2252 +#: ../gtk/main.c:2221 #, c-format msgid "Hello\n" msgstr "Merhaba\n" @@ -216,7 +220,7 @@ msgstr "Adres defterine ekle" msgid "Presence status" msgstr "durum bilgisi" -#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:552 ../gtk/contact.ui.h:1 +#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:569 ../gtk/contact.ui.h:1 msgid "Name" msgstr "Ad" @@ -257,124 +261,124 @@ msgstr "" msgid "Add new contact from %s directory" msgstr "" -#: ../gtk/propertybox.c:558 +#: ../gtk/propertybox.c:575 msgid "Rate (Hz)" msgstr "Hız (Hz)" -#: ../gtk/propertybox.c:564 +#: ../gtk/propertybox.c:581 msgid "Status" msgstr "Durum" -#: ../gtk/propertybox.c:570 +#: ../gtk/propertybox.c:587 msgid "IP Bitrate (kbit/s)" msgstr "İP Bit hızı (kbit/s)" -#: ../gtk/propertybox.c:577 +#: ../gtk/propertybox.c:596 msgid "Parameters" msgstr "Değişkenler" -#: ../gtk/propertybox.c:620 ../gtk/propertybox.c:763 +#: ../gtk/propertybox.c:639 ../gtk/propertybox.c:782 msgid "Enabled" msgstr "Etkin" -#: ../gtk/propertybox.c:622 ../gtk/propertybox.c:763 ../gtk/parameters.ui.h:20 +#: ../gtk/propertybox.c:641 ../gtk/propertybox.c:782 ../gtk/parameters.ui.h:20 msgid "Disabled" msgstr "Devre dışı" -#: ../gtk/propertybox.c:809 +#: ../gtk/propertybox.c:828 msgid "Account" msgstr "Hesap" -#: ../gtk/propertybox.c:1072 +#: ../gtk/propertybox.c:1091 msgid "English" msgstr "İngilizce" -#: ../gtk/propertybox.c:1073 +#: ../gtk/propertybox.c:1092 msgid "French" msgstr "Fransızca" -#: ../gtk/propertybox.c:1074 +#: ../gtk/propertybox.c:1093 msgid "Swedish" msgstr "İsveççe" -#: ../gtk/propertybox.c:1075 +#: ../gtk/propertybox.c:1094 msgid "Italian" msgstr "İtalyanca" -#: ../gtk/propertybox.c:1076 +#: ../gtk/propertybox.c:1095 msgid "Spanish" msgstr "İspanyolca" -#: ../gtk/propertybox.c:1077 +#: ../gtk/propertybox.c:1096 msgid "Brazilian Portugese" msgstr "Brezilya Portekizcesi" -#: ../gtk/propertybox.c:1078 +#: ../gtk/propertybox.c:1097 msgid "Polish" msgstr "Lehçe" -#: ../gtk/propertybox.c:1079 +#: ../gtk/propertybox.c:1098 msgid "German" msgstr "Almanca" -#: ../gtk/propertybox.c:1080 +#: ../gtk/propertybox.c:1099 msgid "Russian" msgstr "Rusca" -#: ../gtk/propertybox.c:1081 +#: ../gtk/propertybox.c:1100 msgid "Japanese" msgstr "Japonca" -#: ../gtk/propertybox.c:1082 +#: ../gtk/propertybox.c:1101 msgid "Dutch" msgstr "Flemenkçe" -#: ../gtk/propertybox.c:1083 +#: ../gtk/propertybox.c:1102 msgid "Hungarian" msgstr "Macarca" -#: ../gtk/propertybox.c:1084 +#: ../gtk/propertybox.c:1103 msgid "Czech" msgstr "Çekce" -#: ../gtk/propertybox.c:1085 +#: ../gtk/propertybox.c:1104 msgid "Chinese" msgstr "Çince" -#: ../gtk/propertybox.c:1086 +#: ../gtk/propertybox.c:1105 msgid "Traditional Chinese" msgstr "Geleneksel Çince" -#: ../gtk/propertybox.c:1087 +#: ../gtk/propertybox.c:1106 msgid "Norwegian" msgstr "Norveççe" -#: ../gtk/propertybox.c:1088 +#: ../gtk/propertybox.c:1107 msgid "Hebrew" msgstr "İbranice" -#: ../gtk/propertybox.c:1089 +#: ../gtk/propertybox.c:1108 msgid "Serbian" msgstr "Sırpça" -#: ../gtk/propertybox.c:1156 +#: ../gtk/propertybox.c:1175 msgid "" "You need to restart linphone for the new language selection to take effect." msgstr "Yeni dil seçiminizin etkili olabilmesi için linfonu yeniden başlatmalısınız." -#: ../gtk/propertybox.c:1236 +#: ../gtk/propertybox.c:1255 msgid "None" msgstr "Hiçbiri" -#: ../gtk/propertybox.c:1240 +#: ../gtk/propertybox.c:1259 msgid "SRTP" msgstr "SRTP (Güvenli Gerçek Zamanlı Aktarım Protokolü)" -#: ../gtk/propertybox.c:1246 +#: ../gtk/propertybox.c:1265 msgid "DTLS" msgstr "DTLS" -#: ../gtk/propertybox.c:1253 +#: ../gtk/propertybox.c:1272 msgid "ZRTP" msgstr "ZRTP" @@ -416,133 +420,133 @@ msgid_plural "Found %i contacts" msgstr[0] "" msgstr[1] "" -#: ../gtk/setupwizard.c:34 +#: ../gtk/setupwizard.c:32 msgid "" "Welcome!\n" "This assistant will help you to use a SIP account for your calls." msgstr "Hoşgeldiniz!\nBu yardımcı,çağrılarınız için bir SIP hesabı kullanmanıza yardım edecek." -#: ../gtk/setupwizard.c:43 +#: ../gtk/setupwizard.c:41 msgid "Create an account on linphone.org" msgstr "linphone.org'da bir hesap oluştur" -#: ../gtk/setupwizard.c:44 +#: ../gtk/setupwizard.c:42 msgid "I have already a linphone.org account and I just want to use it" msgstr "" -#: ../gtk/setupwizard.c:45 +#: ../gtk/setupwizard.c:43 msgid "I have already a sip account and I just want to use it" msgstr "" -#: ../gtk/setupwizard.c:46 +#: ../gtk/setupwizard.c:44 msgid "I want to specify a remote configuration URI" msgstr "" -#: ../gtk/setupwizard.c:89 +#: ../gtk/setupwizard.c:87 msgid "Enter your linphone.org username" msgstr "linphone.org kullanıcı adınızı girin" -#: ../gtk/setupwizard.c:102 ../gtk/parameters.ui.h:85 ../gtk/ldap.ui.h:4 +#: ../gtk/setupwizard.c:100 ../gtk/parameters.ui.h:85 ../gtk/ldap.ui.h:4 msgid "Username:" msgstr "Kullanıcı adı:" -#: ../gtk/setupwizard.c:104 ../gtk/password.ui.h:4 ../gtk/ldap.ui.h:5 +#: ../gtk/setupwizard.c:102 ../gtk/password.ui.h:4 ../gtk/ldap.ui.h:5 msgid "Password:" msgstr "Parola:" -#: ../gtk/setupwizard.c:124 +#: ../gtk/setupwizard.c:122 msgid "Enter your account informations" msgstr "Hesap bilgilerinizi girin" -#: ../gtk/setupwizard.c:140 +#: ../gtk/setupwizard.c:138 msgid "Username*" msgstr "Kallanıcı adı*" -#: ../gtk/setupwizard.c:141 +#: ../gtk/setupwizard.c:139 msgid "Password*" msgstr "Parola*" -#: ../gtk/setupwizard.c:144 +#: ../gtk/setupwizard.c:142 msgid "Domain*" msgstr "Alan adı*" -#: ../gtk/setupwizard.c:145 +#: ../gtk/setupwizard.c:143 msgid "Proxy" msgstr "Vekil sunucu" -#: ../gtk/setupwizard.c:317 +#: ../gtk/setupwizard.c:322 msgid "(*) Required fields" msgstr "(*) Zorunlu alanlar" -#: ../gtk/setupwizard.c:318 +#: ../gtk/setupwizard.c:323 msgid "Username: (*)" msgstr "Kullanıcı adı: (*)" -#: ../gtk/setupwizard.c:320 +#: ../gtk/setupwizard.c:325 msgid "Password: (*)" msgstr "Parola: (*)" -#: ../gtk/setupwizard.c:322 +#: ../gtk/setupwizard.c:327 msgid "Email: (*)" msgstr "E-posta: (*)" -#: ../gtk/setupwizard.c:324 +#: ../gtk/setupwizard.c:329 msgid "Confirm your password: (*)" msgstr "Parolanızı onaylayın: (*)" -#: ../gtk/setupwizard.c:338 +#: ../gtk/setupwizard.c:343 msgid "Keep me informed with linphone updates" msgstr "linphone güncellemeleri hakkında beni bilgilendir" -#: ../gtk/setupwizard.c:394 +#: ../gtk/setupwizard.c:399 msgid "" "Error, account not validated, username already used or server unreachable.\n" "Please go back and try again." msgstr "Hata,hesap geçersiz,kullanıcı adı kullanılıyor veya sunucuya erişilemiyor.\nLütfen geri dönün ve tekrar deneyin." -#: ../gtk/setupwizard.c:405 +#: ../gtk/setupwizard.c:410 msgid "Thank you. Your account is now configured and ready for use." msgstr "Teşekkürler. Hesabınız yapılandırıldı ve kullanıma hazır." -#: ../gtk/setupwizard.c:413 +#: ../gtk/setupwizard.c:418 msgid "" "Please validate your account by clicking on the link we just sent you by email.\n" "Then come back here and press Next button." msgstr "Lütfen size e-posta yoluyla gönderdiğimiz bağlantıyı tıklayarak hesabınızı doğrulayın.\nSonra buraya geri dönün ve İleri düğmesine basın." -#: ../gtk/setupwizard.c:602 +#: ../gtk/setupwizard.c:609 msgid "SIP account configuration assistant" msgstr "SİP hesabı yapılandırma yardımcısı" -#: ../gtk/setupwizard.c:620 +#: ../gtk/setupwizard.c:629 msgid "Welcome to the account setup assistant" msgstr "Hesap açma yardımcısına hoşgeldiniz" -#: ../gtk/setupwizard.c:625 +#: ../gtk/setupwizard.c:634 msgid "Account setup assistant" msgstr "Hesap açma yardımcısı" -#: ../gtk/setupwizard.c:631 +#: ../gtk/setupwizard.c:640 msgid "Configure your account (step 1/1)" msgstr "Hesabınızı yapılandırın (adım 1/1)" -#: ../gtk/setupwizard.c:636 +#: ../gtk/setupwizard.c:645 msgid "Enter your sip username (step 1/1)" msgstr "sip kullanıcı adınızı girin (adım 1/1)" -#: ../gtk/setupwizard.c:640 +#: ../gtk/setupwizard.c:649 msgid "Enter account information (step 1/2)" msgstr "Hesap bilgilerini girin (adım 1/2)" -#: ../gtk/setupwizard.c:649 +#: ../gtk/setupwizard.c:658 msgid "Validation (step 2/2)" msgstr "Doğrulama (adım 2/2)" -#: ../gtk/setupwizard.c:654 +#: ../gtk/setupwizard.c:663 msgid "Error" msgstr "Hata" -#: ../gtk/setupwizard.c:658 ../gtk/audio_assistant.c:534 +#: ../gtk/setupwizard.c:667 ../gtk/audio_assistant.c:534 msgid "Terminating" msgstr "Sonlandırma" @@ -1496,10 +1500,6 @@ msgstr "Listeme ekle" msgid "Search somebody" msgstr "" -#: ../gtk/waiting.ui.h:1 -msgid "Linphone" -msgstr "Linphone" - #: ../gtk/waiting.ui.h:2 msgid "Please wait" msgstr "Lütfen bekleyin" @@ -1699,68 +1699,68 @@ msgstr "Yapılandırılıyor..." msgid "Please wait while fetching configuration from server..." msgstr "" -#: ../coreapi/linphonecore.c:1538 +#: ../coreapi/linphonecore.c:1539 msgid "Ready" msgstr "Hazır" -#: ../coreapi/linphonecore.c:2550 +#: ../coreapi/linphonecore.c:2551 msgid "Configuring" msgstr "Yapılandırılıyor" -#: ../coreapi/linphonecore.c:2724 +#: ../coreapi/linphonecore.c:2725 msgid "Looking for telephone number destination..." msgstr "" -#: ../coreapi/linphonecore.c:2726 +#: ../coreapi/linphonecore.c:2727 msgid "Could not resolve this number." msgstr "" #. must be known at that time -#: ../coreapi/linphonecore.c:3012 +#: ../coreapi/linphonecore.c:3013 msgid "Contacting" msgstr "Bağlanıyor" -#: ../coreapi/linphonecore.c:3017 +#: ../coreapi/linphonecore.c:3018 msgid "Could not call" msgstr "" -#: ../coreapi/linphonecore.c:3168 +#: ../coreapi/linphonecore.c:3169 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "" -#: ../coreapi/linphonecore.c:3326 +#: ../coreapi/linphonecore.c:3327 msgid "is contacting you" msgstr "" -#: ../coreapi/linphonecore.c:3327 +#: ../coreapi/linphonecore.c:3328 msgid " and asked autoanswer." msgstr "" -#: ../coreapi/linphonecore.c:3451 +#: ../coreapi/linphonecore.c:3452 msgid "Modifying call parameters..." msgstr "" -#: ../coreapi/linphonecore.c:3798 +#: ../coreapi/linphonecore.c:3802 msgid "Connected." msgstr "Bağlandı." -#: ../coreapi/linphonecore.c:3823 +#: ../coreapi/linphonecore.c:3827 msgid "Call aborted" msgstr "Çağrı iptal edildi" -#: ../coreapi/linphonecore.c:4013 +#: ../coreapi/linphonecore.c:4024 msgid "Could not pause the call" msgstr "" -#: ../coreapi/linphonecore.c:4016 +#: ../coreapi/linphonecore.c:4027 msgid "Pausing the current call..." msgstr "" -#: ../coreapi/misc.c:433 +#: ../coreapi/misc.c:434 msgid "Stun lookup in progress..." msgstr "" -#: ../coreapi/misc.c:614 +#: ../coreapi/misc.c:615 msgid "ICE local candidates gathering in progress..." msgstr "" @@ -1845,100 +1845,100 @@ msgstr "" msgid "Early media." msgstr "" -#: ../coreapi/callbacks.c:533 +#: ../coreapi/callbacks.c:534 #, c-format msgid "Call with %s is paused." msgstr "" -#: ../coreapi/callbacks.c:546 +#: ../coreapi/callbacks.c:547 #, c-format msgid "Call answered by %s - on hold." msgstr "" -#: ../coreapi/callbacks.c:556 +#: ../coreapi/callbacks.c:557 msgid "Call resumed." msgstr "" -#: ../coreapi/callbacks.c:560 +#: ../coreapi/callbacks.c:561 #, c-format msgid "Call answered by %s." msgstr "" -#: ../coreapi/callbacks.c:583 +#: ../coreapi/callbacks.c:584 msgid "Incompatible, check codecs or security settings..." msgstr "" -#: ../coreapi/callbacks.c:588 ../coreapi/callbacks.c:900 +#: ../coreapi/callbacks.c:589 ../coreapi/callbacks.c:906 msgid "Incompatible media parameters." msgstr "" -#: ../coreapi/callbacks.c:618 +#: ../coreapi/callbacks.c:619 msgid "We have been resumed." msgstr "" #. we are being paused -#: ../coreapi/callbacks.c:626 +#: ../coreapi/callbacks.c:628 msgid "We are paused by other party." msgstr "" #. reINVITE and in-dialogs UPDATE go here -#: ../coreapi/callbacks.c:660 +#: ../coreapi/callbacks.c:666 msgid "Call is updated by remote." msgstr "" -#: ../coreapi/callbacks.c:776 +#: ../coreapi/callbacks.c:782 msgid "Call terminated." msgstr "Çağrı sonlandırıldı" -#: ../coreapi/callbacks.c:804 +#: ../coreapi/callbacks.c:810 msgid "User is busy." msgstr "Kullanıcı meşgul" -#: ../coreapi/callbacks.c:805 +#: ../coreapi/callbacks.c:811 msgid "User is temporarily unavailable." msgstr "" #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:807 +#: ../coreapi/callbacks.c:813 msgid "User does not want to be disturbed." msgstr "Kullanıcı rahatsız edilmek istemiyor." -#: ../coreapi/callbacks.c:808 +#: ../coreapi/callbacks.c:814 msgid "Call declined." msgstr "Çağrı reddedildi." -#: ../coreapi/callbacks.c:823 +#: ../coreapi/callbacks.c:829 msgid "Request timeout." msgstr "İstek zamanaşımına uğradı." -#: ../coreapi/callbacks.c:854 +#: ../coreapi/callbacks.c:860 msgid "Redirected" msgstr "Yeniden yönlendirildi" -#: ../coreapi/callbacks.c:909 +#: ../coreapi/callbacks.c:915 msgid "Call failed." msgstr "Arama başarısız" -#: ../coreapi/callbacks.c:987 +#: ../coreapi/callbacks.c:993 #, c-format msgid "Registration on %s successful." msgstr "" -#: ../coreapi/callbacks.c:988 +#: ../coreapi/callbacks.c:994 #, c-format msgid "Unregistration on %s done." msgstr "" -#: ../coreapi/callbacks.c:1006 +#: ../coreapi/callbacks.c:1012 msgid "no response timeout" msgstr "" -#: ../coreapi/callbacks.c:1009 +#: ../coreapi/callbacks.c:1015 #, c-format msgid "Registration on %s failed: %s" msgstr "" -#: ../coreapi/callbacks.c:1016 +#: ../coreapi/callbacks.c:1022 msgid "Service unavailable, retrying" msgstr "Servis kullanımdışı, tekrar deneyin" @@ -1948,11 +1948,11 @@ msgstr "Servis kullanımdışı, tekrar deneyin" msgid "Authentication token is %s" msgstr "" -#: ../coreapi/linphonecall.c:1306 +#: ../coreapi/linphonecall.c:1310 msgid "Call parameters were successfully modified." msgstr "" -#: ../coreapi/linphonecall.c:3660 +#: ../coreapi/linphonecall.c:3686 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." diff --git a/po/zh_CN.po b/po/zh_CN.po index 9febd0d72..00322bce9 100644 --- a/po/zh_CN.po +++ b/po/zh_CN.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: linphone-gtk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-04-01 16:25+0200\n" -"PO-Revision-Date: 2015-04-01 14:26+0000\n" +"POT-Creation-Date: 2015-04-30 10:13+0200\n" +"PO-Revision-Date: 2015-04-30 08:13+0000\n" "Last-Translator: Belledonne Communications \n" "Language-Team: Chinese (China) (http://www.transifex.com/projects/p/linphone-gtk/language/zh_CN/)\n" "MIME-Version: 1.0\n" @@ -85,45 +85,45 @@ msgstr "" msgid "Couldn't find pixmap file: %s" msgstr "无法打开位图文件:%s" -#: ../gtk/main.c:136 +#: ../gtk/main.c:137 msgid "log to stdout some debug information while running." msgstr "运行时向标准输出记录调试信息。" -#: ../gtk/main.c:137 +#: ../gtk/main.c:138 msgid "path to a file to write logs into." msgstr "" -#: ../gtk/main.c:138 +#: ../gtk/main.c:139 msgid "Start linphone with video disabled." msgstr "" -#: ../gtk/main.c:139 +#: ../gtk/main.c:140 msgid "Start only in the system tray, do not show the main interface." msgstr "启动到系统托盘,不显示主界面。" -#: ../gtk/main.c:140 +#: ../gtk/main.c:141 msgid "address to call right now" msgstr "现在呼叫的地址" -#: ../gtk/main.c:141 +#: ../gtk/main.c:142 msgid "" "Specifiy a working directory (should be the base of the installation, eg: " "c:\\Program Files\\Linphone)" msgstr "指定工作目录(应为安装目录例如 C:\\Program Files\\Linphone)" -#: ../gtk/main.c:142 +#: ../gtk/main.c:143 msgid "Configuration file" msgstr "" -#: ../gtk/main.c:143 +#: ../gtk/main.c:144 msgid "Run the audio assistant" msgstr "" -#: ../gtk/main.c:144 +#: ../gtk/main.c:145 msgid "Run self test and exit 0 if succeed" msgstr "" -#: ../gtk/main.c:1069 +#: ../gtk/main.c:1070 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -131,76 +131,80 @@ msgid "" "If you answer no, this person will be temporarily blacklisted." msgstr "%s 想加您为联系人。\n您是否允许他看到您的在线状态或者将它加为您的联系人允许?\n如果您回答否,则会将该人临时性的放入黑名单" -#: ../gtk/main.c:1146 +#: ../gtk/main.c:1147 #, c-format msgid "" "Please enter your password for username %s\n" " at realm %s:" msgstr "" -#: ../gtk/main.c:1267 +#: ../gtk/main.c:1268 msgid "Call error" msgstr "" -#: ../gtk/main.c:1270 ../coreapi/linphonecore.c:3842 +#: ../gtk/main.c:1271 ../coreapi/linphonecore.c:3846 msgid "Call ended" msgstr "呼叫结束" -#: ../gtk/main.c:1273 ../coreapi/call_log.c:221 +#: ../gtk/main.c:1274 ../coreapi/call_log.c:221 msgid "Incoming call" msgstr "呼入" -#: ../gtk/main.c:1275 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 +#: ../gtk/main.c:1276 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 msgid "Answer" msgstr "" -#: ../gtk/main.c:1277 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1278 ../gtk/main.ui.h:6 msgid "Decline" msgstr "拒绝" -#: ../gtk/main.c:1283 +#: ../gtk/main.c:1284 msgid "Call paused" msgstr "" -#: ../gtk/main.c:1283 +#: ../gtk/main.c:1284 #, c-format msgid "by %s" msgstr "" -#: ../gtk/main.c:1353 +#: ../gtk/main.c:1354 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1516 +#: ../gtk/main.c:1509 msgid "Website link" msgstr "网站" -#: ../gtk/main.c:1565 -msgid "Linphone - a video internet phone" -msgstr "Linphone - 互联网视频电话" +#: ../gtk/main.c:1568 ../gtk/waiting.ui.h:1 +msgid "Linphone" +msgstr "Linphone" -#: ../gtk/main.c:1657 +#: ../gtk/main.c:1569 +msgid "A video internet phone" +msgstr "" + +#: ../gtk/main.c:1629 #, c-format msgid "%s (Default)" msgstr "%s (默认)" -#: ../gtk/main.c:1989 ../coreapi/callbacks.c:1057 +#: ../gtk/main.c:1962 ../coreapi/callbacks.c:1063 #, c-format msgid "We are transferred to %s" msgstr "" -#: ../gtk/main.c:1999 +#: ../gtk/main.c:1972 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." msgstr "未在此计算机上检测到声卡。\n您无法发送或接收音频呼叫。" -#: ../gtk/main.c:2147 +#: ../gtk/main.c:2117 msgid "A free SIP video-phone" msgstr "免费的 SIP 视频电话" -#: ../gtk/main.c:2252 +#: ../gtk/main.c:2221 #, c-format msgid "Hello\n" msgstr "" @@ -213,7 +217,7 @@ msgstr "" msgid "Presence status" msgstr "在线状态" -#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:552 ../gtk/contact.ui.h:1 +#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:569 ../gtk/contact.ui.h:1 msgid "Name" msgstr "名称" @@ -254,124 +258,124 @@ msgstr "" msgid "Add new contact from %s directory" msgstr "从 %s 目录增加联系人 " -#: ../gtk/propertybox.c:558 +#: ../gtk/propertybox.c:575 msgid "Rate (Hz)" msgstr "采样率(Hz)" -#: ../gtk/propertybox.c:564 +#: ../gtk/propertybox.c:581 msgid "Status" msgstr "状态" -#: ../gtk/propertybox.c:570 +#: ../gtk/propertybox.c:587 msgid "IP Bitrate (kbit/s)" msgstr "" -#: ../gtk/propertybox.c:577 +#: ../gtk/propertybox.c:596 msgid "Parameters" msgstr "参数" -#: ../gtk/propertybox.c:620 ../gtk/propertybox.c:763 +#: ../gtk/propertybox.c:639 ../gtk/propertybox.c:782 msgid "Enabled" msgstr "启用" -#: ../gtk/propertybox.c:622 ../gtk/propertybox.c:763 ../gtk/parameters.ui.h:20 +#: ../gtk/propertybox.c:641 ../gtk/propertybox.c:782 ../gtk/parameters.ui.h:20 msgid "Disabled" msgstr "禁用" -#: ../gtk/propertybox.c:809 +#: ../gtk/propertybox.c:828 msgid "Account" msgstr "帐户" -#: ../gtk/propertybox.c:1072 +#: ../gtk/propertybox.c:1091 msgid "English" msgstr "英语" -#: ../gtk/propertybox.c:1073 +#: ../gtk/propertybox.c:1092 msgid "French" msgstr "法语" -#: ../gtk/propertybox.c:1074 +#: ../gtk/propertybox.c:1093 msgid "Swedish" msgstr "瑞典语" -#: ../gtk/propertybox.c:1075 +#: ../gtk/propertybox.c:1094 msgid "Italian" msgstr "意大利语" -#: ../gtk/propertybox.c:1076 +#: ../gtk/propertybox.c:1095 msgid "Spanish" msgstr "西班牙语" -#: ../gtk/propertybox.c:1077 +#: ../gtk/propertybox.c:1096 msgid "Brazilian Portugese" msgstr "巴西葡萄牙语" -#: ../gtk/propertybox.c:1078 +#: ../gtk/propertybox.c:1097 msgid "Polish" msgstr "波兰语" -#: ../gtk/propertybox.c:1079 +#: ../gtk/propertybox.c:1098 msgid "German" msgstr "德语" -#: ../gtk/propertybox.c:1080 +#: ../gtk/propertybox.c:1099 msgid "Russian" msgstr "俄语" -#: ../gtk/propertybox.c:1081 +#: ../gtk/propertybox.c:1100 msgid "Japanese" msgstr "日语" -#: ../gtk/propertybox.c:1082 +#: ../gtk/propertybox.c:1101 msgid "Dutch" msgstr "荷兰语" -#: ../gtk/propertybox.c:1083 +#: ../gtk/propertybox.c:1102 msgid "Hungarian" msgstr "匈牙利语" -#: ../gtk/propertybox.c:1084 +#: ../gtk/propertybox.c:1103 msgid "Czech" msgstr "捷克语" -#: ../gtk/propertybox.c:1085 +#: ../gtk/propertybox.c:1104 msgid "Chinese" msgstr "中文" -#: ../gtk/propertybox.c:1086 +#: ../gtk/propertybox.c:1105 msgid "Traditional Chinese" msgstr "" -#: ../gtk/propertybox.c:1087 +#: ../gtk/propertybox.c:1106 msgid "Norwegian" msgstr "" -#: ../gtk/propertybox.c:1088 +#: ../gtk/propertybox.c:1107 msgid "Hebrew" msgstr "" -#: ../gtk/propertybox.c:1089 +#: ../gtk/propertybox.c:1108 msgid "Serbian" msgstr "" -#: ../gtk/propertybox.c:1156 +#: ../gtk/propertybox.c:1175 msgid "" "You need to restart linphone for the new language selection to take effect." msgstr "您需要重启 linphone 以使语言选择生效。" -#: ../gtk/propertybox.c:1236 +#: ../gtk/propertybox.c:1255 msgid "None" msgstr "" -#: ../gtk/propertybox.c:1240 +#: ../gtk/propertybox.c:1259 msgid "SRTP" msgstr "" -#: ../gtk/propertybox.c:1246 +#: ../gtk/propertybox.c:1265 msgid "DTLS" msgstr "" -#: ../gtk/propertybox.c:1253 +#: ../gtk/propertybox.c:1272 msgid "ZRTP" msgstr "" @@ -412,133 +416,133 @@ msgid "Found %i contact" msgid_plural "Found %i contacts" msgstr[0] "找到 %i 联系方式" -#: ../gtk/setupwizard.c:34 +#: ../gtk/setupwizard.c:32 msgid "" "Welcome!\n" "This assistant will help you to use a SIP account for your calls." msgstr "" -#: ../gtk/setupwizard.c:43 +#: ../gtk/setupwizard.c:41 msgid "Create an account on linphone.org" msgstr "" -#: ../gtk/setupwizard.c:44 +#: ../gtk/setupwizard.c:42 msgid "I have already a linphone.org account and I just want to use it" msgstr "" -#: ../gtk/setupwizard.c:45 +#: ../gtk/setupwizard.c:43 msgid "I have already a sip account and I just want to use it" msgstr "" -#: ../gtk/setupwizard.c:46 +#: ../gtk/setupwizard.c:44 msgid "I want to specify a remote configuration URI" msgstr "" -#: ../gtk/setupwizard.c:89 +#: ../gtk/setupwizard.c:87 msgid "Enter your linphone.org username" msgstr "" -#: ../gtk/setupwizard.c:102 ../gtk/parameters.ui.h:85 ../gtk/ldap.ui.h:4 +#: ../gtk/setupwizard.c:100 ../gtk/parameters.ui.h:85 ../gtk/ldap.ui.h:4 msgid "Username:" msgstr "用户名:" -#: ../gtk/setupwizard.c:104 ../gtk/password.ui.h:4 ../gtk/ldap.ui.h:5 +#: ../gtk/setupwizard.c:102 ../gtk/password.ui.h:4 ../gtk/ldap.ui.h:5 msgid "Password:" msgstr "密码:" -#: ../gtk/setupwizard.c:124 +#: ../gtk/setupwizard.c:122 msgid "Enter your account informations" msgstr "" -#: ../gtk/setupwizard.c:140 +#: ../gtk/setupwizard.c:138 msgid "Username*" msgstr "" -#: ../gtk/setupwizard.c:141 +#: ../gtk/setupwizard.c:139 msgid "Password*" msgstr "" -#: ../gtk/setupwizard.c:144 +#: ../gtk/setupwizard.c:142 msgid "Domain*" msgstr "" -#: ../gtk/setupwizard.c:145 +#: ../gtk/setupwizard.c:143 msgid "Proxy" msgstr "" -#: ../gtk/setupwizard.c:317 +#: ../gtk/setupwizard.c:322 msgid "(*) Required fields" msgstr "" -#: ../gtk/setupwizard.c:318 +#: ../gtk/setupwizard.c:323 msgid "Username: (*)" msgstr "" -#: ../gtk/setupwizard.c:320 +#: ../gtk/setupwizard.c:325 msgid "Password: (*)" msgstr "" -#: ../gtk/setupwizard.c:322 +#: ../gtk/setupwizard.c:327 msgid "Email: (*)" msgstr "" -#: ../gtk/setupwizard.c:324 +#: ../gtk/setupwizard.c:329 msgid "Confirm your password: (*)" msgstr "" -#: ../gtk/setupwizard.c:338 +#: ../gtk/setupwizard.c:343 msgid "Keep me informed with linphone updates" msgstr "" -#: ../gtk/setupwizard.c:394 +#: ../gtk/setupwizard.c:399 msgid "" "Error, account not validated, username already used or server unreachable.\n" "Please go back and try again." msgstr "" -#: ../gtk/setupwizard.c:405 +#: ../gtk/setupwizard.c:410 msgid "Thank you. Your account is now configured and ready for use." msgstr "谢谢,您的帐户已经配置完毕,可以使用。" -#: ../gtk/setupwizard.c:413 +#: ../gtk/setupwizard.c:418 msgid "" "Please validate your account by clicking on the link we just sent you by email.\n" "Then come back here and press Next button." msgstr "" -#: ../gtk/setupwizard.c:602 +#: ../gtk/setupwizard.c:609 msgid "SIP account configuration assistant" msgstr "" -#: ../gtk/setupwizard.c:620 +#: ../gtk/setupwizard.c:629 msgid "Welcome to the account setup assistant" msgstr "欢迎使用帐户设置向导" -#: ../gtk/setupwizard.c:625 +#: ../gtk/setupwizard.c:634 msgid "Account setup assistant" msgstr "帐户设置向导" -#: ../gtk/setupwizard.c:631 +#: ../gtk/setupwizard.c:640 msgid "Configure your account (step 1/1)" msgstr "" -#: ../gtk/setupwizard.c:636 +#: ../gtk/setupwizard.c:645 msgid "Enter your sip username (step 1/1)" msgstr "" -#: ../gtk/setupwizard.c:640 +#: ../gtk/setupwizard.c:649 msgid "Enter account information (step 1/2)" msgstr "" -#: ../gtk/setupwizard.c:649 +#: ../gtk/setupwizard.c:658 msgid "Validation (step 2/2)" msgstr "" -#: ../gtk/setupwizard.c:654 +#: ../gtk/setupwizard.c:663 msgid "Error" msgstr "" -#: ../gtk/setupwizard.c:658 ../gtk/audio_assistant.c:534 +#: ../gtk/setupwizard.c:667 ../gtk/audio_assistant.c:534 msgid "Terminating" msgstr "" @@ -1492,10 +1496,6 @@ msgstr "添加为联系人" msgid "Search somebody" msgstr "找人" -#: ../gtk/waiting.ui.h:1 -msgid "Linphone" -msgstr "Linphone" - #: ../gtk/waiting.ui.h:2 msgid "Please wait" msgstr "请稍候" @@ -1695,68 +1695,68 @@ msgstr "" msgid "Please wait while fetching configuration from server..." msgstr "" -#: ../coreapi/linphonecore.c:1538 +#: ../coreapi/linphonecore.c:1539 msgid "Ready" msgstr "就绪" -#: ../coreapi/linphonecore.c:2550 +#: ../coreapi/linphonecore.c:2551 msgid "Configuring" msgstr "" -#: ../coreapi/linphonecore.c:2724 +#: ../coreapi/linphonecore.c:2725 msgid "Looking for telephone number destination..." msgstr "查询电话号码目的地..." -#: ../coreapi/linphonecore.c:2726 +#: ../coreapi/linphonecore.c:2727 msgid "Could not resolve this number." msgstr "该号码无法解析。" #. must be known at that time -#: ../coreapi/linphonecore.c:3012 +#: ../coreapi/linphonecore.c:3013 msgid "Contacting" msgstr "联系中" -#: ../coreapi/linphonecore.c:3017 +#: ../coreapi/linphonecore.c:3018 msgid "Could not call" msgstr "" -#: ../coreapi/linphonecore.c:3168 +#: ../coreapi/linphonecore.c:3169 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "" -#: ../coreapi/linphonecore.c:3326 +#: ../coreapi/linphonecore.c:3327 msgid "is contacting you" msgstr "正在联系您" -#: ../coreapi/linphonecore.c:3327 +#: ../coreapi/linphonecore.c:3328 msgid " and asked autoanswer." msgstr " 并询问了自动回答。" -#: ../coreapi/linphonecore.c:3451 +#: ../coreapi/linphonecore.c:3452 msgid "Modifying call parameters..." msgstr "" -#: ../coreapi/linphonecore.c:3798 +#: ../coreapi/linphonecore.c:3802 msgid "Connected." msgstr "已连接。" -#: ../coreapi/linphonecore.c:3823 +#: ../coreapi/linphonecore.c:3827 msgid "Call aborted" msgstr "" -#: ../coreapi/linphonecore.c:4013 +#: ../coreapi/linphonecore.c:4024 msgid "Could not pause the call" msgstr "" -#: ../coreapi/linphonecore.c:4016 +#: ../coreapi/linphonecore.c:4027 msgid "Pausing the current call..." msgstr "" -#: ../coreapi/misc.c:433 +#: ../coreapi/misc.c:434 msgid "Stun lookup in progress..." msgstr "正在进行 Stun 查找..." -#: ../coreapi/misc.c:614 +#: ../coreapi/misc.c:615 msgid "ICE local candidates gathering in progress..." msgstr "" @@ -1841,100 +1841,100 @@ msgstr "" msgid "Early media." msgstr "" -#: ../coreapi/callbacks.c:533 +#: ../coreapi/callbacks.c:534 #, c-format msgid "Call with %s is paused." msgstr "" -#: ../coreapi/callbacks.c:546 +#: ../coreapi/callbacks.c:547 #, c-format msgid "Call answered by %s - on hold." msgstr "" -#: ../coreapi/callbacks.c:556 +#: ../coreapi/callbacks.c:557 msgid "Call resumed." msgstr "" -#: ../coreapi/callbacks.c:560 +#: ../coreapi/callbacks.c:561 #, c-format msgid "Call answered by %s." msgstr "" -#: ../coreapi/callbacks.c:583 +#: ../coreapi/callbacks.c:584 msgid "Incompatible, check codecs or security settings..." msgstr "" -#: ../coreapi/callbacks.c:588 ../coreapi/callbacks.c:900 +#: ../coreapi/callbacks.c:589 ../coreapi/callbacks.c:906 msgid "Incompatible media parameters." msgstr "" -#: ../coreapi/callbacks.c:618 +#: ../coreapi/callbacks.c:619 msgid "We have been resumed." msgstr "" #. we are being paused -#: ../coreapi/callbacks.c:626 +#: ../coreapi/callbacks.c:628 msgid "We are paused by other party." msgstr "" #. reINVITE and in-dialogs UPDATE go here -#: ../coreapi/callbacks.c:660 +#: ../coreapi/callbacks.c:666 msgid "Call is updated by remote." msgstr "" -#: ../coreapi/callbacks.c:776 +#: ../coreapi/callbacks.c:782 msgid "Call terminated." msgstr "通话结束。" -#: ../coreapi/callbacks.c:804 +#: ../coreapi/callbacks.c:810 msgid "User is busy." msgstr "被叫正忙。" -#: ../coreapi/callbacks.c:805 +#: ../coreapi/callbacks.c:811 msgid "User is temporarily unavailable." msgstr "您呼叫的用户暂时无法接通。" #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:807 +#: ../coreapi/callbacks.c:813 msgid "User does not want to be disturbed." msgstr "用户已开启免打扰功能。" -#: ../coreapi/callbacks.c:808 +#: ../coreapi/callbacks.c:814 msgid "Call declined." msgstr "呼叫被拒绝。" -#: ../coreapi/callbacks.c:823 +#: ../coreapi/callbacks.c:829 msgid "Request timeout." msgstr "" -#: ../coreapi/callbacks.c:854 +#: ../coreapi/callbacks.c:860 msgid "Redirected" msgstr "已重定向" -#: ../coreapi/callbacks.c:909 +#: ../coreapi/callbacks.c:915 msgid "Call failed." msgstr "呼叫失败。" -#: ../coreapi/callbacks.c:987 +#: ../coreapi/callbacks.c:993 #, c-format msgid "Registration on %s successful." msgstr "成功注册到 %s" -#: ../coreapi/callbacks.c:988 +#: ../coreapi/callbacks.c:994 #, c-format msgid "Unregistration on %s done." msgstr "已在 %s 解除注册。" -#: ../coreapi/callbacks.c:1006 +#: ../coreapi/callbacks.c:1012 msgid "no response timeout" msgstr "没有响应,超时" -#: ../coreapi/callbacks.c:1009 +#: ../coreapi/callbacks.c:1015 #, c-format msgid "Registration on %s failed: %s" msgstr "注册到 %s 失败: %s" -#: ../coreapi/callbacks.c:1016 +#: ../coreapi/callbacks.c:1022 msgid "Service unavailable, retrying" msgstr "" @@ -1944,11 +1944,11 @@ msgstr "" msgid "Authentication token is %s" msgstr "" -#: ../coreapi/linphonecall.c:1306 +#: ../coreapi/linphonecall.c:1310 msgid "Call parameters were successfully modified." msgstr "" -#: ../coreapi/linphonecall.c:3660 +#: ../coreapi/linphonecall.c:3686 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." diff --git a/po/zh_TW.po b/po/zh_TW.po index a7dd2877b..0e5d4080f 100644 --- a/po/zh_TW.po +++ b/po/zh_TW.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: linphone-gtk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-04-01 16:25+0200\n" -"PO-Revision-Date: 2015-04-01 14:26+0000\n" +"POT-Creation-Date: 2015-04-30 10:13+0200\n" +"PO-Revision-Date: 2015-04-30 08:13+0000\n" "Last-Translator: Belledonne Communications \n" "Language-Team: Chinese (Taiwan) (http://www.transifex.com/projects/p/linphone-gtk/language/zh_TW/)\n" "MIME-Version: 1.0\n" @@ -85,45 +85,45 @@ msgstr "" msgid "Couldn't find pixmap file: %s" msgstr "找不到 pixmap 檔:%s" -#: ../gtk/main.c:136 +#: ../gtk/main.c:137 msgid "log to stdout some debug information while running." msgstr "執行時將一些除錯資訊記錄到標準輸出。" -#: ../gtk/main.c:137 +#: ../gtk/main.c:138 msgid "path to a file to write logs into." msgstr "" -#: ../gtk/main.c:138 +#: ../gtk/main.c:139 msgid "Start linphone with video disabled." msgstr "" -#: ../gtk/main.c:139 +#: ../gtk/main.c:140 msgid "Start only in the system tray, do not show the main interface." msgstr "只在系統匣啟動,不要顯示主要介面。" -#: ../gtk/main.c:140 +#: ../gtk/main.c:141 msgid "address to call right now" msgstr "現在要打電話的位址" -#: ../gtk/main.c:141 +#: ../gtk/main.c:142 msgid "" "Specifiy a working directory (should be the base of the installation, eg: " "c:\\Program Files\\Linphone)" msgstr "指定一個工作目錄(應該為安裝的根目錄,例如:c:\\Program Files\\Linphone)" -#: ../gtk/main.c:142 +#: ../gtk/main.c:143 msgid "Configuration file" msgstr "" -#: ../gtk/main.c:143 +#: ../gtk/main.c:144 msgid "Run the audio assistant" msgstr "" -#: ../gtk/main.c:144 +#: ../gtk/main.c:145 msgid "Run self test and exit 0 if succeed" msgstr "" -#: ../gtk/main.c:1069 +#: ../gtk/main.c:1070 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -131,76 +131,80 @@ msgid "" "If you answer no, this person will be temporarily blacklisted." msgstr "%s 想要加您加入他的連絡人清單。\n您是否要允許他看見您的上線狀態或將他加入您的連絡人清單?\n如果您回答否,這個人會被暫時列入黑名單。" -#: ../gtk/main.c:1146 +#: ../gtk/main.c:1147 #, c-format msgid "" "Please enter your password for username %s\n" " at realm %s:" msgstr "" -#: ../gtk/main.c:1267 +#: ../gtk/main.c:1268 msgid "Call error" msgstr "" -#: ../gtk/main.c:1270 ../coreapi/linphonecore.c:3842 +#: ../gtk/main.c:1271 ../coreapi/linphonecore.c:3846 msgid "Call ended" msgstr "通話已結束" -#: ../gtk/main.c:1273 ../coreapi/call_log.c:221 +#: ../gtk/main.c:1274 ../coreapi/call_log.c:221 msgid "Incoming call" msgstr "來電" -#: ../gtk/main.c:1275 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 +#: ../gtk/main.c:1276 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 msgid "Answer" msgstr "接聽" -#: ../gtk/main.c:1277 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1278 ../gtk/main.ui.h:6 msgid "Decline" msgstr "拒接" -#: ../gtk/main.c:1283 +#: ../gtk/main.c:1284 msgid "Call paused" msgstr "" -#: ../gtk/main.c:1283 +#: ../gtk/main.c:1284 #, c-format msgid "by %s" msgstr "" -#: ../gtk/main.c:1353 +#: ../gtk/main.c:1354 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1516 +#: ../gtk/main.c:1509 msgid "Website link" msgstr "網站連結" -#: ../gtk/main.c:1565 -msgid "Linphone - a video internet phone" -msgstr "Linphone - 網路視訊電話" +#: ../gtk/main.c:1568 ../gtk/waiting.ui.h:1 +msgid "Linphone" +msgstr "Linphone" -#: ../gtk/main.c:1657 +#: ../gtk/main.c:1569 +msgid "A video internet phone" +msgstr "" + +#: ../gtk/main.c:1629 #, c-format msgid "%s (Default)" msgstr "%s (預設值)" -#: ../gtk/main.c:1989 ../coreapi/callbacks.c:1057 +#: ../gtk/main.c:1962 ../coreapi/callbacks.c:1063 #, c-format msgid "We are transferred to %s" msgstr "我們被轉接到 %s" -#: ../gtk/main.c:1999 +#: ../gtk/main.c:1972 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." msgstr "在這臺電腦中偵測不到音效卡。\n您將無法傳送或接收語音電話。" -#: ../gtk/main.c:2147 +#: ../gtk/main.c:2117 msgid "A free SIP video-phone" msgstr "自由的 SIP 視訊電話" -#: ../gtk/main.c:2252 +#: ../gtk/main.c:2221 #, c-format msgid "Hello\n" msgstr "" @@ -213,7 +217,7 @@ msgstr "" msgid "Presence status" msgstr "上線狀態" -#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:552 ../gtk/contact.ui.h:1 +#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:569 ../gtk/contact.ui.h:1 msgid "Name" msgstr "名稱" @@ -254,124 +258,124 @@ msgstr "" msgid "Add new contact from %s directory" msgstr "從 %s 目錄加入新的連絡人" -#: ../gtk/propertybox.c:558 +#: ../gtk/propertybox.c:575 msgid "Rate (Hz)" msgstr "頻率 (Hz)" -#: ../gtk/propertybox.c:564 +#: ../gtk/propertybox.c:581 msgid "Status" msgstr "狀態" -#: ../gtk/propertybox.c:570 +#: ../gtk/propertybox.c:587 msgid "IP Bitrate (kbit/s)" msgstr "" -#: ../gtk/propertybox.c:577 +#: ../gtk/propertybox.c:596 msgid "Parameters" msgstr "參數" -#: ../gtk/propertybox.c:620 ../gtk/propertybox.c:763 +#: ../gtk/propertybox.c:639 ../gtk/propertybox.c:782 msgid "Enabled" msgstr "已啟用" -#: ../gtk/propertybox.c:622 ../gtk/propertybox.c:763 ../gtk/parameters.ui.h:20 +#: ../gtk/propertybox.c:641 ../gtk/propertybox.c:782 ../gtk/parameters.ui.h:20 msgid "Disabled" msgstr "已停用" -#: ../gtk/propertybox.c:809 +#: ../gtk/propertybox.c:828 msgid "Account" msgstr "帳號" -#: ../gtk/propertybox.c:1072 +#: ../gtk/propertybox.c:1091 msgid "English" msgstr "英語" -#: ../gtk/propertybox.c:1073 +#: ../gtk/propertybox.c:1092 msgid "French" msgstr "法語" -#: ../gtk/propertybox.c:1074 +#: ../gtk/propertybox.c:1093 msgid "Swedish" msgstr "瑞典語" -#: ../gtk/propertybox.c:1075 +#: ../gtk/propertybox.c:1094 msgid "Italian" msgstr "義大利語" -#: ../gtk/propertybox.c:1076 +#: ../gtk/propertybox.c:1095 msgid "Spanish" msgstr "西班牙語" -#: ../gtk/propertybox.c:1077 +#: ../gtk/propertybox.c:1096 msgid "Brazilian Portugese" msgstr "巴西葡萄牙語" -#: ../gtk/propertybox.c:1078 +#: ../gtk/propertybox.c:1097 msgid "Polish" msgstr "波蘭語" -#: ../gtk/propertybox.c:1079 +#: ../gtk/propertybox.c:1098 msgid "German" msgstr "德語" -#: ../gtk/propertybox.c:1080 +#: ../gtk/propertybox.c:1099 msgid "Russian" msgstr "俄語" -#: ../gtk/propertybox.c:1081 +#: ../gtk/propertybox.c:1100 msgid "Japanese" msgstr "日語" -#: ../gtk/propertybox.c:1082 +#: ../gtk/propertybox.c:1101 msgid "Dutch" msgstr "荷蘭語" -#: ../gtk/propertybox.c:1083 +#: ../gtk/propertybox.c:1102 msgid "Hungarian" msgstr "匈牙利語" -#: ../gtk/propertybox.c:1084 +#: ../gtk/propertybox.c:1103 msgid "Czech" msgstr "捷克語" -#: ../gtk/propertybox.c:1085 +#: ../gtk/propertybox.c:1104 msgid "Chinese" msgstr "中文" -#: ../gtk/propertybox.c:1086 +#: ../gtk/propertybox.c:1105 msgid "Traditional Chinese" msgstr "" -#: ../gtk/propertybox.c:1087 +#: ../gtk/propertybox.c:1106 msgid "Norwegian" msgstr "" -#: ../gtk/propertybox.c:1088 +#: ../gtk/propertybox.c:1107 msgid "Hebrew" msgstr "" -#: ../gtk/propertybox.c:1089 +#: ../gtk/propertybox.c:1108 msgid "Serbian" msgstr "" -#: ../gtk/propertybox.c:1156 +#: ../gtk/propertybox.c:1175 msgid "" "You need to restart linphone for the new language selection to take effect." msgstr "您需要重新啟動 linphone 才能讓新選擇的語言生效。" -#: ../gtk/propertybox.c:1236 +#: ../gtk/propertybox.c:1255 msgid "None" msgstr "" -#: ../gtk/propertybox.c:1240 +#: ../gtk/propertybox.c:1259 msgid "SRTP" msgstr "" -#: ../gtk/propertybox.c:1246 +#: ../gtk/propertybox.c:1265 msgid "DTLS" msgstr "" -#: ../gtk/propertybox.c:1253 +#: ../gtk/propertybox.c:1272 msgid "ZRTP" msgstr "" @@ -412,133 +416,133 @@ msgid "Found %i contact" msgid_plural "Found %i contacts" msgstr[0] "找不到 %i 個連絡人" -#: ../gtk/setupwizard.c:34 +#: ../gtk/setupwizard.c:32 msgid "" "Welcome!\n" "This assistant will help you to use a SIP account for your calls." msgstr "" -#: ../gtk/setupwizard.c:43 +#: ../gtk/setupwizard.c:41 msgid "Create an account on linphone.org" msgstr "" -#: ../gtk/setupwizard.c:44 +#: ../gtk/setupwizard.c:42 msgid "I have already a linphone.org account and I just want to use it" msgstr "" -#: ../gtk/setupwizard.c:45 +#: ../gtk/setupwizard.c:43 msgid "I have already a sip account and I just want to use it" msgstr "" -#: ../gtk/setupwizard.c:46 +#: ../gtk/setupwizard.c:44 msgid "I want to specify a remote configuration URI" msgstr "" -#: ../gtk/setupwizard.c:89 +#: ../gtk/setupwizard.c:87 msgid "Enter your linphone.org username" msgstr "" -#: ../gtk/setupwizard.c:102 ../gtk/parameters.ui.h:85 ../gtk/ldap.ui.h:4 +#: ../gtk/setupwizard.c:100 ../gtk/parameters.ui.h:85 ../gtk/ldap.ui.h:4 msgid "Username:" msgstr "使用者名稱:" -#: ../gtk/setupwizard.c:104 ../gtk/password.ui.h:4 ../gtk/ldap.ui.h:5 +#: ../gtk/setupwizard.c:102 ../gtk/password.ui.h:4 ../gtk/ldap.ui.h:5 msgid "Password:" msgstr "密碼: " -#: ../gtk/setupwizard.c:124 +#: ../gtk/setupwizard.c:122 msgid "Enter your account informations" msgstr "" -#: ../gtk/setupwizard.c:140 +#: ../gtk/setupwizard.c:138 msgid "Username*" msgstr "" -#: ../gtk/setupwizard.c:141 +#: ../gtk/setupwizard.c:139 msgid "Password*" msgstr "" -#: ../gtk/setupwizard.c:144 +#: ../gtk/setupwizard.c:142 msgid "Domain*" msgstr "" -#: ../gtk/setupwizard.c:145 +#: ../gtk/setupwizard.c:143 msgid "Proxy" msgstr "" -#: ../gtk/setupwizard.c:317 +#: ../gtk/setupwizard.c:322 msgid "(*) Required fields" msgstr "" -#: ../gtk/setupwizard.c:318 +#: ../gtk/setupwizard.c:323 msgid "Username: (*)" msgstr "" -#: ../gtk/setupwizard.c:320 +#: ../gtk/setupwizard.c:325 msgid "Password: (*)" msgstr "" -#: ../gtk/setupwizard.c:322 +#: ../gtk/setupwizard.c:327 msgid "Email: (*)" msgstr "" -#: ../gtk/setupwizard.c:324 +#: ../gtk/setupwizard.c:329 msgid "Confirm your password: (*)" msgstr "" -#: ../gtk/setupwizard.c:338 +#: ../gtk/setupwizard.c:343 msgid "Keep me informed with linphone updates" msgstr "" -#: ../gtk/setupwizard.c:394 +#: ../gtk/setupwizard.c:399 msgid "" "Error, account not validated, username already used or server unreachable.\n" "Please go back and try again." msgstr "" -#: ../gtk/setupwizard.c:405 +#: ../gtk/setupwizard.c:410 msgid "Thank you. Your account is now configured and ready for use." msgstr "謝謝您。您的帳號已設定完成並且可以使用。" -#: ../gtk/setupwizard.c:413 +#: ../gtk/setupwizard.c:418 msgid "" "Please validate your account by clicking on the link we just sent you by email.\n" "Then come back here and press Next button." msgstr "" -#: ../gtk/setupwizard.c:602 +#: ../gtk/setupwizard.c:609 msgid "SIP account configuration assistant" msgstr "" -#: ../gtk/setupwizard.c:620 +#: ../gtk/setupwizard.c:629 msgid "Welcome to the account setup assistant" msgstr "歡迎使用帳號設定助理" -#: ../gtk/setupwizard.c:625 +#: ../gtk/setupwizard.c:634 msgid "Account setup assistant" msgstr "帳號設定助理" -#: ../gtk/setupwizard.c:631 +#: ../gtk/setupwizard.c:640 msgid "Configure your account (step 1/1)" msgstr "" -#: ../gtk/setupwizard.c:636 +#: ../gtk/setupwizard.c:645 msgid "Enter your sip username (step 1/1)" msgstr "" -#: ../gtk/setupwizard.c:640 +#: ../gtk/setupwizard.c:649 msgid "Enter account information (step 1/2)" msgstr "" -#: ../gtk/setupwizard.c:649 +#: ../gtk/setupwizard.c:658 msgid "Validation (step 2/2)" msgstr "" -#: ../gtk/setupwizard.c:654 +#: ../gtk/setupwizard.c:663 msgid "Error" msgstr "" -#: ../gtk/setupwizard.c:658 ../gtk/audio_assistant.c:534 +#: ../gtk/setupwizard.c:667 ../gtk/audio_assistant.c:534 msgid "Terminating" msgstr "" @@ -1492,10 +1496,6 @@ msgstr "加入我的清單" msgid "Search somebody" msgstr "搜尋某人" -#: ../gtk/waiting.ui.h:1 -msgid "Linphone" -msgstr "Linphone" - #: ../gtk/waiting.ui.h:2 msgid "Please wait" msgstr "請稍候" @@ -1695,68 +1695,68 @@ msgstr "" msgid "Please wait while fetching configuration from server..." msgstr "" -#: ../coreapi/linphonecore.c:1538 +#: ../coreapi/linphonecore.c:1539 msgid "Ready" msgstr "準備就緒" -#: ../coreapi/linphonecore.c:2550 +#: ../coreapi/linphonecore.c:2551 msgid "Configuring" msgstr "" -#: ../coreapi/linphonecore.c:2724 +#: ../coreapi/linphonecore.c:2725 msgid "Looking for telephone number destination..." msgstr "尋找電話號碼目的端..." -#: ../coreapi/linphonecore.c:2726 +#: ../coreapi/linphonecore.c:2727 msgid "Could not resolve this number." msgstr "無法解析這個號碼。" #. must be known at that time -#: ../coreapi/linphonecore.c:3012 +#: ../coreapi/linphonecore.c:3013 msgid "Contacting" msgstr "正在連絡" -#: ../coreapi/linphonecore.c:3017 +#: ../coreapi/linphonecore.c:3018 msgid "Could not call" msgstr "無法通話" -#: ../coreapi/linphonecore.c:3168 +#: ../coreapi/linphonecore.c:3169 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "抱歉,我們已達瀏同步通話的最大數目" -#: ../coreapi/linphonecore.c:3326 +#: ../coreapi/linphonecore.c:3327 msgid "is contacting you" msgstr "正在連絡您" -#: ../coreapi/linphonecore.c:3327 +#: ../coreapi/linphonecore.c:3328 msgid " and asked autoanswer." msgstr "並要求自動接聽。" -#: ../coreapi/linphonecore.c:3451 +#: ../coreapi/linphonecore.c:3452 msgid "Modifying call parameters..." msgstr "修改通話參數..." -#: ../coreapi/linphonecore.c:3798 +#: ../coreapi/linphonecore.c:3802 msgid "Connected." msgstr "已連線。" -#: ../coreapi/linphonecore.c:3823 +#: ../coreapi/linphonecore.c:3827 msgid "Call aborted" msgstr "通話已放棄" -#: ../coreapi/linphonecore.c:4013 +#: ../coreapi/linphonecore.c:4024 msgid "Could not pause the call" msgstr "無法暫停通話" -#: ../coreapi/linphonecore.c:4016 +#: ../coreapi/linphonecore.c:4027 msgid "Pausing the current call..." msgstr "暫停目前的通話..." -#: ../coreapi/misc.c:433 +#: ../coreapi/misc.c:434 msgid "Stun lookup in progress..." msgstr "正在進行 Stun 搜尋..." -#: ../coreapi/misc.c:614 +#: ../coreapi/misc.c:615 msgid "ICE local candidates gathering in progress..." msgstr "" @@ -1841,100 +1841,100 @@ msgstr "遠端響鈴..." msgid "Early media." msgstr "早期媒體。" -#: ../coreapi/callbacks.c:533 +#: ../coreapi/callbacks.c:534 #, c-format msgid "Call with %s is paused." msgstr "和 %s 的通話已暫停。" -#: ../coreapi/callbacks.c:546 +#: ../coreapi/callbacks.c:547 #, c-format msgid "Call answered by %s - on hold." msgstr "通話由 %s 接聽 - 保留中。" -#: ../coreapi/callbacks.c:556 +#: ../coreapi/callbacks.c:557 msgid "Call resumed." msgstr "通話已繼續。" -#: ../coreapi/callbacks.c:560 +#: ../coreapi/callbacks.c:561 #, c-format msgid "Call answered by %s." msgstr "通話由 %s 接聽。" -#: ../coreapi/callbacks.c:583 +#: ../coreapi/callbacks.c:584 msgid "Incompatible, check codecs or security settings..." msgstr "" -#: ../coreapi/callbacks.c:588 ../coreapi/callbacks.c:900 +#: ../coreapi/callbacks.c:589 ../coreapi/callbacks.c:906 msgid "Incompatible media parameters." msgstr "" -#: ../coreapi/callbacks.c:618 +#: ../coreapi/callbacks.c:619 msgid "We have been resumed." msgstr "" #. we are being paused -#: ../coreapi/callbacks.c:626 +#: ../coreapi/callbacks.c:628 msgid "We are paused by other party." msgstr "" #. reINVITE and in-dialogs UPDATE go here -#: ../coreapi/callbacks.c:660 +#: ../coreapi/callbacks.c:666 msgid "Call is updated by remote." msgstr "" -#: ../coreapi/callbacks.c:776 +#: ../coreapi/callbacks.c:782 msgid "Call terminated." msgstr "通話已終止。" -#: ../coreapi/callbacks.c:804 +#: ../coreapi/callbacks.c:810 msgid "User is busy." msgstr "使用者現正忙碌。" -#: ../coreapi/callbacks.c:805 +#: ../coreapi/callbacks.c:811 msgid "User is temporarily unavailable." msgstr "使用者暫時無法聯繫。" #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:807 +#: ../coreapi/callbacks.c:813 msgid "User does not want to be disturbed." msgstr "使用者不想要被打擾。" -#: ../coreapi/callbacks.c:808 +#: ../coreapi/callbacks.c:814 msgid "Call declined." msgstr "通話被拒接。" -#: ../coreapi/callbacks.c:823 +#: ../coreapi/callbacks.c:829 msgid "Request timeout." msgstr "" -#: ../coreapi/callbacks.c:854 +#: ../coreapi/callbacks.c:860 msgid "Redirected" msgstr "已重新導向" -#: ../coreapi/callbacks.c:909 +#: ../coreapi/callbacks.c:915 msgid "Call failed." msgstr "通話失敗。" -#: ../coreapi/callbacks.c:987 +#: ../coreapi/callbacks.c:993 #, c-format msgid "Registration on %s successful." msgstr "在 %s 註冊成功。" -#: ../coreapi/callbacks.c:988 +#: ../coreapi/callbacks.c:994 #, c-format msgid "Unregistration on %s done." msgstr "在 %s 取消註冊完成。" -#: ../coreapi/callbacks.c:1006 +#: ../coreapi/callbacks.c:1012 msgid "no response timeout" msgstr "沒有回應逾時" -#: ../coreapi/callbacks.c:1009 +#: ../coreapi/callbacks.c:1015 #, c-format msgid "Registration on %s failed: %s" msgstr "在 %s 註冊失敗:%s" -#: ../coreapi/callbacks.c:1016 +#: ../coreapi/callbacks.c:1022 msgid "Service unavailable, retrying" msgstr "" @@ -1944,11 +1944,11 @@ msgstr "" msgid "Authentication token is %s" msgstr "" -#: ../coreapi/linphonecall.c:1306 +#: ../coreapi/linphonecall.c:1310 msgid "Call parameters were successfully modified." msgstr "" -#: ../coreapi/linphonecall.c:3660 +#: ../coreapi/linphonecall.c:3686 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." From 02b967955148eed300e26cd3605eb1587422952c Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Thu, 30 Apr 2015 11:23:33 +0200 Subject: [PATCH 083/157] proxy.c: linphone_proxy_config_normalize_number use now a default proxy config if none is provided --- coreapi/linphonecore.h | 7 ++++--- coreapi/private.h | 6 ++---- coreapi/proxy.c | 13 ++++++++----- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/coreapi/linphonecore.h b/coreapi/linphonecore.h index c2488a050..cfeb48e7e 100644 --- a/coreapi/linphonecore.h +++ b/coreapi/linphonecore.h @@ -1077,9 +1077,10 @@ LINPHONE_PUBLIC bool_t linphone_proxy_config_is_phone_number(LinphoneProxyConfig /** * Normalize a human readable phone number into a basic string. 888-444-222 becomes 888444222 - * or +33888444222 depending on the #LinphoneProxyConfig argument. This function will always - * generate a normalized username; if input is not a phone number, output will be a copy of input. - * @param proxy #LinphoneProxyConfig object containing country code and/or escape symbol. + * or +33888444222 depending on the #LinphoneProxyConfig object. However this argument is OPTIONNAL + * and if not provided, a default one will be used. + * This function will always generate a normalized username; if input is not a phone number, output will be a copy of input. + * @param proxy #LinphoneProxyConfig object containing country code and/or escape symbol. If NULL passed, will use default configuration. * @param username the string to parse * @param result the newly normalized number * @param result_len the size of the normalized number \a result diff --git a/coreapi/private.h b/coreapi/private.h index d53a7d780..b095ae525 100644 --- a/coreapi/private.h +++ b/coreapi/private.h @@ -416,8 +416,6 @@ void linphone_core_get_local_ip(LinphoneCore *lc, int af, const char *dest, char LinphoneProxyConfig *linphone_proxy_config_new_from_config_file(LinphoneCore *lc, int index); void linphone_proxy_config_write_to_config_file(struct _LpConfig* config,LinphoneProxyConfig *obj, int index); -bool_t linphone_proxy_config_normalize_number(LinphoneProxyConfig *cfg, const char *username, char *result, size_t result_len); - void linphone_core_message_received(LinphoneCore *lc, SalOp *op, const SalMessage *msg); void linphone_core_is_composing_received(LinphoneCore *lc, SalOp *op, const SalIsComposing *is_composing); @@ -781,7 +779,7 @@ struct _LinphoneCore char* user_certificates_path; LinphoneVideoPolicy video_policy; time_t network_last_check; - + bool_t use_files; bool_t apply_nat_settings; bool_t initial_subscribes_sent; @@ -791,7 +789,7 @@ struct _LinphoneCore bool_t auto_net_state_mon; bool_t network_reachable; bool_t network_reachable_to_be_notified; /*set to true when state must be notified in next iterate*/ - + bool_t use_preview_window; bool_t network_last_status; bool_t ringstream_autorelease; diff --git a/coreapi/proxy.c b/coreapi/proxy.c index c66bdc4d4..4283712d9 100644 --- a/coreapi/proxy.c +++ b/coreapi/proxy.c @@ -937,11 +937,12 @@ static void replace_icp(const char *src, char *dest, size_t destlen, const char } -bool_t linphone_proxy_config_normalize_number(LinphoneProxyConfig *proxy, const char *username, char *result, size_t result_len){ +bool_t linphone_proxy_config_normalize_number(LinphoneProxyConfig *inproxy, const char *username, char *result, size_t result_len){ + bool_t ret; + LinphoneProxyConfig *proxy = inproxy ? inproxy : linphone_proxy_config_new(); memset(result, 0, result_len); if (linphone_proxy_config_is_phone_number(proxy, username)){ - char *flatten; - flatten=flatten_number(username); + char *flatten=flatten_number(username); ms_debug("Flattened number is '%s'",flatten); if (proxy->dial_prefix==NULL || proxy->dial_prefix[0]=='\0'){ @@ -987,11 +988,13 @@ bool_t linphone_proxy_config_normalize_number(LinphoneProxyConfig *proxy, const } } ms_free(flatten); - return TRUE; + ret = TRUE; } else { strncpy(result,username,result_len-1); - return FALSE; + ret = FALSE; } + if (inproxy==NULL) ms_free(proxy); + return ret; } /** From e96e46980deb357f3d21079be2e29d43734b2623 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Thu, 30 Apr 2015 11:43:38 +0200 Subject: [PATCH 084/157] One more fix for Visual Studio. --- gtk/status_icon.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/gtk/status_icon.c b/gtk/status_icon.c index 5a8be1dbb..e2dfe903a 100644 --- a/gtk/status_icon.c +++ b/gtk/status_icon.c @@ -353,12 +353,12 @@ static gboolean _linphone_status_icon_impl_is_supported( } static const _LinphoneStatusIconDesc _linphone_status_icon_impl_gtk_desc = { - .impl_name = "gtk_status_icon", - .init = _linphone_status_icon_impl_gtk_init, - .uninit = NULL, - .start = _linphone_status_icon_impl_gtk_start, - .enable_blinking = _linphone_status_icon_impl_enable_blinking, - .is_supported = _linphone_status_icon_impl_is_supported + "gtk_status_icon", + _linphone_status_icon_impl_gtk_init, + NULL, + _linphone_status_icon_impl_gtk_start, + _linphone_status_icon_impl_enable_blinking, + _linphone_status_icon_impl_is_supported }; #endif From 66eb174aa7f3390e02f5ddd58000803b85975f8d Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Thu, 30 Apr 2015 11:45:47 +0200 Subject: [PATCH 085/157] Revert "gtk: only text area can have focus in chat window" This reverts commit b03c70b06a6af594a2d7f5a222946611f4012c63. --- gtk/main.ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtk/main.ui b/gtk/main.ui index 8af36fcb8..48e5a61d6 100644 --- a/gtk/main.ui +++ b/gtk/main.ui @@ -116,7 +116,7 @@ True - False + True 4 From a6cc9e4d520d2b6a59ea22714ea2d641df1f607d Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Thu, 30 Apr 2015 14:47:34 +0200 Subject: [PATCH 086/157] Do not use status notifier on Windows and Mac OS X. --- gtk/status_icon.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/gtk/status_icon.c b/gtk/status_icon.c index e2dfe903a..b3dceea5e 100644 --- a/gtk/status_icon.c +++ b/gtk/status_icon.c @@ -24,7 +24,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #endif -#define STATUS_NOTIFIER_IS_USABLE GLIB_CHECK_VERSION(2, 26, 0) +#if !defined(WIN32) && !defined(__APPLE__) && GLIB_CHECK_VERSION(2, 26, 0) +#define STATUS_NOTIFIER_IS_USABLE 1 +#endif #include "status_notifier.h" @@ -225,7 +227,7 @@ void _linphone_status_icon_init_cb(const _LinphoneStatusIconDesc *desc, void *us g_free(ctx); } -#if STATUS_NOTIFIER_IS_USABLE +#ifdef STATUS_NOTIFIER_IS_USABLE static const _LinphoneStatusIconDesc _linphone_status_icon_impl_status_notifier; #endif #ifdef HAVE_GTK_OSX @@ -235,7 +237,7 @@ static const _LinphoneStatusIconDesc _linphone_status_icon_impl_gtk_desc; #endif void _linphone_status_icon_create_implementations_list(void) { -#if STATUS_NOTIFIER_IS_USABLE +#ifdef STATUS_NOTIFIER_IS_USABLE _linphone_status_icon_impls = g_slist_append(_linphone_status_icon_impls, (void *)&_linphone_status_icon_impl_status_notifier); #endif #if HAVE_GTK_OSX @@ -398,7 +400,7 @@ static const _LinphoneStatusIconDesc _linphone_status_icon_impl_gtkosx_app_desc /* Implementation based on the StatusNotifier Freedesktop standard */ -#if STATUS_NOTIFIER_IS_USABLE +#ifdef STATUS_NOTIFIER_IS_USABLE typedef struct { int x; int y; From f2b26e93e952dfd22250409f91e63b2b6d77aa61 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Thu, 30 Apr 2015 15:28:28 +0200 Subject: [PATCH 087/157] Fix crash with wrong handling of languages when building with CMake. --- CMakeLists.txt | 3 ++- po/CMakeLists.txt | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d08dedc4d..f4d818975 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -31,7 +31,8 @@ set(LINPHONE_VERSION "${LINPHONE_MAJOR_VERSION}.${LINPHONE_MINOR_VERSION}.${LINP set(LINPHONE_SO_VERSION "7") file(GLOB LINPHONE_PO_FILES RELATIVE "${CMAKE_SOURCE_DIR}/po" "${CMAKE_SOURCE_DIR}/po/*.po") -string(REGEX REPLACE "([a-zA-Z_]+)\\.po" "\\1" LINPHONE_ALL_LANGS "${LINPHONE_PO_FILES}") +string(REGEX REPLACE "([a-zA-Z_]+)\\.po" "\\1" LINPHONE_ALL_LANGS_LIST "${LINPHONE_PO_FILES}") +string(REPLACE ";" " " LINPHONE_ALL_LANGS "${LINPHONE_ALL_LANGS_LIST}") include(CMakeDependentOption) diff --git a/po/CMakeLists.txt b/po/CMakeLists.txt index 9b856b482..52f36bb40 100644 --- a/po/CMakeLists.txt +++ b/po/CMakeLists.txt @@ -21,7 +21,7 @@ ############################################################################ if(GETTEXT_FOUND) - foreach(language ${LINPHONE_ALL_LANGS}) + foreach(language ${LINPHONE_ALL_LANGS_LIST}) GETTEXT_PROCESS_PO_FILES(${language} ALL PO_FILES ${language}.po) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${language}.gmo DESTINATION ${PACKAGE_LOCALE_DIR}/${language}/LC_MESSAGES From 5079caf6bac675948b9ad69e64c6bab096856700 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Thu, 30 Apr 2015 16:59:54 +0200 Subject: [PATCH 088/157] fix mysterious crash --- gtk/status_notifier.c | 36 ++++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/gtk/status_notifier.c b/gtk/status_notifier.c index fffb0f162..da9357720 100644 --- a/gtk/status_notifier.c +++ b/gtk/status_notifier.c @@ -30,26 +30,30 @@ typedef int lppid_t; typedef pid_t lppid_t; #endif -static const gchar *_bc_status_notifier_category_to_string[] = { - "ApplicationStatus", - "Communications", - "SystemServices", - "Hardware" -}; - const gchar *bc_status_notifier_category_to_string(BcStatusNotifierCategory c) { - return _bc_status_notifier_category_to_string[c]; + switch(c){ + case BcStatusNotifierCategoryApplicationStatus: + return "ApplicationStatus"; + case BcStatusNotifierCategoryCommunications: + return "Communications"; + case BcStatusNotifierCategorySystemService: + return "SystemServices"; + case BcStatusNotifierCategoryHardware: + return "Hardware"; + } + return "bad category"; } - -static const gchar *_bc_status_notifier_status_to_string[] = { - "Passive", - "Active" - "NeedsAttention" -}; - const gchar *bc_status_notifier_status_to_string(BcStatusNotifierStatus s) { - return _bc_status_notifier_status_to_string[s]; + switch(s){ + case BcStatusNotifierStatusPassive: + return "Passive"; + case BcStatusNotifierStatusActive: + return "Active"; + case BcStatusNotifierStatusNeedsAttention: + return "NeedsAttention"; + } + return "badstatus"; }; From f422cbc9344d41d011b81e9546aaf78737c27c33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Grisez?= Date: Thu, 30 Apr 2015 17:53:56 +0200 Subject: [PATCH 089/157] Remove libopenh264 from the MacOSX bundle whether the msopenh264 plugins is installed --- Makefile.am | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile.am b/Makefile.am index 80c1e1e98..8746ac937 100644 --- a/Makefile.am +++ b/Makefile.am @@ -230,6 +230,7 @@ Linphone.app: cp -f $(BUNDLEDIR)/Contents/Resources/etc/pango/pango.modules $(BUNDLEDIR)/Contents/Resources/etc/pango/pango.modules.orig sed -e 's:@executable_path.*/::g' $(BUNDLEDIR)/Contents/Resources/etc/pango/pango.modules.orig > $(BUNDLEDIR)/Contents/Resources/etc/pango/pango.modules patch -R ${BUNDLEDIR}/Contents/Resources/share/themes/Quartz/gtk-2.0/gtkrc ${srcdir}/build/macos/quartz-theme-gtkrc.patch + rm -f ${BUNDLEDIR}/Contents/Resources/lib/libopenh264* bundle: Linphone.app cd $(BUNDLEDIR)/.. && rm -f $(MACAPPZIP) && zip -r $(MACAPPZIP) $(MACAPPNAME) && cd - From bb1046fb87f335e0bdf24b41005cc1bb52aa118f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Grisez?= Date: Thu, 30 Apr 2015 18:00:02 +0200 Subject: [PATCH 090/157] Add a target to build a MacOSX pkg file --- Makefile.am | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/Makefile.am b/Makefile.am index 8746ac937..eddf69389 100644 --- a/Makefile.am +++ b/Makefile.am @@ -210,6 +210,7 @@ Portfile-devel: $(top_srcdir)/scripts/Portfile-devel.tmpl dist MACAPPNAME=Linphone.app MACAPPZIP=$(PACKAGE)-$(GITVERSION).app.zip MACAPPDMG=$(PACKAGE)-$(GITVERSION).dmg +MACAPPPKG=$(PACKAGE)-$(GITVERSION).pkg BUNDLEPREFIX=./ BUNDLEDIR=$(BUNDLEPREFIX)$(MACAPPNAME) #a path prefix where additional libs can be cherry-picked by the bundler. @@ -232,13 +233,16 @@ Linphone.app: patch -R ${BUNDLEDIR}/Contents/Resources/share/themes/Quartz/gtk-2.0/gtkrc ${srcdir}/build/macos/quartz-theme-gtkrc.patch rm -f ${BUNDLEDIR}/Contents/Resources/lib/libopenh264* -bundle: Linphone.app +bundle: $(MACAPPNAME) cd $(BUNDLEDIR)/.. && rm -f $(MACAPPZIP) && zip -r $(MACAPPZIP) $(MACAPPNAME) && cd - cd $(BUNDLEDIR)/.. && rm -f $(MAXAPPDMG) && hdiutil create $(MACAPPDMG) -srcfolder $(MACAPPNAME) -ov && cd - -signed-bundle: Linphone.app +signed-bundle: $(MACAPPNAME) codesign --deep -s $(BUNDLE_SIGNING_ID) $(BUNDLEDIR) cd $(BUNDLEDIR)/.. && rm -f $(MAXAPPDMG) && hdiutil create $(MACAPPDMG) -srcfolder $(MACAPPNAME) -ov && cd - + +pkg: $(MACAPPNAME) + pkgbuild --install-location /Applications --component $(MACAPPNAME) $(MACAPPPKG) ### @@ -249,8 +253,8 @@ clean-local: discovery: touch specs.c $(CC) --include $(top_builddir)/config.h \ - $(TUNNEL_CFLAGS) $(CFLAGS) $(MEDIASTREAMER2_CFLAGS) $(ORTP_CFLAGS) $(SIPSTACK_CFLAGS) $(CUNIT_CFLAGS) -E -P -v -dD specs.c + $(TUNNEL_CFLAGS) $(CFLAGS) $(MEDIASTREAMER2_CFLAGS) $(ORTP_CFLAGS) $(SIPSTACK_CFLAGS) $(CUNIT_CFLAGS) -E -P -v -dD specs.c -.PHONY: Linphone.app +.PHONY: $(MACAPPNAME) From 9e915bc6446333ba4643b3150e9a60846d9f2b54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Grisez?= Date: Thu, 30 Apr 2015 18:04:46 +0200 Subject: [PATCH 091/157] Add a post-install script to the MacOSX installer to download libopenh264 --- Makefile.am | 2 +- build/macos/Makefile.am | 2 +- build/macos/pkg-scripts/postinstall | 16 ++++++++++++++++ 3 files changed, 18 insertions(+), 2 deletions(-) create mode 100755 build/macos/pkg-scripts/postinstall diff --git a/Makefile.am b/Makefile.am index eddf69389..7152b011e 100644 --- a/Makefile.am +++ b/Makefile.am @@ -242,7 +242,7 @@ signed-bundle: $(MACAPPNAME) cd $(BUNDLEDIR)/.. && rm -f $(MAXAPPDMG) && hdiutil create $(MACAPPDMG) -srcfolder $(MACAPPNAME) -ov && cd - pkg: $(MACAPPNAME) - pkgbuild --install-location /Applications --component $(MACAPPNAME) $(MACAPPPKG) + pkgbuild --install-location /Applications --scripts ${srcdir}/build/macos/pkg-scripts --component $(MACAPPNAME) $(MACAPPPKG) ### diff --git a/build/macos/Makefile.am b/build/macos/Makefile.am index e90eb2ffe..9521c0553 100644 --- a/build/macos/Makefile.am +++ b/build/macos/Makefile.am @@ -1,3 +1,3 @@ -EXTRA_DIST=linphone.bundle environment.sh Info-linphone.plist.in +EXTRA_DIST=linphone.bundle environment.sh Info-linphone.plist.in pkg-scripts/* diff --git a/build/macos/pkg-scripts/postinstall b/build/macos/pkg-scripts/postinstall new file mode 100755 index 000000000..b7ca52a50 --- /dev/null +++ b/build/macos/pkg-scripts/postinstall @@ -0,0 +1,16 @@ +#!/bin/bash + +CURL=/usr/bin/curl +BUNZIP2=/usr/bin/bunzip2 +VERSION=1.4.0 +BASENAME=libopenh264-${VERSION}-osx64 +FILENAME=${BASENAME}.dylib.bz2 +TMPDIR=/tmp/linphone_installer + +mkdir ${TMPDIR} +cd ${TMPDIR} +${CURL} http://ciscobinary.openh264.org/${FILENAME} > ${FILENAME} +${BUNZIP2} ${FILENAME} +cp ${BASENAME}.dylib /Applications/Linphone.app/Contents/Resources/lib/libopenh264.0.dylib +rm -r ${TMPDIR} + From 5fc442bfbf4cae371b965c5f043ca7f55a2230fb Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Fri, 1 May 2015 10:02:34 +0200 Subject: [PATCH 092/157] fix make dist --- build/macos/Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/macos/Makefile.am b/build/macos/Makefile.am index 9521c0553..6556fb5d8 100644 --- a/build/macos/Makefile.am +++ b/build/macos/Makefile.am @@ -1,3 +1,3 @@ -EXTRA_DIST=linphone.bundle environment.sh Info-linphone.plist.in pkg-scripts/* +EXTRA_DIST=linphone.bundle environment.sh Info-linphone.plist.in pkg-scripts/postinstall From 8e9da52a9c7933b3253cdd6b9e7fa91ffa37f8cf Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Fri, 1 May 2015 10:53:00 +0200 Subject: [PATCH 093/157] take local ip address for media each time a reINVITE is done, to take into account possible network changes. remove sig_localip from LinphoneCall, that appears to be useless --- coreapi/linphonecall.c | 8 +++----- coreapi/private.h | 1 - 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c index 4c149b6a2..f2a62271a 100644 --- a/coreapi/linphonecall.c +++ b/coreapi/linphonecall.c @@ -41,6 +41,7 @@ static const char EC_STATE_STORE[] = ".linphone.ecstate"; #define EC_STATE_MAX_LEN 1048576 // 1Mo static void linphone_call_stats_uninit(LinphoneCallStats *stats); +static void linphone_call_get_local_ip(LinphoneCall *call, const LinphoneAddress *remote_addr); #ifdef VIDEO_ENABLED MSWebCam *get_nowebcam_device(){ @@ -614,6 +615,8 @@ void linphone_call_make_local_media_description_with_params(LinphoneCore *lc, Li md->session_ver=(old_md ? (old_md->session_ver+1) : (rand() & 0xfff)); md->nb_streams=(call->biggestdesc ? call->biggestdesc->nb_streams : 1); + /*re-check local ip address each time we make a new offer, because it may change in case of network reconnection*/ + linphone_call_get_local_ip(call, call->dir == LinphoneCallOutgoing ? call->log->to : call->log->from); strncpy(md->addr,call->media_localip,sizeof(md->addr)); if (linphone_address_get_username(addr)) /*might be null in case of identity without userinfo*/ strncpy(md->username,linphone_address_get_username(addr),sizeof(md->username)); @@ -911,7 +914,6 @@ static void linphone_call_get_local_ip(LinphoneCall *call, const LinphoneAddress if (linphone_core_get_firewall_policy(call->core)==LinphonePolicyUseNatAddress && (ip=linphone_core_get_nat_address_resolved(call->core))!=NULL){ strncpy(call->media_localip,ip,LINPHONE_IPADDR_SIZE); - strncpy(call->sig_localip,ip,LINPHONE_IPADDR_SIZE); return; } #ifdef BUILD_UPNP @@ -919,19 +921,15 @@ static void linphone_call_get_local_ip(LinphoneCall *call, const LinphoneAddress linphone_upnp_context_get_state(call->core->upnp) == LinphoneUpnpStateOk) { ip = linphone_upnp_context_get_external_ipaddress(call->core->upnp); strncpy(call->media_localip,ip,LINPHONE_IPADDR_SIZE); - strncpy(call->sig_localip,ip,LINPHONE_IPADDR_SIZE); return; } #endif //BUILD_UPNP /*first nominal use case*/ linphone_core_get_local_ip(call->core, af, dest, call->media_localip); - strncpy(call->sig_localip,call->media_localip,LINPHONE_IPADDR_SIZE); /*next, sometime, override from config*/ if ((ip=lp_config_get_string(call->core->config,"rtp","bind_address",NULL))) strncpy(call->media_localip,ip,LINPHONE_IPADDR_SIZE); - if ((ip=lp_config_get_string(call->core->config,"sip","bind_address",NULL))) - strncpy(call->sig_localip,ip,LINPHONE_IPADDR_SIZE); return; } diff --git a/coreapi/private.h b/coreapi/private.h index b095ae525..9ef265d26 100644 --- a/coreapi/private.h +++ b/coreapi/private.h @@ -227,7 +227,6 @@ struct _LinphoneCall{ LinphoneAddress *me; /*Either from or to based on call dir*/ SalOp *op; SalOp *ping_op; - char sig_localip[LINPHONE_IPADDR_SIZE]; /* our best guess for local sig ipaddress for this call */ char media_localip[LINPHONE_IPADDR_SIZE]; /* our best guess for local media ipaddress for this call */ LinphoneCallState state; LinphoneCallState prevstate; From 52da7058c6717be145525b456f4b37c7d805b50e Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Fri, 1 May 2015 10:57:41 +0200 Subject: [PATCH 094/157] remove g_list_free_full(), that requires glib>2.26 --- gtk/main.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gtk/main.c b/gtk/main.c index 79ec308b1..db603d028 100644 --- a/gtk/main.c +++ b/gtk/main.c @@ -352,7 +352,8 @@ static void linphone_gtk_configure_window(GtkWidget *w, const char *window_name) pbuf_list = g_list_append(pbuf_list, pbuf_32); gtk_window_set_icon_list(GTK_WINDOW(w), pbuf_list); gtk_window_set_default_icon_list(pbuf_list); - g_list_free_full(pbuf_list, g_object_unref); + g_list_foreach(pbuf_list, (GFunc)g_object_unref,NULL); + g_list_free(pbuf_list); } } } From 6b668405f6fc3c2893b6fd7f5ddc784eb3cd2591 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Grisez?= Date: Mon, 4 May 2015 11:41:02 +0200 Subject: [PATCH 095/157] Sign the generated PKG file for MacOSX --- Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.am b/Makefile.am index 7152b011e..384bb2e43 100644 --- a/Makefile.am +++ b/Makefile.am @@ -242,7 +242,7 @@ signed-bundle: $(MACAPPNAME) cd $(BUNDLEDIR)/.. && rm -f $(MAXAPPDMG) && hdiutil create $(MACAPPDMG) -srcfolder $(MACAPPNAME) -ov && cd - pkg: $(MACAPPNAME) - pkgbuild --install-location /Applications --scripts ${srcdir}/build/macos/pkg-scripts --component $(MACAPPNAME) $(MACAPPPKG) + pkgbuild --install-location /Applications --scripts ${srcdir}/build/macos/pkg-scripts --sign $(BUNDLE_SIGNING_ID) --component $(MACAPPNAME) $(MACAPPPKG) ### From 77e2fa03842212b6c0b3ba7fbd4a4ae71b07b8ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Grisez?= Date: Mon, 4 May 2015 14:43:56 +0200 Subject: [PATCH 096/157] Fix package signing on MocOSX --- Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.am b/Makefile.am index 384bb2e43..c50c5b9b7 100644 --- a/Makefile.am +++ b/Makefile.am @@ -242,7 +242,7 @@ signed-bundle: $(MACAPPNAME) cd $(BUNDLEDIR)/.. && rm -f $(MAXAPPDMG) && hdiutil create $(MACAPPDMG) -srcfolder $(MACAPPNAME) -ov && cd - pkg: $(MACAPPNAME) - pkgbuild --install-location /Applications --scripts ${srcdir}/build/macos/pkg-scripts --sign $(BUNDLE_SIGNING_ID) --component $(MACAPPNAME) $(MACAPPPKG) + pkgbuild --install-location /Applications --scripts ${srcdir}/build/macos/pkg-scripts --sign "$(BUNDLE_SIGNING_ID)" --component $(MACAPPNAME) $(MACAPPPKG) ### From 1baa97a7f7bca016a7d67ce132098756adf7b8cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Grisez?= Date: Mon, 4 May 2015 16:41:39 +0200 Subject: [PATCH 097/157] Display licences while installing Linphone on MacOSX --- Makefile.am | 5 ++++- build/macos/pkg-distribution.xml.in | 17 +++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 build/macos/pkg-distribution.xml.in diff --git a/Makefile.am b/Makefile.am index c50c5b9b7..ae5ec2271 100644 --- a/Makefile.am +++ b/Makefile.am @@ -242,7 +242,10 @@ signed-bundle: $(MACAPPNAME) cd $(BUNDLEDIR)/.. && rm -f $(MAXAPPDMG) && hdiutil create $(MACAPPDMG) -srcfolder $(MACAPPNAME) -ov && cd - pkg: $(MACAPPNAME) - pkgbuild --install-location /Applications --scripts ${srcdir}/build/macos/pkg-scripts --sign "$(BUNDLE_SIGNING_ID)" --component $(MACAPPNAME) $(MACAPPPKG) + rm -rf ${srcdir}/packaging + mkdir ${srcdir}/packaging + pkgbuild --install-location /Applications --scripts ${srcdir}/build/macos/pkg-scripts --sign "$(BUNDLE_SIGNING_ID)" --component $(MACAPPNAME) ${srcdir}/packaging/linphone.pkg + productbuild --distribution ${srcdir}/build/macos/pkg-distribution.xml --resources ${srcdir}/packaging $(MACAPPPKG} ### diff --git a/build/macos/pkg-distribution.xml.in b/build/macos/pkg-distribution.xml.in new file mode 100644 index 000000000..547fc5e05 --- /dev/null +++ b/build/macos/pkg-distribution.xml.in @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + linphone.pkg + + + From 705384ebb4b89eb0de94e0fd2ad37e96e35cd25b Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Wed, 29 Apr 2015 11:47:47 +0200 Subject: [PATCH 098/157] add test for // REGISTER sent for same account with configured realm --- coreapi/linphonecall.c | 7 +++++-- tester/rcfiles/multi_account_rc | 9 +++++++++ tester/register_tester.c | 1 + 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c index f2a62271a..4f2a571a9 100644 --- a/coreapi/linphonecall.c +++ b/coreapi/linphonecall.c @@ -1413,8 +1413,11 @@ void linphone_call_unref(LinphoneCall *obj){ belle_sip_object_unref(obj); } static unsigned int linphone_call_get_n_active_streams(const LinphoneCall *call) { - SalMediaDescription *md = sal_call_get_remote_media_description(call->op); - if (!md) return 0; + SalMediaDescription *md=NULL; + if (call->op) + md = sal_call_get_remote_media_description(call->op); + if (!md) + return 0; return sal_media_description_nb_active_streams_of_type(md, SalAudio) + sal_media_description_nb_active_streams_of_type(md, SalVideo); } diff --git a/tester/rcfiles/multi_account_rc b/tester/rcfiles/multi_account_rc index a78a5bc16..8aefbfcaf 100644 --- a/tester/rcfiles/multi_account_rc +++ b/tester/rcfiles/multi_account_rc @@ -51,5 +51,14 @@ reg_expires=3600 reg_sendregister=1 publish=0 dial_escape_plus=0 +realm=auth1.example.org +[proxy_3] +reg_proxy=auth1.example.org +reg_identity=sip:liblinphone_tester@auth1.example.org +reg_expires=600 +reg_sendregister=1 +publish=0 +dial_escape_plus=0 +realm=auth1.example.org diff --git a/tester/register_tester.c b/tester/register_tester.c index ffd54f1a5..8c4aaa92a 100644 --- a/tester/register_tester.c +++ b/tester/register_tester.c @@ -461,6 +461,7 @@ static LinphoneCoreManager* configure_lcm(void) { LinphoneCoreManager *mgr=linphone_core_manager_new( "multi_account_rc"); stats *counters=&mgr->stat; CU_ASSERT_TRUE(wait_for(mgr->lc,mgr->lc,&counters->number_of_LinphoneRegistrationOk,ms_list_size(linphone_core_get_proxy_config_list(mgr->lc)))); + CU_ASSERT_EQUAL(counters->number_of_LinphoneRegistrationFailed,0); return mgr; } From e8aef044fbe003622c8b074536e829497c226e9a Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Mon, 4 May 2015 12:23:44 +0200 Subject: [PATCH 099/157] Allows incoming call to be accepted even if an outgoing call is in progress. In such case, outgoing call is automatically canceled. --- coreapi/callbacks.c | 35 ++++++++++----------- coreapi/linphonecore.c | 33 +++++++++++++++++++- coreapi/linphonecore.h | 11 +++++++ tester/call_tester.c | 38 ++++++++++++++++++----- tester/multi_call.c | 69 +++++++++++++++++++++++++++++++++++++++++- 5 files changed, 159 insertions(+), 27 deletions(-) diff --git a/coreapi/callbacks.c b/coreapi/callbacks.c index 836d2b8a8..0143be751 100644 --- a/coreapi/callbacks.c +++ b/coreapi/callbacks.c @@ -245,18 +245,6 @@ static bool_t already_a_call_with_remote_address(const LinphoneCore *lc, const L return FALSE; } -static bool_t already_an_outgoing_call_pending(LinphoneCore *lc){ - MSList *elem; - for(elem=lc->calls;elem!=NULL;elem=elem->next){ - LinphoneCall *call=(LinphoneCall*)elem->data; - if (call->state==LinphoneCallOutgoingInit - || call->state==LinphoneCallOutgoingProgress - || call->state==LinphoneCallOutgoingRinging){ - return TRUE; - } - } - return FALSE; -} static void call_received(SalOp *h){ LinphoneCore *lc=(LinphoneCore *)sal_get_user_pointer(sal_op_get_sal(h)); @@ -264,9 +252,9 @@ static void call_received(SalOp *h){ char *alt_contact; LinphoneAddress *from_addr=NULL; LinphoneAddress *to_addr=NULL; - /*this mode is deprcated because probably useless*/ - bool_t prevent_colliding_calls=lp_config_get_int(lc->config,"sip","prevent_colliding_calls",FALSE); + LinphoneAddress *from_address_to_search_if_me=NULL; /*address used to know if I'm the caller*/ SalMediaDescription *md; + const char * p_asserted_id; /* first check if we can answer successfully to this invite */ if (linphone_presence_model_get_basic_status(lc->presence_model) == LinphonePresenceBasicStatusClosed) { @@ -300,9 +288,9 @@ static void call_received(SalOp *h){ sal_op_release(h); return; } + p_asserted_id = sal_custom_header_find(sal_op_get_recv_custom_header(h),"P-Asserted-Identity"); /*in some situation, better to trust the network rather than the UAC*/ if (lp_config_get_int(lc->config,"sip","call_logs_use_asserted_id_instead_of_from",0)) { - const char * p_asserted_id = sal_custom_header_find(sal_op_get_recv_custom_header(h),"P-Asserted-Identity"); LinphoneAddress *p_asserted_id_addr; if (!p_asserted_id) { ms_warning("No P-Asserted-Identity header found so cannot use it for op [%p] instead of from",h); @@ -321,13 +309,26 @@ static void call_received(SalOp *h){ from_addr=linphone_address_new(sal_op_get_from(h)); to_addr=linphone_address_new(sal_op_get_to(h)); - if ((already_a_call_with_remote_address(lc,from_addr) && prevent_colliding_calls) || already_an_outgoing_call_pending(lc)){ - ms_warning("Receiving a call while one is initiated, refusing this one with busy message."); + if (sal_op_get_privacy(h) == SalPrivacyNone) { + from_address_to_search_if_me=linphone_address_clone(from_addr); + } else if (p_asserted_id) { + from_address_to_search_if_me = linphone_address_new(p_asserted_id); + } else { + ms_warning ("Hidden from identity, don't know if it's me"); + } + + if (from_address_to_search_if_me && already_a_call_with_remote_address(lc,from_address_to_search_if_me)){ + char *addr = linphone_address_as_string(from_addr); + ms_warning("Receiving a call while one with same address [%s] is initiated, refusing this one with busy message.",addr); sal_call_decline(h,SalReasonBusy,NULL); sal_op_release(h); linphone_address_destroy(from_addr); linphone_address_destroy(to_addr); + linphone_address_destroy(from_address_to_search_if_me); + ms_free(addr); return; + } else if (from_address_to_search_if_me) { + linphone_address_destroy(from_address_to_search_if_me); } call=linphone_call_new_incoming(lc,from_addr,to_addr,h); diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index 89c62000f..2d3efb6f0 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -3721,6 +3721,7 @@ int linphone_core_accept_call_with_params(LinphoneCore *lc, LinphoneCall *call, SalOp *replaced; SalMediaDescription *new_md; bool_t was_ringing=FALSE; + MSList * iterator; if (call==NULL){ //if just one call is present answer the only one ... @@ -3741,6 +3742,28 @@ int linphone_core_accept_call_with_params(LinphoneCore *lc, LinphoneCall *call, break; } + + for (iterator=ms_list_copy(linphone_core_get_calls(lc));iterator!=NULL;iterator=iterator->next) { + LinphoneCall *a_call=(LinphoneCall*)iterator->data; + if (a_call==call) continue; + switch(a_call->state){ + case LinphoneCallOutgoingInit: + case LinphoneCallOutgoingProgress: + case LinphoneCallOutgoingRinging: + case LinphoneCallOutgoingEarlyMedia: + + ms_message("Already existing call [%p] in state [%s], canceling it before accepting new call [%p]" ,a_call + ,linphone_call_state_to_string(a_call->state) + ,call); + linphone_core_terminate_call(lc,a_call); + break; + default: + break; /*nothing to do*/ + } + + } + if (iterator) ms_list_free(iterator); + /* check if this call is supposed to replace an already running one*/ replaced=sal_call_get_replaces(call->op); if (replaced){ @@ -4138,9 +4161,17 @@ static int remote_address_compare(LinphoneCall *call, const LinphoneAddress *rad * @ingroup call_control */ LinphoneCall *linphone_core_get_call_by_remote_address(LinphoneCore *lc, const char *remote_address){ + LinphoneCall *call=NULL; LinphoneAddress *raddr=linphone_address_new(remote_address); + if (raddr) { + call=linphone_core_get_call_by_remote_address2(lc, raddr); + linphone_address_unref(raddr); + } + return call; +} +LinphoneCall *linphone_core_get_call_by_remote_address2(LinphoneCore *lc, LinphoneAddress *raddr){ MSList *elem=ms_list_find_custom(lc->calls,(int (*)(const void*,const void *))remote_address_compare,raddr); - linphone_address_unref(raddr); + if (elem) return (LinphoneCall*) elem->data; return NULL; } diff --git a/coreapi/linphonecore.h b/coreapi/linphonecore.h index cfeb48e7e..22788939a 100644 --- a/coreapi/linphonecore.h +++ b/coreapi/linphonecore.h @@ -2237,6 +2237,17 @@ LINPHONE_PUBLIC LinphoneCallParams *linphone_core_create_call_params(LinphoneCor LINPHONE_PUBLIC LinphoneCall *linphone_core_get_call_by_remote_address(LinphoneCore *lc, const char *remote_address); +/** + * Get the call with the remote_address specified + * @param lc + * @param remote_address + * @return the LinphoneCall of the call if found + * + * @ingroup call_control + */ +LINPHONE_PUBLIC LinphoneCall *linphone_core_get_call_by_remote_address2(LinphoneCore *lc, LinphoneAddress *remote_address); + + /** * Send the specified dtmf. * diff --git a/tester/call_tester.c b/tester/call_tester.c index c1e234e4c..6b9fd035b 100644 --- a/tester/call_tester.c +++ b/tester/call_tester.c @@ -207,6 +207,7 @@ bool_t call_with_params2(LinphoneCoreManager* caller_mgr LinphoneCallParams *caller_params = caller_test_params->base; LinphoneCallParams *callee_params = callee_test_params->base; bool_t did_receive_call; + LinphoneCall *callee_call=NULL; setup_sdp_handling(caller_test_params, caller_mgr); setup_sdp_handling(callee_test_params, callee_mgr); @@ -229,7 +230,8 @@ bool_t call_with_params2(LinphoneCoreManager* caller_mgr if (!did_receive_call) return 0; - CU_ASSERT_TRUE(linphone_core_inc_invite_pending(callee_mgr->lc)); + if (linphone_core_get_calls_nb(callee_mgr->lc)<=1) + CU_ASSERT_TRUE(linphone_core_inc_invite_pending(callee_mgr->lc)); CU_ASSERT_EQUAL(caller_mgr->stat.number_of_LinphoneCallOutgoingProgress,initial_caller.number_of_LinphoneCallOutgoingProgress+1); @@ -247,6 +249,8 @@ bool_t call_with_params2(LinphoneCoreManager* caller_mgr CU_ASSERT_PTR_NOT_NULL(linphone_core_get_current_call_remote_address(callee_mgr->lc)); + callee_call=linphone_core_get_call_by_remote_address2(callee_mgr->lc,caller_mgr->identity); + if(!linphone_core_get_current_call(caller_mgr->lc) || !linphone_core_get_current_call(callee_mgr->lc) || !linphone_core_get_current_call_remote_address(callee_mgr->lc)) { return 0; } else if (caller_mgr->identity){ @@ -256,21 +260,23 @@ bool_t call_with_params2(LinphoneCoreManager* caller_mgr if (linphone_call_params_get_privacy(linphone_call_get_current_params(linphone_core_get_current_call(caller_mgr->lc))) == LinphonePrivacyNone) { /*don't check in case of p asserted id*/ if (!lp_config_get_int(callee_mgr->lc->config,"sip","call_logs_use_asserted_id_instead_of_from",0)) - CU_ASSERT_TRUE(linphone_address_weak_equal(callee_from,linphone_core_get_current_call_remote_address(callee_mgr->lc))); + CU_ASSERT_TRUE(linphone_address_weak_equal(callee_from,linphone_call_get_remote_address(callee_call))); } else { - CU_ASSERT_FALSE(linphone_address_weak_equal(callee_from,linphone_core_get_current_call_remote_address(callee_mgr->lc))); + CU_ASSERT_FALSE(linphone_address_weak_equal(callee_from,linphone_call_get_remote_address(linphone_core_get_current_call(callee_mgr->lc)))); } linphone_address_destroy(callee_from); } + + if (callee_params){ - linphone_core_accept_call_with_params(callee_mgr->lc,linphone_core_get_current_call(callee_mgr->lc),callee_params); + linphone_core_accept_call_with_params(callee_mgr->lc,callee_call,callee_params); }else if (build_callee_params){ - LinphoneCallParams *default_params=linphone_core_create_call_params(callee_mgr->lc,linphone_core_get_current_call(callee_mgr->lc)); + LinphoneCallParams *default_params=linphone_core_create_call_params(callee_mgr->lc,callee_call); ms_message("Created default call params with video=%i", linphone_call_params_video_enabled(default_params)); - linphone_core_accept_call_with_params(callee_mgr->lc,linphone_core_get_current_call(callee_mgr->lc),default_params); + linphone_core_accept_call_with_params(callee_mgr->lc,callee_call,default_params); linphone_call_params_destroy(default_params); }else{ - linphone_core_accept_call(callee_mgr->lc,linphone_core_get_current_call(callee_mgr->lc)); + linphone_core_accept_call(callee_mgr->lc,callee_call); } CU_ASSERT_TRUE(wait_for(callee_mgr->lc,caller_mgr->lc,&callee_mgr->stat.number_of_LinphoneCallConnected,initial_callee.number_of_LinphoneCallConnected+1)); @@ -291,7 +297,7 @@ bool_t call_with_params2(LinphoneCoreManager* caller_mgr || (linphone_core_get_media_encryption(caller_mgr->lc) == LinphoneMediaEncryptionDTLS) /*also take care of caller policy*/ ) wait_for(callee_mgr->lc,caller_mgr->lc,&callee_mgr->stat.number_of_LinphoneCallEncryptedOn,initial_callee.number_of_LinphoneCallEncryptedOn+1); { - const LinphoneCallParams* call_param = linphone_call_get_current_params(linphone_core_get_current_call(callee_mgr->lc)); + const LinphoneCallParams* call_param = linphone_call_get_current_params(callee_call); CU_ASSERT_EQUAL(linphone_call_params_get_media_encryption(call_param),linphone_core_get_media_encryption(caller_mgr->lc)); call_param = linphone_call_get_current_params(linphone_core_get_current_call(caller_mgr->lc)); CU_ASSERT_EQUAL(linphone_call_params_get_media_encryption(call_param),linphone_core_get_media_encryption(caller_mgr->lc)); @@ -902,6 +908,21 @@ static void early_declined_call(void) { linphone_core_manager_destroy(pauline); } +static void call_busy_when_calling_self(void) { + LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); + LinphoneCall *out_call=linphone_core_invite_address(marie->lc,marie->identity); + linphone_call_ref(out_call); + + /*wait until flexisip transfers the busy...*/ + CU_ASSERT_TRUE(wait_for_until(marie->lc,marie->lc,&marie->stat.number_of_LinphoneCallError,1,33000)); + CU_ASSERT_EQUAL(marie->stat.number_of_LinphoneCallError,1); + + CU_ASSERT_EQUAL(linphone_call_get_reason(out_call),LinphoneReasonBusy); + linphone_call_unref(out_call); + linphone_core_manager_destroy(marie); +} + + static void call_declined(void) { LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc"); @@ -4040,6 +4061,7 @@ test_t call_tests[] = { { "Early cancelled call", early_cancelled_call}, { "Call with DNS timeout", call_with_dns_time_out }, { "Cancelled ringing call", cancelled_ringing_call }, + { "Call busy when calling self", call_busy_when_calling_self}, { "Simple call", simple_call }, { "Call with timeouted bye", call_with_timeouted_bye }, { "Direct call over IPv6", direct_call_over_ipv6}, diff --git a/tester/multi_call.c b/tester/multi_call.c index 14f0db9d1..5f580118c 100644 --- a/tester/multi_call.c +++ b/tester/multi_call.c @@ -115,6 +115,70 @@ static void call_waiting_indication_with_privacy(void) { call_waiting_indication_with_param(TRUE); } +static void incoming_call_accepted_when_outgoing_call_in_state(LinphoneCallState state) { + LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); + LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc"); + LinphoneCoreManager* laure = linphone_core_manager_new( "laure_rc"); + MSList* lcs; + LinphoneCallParams *laure_params=linphone_core_create_default_call_parameters(laure->lc); + LinphoneCallParams *marie_params=linphone_core_create_default_call_parameters(marie->lc); + + lcs=ms_list_append(NULL,marie->lc); + lcs=ms_list_append(lcs,pauline->lc); + lcs=ms_list_append(lcs,laure->lc); + + + if (state==LinphoneCallOutgoingRinging || state==LinphoneCallOutgoingEarlyMedia) { + CU_ASSERT_PTR_NOT_NULL(linphone_core_invite_address_with_params(marie->lc,pauline->identity,marie_params)); + + CU_ASSERT_TRUE(wait_for(marie->lc + ,pauline->lc + ,&pauline->stat.number_of_LinphoneCallIncomingReceived + ,1)); + + if (state==LinphoneCallOutgoingEarlyMedia) + linphone_core_accept_early_media(pauline->lc,linphone_core_get_current_call(pauline->lc)); + + CU_ASSERT_EQUAL(marie->stat.number_of_LinphoneCallOutgoingProgress,1); + CU_ASSERT_TRUE(wait_for(marie->lc + ,pauline->lc + ,state==LinphoneCallOutgoingEarlyMedia?&marie->stat.number_of_LinphoneCallOutgoingEarlyMedia:&marie->stat.number_of_LinphoneCallOutgoingRinging + ,1)); + } else if (state==LinphoneCallOutgoingProgress) { + CU_ASSERT_PTR_NOT_NULL(linphone_core_invite_address(marie->lc,pauline->identity)); + } else { + ms_error("Unsupported state"); + return; + } + + CU_ASSERT_TRUE(call_with_caller_params(laure,marie,laure_params)); + + + CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallEnd,1,10000)); + + + linphone_core_terminate_all_calls(marie->lc); + + CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallEnd,1,10000)); + CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallEnd,1,10000)); + CU_ASSERT_TRUE(wait_for_list(lcs,&laure->stat.number_of_LinphoneCallEnd,1,10000)); + + + linphone_core_manager_destroy(marie); + linphone_core_manager_destroy(pauline); + linphone_core_manager_destroy(laure); + ms_list_free(lcs); +} +static void incoming_call_accepted_when_outgoing_call_in_progress(void) { + incoming_call_accepted_when_outgoing_call_in_state(LinphoneCallOutgoingProgress); +} +static void incoming_call_accepted_when_outgoing_call_in_outgoing_ringing(void) { + incoming_call_accepted_when_outgoing_call_in_state(LinphoneCallOutgoingRinging); +} +static void incoming_call_accepted_when_outgoing_call_in_outgoing_ringing_early_media(void) { + incoming_call_accepted_when_outgoing_call_in_state(LinphoneCallOutgoingEarlyMedia); +} + static void simple_conference_base(LinphoneCoreManager* marie, LinphoneCoreManager* pauline, LinphoneCoreManager* laure) { stats initial_marie_stat; @@ -437,7 +501,10 @@ test_t multi_call_tests[] = { { "Simple call transfer", simple_call_transfer }, { "Unattended call transfer", unattended_call_transfer }, { "Unattended call transfer with error", unattended_call_transfer_with_error }, - { "Call transfer existing call outgoing call", call_transfer_existing_call_outgoing_call } + { "Call transfer existing call outgoing call", call_transfer_existing_call_outgoing_call }, + { "Incoming call accepted when outgoing call in progress",incoming_call_accepted_when_outgoing_call_in_progress}, + { "Incoming call accepted when outgoing call in outgoing ringing",incoming_call_accepted_when_outgoing_call_in_outgoing_ringing}, + { "Incoming call accepted when outgoing call in outgoing ringing early media",incoming_call_accepted_when_outgoing_call_in_outgoing_ringing_early_media}, }; test_suite_t multi_call_test_suite = { From e98e7362a48fbd47856ddf2ecf814b1d8fdd77a1 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Tue, 5 May 2015 13:39:27 +0200 Subject: [PATCH 100/157] Updated ms2 with fix for HAVE_NON_FREE_CODECS for Android --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index 0d8287da4..564b8b9f5 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 0d8287da41ea367cc12d79590798ba8c6811c9e4 +Subproject commit 564b8b9f5a00b47acbc23eda296e554668bd8630 From 9da8db40e99dc950decb90ca57bd9b1d0cc8621b Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Tue, 5 May 2015 14:34:14 +0200 Subject: [PATCH 101/157] Update ms2 submodule. --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index 564b8b9f5..9fd18825d 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 564b8b9f5a00b47acbc23eda296e554668bd8630 +Subproject commit 9fd18825de471a87f18c4925412d3dc95e7b42fb From dc4ee10ca9c916e32165a83e741ffc222b4f41bd Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Tue, 5 May 2015 15:01:15 +0200 Subject: [PATCH 102/157] Update ms2 submodule. --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index 9fd18825d..d584fc655 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 9fd18825de471a87f18c4925412d3dc95e7b42fb +Subproject commit d584fc65538391e95785461a9082b885a5171938 From 6851e5e5e906a4d46bf1df1c5b46edb3ada72536 Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Tue, 5 May 2015 17:02:44 +0200 Subject: [PATCH 103/157] bc_tester_utils.h: fix some macros and update ms2 as well --- mediastreamer2 | 2 +- tester/common/bc_tester_utils.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mediastreamer2 b/mediastreamer2 index d584fc655..ca5e8a01b 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit d584fc65538391e95785461a9082b885a5171938 +Subproject commit ca5e8a01b73f0c8fe0e3eddfd58221cf1c9e33ff diff --git a/tester/common/bc_tester_utils.h b/tester/common/bc_tester_utils.h index a6c5db6d4..68f573bed 100644 --- a/tester/common/bc_tester_utils.h +++ b/tester/common/bc_tester_utils.h @@ -132,7 +132,7 @@ char * bc_tester_res(const char *name); } #define BC_ASSERT_GREATER_INT(actual, expected) { \ int cactual = (actual), cexpected = (expected); \ - if (! BC_ASSERT_LOWER(cactual, cexpected)) { \ + if (! BC_ASSERT_GREATER(cactual, cexpected)) { \ bc_tester_printf(bc_printf_verbosity_error, "%s:%d - Expected " #actual " >= " #expected " but was %d < %d\n", __FILE__, __LINE__, cactual, cexpected); \ } \ } @@ -150,7 +150,7 @@ char * bc_tester_res(const char *name); } #define BC_ASSERT_LOWER_UINT64_T(actual, expected) { \ uint64_t cactual = (actual), cexpected = (expected); \ - if (! BC_ASSERT_GREATER(cactual, cexpected)) { \ + if (! BC_ASSERT_LOWER(cactual, cexpected)) { \ bc_tester_printf(bc_printf_verbosity_error, "%s:%d - Expected " #actual " <= " #expected " but was %lu > %lu\n", __FILE__, __LINE__, (long unsigned)cactual, (long unsigned)cexpected); \ } \ } From befec1fd9344c901ceb1aca05be54c02386aef69 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Tue, 5 May 2015 18:28:57 +0200 Subject: [PATCH 104/157] try to load libraries with the prefered order of the device --- .../core/LinphoneCoreFactoryImpl.java | 46 ++++++++++++------- mediastreamer2 | 2 +- 2 files changed, 30 insertions(+), 18 deletions(-) diff --git a/java/impl/org/linphone/core/LinphoneCoreFactoryImpl.java b/java/impl/org/linphone/core/LinphoneCoreFactoryImpl.java index 5b2a87c55..0d6fc777b 100644 --- a/java/impl/org/linphone/core/LinphoneCoreFactoryImpl.java +++ b/java/impl/org/linphone/core/LinphoneCoreFactoryImpl.java @@ -20,6 +20,7 @@ package org.linphone.core; import java.io.File; import java.io.IOException; +import java.util.List; import org.linphone.mediastream.MediastreamerAndroidContext; import org.linphone.mediastream.Version; @@ -33,30 +34,41 @@ public class LinphoneCoreFactoryImpl extends LinphoneCoreFactory { System.loadLibrary(s); return true; } catch (Throwable e) { - Log.w("Unable to load optional library lib", s); + Log.w("LinphoneCoreFactoryImpl", "Unable to load optional library lib" + s); } return false; } static { - String eabi = "armeabi"; - if (Version.isX86()) { - eabi = "x86"; - } else if (Version.isArmv7()) { - eabi = "armeabi-v7a"; + List cpuabis=Version.getCpuAbis(); + String ffmpegAbi; + boolean libLoaded=false; + Throwable firstException=null; + for (String abi : cpuabis){ + Log.i("LinphoneCoreFactoryImpl","Trying to load liblinphone for " + abi); + ffmpegAbi=abi; + // FFMPEG (audio/video) + if (abi.startsWith("armeabi")) { + ffmpegAbi="arm"; + } + loadOptionalLibrary("ffmpeg-linphone-"+ffmpegAbi); + //Main library + try { + System.loadLibrary("linphone-" + abi); + Log.i("LinphoneCoreFactoryImpl","Loading done with " + abi); + libLoaded=true; + break; + }catch(Throwable e) { + if (firstException == null) firstException=e; + } } - - // FFMPEG (audio/video) - if (Version.isX86()) { - loadOptionalLibrary("ffmpeg-linphone-x86"); - } else if (Version.isArmv7()) { - loadOptionalLibrary("ffmpeg-linphone-arm"); + + if (!libLoaded){ + throw new RuntimeException(firstException); + + }else{ + Version.dumpCapabilities(); } - - //Main library - System.loadLibrary("linphone-" + eabi); - - Version.dumpCapabilities(); } @Override public LinphoneAuthInfo createAuthInfo(String username, String password, diff --git a/mediastreamer2 b/mediastreamer2 index ca5e8a01b..1070145ca 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit ca5e8a01b73f0c8fe0e3eddfd58221cf1c9e33ff +Subproject commit 1070145caf60a8e778508a70b1d70600734a7fe3 From 2acfd21a642527057df94ca2eea8fe28341698e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Grisez?= Date: Tue, 5 May 2015 14:19:05 +0200 Subject: [PATCH 105/157] Update README.macos.md --- README.macos.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.macos.md b/README.macos.md index 61132bf3f..6f54e1444 100644 --- a/README.macos.md +++ b/README.macos.md @@ -72,7 +72,7 @@ The next pieces need to be compiled manually. * Install polarssl (encryption library used by belle-sip) - git clone git://git.linphone.org/polarssl.git -b linphone + git clone git://git.linphone.org/polarssl.git cd polarssl ./autogen.sh && ./configure --prefix=/opt/local && make sudo make install @@ -92,7 +92,7 @@ The next pieces need to be compiled manually. * (Optional) Install zrtp, for unbreakable call encryption - git clone git://git.linphone.org:bzrtp + git clone git://git.linphone.org/bzrtp.git cd bzrtp && ./autogen.sh && ./configure --prefix=/opt/local && make sudo make install @@ -113,7 +113,7 @@ The next pieces need to be compiled manually. If you got the source code from git, run `./autogen.sh` first. Then or otherwise, : - PKG_CONFIG_PATH=/usr/local/lib/pkgconfig ./configure --prefix=/opt/local --with-srtp=/opt/local --with-gsm=/opt/local --enable-zrtp --disable-strict && make + PKG_CONFIG_PATH=/opt/local/lib/pkgconfig ./configure --prefix=/opt/local --with-srtp=/opt/local --with-gsm=/opt/local --enable-zrtp --disable-strict && make * Install on the system From ff58ba61621b39faf7cc990adc73ed8e51ea51fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Grisez?= Date: Tue, 5 May 2015 18:33:05 +0200 Subject: [PATCH 106/157] Add the license text in the MacOSX installer --- Makefile.am | 14 +++++++++----- build/macos/Makefile.am | 8 ++++++-- build/macos/pkg-distribution.xml.in | 27 +++++++++++++-------------- configure.ac | 1 + 4 files changed, 29 insertions(+), 21 deletions(-) diff --git a/Makefile.am b/Makefile.am index ae5ec2271..c72151e40 100644 --- a/Makefile.am +++ b/Makefile.am @@ -242,11 +242,15 @@ signed-bundle: $(MACAPPNAME) cd $(BUNDLEDIR)/.. && rm -f $(MAXAPPDMG) && hdiutil create $(MACAPPDMG) -srcfolder $(MACAPPNAME) -ov && cd - pkg: $(MACAPPNAME) - rm -rf ${srcdir}/packaging - mkdir ${srcdir}/packaging - pkgbuild --install-location /Applications --scripts ${srcdir}/build/macos/pkg-scripts --sign "$(BUNDLE_SIGNING_ID)" --component $(MACAPPNAME) ${srcdir}/packaging/linphone.pkg - productbuild --distribution ${srcdir}/build/macos/pkg-distribution.xml --resources ${srcdir}/packaging $(MACAPPPKG} + rm -rf ./packaging + mkdir -p ./packaging + cp ${srcdir}/COPYING ./packaging + pkgbuild --install-location /Applications --scripts ${srcdir}/build/macos/pkg-scripts --component $(MACAPPNAME) ./packaging/linphone.pkg + productbuild --resources . --distribution ${srcdir}/build/macos/pkg-distribution.xml --package-path ./packaging $(MACAPPPKG) +signed-pkg: pkg + productsign --sign "$(BUNDLE_SIGNING_ID)" $(MACAPPPKG) $(MACAPPPKG) + ### ### CLEAN @@ -258,6 +262,6 @@ discovery: $(CC) --include $(top_builddir)/config.h \ $(TUNNEL_CFLAGS) $(CFLAGS) $(MEDIASTREAMER2_CFLAGS) $(ORTP_CFLAGS) $(SIPSTACK_CFLAGS) $(CUNIT_CFLAGS) -E -P -v -dD specs.c -.PHONY: $(MACAPPNAME) +.PHONY: $(MACAPPNAME) pkg diff --git a/build/macos/Makefile.am b/build/macos/Makefile.am index 6556fb5d8..bff44fefc 100644 --- a/build/macos/Makefile.am +++ b/build/macos/Makefile.am @@ -1,3 +1,7 @@ -EXTRA_DIST=linphone.bundle environment.sh Info-linphone.plist.in pkg-scripts/postinstall - +EXTRA_DIST= \ + linphone.bundle \ + environment.sh \ + Info-linphone.plist.in \ + pkg-scripts/postinstall \ + pkg-distribution.xml.in diff --git a/build/macos/pkg-distribution.xml.in b/build/macos/pkg-distribution.xml.in index 547fc5e05..37cd80ebe 100644 --- a/build/macos/pkg-distribution.xml.in +++ b/build/macos/pkg-distribution.xml.in @@ -1,17 +1,16 @@ - - - - - - - - - - - - linphone.pkg - + + + + + + + + + + + + linphone.pkg + - diff --git a/configure.ac b/configure.ac index e8103004d..30a136940 100644 --- a/configure.ac +++ b/configure.ac @@ -1041,6 +1041,7 @@ AC_CONFIG_FILES([ build/Makefile build/macos/Makefile build/macos/Info-linphone.plist + build/macos/pkg-distribution.xml m4/Makefile po/Makefile.in pixmaps/Makefile From 1b50743a31c712dfce66ffcacccc7719af0a703d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Grisez?= Date: Tue, 5 May 2015 18:43:29 +0200 Subject: [PATCH 107/157] Fix bundle signing on MacOSX --- Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.am b/Makefile.am index c72151e40..636e86fe9 100644 --- a/Makefile.am +++ b/Makefile.am @@ -238,7 +238,7 @@ bundle: $(MACAPPNAME) cd $(BUNDLEDIR)/.. && rm -f $(MAXAPPDMG) && hdiutil create $(MACAPPDMG) -srcfolder $(MACAPPNAME) -ov && cd - signed-bundle: $(MACAPPNAME) - codesign --deep -s $(BUNDLE_SIGNING_ID) $(BUNDLEDIR) + codesign --deep -s "$(BUNDLE_SIGNING_ID)" $(BUNDLEDIR) cd $(BUNDLEDIR)/.. && rm -f $(MAXAPPDMG) && hdiutil create $(MACAPPDMG) -srcfolder $(MACAPPNAME) -ov && cd - pkg: $(MACAPPNAME) From 1142f6baba9b60749fadcda3d8ca4cdd7fcec9fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Grisez?= Date: Tue, 5 May 2015 18:49:28 +0200 Subject: [PATCH 108/157] Fix package signing on MacOSX --- Makefile.am | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Makefile.am b/Makefile.am index 636e86fe9..7b8755e67 100644 --- a/Makefile.am +++ b/Makefile.am @@ -249,7 +249,9 @@ pkg: $(MACAPPNAME) productbuild --resources . --distribution ${srcdir}/build/macos/pkg-distribution.xml --package-path ./packaging $(MACAPPPKG) signed-pkg: pkg - productsign --sign "$(BUNDLE_SIGNING_ID)" $(MACAPPPKG) $(MACAPPPKG) + mv $(MACAPPPKG) $(MACAPPPKG).tmp + productsign --sign "$(BUNDLE_SIGNING_ID)" $(MACAPPPKG).tmp $(MACAPPPKG) + rm -f $(MACAPPPKG).tmp ### From 1832c113268259b86efa853d0f213bc716c639a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Grisez?= Date: Tue, 5 May 2015 18:52:16 +0200 Subject: [PATCH 109/157] Update Info.plist. The minimum MacOSX version is now 10.7 --- build/macos/Info-linphone.plist.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/macos/Info-linphone.plist.in b/build/macos/Info-linphone.plist.in index 7d20d4ac6..cd148bb84 100644 --- a/build/macos/Info-linphone.plist.in +++ b/build/macos/Info-linphone.plist.in @@ -25,7 +25,7 @@ NSHumanReadableCopyright Copyright 2011 Belledonne Communications LSMinimumSystemVersion - 10.4 + 10.7 NSAppSleepDisabled YES From 730a7dc3cdc4215b1ad718d81e03ae4585ccbc20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Grisez?= Date: Tue, 5 May 2015 21:06:48 +0200 Subject: [PATCH 110/157] Call linphone_status_icon_init even if HAVE_GTK_OSX is defined --- gtk/main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gtk/main.c b/gtk/main.c index db603d028..43bd5ee16 100644 --- a/gtk/main.c +++ b/gtk/main.c @@ -2032,9 +2032,9 @@ static void linphone_gtk_init_ui(void){ start_option=START_AUDIO_ASSISTANT; iconified = TRUE; } -#ifndef HAVE_GTK_OSX + linphone_gtk_init_status_icon(); -#endif + if (!iconified){ linphone_gtk_show_main_window(); linphone_gtk_check_soundcards(); From 978b3b7ac1cb2f872de04312982382df19f37c1c Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Wed, 6 May 2015 10:14:51 +0200 Subject: [PATCH 111/157] Update version number in Python documentation. --- tools/python/doc/source/conf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/python/doc/source/conf.py b/tools/python/doc/source/conf.py index 8dfeec972..c01ba688d 100644 --- a/tools/python/doc/source/conf.py +++ b/tools/python/doc/source/conf.py @@ -53,9 +53,9 @@ copyright = u'2014, Belledonne Communications' # built documents. # # The short X.Y version. -version = '3.7' +version = '3.8' # The full version, including alpha/beta/rc tags. -release = '3.7.0' +release = '3.8.2' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 34e5de5fd017f24e4dc7273c4dda93c9b604c54f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Grisez?= Date: Wed, 6 May 2015 12:08:30 +0200 Subject: [PATCH 112/157] Fix crash on MacOSX --- gtk/status_icon.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gtk/status_icon.c b/gtk/status_icon.c index b3dceea5e..dc61ec403 100644 --- a/gtk/status_icon.c +++ b/gtk/status_icon.c @@ -205,11 +205,11 @@ const char *linphone_status_icon_get_implementation_name(const LinphoneStatusIco void linphone_status_icon_start(LinphoneStatusIcon *obj, LinphoneStatusIconParams *params) { obj->params = linphone_status_icon_params_ref(params); - obj->desc->start(obj); + if(obj->desc->start) obj->desc->start(obj); } void linphone_status_icon_enable_blinking(LinphoneStatusIcon *obj, gboolean enable) { - obj->desc->enable_blinking(obj, enable); + if(obj->desc->enable_blinking) obj->desc->enable_blinking(obj, enable); } static void _linphone_status_icon_notify_click(LinphoneStatusIcon *obj) { From dbfdd320437795bb3294b044a4dd9e6f19f28acb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Grisez?= Date: Wed, 6 May 2015 13:50:14 +0200 Subject: [PATCH 113/157] Fix some memory leaks --- gtk/main.c | 1 - gtk/status_icon.c | 3 ++- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gtk/main.c b/gtk/main.c index 43bd5ee16..242e9b67e 100644 --- a/gtk/main.c +++ b/gtk/main.c @@ -1569,7 +1569,6 @@ static void linphone_gtk_init_status_icon(void) { linphone_status_icon_params_set_title(params, _("Linphone")); linphone_status_icon_params_set_description(params, _("A video internet phone")); linphone_status_icon_params_set_on_click_cb(params, handle_icon_click, NULL); - g_object_unref(G_OBJECT(menu)); if(linphone_status_icon_init( (LinphoneStatusIconReadyCb)linphone_gtk_status_icon_initialised_cb, diff --git a/gtk/status_icon.c b/gtk/status_icon.c index dc61ec403..aba9c5d1d 100644 --- a/gtk/status_icon.c +++ b/gtk/status_icon.c @@ -60,6 +60,7 @@ void linphone_status_icon_params_unref(LinphoneStatusIconParams *obj) { if(obj->ref < 0) { if(obj->title) g_free(obj->title); if(obj->menu) g_object_unref(obj->menu); + if(obj->desc) g_free(obj->desc); g_free(obj); } } @@ -78,7 +79,7 @@ void linphone_status_icon_params_set_description(LinphoneStatusIconParams *obj, void linphone_status_icon_params_set_menu(LinphoneStatusIconParams *obj, GtkWidget *menu) { if(obj->menu) g_object_unref(obj->menu); - if(menu) obj->menu = g_object_ref(menu); + if(menu) obj->menu = g_object_ref_sink(menu); else obj->menu = NULL; } From cedff6cd9e028728ee44371c26d0fa94bd4fe4b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Grisez?= Date: Wed, 6 May 2015 14:48:32 +0200 Subject: [PATCH 114/157] Add a title and a background image to the MacOSX installer --- Makefile.am | 1 + build/macos/pkg-distribution.xml.in | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Makefile.am b/Makefile.am index 7b8755e67..007dc5dbf 100644 --- a/Makefile.am +++ b/Makefile.am @@ -245,6 +245,7 @@ pkg: $(MACAPPNAME) rm -rf ./packaging mkdir -p ./packaging cp ${srcdir}/COPYING ./packaging + cp ${srcdir}/pixmaps/linphone.png ./packaging pkgbuild --install-location /Applications --scripts ${srcdir}/build/macos/pkg-scripts --component $(MACAPPNAME) ./packaging/linphone.pkg productbuild --resources . --distribution ${srcdir}/build/macos/pkg-distribution.xml --package-path ./packaging $(MACAPPPKG) diff --git a/build/macos/pkg-distribution.xml.in b/build/macos/pkg-distribution.xml.in index 37cd80ebe..8f66a99d9 100644 --- a/build/macos/pkg-distribution.xml.in +++ b/build/macos/pkg-distribution.xml.in @@ -1,5 +1,8 @@ + Linphone + + @@ -12,5 +15,4 @@ linphone.pkg - From 8e7bb644da3c3f84dfdb6da8aeca06e22a58ccc3 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Wed, 6 May 2015 15:51:12 +0200 Subject: [PATCH 115/157] Updated ms2 --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index 1070145ca..b3dffc120 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 1070145caf60a8e778508a70b1d70600734a7fe3 +Subproject commit b3dffc120c31d73548dbb4197dafb27ae7f41e8f From 83f6597b01cca37102df7d67f9684fffb957667a Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Thu, 7 May 2015 11:04:00 +0200 Subject: [PATCH 116/157] linphonec: fix register command to use password correctly --- console/commands.c | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/console/commands.c b/console/commands.c index 8f1ef2293..d24bfa16b 100644 --- a/console/commands.c +++ b/console/commands.c @@ -1915,24 +1915,24 @@ static int lpc_cmd_register(LinphoneCore *lc, char *args){ const MSList *elem; if (!args) - { - /* it means that you want to register the default proxy */ - LinphoneProxyConfig *cfg=NULL; - linphone_core_get_default_proxy(lc,&cfg); - if (cfg) - { - if(!linphone_proxy_config_is_registered(cfg)) { + { + /* it means that you want to register the default proxy */ + LinphoneProxyConfig *cfg=NULL; + linphone_core_get_default_proxy(lc,&cfg); + if (cfg) + { + if(!linphone_proxy_config_is_registered(cfg)) { linphone_proxy_config_enable_register(cfg,TRUE); linphone_proxy_config_done(cfg); }else{ linphonec_out("default proxy already registered\n"); } - }else{ - linphonec_out("we do not have a default proxy\n"); - return 0; - } - return 1; - } + }else{ + linphonec_out("we do not have a default proxy\n"); + return 0; + } + return 1; + } passwd[0]=proxy[0]=identity[0]='\0'; sscanf(args,"%511s %511s %511s",identity,proxy,passwd); if (proxy[0]=='\0' || identity[0]=='\0'){ @@ -1943,7 +1943,7 @@ static int lpc_cmd_register(LinphoneCore *lc, char *args){ LinphoneAddress *from; LinphoneAuthInfo *info; if ((from=linphone_address_new(identity))!=NULL){ - info=linphone_auth_info_new(NULL,NULL,passwd,NULL,NULL,linphone_address_get_username(from)); + info=linphone_auth_info_new(linphone_address_get_username(from),NULL,passwd,NULL,NULL,linphone_address_get_username(from)); linphone_core_add_auth_info(lc,info); linphone_address_destroy(from); linphone_auth_info_destroy(info); From adb12547e8a9760c1ae813f6bf75951d7ce192b0 Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Thu, 7 May 2015 11:12:00 +0200 Subject: [PATCH 117/157] shell.c: add STATUS_IN_COMING status for incoming call --- console/shell.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/console/shell.c b/console/shell.c index 7a502ecd4..7fbccb4c3 100644 --- a/console/shell.c +++ b/console/shell.c @@ -48,6 +48,7 @@ #define STATUS_AUTOANSWER (1<<3) #define STATUS_IN_CONNECTED (1<<4) /* incoming call accepted */ #define STATUS_OUT_CONNECTED (1<<5) /*outgoing call accepted */ +#define STATUS_IN_COMING (1<<6) /*incoming call pending */ static int make_status_value(const char *status_string){ @@ -70,6 +71,9 @@ static int make_status_value(const char *status_string){ if (strstr(status_string,"hook=answered")){ ret|=STATUS_IN_CONNECTED; } + if (strstr(status_string,"Incoming call from ")){ + ret|=STATUS_IN_COMING; + } return ret; } @@ -181,7 +185,7 @@ static void spawn_linphonec(int argc, char *argv[]){ int fd; /*we are the new process*/ setsid(); - + fd = open("/dev/null", O_RDWR); if (fd==-1){ fprintf(stderr,"Could not open /dev/null\n"); @@ -191,7 +195,7 @@ static void spawn_linphonec(int argc, char *argv[]){ dup2(fd, 1); dup2(fd, 2); close(fd); - + if (execvp("linphonec",args)==-1){ fprintf(stderr,"Fail to spawn linphonec: %s\n",strerror(errno)); exit(-1); @@ -207,7 +211,7 @@ static void spawn_linphonec(int argc, char *argv[]){ const char *cmd = "linphoned.exe --pipe -c NUL"; char *args_in_line = argv_to_line(argc, argv); char *cmd_with_args; - + ZeroMemory( &si, sizeof(si) ); si.cb = sizeof(si); ZeroMemory( &pinfo, sizeof(pinfo) ); @@ -217,7 +221,7 @@ static void spawn_linphonec(int argc, char *argv[]){ } else { cmd_with_args = ortp_strdup(cmd); } - + ret=CreateProcess(NULL, cmd_with_args, NULL, NULL, @@ -308,7 +312,7 @@ static int status_execute(int argc, char *argv[]){ char cmd[512]; char reply[DEFAULT_REPLY_SIZE]; int err; - + if (argc==1){ snprintf(cmd,sizeof(cmd),"status %s",argv[0]); err=send_command(cmd,reply,sizeof(reply),TRUE); From 7a5f881221815f2621e876d3a677840053969d54 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Thu, 7 May 2015 11:41:21 +0200 Subject: [PATCH 118/157] Updated ms2 with 64bits CPU fix for Android --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index b3dffc120..05fba59cf 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit b3dffc120c31d73548dbb4197dafb27ae7f41e8f +Subproject commit 05fba59cf8aa11914ad6130955c1a6d60d67eda5 From b2fbba5e4bb617e6fb6463aa5f915d833dbe225f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Grisez?= Date: Thu, 7 May 2015 11:42:21 +0200 Subject: [PATCH 119/157] Fix language selection on Windows --- gtk/main.c | 27 +++++++++------------------ 1 file changed, 9 insertions(+), 18 deletions(-) diff --git a/gtk/main.c b/gtk/main.c index 242e9b67e..1c85c6ab3 100644 --- a/gtk/main.c +++ b/gtk/main.c @@ -2067,43 +2067,34 @@ int main(int argc, char *argv[]){ workingdir= (tmp=g_getenv("LINPHONE_WORKDIR")) ? g_strdup(tmp) : NULL; -#ifdef WIN32 - /*workaround for windows: sometimes LANG is defined to an integer value, not understood by gtk */ - if ((lang=getenv("LANG"))!=NULL){ - if (atoi(lang)!=0){ - char tmp[128]; - snprintf(tmp,sizeof(tmp),"LANG=",lang); - _putenv(tmp); - } - } -#else +#ifdef __linux /*for pulseaudio:*/ g_setenv("PULSE_PROP_media.role", "phone", TRUE); #endif lang=linphone_gtk_get_lang(config_file); if (lang == NULL || lang[0]=='\0'){ - lang = getenv("LANG"); + lang = g_getenv("LANG"); } if (lang && lang[0]!='\0'){ #ifdef WIN32 - char tmp[128]; - snprintf(tmp,sizeof(tmp),"LANG=%s",lang); - _putenv(tmp); if (strncmp(lang,"zh",2)==0){ workaround_gtk_entry_chinese_bug=TRUE; } -#elif __APPLE__ - setenv("LANG",lang,1); - setenv("LANGUAGE",lang,1); #else - setenv("LANGUAGE",lang,1); + g_setenv("LANG",lang,1); + g_setenv("LANGUAGE",lang,1); #endif } #ifdef ENABLE_NLS bindtextdomain(GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); +#ifdef WIN32 + setlocale(LC_ALL,lang ? lang : ""); +#else setlocale(LC_ALL,""); +#endif + /*do not use textdomain(): this sets a global default domain. On Mac OS bundle, it breaks gtk translations (obscure bug somewhere)*/ /*textdomain (GETTEXT_PACKAGE);*/ #else From 05229ca079866640b2aa1ab312bf86eb4a7e571e Mon Sep 17 00:00:00 2001 From: Guillaume BIENKOWSKI Date: Thu, 7 May 2015 11:52:38 +0200 Subject: [PATCH 120/157] Use videostream ms2 --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index 05fba59cf..7898df428 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 05fba59cf8aa11914ad6130955c1a6d60d67eda5 +Subproject commit 7898df428a2c6a56901cb81e2ee760c0643efc44 From 3d8cd3e4567ec843959491605b0d2621d175b7fe Mon Sep 17 00:00:00 2001 From: Guillaume BIENKOWSKI Date: Thu, 7 May 2015 14:53:19 +0200 Subject: [PATCH 121/157] Update ms2 --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index 7898df428..d5ba834e6 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 7898df428a2c6a56901cb81e2ee760c0643efc44 +Subproject commit d5ba834e68b9a182bce500cc1cbdcd582fa1c3ee From f138c34b9eedc91aeb00fecc5d9f72d99f7992d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Grisez?= Date: Thu, 7 May 2015 15:15:26 +0200 Subject: [PATCH 122/157] Fix i18n on Windows --- gtk/main.c | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/gtk/main.c b/gtk/main.c index 1c85c6ab3..c73c57ec2 100644 --- a/gtk/main.c +++ b/gtk/main.c @@ -2071,29 +2071,25 @@ int main(int argc, char *argv[]){ /*for pulseaudio:*/ g_setenv("PULSE_PROP_media.role", "phone", TRUE); #endif + lang=linphone_gtk_get_lang(config_file); if (lang == NULL || lang[0]=='\0'){ - lang = g_getenv("LANG"); + lang = g_getenv("LANGUAGE"); + if (!lang) lang = g_getenv("LANG"); } if (lang && lang[0]!='\0'){ #ifdef WIN32 if (strncmp(lang,"zh",2)==0){ workaround_gtk_entry_chinese_bug=TRUE; } -#else - g_setenv("LANG",lang,1); - g_setenv("LANGUAGE",lang,1); #endif + g_setenv("LANGUAGE",lang,1); } #ifdef ENABLE_NLS + setlocale(LC_ALL, ""); bindtextdomain(GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); -#ifdef WIN32 - setlocale(LC_ALL,lang ? lang : ""); -#else - setlocale(LC_ALL,""); -#endif /*do not use textdomain(): this sets a global default domain. On Mac OS bundle, it breaks gtk translations (obscure bug somewhere)*/ /*textdomain (GETTEXT_PACKAGE);*/ From 26ed8b79a9e69f0fb46acb93ed850bb0adb34d05 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Thu, 7 May 2015 15:59:22 +0200 Subject: [PATCH 123/157] fix linux hotplug detection --- gtk/utils.c | 4 ++-- mediastreamer2 | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/gtk/utils.c b/gtk/utils.c index b8db633d8..c03ea462b 100644 --- a/gtk/utils.c +++ b/gtk/utils.c @@ -102,14 +102,14 @@ void linphone_gtk_reload_sound_devices(void){ GtkWidget *mw=linphone_gtk_get_main_window(); GtkWidget *pb=(GtkWidget*)g_object_get_data(G_OBJECT(mw),"parameters"); linphone_core_reload_sound_devices(linphone_gtk_get_core()); - linphone_gtk_fill_soundcards(pb); + if (pb) linphone_gtk_fill_soundcards(pb); } void linphone_gtk_reload_video_devices(void){ GtkWidget *mw=linphone_gtk_get_main_window(); GtkWidget *pb=(GtkWidget*)g_object_get_data(G_OBJECT(mw),"parameters"); linphone_core_reload_video_devices(linphone_gtk_get_core()); - linphone_gtk_fill_webcams(pb); + if (pb) linphone_gtk_fill_webcams(pb); } #ifdef HAVE_LIBUDEV_H diff --git a/mediastreamer2 b/mediastreamer2 index 05fba59cf..82b3f80d3 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 05fba59cf8aa11914ad6130955c1a6d60d67eda5 +Subproject commit 82b3f80d3171c1fbcda07d5199b3a74849ad9105 From a115563dbcce9a458338b5da7512b2f86dcddd91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Grisez?= Date: Thu, 7 May 2015 16:18:50 +0200 Subject: [PATCH 124/157] Fix "Io recv error without active registration" test --- NEWS | 8 +++++++- tester/register_tester.c | 6 +++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/NEWS b/NEWS index 4023db3ac..13bc4b2e6 100644 --- a/NEWS +++ b/NEWS @@ -1,8 +1,14 @@ linphone-3.8.2 -- Aril 30th, 2015 + Application level improvements: + * add support of the StatusNotifierItem standard to display a status icon on KDE5 + * auto-answering can be set through the preferences panel + * bug fixes + + Liblinphone level improvements: * fix audio bug with opus codec * fix ICE corner case not properly handled and resulting bad final ice status * update SO version to 7 (it should have been done in 3.8.0) - * add support of the StatusNotifier standard to display a status icon on KDE5 + * bug fixes linphone-3.8.1 -- March 31th, 2015 Application level improvements: diff --git a/tester/register_tester.c b/tester/register_tester.c index 8c4aaa92a..ee945f0da 100644 --- a/tester/register_tester.c +++ b/tester/register_tester.c @@ -711,15 +711,14 @@ static void io_recv_error_without_active_register(){ LinphoneCore* lc; int register_ok; stats* counters ; - int number_of_udp_proxy=0; MSList* proxys; + int dummy=0; mgr=configure_lcm(); lc=mgr->lc; counters = get_stats(lc); register_ok=counters->number_of_LinphoneRegistrationOk; - number_of_udp_proxy=get_number_of_udp_proxy(lc); for (proxys=ms_list_copy(linphone_core_get_proxy_config_list(lc));proxys!=NULL;proxys=proxys->next) { LinphoneProxyConfig* proxy_cfg=(LinphoneProxyConfig*)proxys->data; @@ -734,7 +733,8 @@ static void io_recv_error_without_active_register(){ sal_set_recv_error(lc->sal, 0); /*nothing should happen because no active registration*/ - CU_ASSERT_FALSE(wait_for_until(lc,lc,&counters->number_of_LinphoneRegistrationProgress,2*(register_ok-number_of_udp_proxy) /*because 1 udp*/,3000)); + wait_for_until(lc,lc, &dummy, 1, 3000); + CU_ASSERT_TRUE(counters->number_of_LinphoneRegistrationProgress == ms_list_size(linphone_core_get_proxy_config_list(lc))); CU_ASSERT_EQUAL(counters->number_of_LinphoneRegistrationFailed,0) From 699f088acd045053995f39f414265f43b2c2336d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Grisez?= Date: Thu, 7 May 2015 16:44:24 +0200 Subject: [PATCH 125/157] Minor release v3.8.2 --- CMakeLists.txt | 2 +- NEWS | 2 +- configure.ac | 2 +- mediastreamer2 | 2 +- oRTP | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f4d818975..b6c1d4a04 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -26,7 +26,7 @@ project(LINPHONE C CXX) set(LINPHONE_MAJOR_VERSION "3") set(LINPHONE_MINOR_VERSION "8") -set(LINPHONE_MICRO_VERSION "1") +set(LINPHONE_MICRO_VERSION "2") set(LINPHONE_VERSION "${LINPHONE_MAJOR_VERSION}.${LINPHONE_MINOR_VERSION}.${LINPHONE_MICRO_VERSION}") set(LINPHONE_SO_VERSION "7") diff --git a/NEWS b/NEWS index 13bc4b2e6..624ad27cb 100644 --- a/NEWS +++ b/NEWS @@ -1,4 +1,4 @@ -linphone-3.8.2 -- Aril 30th, 2015 +linphone-3.8.2 -- May 7th, 2015 Application level improvements: * add support of the StatusNotifierItem standard to display a status icon on KDE5 * auto-answering can be set through the preferences panel diff --git a/configure.ac b/configure.ac index 30a136940..9800c19f4 100644 --- a/configure.ac +++ b/configure.ac @@ -1,6 +1,6 @@ dnl Process this file with autoconf to produce a configure script. -AC_INIT([linphone],[3.8.1],[linphone-developers@nongnu.org]) +AC_INIT([linphone],[3.8.2],[linphone-developers@nongnu.org]) AC_CANONICAL_SYSTEM AC_CONFIG_SRCDIR([coreapi/linphonecore.c]) diff --git a/mediastreamer2 b/mediastreamer2 index 82b3f80d3..9c57afef0 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 82b3f80d3171c1fbcda07d5199b3a74849ad9105 +Subproject commit 9c57afef0d3332715b701ec161b0598fe4246b53 diff --git a/oRTP b/oRTP index 01491a543..15476b915 160000 --- a/oRTP +++ b/oRTP @@ -1 +1 @@ -Subproject commit 01491a5437b5328349428aa18e38253f399addf2 +Subproject commit 15476b915d35e91f3bad92b5e7d1bc4073c50603 From a097d8d8e73d5f39bebb82cb13238e5dfd572d79 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Thu, 7 May 2015 22:44:57 +0200 Subject: [PATCH 126/157] update ms_audio_diff() calls in test suite to accelerate processing --- mediastreamer2 | 2 +- tester/call_tester.c | 4 ++-- tester/liblinphone_tester.h | 3 +++ 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/mediastreamer2 b/mediastreamer2 index 9c57afef0..df8fdb8f4 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 9c57afef0d3332715b701ec161b0598fe4246b53 +Subproject commit df8fdb8f4d4284b294fe5c0890ba89e2943050f5 diff --git a/tester/call_tester.c b/tester/call_tester.c index 6b9fd035b..8c8640ec3 100644 --- a/tester/call_tester.c +++ b/tester/call_tester.c @@ -2363,7 +2363,7 @@ static void call_with_file_player(void) { { double similar; const int threshold = 90; - BC_ASSERT_EQUAL_INT(ms_audio_diff(hellopath,recordpath,&similar,NULL,NULL), 0); + BC_ASSERT_EQUAL_INT(ms_audio_diff(hellopath,recordpath,&similar,audio_cmp_min_overlap,NULL,NULL), 0); BC_ASSERT_GREATER_INT(100*similar, threshold); BC_ASSERT_LOWER_INT(100*similar, 100); if (threshold < 100*similar && 100*similar < 100) { @@ -2441,7 +2441,7 @@ static void call_with_mkv_file_player(void) { CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallEnd,1)); CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallEnd,1)); #ifdef DO_AUDIO_CMP - CU_ASSERT_TRUE(ms_audio_diff(hellowav,recordpath,&similar,NULL,NULL)==0); + CU_ASSERT_TRUE(ms_audio_diff(hellowav,recordpath,&similar,audio_cmp_min_overlap,NULL,NULL)==0); CU_ASSERT_TRUE(similar>threshold); CU_ASSERT_TRUE(similar<=1.0); if(similar>threshold && similar<=1.0) { diff --git a/tester/liblinphone_tester.h b/tester/liblinphone_tester.h index 2069b1d04..2b7f9a26c 100644 --- a/tester/liblinphone_tester.h +++ b/tester/liblinphone_tester.h @@ -308,5 +308,8 @@ void call_base(LinphoneMediaEncryption mode, bool_t enable_video,bool_t enable_r bool_t call_with_caller_params(LinphoneCoreManager* caller_mgr,LinphoneCoreManager* callee_mgr, const LinphoneCallParams *params); bool_t pause_call_1(LinphoneCoreManager* mgr_1,LinphoneCall* call_1,LinphoneCoreManager* mgr_2,LinphoneCall* call_2); bool_t compare_files(const char *path1, const char *path2); + +static const int audio_cmp_min_overlap=90; + #endif /* LIBLINPHONE_TESTER_H_ */ From d6cdbe46c485417c4b7cff13b092289ae87f025f Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Mon, 11 May 2015 10:27:23 +0200 Subject: [PATCH 127/157] lpconfig.c: add lp_config_relative_file_exists and use it to avoid false-positive logs for .linphone.ecstate file --- coreapi/linphonecall.c | 5 +++-- coreapi/lpconfig.c | 20 +++++++++++++++++--- coreapi/lpconfig.h | 5 +++++ 3 files changed, 25 insertions(+), 5 deletions(-) diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c index 4f2a571a9..94655e19c 100644 --- a/coreapi/linphonecall.c +++ b/coreapi/linphonecall.c @@ -37,7 +37,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "mediastreamer2/mseventqueue.h" #include "mediastreamer2/mssndcard.h" -static const char EC_STATE_STORE[] = ".linphone.ecstate"; +static const char *EC_STATE_STORE = ".linphone.ecstate"; #define EC_STATE_MAX_LEN 1048576 // 1Mo static void linphone_call_stats_uninit(LinphoneCallStats *stats); @@ -1980,7 +1980,8 @@ void linphone_call_init_audio_stream(LinphoneCall *call){ audio_stream_set_echo_canceller_params(audiostream,len,delay,framesize); if (audiostream->ec) { char *statestr=ms_malloc0(EC_STATE_MAX_LEN); - if (lp_config_read_relative_file(lc->config, EC_STATE_STORE, statestr, EC_STATE_MAX_LEN) == 0) { + if (lp_config_relative_file_exists(lc->config, EC_STATE_STORE) + && lp_config_read_relative_file(lc->config, EC_STATE_STORE, statestr, EC_STATE_MAX_LEN) == 0) { ms_filter_call_method(audiostream->ec, MS_ECHO_CANCELLER_SET_STATE_STRING, statestr); } ms_free(statestr); diff --git a/coreapi/lpconfig.c b/coreapi/lpconfig.c index f6755863b..d45a199db 100644 --- a/coreapi/lpconfig.c +++ b/coreapi/lpconfig.c @@ -100,7 +100,7 @@ LpItem * lp_comment_new(const char *comment){ pos=strchr(item->value,'\r'); if (pos==NULL) pos=strchr(item->value,'\n'); - + if(pos) { *pos='\0'; /*replace the '\n' */ } @@ -362,7 +362,7 @@ LpConfig *lp_config_new_with_factory(const char *config_filename, const char *fa ms_message("Using (r/w) config information from %s", config_filename); lpconfig->filename=ortp_strdup(config_filename); lpconfig->tmpfilename=ortp_strdup_printf("%s.tmp",config_filename); - + #if !defined(WIN32) { struct stat fileStat; @@ -719,6 +719,20 @@ static char *_lp_config_dirname(char *path) { #endif } +bool_t lp_config_relative_file_exists(const LpConfig *lpconfig, const char *filename) { + if (lpconfig->filename == NULL) + return FALSE; + char *dir = _lp_config_dirname(lpconfig->filename); + char *filepath = ms_strdup_printf("%s/%s", dir, filename); + FILE *file = fopen(filepath, "r"); + ms_free(dir); + ms_free(filepath); + if (file) { + fclose(file); + } + return file != NULL; +} + void lp_config_write_relative_file(const LpConfig *lpconfig, const char *filename, const char *data) { if (lpconfig->filename == NULL) return; if(strlen(data) > 0) { @@ -760,7 +774,7 @@ int lp_config_read_relative_file(const LpConfig *lpconfig, const char *filename, ms_free(dir); ms_free(filepath); return 0; - + err: ms_free(dir); ms_free(filepath); diff --git a/coreapi/lpconfig.h b/coreapi/lpconfig.h index 65fd613f4..b03bfa57f 100644 --- a/coreapi/lpconfig.h +++ b/coreapi/lpconfig.h @@ -290,6 +290,11 @@ LINPHONE_PUBLIC void lp_config_write_relative_file(const LpConfig *lpconfig, con */ LINPHONE_PUBLIC int lp_config_read_relative_file(const LpConfig *lpconfig, const char *filename, char *data, size_t max_length); +/** + * @return TRUE if file exists relative to the to the current location +**/ +LINPHONE_PUBLIC bool_t lp_config_relative_file_exists(const LpConfig *lpconfig, const char *filename); + #ifdef __cplusplus } #endif From d5ca030abb3f2f053a1c6763d43bd0044ba19dcd Mon Sep 17 00:00:00 2001 From: Guillaume BIENKOWSKI Date: Mon, 11 May 2015 11:11:06 +0200 Subject: [PATCH 128/157] Update ms2 --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index df8fdb8f4..5b23e7669 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit df8fdb8f4d4284b294fe5c0890ba89e2943050f5 +Subproject commit 5b23e766981439ba00865d2f9df51c244a262864 From b0d930802ec17954e70710e1ae2092bd2c4e4c5c Mon Sep 17 00:00:00 2001 From: Guillaume BIENKOWSKI Date: Mon, 11 May 2015 11:28:10 +0200 Subject: [PATCH 129/157] Update ms2 --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index 5b23e7669..49940c15f 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 5b23e766981439ba00865d2f9df51c244a262864 +Subproject commit 49940c15fba7c56ad16af3e5ebc3cfb32e2692b8 From 6ac2b798b6a558a68acddeeb429fe88149b8c5a2 Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Mon, 11 May 2015 13:59:11 +0200 Subject: [PATCH 130/157] README.macos.md: update homebrew doc a bit --- README.macos.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.macos.md b/README.macos.md index 6f54e1444..89e3b3525 100644 --- a/README.macos.md +++ b/README.macos.md @@ -44,14 +44,14 @@ Install `GTK`. It is recommended to use the `quartz` backend for better integrat antlr3.2 gettext speex ffmpeg readline libvpx opus ln -s /usr/local/bin/glibtoolize /usr/local/bin/libtoolize brew link --force gettext + #readline is required from linphonec.c otherwise compilation will fail + brew link readline --force ##### Linphone UI (GTK version) - brew install cairo --without-x11 + brew install cairo --without-x11 brew install gtk+ --without-x11 - brew install gettext gtk-mac-integration libsoup hicolor-icon-theme - #readline is required from linphonec.c otherwise compilation will fail - brew link readline --force + brew install gtk-mac-integration libsoup hicolor-icon-theme ### Building Linphone From 4e974956cb4644282bb22584baa444f7af6030b7 Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Mon, 11 May 2015 16:59:50 +0200 Subject: [PATCH 131/157] lpconfig.c: fix ISO C90 error --- coreapi/lpconfig.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/coreapi/lpconfig.c b/coreapi/lpconfig.c index d45a199db..d1be24dc7 100644 --- a/coreapi/lpconfig.c +++ b/coreapi/lpconfig.c @@ -720,17 +720,19 @@ static char *_lp_config_dirname(char *path) { } bool_t lp_config_relative_file_exists(const LpConfig *lpconfig, const char *filename) { - if (lpconfig->filename == NULL) + if (lpconfig->filename == NULL) { return FALSE; - char *dir = _lp_config_dirname(lpconfig->filename); - char *filepath = ms_strdup_printf("%s/%s", dir, filename); - FILE *file = fopen(filepath, "r"); - ms_free(dir); - ms_free(filepath); - if (file) { - fclose(file); + } else { + char *dir = _lp_config_dirname(lpconfig->filename); + char *filepath = ms_strdup_printf("%s/%s", dir, filename); + FILE *file = fopen(filepath, "r"); + ms_free(dir); + ms_free(filepath); + if (file) { + fclose(file); + } + return file != NULL; } - return file != NULL; } void lp_config_write_relative_file(const LpConfig *lpconfig, const char *filename, const char *data) { From 55823335236d9a0fc2d17ffdb353afb626151b56 Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Tue, 12 May 2015 11:00:57 +0200 Subject: [PATCH 132/157] .gitignore: ignore build/macos/pkg-distribution.xml autogenerated file --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index cb5a36dea..dd920d531 100644 --- a/.gitignore +++ b/.gitignore @@ -84,3 +84,4 @@ po/linphone.pot tester/linphone_log.gz.txt tools/auto_answer tools/lp-autoanswer +build/macos/pkg-distribution.xml From f1b42dc2995fa4f934c4313e94aca0bc63d58c7a Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Tue, 12 May 2015 13:54:02 +0200 Subject: [PATCH 133/157] update ms2 --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index 49940c15f..80eeb75f1 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 49940c15fba7c56ad16af3e5ebc3cfb32e2692b8 +Subproject commit 80eeb75f12ecdcf20bc0e9c5fc90bf91842dcfe9 From a7bacc85d996cf9006729acf41aa7ae9b5237bbb Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Tue, 12 May 2015 14:47:55 +0200 Subject: [PATCH 134/157] bc_tester_utils.h: update macros --- mediastreamer2 | 2 +- tester/call_tester.c | 6 +++--- tester/common/bc_tester_utils.h | 31 +++++++++---------------------- 3 files changed, 13 insertions(+), 26 deletions(-) diff --git a/mediastreamer2 b/mediastreamer2 index 80eeb75f1..ceb0f52e8 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 80eeb75f12ecdcf20bc0e9c5fc90bf91842dcfe9 +Subproject commit ceb0f52e88084ceafbb43087c6742a04f4543f88 diff --git a/tester/call_tester.c b/tester/call_tester.c index 8c8640ec3..58b396704 100644 --- a/tester/call_tester.c +++ b/tester/call_tester.c @@ -2363,9 +2363,9 @@ static void call_with_file_player(void) { { double similar; const int threshold = 90; - BC_ASSERT_EQUAL_INT(ms_audio_diff(hellopath,recordpath,&similar,audio_cmp_min_overlap,NULL,NULL), 0); - BC_ASSERT_GREATER_INT(100*similar, threshold); - BC_ASSERT_LOWER_INT(100*similar, 100); + BC_ASSERT_EQUAL_WITH_TYPE(ms_audio_diff(hellopath,recordpath,&similar,audio_cmp_min_overlap,NULL,NULL), 0, int, "%d"); + BC_ASSERT_GREATER_WITH_TYPE(100*similar, threshold, int, "%d"); + BC_ASSERT_LOWER_WITH_TYPE(100*similar, 100, int, "%d"); if (threshold < 100*similar && 100*similar < 100) { remove(recordpath); } diff --git a/tester/common/bc_tester_utils.h b/tester/common/bc_tester_utils.h index 68f573bed..6bd17b03c 100644 --- a/tester/common/bc_tester_utils.h +++ b/tester/common/bc_tester_utils.h @@ -124,37 +124,24 @@ char * bc_tester_res(const char *name); #define BC_ASSERT_LOWER(actual, expected) CU_assertImplementation(((actual) <= (expected)), __LINE__, ("CU_ASSERT_LOWER(" #actual "," #expected ")"), __FILE__, "", CU_FALSE) /*Add some custom defines with logs in case of fail*/ -#define BC_ASSERT_EQUAL_INT(actual, expected) { \ - int cactual = (actual), cexpected = (expected); \ +#define BC_ASSERT_EQUAL_WITH_TYPE(actual, expected, type, type_format) { \ + type cactual = (actual), cexpected = (expected); \ if (! BC_ASSERT_EQUAL(cactual, cexpected)) { \ - bc_tester_printf(bc_printf_verbosity_error, "%s:%d - Expected " #actual " = " #expected " but was %d != %d\n", __FILE__, __LINE__, cactual, cexpected); \ + bc_tester_printf(bc_printf_verbosity_error, "%s:%d - Expected " #actual " = " #expected " but was " type_format " != " type_format "\n", __FILE__, __LINE__, cactual, cexpected); \ } \ } -#define BC_ASSERT_GREATER_INT(actual, expected) { \ - int cactual = (actual), cexpected = (expected); \ +#define BC_ASSERT_GREATER_WITH_TYPE(actual, expected, type, type_format) { \ + type cactual = (actual), cexpected = (expected); \ if (! BC_ASSERT_GREATER(cactual, cexpected)) { \ - bc_tester_printf(bc_printf_verbosity_error, "%s:%d - Expected " #actual " >= " #expected " but was %d < %d\n", __FILE__, __LINE__, cactual, cexpected); \ + bc_tester_printf(bc_printf_verbosity_error, "%s:%d - Expected " #actual " >= " #expected " but was " type_format " < " type_format "\n", __FILE__, __LINE__, cactual, cexpected); \ } \ } -#define BC_ASSERT_LOWER_INT(actual, expected) { \ - int cactual = (actual), cexpected = (expected); \ +#define BC_ASSERT_LOWER_WITH_TYPE(actual, expected, type, type_format) { \ + type cactual = (actual), cexpected = (expected); \ if (! BC_ASSERT_LOWER(cactual, cexpected)) { \ - bc_tester_printf(bc_printf_verbosity_error, "%s:%d - Expected " #actual " <= " #expected " but was %d > %d\n", __FILE__, __LINE__, cactual, cexpected); \ + bc_tester_printf(bc_printf_verbosity_error, "%s:%d - Expected " #actual " <= " #expected " but was " type_format " > " type_format "\n", __FILE__, __LINE__, cactual, cexpected); \ } \ } -#define BC_ASSERT_GREATER_UINT64_T(actual, expected) { \ - uint64_t cactual = (actual), cexpected = (expected); \ - if (! BC_ASSERT_GREATER(cactual, cexpected)) { \ - bc_tester_printf(bc_printf_verbosity_error, "%s:%d - Expected " #actual " >= " #expected " but was %lu < %lu\n", __FILE__, __LINE__, (long unsigned)cactual, (long unsigned)cexpected); \ - } \ -} -#define BC_ASSERT_LOWER_UINT64_T(actual, expected) { \ - uint64_t cactual = (actual), cexpected = (expected); \ - if (! BC_ASSERT_LOWER(cactual, cexpected)) { \ - bc_tester_printf(bc_printf_verbosity_error, "%s:%d - Expected " #actual " <= " #expected " but was %lu > %lu\n", __FILE__, __LINE__, (long unsigned)cactual, (long unsigned)cexpected); \ - } \ -} - #ifdef __cplusplus } From 1bdce811202bbf99cfd2505ae9bc5c7ddc2b4b43 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Tue, 12 May 2015 17:59:34 +0200 Subject: [PATCH 135/157] fix crash on windows (visual studio) --- gtk/calllogs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtk/calllogs.c b/gtk/calllogs.c index 7960708c7..51fcb260b 100644 --- a/gtk/calllogs.c +++ b/gtk/calllogs.c @@ -147,7 +147,7 @@ static GtkWidget *linphone_gtk_create_call_log_menu(GtkWidget *call_log){ name=linphone_address_as_string(la); call_label=g_strdup_printf(_("Call %s"),name); text_label=g_strdup_printf(_("Send text to %s"),name); - g_free(name); + ms_free(name); } } if (call_label){ From d285a55c598a50a635d22d7946a45fcbe0b00e36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Grisez?= Date: Tue, 12 May 2015 21:24:52 +0200 Subject: [PATCH 136/157] Fix bug on Windows. The status icon did not disappear after Linphone quit --- gtk/status_icon.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/gtk/status_icon.c b/gtk/status_icon.c index aba9c5d1d..ba16e28ea 100644 --- a/gtk/status_icon.c +++ b/gtk/status_icon.c @@ -304,9 +304,10 @@ static void _linphone_status_icon_impl_gtk_init(LinphoneStatusIcon *si) { si->data = icon; } -// static void _linphone_status_icon_impl_gtk_uninit(LinphoneStatusIcon *si) { -// g_object_unref((GtkStatusIcon *)si->data); -// } +static void _linphone_status_icon_impl_gtk_uninit(LinphoneStatusIcon *si) { + GtkStatusIcon *icon = GTK_STATUS_ICON(si->data); + gtk_status_icon_set_visible(icon, FALSE); +} static void _linphone_status_icon_impl_gtk_start(LinphoneStatusIcon *si) { GtkStatusIcon *icon = GTK_STATUS_ICON(si->data); @@ -358,7 +359,7 @@ static gboolean _linphone_status_icon_impl_is_supported( static const _LinphoneStatusIconDesc _linphone_status_icon_impl_gtk_desc = { "gtk_status_icon", _linphone_status_icon_impl_gtk_init, - NULL, + _linphone_status_icon_impl_gtk_uninit, _linphone_status_icon_impl_gtk_start, _linphone_status_icon_impl_enable_blinking, _linphone_status_icon_impl_is_supported From 1f02b4eaaed1f314c2a054931694d90b22bdd944 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Tue, 12 May 2015 17:59:34 +0200 Subject: [PATCH 137/157] fix crash on windows (visual studio) --- gtk/calllogs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtk/calllogs.c b/gtk/calllogs.c index 7960708c7..51fcb260b 100644 --- a/gtk/calllogs.c +++ b/gtk/calllogs.c @@ -147,7 +147,7 @@ static GtkWidget *linphone_gtk_create_call_log_menu(GtkWidget *call_log){ name=linphone_address_as_string(la); call_label=g_strdup_printf(_("Call %s"),name); text_label=g_strdup_printf(_("Send text to %s"),name); - g_free(name); + ms_free(name); } } if (call_label){ From fe3799cb1b14215ea2cbd82a3a11bb5e3d043d1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Grisez?= Date: Tue, 12 May 2015 21:24:52 +0200 Subject: [PATCH 138/157] Fix bug on Windows. The status icon did not disappear after Linphone quit --- gtk/status_icon.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/gtk/status_icon.c b/gtk/status_icon.c index aba9c5d1d..ba16e28ea 100644 --- a/gtk/status_icon.c +++ b/gtk/status_icon.c @@ -304,9 +304,10 @@ static void _linphone_status_icon_impl_gtk_init(LinphoneStatusIcon *si) { si->data = icon; } -// static void _linphone_status_icon_impl_gtk_uninit(LinphoneStatusIcon *si) { -// g_object_unref((GtkStatusIcon *)si->data); -// } +static void _linphone_status_icon_impl_gtk_uninit(LinphoneStatusIcon *si) { + GtkStatusIcon *icon = GTK_STATUS_ICON(si->data); + gtk_status_icon_set_visible(icon, FALSE); +} static void _linphone_status_icon_impl_gtk_start(LinphoneStatusIcon *si) { GtkStatusIcon *icon = GTK_STATUS_ICON(si->data); @@ -358,7 +359,7 @@ static gboolean _linphone_status_icon_impl_is_supported( static const _LinphoneStatusIconDesc _linphone_status_icon_impl_gtk_desc = { "gtk_status_icon", _linphone_status_icon_impl_gtk_init, - NULL, + _linphone_status_icon_impl_gtk_uninit, _linphone_status_icon_impl_gtk_start, _linphone_status_icon_impl_enable_blinking, _linphone_status_icon_impl_is_supported From 258366937ab66d1647bf79a5dae6a76d7ff5dd19 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Wed, 13 May 2015 09:13:43 +0200 Subject: [PATCH 139/157] implement re-invite from multicast to unicast call. --- coreapi/call_params.c | 15 +++ coreapi/call_params.h | 36 +++++ coreapi/callbacks.c | 12 +- coreapi/linphonecall.c | 126 +++++++++++++----- coreapi/linphonecore.c | 12 ++ coreapi/linphonecore_jni.cc | 13 ++ coreapi/private.h | 6 +- coreapi/sal.c | 4 + include/sal/sal.h | 21 +-- .../org/linphone/core/LinphoneCallParams.java | 27 ++++ .../linphone/core/LinphoneCallParamsImpl.java | 21 +++ tester/call_tester.c | 2 +- tester/liblinphone_tester.h | 1 + tester/multicast_call_tester.c | 46 ++++++- 14 files changed, 295 insertions(+), 47 deletions(-) diff --git a/coreapi/call_params.c b/coreapi/call_params.c index 8acc33b19..828fba70c 100644 --- a/coreapi/call_params.c +++ b/coreapi/call_params.c @@ -235,6 +235,21 @@ void linphone_call_params_unref(LinphoneCallParams *cp) { belle_sip_object_unref(cp); } +void linphone_call_params_enable_audio_multicast(LinphoneCallParams *params, bool_t yesno) { + params->audio_multicast_enabled=yesno; +} + +bool_t linphone_call_params_audio_multicast_enabled(const LinphoneCallParams *params) { + return params->audio_multicast_enabled; +} + +void linphone_call_params_enable_video_multicast(LinphoneCallParams *params, bool_t yesno) { + params->video_multicast_enabled=yesno; +} +bool_t linphone_call_params_video_multicast_enabled(const LinphoneCallParams *params) { + return params->video_multicast_enabled; +} + /******************************************************************************* * Constructor and destructor functions * ******************************************************************************/ diff --git a/coreapi/call_params.h b/coreapi/call_params.h index beecc9791..8f9182af1 100644 --- a/coreapi/call_params.h +++ b/coreapi/call_params.h @@ -322,6 +322,42 @@ LINPHONE_PUBLIC LinphoneCallParams * linphone_call_params_ref(LinphoneCallParams LINPHONE_PUBLIC void linphone_call_params_unref(LinphoneCallParams *cp); +/** + * Use to enable multicast rtp for audio stream. + * * If enabled, outgoing calls put a multicast address from #linphone_core_get_video_multicast_addr into audio cline. In case of outgoing call audio stream is sent to this multicast address. + *
For incoming calls behavior is unchanged. + * @param core #LinphoneCallParams + * @param yesno if yes, subsequent calls will propose multicast ip set by #linphone_core_set_audio_multicast_addr + * @ingroup media_parameters +**/ +LINPHONE_PUBLIC void linphone_call_params_enable_audio_multicast(LinphoneCallParams *param, bool_t yesno); + +/** + * Use to get multicast state of audio stream. + * @param core #LinphoneCallParams + * @return true if subsequent calls will propose multicast ip set by #linphone_core_set_audio_multicast_addr + * @ingroup media_parameters +**/ +LINPHONE_PUBLIC bool_t linphone_call_params_audio_multicast_enabled(const LinphoneCallParams *param); + +/** + * Use to enable multicast rtp for video stream. + * If enabled, outgoing calls put a multicast address from #linphone_core_get_video_multicast_addr into video cline. In case of outgoing call video stream is sent to this multicast address. + *
For incoming calls behavior is unchanged. + * @param core #LinphoneCallParams + * @param yesno if yes, subsequent outgoing calls will propose multicast ip set by #linphone_core_set_video_multicast_addr + * @ingroup media_parameters +**/ +LINPHONE_PUBLIC void linphone_call_params_enable_video_multicast(LinphoneCallParams *param, bool_t yesno); +/** + * Use to get multicast state of video stream. + * @param core #LinphoneCallParams + * @return true if subsequent calls will propose multicast ip set by #linphone_core_set_video_multicast_addr + * @ingroup media_parameters +**/ +LINPHONE_PUBLIC bool_t linphone_call_params_video_multicast_enabled(const LinphoneCallParams *param); + + /******************************************************************************* * DEPRECATED * ******************************************************************************/ diff --git a/coreapi/callbacks.c b/coreapi/callbacks.c index 0143be751..b945be221 100644 --- a/coreapi/callbacks.c +++ b/coreapi/callbacks.c @@ -144,10 +144,13 @@ void linphone_core_update_streams(LinphoneCore *lc, LinphoneCall *call, SalMedia call->resultdesc=new_md; if ((call->audiostream && call->audiostream->ms.state==MSStreamStarted) || (call->videostream && call->videostream->ms.state==MSStreamStarted)){ clear_early_media_destinations(call); + int md_changed=0; /* we already started media: check if we really need to restart it*/ if (oldmd){ - int md_changed = media_parameters_changed(call, oldmd, new_md); - if ((md_changed & (SAL_MEDIA_DESCRIPTION_CODEC_CHANGED|SAL_MEDIA_DESCRIPTION_STREAMS_CHANGED))){ + md_changed = media_parameters_changed(call, oldmd, new_md); + if ((md_changed & ( SAL_MEDIA_DESCRIPTION_CODEC_CHANGED + |SAL_MEDIA_DESCRIPTION_STREAMS_CHANGED + |SAL_MEDIA_DESCRIPTION_NETWORK_XXXCAST_CHANGED))){ ms_message("Media descriptions are different, need to restart the streams."); } else if ( call->playing_ringbacktone) { ms_message("Playing ringback tone, will restart the streams."); @@ -181,6 +184,11 @@ void linphone_core_update_streams(LinphoneCore *lc, LinphoneCall *call, SalMedia } } linphone_call_stop_media_streams (call); + if (md_changed & SAL_MEDIA_DESCRIPTION_NETWORK_XXXCAST_CHANGED){ + ms_message("Media ip type has changed, destroying sessions context on call [%p]",call); + ms_media_stream_sessions_uninit(&call->sessions[0]); + ms_media_stream_sessions_uninit(&call->sessions[1]); + } linphone_call_init_media_streams (call); } diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c index 94655e19c..4969da7ba 100644 --- a/coreapi/linphonecall.c +++ b/coreapi/linphonecall.c @@ -591,12 +591,12 @@ void linphone_call_make_local_media_description_with_params(LinphoneCore *lc, Li CodecConstraints codec_hints={0}; /*multicast is only set in case of outgoing call*/ - if (call->dir == LinphoneCallOutgoing && linphone_core_audio_multicast_enabled(lc)) { + if (call->dir == LinphoneCallOutgoing && linphone_call_params_audio_multicast_enabled(params)) { md->streams[0].ttl=linphone_core_get_audio_multicast_ttl(lc); md->streams[0].multicast_role = SalMulticastSender; } - if (call->dir == LinphoneCallOutgoing && linphone_core_video_multicast_enabled(lc)) { + if (call->dir == LinphoneCallOutgoing && linphone_call_params_video_multicast_enabled(params)) { md->streams[1].ttl=linphone_core_get_video_multicast_ttl(lc); md->streams[1].multicast_role = SalMulticastSender; } @@ -814,17 +814,6 @@ static void linphone_call_init_common(LinphoneCall *call, LinphoneAddress *from, linphone_core_get_video_port_range(call->core, &min_port, &max_port); port_config_set(call,1,min_port,max_port); - if (call->dir==LinphoneCallOutgoing){ - if ( linphone_core_audio_multicast_enabled(call->core)){ - strncpy(call->media_ports[0].multicast_ip, - linphone_core_get_audio_multicast_addr(call->core), sizeof(call->media_ports[0].multicast_ip)); - } - if ( linphone_core_video_multicast_enabled(call->core)){ - strncpy(call->media_ports[1].multicast_ip, - linphone_core_get_video_multicast_addr(call->core), sizeof(call->media_ports[1].multicast_ip)); - } - } - linphone_call_init_stats(&call->stats[LINPHONE_CALL_STATS_AUDIO], LINPHONE_CALL_STATS_AUDIO); linphone_call_init_stats(&call->stats[LINPHONE_CALL_STATS_VIDEO], LINPHONE_CALL_STATS_VIDEO); #ifdef VIDEO_ENABLED @@ -944,7 +933,19 @@ BELLE_SIP_INSTANCIATE_VPTR(LinphoneCall, belle_sip_object_t, NULL, // marshal FALSE ); +void linphone_call_fill_media_multicast_addr(LinphoneCall *call) { + if (linphone_call_params_audio_multicast_enabled(call->params)){ + strncpy(call->media_ports[0].multicast_ip, + linphone_core_get_audio_multicast_addr(call->core), sizeof(call->media_ports[0].multicast_ip)); + } else + call->media_ports[0].multicast_ip[0]='\0'; + if (linphone_call_params_video_multicast_enabled(call->params)){ + strncpy(call->media_ports[1].multicast_ip, + linphone_core_get_video_multicast_addr(call->core), sizeof(call->media_ports[1].multicast_ip)); + } else + call->media_ports[1].multicast_ip[0]='\0'; +} LinphoneCall * linphone_call_new_outgoing(struct _LinphoneCore *lc, LinphoneAddress *from, LinphoneAddress *to, const LinphoneCallParams *params, LinphoneProxyConfig *cfg){ LinphoneCall *call = belle_sip_object_new(LinphoneCall); @@ -955,6 +956,8 @@ LinphoneCall * linphone_call_new_outgoing(struct _LinphoneCore *lc, LinphoneAddr linphone_call_init_common(call,from,to); call->params = linphone_call_params_copy(params); + linphone_call_fill_media_multicast_addr(call); + if (linphone_core_get_firewall_policy(call->core) == LinphonePolicyUseIce) { call->ice_session = ice_session_new(); /*for backward compatibility purposes, shall be enabled by default in futur*/ @@ -1010,26 +1013,18 @@ void linphone_call_set_compatible_incoming_call_parameters(LinphoneCall *call, c call->params->media_encryption = LinphoneMediaEncryptionNone; } - /* set both local audio & video multicast ip address if any*/ - for (i=0;i<2;++i){ - if (md->streams[i].rtp_addr[i]!='\0' && ms_is_multicast(md->streams[i].rtp_addr)) { - strncpy(call->media_ports[i].multicast_ip,md->streams[i].rtp_addr,sizeof(call->media_ports[i].multicast_ip)); - ms_message("Disabling rtcp on call [%p], stream [%i] because of multicast",call,i); - call->media_ports[i].mcast_rtp_port=md->streams[i].rtp_port; - call->media_ports[i].mcast_rtcp_port=0; - } - } } LinphoneCall * linphone_call_new_incoming(LinphoneCore *lc, LinphoneAddress *from, LinphoneAddress *to, SalOp *op){ LinphoneCall *call = belle_sip_object_new(LinphoneCall); - const SalMediaDescription *md; + SalMediaDescription *md; LinphoneFirewallPolicy fpol; call->dir=LinphoneCallIncoming; sal_op_set_user_pointer(op,call); call->op=op; call->core=lc; + int i; linphone_call_incoming_select_ip_version(call); sal_op_cnx_ip_to_0000_if_sendonly_enable(op,lp_config_get_default_int(lc->config,"sip","cnx_ip_to_0000_if_sendonly_enabled",0)); @@ -1075,7 +1070,14 @@ LinphoneCall * linphone_call_new_incoming(LinphoneCore *lc, LinphoneAddress *fro // It is licit to receive an INVITE without SDP // In this case WE chose the media parameters according to policy. linphone_call_set_compatible_incoming_call_parameters(call, md); + /* set multicast role & address if any*/ + for (i=0;inb_streams;i++){ + if (!sal_call_is_offerer(op) && ms_is_multicast(md->streams[i].rtp_addr)) + md->streams[i].multicast_role = SalMulticastReceiver; + strncpy(call->media_ports[i].multicast_ip,md->streams[i].rtp_addr,sizeof(call->media_ports[i].multicast_ip)); + } } + fpol=linphone_core_get_firewall_policy(call->core); /*create the ice session now if ICE is required*/ if (fpol==LinphonePolicyUseIce){ @@ -1478,10 +1480,23 @@ const LinphoneCallParams * linphone_call_get_current_params(LinphoneCall *call){ call->current_params->avpf_rr_interval = 0; } if (md){ + const char *rtp_addr; + SalStreamDescription *sd=sal_media_description_find_best_stream(md,SalAudio); call->current_params->audio_dir=sd ? media_direction_from_sal_stream_dir(sd->dir) : LinphoneMediaDirectionInactive; + if (call->current_params->audio_dir != LinphoneMediaDirectionInactive) { + rtp_addr = sd->rtp_addr[0]!='\0' ? sd->rtp_addr : call->resultdesc->addr; + call->current_params->audio_multicast_enabled = ms_is_multicast(rtp_addr); + } else + call->current_params->audio_multicast_enabled = FALSE; + sd=sal_media_description_find_best_stream(md,SalVideo); call->current_params->video_dir=sd ? media_direction_from_sal_stream_dir(sd->dir) : LinphoneMediaDirectionInactive; + if (call->current_params->video_dir != LinphoneMediaDirectionInactive) { + rtp_addr = sd->rtp_addr[0]!='\0' ? sd->rtp_addr : call->resultdesc->addr; + call->current_params->video_multicast_enabled = ms_is_multicast(rtp_addr); + } else + call->current_params->video_multicast_enabled = FALSE; } return call->current_params; @@ -1900,9 +1915,38 @@ int linphone_call_prepare_ice(LinphoneCall *call, bool_t incoming_offer){ /*eventually join to a multicast group if told to do so*/ static void linphone_call_join_multicast_group(LinphoneCall *call, int stream_index, MediaStream *ms){ - if (call->media_ports[stream_index].multicast_ip[stream_index]!='\0' && call->media_ports[stream_index].mcast_rtp_port!=0){ + if (call->media_ports[stream_index].multicast_ip[stream_index]!='\0'){ media_stream_join_multicast_group(ms, call->media_ports[stream_index].multicast_ip); - } + } else + ms_error("Cannot join multicast group if multicast ip is not set for call [%p]",call); +} + +static SalMulticastRole linphone_call_get_multicast_role(const LinphoneCall *call,SalStreamType type) { + SalMulticastRole multicast_role=SalMulticastInactive; + SalMediaDescription *remotedesc, *localdesc; + SalStreamDescription *stream_desc = NULL; + if (!call->op) goto end; + remotedesc = sal_call_get_remote_media_description(call->op); + localdesc = call->localdesc; + if (!localdesc && !remotedesc && call->dir == LinphoneCallOutgoing) { + /*well using call dir*/ + if ((type == SalAudio && linphone_call_params_audio_multicast_enabled(call->params)) + || (type == SalVideo && linphone_call_params_video_multicast_enabled(call->params))) + multicast_role=SalMulticastSender; + } else if (localdesc && (!remotedesc || sal_call_is_offerer(call->op))) { + stream_desc = sal_media_description_find_best_stream(localdesc, type); + } else if (!sal_call_is_offerer(call->op) && remotedesc) + stream_desc = sal_media_description_find_best_stream(remotedesc, type); + + if (stream_desc) + multicast_role=stream_desc->multicast_role; + else + ms_message("Cannot determine multicast role for stream type [%s] on call [%p]",sal_stream_type_to_string(type),call); + + + end: + return multicast_role; + } void linphone_call_init_audio_stream(LinphoneCall *call){ @@ -1913,14 +1957,23 @@ void linphone_call_init_audio_stream(LinphoneCall *call){ char rtcp_tool[128]={0}; char* cname; + snprintf(rtcp_tool,sizeof(rtcp_tool)-1,"%s-%s",linphone_core_get_user_agent_name(),linphone_core_get_user_agent_version()); if (call->audiostream != NULL) return; if (call->sessions[0].rtp_session==NULL){ + SalMulticastRole multicast_role = linphone_call_get_multicast_role(call,SalAudio); + SalMediaDescription *remotedesc=NULL; + SalStreamDescription *stream_desc = NULL; + if (call->op) remotedesc = sal_call_get_remote_media_description(call->op); + if (remotedesc) + stream_desc = sal_media_description_find_best_stream(remotedesc, SalAudio); + call->audiostream=audiostream=audio_stream_new2(linphone_call_get_bind_ip_for_stream(call,0), - call->media_ports[0].mcast_rtp_port ? call->media_ports[0].mcast_rtp_port : call->media_ports[0].rtp_port, - call->media_ports[0].mcast_rtcp_port ? call->media_ports[0].mcast_rtcp_port : call->media_ports[0].rtcp_port); - linphone_call_join_multicast_group(call, 0, &audiostream->ms); + multicast_role == SalMulticastReceiver ? stream_desc->rtp_port : call->media_ports[0].rtp_port, + multicast_role == SalMulticastReceiver ? 0 /*disabled for now*/ : call->media_ports[0].rtcp_port); + if (multicast_role == SalMulticastReceiver) + linphone_call_join_multicast_group(call, 0, &audiostream->ms); rtp_session_enable_network_simulation(call->audiostream->ms.sessions.rtp_session, &lc->net_conf.netsim_params); cname = linphone_address_as_string_uri_only(call->me); audio_stream_set_rtcp_information(call->audiostream, cname, rtcp_tool); @@ -2014,11 +2067,14 @@ void linphone_call_init_audio_stream(LinphoneCall *call){ _linphone_call_prepare_ice_for_stream(call,0,FALSE); } + void linphone_call_init_video_stream(LinphoneCall *call){ #ifdef VIDEO_ENABLED LinphoneCore *lc=call->core; char* cname; char rtcp_tool[128]; + + snprintf(rtcp_tool,sizeof(rtcp_tool)-1,"%s-%s",linphone_core_get_user_agent_name(),linphone_core_get_user_agent_version()); if (call->videostream == NULL){ @@ -2027,10 +2083,18 @@ void linphone_call_init_video_stream(LinphoneCall *call){ const char *display_filter=linphone_core_get_video_display_filter(lc); if (call->sessions[1].rtp_session==NULL){ + SalMulticastRole multicast_role = linphone_call_get_multicast_role(call,SalVideo); + SalMediaDescription *remotedesc=NULL; + SalStreamDescription *stream_desc = NULL; + if (call->op) remotedesc = sal_call_get_remote_media_description(call->op); + if (remotedesc) + stream_desc = sal_media_description_find_best_stream(remotedesc, SalVideo); + call->videostream=video_stream_new2(linphone_call_get_bind_ip_for_stream(call,1), - call->media_ports[1].mcast_rtp_port>0 ? call->media_ports[1].mcast_rtp_port : call->media_ports[1].rtp_port, - call->media_ports[1].mcast_rtcp_port>0 ? call->media_ports[1].mcast_rtcp_port : call->media_ports[1].rtcp_port); - linphone_call_join_multicast_group(call, 1, &call->videostream->ms); + multicast_role == SalMulticastReceiver ? stream_desc->rtp_port : call->media_ports[1].rtp_port, + multicast_role == SalMulticastReceiver ? 0 /*disabled for now*/ : call->media_ports[1].rtcp_port); + if (multicast_role == SalMulticastReceiver) + linphone_call_join_multicast_group(call, 1, &call->videostream->ms); rtp_session_enable_network_simulation(call->videostream->ms.sessions.rtp_session, &lc->net_conf.netsim_params); cname = linphone_address_as_string_uri_only(call->me); video_stream_set_rtcp_information(call->videostream, cname, rtcp_tool); diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index 2d3efb6f0..c58b3a281 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -3436,6 +3436,8 @@ int linphone_core_start_update_call(LinphoneCore *lc, LinphoneCall *call){ int err; bool_t no_user_consent=call->params->no_user_consent; + linphone_call_fill_media_multicast_addr(call); + if (!no_user_consent) linphone_call_make_local_media_description(lc,call); #ifdef BUILD_UPNP if(call->upnp_session != NULL) { @@ -3651,6 +3653,11 @@ int _linphone_core_accept_call_update(LinphoneCore *lc, LinphoneCall *call, cons } if (params==NULL){ linphone_call_params_enable_video(call->params, lc->video_policy.automatically_accept || call->current_params->has_video); + if (!sal_call_is_offerer(call->op)) { + /*reset call param for multicast because this param is only relevant when offering*/ + linphone_call_params_enable_audio_multicast(call->params,FALSE); + linphone_call_params_enable_video_multicast(call->params,FALSE); + } }else linphone_call_set_new_params(call,params); @@ -3662,6 +3669,9 @@ int _linphone_core_accept_call_update(LinphoneCore *lc, LinphoneCall *call, cons ms_warning("Video isn't supported in conference"); call->params->has_video = FALSE; } + /*update multicast params according to call params*/ + linphone_call_fill_media_multicast_addr(call); + linphone_call_init_media_streams(call); /*so that video stream is initialized if necessary*/ if (call->ice_session != NULL) { if (linphone_call_prepare_ice(call,TRUE)==1) @@ -7053,6 +7063,8 @@ void linphone_core_init_default_params(LinphoneCore*lc, LinphoneCallParams *para params->audio_dir=LinphoneMediaDirectionSendRecv; params->video_dir=LinphoneMediaDirectionSendRecv; params->real_early_media=lp_config_get_int(lc->config,"misc","real_early_media",FALSE); + params->audio_multicast_enabled=linphone_core_audio_multicast_enabled(lc); + params->video_multicast_enabled=linphone_core_video_multicast_enabled(lc); } void linphone_core_set_device_identifier(LinphoneCore *lc,const char* device_id) { diff --git a/coreapi/linphonecore_jni.cc b/coreapi/linphonecore_jni.cc index a61091a68..968d897be 100644 --- a/coreapi/linphonecore_jni.cc +++ b/coreapi/linphonecore_jni.cc @@ -3631,6 +3631,19 @@ extern "C" jboolean Java_org_linphone_core_LinphoneCallParamsImpl_getVideoEnable return (jboolean)linphone_call_params_video_enabled((LinphoneCallParams*)lcp); } +extern "C" void Java_org_linphone_core_LinphoneCallParamsImpl_enableVideoMulticast(JNIEnv *env, jobject thiz, jlong lcp, jboolean b){ + linphone_call_params_enable_video_multicast((LinphoneCallParams*)lcp, b); +} +extern "C" jboolean Java_org_linphone_core_LinphoneCallParamsImpl_videoMulticastEnabled(JNIEnv *env, jobject thiz, jlong lcp){ + return (jboolean)linphone_call_params_video_multicast_enabled((LinphoneCallParams*)lcp); +} +extern "C" void Java_org_linphone_core_LinphoneCallParamsImpl_enableAudioMulticast(JNIEnv *env, jobject thiz, jlong lcp, jboolean b){ + linphone_call_params_enable_audio_multicast((LinphoneCallParams*)lcp, b); +} +extern "C" jboolean Java_org_linphone_core_LinphoneCallParamsImpl_audioMulticastEnabled(JNIEnv *env, jobject thiz, jlong lcp){ + return (jboolean)linphone_call_params_audio_multicast_enabled((LinphoneCallParams*)lcp); +} + extern "C" jboolean Java_org_linphone_core_LinphoneCallParamsImpl_localConferenceMode(JNIEnv *env, jobject thiz, jlong lcp){ return (jboolean)linphone_call_params_get_local_conference_mode((LinphoneCallParams*)lcp); } diff --git a/coreapi/private.h b/coreapi/private.h index 9ef265d26..8faa8ad35 100644 --- a/coreapi/private.h +++ b/coreapi/private.h @@ -112,7 +112,8 @@ struct _LinphoneCallParams{ LinphoneMediaDirection video_dir; bool_t video_declined; /*use to keep traces of declined video to avoid to re-offer video in case of automatic RE-INVITE*/ bool_t internal_call_update; /*use mark that call update was requested internally (might be by ice)*/ - + bool_t video_multicast_enabled; + bool_t audio_multicast_enabled; }; BELLE_SIP_DECLARE_VPTR(LinphoneCallParams); @@ -205,8 +206,6 @@ typedef struct StunCandidate{ typedef struct _PortConfig{ char multicast_ip[LINPHONE_IPADDR_SIZE]; - int mcast_rtp_port; - int mcast_rtcp_port; int rtp_port; int rtcp_port; }PortConfig; @@ -859,6 +858,7 @@ void linphone_core_set_state(LinphoneCore *lc, LinphoneGlobalState gstate, const void linphone_call_make_local_media_description(LinphoneCore *lc, LinphoneCall *call); void linphone_call_make_local_media_description_with_params(LinphoneCore *lc, LinphoneCall *call, LinphoneCallParams *params); void linphone_call_increment_local_media_description(LinphoneCall *call); +void linphone_call_fill_media_multicast_addr(LinphoneCall *call); void linphone_core_update_streams(LinphoneCore *lc, LinphoneCall *call, SalMediaDescription *new_md); bool_t linphone_core_is_payload_type_usable_for_bandwidth(LinphoneCore *lc, const PayloadType *pt, int bandwidth_limit); diff --git a/coreapi/sal.c b/coreapi/sal.c index a5a0755d1..2d6ed1dde 100644 --- a/coreapi/sal.c +++ b/coreapi/sal.c @@ -307,6 +307,8 @@ int sal_stream_description_equals(const SalStreamDescription *sd1, const SalStre if (sd1->type != sd2->type) result |= SAL_MEDIA_DESCRIPTION_CODEC_CHANGED; if (strcmp(sd1->rtp_addr, sd2->rtp_addr) != 0) result |= SAL_MEDIA_DESCRIPTION_NETWORK_CHANGED; + if (sd1->rtp_addr[0]!='\0' && sd2->rtp_addr[0]!='\0' && ms_is_multicast(sd1->rtp_addr) != ms_is_multicast(sd2->rtp_addr)) + result |= SAL_MEDIA_DESCRIPTION_NETWORK_XXXCAST_CHANGED; if (sd1->rtp_port != sd2->rtp_port) { if ((sd1->rtp_port == 0) || (sd2->rtp_port == 0)) result |= SAL_MEDIA_DESCRIPTION_CODEC_CHANGED; else result |= SAL_MEDIA_DESCRIPTION_NETWORK_CHANGED; @@ -330,6 +332,8 @@ int sal_media_description_equals(const SalMediaDescription *md1, const SalMediaD int i; if (strcmp(md1->addr, md2->addr) != 0) result |= SAL_MEDIA_DESCRIPTION_NETWORK_CHANGED; + if (md1->addr[0]!='\0' && md2->addr[0]!='\0' && ms_is_multicast(md1->addr) != ms_is_multicast(md2->addr)) + result |= SAL_MEDIA_DESCRIPTION_NETWORK_XXXCAST_CHANGED; if (md1->nb_streams != md2->nb_streams) result |= SAL_MEDIA_DESCRIPTION_STREAMS_CHANGED; if (md1->bandwidth != md2->bandwidth) result |= SAL_MEDIA_DESCRIPTION_CODEC_CHANGED; for(i = 0; i < md1->nb_streams; ++i){ diff --git a/include/sal/sal.h b/include/sal/sal.h index 26d8e5bb9..ac0aed989 100644 --- a/include/sal/sal.h +++ b/include/sal/sal.h @@ -68,15 +68,20 @@ typedef enum { SalTransportDTLS, /*DTLS*/ }SalTransport; -#define SAL_MEDIA_DESCRIPTION_UNCHANGED 0x00 -#define SAL_MEDIA_DESCRIPTION_NETWORK_CHANGED (1) -#define SAL_MEDIA_DESCRIPTION_CODEC_CHANGED (1<<1) -#define SAL_MEDIA_DESCRIPTION_CRYPTO_KEYS_CHANGED (1<<2) -#define SAL_MEDIA_DESCRIPTION_CRYPTO_POLICY_CHANGED (1<<3) -#define SAL_MEDIA_DESCRIPTION_STREAMS_CHANGED (1<<4) +#define SAL_MEDIA_DESCRIPTION_UNCHANGED 0x00 +#define SAL_MEDIA_DESCRIPTION_NETWORK_CHANGED (1) +#define SAL_MEDIA_DESCRIPTION_CODEC_CHANGED (1<<1) +#define SAL_MEDIA_DESCRIPTION_CRYPTO_KEYS_CHANGED (1<<2) +#define SAL_MEDIA_DESCRIPTION_CRYPTO_POLICY_CHANGED (1<<3) +#define SAL_MEDIA_DESCRIPTION_STREAMS_CHANGED (1<<4) +#define SAL_MEDIA_DESCRIPTION_NETWORK_XXXCAST_CHANGED (1<<5) /* use to notify when switching from multicast to unicast*/ -#define SAL_MEDIA_DESCRIPTION_CHANGED (SAL_MEDIA_DESCRIPTION_NETWORK_CHANGED | SAL_MEDIA_DESCRIPTION_CODEC_CHANGED |\ - SAL_MEDIA_DESCRIPTION_CRYPTO_KEYS_CHANGED |SAL_MEDIA_DESCRIPTION_CRYPTO_POLICY_CHANGED | SAL_MEDIA_DESCRIPTION_STREAMS_CHANGED) +#define SAL_MEDIA_DESCRIPTION_CHANGED (SAL_MEDIA_DESCRIPTION_NETWORK_CHANGED \ + |SAL_MEDIA_DESCRIPTION_CODEC_CHANGED \ + |SAL_MEDIA_DESCRIPTION_CRYPTO_KEYS_CHANGED \ + |SAL_MEDIA_DESCRIPTION_CRYPTO_POLICY_CHANGED \ + |SAL_MEDIA_DESCRIPTION_STREAMS_CHANGED \ + |SAL_MEDIA_DESCRIPTION_NETWORK_XXXCAST_CHANGED) const char* sal_transport_to_string(SalTransport transport); SalTransport sal_transport_parse(const char*); diff --git a/java/common/org/linphone/core/LinphoneCallParams.java b/java/common/org/linphone/core/LinphoneCallParams.java index 7086a56fb..fa827faa2 100644 --- a/java/common/org/linphone/core/LinphoneCallParams.java +++ b/java/common/org/linphone/core/LinphoneCallParams.java @@ -131,4 +131,31 @@ public interface LinphoneCallParams { * @return The received video size. */ VideoSize getReceivedVideoSize(); + /** + * Use to enable multicast rtp for audio stream. + * * If enabled, outgoing calls put a multicast address from #linphone_core_get_video_multicast_addr into audio cline. In case of outgoing call audio stream is sent to this multicast address. + *
For incoming calls behavior is unchanged. + * @param yesno if yes, subsequent calls will propose multicast ip set by LinphoneCore.setAudioMulticastAddr + **/ + void enableAudioMulticast(boolean yesno); + + /** + * Use to get multicast state of audio stream. + * @return true if subsequent calls will propose multicast ip set by LinphoneCore.setAudioMulticastAddr + **/ + boolean audioMulticastEnabled(); + + /** + * Use to enable multicast rtp for video stream. + * If enabled, outgoing calls put a multicast address from #linphone_core_get_video_multicast_addr into video cline. In case of outgoing call video stream is sent to this multicast address. + *
For incoming calls behavior is unchanged. + * @param yesno if yes, subsequent outgoing calls will propose multicast ip set by LinphoneCore.setVideoMulticastAddr + **/ + void enableVideoMulticast(boolean yesno); + /** + * Use to get multicast state of video stream. + * @return true if subsequent calls will propose multicast ip set by LinphoneCore.setVideoMulticastAddr + **/ + boolean videoMulticastEnabled(); + } diff --git a/java/impl/org/linphone/core/LinphoneCallParamsImpl.java b/java/impl/org/linphone/core/LinphoneCallParamsImpl.java index a3c6425b8..c4b356fa7 100644 --- a/java/impl/org/linphone/core/LinphoneCallParamsImpl.java +++ b/java/impl/org/linphone/core/LinphoneCallParamsImpl.java @@ -150,4 +150,25 @@ public class LinphoneCallParamsImpl implements LinphoneCallParams { vSize.height = nativeSize[1]; return vSize; } + private native void enableAudioMulticast(long ptr,boolean yesno); + @Override + public void enableAudioMulticast(boolean yesno) { + enableAudioMulticast(nativePtr,yesno); + } + private native boolean audioMulticastEnabled(long ptr); + @Override + public boolean audioMulticastEnabled() { + return audioMulticastEnabled(nativePtr); + } + private native void enableVideoMulticast(long ptr,boolean yesno); + + @Override + public void enableVideoMulticast(boolean yesno) { + enableVideoMulticast(nativePtr,yesno); + } + private native boolean videoMulticastEnabled(long ptr); + @Override + public boolean videoMulticastEnabled() { + return videoMulticastEnabled(nativePtr); + } } diff --git a/tester/call_tester.c b/tester/call_tester.c index 58b396704..f5abb2c31 100644 --- a/tester/call_tester.c +++ b/tester/call_tester.c @@ -3086,7 +3086,7 @@ static void multiple_early_media(void) { linphone_core_manager_destroy(pauline); } -static void check_media_direction(LinphoneCoreManager* mgr, LinphoneCall *call, MSList* lcs,LinphoneMediaDirection audio_dir, LinphoneMediaDirection video_dir) { +void check_media_direction(LinphoneCoreManager* mgr, LinphoneCall *call, MSList* lcs,LinphoneMediaDirection audio_dir, LinphoneMediaDirection video_dir) { CU_ASSERT_PTR_NOT_NULL(call); if (call) { int current_recv_iframe = mgr->stat.number_of_IframeDecoded; diff --git a/tester/liblinphone_tester.h b/tester/liblinphone_tester.h index 2b7f9a26c..28fcfad3b 100644 --- a/tester/liblinphone_tester.h +++ b/tester/liblinphone_tester.h @@ -308,6 +308,7 @@ void call_base(LinphoneMediaEncryption mode, bool_t enable_video,bool_t enable_r bool_t call_with_caller_params(LinphoneCoreManager* caller_mgr,LinphoneCoreManager* callee_mgr, const LinphoneCallParams *params); bool_t pause_call_1(LinphoneCoreManager* mgr_1,LinphoneCall* call_1,LinphoneCoreManager* mgr_2,LinphoneCall* call_2); bool_t compare_files(const char *path1, const char *path2); +void check_media_direction(LinphoneCoreManager* mgr, LinphoneCall *call, MSList* lcs,LinphoneMediaDirection audio_dir, LinphoneMediaDirection video_dir); static const int audio_cmp_min_overlap=90; diff --git a/tester/multicast_call_tester.c b/tester/multicast_call_tester.c index fb4b58d6c..22c7fcd8b 100644 --- a/tester/multicast_call_tester.c +++ b/tester/multicast_call_tester.c @@ -96,6 +96,7 @@ static void early_media_with_multicast_base(bool_t video) { int begin; LinphoneVideoPolicy marie_policy, pauline_policy; LpConfig *marie_lp; + LinphoneCallParams *params; belle_sip_object_enable_leak_detector(TRUE); begin=belle_sip_object_get_object_count(); @@ -172,6 +173,12 @@ static void early_media_with_multicast_base(bool_t video) { CU_ASSERT_TRUE(linphone_call_get_audio_stats(linphone_core_get_current_call(pauline2->lc))->download_bandwidth>70); CU_ASSERT_TRUE(linphone_call_get_audio_stats(linphone_core_get_current_call(pauline2->lc))->download_bandwidth<90); + CU_ASSERT_TRUE(linphone_call_params_audio_multicast_enabled(linphone_call_get_current_params(linphone_core_get_current_call(pauline->lc)))); + CU_ASSERT_TRUE(linphone_call_params_audio_multicast_enabled(linphone_call_get_current_params(linphone_core_get_current_call(marie->lc)))); + if (video) { + CU_ASSERT_TRUE(linphone_call_params_video_multicast_enabled(linphone_call_get_current_params(linphone_core_get_current_call(pauline->lc)))); + CU_ASSERT_TRUE(linphone_call_params_video_multicast_enabled(linphone_call_get_current_params(linphone_core_get_current_call(marie->lc)))); + } if (video) { CU_ASSERT_TRUE( wait_for_list(lcs,&pauline->stat.number_of_IframeDecoded,1,2000)); @@ -182,13 +189,48 @@ static void early_media_with_multicast_base(bool_t video) { CU_ASSERT_TRUE(wait_for_list(lcs, &marie->stat.number_of_LinphoneCallConnected, 1,1000)); CU_ASSERT_TRUE(wait_for_list(lcs, &marie->stat.number_of_LinphoneCallStreamsRunning, 1,1000)); + CU_ASSERT_TRUE(wait_for_list(lcs, &pauline2->stat.number_of_LinphoneCallEnd, 1,1000)); + + CU_ASSERT_TRUE(linphone_call_params_audio_multicast_enabled(linphone_call_get_current_params(linphone_core_get_current_call(pauline->lc)))); + CU_ASSERT_TRUE(linphone_call_params_audio_multicast_enabled(linphone_call_get_current_params(linphone_core_get_current_call(marie->lc)))); + if (video) { + CU_ASSERT_TRUE(linphone_call_params_video_multicast_enabled(linphone_call_get_current_params(linphone_core_get_current_call(pauline->lc)))); + CU_ASSERT_TRUE(linphone_call_params_video_multicast_enabled(linphone_call_get_current_params(linphone_core_get_current_call(marie->lc)))); + } + params=linphone_call_params_copy(linphone_call_get_current_params(linphone_core_get_current_call(pauline->lc))); + + linphone_call_params_enable_audio_multicast(params,FALSE); + linphone_call_params_enable_video_multicast(params,FALSE); + linphone_core_enable_video_capture(pauline->lc, TRUE); + linphone_core_enable_video_display(pauline->lc, TRUE); + linphone_core_enable_video_capture(marie->lc, TRUE); + linphone_core_enable_video_display(marie->lc, TRUE); linphone_core_update_call( pauline->lc , linphone_core_get_current_call(pauline->lc) - , linphone_call_get_current_params(linphone_core_get_current_call(pauline->lc))); + , params); + linphone_call_params_destroy(params); - CU_ASSERT_TRUE(wait_for_list(lcs, &marie->stat.number_of_LinphoneCallStreamsRunning, 2,1000)); + CU_ASSERT_TRUE(wait_for_list(lcs, &pauline->stat.number_of_LinphoneCallStreamsRunning, 2,1000)); + CU_ASSERT_FALSE(linphone_call_params_audio_multicast_enabled(linphone_call_get_current_params(linphone_core_get_current_call(pauline->lc)))); + CU_ASSERT_FALSE(linphone_call_params_audio_multicast_enabled(linphone_call_get_current_params(linphone_core_get_current_call(marie->lc)))); + + check_media_direction( pauline + , linphone_core_get_current_call(pauline->lc) + , lcs + ,LinphoneMediaDirectionSendRecv + , video?LinphoneMediaDirectionSendRecv:LinphoneMediaDirectionInactive); + check_media_direction( marie + , linphone_core_get_current_call(marie->lc) + , lcs + ,LinphoneMediaDirectionSendRecv + , video?LinphoneMediaDirectionSendRecv:LinphoneMediaDirectionInactive); + + if (video) { + CU_ASSERT_FALSE(linphone_call_params_video_multicast_enabled(linphone_call_get_current_params(linphone_core_get_current_call(marie->lc)))); + CU_ASSERT_FALSE(linphone_call_params_video_multicast_enabled(linphone_call_get_current_params(linphone_core_get_current_call(pauline->lc)))); + } end_call(marie,pauline); } ms_free(lcs); From 00fba97a129763d015abc34d8c4a0d8a1f71eb83 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Wed, 13 May 2015 09:30:37 +0200 Subject: [PATCH 140/157] fix compilatino issue --- coreapi/linphonecall.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c index 4969da7ba..ad429faf5 100644 --- a/coreapi/linphonecall.c +++ b/coreapi/linphonecall.c @@ -994,8 +994,6 @@ static void linphone_call_incoming_select_ip_version(LinphoneCall *call){ * Fix call parameters on incoming call to eg. enable AVPF if the incoming call propose it and it is not enabled locally. */ void linphone_call_set_compatible_incoming_call_parameters(LinphoneCall *call, const SalMediaDescription *md) { - int i; - /* Handle AVPF, SRTP and DTLS. */ call->params->avpf_enabled = sal_media_description_has_avpf(md); if (call->params->avpf_enabled == TRUE) { From 57b99948b353b03b3dd354d93f785f6e53ab4e04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Grisez?= Date: Wed, 13 May 2015 10:32:23 +0200 Subject: [PATCH 141/157] Points the mediastreamer submodule on 2.11.2 Because the 2.11.2 mediastreamer tag has been moved --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index 9c57afef0..2de4bc981 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 9c57afef0d3332715b701ec161b0598fe4246b53 +Subproject commit 2de4bc981ed4db1ad95c762b76663f9871c60df1 From 3b9a717089de8d5ff5412021b2ce194c66013443 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Wed, 13 May 2015 12:11:29 +0200 Subject: [PATCH 142/157] Fix some leaks in references in JNI layer for Android --- coreapi/linphonecore_jni.cc | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/coreapi/linphonecore_jni.cc b/coreapi/linphonecore_jni.cc index 968d897be..af0881cce 100644 --- a/coreapi/linphonecore_jni.cc +++ b/coreapi/linphonecore_jni.cc @@ -3323,6 +3323,7 @@ static void message_state_changed(LinphoneChatMessage* msg, LinphoneChatMessageS if (state == LinphoneChatMessageStateDelivered || state == LinphoneChatMessageStateNotDelivered) { env->DeleteGlobalRef(listener); + env->DeleteGlobalRef(chatMessageStateClass); } } @@ -3338,7 +3339,11 @@ static void file_transfer_progress_indication(LinphoneChatMessage *msg, const Li jclass clazz = (jclass) env->GetObjectClass(listener); jmethodID method = env->GetMethodID(clazz, "onLinphoneChatMessageFileTransferProgressChanged", "(Lorg/linphone/core/LinphoneChatMessage;Lorg/linphone/core/LinphoneContent;II)V"); jobject jmessage = getChatMessage(env, msg); - env->CallVoidMethod(listener, method, jmessage, content ? create_java_linphone_content(env, content) : NULL, offset, total); + jobject jcontent = content ? create_java_linphone_content(env, content) : NULL; + env->CallVoidMethod(listener, method, jmessage, jcontent, offset, total); + if (jcontent) { + env->DeleteLocalRef(jcontent); + } } static void file_transfer_recv(LinphoneChatMessage *msg, const LinphoneContent* content, const LinphoneBuffer *buffer) { @@ -3353,7 +3358,15 @@ static void file_transfer_recv(LinphoneChatMessage *msg, const LinphoneContent* jclass clazz = (jclass) env->GetObjectClass(listener); jmethodID method = env->GetMethodID(clazz, "onLinphoneChatMessageFileTransferReceived", "(Lorg/linphone/core/LinphoneChatMessage;Lorg/linphone/core/LinphoneContent;Lorg/linphone/core/LinphoneBuffer;)V"); jobject jmessage = getChatMessage(env, msg); - env->CallVoidMethod(listener, method, jmessage, content ? create_java_linphone_content(env, content) : NULL, buffer ? create_java_linphone_buffer(env, buffer) : NULL); + jobject jbuffer = buffer ? create_java_linphone_buffer(env, buffer) : NULL; + jobject jcontent = content ? create_java_linphone_content(env, content) : NULL; + env->CallVoidMethod(listener, method, jmessage, jcontent, jbuffer); + if (jbuffer) { + env->DeleteLocalRef(jbuffer); + } + if (jcontent) { + env->DeleteLocalRef(jcontent); + } } static LinphoneBuffer* file_transfer_send(LinphoneChatMessage *msg, const LinphoneContent* content, size_t offset, size_t size) { @@ -3370,9 +3383,14 @@ static LinphoneBuffer* file_transfer_send(LinphoneChatMessage *msg, const Linph jmethodID method = env->GetMethodID(clazz, "onLinphoneChatMessageFileTransferSent","(Lorg/linphone/core/LinphoneChatMessage;Lorg/linphone/core/LinphoneContent;IILorg/linphone/core/LinphoneBuffer;)V"); jobject jmessage = getChatMessage(env, msg); jobject jbuffer = create_java_linphone_buffer(env, NULL); - env->CallVoidMethod(listener, method, jmessage, content ? create_java_linphone_content(env, content) : NULL, offset, size, jbuffer); + jobject jcontent = content ? create_java_linphone_content(env, content) : NULL; + env->CallVoidMethod(listener, method, jmessage, jcontent, offset, size, jbuffer); + if (jcontent) { + env->DeleteLocalRef(jcontent); + } buffer = create_c_linphone_buffer_from_java_linphone_buffer(env, jbuffer); + env->DeleteLocalRef(jbuffer); return buffer; } @@ -3446,6 +3464,7 @@ static void chat_room_impl_callback(LinphoneChatMessage* msg, LinphoneChatMessag if (state == LinphoneChatMessageStateDelivered || state == LinphoneChatMessageStateNotDelivered) { env->DeleteGlobalRef(listener); env->DeleteGlobalRef(jmessage); + env->DeleteGlobalRef(chatMessageStateClass); linphone_chat_message_set_user_data(msg,NULL); } } @@ -4173,6 +4192,7 @@ extern "C" void Java_org_linphone_core_LinphoneCoreImpl_tunnelAddServer(JNIEnv * linphone_tunnel_config_set_delay(tunnelConfig, env->CallIntMethod(config, getDelayMethod)); linphone_tunnel_add_server(tunnel, tunnelConfig); env->ReleaseStringUTFChars(hostString, host); + env->DeleteLocalRef(TunnelConfigClass); } else { ms_error("LinphoneCore.tunnelAddServer(): tunnel feature is not enabled"); } @@ -4202,6 +4222,7 @@ extern "C" jobjectArray Java_org_linphone_core_LinphoneCoreImpl_tunnelGetServers env->CallVoidMethod(elt, setRemoteUdpMirrorPortMethod, linphone_tunnel_config_get_remote_udp_mirror_port(conf)); env->CallVoidMethod(elt, setDelayMethod, linphone_tunnel_config_get_delay(conf)); env->SetObjectArrayElement(tunnelConfigArray, i, elt); + env->DeleteLocalRef(TunnelConfigClass); } } return tunnelConfigArray; From 5dc410d0c7d8b8f72a8d6cd9af8b6b90600a1a79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Grisez?= Date: Wed, 13 May 2015 17:19:30 +0200 Subject: [PATCH 143/157] Fix build issue --- coreapi/callbacks.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/coreapi/callbacks.c b/coreapi/callbacks.c index b945be221..393bbd350 100644 --- a/coreapi/callbacks.c +++ b/coreapi/callbacks.c @@ -119,6 +119,8 @@ void linphone_core_update_streams(LinphoneCore *lc, LinphoneCall *call, SalMedia SalMediaDescription *oldmd=call->resultdesc; bool_t all_muted=FALSE; bool_t send_ringbacktone=FALSE; + int md_changed=0; + if (!((call->state == LinphoneCallIncomingEarlyMedia) && (linphone_core_get_ring_during_incoming_early_media(lc)))) { linphone_core_stop_ringing(lc); @@ -144,7 +146,7 @@ void linphone_core_update_streams(LinphoneCore *lc, LinphoneCall *call, SalMedia call->resultdesc=new_md; if ((call->audiostream && call->audiostream->ms.state==MSStreamStarted) || (call->videostream && call->videostream->ms.state==MSStreamStarted)){ clear_early_media_destinations(call); - int md_changed=0; + /* we already started media: check if we really need to restart it*/ if (oldmd){ md_changed = media_parameters_changed(call, oldmd, new_md); From 5b3c46b0d572df4a45805c9b00237389e7c7837d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Grisez?= Date: Wed, 13 May 2015 17:21:14 +0200 Subject: [PATCH 144/157] Fix build issue --- coreapi/linphonecall.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c index ad429faf5..4d44000c3 100644 --- a/coreapi/linphonecall.c +++ b/coreapi/linphonecall.c @@ -1017,12 +1017,13 @@ LinphoneCall * linphone_call_new_incoming(LinphoneCore *lc, LinphoneAddress *fro LinphoneCall *call = belle_sip_object_new(LinphoneCall); SalMediaDescription *md; LinphoneFirewallPolicy fpol; + int i; call->dir=LinphoneCallIncoming; sal_op_set_user_pointer(op,call); call->op=op; call->core=lc; - int i; + linphone_call_incoming_select_ip_version(call); sal_op_cnx_ip_to_0000_if_sendonly_enable(op,lp_config_get_default_int(lc->config,"sip","cnx_ip_to_0000_if_sendonly_enabled",0)); From 2fced27fe94683db3c3a1ba2d92a4f6271ad3cb6 Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Wed, 13 May 2015 17:38:14 +0200 Subject: [PATCH 145/157] tester: use new macros instead of CUnit ones to get better error logs --- .gitignore | 3 + tester/Makefile.am | 1 + tester/call_tester.c | 1161 ++++++++++++++------------- tester/common/bc_tester_utils.c | 1 + tester/common/bc_tester_utils.h | 120 +-- tester/dtmf_tester.c | 34 +- tester/eventapi_tester.c | 103 ++- tester/flexisip_tester.c | 309 ++++--- tester/liblinphone_tester.c | 4 +- tester/log_collection_tester.c | 22 +- tester/message_tester.c | 233 +++--- tester/multi_call.c | 196 ++--- tester/multicast_call_tester.c | 64 +- tester/offeranswer_tester.c | 70 +- tester/player_tester.c | 12 +- tester/presence_tester.c | 101 ++- tester/quality_reporting_tester.c | 150 ++-- tester/register_tester.c | 169 ++-- tester/remote_provisioning_tester.c | 45 +- tester/setup_tester.c | 95 ++- tester/stun_tester.c | 19 +- tester/tester.c | 14 +- tester/transport_tester.c | 48 +- tester/upnp_tester.c | 9 +- tester/video_tester.c | 125 ++- 25 files changed, 1552 insertions(+), 1556 deletions(-) diff --git a/.gitignore b/.gitignore index dd920d531..61763ce43 100644 --- a/.gitignore +++ b/.gitignore @@ -85,3 +85,6 @@ tester/linphone_log.gz.txt tools/auto_answer tools/lp-autoanswer build/macos/pkg-distribution.xml +tester/record_for_lc_*.wav +tester/record-call_with_file_player.wav + diff --git a/tester/Makefile.am b/tester/Makefile.am index 020bb4424..86510d794 100644 --- a/tester/Makefile.am +++ b/tester/Makefile.am @@ -33,6 +33,7 @@ liblinphonetester_la_SOURCES = \ upnp_tester.c \ video_tester.c \ common/bc_tester_utils.c + liblinphonetester_ladir = $(includedir)/linphone liblinphonetester_la_HEADERS = common/bc_tester_utils.h diff --git a/tester/call_tester.c b/tester/call_tester.c index f5abb2c31..2cc6455b9 100644 --- a/tester/call_tester.c +++ b/tester/call_tester.c @@ -157,8 +157,8 @@ void liblinphone_tester_check_rtcp(LinphoneCoreManager* caller, LinphoneCoreMana c1=linphone_core_get_current_call(caller->lc); c2=linphone_core_get_current_call(callee->lc); - CU_ASSERT_PTR_NOT_NULL(c1); - CU_ASSERT_PTR_NOT_NULL(c2); + BC_ASSERT_PTR_NOT_NULL(c1); + BC_ASSERT_PTR_NOT_NULL(c2); if (!c1 || !c2) return; linphone_call_ref(c1); @@ -175,13 +175,13 @@ void liblinphone_tester_check_rtcp(LinphoneCoreManager* caller, LinphoneCoreMana } wait_for_until(caller->lc,callee->lc,&dummy,1,500); /*just to sleep while iterating*/ }while (!liblinphone_tester_clock_elapsed(&ts,12000)); - CU_ASSERT_TRUE(linphone_call_get_audio_stats(c1)->round_trip_delay>0.0); - CU_ASSERT_TRUE(linphone_call_get_audio_stats(c2)->round_trip_delay>0.0); + BC_ASSERT_TRUE(linphone_call_get_audio_stats(c1)->round_trip_delay>0.0); + BC_ASSERT_TRUE(linphone_call_get_audio_stats(c2)->round_trip_delay>0.0); if (linphone_call_log_video_enabled(linphone_call_get_call_log(c1))) { - CU_ASSERT_TRUE(linphone_call_get_video_stats(c1)->round_trip_delay>0.0); + BC_ASSERT_TRUE(linphone_call_get_video_stats(c1)->round_trip_delay>0.0); } if (linphone_call_log_video_enabled(linphone_call_get_call_log(c2))) { - CU_ASSERT_TRUE(linphone_call_get_video_stats(c2)->round_trip_delay>0.0); + BC_ASSERT_TRUE(linphone_call_get_video_stats(c2)->round_trip_delay>0.0); } linphone_call_unref(c1); linphone_call_unref(c2); @@ -213,16 +213,16 @@ bool_t call_with_params2(LinphoneCoreManager* caller_mgr setup_sdp_handling(callee_test_params, callee_mgr); if (!caller_params){ - CU_ASSERT_PTR_NOT_NULL(linphone_core_invite_address(caller_mgr->lc,callee_mgr->identity)); + BC_ASSERT_PTR_NOT_NULL(linphone_core_invite_address(caller_mgr->lc,callee_mgr->identity)); }else{ - CU_ASSERT_PTR_NOT_NULL(linphone_core_invite_address_with_params(caller_mgr->lc,callee_mgr->identity,caller_params)); + BC_ASSERT_PTR_NOT_NULL(linphone_core_invite_address_with_params(caller_mgr->lc,callee_mgr->identity,caller_params)); } did_receive_call = wait_for(callee_mgr->lc ,caller_mgr->lc ,&callee_mgr->stat.number_of_LinphoneCallIncomingReceived ,initial_callee.number_of_LinphoneCallIncomingReceived+1); - CU_ASSERT_EQUAL(did_receive_call, !callee_test_params->sdp_simulate_error); + BC_ASSERT_EQUAL(did_receive_call, !callee_test_params->sdp_simulate_error, int, "%d"); sal_default_set_sdp_handling(caller_mgr->lc->sal, SalOpSDPNormal); sal_default_set_sdp_handling(callee_mgr->lc->sal, SalOpSDPNormal); @@ -231,8 +231,8 @@ bool_t call_with_params2(LinphoneCoreManager* caller_mgr if (linphone_core_get_calls_nb(callee_mgr->lc)<=1) - CU_ASSERT_TRUE(linphone_core_inc_invite_pending(callee_mgr->lc)); - CU_ASSERT_EQUAL(caller_mgr->stat.number_of_LinphoneCallOutgoingProgress,initial_caller.number_of_LinphoneCallOutgoingProgress+1); + BC_ASSERT_TRUE(linphone_core_inc_invite_pending(callee_mgr->lc)); + BC_ASSERT_EQUAL(caller_mgr->stat.number_of_LinphoneCallOutgoingProgress,initial_caller.number_of_LinphoneCallOutgoingProgress+1, int, "%d"); while (caller_mgr->stat.number_of_LinphoneCallOutgoingRinging!=(initial_caller.number_of_LinphoneCallOutgoingRinging + 1) @@ -244,11 +244,11 @@ bool_t call_with_params2(LinphoneCoreManager* caller_mgr } - CU_ASSERT_TRUE((caller_mgr->stat.number_of_LinphoneCallOutgoingRinging==initial_caller.number_of_LinphoneCallOutgoingRinging+1) + BC_ASSERT_TRUE((caller_mgr->stat.number_of_LinphoneCallOutgoingRinging==initial_caller.number_of_LinphoneCallOutgoingRinging+1) ||(caller_mgr->stat.number_of_LinphoneCallOutgoingEarlyMedia==initial_caller.number_of_LinphoneCallOutgoingEarlyMedia+1)); - CU_ASSERT_PTR_NOT_NULL(linphone_core_get_current_call_remote_address(callee_mgr->lc)); + BC_ASSERT_PTR_NOT_NULL(linphone_core_get_current_call_remote_address(callee_mgr->lc)); callee_call=linphone_core_get_call_by_remote_address2(callee_mgr->lc,caller_mgr->identity); if(!linphone_core_get_current_call(caller_mgr->lc) || !linphone_core_get_current_call(callee_mgr->lc) || !linphone_core_get_current_call_remote_address(callee_mgr->lc)) { @@ -260,9 +260,9 @@ bool_t call_with_params2(LinphoneCoreManager* caller_mgr if (linphone_call_params_get_privacy(linphone_call_get_current_params(linphone_core_get_current_call(caller_mgr->lc))) == LinphonePrivacyNone) { /*don't check in case of p asserted id*/ if (!lp_config_get_int(callee_mgr->lc->config,"sip","call_logs_use_asserted_id_instead_of_from",0)) - CU_ASSERT_TRUE(linphone_address_weak_equal(callee_from,linphone_call_get_remote_address(callee_call))); + BC_ASSERT_TRUE(linphone_address_weak_equal(callee_from,linphone_call_get_remote_address(callee_call))); } else { - CU_ASSERT_FALSE(linphone_address_weak_equal(callee_from,linphone_call_get_remote_address(linphone_core_get_current_call(callee_mgr->lc)))); + BC_ASSERT_FALSE(linphone_address_weak_equal(callee_from,linphone_call_get_remote_address(linphone_core_get_current_call(callee_mgr->lc)))); } linphone_address_destroy(callee_from); } @@ -279,8 +279,8 @@ bool_t call_with_params2(LinphoneCoreManager* caller_mgr linphone_core_accept_call(callee_mgr->lc,callee_call); } - CU_ASSERT_TRUE(wait_for(callee_mgr->lc,caller_mgr->lc,&callee_mgr->stat.number_of_LinphoneCallConnected,initial_callee.number_of_LinphoneCallConnected+1)); - CU_ASSERT_TRUE(wait_for(callee_mgr->lc,caller_mgr->lc,&caller_mgr->stat.number_of_LinphoneCallConnected,initial_callee.number_of_LinphoneCallConnected+1)); + BC_ASSERT_TRUE(wait_for(callee_mgr->lc,caller_mgr->lc,&callee_mgr->stat.number_of_LinphoneCallConnected,initial_callee.number_of_LinphoneCallConnected+1)); + BC_ASSERT_TRUE(wait_for(callee_mgr->lc,caller_mgr->lc,&caller_mgr->stat.number_of_LinphoneCallConnected,initial_callee.number_of_LinphoneCallConnected+1)); /*just to sleep*/ result = wait_for(callee_mgr->lc,caller_mgr->lc,&caller_mgr->stat.number_of_LinphoneCallStreamsRunning,initial_caller.number_of_LinphoneCallStreamsRunning+1) && @@ -298,9 +298,9 @@ bool_t call_with_params2(LinphoneCoreManager* caller_mgr wait_for(callee_mgr->lc,caller_mgr->lc,&callee_mgr->stat.number_of_LinphoneCallEncryptedOn,initial_callee.number_of_LinphoneCallEncryptedOn+1); { const LinphoneCallParams* call_param = linphone_call_get_current_params(callee_call); - CU_ASSERT_EQUAL(linphone_call_params_get_media_encryption(call_param),linphone_core_get_media_encryption(caller_mgr->lc)); + BC_ASSERT_EQUAL(linphone_call_params_get_media_encryption(call_param),linphone_core_get_media_encryption(caller_mgr->lc), int, "%d"); call_param = linphone_call_get_current_params(linphone_core_get_current_call(caller_mgr->lc)); - CU_ASSERT_EQUAL(linphone_call_params_get_media_encryption(call_param),linphone_core_get_media_encryption(caller_mgr->lc)); + BC_ASSERT_EQUAL(linphone_call_params_get_media_encryption(call_param),linphone_core_get_media_encryption(caller_mgr->lc), int, "%d"); } } @@ -334,10 +334,10 @@ bool_t call(LinphoneCoreManager* caller_mgr,LinphoneCoreManager* callee_mgr){ void end_call(LinphoneCoreManager *m1, LinphoneCoreManager *m2){ linphone_core_terminate_all_calls(m1->lc); - CU_ASSERT_TRUE(wait_for(m1->lc,m2->lc,&m1->stat.number_of_LinphoneCallEnd,1)); - CU_ASSERT_TRUE(wait_for(m1->lc,m2->lc,&m2->stat.number_of_LinphoneCallEnd,1)); - CU_ASSERT_TRUE(wait_for(m1->lc,m2->lc,&m1->stat.number_of_LinphoneCallReleased,1)); - CU_ASSERT_TRUE(wait_for(m1->lc,m2->lc,&m2->stat.number_of_LinphoneCallReleased,1)); + BC_ASSERT_TRUE(wait_for(m1->lc,m2->lc,&m1->stat.number_of_LinphoneCallEnd,1)); + BC_ASSERT_TRUE(wait_for(m1->lc,m2->lc,&m2->stat.number_of_LinphoneCallEnd,1)); + BC_ASSERT_TRUE(wait_for(m1->lc,m2->lc,&m1->stat.number_of_LinphoneCallReleased,1)); + BC_ASSERT_TRUE(wait_for(m1->lc,m2->lc,&m2->stat.number_of_LinphoneCallReleased,1)); } void simple_call_base(bool_t enable_multicast_recv_side) { @@ -375,18 +375,18 @@ void simple_call_base(bool_t enable_multicast_recv_side) { linphone_core_enable_audio_multicast(pauline->lc,enable_multicast_recv_side); - CU_ASSERT_TRUE(call(marie,pauline)); + BC_ASSERT_TRUE(call(marie,pauline)); pauline_call=linphone_core_get_current_call(pauline->lc); - CU_ASSERT_PTR_NOT_NULL(pauline_call); + BC_ASSERT_PTR_NOT_NULL(pauline_call); /*check that display name is correctly propagated in From */ if (pauline_call){ from=linphone_call_get_remote_address(linphone_core_get_current_call(pauline->lc)); - CU_ASSERT_PTR_NOT_NULL(from); + BC_ASSERT_PTR_NOT_NULL(from); if (from){ const char *dname=linphone_address_get_display_name(from); - CU_ASSERT_PTR_NOT_NULL(dname); + BC_ASSERT_PTR_NOT_NULL(dname); if (dname){ - CU_ASSERT_STRING_EQUAL(dname, "Super Marie"); + BC_ASSERT_STRING_EQUAL(dname, "Super Marie"); } } } @@ -398,7 +398,7 @@ void simple_call_base(bool_t enable_multicast_recv_side) { linphone_core_manager_destroy(pauline); leaked_objects=belle_sip_object_get_object_count()-begin; - CU_ASSERT_TRUE(leaked_objects==0); + BC_ASSERT_TRUE(leaked_objects==0); if (leaked_objects>0){ belle_sip_object_dump_active_objects(); } @@ -420,7 +420,7 @@ static void call_with_timeouted_bye(void) { marie = linphone_core_manager_new( "marie_rc"); pauline = linphone_core_manager_new( "pauline_rc"); - CU_ASSERT_TRUE(call(marie,pauline)); + BC_ASSERT_TRUE(call(marie,pauline)); sal_set_send_error(pauline->lc->sal,1500); /*to trash the message without generating error*/ timer_config.T1=50; /*to have timer F = 3s*/ @@ -431,20 +431,20 @@ static void call_with_timeouted_bye(void) { belle_sip_stack_set_timer_config(sal_get_belle_sip_stack(pauline->lc->sal),&timer_config); linphone_core_terminate_all_calls(pauline->lc); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallEnd,1)); - CU_ASSERT_TRUE(wait_for_until(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallReleased,1,timer_config.T1*84)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallEnd,1)); + BC_ASSERT_TRUE(wait_for_until(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallReleased,1,timer_config.T1*84)); sal_set_send_error(pauline->lc->sal,0); linphone_core_terminate_all_calls(marie->lc); - CU_ASSERT_TRUE(wait_for_until(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallEnd,1,5000)); - CU_ASSERT_TRUE(wait_for_until(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallReleased,1,5000)); + BC_ASSERT_TRUE(wait_for_until(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallEnd,1,5000)); + BC_ASSERT_TRUE(wait_for_until(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallReleased,1,5000)); linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); leaked_objects=belle_sip_object_get_object_count()-begin; - CU_ASSERT_TRUE(leaked_objects==0); + BC_ASSERT_TRUE(leaked_objects==0); if (leaked_objects>0){ belle_sip_object_dump_active_objects(); } @@ -457,27 +457,27 @@ static void phone_number_normalization(void){ linphone_proxy_config_set_dial_prefix(cfg, "33"); linphone_proxy_config_normalize_number(cfg, "0952636505", result, sizeof(result)); - CU_ASSERT_STRING_EQUAL(result, "+33952636505"); + BC_ASSERT_STRING_EQUAL(result, "+33952636505"); linphone_proxy_config_normalize_number(cfg, "09 52 63 65 05", result, sizeof(result)); - CU_ASSERT_STRING_EQUAL(result, "+33952636505"); + BC_ASSERT_STRING_EQUAL(result, "+33952636505"); linphone_proxy_config_normalize_number(cfg, "09-52-63-65-05", result, sizeof(result)); - CU_ASSERT_STRING_EQUAL(result, "+33952636505"); + BC_ASSERT_STRING_EQUAL(result, "+33952636505"); linphone_proxy_config_normalize_number(cfg, "+31952636505", result, sizeof(result)); - CU_ASSERT_STRING_EQUAL(result, "+31952636505"); + BC_ASSERT_STRING_EQUAL(result, "+31952636505"); linphone_proxy_config_normalize_number(cfg, "0033952636505", result, sizeof(result)); - CU_ASSERT_STRING_EQUAL(result, "+33952636505"); + BC_ASSERT_STRING_EQUAL(result, "+33952636505"); linphone_proxy_config_normalize_number(cfg, "0033952636505", result, sizeof(result)); - CU_ASSERT_STRING_EQUAL(result, "+33952636505"); + BC_ASSERT_STRING_EQUAL(result, "+33952636505"); linphone_proxy_config_normalize_number(cfg, "toto", result, sizeof(result)); - CU_ASSERT_STRING_EQUAL(result, "toto"); + BC_ASSERT_STRING_EQUAL(result, "toto"); linphone_proxy_config_set_dial_escape_plus(cfg, TRUE); linphone_proxy_config_normalize_number(cfg, "0033952636505", result, sizeof(result)); - CU_ASSERT_STRING_EQUAL(result, "0033952636505"); + BC_ASSERT_STRING_EQUAL(result, "0033952636505"); linphone_proxy_config_normalize_number(cfg, "0952636505", result, sizeof(result)); - CU_ASSERT_STRING_EQUAL(result, "0033952636505"); + BC_ASSERT_STRING_EQUAL(result, "0033952636505"); linphone_proxy_config_normalize_number(cfg, "+34952636505", result, sizeof(result)); - CU_ASSERT_STRING_EQUAL(result, "0034952636505"); + BC_ASSERT_STRING_EQUAL(result, "0034952636505"); linphone_proxy_config_unref(cfg); linphone_core_manager_destroy(marie); @@ -498,19 +498,19 @@ static void direct_call_over_ipv6(){ linphone_core_set_default_proxy_config(marie->lc,NULL); /*wait for register in v6 mode, however sip2.linphone.org has an ipv6 address but doesn't listen to it*/ #if 0 - CU_ASSERT_TRUE(wait_for_until(pauline->lc, NULL, &pauline->stat.number_of_LinphoneRegistrationOk, 2, 2000)); - CU_ASSERT_TRUE(wait_for_until(pauline->lc, NULL, &marie->stat.number_of_LinphoneRegistrationOk, 2, 2000)); + BC_ASSERT_TRUE(wait_for_until(pauline->lc, NULL, &pauline->stat.number_of_LinphoneRegistrationOk, 2, 2000)); + BC_ASSERT_TRUE(wait_for_until(pauline->lc, NULL, &marie->stat.number_of_LinphoneRegistrationOk, 2, 2000)); #endif linphone_core_get_sip_transports_used(pauline->lc,&pauline_transports); linphone_address_set_port(pauline_dest,pauline_transports.tcp_port); linphone_core_invite_address(marie->lc,pauline_dest); - CU_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&marie->stat.number_of_LinphoneCallOutgoingRinging,1)); - CU_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&pauline->stat.number_of_LinphoneCallIncomingReceived,1)); + BC_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&marie->stat.number_of_LinphoneCallOutgoingRinging,1)); + BC_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&pauline->stat.number_of_LinphoneCallIncomingReceived,1)); linphone_core_accept_call(pauline->lc,linphone_core_get_current_call(pauline->lc)); - CU_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&marie->stat.number_of_LinphoneCallStreamsRunning,1)); - CU_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&pauline->stat.number_of_LinphoneCallStreamsRunning,1)); + BC_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&marie->stat.number_of_LinphoneCallStreamsRunning,1)); + BC_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&pauline->stat.number_of_LinphoneCallStreamsRunning,1)); liblinphone_tester_check_rtcp(marie,pauline); end_call(marie,pauline); @@ -530,8 +530,8 @@ static void call_outbound_with_multiple_proxy() { linphone_core_get_default_proxy(marie->lc, &lpc); linphone_core_set_default_proxy(marie->lc,NULL); - CU_ASSERT_FATAL(lpc != NULL); - CU_ASSERT_FATAL(registered_lpc != NULL); + BC_ASSERT_FATAL(lpc != NULL); + BC_ASSERT_FATAL(registered_lpc != NULL); // create new LPC that will successfully register linphone_proxy_config_set_identity(registered_lpc, linphone_proxy_config_get_identity(lpc)); @@ -547,13 +547,13 @@ static void call_outbound_with_multiple_proxy() { linphone_proxy_config_set_route(lpc, "12.13.14.15:5223;transport=udp;lr"); linphone_proxy_config_done(lpc); - CU_ASSERT_TRUE(wait_for_until(pauline->lc, NULL, &pauline->stat.number_of_LinphoneRegistrationOk, 1, 2000)); + BC_ASSERT_TRUE(wait_for_until(pauline->lc, NULL, &pauline->stat.number_of_LinphoneRegistrationOk, 1, 2000)); - CU_ASSERT_TRUE(wait_for_until(marie->lc, NULL, &marie->stat.number_of_LinphoneRegistrationProgress, 2, 200)); - CU_ASSERT_TRUE(wait_for_until(marie->lc, NULL, &marie->stat.number_of_LinphoneRegistrationOk, 1, 2000)); + BC_ASSERT_TRUE(wait_for_until(marie->lc, NULL, &marie->stat.number_of_LinphoneRegistrationProgress, 2, 200)); + BC_ASSERT_TRUE(wait_for_until(marie->lc, NULL, &marie->stat.number_of_LinphoneRegistrationOk, 1, 2000)); // calling marie should go through the second proxy config - CU_ASSERT_TRUE(call(marie, pauline)); + BC_ASSERT_TRUE(call(marie, pauline)); linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); @@ -575,27 +575,27 @@ static void multiple_answers_call() { lcs = ms_list_append(lcs,marie2->lc); - CU_ASSERT_TRUE(wait_for_until(pauline->lc, NULL, &pauline->stat.number_of_LinphoneRegistrationOk, 1, 2000)); + BC_ASSERT_TRUE(wait_for_until(pauline->lc, NULL, &pauline->stat.number_of_LinphoneRegistrationOk, 1, 2000)); - CU_ASSERT_PTR_NOT_NULL( linphone_core_invite_address(pauline->lc, marie1->identity ) ); + BC_ASSERT_PTR_NOT_NULL( linphone_core_invite_address(pauline->lc, marie1->identity ) ); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie1->stat.number_of_LinphoneCallIncomingReceived, 1, 2000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie2->stat.number_of_LinphoneCallIncomingReceived, 1, 2000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallOutgoingProgress, 1, 2000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie1->stat.number_of_LinphoneCallIncomingReceived, 1, 2000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie2->stat.number_of_LinphoneCallIncomingReceived, 1, 2000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallOutgoingProgress, 1, 2000)); // marie 1 and 2 answer at the same time call1 = linphone_core_get_current_call(marie1->lc); call2 = linphone_core_get_current_call(marie2->lc); - CU_ASSERT_PTR_NOT_NULL_FATAL(call1); - CU_ASSERT_PTR_NOT_NULL_FATAL(call2); + BC_ASSERT_PTR_NOT_NULL_FATAL(call1); + BC_ASSERT_PTR_NOT_NULL_FATAL(call2); - CU_ASSERT_EQUAL( linphone_core_accept_call(marie1->lc, call1), 0); - CU_ASSERT_EQUAL( linphone_core_accept_call(marie2->lc, call2), 0); + BC_ASSERT_EQUAL( linphone_core_accept_call(marie1->lc, call1), 0, int, "%d"); + BC_ASSERT_EQUAL( linphone_core_accept_call(marie2->lc, call2), 0, int, "%d"); - CU_ASSERT_TRUE( wait_for_list(lcs, &pauline->stat.number_of_LinphoneCallStreamsRunning, 1, 2000) ); - CU_ASSERT_TRUE( wait_for_list(lcs, &marie1->stat.number_of_LinphoneCallStreamsRunning, 1, 2000) ); - CU_ASSERT_TRUE( wait_for_list(lcs, &marie2->stat.number_of_LinphoneCallEnd, 1, 2000) ); + BC_ASSERT_TRUE( wait_for_list(lcs, &pauline->stat.number_of_LinphoneCallStreamsRunning, 1, 2000) ); + BC_ASSERT_TRUE( wait_for_list(lcs, &marie1->stat.number_of_LinphoneCallStreamsRunning, 1, 2000) ); + BC_ASSERT_TRUE( wait_for_list(lcs, &marie2->stat.number_of_LinphoneCallEnd, 1, 2000) ); linphone_core_manager_destroy(pauline); @@ -623,27 +623,27 @@ static void multiple_answers_call_with_media_relay(void) { linphone_core_set_user_agent(marie1->lc, "Natted Linphone", NULL); linphone_core_set_user_agent(marie2->lc, "Natted Linphone", NULL); - CU_ASSERT_TRUE(wait_for_until(pauline->lc, NULL, &pauline->stat.number_of_LinphoneRegistrationOk, 1, 2000)); + BC_ASSERT_TRUE(wait_for_until(pauline->lc, NULL, &pauline->stat.number_of_LinphoneRegistrationOk, 1, 2000)); - CU_ASSERT_PTR_NOT_NULL( linphone_core_invite_address(pauline->lc, marie1->identity ) ); + BC_ASSERT_PTR_NOT_NULL( linphone_core_invite_address(pauline->lc, marie1->identity ) ); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie1->stat.number_of_LinphoneCallIncomingReceived, 1, 2000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie2->stat.number_of_LinphoneCallIncomingReceived, 1, 2000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallOutgoingProgress, 1, 2000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie1->stat.number_of_LinphoneCallIncomingReceived, 1, 2000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie2->stat.number_of_LinphoneCallIncomingReceived, 1, 2000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallOutgoingProgress, 1, 2000)); // marie 1 and 2 answer at the same time call1 = linphone_core_get_current_call(marie1->lc); call2 = linphone_core_get_current_call(marie2->lc); - CU_ASSERT_PTR_NOT_NULL_FATAL(call1); - CU_ASSERT_PTR_NOT_NULL_FATAL(call2); + BC_ASSERT_PTR_NOT_NULL_FATAL(call1); + BC_ASSERT_PTR_NOT_NULL_FATAL(call2); - CU_ASSERT_EQUAL( linphone_core_accept_call(marie1->lc, call1), 0); - CU_ASSERT_EQUAL( linphone_core_accept_call(marie2->lc, call2), 0); + BC_ASSERT_EQUAL( linphone_core_accept_call(marie1->lc, call1), 0, int, "%d"); + BC_ASSERT_EQUAL( linphone_core_accept_call(marie2->lc, call2), 0, int, "%d"); - CU_ASSERT_TRUE( wait_for_list(lcs, &pauline->stat.number_of_LinphoneCallStreamsRunning, 1, 2000) ); - CU_ASSERT_TRUE( wait_for_list(lcs, &marie1->stat.number_of_LinphoneCallStreamsRunning, 1, 2000) ); - CU_ASSERT_TRUE( wait_for_list(lcs, &marie2->stat.number_of_LinphoneCallEnd, 1, 2000) ); + BC_ASSERT_TRUE( wait_for_list(lcs, &pauline->stat.number_of_LinphoneCallStreamsRunning, 1, 2000) ); + BC_ASSERT_TRUE( wait_for_list(lcs, &marie1->stat.number_of_LinphoneCallStreamsRunning, 1, 2000) ); + BC_ASSERT_TRUE( wait_for_list(lcs, &marie2->stat.number_of_LinphoneCallEnd, 1, 2000) ); linphone_core_manager_destroy(pauline); @@ -690,13 +690,13 @@ static void call_with_specified_codec_bitrate(void) { linphone_core_find_payload_type(pauline->lc,codec,rate,-1), min_bw); - CU_ASSERT_TRUE((call_ok=call(pauline,marie))); + BC_ASSERT_TRUE((call_ok=call(pauline,marie))); if (!call_ok) goto end; liblinphone_tester_check_rtcp(marie,pauline); marie_stats=linphone_call_get_audio_stats(linphone_core_get_current_call(marie->lc)); pauline_stats=linphone_call_get_audio_stats(linphone_core_get_current_call(pauline->lc)); - CU_ASSERT_TRUE(marie_stats->download_bandwidth<(min_bw+5+min_bw*.1)); - CU_ASSERT_TRUE(pauline_stats->download_bandwidth>(max_bw-5-max_bw*.1)); + BC_ASSERT_TRUE(marie_stats->download_bandwidth<(min_bw+5+min_bw*.1)); + BC_ASSERT_TRUE(pauline_stats->download_bandwidth>(max_bw-5-max_bw*.1)); end: linphone_core_manager_destroy(marie); @@ -719,7 +719,7 @@ static void simple_call_compatibility_mode(void) { LCSipTransports transport; linphone_core_get_default_proxy(lc_marie,&proxy); - CU_ASSERT_PTR_NOT_NULL (proxy); + BC_ASSERT_PTR_NOT_NULL (proxy); identity = linphone_address_new(linphone_proxy_config_get_identity(proxy)); @@ -739,31 +739,31 @@ static void simple_call_compatibility_mode(void) { linphone_core_set_sip_transports(lc_marie,&transport); stat_marie->number_of_LinphoneRegistrationOk=0; - CU_ASSERT_TRUE (wait_for(lc_marie,lc_marie,&stat_marie->number_of_LinphoneRegistrationOk,1)); + BC_ASSERT_TRUE (wait_for(lc_marie,lc_marie,&stat_marie->number_of_LinphoneRegistrationOk,1)); linphone_core_invite_address(lc_marie,pauline->identity); - CU_ASSERT_TRUE (wait_for(lc_pauline,lc_marie,&stat_pauline->number_of_LinphoneCallIncomingReceived,1)); - CU_ASSERT_TRUE(linphone_core_inc_invite_pending(lc_pauline)); - CU_ASSERT_EQUAL(stat_marie->number_of_LinphoneCallOutgoingProgress,1); - CU_ASSERT_TRUE(wait_for(lc_pauline,lc_marie,&stat_marie->number_of_LinphoneCallOutgoingRinging,1)); + BC_ASSERT_TRUE (wait_for(lc_pauline,lc_marie,&stat_pauline->number_of_LinphoneCallIncomingReceived,1)); + BC_ASSERT_TRUE(linphone_core_inc_invite_pending(lc_pauline)); + BC_ASSERT_EQUAL(stat_marie->number_of_LinphoneCallOutgoingProgress,1, int, "%d"); + BC_ASSERT_TRUE(wait_for(lc_pauline,lc_marie,&stat_marie->number_of_LinphoneCallOutgoingRinging,1)); - CU_ASSERT_PTR_NOT_NULL(linphone_core_get_current_call_remote_address(lc_pauline)); + BC_ASSERT_PTR_NOT_NULL(linphone_core_get_current_call_remote_address(lc_pauline)); if (linphone_core_get_current_call_remote_address(lc_pauline)) { - CU_ASSERT_TRUE(linphone_address_weak_equal(identity,linphone_core_get_current_call_remote_address(lc_pauline))); + BC_ASSERT_TRUE(linphone_address_weak_equal(identity,linphone_core_get_current_call_remote_address(lc_pauline))); linphone_address_destroy(identity); linphone_core_accept_call(lc_pauline,linphone_core_get_current_call(lc_pauline)); - CU_ASSERT_TRUE(wait_for(lc_pauline,lc_marie,&stat_pauline->number_of_LinphoneCallConnected,1)); - CU_ASSERT_TRUE(wait_for(lc_pauline,lc_marie,&stat_marie->number_of_LinphoneCallConnected,1)); - CU_ASSERT_TRUE(wait_for(lc_pauline,lc_marie,&stat_pauline->number_of_LinphoneCallStreamsRunning,1)); - CU_ASSERT_TRUE(wait_for(lc_pauline,lc_marie,&stat_marie->number_of_LinphoneCallStreamsRunning,1)); + BC_ASSERT_TRUE(wait_for(lc_pauline,lc_marie,&stat_pauline->number_of_LinphoneCallConnected,1)); + BC_ASSERT_TRUE(wait_for(lc_pauline,lc_marie,&stat_marie->number_of_LinphoneCallConnected,1)); + BC_ASSERT_TRUE(wait_for(lc_pauline,lc_marie,&stat_pauline->number_of_LinphoneCallStreamsRunning,1)); + BC_ASSERT_TRUE(wait_for(lc_pauline,lc_marie,&stat_marie->number_of_LinphoneCallStreamsRunning,1)); /*just to sleep*/ wait_for(lc_pauline,lc_marie,&stat_marie->number_of_LinphoneCallStreamsRunning,3); linphone_core_terminate_all_calls(lc_pauline); - CU_ASSERT_TRUE(wait_for(lc_pauline,lc_marie,&stat_pauline->number_of_LinphoneCallEnd,1)); - CU_ASSERT_TRUE(wait_for(lc_pauline,lc_marie,&stat_marie->number_of_LinphoneCallEnd,1)); + BC_ASSERT_TRUE(wait_for(lc_pauline,lc_marie,&stat_pauline->number_of_LinphoneCallEnd,1)); + BC_ASSERT_TRUE(wait_for(lc_pauline,lc_marie,&stat_marie->number_of_LinphoneCallEnd,1)); } linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); @@ -776,14 +776,14 @@ static void cancelled_call(void) { LinphoneCall* out_call = linphone_core_invite_address(pauline->lc,marie->identity); linphone_call_ref(out_call); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallOutgoingInit,1)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallOutgoingInit,1)); linphone_core_terminate_call(pauline->lc,out_call); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallEnd,1)); - //CU_ASSERT_EQUAL(linphone_call_get_reason(out_call),LinphoneReasonCanceled); - CU_ASSERT_EQUAL(pauline->stat.number_of_LinphoneCallEnd,1); - CU_ASSERT_EQUAL(marie->stat.number_of_LinphoneCallIncomingReceived,0); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallReleased,1)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallEnd,1)); + //BC_ASSERT_EQUAL(linphone_call_get_reason(out_call),LinphoneReasonCanceled, int, "%d"); + BC_ASSERT_EQUAL(pauline->stat.number_of_LinphoneCallEnd,1, int, "%d"); + BC_ASSERT_EQUAL(marie->stat.number_of_LinphoneCallIncomingReceived,0, int, "%d"); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallReleased,1)); linphone_call_unref(out_call); linphone_core_manager_destroy(marie); @@ -799,7 +799,7 @@ void disable_all_audio_codecs_except_one(LinphoneCore *lc, const char *mime, int linphone_core_enable_payload_type(lc,pt,FALSE); } pt=linphone_core_find_payload_type(lc,mime,rate,-1); - CU_ASSERT_PTR_NOT_NULL_FATAL(pt); + BC_ASSERT_PTR_NOT_NULL_FATAL(pt); linphone_core_enable_payload_type(lc,pt,TRUE); } @@ -812,7 +812,8 @@ void disable_all_video_codecs_except_one(LinphoneCore *lc, const char *mime) { for(it = codecs; it != NULL; it = it->next) { linphone_core_enable_payload_type(lc, (PayloadType *)it->data, FALSE); } - CU_ASSERT_PTR_NOT_NULL_FATAL(pt = linphone_core_find_payload_type(lc, mime, -1, -1)); + pt = linphone_core_find_payload_type(lc, mime, -1, -1); + BC_ASSERT_PTR_NOT_NULL_FATAL(pt); linphone_core_enable_payload_type(lc, pt, TRUE); } #endif @@ -830,10 +831,10 @@ static void call_with_dns_time_out(void) { ms_usleep(200000); linphone_core_iterate(marie->lc); } - CU_ASSERT_EQUAL(marie->stat.number_of_LinphoneCallOutgoingInit,1); - CU_ASSERT_EQUAL(marie->stat.number_of_LinphoneCallOutgoingProgress,1); - CU_ASSERT_EQUAL(marie->stat.number_of_LinphoneCallError,1); - CU_ASSERT_EQUAL(marie->stat.number_of_LinphoneCallReleased,1); + BC_ASSERT_EQUAL(marie->stat.number_of_LinphoneCallOutgoingInit,1, int, "%d"); + BC_ASSERT_EQUAL(marie->stat.number_of_LinphoneCallOutgoingProgress,1, int, "%d"); + BC_ASSERT_EQUAL(marie->stat.number_of_LinphoneCallError,1, int, "%d"); + BC_ASSERT_EQUAL(marie->stat.number_of_LinphoneCallReleased,1, int, "%d"); linphone_core_manager_destroy(marie); } @@ -843,21 +844,21 @@ static void early_cancelled_call(void) { LinphoneCall* out_call = linphone_core_invite_address(pauline->lc,marie->identity); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallOutgoingInit,1)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallOutgoingInit,1)); linphone_core_terminate_call(pauline->lc,out_call); /*since everything is executed in a row, no response can be received from the server, thus the CANCEL cannot be sent. It will ring at Marie's side.*/ - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallEnd,1)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallEnd,1)); - CU_ASSERT_EQUAL(pauline->stat.number_of_LinphoneCallEnd,1); + BC_ASSERT_EQUAL(pauline->stat.number_of_LinphoneCallEnd,1, int, "%d"); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallIncomingReceived,1)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallIncomingReceived,1)); /* now the CANCEL should have been sent and the the call at marie's side should terminate*/ - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallEnd,1)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallEnd,1)); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallReleased,1)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallReleased,1)); linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); @@ -869,13 +870,13 @@ static void cancelled_ringing_call(void) { LinphoneCall* out_call = linphone_core_invite_address(pauline->lc,marie->identity); linphone_call_ref(out_call); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallIncomingReceived,1)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallIncomingReceived,1)); linphone_core_terminate_call(pauline->lc,out_call); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallReleased,1)); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallReleased,1)); - CU_ASSERT_EQUAL(marie->stat.number_of_LinphoneCallEnd,1); - CU_ASSERT_EQUAL(pauline->stat.number_of_LinphoneCallEnd,1); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallReleased,1)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallReleased,1)); + BC_ASSERT_EQUAL(marie->stat.number_of_LinphoneCallEnd,1, int, "%d"); + BC_ASSERT_EQUAL(pauline->stat.number_of_LinphoneCallEnd,1, int, "%d"); linphone_call_unref(out_call); linphone_core_manager_destroy(marie); @@ -893,15 +894,15 @@ static void early_declined_call(void) { linphone_call_ref(out_call); /*wait until flexisip transfers the busy...*/ - CU_ASSERT_TRUE(wait_for_until(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallError,1,33000)); - CU_ASSERT_EQUAL(pauline->stat.number_of_LinphoneCallError,1); + BC_ASSERT_TRUE(wait_for_until(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallError,1,33000)); + BC_ASSERT_EQUAL(pauline->stat.number_of_LinphoneCallError,1, int, "%d"); /* FIXME http://git.linphone.org/mantis/view.php?id=757 - CU_ASSERT_EQUAL(linphone_call_get_reason(out_call),LinphoneReasonBusy); + BC_ASSERT_EQUAL(linphone_call_get_reason(out_call),LinphoneReasonBusy, int, "%d"); */ if (ms_list_size(linphone_core_get_call_logs(pauline->lc))>0) { - CU_ASSERT_PTR_NOT_NULL(out_call_log=(LinphoneCallLog*)(linphone_core_get_call_logs(pauline->lc)->data)); - CU_ASSERT_EQUAL(linphone_call_log_get_status(out_call_log),LinphoneCallAborted); + BC_ASSERT_PTR_NOT_NULL(out_call_log=(LinphoneCallLog*)(linphone_core_get_call_logs(pauline->lc)->data)); + BC_ASSERT_EQUAL(linphone_call_log_get_status(out_call_log),LinphoneCallAborted, int, "%d"); } linphone_call_unref(out_call); linphone_core_manager_destroy(marie); @@ -914,10 +915,10 @@ static void call_busy_when_calling_self(void) { linphone_call_ref(out_call); /*wait until flexisip transfers the busy...*/ - CU_ASSERT_TRUE(wait_for_until(marie->lc,marie->lc,&marie->stat.number_of_LinphoneCallError,1,33000)); - CU_ASSERT_EQUAL(marie->stat.number_of_LinphoneCallError,1); + BC_ASSERT_TRUE(wait_for_until(marie->lc,marie->lc,&marie->stat.number_of_LinphoneCallError,1,33000)); + BC_ASSERT_EQUAL(marie->stat.number_of_LinphoneCallError,1, int, "%d"); - CU_ASSERT_EQUAL(linphone_call_get_reason(out_call),LinphoneReasonBusy); + BC_ASSERT_EQUAL(linphone_call_get_reason(out_call),LinphoneReasonBusy, int, "%d"); linphone_call_unref(out_call); linphone_core_manager_destroy(marie); } @@ -930,17 +931,17 @@ static void call_declined(void) { LinphoneCall* in_call; LinphoneCall* out_call = linphone_core_invite_address(pauline->lc,marie->identity); linphone_call_ref(out_call); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallIncomingReceived,1)); - CU_ASSERT_PTR_NOT_NULL(in_call=linphone_core_get_current_call(marie->lc)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallIncomingReceived,1)); + BC_ASSERT_PTR_NOT_NULL(in_call=linphone_core_get_current_call(marie->lc)); if (in_call) { linphone_call_ref(in_call); linphone_core_terminate_call(marie->lc,in_call); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallReleased,1)); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallReleased,1)); - CU_ASSERT_EQUAL(marie->stat.number_of_LinphoneCallEnd,1); - CU_ASSERT_EQUAL(pauline->stat.number_of_LinphoneCallEnd,1); - CU_ASSERT_EQUAL(linphone_call_get_reason(in_call),LinphoneReasonDeclined); - CU_ASSERT_EQUAL(linphone_call_get_reason(out_call),LinphoneReasonDeclined); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallReleased,1)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallReleased,1)); + BC_ASSERT_EQUAL(marie->stat.number_of_LinphoneCallEnd,1, int, "%d"); + BC_ASSERT_EQUAL(pauline->stat.number_of_LinphoneCallEnd,1, int, "%d"); + BC_ASSERT_EQUAL(linphone_call_get_reason(in_call),LinphoneReasonDeclined, int, "%d"); + BC_ASSERT_EQUAL(linphone_call_get_reason(out_call),LinphoneReasonDeclined, int, "%d"); linphone_call_unref(in_call); } linphone_call_unref(out_call); @@ -952,11 +953,11 @@ static void call_terminated_by_caller(void) { LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc"); - CU_ASSERT_TRUE(call(pauline,marie)); + BC_ASSERT_TRUE(call(pauline,marie)); /*just to sleep*/ linphone_core_terminate_all_calls(pauline->lc); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallEnd,1)); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallEnd,1)); + 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)); linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); @@ -968,11 +969,11 @@ static void call_with_no_sdp(void) { linphone_core_enable_sdp_200_ack(marie->lc,TRUE); - CU_ASSERT_TRUE(call(marie,pauline)); + BC_ASSERT_TRUE(call(marie,pauline)); /*just to sleep*/ linphone_core_terminate_all_calls(pauline->lc); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallEnd,1)); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallEnd,1)); + 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)); linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); @@ -986,13 +987,13 @@ static void call_with_no_sdp_ack_without_sdp(void){ linphone_core_enable_sdp_200_ack(marie->lc,TRUE); linphone_core_invite_address(marie->lc,pauline->identity); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallIncomingReceived,1)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallIncomingReceived,1)); call=linphone_core_get_current_call(pauline->lc); if (call){ sal_call_set_sdp_handling(call->op, SalOpSDPSimulateError); /*this will have the effect that the SDP received in the ACK will be ignored*/ linphone_core_accept_call(pauline->lc, call); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallError,1)); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallEnd,1)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallError,1)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallEnd,1)); } linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); @@ -1009,13 +1010,13 @@ static bool_t check_ice(LinphoneCoreManager* caller, LinphoneCoreManager* callee c1=linphone_core_get_current_call(caller->lc); c2=linphone_core_get_current_call(callee->lc); - CU_ASSERT_PTR_NOT_NULL(c1); - CU_ASSERT_PTR_NOT_NULL(c2); + BC_ASSERT_PTR_NOT_NULL(c1); + BC_ASSERT_PTR_NOT_NULL(c2); if (!c1 || !c2) return FALSE; linphone_call_ref(c1); linphone_call_ref(c2); - CU_ASSERT_EQUAL(linphone_call_params_video_enabled(linphone_call_get_current_params(c1)),linphone_call_params_video_enabled(linphone_call_get_current_params(c2))); + BC_ASSERT_EQUAL(linphone_call_params_video_enabled(linphone_call_get_current_params(c1)),linphone_call_params_video_enabled(linphone_call_get_current_params(c2)), int, "%d"); video_enabled=linphone_call_params_video_enabled(linphone_call_get_current_params(c1)); liblinphone_tester_clock_start(&ts); do{ @@ -1050,11 +1051,11 @@ static bool_t check_ice(LinphoneCoreManager* caller, LinphoneCoreManager* callee /*make sure encryption mode are preserved*/ if (c1) { const LinphoneCallParams* call_param = linphone_call_get_current_params(c1); - CU_ASSERT_EQUAL(linphone_call_params_get_media_encryption(call_param),linphone_core_get_media_encryption(caller->lc)); + BC_ASSERT_EQUAL(linphone_call_params_get_media_encryption(call_param),linphone_core_get_media_encryption(caller->lc), int, "%d"); } if (c2) { const LinphoneCallParams* call_param = linphone_call_get_current_params(c2); - CU_ASSERT_EQUAL(linphone_call_params_get_media_encryption(call_param),linphone_core_get_media_encryption(callee->lc)); + BC_ASSERT_EQUAL(linphone_call_params_get_media_encryption(call_param),linphone_core_get_media_encryption(callee->lc), int, "%d"); } linphone_call_unref(c1); linphone_call_unref(c2); @@ -1078,23 +1079,23 @@ static void _call_with_ice_base(LinphoneCoreManager* pauline,LinphoneCoreManager linphone_core_set_video_port(pauline->lc,-1); } - CU_ASSERT_TRUE((call_ok=call(pauline,marie))); + BC_ASSERT_TRUE((call_ok=call(pauline,marie))); if (!call_ok) goto end; if (callee_with_ice && caller_with_ice) { /*wait for the ICE reINVITE to complete*/ - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallStreamsRunning,2)); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallStreamsRunning,2)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallStreamsRunning,2)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallStreamsRunning,2)); - CU_ASSERT_TRUE(check_ice(pauline,marie,LinphoneIceStateHostConnection)); + BC_ASSERT_TRUE(check_ice(pauline,marie,LinphoneIceStateHostConnection)); } liblinphone_tester_check_rtcp(marie,pauline); /*then close the call*/ linphone_core_terminate_all_calls(pauline->lc); end: - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallEnd,1)); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallEnd,1)); + 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)); } static void _call_with_ice(bool_t caller_with_ice, bool_t callee_with_ice, bool_t random_ports) { @@ -1163,22 +1164,22 @@ static void call_with_custom_headers(void) { linphone_call_params_add_custom_header(params,"Weather","bad"); linphone_call_params_add_custom_header(params,"Working","yes"); - CU_ASSERT_TRUE(call_with_caller_params(pauline,marie,params)); + BC_ASSERT_TRUE(call_with_caller_params(pauline,marie,params)); linphone_call_params_destroy(params); call_marie=linphone_core_get_current_call(marie->lc); call_pauline=linphone_core_get_current_call(pauline->lc); - CU_ASSERT_PTR_NOT_NULL(call_marie); - CU_ASSERT_PTR_NOT_NULL(call_pauline); + BC_ASSERT_PTR_NOT_NULL(call_marie); + BC_ASSERT_PTR_NOT_NULL(call_pauline); marie_remote_params=linphone_call_get_remote_params(call_marie); hvalue=linphone_call_params_get_custom_header(marie_remote_params,"Weather"); - CU_ASSERT_PTR_NOT_NULL(hvalue); - CU_ASSERT_STRING_EQUAL(hvalue,"bad"); + BC_ASSERT_PTR_NOT_NULL(hvalue); + BC_ASSERT_STRING_EQUAL(hvalue,"bad"); hvalue=linphone_call_params_get_custom_header(marie_remote_params,"uriHeader"); - CU_ASSERT_PTR_NOT_NULL(hvalue); - CU_ASSERT_STRING_EQUAL(hvalue,"myUriHeader"); + BC_ASSERT_PTR_NOT_NULL(hvalue); + BC_ASSERT_STRING_EQUAL(hvalue,"myUriHeader"); // FIXME: we have to strdup because successive calls to get_remote_params erase the returned const char*!! @@ -1188,12 +1189,12 @@ static void call_with_custom_headers(void) { marie_remote_contact = ms_strdup(linphone_call_get_remote_contact(call_marie)); marie_remote_contact_header = ms_strdup(linphone_call_params_get_custom_header(linphone_call_get_remote_params(call_marie), "Contact")); - CU_ASSERT_PTR_NOT_NULL(pauline_remote_contact); - CU_ASSERT_PTR_NOT_NULL(pauline_remote_contact_header); - CU_ASSERT_PTR_NOT_NULL(marie_remote_contact); - CU_ASSERT_PTR_NOT_NULL(marie_remote_contact_header); - CU_ASSERT_STRING_EQUAL(pauline_remote_contact,pauline_remote_contact_header); - CU_ASSERT_STRING_EQUAL(marie_remote_contact,marie_remote_contact_header); + BC_ASSERT_PTR_NOT_NULL(pauline_remote_contact); + BC_ASSERT_PTR_NOT_NULL(pauline_remote_contact_header); + BC_ASSERT_PTR_NOT_NULL(marie_remote_contact); + BC_ASSERT_PTR_NOT_NULL(marie_remote_contact_header); + BC_ASSERT_STRING_EQUAL(pauline_remote_contact,pauline_remote_contact_header); + BC_ASSERT_STRING_EQUAL(marie_remote_contact,marie_remote_contact_header); ms_free(pauline_remote_contact); ms_free(pauline_remote_contact_header); @@ -1203,8 +1204,8 @@ static void call_with_custom_headers(void) { /*just to sleep*/ linphone_core_terminate_all_calls(pauline->lc); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallEnd,1)); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallEnd,1)); + 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)); linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); @@ -1219,7 +1220,7 @@ void call_paused_resumed_base(bool_t multicast) { linphone_core_enable_audio_multicast(pauline->lc,multicast); - CU_ASSERT_TRUE((call_ok=call(pauline,marie))); + BC_ASSERT_TRUE((call_ok=call(pauline,marie))); if (!call_ok) goto end; @@ -1228,28 +1229,28 @@ void call_paused_resumed_base(bool_t multicast) { wait_for_until(pauline->lc, marie->lc, NULL, 5, 3000); linphone_core_pause_call(pauline->lc,call_pauline); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallPausing,1)); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallPausedByRemote,1)); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallPaused,1)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallPausing,1)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallPausedByRemote,1)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallPaused,1)); /*stay in pause a little while in order to generate traffic*/ wait_for_until(pauline->lc, marie->lc, NULL, 5, 2000); linphone_core_resume_call(pauline->lc,call_pauline); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallStreamsRunning,2)); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallStreamsRunning,2)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallStreamsRunning,2)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallStreamsRunning,2)); /*same here: wait a while for a bit of a traffic, we need to receive a RTCP packet*/ wait_for_until(pauline->lc, marie->lc, NULL, 5, 5000); /*since RTCP streams are reset when call is paused/resumed, there should be no loss at all*/ stats = rtp_session_get_stats(call_pauline->sessions->rtp_session); - CU_ASSERT_EQUAL(stats->cum_packet_loss, 0); + BC_ASSERT_EQUAL(stats->cum_packet_loss, 0, int, "%d"); /*just to sleep*/ linphone_core_terminate_all_calls(pauline->lc); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallEnd,1)); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallEnd,1)); + 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: linphone_core_manager_destroy(marie); @@ -1261,11 +1262,11 @@ static void call_paused_resumed(void) { #define CHECK_CURRENT_LOSS_RATE() \ rtcp_count_current = pauline->stat.number_of_rtcp_sent; \ /*wait for an RTCP packet to have an accurate cumulative lost value*/ \ - CU_ASSERT_TRUE(wait_for_until(pauline->lc, marie->lc, &pauline->stat.number_of_rtcp_sent, rtcp_count_current+1, 10000)); \ + BC_ASSERT_TRUE(wait_for_until(pauline->lc, marie->lc, &pauline->stat.number_of_rtcp_sent, rtcp_count_current+1, 10000)); \ stats = rtp_session_get_stats(call_pauline->audiostream->ms.sessions.rtp_session); \ loss_percentage = stats->cum_packet_loss * 100.f / (stats->packet_recv + stats->cum_packet_loss); \ - CU_ASSERT_TRUE(.75 * params.loss_rate < loss_percentage); \ - CU_ASSERT_TRUE(loss_percentage < 1.25 * params.loss_rate) + BC_ASSERT_TRUE(.75 * params.loss_rate < loss_percentage); \ + BC_ASSERT_TRUE(loss_percentage < 1.25 * params.loss_rate) static void call_paused_resumed_with_loss(void) { LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); @@ -1279,7 +1280,7 @@ static void call_paused_resumed_with_loss(void) { params.enabled=TRUE; params.loss_rate=20; - CU_ASSERT_TRUE(call(pauline,marie)); + BC_ASSERT_TRUE(call(pauline,marie)); call_pauline = linphone_core_get_current_call(pauline->lc); if (call_pauline){ rtp_session_enable_network_simulation(call_pauline->audiostream->ms.sessions.rtp_session,¶ms); @@ -1290,25 +1291,25 @@ static void call_paused_resumed_with_loss(void) { /*pause call*/ linphone_core_pause_call(pauline->lc,call_pauline); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallPausing,1)); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallPausedByRemote,1)); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallPaused,1)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallPausing,1)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallPausedByRemote,1)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallPaused,1)); /*stay in pause a little while in order to generate traffic*/ wait_for_until(pauline->lc, marie->lc, NULL, 5, 5000); CHECK_CURRENT_LOSS_RATE(); /*resume*/ linphone_core_resume_call(pauline->lc,call_pauline); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallStreamsRunning,2)); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallStreamsRunning,2)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallStreamsRunning,2)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallStreamsRunning,2)); wait_for_until(pauline->lc, marie->lc, NULL, 5, 6000); /*since stats are NOT totally reset during pause, the stats->packet_recv is computed from the start of call. This test ensures that the loss rate is consistent during the entire call.*/ CHECK_CURRENT_LOSS_RATE(); linphone_core_terminate_all_calls(marie->lc); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallEnd,1)); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallEnd,1)); + 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)); } linphone_core_manager_destroy(marie); @@ -1319,11 +1320,11 @@ bool_t pause_call_1(LinphoneCoreManager* mgr_1,LinphoneCall* call_1,LinphoneCore stats initial_call_stat_1=mgr_1->stat; stats initial_call_stat_2=mgr_2->stat; linphone_core_pause_call(mgr_1->lc,call_1); - CU_ASSERT_TRUE(wait_for(mgr_1->lc,mgr_2->lc,&mgr_1->stat.number_of_LinphoneCallPausing,initial_call_stat_1.number_of_LinphoneCallPausing+1)); - CU_ASSERT_TRUE(wait_for(mgr_1->lc,mgr_2->lc,&mgr_1->stat.number_of_LinphoneCallPaused,initial_call_stat_1.number_of_LinphoneCallPaused+1)); - CU_ASSERT_TRUE(wait_for(mgr_1->lc,mgr_2->lc,&mgr_2->stat.number_of_LinphoneCallPausedByRemote,initial_call_stat_2.number_of_LinphoneCallPausedByRemote+1)); - CU_ASSERT_EQUAL(linphone_call_get_state(call_1),LinphoneCallPaused); - CU_ASSERT_EQUAL(linphone_call_get_state(call_2),LinphoneCallPausedByRemote); + BC_ASSERT_TRUE(wait_for(mgr_1->lc,mgr_2->lc,&mgr_1->stat.number_of_LinphoneCallPausing,initial_call_stat_1.number_of_LinphoneCallPausing+1)); + BC_ASSERT_TRUE(wait_for(mgr_1->lc,mgr_2->lc,&mgr_1->stat.number_of_LinphoneCallPaused,initial_call_stat_1.number_of_LinphoneCallPaused+1)); + BC_ASSERT_TRUE(wait_for(mgr_1->lc,mgr_2->lc,&mgr_2->stat.number_of_LinphoneCallPausedByRemote,initial_call_stat_2.number_of_LinphoneCallPausedByRemote+1)); + BC_ASSERT_EQUAL(linphone_call_get_state(call_1),LinphoneCallPaused, int, "%d"); + BC_ASSERT_EQUAL(linphone_call_get_state(call_2),LinphoneCallPausedByRemote, int, "%d"); return linphone_call_get_state(call_1) == LinphoneCallPaused && linphone_call_get_state(call_2)==LinphoneCallPausedByRemote; } #if 0 @@ -1334,37 +1335,37 @@ void concurrent_paused_resumed_base() { const rtp_stats_t * stats; - CU_ASSERT_TRUE(call(pauline,marie)); + BC_ASSERT_TRUE(call(pauline,marie)); call_pauline = linphone_core_get_current_call(pauline->lc); call_marie = linphone_core_get_current_call(marie->lc); linphone_core_pause_call(pauline->lc,call_pauline); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallPausing,1)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallPausing,1)); linphone_core_pause_call(marie->lc,call_marie); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallPausedByRemote,1)); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallPaused,1)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallPausedByRemote,1)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallPaused,1)); /*stay in pause a little while in order to generate traffic*/ wait_for_until(pauline->lc, marie->lc, NULL, 5, 2000); linphone_core_resume_call(pauline->lc,call_pauline); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallStreamsRunning,2)); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallStreamsRunning,2)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallStreamsRunning,2)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallStreamsRunning,2)); /*same here: wait a while for a bit of a traffic, we need to receive a RTCP packet*/ wait_for_until(pauline->lc, marie->lc, NULL, 5, 5000); /*since RTCP streams are reset when call is paused/resumed, there should be no loss at all*/ stats = rtp_session_get_stats(call_pauline->sessions->rtp_session); - CU_ASSERT_EQUAL(stats->cum_packet_loss, 0); + BC_ASSERT_EQUAL(stats->cum_packet_loss, 0, int, "%d"); /*just to sleep*/ linphone_core_terminate_all_calls(pauline->lc); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallEnd,1)); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallEnd,1)); + 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)); linphone_core_manager_destroy(marie); @@ -1378,32 +1379,32 @@ static void call_paused_resumed_from_callee(void) { const rtp_stats_t * stats; bool_t call_ok; - CU_ASSERT_TRUE((call_ok=call(pauline,marie))); + BC_ASSERT_TRUE((call_ok=call(pauline,marie))); if (!call_ok) goto end; call_marie = linphone_core_get_current_call(marie->lc); linphone_core_pause_call(marie->lc,call_marie); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallPausing,1)); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallPausedByRemote,1)); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallPaused,1)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallPausing,1)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallPausedByRemote,1)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallPaused,1)); /*stay in pause a little while in order to generate traffic*/ wait_for_until(pauline->lc, marie->lc, NULL, 5, 2000); linphone_core_resume_call(marie->lc,call_marie); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallStreamsRunning,2)); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallStreamsRunning,2)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallStreamsRunning,2)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallStreamsRunning,2)); /*same here: wait a while for a bit of a traffic, we need to receive a RTCP packet*/ wait_for_until(pauline->lc, marie->lc, NULL, 5, 5000); /*since RTCP streams are reset when call is paused/resumed, there should be no loss at all*/ stats = rtp_session_get_stats(call_marie->sessions->rtp_session); - CU_ASSERT_EQUAL(stats->cum_packet_loss, 0); + BC_ASSERT_EQUAL(stats->cum_packet_loss, 0, int, "%d"); /*just to sleep*/ linphone_core_terminate_all_calls(pauline->lc); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallEnd,1)); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallEnd,1)); + 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: linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); @@ -1421,12 +1422,12 @@ static void audio_call_with_ice_no_matching_audio_codecs(void) { out_call = linphone_core_invite_address(marie->lc, pauline->identity); linphone_call_ref(out_call); - CU_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &marie->stat.number_of_LinphoneCallOutgoingInit, 1)); + BC_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &marie->stat.number_of_LinphoneCallOutgoingInit, 1)); /* flexisip will retain the 488 until the "urgent reply" timeout arrives. */ - CU_ASSERT_TRUE(wait_for_until(marie->lc, pauline->lc, &marie->stat.number_of_LinphoneCallError, 1, 6000)); - CU_ASSERT_EQUAL(linphone_call_get_reason(out_call), LinphoneReasonNotAcceptable); - CU_ASSERT_EQUAL(pauline->stat.number_of_LinphoneCallIncomingReceived, 0); + BC_ASSERT_TRUE(wait_for_until(marie->lc, pauline->lc, &marie->stat.number_of_LinphoneCallError, 1, 6000)); + BC_ASSERT_EQUAL(linphone_call_get_reason(out_call), LinphoneReasonNotAcceptable, int, "%d"); + BC_ASSERT_EQUAL(pauline->stat.number_of_LinphoneCallIncomingReceived, 0, int, "%d"); linphone_call_unref(out_call); linphone_core_manager_destroy(marie); @@ -1470,18 +1471,18 @@ bool_t add_video(LinphoneCoreManager* caller,LinphoneCoreManager* callee, bool_t const LinphoneVideoPolicy *video_policy; LinphoneCall *call_obj; if ((call_obj=setup_video(caller, callee, change_video_policy))){ - CU_ASSERT_TRUE(wait_for(caller->lc,callee->lc,&caller->stat.number_of_LinphoneCallUpdatedByRemote,initial_caller_stat.number_of_LinphoneCallUpdatedByRemote+1)); - CU_ASSERT_TRUE(wait_for(caller->lc,callee->lc,&callee->stat.number_of_LinphoneCallUpdating,initial_callee_stat.number_of_LinphoneCallUpdating+1)); - CU_ASSERT_TRUE(wait_for(caller->lc,callee->lc,&callee->stat.number_of_LinphoneCallStreamsRunning,initial_callee_stat.number_of_LinphoneCallStreamsRunning+1)); - CU_ASSERT_TRUE(wait_for(caller->lc,callee->lc,&caller->stat.number_of_LinphoneCallStreamsRunning,initial_caller_stat.number_of_LinphoneCallStreamsRunning+1)); + BC_ASSERT_TRUE(wait_for(caller->lc,callee->lc,&caller->stat.number_of_LinphoneCallUpdatedByRemote,initial_caller_stat.number_of_LinphoneCallUpdatedByRemote+1)); + BC_ASSERT_TRUE(wait_for(caller->lc,callee->lc,&callee->stat.number_of_LinphoneCallUpdating,initial_callee_stat.number_of_LinphoneCallUpdating+1)); + BC_ASSERT_TRUE(wait_for(caller->lc,callee->lc,&callee->stat.number_of_LinphoneCallStreamsRunning,initial_callee_stat.number_of_LinphoneCallStreamsRunning+1)); + BC_ASSERT_TRUE(wait_for(caller->lc,callee->lc,&caller->stat.number_of_LinphoneCallStreamsRunning,initial_caller_stat.number_of_LinphoneCallStreamsRunning+1)); video_policy = linphone_core_get_video_policy(caller->lc); if (video_policy->automatically_accept) { - CU_ASSERT_TRUE(linphone_call_params_video_enabled(linphone_call_get_current_params(linphone_core_get_current_call(callee->lc)))); - CU_ASSERT_TRUE(linphone_call_params_video_enabled(linphone_call_get_current_params(linphone_core_get_current_call(caller->lc)))); + BC_ASSERT_TRUE(linphone_call_params_video_enabled(linphone_call_get_current_params(linphone_core_get_current_call(callee->lc)))); + BC_ASSERT_TRUE(linphone_call_params_video_enabled(linphone_call_get_current_params(linphone_core_get_current_call(caller->lc)))); } else { - CU_ASSERT_FALSE(linphone_call_params_video_enabled(linphone_call_get_current_params(linphone_core_get_current_call(callee->lc)))); - CU_ASSERT_FALSE(linphone_call_params_video_enabled(linphone_call_get_current_params(linphone_core_get_current_call(caller->lc)))); + BC_ASSERT_FALSE(linphone_call_params_video_enabled(linphone_call_get_current_params(linphone_core_get_current_call(callee->lc)))); + BC_ASSERT_FALSE(linphone_call_params_video_enabled(linphone_call_get_current_params(linphone_core_get_current_call(caller->lc)))); } if (linphone_core_get_media_encryption(caller->lc) != LinphoneMediaEncryptionNone && linphone_core_get_media_encryption(callee->lc) != LinphoneMediaEncryptionNone) { @@ -1508,9 +1509,9 @@ bool_t add_video(LinphoneCoreManager* caller,LinphoneCoreManager* callee, bool_t } call_param = linphone_call_get_current_params(linphone_core_get_current_call(callee->lc)); - CU_ASSERT_EQUAL(linphone_call_params_get_media_encryption(call_param),linphone_core_get_media_encryption(caller->lc)); + BC_ASSERT_EQUAL(linphone_call_params_get_media_encryption(call_param),linphone_core_get_media_encryption(caller->lc), int, "%d"); call_param = linphone_call_get_current_params(linphone_core_get_current_call(caller->lc)); - CU_ASSERT_EQUAL(linphone_call_params_get_media_encryption(call_param),linphone_core_get_media_encryption(caller->lc)); + BC_ASSERT_EQUAL(linphone_call_params_get_media_encryption(call_param),linphone_core_get_media_encryption(caller->lc), int, "%d"); } @@ -1547,13 +1548,13 @@ static bool_t remove_video(LinphoneCoreManager *caller, LinphoneCoreManager *cal linphone_call_params_enable_video(callee_params, FALSE); linphone_core_update_call(callee->lc, call_obj, callee_params); - CU_ASSERT_TRUE(wait_for(caller->lc, callee->lc, &caller->stat.number_of_LinphoneCallUpdatedByRemote, initial_caller_stat.number_of_LinphoneCallUpdatedByRemote + 1)); - CU_ASSERT_TRUE(wait_for(caller->lc, callee->lc, &callee->stat.number_of_LinphoneCallUpdating, initial_callee_stat.number_of_LinphoneCallUpdating + 1)); - CU_ASSERT_TRUE(wait_for(caller->lc, callee->lc, &callee->stat.number_of_LinphoneCallStreamsRunning, initial_callee_stat.number_of_LinphoneCallStreamsRunning + 1)); - CU_ASSERT_TRUE(wait_for(caller->lc, callee->lc, &caller->stat.number_of_LinphoneCallStreamsRunning, initial_caller_stat.number_of_LinphoneCallStreamsRunning + 1)); + BC_ASSERT_TRUE(wait_for(caller->lc, callee->lc, &caller->stat.number_of_LinphoneCallUpdatedByRemote, initial_caller_stat.number_of_LinphoneCallUpdatedByRemote + 1)); + BC_ASSERT_TRUE(wait_for(caller->lc, callee->lc, &callee->stat.number_of_LinphoneCallUpdating, initial_callee_stat.number_of_LinphoneCallUpdating + 1)); + BC_ASSERT_TRUE(wait_for(caller->lc, callee->lc, &callee->stat.number_of_LinphoneCallStreamsRunning, initial_callee_stat.number_of_LinphoneCallStreamsRunning + 1)); + BC_ASSERT_TRUE(wait_for(caller->lc, callee->lc, &caller->stat.number_of_LinphoneCallStreamsRunning, initial_caller_stat.number_of_LinphoneCallStreamsRunning + 1)); - CU_ASSERT_FALSE(linphone_call_params_video_enabled(linphone_call_get_current_params(linphone_core_get_current_call(callee->lc)))); - CU_ASSERT_FALSE(linphone_call_params_video_enabled(linphone_call_get_current_params(linphone_core_get_current_call(caller->lc)))); + BC_ASSERT_FALSE(linphone_call_params_video_enabled(linphone_call_get_current_params(linphone_core_get_current_call(callee->lc)))); + BC_ASSERT_FALSE(linphone_call_params_video_enabled(linphone_call_get_current_params(linphone_core_get_current_call(caller->lc)))); return TRUE; } @@ -1565,14 +1566,14 @@ static void call_with_video_added(void) { LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc"); bool_t call_ok; - CU_ASSERT_TRUE((call_ok=call(pauline,marie))); + BC_ASSERT_TRUE((call_ok=call(pauline,marie))); if (!call_ok) goto end; - CU_ASSERT_TRUE(add_video(pauline,marie, TRUE)); + BC_ASSERT_TRUE(add_video(pauline,marie, TRUE)); /*just to sleep*/ linphone_core_terminate_all_calls(pauline->lc); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallEnd,1)); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallEnd,1)); + 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: linphone_core_manager_destroy(marie); @@ -1592,14 +1593,14 @@ static void call_with_video_added_2(void) { linphone_core_enable_video_capture(marie->lc, TRUE); linphone_core_enable_video_display(marie->lc, FALSE); - CU_ASSERT_TRUE(call_ok=call(pauline,marie)); + BC_ASSERT_TRUE(call_ok=call(pauline,marie)); if (!call_ok) goto end; - CU_ASSERT_TRUE(add_video(marie,pauline, TRUE)); + BC_ASSERT_TRUE(add_video(marie,pauline, TRUE)); /*just to sleep*/ linphone_core_terminate_all_calls(pauline->lc); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallEnd,1)); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallEnd,1)); + 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: linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); @@ -1615,14 +1616,14 @@ static void call_with_video_added_random_ports(void) { linphone_core_set_audio_port(pauline->lc,-1); linphone_core_set_video_port(pauline->lc,-1); - CU_ASSERT_TRUE(call_ok=call(pauline,marie)); + BC_ASSERT_TRUE(call_ok=call(pauline,marie)); if (!call_ok) goto end; - CU_ASSERT_TRUE(add_video(pauline,marie, TRUE)); + BC_ASSERT_TRUE(add_video(pauline,marie, TRUE)); /*just to sleep*/ linphone_core_terminate_all_calls(pauline->lc); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallEnd,1)); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallEnd,1)); + 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: linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); @@ -1633,20 +1634,20 @@ static void call_with_several_video_switches(void) { LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc"); bool_t call_ok; - CU_ASSERT_TRUE(call_ok=call(pauline,marie)); + BC_ASSERT_TRUE(call_ok=call(pauline,marie)); if (!call_ok) goto end; - CU_ASSERT_TRUE(add_video(pauline,marie, TRUE)); + BC_ASSERT_TRUE(add_video(pauline,marie, TRUE)); wait_for_until(pauline->lc,marie->lc,&dummy,1,1000); /* Wait for VFU request exchanges to be finished. */ - CU_ASSERT_TRUE(remove_video(pauline,marie)); - CU_ASSERT_TRUE(add_video(pauline,marie, TRUE)); + BC_ASSERT_TRUE(remove_video(pauline,marie)); + BC_ASSERT_TRUE(add_video(pauline,marie, TRUE)); wait_for_until(pauline->lc,marie->lc,&dummy,1,1000); /* Wait for VFU request exchanges to be finished. */ - CU_ASSERT_TRUE(remove_video(pauline,marie)); + BC_ASSERT_TRUE(remove_video(pauline,marie)); /*just to sleep*/ linphone_core_terminate_all_calls(pauline->lc); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallEnd,1)); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallEnd,1)); + 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: linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); @@ -1662,19 +1663,19 @@ static void srtp_call_with_several_video_switches(void) { linphone_core_set_media_encryption(marie->lc, LinphoneMediaEncryptionSRTP); linphone_core_set_media_encryption(pauline->lc, LinphoneMediaEncryptionSRTP); - CU_ASSERT_TRUE(call_ok=call(pauline,marie)); + BC_ASSERT_TRUE(call_ok=call(pauline,marie)); if (!call_ok) goto end; - CU_ASSERT_TRUE(add_video(pauline,marie, TRUE)); + BC_ASSERT_TRUE(add_video(pauline,marie, TRUE)); wait_for_until(pauline->lc,marie->lc,&dummy,1,1000); /* Wait for VFU request exchanges to be finished. */ - CU_ASSERT_TRUE(remove_video(pauline,marie)); - CU_ASSERT_TRUE(add_video(pauline,marie, TRUE)); + BC_ASSERT_TRUE(remove_video(pauline,marie)); + BC_ASSERT_TRUE(add_video(pauline,marie, TRUE)); wait_for_until(pauline->lc,marie->lc,&dummy,1,1000); /* Wait for VFU request exchanges to be finished. */ - CU_ASSERT_TRUE(remove_video(pauline,marie)); + BC_ASSERT_TRUE(remove_video(pauline,marie)); /*just to sleep*/ linphone_core_terminate_all_calls(pauline->lc); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallEnd,1)); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallEnd,1)); + 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)); } else { ms_warning("Not tested because SRTP is not available."); } @@ -1716,7 +1717,7 @@ static void call_with_declined_video_base(bool_t using_policy) { linphone_call_params_enable_video(callee_test_params.base,FALSE); } - CU_ASSERT_TRUE((call_ok=call_with_params2(pauline,marie,&caller_test_params,&callee_test_params,using_policy))); + BC_ASSERT_TRUE((call_ok=call_with_params2(pauline,marie,&caller_test_params,&callee_test_params,using_policy))); if (!call_ok) goto end; linphone_call_params_destroy(caller_test_params.base); @@ -1724,13 +1725,13 @@ static void call_with_declined_video_base(bool_t using_policy) { marie_call=linphone_core_get_current_call(marie->lc); pauline_call=linphone_core_get_current_call(pauline->lc); - CU_ASSERT_FALSE(linphone_call_log_video_enabled(linphone_call_get_call_log(marie_call))); - CU_ASSERT_FALSE(linphone_call_log_video_enabled(linphone_call_get_call_log(pauline_call))); + 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))); linphone_core_terminate_all_calls(pauline->lc); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallEnd,1)); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallEnd,1)); + 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: linphone_core_manager_destroy(marie); @@ -1795,7 +1796,7 @@ static void video_call_base_2(LinphoneCoreManager* pauline,LinphoneCoreManager* linphone_call_params_enable_video(callee_test_params.base,TRUE); } - CU_ASSERT_TRUE(call_with_params2(pauline,marie,&caller_test_params,&callee_test_params,using_policy)); + BC_ASSERT_TRUE(call_with_params2(pauline,marie,&caller_test_params,&callee_test_params,using_policy)); marie_call=linphone_core_get_current_call(marie->lc); pauline_call=linphone_core_get_current_call(pauline->lc); @@ -1804,16 +1805,16 @@ static void video_call_base_2(LinphoneCoreManager* pauline,LinphoneCoreManager* if (marie_call && pauline_call ) { if (callee_video_enabled && caller_video_enabled) { - CU_ASSERT_TRUE(linphone_call_log_video_enabled(linphone_call_get_call_log(marie_call))); - CU_ASSERT_TRUE(linphone_call_log_video_enabled(linphone_call_get_call_log(pauline_call))); + BC_ASSERT_TRUE(linphone_call_log_video_enabled(linphone_call_get_call_log(marie_call))); + BC_ASSERT_TRUE(linphone_call_log_video_enabled(linphone_call_get_call_log(pauline_call))); /*check video path*/ linphone_call_set_next_video_frame_decoded_callback(marie_call,linphone_call_cb,marie->lc); linphone_call_send_vfu_request(marie_call); - CU_ASSERT_TRUE( wait_for(marie->lc,pauline->lc,&marie->stat.number_of_IframeDecoded,1)); + BC_ASSERT_TRUE( wait_for(marie->lc,pauline->lc,&marie->stat.number_of_IframeDecoded,1)); } else { - CU_ASSERT_FALSE(linphone_call_log_video_enabled(linphone_call_get_call_log(marie_call))); - CU_ASSERT_FALSE(linphone_call_log_video_enabled(linphone_call_get_call_log(pauline_call))); + 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); @@ -1824,8 +1825,8 @@ static void video_call_base_2(LinphoneCoreManager* pauline,LinphoneCoreManager* 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); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallEnd,1)); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallEnd,1)); + 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)); } static void video_call(void) { LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); @@ -1920,30 +1921,30 @@ static void _call_with_ice_video(LinphoneVideoPolicy caller_policy, LinphoneVide linphone_core_set_audio_port(pauline->lc, -1); linphone_core_set_video_port(pauline->lc, -1); - CU_ASSERT_TRUE(call_ok = call(pauline, marie)); + BC_ASSERT_TRUE(call_ok = call(pauline, marie)); if (!call_ok) goto end; - CU_ASSERT_TRUE(check_ice(pauline, marie, LinphoneIceStateHostConnection)); + BC_ASSERT_TRUE(check_ice(pauline, marie, LinphoneIceStateHostConnection)); /* Wait for ICE reINVITEs to complete. */ - CU_ASSERT_TRUE(wait_for(pauline->lc, marie->lc, &pauline->stat.number_of_LinphoneCallStreamsRunning, 2) + BC_ASSERT_TRUE(wait_for(pauline->lc, marie->lc, &pauline->stat.number_of_LinphoneCallStreamsRunning, 2) && wait_for(pauline->lc, pauline->lc, &marie->stat.number_of_LinphoneCallStreamsRunning, 2)); if (video_added_by_caller) { - CU_ASSERT_TRUE(add_video(marie, pauline, FALSE)); + BC_ASSERT_TRUE(add_video(marie, pauline, FALSE)); } else if (video_added_by_callee) { - CU_ASSERT_TRUE(add_video(pauline, marie, FALSE)); + BC_ASSERT_TRUE(add_video(pauline, marie, FALSE)); } if (video_added_by_caller || video_added_by_callee) { - CU_ASSERT_TRUE(check_ice(pauline, marie, LinphoneIceStateHostConnection)); + BC_ASSERT_TRUE(check_ice(pauline, marie, LinphoneIceStateHostConnection)); } if (video_removed_by_caller) { - CU_ASSERT_TRUE(remove_video(marie, pauline)); + BC_ASSERT_TRUE(remove_video(marie, pauline)); } else if (video_removed_by_callee) { - CU_ASSERT_TRUE(remove_video(pauline, marie)); + BC_ASSERT_TRUE(remove_video(pauline, marie)); } if (video_removed_by_caller || video_removed_by_callee) { - CU_ASSERT_TRUE(check_ice(pauline, marie, LinphoneIceStateHostConnection)); + BC_ASSERT_TRUE(check_ice(pauline, marie, LinphoneIceStateHostConnection)); } end: @@ -1994,32 +1995,32 @@ static void video_call_with_early_media_no_matching_audio_codecs(void) { out_call = linphone_core_invite_address(marie->lc, pauline->identity); linphone_call_ref(out_call); - CU_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &marie->stat.number_of_LinphoneCallOutgoingInit, 1)); - CU_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &pauline->stat.number_of_LinphoneCallIncomingReceived, 1)); - CU_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &marie->stat.number_of_LinphoneCallOutgoingRinging, 1)); + BC_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &marie->stat.number_of_LinphoneCallOutgoingInit, 1)); + BC_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &pauline->stat.number_of_LinphoneCallIncomingReceived, 1)); + BC_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &marie->stat.number_of_LinphoneCallOutgoingRinging, 1)); pauline_call = linphone_core_get_current_call(pauline->lc); if (!pauline_call) goto end; linphone_core_accept_early_media(pauline->lc, pauline_call); - CU_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &pauline->stat.number_of_LinphoneCallIncomingEarlyMedia, 1)); - CU_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &marie->stat.number_of_LinphoneCallOutgoingEarlyMedia, 1)); + BC_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &pauline->stat.number_of_LinphoneCallIncomingEarlyMedia, 1)); + BC_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &marie->stat.number_of_LinphoneCallOutgoingEarlyMedia, 1)); /*audio stream shall not have been requested to start*/ - CU_ASSERT_PTR_NULL(pauline_call->audiostream->soundread); + BC_ASSERT_PTR_NULL(pauline_call->audiostream->soundread); - CU_ASSERT_TRUE(linphone_call_params_video_enabled(linphone_call_get_current_params(out_call))==TRUE); - CU_ASSERT_TRUE(linphone_call_params_video_enabled(linphone_call_get_current_params(pauline_call))==TRUE); + BC_ASSERT_TRUE(linphone_call_params_video_enabled(linphone_call_get_current_params(out_call))==TRUE); + BC_ASSERT_TRUE(linphone_call_params_video_enabled(linphone_call_get_current_params(pauline_call))==TRUE); linphone_core_accept_call(pauline->lc, pauline_call); - CU_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &pauline->stat.number_of_LinphoneCallStreamsRunning, 1)); - CU_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &marie->stat.number_of_LinphoneCallStreamsRunning, 1)); + BC_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &pauline->stat.number_of_LinphoneCallStreamsRunning, 1)); + BC_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &marie->stat.number_of_LinphoneCallStreamsRunning, 1)); linphone_core_terminate_call(marie->lc, out_call); - CU_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &pauline->stat.number_of_LinphoneCallEnd, 1)); - CU_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &marie->stat.number_of_LinphoneCallEnd, 1)); + BC_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &pauline->stat.number_of_LinphoneCallEnd, 1)); + BC_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &marie->stat.number_of_LinphoneCallEnd, 1)); end: linphone_call_unref(out_call); @@ -2036,8 +2037,8 @@ static void video_call_limited_bandwidth(void) { /*just to sleep*/ linphone_core_terminate_all_calls(pauline->lc); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallEnd,1)); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallEnd,1)); + 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)); linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); @@ -2060,18 +2061,18 @@ static void _call_with_media_relay(bool_t random_ports) { linphone_core_set_video_port(pauline->lc,-1); } - CU_ASSERT_TRUE(call_ok=call(pauline,marie)); + BC_ASSERT_TRUE(call_ok=call(pauline,marie)); if (!call_ok) goto end; liblinphone_tester_check_rtcp(pauline,marie); #ifdef VIDEO_ENABLED - CU_ASSERT_TRUE(add_video(pauline,marie, TRUE)); + BC_ASSERT_TRUE(add_video(pauline,marie, TRUE)); liblinphone_tester_check_rtcp(pauline,marie); #endif /*just to sleep*/ linphone_core_terminate_all_calls(pauline->lc); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallEnd,1)); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallEnd,1)); + 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: linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); @@ -2094,51 +2095,51 @@ static void call_with_privacy(void) { params=linphone_core_create_default_call_parameters(pauline->lc); linphone_call_params_set_privacy(params,LinphonePrivacyId); - CU_ASSERT_TRUE(call_with_caller_params(pauline,marie,params)); + BC_ASSERT_TRUE(call_with_caller_params(pauline,marie,params)); linphone_call_params_destroy(params); c1=linphone_core_get_current_call(pauline->lc); c2=linphone_core_get_current_call(marie->lc); - CU_ASSERT_PTR_NOT_NULL(c1); - CU_ASSERT_PTR_NOT_NULL(c2); + BC_ASSERT_PTR_NOT_NULL(c1); + BC_ASSERT_PTR_NOT_NULL(c2); if (c1 && c2){ /*make sure local identity is unchanged*/ - CU_ASSERT_TRUE(linphone_address_weak_equal(linphone_call_log_get_from(linphone_call_get_call_log(c1)),pauline->identity)); + BC_ASSERT_TRUE(linphone_address_weak_equal(linphone_call_log_get_from(linphone_call_get_call_log(c1)),pauline->identity)); /*make sure remote identity is hidden*/ - CU_ASSERT_FALSE(linphone_address_weak_equal(linphone_call_get_remote_address(c2),pauline->identity)); + BC_ASSERT_FALSE(linphone_address_weak_equal(linphone_call_get_remote_address(c2),pauline->identity)); - CU_ASSERT_EQUAL(linphone_call_params_get_privacy(linphone_call_get_current_params(c2)),LinphonePrivacyId); + BC_ASSERT_EQUAL(linphone_call_params_get_privacy(linphone_call_get_current_params(c2)),LinphonePrivacyId, int, "%d"); } /*just to sleep*/ linphone_core_terminate_all_calls(pauline->lc); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallEnd,1)); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallEnd,1)); + 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)); /*test proxy config privacy*/ linphone_core_get_default_proxy(pauline->lc,&pauline_proxy); linphone_proxy_config_set_privacy(pauline_proxy,LinphonePrivacyId); - CU_ASSERT_TRUE(call(pauline,marie)); + BC_ASSERT_TRUE(call(pauline,marie)); c1=linphone_core_get_current_call(pauline->lc); c2=linphone_core_get_current_call(marie->lc); - CU_ASSERT_PTR_NOT_NULL(c1); - CU_ASSERT_PTR_NOT_NULL(c2); + BC_ASSERT_PTR_NOT_NULL(c1); + BC_ASSERT_PTR_NOT_NULL(c2); if (c1 && c2){ /*make sure remote identity is hidden*/ - CU_ASSERT_FALSE(linphone_address_weak_equal(linphone_call_get_remote_address(c2),pauline->identity)); + BC_ASSERT_FALSE(linphone_address_weak_equal(linphone_call_get_remote_address(c2),pauline->identity)); - CU_ASSERT_EQUAL(linphone_call_params_get_privacy(linphone_call_get_current_params(c2)),LinphonePrivacyId); + BC_ASSERT_EQUAL(linphone_call_params_get_privacy(linphone_call_get_current_params(c2)),LinphonePrivacyId, int, "%d"); } /*just to sleep*/ linphone_core_terminate_all_calls(pauline->lc); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallEnd,2)); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallEnd,2)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallEnd,2)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallEnd,2)); linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); @@ -2159,47 +2160,47 @@ static void call_with_privacy2(void) { linphone_proxy_config_enable_register(pauline_proxy,FALSE); linphone_proxy_config_done(pauline_proxy); - CU_ASSERT_TRUE(call_with_caller_params(pauline,marie,params)); + BC_ASSERT_TRUE(call_with_caller_params(pauline,marie,params)); linphone_call_params_destroy(params); c1=linphone_core_get_current_call(pauline->lc); c2=linphone_core_get_current_call(marie->lc); - CU_ASSERT_PTR_NOT_NULL(c1); - CU_ASSERT_PTR_NOT_NULL(c2); + BC_ASSERT_PTR_NOT_NULL(c1); + BC_ASSERT_PTR_NOT_NULL(c2); if (c1 && c2){ /*make sure local identity is unchanged*/ - CU_ASSERT_TRUE(linphone_address_weak_equal(linphone_call_log_get_from(linphone_call_get_call_log(c1)),pauline->identity)); + BC_ASSERT_TRUE(linphone_address_weak_equal(linphone_call_log_get_from(linphone_call_get_call_log(c1)),pauline->identity)); /*make sure remote identity is hidden*/ - CU_ASSERT_FALSE(linphone_address_weak_equal(linphone_call_get_remote_address(c2),pauline->identity)); + BC_ASSERT_FALSE(linphone_address_weak_equal(linphone_call_get_remote_address(c2),pauline->identity)); - CU_ASSERT_EQUAL(linphone_call_params_get_privacy(linphone_call_get_current_params(c2)),LinphonePrivacyId); + BC_ASSERT_EQUAL(linphone_call_params_get_privacy(linphone_call_get_current_params(c2)),LinphonePrivacyId, int, "%d"); } /*just to sleep*/ linphone_core_terminate_all_calls(pauline->lc); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallEnd,1)); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallEnd,1)); + 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)); /*test proxy config privacy*/ linphone_proxy_config_set_privacy(pauline_proxy,LinphonePrivacyId); - CU_ASSERT_TRUE(call(pauline,marie)); + BC_ASSERT_TRUE(call(pauline,marie)); c1=linphone_core_get_current_call(pauline->lc); c2=linphone_core_get_current_call(marie->lc); - CU_ASSERT_PTR_NOT_NULL(c1); - CU_ASSERT_PTR_NOT_NULL(c2); + BC_ASSERT_PTR_NOT_NULL(c1); + BC_ASSERT_PTR_NOT_NULL(c2); if (c1 && c2){ /*make sure remote identity is hidden*/ - CU_ASSERT_FALSE(linphone_address_weak_equal(linphone_call_get_remote_address(c2),pauline->identity)); - CU_ASSERT_EQUAL(linphone_call_params_get_privacy(linphone_call_get_current_params(c2)),LinphonePrivacyId); + BC_ASSERT_FALSE(linphone_address_weak_equal(linphone_call_get_remote_address(c2),pauline->identity)); + BC_ASSERT_EQUAL(linphone_call_params_get_privacy(linphone_call_get_current_params(c2)),LinphonePrivacyId, int, "%d"); } linphone_core_terminate_all_calls(pauline->lc); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallEnd,2)); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallEnd,2)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallEnd,2)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallEnd,2)); linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); @@ -2257,11 +2258,11 @@ static void call_with_declined_srtp(void) { if (linphone_core_media_encryption_supported(marie->lc,LinphoneMediaEncryptionSRTP)) { linphone_core_set_media_encryption(pauline->lc,LinphoneMediaEncryptionSRTP); - CU_ASSERT_TRUE(call(pauline,marie)); + BC_ASSERT_TRUE(call(pauline,marie)); linphone_core_terminate_all_calls(marie->lc); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallEnd,1)); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallEnd,1)); + 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)); } else { ms_warning ("not tested because srtp not available"); } @@ -2293,8 +2294,8 @@ static void call_srtp_paused_and_resumed(void) { linphone_core_pause_call(pauline->lc, pauline_call); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallPaused,1)); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallPausedByRemote,1)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallPaused,1)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallPausedByRemote,1)); linphone_core_resume_call(pauline->lc, pauline_call); if (!BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallStreamsRunning,2))) goto end; @@ -2302,13 +2303,13 @@ static void call_srtp_paused_and_resumed(void) { /*assert that after pause and resume, SRTP is still being used*/ params = linphone_call_get_current_params(linphone_core_get_current_call(pauline->lc)); - CU_ASSERT_TRUE(linphone_call_params_get_media_encryption(params) == LinphoneMediaEncryptionSRTP); + BC_ASSERT_TRUE(linphone_call_params_get_media_encryption(params) == LinphoneMediaEncryptionSRTP); params = linphone_call_get_current_params(linphone_core_get_current_call(marie->lc)); - CU_ASSERT_TRUE(linphone_call_params_get_media_encryption(params) == LinphoneMediaEncryptionSRTP); + BC_ASSERT_TRUE(linphone_call_params_get_media_encryption(params) == LinphoneMediaEncryptionSRTP); linphone_core_terminate_all_calls(marie->lc); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallEnd,1)); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallEnd,1)); + 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: linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); @@ -2341,31 +2342,31 @@ static void call_with_file_player(void) { linphone_core_set_play_file(pauline->lc,NULL); linphone_core_set_record_file(pauline->lc,recordpath); - CU_ASSERT_TRUE((call_ok=call(marie,pauline))); + BC_ASSERT_TRUE((call_ok=call(marie,pauline))); if (!call_ok) goto end; player=linphone_call_get_player(linphone_core_get_current_call(marie->lc)); - CU_ASSERT_PTR_NOT_NULL(player); + BC_ASSERT_PTR_NOT_NULL(player); if (player){ - CU_ASSERT_TRUE(linphone_player_open(player,hellopath,on_eof,marie)==0); - CU_ASSERT_TRUE(linphone_player_start(player)==0); + BC_ASSERT_TRUE(linphone_player_open(player,hellopath,on_eof,marie)==0); + BC_ASSERT_TRUE(linphone_player_start(player)==0); } /* This assert should be modified to be at least as long as the WAV file */ - CU_ASSERT_TRUE(wait_for_until(pauline->lc,marie->lc,&marie->stat.number_of_player_eof,1,10000)); + BC_ASSERT_TRUE(wait_for_until(pauline->lc,marie->lc,&marie->stat.number_of_player_eof,1,10000)); /*just to sleep*/ linphone_core_terminate_all_calls(marie->lc); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallEnd,1)); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallEnd,1)); + 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)); /*cannot run on iphone simulator because locks main loop beyond permitted time (should run on another thread) */ #if !defined(__arm__) && !defined(__arm64__) && !TARGET_IPHONE_SIMULATOR && !defined(ANDROID) { double similar; const int threshold = 90; - BC_ASSERT_EQUAL_WITH_TYPE(ms_audio_diff(hellopath,recordpath,&similar,audio_cmp_min_overlap,NULL,NULL), 0, int, "%d"); - BC_ASSERT_GREATER_WITH_TYPE(100*similar, threshold, int, "%d"); - BC_ASSERT_LOWER_WITH_TYPE(100*similar, 100, int, "%d"); + BC_ASSERT_EQUAL(ms_audio_diff(hellopath,recordpath,&similar,audio_cmp_min_overlap,NULL,NULL), 0, int, "%d"); + BC_ASSERT_GREATER(100*similar, threshold, int, "%d"); + BC_ASSERT_LOWER(100*similar, 100, int, "%d"); if (threshold < 100*similar && 100*similar < 100) { remove(recordpath); } @@ -2420,30 +2421,30 @@ static void call_with_mkv_file_player(void) { linphone_core_set_play_file(pauline->lc,hellowav); /*just to send something but we are not testing what is sent by pauline*/ linphone_core_set_record_file(pauline->lc,recordpath); - CU_ASSERT_TRUE((call_ok=call(marie,pauline))); + BC_ASSERT_TRUE((call_ok=call(marie,pauline))); if (!call_ok) goto end; player=linphone_call_get_player(linphone_core_get_current_call(marie->lc)); - CU_ASSERT_PTR_NOT_NULL(player); + BC_ASSERT_PTR_NOT_NULL(player); if (player){ int res = linphone_player_open(player,hellomkv,on_eof,marie); if(!ms_filter_codec_supported("opus")) { - CU_ASSERT_EQUAL(res, -1); + BC_ASSERT_EQUAL(res, -1, int, "%d"); goto end; } - CU_ASSERT_EQUAL(res, 0); - CU_ASSERT_TRUE(linphone_player_start(player)==0); - CU_ASSERT_TRUE(wait_for_until(pauline->lc,marie->lc,&marie->stat.number_of_player_eof,1,12000)); + BC_ASSERT_EQUAL(res, 0, int, "%d"); + BC_ASSERT_TRUE(linphone_player_start(player)==0); + BC_ASSERT_TRUE(wait_for_until(pauline->lc,marie->lc,&marie->stat.number_of_player_eof,1,12000)); linphone_player_close(player); } /*just to sleep*/ linphone_core_terminate_all_calls(marie->lc); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallEnd,1)); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallEnd,1)); + 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)); #ifdef DO_AUDIO_CMP - CU_ASSERT_TRUE(ms_audio_diff(hellowav,recordpath,&similar,audio_cmp_min_overlap,NULL,NULL)==0); - CU_ASSERT_TRUE(similar>threshold); - CU_ASSERT_TRUE(similar<=1.0); + BC_ASSERT_TRUE(ms_audio_diff(hellowav,recordpath,&similar,audio_cmp_min_overlap,NULL,NULL)==0); + BC_ASSERT_TRUE(similar>threshold); + BC_ASSERT_TRUE(similar<=1.0); if(similar>threshold && similar<=1.0) { remove(recordpath); } @@ -2483,7 +2484,7 @@ void call_base_with_configfile(LinphoneMediaEncryption mode, bool_t enable_video linphone_core_iterate(marie->lc); ms_usleep(200000); } - CU_ASSERT_TRUE(linphone_tunnel_connected(linphone_core_get_tunnel(marie->lc))); + BC_ASSERT_TRUE(linphone_tunnel_connected(linphone_core_get_tunnel(marie->lc))); } if (linphone_core_media_encryption_supported(marie->lc,mode)) { @@ -2497,7 +2498,7 @@ void call_base_with_configfile(LinphoneMediaEncryption mode, bool_t enable_video linphone_core_set_firewall_policy(marie->lc,policy); linphone_core_set_firewall_policy(pauline->lc,policy); - CU_ASSERT_TRUE((call_ok=call(pauline,marie))); + BC_ASSERT_TRUE((call_ok=call(pauline,marie))); if (!call_ok) goto end; if (linphone_core_get_media_encryption(pauline->lc) == LinphoneMediaEncryptionZRTP && linphone_core_get_media_encryption(pauline->lc) == LinphoneMediaEncryptionZRTP) { @@ -2508,7 +2509,7 @@ void call_base_with_configfile(LinphoneMediaEncryption mode, bool_t enable_video && linphone_call_get_authentication_token(linphone_core_get_current_call(marie->lc))) { /*check SAS*/ - CU_ASSERT_STRING_EQUAL(linphone_call_get_authentication_token(linphone_core_get_current_call(pauline->lc)) + BC_ASSERT_STRING_EQUAL(linphone_call_get_authentication_token(linphone_core_get_current_call(pauline->lc)) ,linphone_call_get_authentication_token(linphone_core_get_current_call(marie->lc))); liblinphone_tester_check_rtcp(pauline,marie); break; @@ -2522,7 +2523,7 @@ void call_base_with_configfile(LinphoneMediaEncryption mode, bool_t enable_video if (policy == LinphonePolicyUseIce){ int i=0; - CU_ASSERT_TRUE(check_ice(pauline,marie,enable_tunnel?LinphoneIceStateReflexiveConnection:LinphoneIceStateHostConnection)); + BC_ASSERT_TRUE(check_ice(pauline,marie,enable_tunnel?LinphoneIceStateReflexiveConnection:LinphoneIceStateHostConnection)); for (i=0;i<100;i++) { /*fixme to workaround a crash*/ ms_usleep(20000); linphone_core_iterate(marie->lc); @@ -2534,11 +2535,11 @@ void call_base_with_configfile(LinphoneMediaEncryption mode, bool_t enable_video if (linphone_core_video_supported(marie->lc)) { add_video(pauline,marie, TRUE); if (policy == LinphonePolicyUseIce) - CU_ASSERT_TRUE(check_ice(pauline,marie,enable_tunnel?LinphoneIceStateReflexiveConnection:LinphoneIceStateHostConnection)); + BC_ASSERT_TRUE(check_ice(pauline,marie,enable_tunnel?LinphoneIceStateReflexiveConnection:LinphoneIceStateHostConnection)); liblinphone_tester_check_rtcp(marie,pauline); /*wait for ice to found the direct path*/ - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_IframeDecoded,1)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_IframeDecoded,1)); } else { ms_warning ("not tested because video not available"); } @@ -2548,8 +2549,8 @@ void call_base_with_configfile(LinphoneMediaEncryption mode, bool_t enable_video /*just to sleep*/ linphone_core_terminate_all_calls(marie->lc); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallEnd,1)); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallEnd,1)); + 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)); } else { ms_warning ("not tested because %s not available", linphone_media_encryption_to_string(mode)); } @@ -2590,20 +2591,20 @@ static void early_media_call(void) { LinphoneCoreManager* marie = linphone_core_manager_new( "marie_early_rc"); LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc"); - CU_ASSERT_TRUE(call(pauline,marie)); + BC_ASSERT_TRUE(call(pauline,marie)); - CU_ASSERT_EQUAL(marie->stat.number_of_LinphoneCallIncomingEarlyMedia,1); - CU_ASSERT_EQUAL(pauline->stat.number_of_LinphoneCallOutgoingEarlyMedia,1); + BC_ASSERT_EQUAL(marie->stat.number_of_LinphoneCallIncomingEarlyMedia,1, int, "%d"); + BC_ASSERT_EQUAL(pauline->stat.number_of_LinphoneCallOutgoingEarlyMedia,1, int, "%d"); wait_for_until(pauline->lc,marie->lc,NULL,0,1000); /*added because a bug related to early-media caused the Connected state to be reached two times*/ - CU_ASSERT_EQUAL(marie->stat.number_of_LinphoneCallConnected,1); + BC_ASSERT_EQUAL(marie->stat.number_of_LinphoneCallConnected,1, int, "%d"); /*just to sleep*/ linphone_core_terminate_all_calls(marie->lc); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallEnd,1)); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallEnd,1)); + 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)); @@ -2630,8 +2631,8 @@ static void early_media_call_with_ringing(void){ marie_call = linphone_core_invite_address(marie->lc, pauline->identity); marie_call_log = linphone_call_get_call_log(marie_call); - CU_ASSERT_TRUE(wait_for_list(lcs, &pauline->stat.number_of_LinphoneCallIncomingReceived,1,3000)); - CU_ASSERT_TRUE(wait_for_list(lcs, &marie->stat.number_of_LinphoneCallOutgoingRinging,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs, &pauline->stat.number_of_LinphoneCallIncomingReceived,1,3000)); + BC_ASSERT_TRUE(wait_for_list(lcs, &marie->stat.number_of_LinphoneCallOutgoingRinging,1,1000)); if (linphone_core_inc_invite_pending(pauline->lc)) { @@ -2639,18 +2640,18 @@ static void early_media_call_with_ringing(void){ linphone_core_accept_early_media(pauline->lc, linphone_core_get_current_call(pauline->lc)); - CU_ASSERT_TRUE( wait_for_list(lcs, &pauline->stat.number_of_LinphoneCallIncomingEarlyMedia,1,2000) ); - CU_ASSERT_TRUE( wait_for_list(lcs, &marie->stat.number_of_LinphoneCallOutgoingEarlyMedia,1,2000) ); + BC_ASSERT_TRUE( wait_for_list(lcs, &pauline->stat.number_of_LinphoneCallIncomingEarlyMedia,1,2000) ); + BC_ASSERT_TRUE( wait_for_list(lcs, &marie->stat.number_of_LinphoneCallOutgoingEarlyMedia,1,2000) ); liblinphone_tester_check_rtcp(marie, pauline); linphone_core_accept_call(pauline->lc, linphone_core_get_current_call(pauline->lc)); - CU_ASSERT_TRUE(wait_for_list(lcs, &marie->stat.number_of_LinphoneCallConnected, 1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs, &marie->stat.number_of_LinphoneCallConnected, 1,1000)); connected_time=ms_get_cur_time_ms(); - CU_ASSERT_TRUE(wait_for_list(lcs, &marie->stat.number_of_LinphoneCallStreamsRunning, 1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs, &marie->stat.number_of_LinphoneCallStreamsRunning, 1,1000)); - CU_ASSERT_EQUAL(marie_call, linphone_core_get_current_call(marie->lc)); + BC_ASSERT_PTR_EQUAL(marie_call, linphone_core_get_current_call(marie->lc)); liblinphone_tester_check_rtcp(marie, pauline); /*just to have a call duration !=0*/ @@ -2658,10 +2659,10 @@ static void early_media_call_with_ringing(void){ linphone_core_terminate_all_calls(pauline->lc); - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallEnd,1,1000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallEnd,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallEnd,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallEnd,1,1000)); ended_time=ms_get_cur_time_ms(); - CU_ASSERT_TRUE( labs((linphone_call_log_get_duration(marie_call_log)*1000) - (int64_t)(ended_time - connected_time)) <=1000 ); + BC_ASSERT_TRUE( labs((linphone_call_log_get_duration(marie_call_log)*1000) - (int64_t)(ended_time - connected_time)) <=1000 ); ms_list_free(lcs); } @@ -2688,15 +2689,15 @@ static void early_media_call_with_update_base(bool_t media_change){ marie_call = linphone_core_invite_address(marie->lc, pauline->identity); - CU_ASSERT_TRUE(wait_for_list(lcs, &pauline->stat.number_of_LinphoneCallIncomingReceived,1,5000)); - CU_ASSERT_TRUE(wait_for_list(lcs, &marie->stat.number_of_LinphoneCallOutgoingRinging,1,5000)); + BC_ASSERT_TRUE(wait_for_list(lcs, &pauline->stat.number_of_LinphoneCallIncomingReceived,1,5000)); + BC_ASSERT_TRUE(wait_for_list(lcs, &marie->stat.number_of_LinphoneCallOutgoingRinging,1,5000)); pauline_call = linphone_core_get_current_call(pauline->lc); if (!pauline_call) goto end; /* send a 183 to initiate the early media */ linphone_core_accept_early_media(pauline->lc, pauline_call); - CU_ASSERT_TRUE( wait_for_list(lcs, &pauline->stat.number_of_LinphoneCallIncomingEarlyMedia,1,1000) ); - CU_ASSERT_TRUE( wait_for_list(lcs, &marie->stat.number_of_LinphoneCallOutgoingEarlyMedia,1,5000) ); + BC_ASSERT_TRUE( wait_for_list(lcs, &pauline->stat.number_of_LinphoneCallIncomingEarlyMedia,1,1000) ); + BC_ASSERT_TRUE( wait_for_list(lcs, &marie->stat.number_of_LinphoneCallOutgoingEarlyMedia,1,5000) ); pauline_params = linphone_call_params_copy(linphone_call_get_current_params(pauline_call)); @@ -2709,30 +2710,30 @@ static void early_media_call_with_update_base(bool_t media_change){ linphone_call_params_set_session_name(pauline_params,UPDATED_SESSION_NAME); linphone_core_update_call(pauline->lc, pauline_call, pauline_params); - CU_ASSERT_TRUE(wait_for_list(lcs, &pauline->stat.number_of_LinphoneCallEarlyUpdating,1,2000)); - CU_ASSERT_TRUE(wait_for_list(lcs, &marie->stat.number_of_LinphoneCallEarlyUpdatedByRemote,1,2000)); - CU_ASSERT_TRUE(wait_for_list(lcs, &marie->stat.number_of_LinphoneCallOutgoingEarlyMedia,1,2000)); - CU_ASSERT_TRUE(wait_for_list(lcs, &pauline->stat.number_of_LinphoneCallIncomingEarlyMedia,1,2000)); + BC_ASSERT_TRUE(wait_for_list(lcs, &pauline->stat.number_of_LinphoneCallEarlyUpdating,1,2000)); + BC_ASSERT_TRUE(wait_for_list(lcs, &marie->stat.number_of_LinphoneCallEarlyUpdatedByRemote,1,2000)); + BC_ASSERT_TRUE(wait_for_list(lcs, &marie->stat.number_of_LinphoneCallOutgoingEarlyMedia,1,2000)); + BC_ASSERT_TRUE(wait_for_list(lcs, &pauline->stat.number_of_LinphoneCallIncomingEarlyMedia,1,2000)); /*just to wait 2s*/ liblinphone_tester_check_rtcp(marie, pauline); - CU_ASSERT_STRING_EQUAL( linphone_call_params_get_session_name(linphone_call_get_remote_params(marie_call)) + BC_ASSERT_STRING_EQUAL( linphone_call_params_get_session_name(linphone_call_get_remote_params(marie_call)) , UPDATED_SESSION_NAME); linphone_core_accept_call(pauline->lc, linphone_core_get_current_call(pauline->lc)); - CU_ASSERT_TRUE(wait_for_list(lcs, &marie->stat.number_of_LinphoneCallConnected, 1,1000)); - CU_ASSERT_TRUE(wait_for_list(lcs, &marie->stat.number_of_LinphoneCallStreamsRunning, 1,1000)); - CU_ASSERT_TRUE(wait_for_list(lcs, &pauline->stat.number_of_LinphoneCallConnected, 1,1000)); - CU_ASSERT_TRUE(wait_for_list(lcs, &pauline->stat.number_of_LinphoneCallStreamsRunning, 1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs, &marie->stat.number_of_LinphoneCallConnected, 1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs, &marie->stat.number_of_LinphoneCallStreamsRunning, 1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs, &pauline->stat.number_of_LinphoneCallConnected, 1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs, &pauline->stat.number_of_LinphoneCallStreamsRunning, 1,1000)); liblinphone_tester_check_rtcp(marie, pauline); linphone_core_terminate_all_calls(pauline->lc); - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallEnd,1,1000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallEnd,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallEnd,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallEnd,1,1000)); end: @@ -2751,9 +2752,9 @@ static void early_media_call_with_codec_update(void){ static void check_call_state(LinphoneCoreManager* mgr,LinphoneCallState state) { - CU_ASSERT_PTR_NOT_NULL(linphone_core_get_current_call(mgr->lc)); + BC_ASSERT_PTR_NOT_NULL(linphone_core_get_current_call(mgr->lc)); if (linphone_core_get_current_call(mgr->lc)) - CU_ASSERT_EQUAL(linphone_call_get_state(linphone_core_get_current_call(mgr->lc)),state); + BC_ASSERT_EQUAL(linphone_call_get_state(linphone_core_get_current_call(mgr->lc)),state, int, "%d"); } static void call_established_with_rejected_info(void) { @@ -2762,7 +2763,7 @@ static void call_established_with_rejected_info(void) { int dummy=0; bool_t call_ok=FALSE; - CU_ASSERT_TRUE((call_ok=call(pauline,marie))); + BC_ASSERT_TRUE((call_ok=call(pauline,marie))); if (call_ok){ sal_enable_unconditional_answer(marie->lc->sal,TRUE); @@ -2773,16 +2774,16 @@ static void call_established_with_rejected_info(void) { sal_enable_unconditional_answer(marie->lc->sal,FALSE); linphone_call_send_info_message(linphone_core_get_current_call(pauline->lc),linphone_core_create_info_message(pauline->lc)); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_inforeceived,1)); - CU_ASSERT_EQUAL(marie->stat.number_of_inforeceived,1); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_inforeceived,1)); + BC_ASSERT_EQUAL(marie->stat.number_of_inforeceived,1, int, "%d"); check_call_state(pauline,LinphoneCallStreamsRunning); check_call_state(marie,LinphoneCallStreamsRunning); /*just to sleep*/ linphone_core_terminate_all_calls(pauline->lc); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallEnd,1)); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallEnd,1)); + 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)); } linphone_core_manager_destroy(marie); @@ -2795,7 +2796,7 @@ static void call_established_with_rejected_reinvite(void) { LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc"); bool_t call_ok=FALSE; - CU_ASSERT_TRUE(call_ok=call(pauline,marie)); + BC_ASSERT_TRUE(call_ok=call(pauline,marie)); if (call_ok){ linphone_core_enable_payload_type(pauline->lc,linphone_core_find_payload_type(pauline->lc,"PCMU",8000,1),FALSE); /*disable PCMU*/ linphone_core_enable_payload_type(pauline->lc,linphone_core_find_payload_type(pauline->lc,"PCMA",8000,1),TRUE); /*enable PCMA*/ @@ -2806,18 +2807,18 @@ static void call_established_with_rejected_reinvite(void) { ,linphone_call_get_current_params(linphone_core_get_current_call(pauline->lc))); - CU_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&pauline->stat.number_of_LinphoneCallStreamsRunning,2)); + BC_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&pauline->stat.number_of_LinphoneCallStreamsRunning,2)); - CU_ASSERT_EQUAL(linphone_call_get_reason(linphone_core_get_current_call(pauline->lc)),LinphoneReasonNotAcceptable); + BC_ASSERT_EQUAL(linphone_call_get_reason(linphone_core_get_current_call(pauline->lc)),LinphoneReasonNotAcceptable, int, "%d"); - CU_ASSERT_EQUAL(marie->stat.number_of_LinphoneCallStreamsRunning,1); + BC_ASSERT_EQUAL(marie->stat.number_of_LinphoneCallStreamsRunning,1, int, "%d"); check_call_state(pauline,LinphoneCallStreamsRunning); check_call_state(marie,LinphoneCallStreamsRunning); /*just to sleep*/ linphone_core_terminate_all_calls(pauline->lc); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallEnd,1)); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallEnd,1)); + 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)); } linphone_core_manager_destroy(marie); @@ -2829,7 +2830,7 @@ static void call_established_with_rejected_incoming_reinvite(void) { LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc"); bool_t call_ok=FALSE; - CU_ASSERT_TRUE((call_ok=call(pauline,marie))); + BC_ASSERT_TRUE((call_ok=call(pauline,marie))); if (call_ok){ @@ -2844,19 +2845,19 @@ static void call_established_with_rejected_incoming_reinvite(void) { ,linphone_call_get_current_params(linphone_core_get_current_call(marie->lc))); - CU_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&marie->stat.number_of_LinphoneCallUpdating,1)); - CU_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&marie->stat.number_of_LinphoneCallStreamsRunning,2)); + BC_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&marie->stat.number_of_LinphoneCallUpdating,1)); + BC_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&marie->stat.number_of_LinphoneCallStreamsRunning,2)); - CU_ASSERT_EQUAL(linphone_call_get_reason(linphone_core_get_current_call(marie->lc)),LinphoneReasonNotAcceptable); + BC_ASSERT_EQUAL(linphone_call_get_reason(linphone_core_get_current_call(marie->lc)),LinphoneReasonNotAcceptable, int, "%d"); - CU_ASSERT_EQUAL(pauline->stat.number_of_LinphoneCallStreamsRunning,1); + BC_ASSERT_EQUAL(pauline->stat.number_of_LinphoneCallStreamsRunning,1, int, "%d"); check_call_state(pauline,LinphoneCallStreamsRunning); check_call_state(marie,LinphoneCallStreamsRunning); /*just to sleep*/ linphone_core_terminate_all_calls(pauline->lc); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallEnd,1)); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallEnd,1)); + 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)); } linphone_core_manager_destroy(marie); @@ -2880,7 +2881,7 @@ static void call_redirect(void){ marie_call = linphone_core_invite_address(marie->lc, pauline->identity); - CU_ASSERT_TRUE(wait_for_list(lcs, &pauline->stat.number_of_LinphoneCallIncomingReceived,1,6000)); + BC_ASSERT_TRUE(wait_for_list(lcs, &pauline->stat.number_of_LinphoneCallIncomingReceived,1,6000)); if (linphone_core_get_current_call(pauline->lc)){ margaux_url = linphone_address_as_string(laure->identity); @@ -2888,25 +2889,25 @@ static void call_redirect(void){ ms_free(margaux_url); /* laure should be ringing now */ - CU_ASSERT_TRUE(wait_for_list(lcs, &laure->stat.number_of_LinphoneCallIncomingReceived,1,6000)); + BC_ASSERT_TRUE(wait_for_list(lcs, &laure->stat.number_of_LinphoneCallIncomingReceived,1,6000)); /* pauline should have ended the call */ - CU_ASSERT_TRUE(wait_for_list(lcs, &pauline->stat.number_of_LinphoneCallEnd,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs, &pauline->stat.number_of_LinphoneCallEnd,1,1000)); /* the call should still be ringing on marie's side */ - CU_ASSERT_TRUE(wait_for_list(lcs, &marie->stat.number_of_LinphoneCallOutgoingRinging, 1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs, &marie->stat.number_of_LinphoneCallOutgoingRinging, 1,1000)); linphone_core_accept_call(laure->lc, linphone_core_get_current_call(laure->lc)); - CU_ASSERT_TRUE(wait_for_list(lcs, &marie->stat.number_of_LinphoneCallStreamsRunning, 1,1000)); - CU_ASSERT_TRUE(wait_for_list(lcs, &laure->stat.number_of_LinphoneCallStreamsRunning, 1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs, &marie->stat.number_of_LinphoneCallStreamsRunning, 1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs, &laure->stat.number_of_LinphoneCallStreamsRunning, 1,1000)); - CU_ASSERT_EQUAL(marie_call, linphone_core_get_current_call(marie->lc)); + BC_ASSERT_PTR_EQUAL(marie_call, linphone_core_get_current_call(marie->lc)); liblinphone_tester_check_rtcp(marie, laure); linphone_core_terminate_all_calls(laure->lc); - CU_ASSERT_TRUE(wait_for_list(lcs,&laure->stat.number_of_LinphoneCallEnd,1,5000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallEnd,1,5000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&laure->stat.number_of_LinphoneCallEnd,1,5000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallEnd,1,5000)); } ms_list_free(lcs); @@ -2922,7 +2923,7 @@ static void call_established_with_rejected_reinvite_with_error(void) { LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc"); bool_t call_ok=TRUE; - CU_ASSERT_TRUE((call_ok=call(pauline,marie))); + BC_ASSERT_TRUE((call_ok=call(pauline,marie))); if (call_ok){ linphone_core_enable_payload_type(pauline->lc,linphone_core_find_payload_type(pauline->lc,"PCMA",8000,1),TRUE); /*add PCMA*/ @@ -2934,18 +2935,18 @@ static void call_established_with_rejected_reinvite_with_error(void) { ,linphone_call_get_current_params(linphone_core_get_current_call(pauline->lc))); - CU_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&pauline->stat.number_of_LinphoneCallStreamsRunning,2)); + BC_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&pauline->stat.number_of_LinphoneCallStreamsRunning,2)); - CU_ASSERT_EQUAL(linphone_call_get_reason(linphone_core_get_current_call(pauline->lc)),LinphoneReasonTemporarilyUnavailable); /*might be change later*/ + BC_ASSERT_EQUAL(linphone_call_get_reason(linphone_core_get_current_call(pauline->lc)),LinphoneReasonTemporarilyUnavailable, int, "%d"); /*might be change later*/ - CU_ASSERT_EQUAL(marie->stat.number_of_LinphoneCallStreamsRunning,1); + BC_ASSERT_EQUAL(marie->stat.number_of_LinphoneCallStreamsRunning,1, int, "%d"); check_call_state(pauline,LinphoneCallStreamsRunning); check_call_state(marie,LinphoneCallStreamsRunning); /*just to sleep*/ linphone_core_terminate_all_calls(pauline->lc); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallEnd,1)); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallEnd,1)); + 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)); } linphone_core_manager_destroy(marie); @@ -2968,19 +2969,19 @@ static void call_rejected_because_wrong_credentials_with_params(const char* user linphone_core_add_auth_info(marie->lc,wrong_auth_info); } - CU_ASSERT_PTR_NOT_NULL(linphone_core_invite_address(marie->lc,marie->identity)); + BC_ASSERT_PTR_NOT_NULL(linphone_core_invite_address(marie->lc,marie->identity)); result=wait_for(marie->lc,marie->lc,&marie->stat.number_of_auth_info_requested,1); if (enable_auth_req_cb) { - CU_ASSERT_TRUE(result); + BC_ASSERT_TRUE(result); /*automatically re-inititae the call*/ linphone_core_add_auth_info(marie->lc,wrong_auth_info); } - CU_ASSERT_TRUE(wait_for(marie->lc,marie->lc,&marie->stat.number_of_LinphoneCallError,1)); + BC_ASSERT_TRUE(wait_for(marie->lc,marie->lc,&marie->stat.number_of_LinphoneCallError,1)); if (enable_auth_req_cb) { - CU_ASSERT_EQUAL(marie->stat.number_of_auth_info_requested,2); + BC_ASSERT_EQUAL(marie->stat.number_of_auth_info_requested,2, int, "%d"); } /*to make sure unregister will work*/ linphone_core_clear_all_auth_info(marie->lc); @@ -3038,47 +3039,47 @@ static void multiple_early_media(void) { linphone_core_invite_address_with_params(pauline->lc,marie1->identity,params); linphone_call_params_destroy(params); - CU_ASSERT_TRUE(wait_for_list(lcs, &marie1->stat.number_of_LinphoneCallIncomingEarlyMedia,1,3000)); - CU_ASSERT_TRUE(wait_for_list(lcs, &marie2->stat.number_of_LinphoneCallIncomingEarlyMedia,1,3000)); - CU_ASSERT_TRUE(wait_for_list(lcs, &pauline->stat.number_of_LinphoneCallOutgoingEarlyMedia,1,3000)); + BC_ASSERT_TRUE(wait_for_list(lcs, &marie1->stat.number_of_LinphoneCallIncomingEarlyMedia,1,3000)); + BC_ASSERT_TRUE(wait_for_list(lcs, &marie2->stat.number_of_LinphoneCallIncomingEarlyMedia,1,3000)); + BC_ASSERT_TRUE(wait_for_list(lcs, &pauline->stat.number_of_LinphoneCallOutgoingEarlyMedia,1,3000)); pauline_call=linphone_core_get_current_call(pauline->lc); marie1_call=linphone_core_get_current_call(marie1->lc); marie2_call=linphone_core_get_current_call(marie2->lc); - CU_ASSERT_PTR_NOT_NULL(pauline_call); - CU_ASSERT_PTR_NOT_NULL(marie1_call); - CU_ASSERT_PTR_NOT_NULL(marie2_call); + BC_ASSERT_PTR_NOT_NULL(pauline_call); + BC_ASSERT_PTR_NOT_NULL(marie1_call); + BC_ASSERT_PTR_NOT_NULL(marie2_call); if (pauline_call && marie1_call && marie2_call){ /*wait a bit that streams are established*/ wait_for_list(lcs,&dummy,1,6000); - CU_ASSERT_TRUE(linphone_call_get_audio_stats(pauline_call)->download_bandwidth>70); - CU_ASSERT_TRUE(linphone_call_get_audio_stats(marie1_call)->download_bandwidth>70); - CU_ASSERT_TRUE(linphone_call_get_audio_stats(marie2_call)->download_bandwidth>70); + BC_ASSERT_TRUE(linphone_call_get_audio_stats(pauline_call)->download_bandwidth>70); + BC_ASSERT_TRUE(linphone_call_get_audio_stats(marie1_call)->download_bandwidth>70); + BC_ASSERT_TRUE(linphone_call_get_audio_stats(marie2_call)->download_bandwidth>70); linphone_core_accept_call(marie1->lc,linphone_core_get_current_call(marie1->lc)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie1->stat.number_of_LinphoneCallStreamsRunning,1,3000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallStreamsRunning,1,3000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie1->stat.number_of_LinphoneCallStreamsRunning,1,3000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallStreamsRunning,1,3000)); /*marie2 should get her call terminated*/ - CU_ASSERT_TRUE(wait_for_list(lcs,&marie2->stat.number_of_LinphoneCallEnd,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie2->stat.number_of_LinphoneCallEnd,1,1000)); /*wait a bit that streams are established*/ wait_for_list(lcs,&dummy,1,3000); - CU_ASSERT_TRUE(linphone_call_get_audio_stats(pauline_call)->download_bandwidth>71); - CU_ASSERT_TRUE(linphone_call_get_audio_stats(marie1_call)->download_bandwidth>71); + BC_ASSERT_TRUE(linphone_call_get_audio_stats(pauline_call)->download_bandwidth>71); + BC_ASSERT_TRUE(linphone_call_get_audio_stats(marie1_call)->download_bandwidth>71); /*send an INFO in reverse side to check that dialogs are properly established*/ info=linphone_core_create_info_message(marie1->lc); linphone_call_send_info_message(marie1_call,info); - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_inforeceived,1,3000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_inforeceived,1,3000)); } linphone_core_terminate_all_calls(pauline->lc); - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallEnd,1,3000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie1->stat.number_of_LinphoneCallEnd,1,3000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallEnd,1,3000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie1->stat.number_of_LinphoneCallEnd,1,3000)); ms_list_free(lcs); linphone_core_manager_destroy(marie1); @@ -3087,14 +3088,14 @@ static void multiple_early_media(void) { } void check_media_direction(LinphoneCoreManager* mgr, LinphoneCall *call, MSList* lcs,LinphoneMediaDirection audio_dir, LinphoneMediaDirection video_dir) { - CU_ASSERT_PTR_NOT_NULL(call); + BC_ASSERT_PTR_NOT_NULL(call); if (call) { int current_recv_iframe = mgr->stat.number_of_IframeDecoded; int expected_recv_iframe=0; int dummy = 0; const LinphoneCallParams *params = linphone_call_get_current_params(call); - CU_ASSERT_EQUAL(audio_dir,linphone_call_params_get_audio_direction(params)); - CU_ASSERT_EQUAL(video_dir,linphone_call_params_get_video_direction(params)); + BC_ASSERT_EQUAL(audio_dir,linphone_call_params_get_audio_direction(params), int, "%d"); + BC_ASSERT_EQUAL(video_dir,linphone_call_params_get_video_direction(params), int, "%d"); linphone_call_set_next_video_frame_decoded_callback(call,linphone_call_cb,mgr->lc); linphone_call_send_vfu_request(call); @@ -3103,32 +3104,32 @@ void check_media_direction(LinphoneCoreManager* mgr, LinphoneCall *call, MSList* switch (video_dir) { case LinphoneMediaDirectionInactive: - CU_ASSERT_TRUE(linphone_call_get_video_stats(call)->upload_bandwidth<5); + BC_ASSERT_TRUE(linphone_call_get_video_stats(call)->upload_bandwidth<5); case LinphoneMediaDirectionSendOnly: expected_recv_iframe = 0; - CU_ASSERT_TRUE(linphone_call_get_video_stats(call)->download_bandwidth<5); + BC_ASSERT_TRUE(linphone_call_get_video_stats(call)->download_bandwidth<5); break; case LinphoneMediaDirectionRecvOnly: - CU_ASSERT_TRUE(linphone_call_get_video_stats(call)->upload_bandwidth<5); + BC_ASSERT_TRUE(linphone_call_get_video_stats(call)->upload_bandwidth<5); case LinphoneMediaDirectionSendRecv: expected_recv_iframe = 1; break; } - CU_ASSERT_TRUE(wait_for_list(lcs, &mgr->stat.number_of_IframeDecoded,current_recv_iframe + expected_recv_iframe,3000)); + BC_ASSERT_TRUE(wait_for_list(lcs, &mgr->stat.number_of_IframeDecoded,current_recv_iframe + expected_recv_iframe,3000)); switch (audio_dir) { case LinphoneMediaDirectionInactive: - CU_ASSERT_TRUE(linphone_call_get_audio_stats(call)->upload_bandwidth<5); + BC_ASSERT_TRUE(linphone_call_get_audio_stats(call)->upload_bandwidth<5); case LinphoneMediaDirectionSendOnly: - CU_ASSERT_TRUE(linphone_call_get_video_stats(call)->download_bandwidth<5); - if (audio_dir == LinphoneMediaDirectionSendOnly) CU_ASSERT_TRUE(wait_for_list(lcs,&mgr->stat.audio_upload_bandwidth,70,4000)); + BC_ASSERT_TRUE(linphone_call_get_video_stats(call)->download_bandwidth<5); + if (audio_dir == LinphoneMediaDirectionSendOnly) BC_ASSERT_TRUE(wait_for_list(lcs,&mgr->stat.audio_upload_bandwidth,70,4000)); break; case LinphoneMediaDirectionRecvOnly: - CU_ASSERT_TRUE(linphone_call_get_audio_stats(call)->upload_bandwidth<5); + BC_ASSERT_TRUE(linphone_call_get_audio_stats(call)->upload_bandwidth<5); case LinphoneMediaDirectionSendRecv: - CU_ASSERT_TRUE(wait_for_list(lcs,&mgr->stat.audio_download_bandwidth,70,4000)); - if (audio_dir == LinphoneMediaDirectionSendRecv) CU_ASSERT_TRUE(wait_for_list(lcs,&mgr->stat.audio_upload_bandwidth,70,4000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&mgr->stat.audio_download_bandwidth,70,4000)); + if (audio_dir == LinphoneMediaDirectionSendRecv) BC_ASSERT_TRUE(wait_for_list(lcs,&mgr->stat.audio_upload_bandwidth,70,4000)); break; } } @@ -3156,7 +3157,7 @@ static void accept_call_in_send_only_base(LinphoneCoreManager* pauline, Linphone ,pauline->lc); - CU_ASSERT_TRUE(wait_for_list(lcs, &marie->stat.number_of_LinphoneCallIncomingReceived,1,DEFAULT_WAIT_FOR)); + BC_ASSERT_TRUE(wait_for_list(lcs, &marie->stat.number_of_LinphoneCallIncomingReceived,1,DEFAULT_WAIT_FOR)); { char* remote_uri = linphone_address_as_string_uri_only(pauline->identity); @@ -3171,8 +3172,8 @@ static void accept_call_in_send_only_base(LinphoneCoreManager* pauline, Linphone linphone_core_accept_call_with_params(marie->lc,call,params); linphone_call_params_destroy(params); - CU_ASSERT_TRUE(wait_for_list(lcs, &marie->stat.number_of_LinphoneCallStreamsRunning,1,DEFAULT_WAIT_FOR)); - CU_ASSERT_TRUE(wait_for_list(lcs, &pauline->stat.number_of_LinphoneCallPausedByRemote,1,DEFAULT_WAIT_FOR)); + BC_ASSERT_TRUE(wait_for_list(lcs, &marie->stat.number_of_LinphoneCallStreamsRunning,1,DEFAULT_WAIT_FOR)); + BC_ASSERT_TRUE(wait_for_list(lcs, &pauline->stat.number_of_LinphoneCallPausedByRemote,1,DEFAULT_WAIT_FOR)); check_media_direction(marie,call,lcs,LinphoneMediaDirectionSendOnly,LinphoneMediaDirectionSendOnly); } @@ -3212,7 +3213,7 @@ static void accept_call_in_send_base(bool_t caller_has_ice) { leaked_objects=belle_sip_object_get_object_count()-begin; - CU_ASSERT_TRUE(leaked_objects==0); + BC_ASSERT_TRUE(leaked_objects==0); if (leaked_objects>0){ belle_sip_object_dump_active_objects(); } @@ -3258,7 +3259,7 @@ void two_accepted_call_in_send_only() { leaked_objects=belle_sip_object_get_object_count()-begin; - CU_ASSERT_TRUE(leaked_objects==0); + BC_ASSERT_TRUE(leaked_objects==0); if (leaked_objects>0){ belle_sip_object_dump_active_objects(); } @@ -3312,15 +3313,15 @@ static void record_call(const char *filename, bool_t enableVideo) { filepath = create_filepath(bc_tester_writable_dir_prefix, filename, format); remove(filepath); linphone_call_params_set_record_file(marieParams, filepath); - CU_ASSERT_TRUE(call_succeeded = call_with_params(marie, pauline, marieParams, paulineParams)); - CU_ASSERT_PTR_NOT_NULL(callInst = linphone_core_get_current_call(marie->lc)); + BC_ASSERT_TRUE(call_succeeded = call_with_params(marie, pauline, marieParams, paulineParams)); + BC_ASSERT_PTR_NOT_NULL(callInst = linphone_core_get_current_call(marie->lc)); if ((call_succeeded == TRUE) && (callInst != NULL)) { ms_message("call_recording(): start recording into %s", filepath); linphone_call_start_recording(callInst); wait_for_until(marie->lc,pauline->lc,&dummy,1,5000); linphone_call_stop_recording(callInst); end_call(marie, pauline); - CU_ASSERT_EQUAL(access(filepath, F_OK), 0); + BC_ASSERT_EQUAL(access(filepath, F_OK), 0, int, "%d"); } remove(filepath); ms_free(filepath); @@ -3358,12 +3359,12 @@ static void video_call_snapshot(void) { linphone_call_params_enable_video(marieParams, TRUE); linphone_call_params_enable_video(paulineParams, TRUE); - CU_ASSERT_TRUE(call_succeeded = call_with_params(marie, pauline, marieParams, paulineParams)); - CU_ASSERT_PTR_NOT_NULL(callInst = linphone_core_get_current_call(marie->lc)); + BC_ASSERT_TRUE(call_succeeded = call_with_params(marie, pauline, marieParams, paulineParams)); + BC_ASSERT_PTR_NOT_NULL(callInst = linphone_core_get_current_call(marie->lc)); if((call_succeeded == TRUE) && (callInst != NULL)) { linphone_call_take_video_snapshot(callInst, filename); wait_for_until(marie->lc, pauline->lc, &dummy, 1, 5000); - CU_ASSERT_EQUAL(access(filename, F_OK), 0); + BC_ASSERT_EQUAL(access(filename, F_OK), 0, int, "%d"); remove(filename); } ms_free(filename); @@ -3386,7 +3387,7 @@ static void call_with_in_dialog_update(void) { marie = linphone_core_manager_new( "marie_rc"); pauline = linphone_core_manager_new( "pauline_rc"); - CU_ASSERT_TRUE(call_ok=call(pauline,marie)); + BC_ASSERT_TRUE(call_ok=call(pauline,marie)); if (!call_ok) goto end; liblinphone_tester_check_rtcp(marie,pauline); @@ -3394,10 +3395,10 @@ static void call_with_in_dialog_update(void) { params->no_user_consent=TRUE; linphone_core_update_call(marie->lc,linphone_core_get_current_call(marie->lc),params); linphone_call_params_destroy(params); - CU_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&marie->stat.number_of_LinphoneCallUpdating,1)); - CU_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&marie->stat.number_of_LinphoneCallStreamsRunning,2)); - CU_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&pauline->stat.number_of_LinphoneCallUpdatedByRemote,1)); - CU_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&pauline->stat.number_of_LinphoneCallStreamsRunning,2)); + BC_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&marie->stat.number_of_LinphoneCallUpdating,1)); + BC_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&marie->stat.number_of_LinphoneCallStreamsRunning,2)); + BC_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&pauline->stat.number_of_LinphoneCallUpdatedByRemote,1)); + BC_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&pauline->stat.number_of_LinphoneCallStreamsRunning,2)); end_call(marie,pauline); end: @@ -3405,7 +3406,7 @@ end: linphone_core_manager_destroy(pauline); leaked_objects=belle_sip_object_get_object_count()-begin; - CU_ASSERT_TRUE(leaked_objects==0); + BC_ASSERT_TRUE(leaked_objects==0); if (leaked_objects>0){ belle_sip_object_dump_active_objects(); } @@ -3424,7 +3425,7 @@ static void call_with_in_dialog_codec_change_base(bool_t no_sdp) { marie = linphone_core_manager_new( "marie_rc"); pauline = linphone_core_manager_new( "pauline_rc"); - CU_ASSERT_TRUE(call_ok=call(pauline,marie)); + BC_ASSERT_TRUE(call_ok=call(pauline,marie)); if (!call_ok) goto end; liblinphone_tester_check_rtcp(marie,pauline); @@ -3439,14 +3440,14 @@ static void call_with_in_dialog_codec_change_base(bool_t no_sdp) { } linphone_core_update_call(marie->lc,linphone_core_get_current_call(marie->lc),params); linphone_call_params_destroy(params); - CU_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&marie->stat.number_of_LinphoneCallUpdating,1)); - CU_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&marie->stat.number_of_LinphoneCallStreamsRunning,2)); - CU_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&pauline->stat.number_of_LinphoneCallUpdatedByRemote,1)); - CU_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&pauline->stat.number_of_LinphoneCallStreamsRunning,2)); - CU_ASSERT_STRING_EQUAL("PCMA",linphone_payload_type_get_mime_type(linphone_call_params_get_used_audio_codec(linphone_call_get_current_params(linphone_core_get_current_call(marie->lc))))); + BC_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&marie->stat.number_of_LinphoneCallUpdating,1)); + BC_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&marie->stat.number_of_LinphoneCallStreamsRunning,2)); + BC_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&pauline->stat.number_of_LinphoneCallUpdatedByRemote,1)); + BC_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&pauline->stat.number_of_LinphoneCallStreamsRunning,2)); + BC_ASSERT_STRING_EQUAL("PCMA",linphone_payload_type_get_mime_type(linphone_call_params_get_used_audio_codec(linphone_call_get_current_params(linphone_core_get_current_call(marie->lc))))); wait_for_until(marie->lc, pauline->lc, &dummy, 1, 5000); - CU_ASSERT_TRUE(linphone_call_get_audio_stats(linphone_core_get_current_call(marie->lc))->download_bandwidth>70); - CU_ASSERT_TRUE(linphone_call_get_audio_stats(linphone_core_get_current_call(pauline->lc))->download_bandwidth>70); + BC_ASSERT_TRUE(linphone_call_get_audio_stats(linphone_core_get_current_call(marie->lc))->download_bandwidth>70); + BC_ASSERT_TRUE(linphone_call_get_audio_stats(linphone_core_get_current_call(pauline->lc))->download_bandwidth>70); end_call(marie,pauline); end: @@ -3454,7 +3455,7 @@ end: linphone_core_manager_destroy(pauline); leaked_objects=belle_sip_object_get_object_count()-begin; - CU_ASSERT_TRUE(leaked_objects==0); + BC_ASSERT_TRUE(leaked_objects==0); if (leaked_objects>0){ belle_sip_object_dump_active_objects(); } @@ -3481,14 +3482,14 @@ static void call_with_custom_supported_tags(void) { pauline = linphone_core_manager_new( "pauline_rc"); linphone_core_add_supported_tag(marie->lc,"pouet-tag"); - CU_ASSERT_TRUE(call_ok=call(pauline,marie)); + BC_ASSERT_TRUE(call_ok=call(pauline,marie)); if (!call_ok) goto end; liblinphone_tester_check_rtcp(marie,pauline); remote_params=linphone_call_get_remote_params(linphone_core_get_current_call(pauline->lc)); recv_supported=linphone_call_params_get_custom_header(remote_params,"supported"); - CU_ASSERT_PTR_NOT_NULL(recv_supported); + BC_ASSERT_PTR_NOT_NULL(recv_supported); if (recv_supported){ - CU_ASSERT_TRUE(strstr(recv_supported,"pouet-tag")!=NULL); + BC_ASSERT_TRUE(strstr(recv_supported,"pouet-tag")!=NULL); } end_call(marie,pauline); end: @@ -3496,7 +3497,7 @@ end: linphone_core_manager_destroy(pauline); leaked_objects=belle_sip_object_get_object_count()-begin; - CU_ASSERT_TRUE(leaked_objects==0); + BC_ASSERT_TRUE(leaked_objects==0); if (leaked_objects>0){ belle_sip_object_dump_active_objects(); } @@ -3521,24 +3522,24 @@ static void call_log_from_taken_from_p_asserted_id(void) { lp_config_set_int(marie_lp,"sip","call_logs_use_asserted_id_instead_of_from",1); - CU_ASSERT_TRUE(call_ok=call_with_caller_params(pauline,marie,params)); + BC_ASSERT_TRUE(call_ok=call_with_caller_params(pauline,marie,params)); if (!call_ok) goto end; c1=linphone_core_get_current_call(pauline->lc); c2=linphone_core_get_current_call(marie->lc); - CU_ASSERT_PTR_NOT_NULL(c1); - CU_ASSERT_PTR_NOT_NULL(c2); + BC_ASSERT_PTR_NOT_NULL(c1); + BC_ASSERT_PTR_NOT_NULL(c2); /*make sure remote identity is hidden*/ - CU_ASSERT_TRUE(linphone_address_weak_equal(linphone_call_get_remote_address(c2),paulie_asserted_id_addr)); + BC_ASSERT_TRUE(linphone_address_weak_equal(linphone_call_get_remote_address(c2),paulie_asserted_id_addr)); /*just to sleep*/ linphone_core_terminate_all_calls(pauline->lc); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallEnd,1)); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallEnd,1)); + 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: linphone_call_params_destroy(params); linphone_core_manager_destroy(marie); @@ -3551,12 +3552,12 @@ static void incoming_invite_with_invalid_sdp() { LinphoneCallTestParams caller_test_params = {0}, callee_test_params = {0}; callee_test_params.sdp_simulate_error = TRUE; - CU_ASSERT_FALSE(call_with_params2(caller,callee,&caller_test_params, &callee_test_params, FALSE)); + BC_ASSERT_FALSE(call_with_params2(caller,callee,&caller_test_params, &callee_test_params, FALSE)); - CU_ASSERT_PTR_NULL(linphone_core_get_current_call(callee->lc)); - CU_ASSERT_EQUAL(caller->stat.number_of_LinphoneCallError,1); + BC_ASSERT_PTR_NULL(linphone_core_get_current_call(callee->lc)); + BC_ASSERT_EQUAL(caller->stat.number_of_LinphoneCallError,1, int, "%d"); /*call will be drop before presented to the application, because it is invalid*/ - CU_ASSERT_EQUAL(callee->stat.number_of_LinphoneCallIncomingReceived,0); + BC_ASSERT_EQUAL(callee->stat.number_of_LinphoneCallIncomingReceived,0, int, "%d"); linphone_core_manager_destroy(callee); linphone_core_manager_destroy(caller); @@ -3568,14 +3569,14 @@ static void outgoing_invite_with_invalid_sdp() { LinphoneCallTestParams caller_test_params = {0}, callee_test_params = {0}; caller_test_params.sdp_simulate_error = TRUE; - CU_ASSERT_FALSE(call_with_params2(caller,callee,&caller_test_params, &callee_test_params, FALSE)); + BC_ASSERT_FALSE(call_with_params2(caller,callee,&caller_test_params, &callee_test_params, FALSE)); - CU_ASSERT_PTR_NULL(linphone_core_get_current_call(callee->lc)); - CU_ASSERT_EQUAL(callee->stat.number_of_LinphoneCallIncomingReceived,1); - CU_ASSERT_EQUAL(caller->stat.number_of_LinphoneCallError,1); + BC_ASSERT_PTR_NULL(linphone_core_get_current_call(callee->lc)); + BC_ASSERT_EQUAL(callee->stat.number_of_LinphoneCallIncomingReceived,1, int, "%d"); + BC_ASSERT_EQUAL(caller->stat.number_of_LinphoneCallError,1, int, "%d"); // actually callee does not receive error, because it just get a BYE from the other part - CU_ASSERT_EQUAL(callee->stat.number_of_LinphoneCallError,0); - CU_ASSERT_EQUAL(callee->stat.number_of_LinphoneCallEnd,1); + BC_ASSERT_EQUAL(callee->stat.number_of_LinphoneCallError,0, int, "%d"); + BC_ASSERT_EQUAL(callee->stat.number_of_LinphoneCallEnd,1, int, "%d"); linphone_core_manager_destroy(callee); linphone_core_manager_destroy(caller); @@ -3586,35 +3587,35 @@ static void incoming_reinvite_with_invalid_ack_sdp(){ LinphoneCoreManager* caller = linphone_core_manager_new( "pauline_rc"); LinphoneCoreManager* callee = linphone_core_manager_new( "marie_rc"); LinphoneCall * inc_call; - CU_ASSERT_TRUE(call(caller,callee)); + BC_ASSERT_TRUE(call(caller,callee)); inc_call = linphone_core_get_current_call(callee->lc); - CU_ASSERT_PTR_NOT_NULL(inc_call); + BC_ASSERT_PTR_NOT_NULL(inc_call); if (inc_call) { const LinphoneCallParams *caller_params; stats initial_caller_stat=caller->stat; stats initial_callee_stat=callee->stat; sal_call_set_sdp_handling(inc_call->op, SalOpSDPSimulateError); /* will force a parse error for the ACK SDP*/ - CU_ASSERT_PTR_NOT_NULL(setup_video(caller, callee, TRUE)); - CU_ASSERT_TRUE(wait_for(caller->lc,callee->lc,&callee->stat.number_of_LinphoneCallUpdating,initial_callee_stat.number_of_LinphoneCallUpdating+1)); - CU_ASSERT_TRUE(wait_for(caller->lc,callee->lc,&callee->stat.number_of_LinphoneCallStreamsRunning,initial_callee_stat.number_of_LinphoneCallStreamsRunning+1)); - CU_ASSERT_TRUE(wait_for(caller->lc,callee->lc,&caller->stat.number_of_LinphoneCallStreamsRunning,initial_caller_stat.number_of_LinphoneCallStreamsRunning)); + BC_ASSERT_PTR_NOT_NULL(setup_video(caller, callee, TRUE)); + BC_ASSERT_TRUE(wait_for(caller->lc,callee->lc,&callee->stat.number_of_LinphoneCallUpdating,initial_callee_stat.number_of_LinphoneCallUpdating+1)); + BC_ASSERT_TRUE(wait_for(caller->lc,callee->lc,&callee->stat.number_of_LinphoneCallStreamsRunning,initial_callee_stat.number_of_LinphoneCallStreamsRunning+1)); + BC_ASSERT_TRUE(wait_for(caller->lc,callee->lc,&caller->stat.number_of_LinphoneCallStreamsRunning,initial_caller_stat.number_of_LinphoneCallStreamsRunning)); /*Basically the negotiation failed but since the call was already running, we expect it to restore to the previous state so error stats should not be changed*/ - CU_ASSERT_EQUAL(callee->stat.number_of_LinphoneCallError,initial_callee_stat.number_of_LinphoneCallError); + BC_ASSERT_EQUAL(callee->stat.number_of_LinphoneCallError,initial_callee_stat.number_of_LinphoneCallError, int, "%d"); /*and remote should have received an update notification*/ - CU_ASSERT_EQUAL(caller->stat.number_of_LinphoneCallUpdatedByRemote,initial_caller_stat.number_of_LinphoneCallUpdatedByRemote+1); + BC_ASSERT_EQUAL(caller->stat.number_of_LinphoneCallUpdatedByRemote,initial_caller_stat.number_of_LinphoneCallUpdatedByRemote+1, int, "%d"); - CU_ASSERT_FALSE(linphone_call_params_video_enabled(linphone_call_get_current_params(linphone_core_get_current_call(callee->lc)))); + BC_ASSERT_FALSE(linphone_call_params_video_enabled(linphone_call_get_current_params(linphone_core_get_current_call(callee->lc)))); caller_params = linphone_call_get_current_params(linphone_core_get_current_call(caller->lc)); - CU_ASSERT_TRUE(wait_for(caller->lc,callee->lc,(int*)&caller_params->has_video,FALSE)); + BC_ASSERT_TRUE(wait_for(caller->lc,callee->lc,(int*)&caller_params->has_video,FALSE)); sal_call_set_sdp_handling(inc_call->op, SalOpSDPNormal); } linphone_core_terminate_all_calls(caller->lc); - CU_ASSERT_TRUE(wait_for(caller->lc,callee->lc,&caller->stat.number_of_LinphoneCallEnd,1)); - CU_ASSERT_TRUE(wait_for(caller->lc,callee->lc,&callee->stat.number_of_LinphoneCallEnd,1)); + BC_ASSERT_TRUE(wait_for(caller->lc,callee->lc,&caller->stat.number_of_LinphoneCallEnd,1)); + BC_ASSERT_TRUE(wait_for(caller->lc,callee->lc,&callee->stat.number_of_LinphoneCallEnd,1)); linphone_core_manager_destroy(callee); linphone_core_manager_destroy(caller); @@ -3628,32 +3629,32 @@ static void outgoing_reinvite_with_invalid_ack_sdp() { LinphoneCoreManager* caller = linphone_core_manager_new( "pauline_rc"); LinphoneCoreManager* callee = linphone_core_manager_new( "marie_rc"); LinphoneCall * out_call; - CU_ASSERT_TRUE(call(caller,callee)); + BC_ASSERT_TRUE(call(caller,callee)); out_call = linphone_core_get_current_call(caller->lc); - CU_ASSERT_PTR_NOT_NULL(out_call); + BC_ASSERT_PTR_NOT_NULL(out_call); if (out_call) { stats initial_caller_stat=caller->stat; stats initial_callee_stat=callee->stat; sal_call_set_sdp_handling(out_call->op, SalOpSDPSimulateError); /* will force a parse error for the ACK SDP*/ - CU_ASSERT_PTR_NOT_NULL(setup_video(caller, callee, TRUE)); - CU_ASSERT_TRUE(wait_for(caller->lc,callee->lc,&callee->stat.number_of_LinphoneCallUpdating,initial_callee_stat.number_of_LinphoneCallUpdating+1)); - CU_ASSERT_TRUE(wait_for(caller->lc,callee->lc,&callee->stat.number_of_LinphoneCallStreamsRunning,initial_callee_stat.number_of_LinphoneCallStreamsRunning+1)); - CU_ASSERT_TRUE(wait_for(caller->lc,callee->lc,&caller->stat.number_of_LinphoneCallStreamsRunning,initial_caller_stat.number_of_LinphoneCallStreamsRunning)); + BC_ASSERT_PTR_NOT_NULL(setup_video(caller, callee, TRUE)); + BC_ASSERT_TRUE(wait_for(caller->lc,callee->lc,&callee->stat.number_of_LinphoneCallUpdating,initial_callee_stat.number_of_LinphoneCallUpdating+1)); + BC_ASSERT_TRUE(wait_for(caller->lc,callee->lc,&callee->stat.number_of_LinphoneCallStreamsRunning,initial_callee_stat.number_of_LinphoneCallStreamsRunning+1)); + BC_ASSERT_TRUE(wait_for(caller->lc,callee->lc,&caller->stat.number_of_LinphoneCallStreamsRunning,initial_caller_stat.number_of_LinphoneCallStreamsRunning)); /*Basically the negotiation failed but since the call was already running, we expect it to restore to the previous state so error stats should not be changed*/ - CU_ASSERT_EQUAL(callee->stat.number_of_LinphoneCallError,initial_callee_stat.number_of_LinphoneCallError); + BC_ASSERT_EQUAL(callee->stat.number_of_LinphoneCallError,initial_callee_stat.number_of_LinphoneCallError, int, "%d"); /*and remote should not have received any update notification*/ - CU_ASSERT_EQUAL(caller->stat.number_of_LinphoneCallUpdatedByRemote,initial_caller_stat.number_of_LinphoneCallUpdatedByRemote); + BC_ASSERT_EQUAL(caller->stat.number_of_LinphoneCallUpdatedByRemote,initial_caller_stat.number_of_LinphoneCallUpdatedByRemote, int, "%d"); - CU_ASSERT_FALSE(linphone_call_params_video_enabled(linphone_call_get_current_params(linphone_core_get_current_call(callee->lc)))); - CU_ASSERT_FALSE(linphone_call_params_video_enabled(linphone_call_get_current_params(linphone_core_get_current_call(caller->lc)))); + BC_ASSERT_FALSE(linphone_call_params_video_enabled(linphone_call_get_current_params(linphone_core_get_current_call(callee->lc)))); + BC_ASSERT_FALSE(linphone_call_params_video_enabled(linphone_call_get_current_params(linphone_core_get_current_call(caller->lc)))); sal_call_set_sdp_handling(out_call->op, SalOpSDPNormal); } linphone_core_terminate_all_calls(caller->lc); - CU_ASSERT_TRUE(wait_for(caller->lc,callee->lc,&caller->stat.number_of_LinphoneCallEnd,1)); - CU_ASSERT_TRUE(wait_for(caller->lc,callee->lc,&callee->stat.number_of_LinphoneCallEnd,1)); + BC_ASSERT_TRUE(wait_for(caller->lc,callee->lc,&caller->stat.number_of_LinphoneCallEnd,1)); + BC_ASSERT_TRUE(wait_for(caller->lc,callee->lc,&callee->stat.number_of_LinphoneCallEnd,1)); linphone_core_manager_destroy(callee); linphone_core_manager_destroy(caller); @@ -3676,11 +3677,11 @@ static void call_with_paused_no_sdp_on_resume() { marie = linphone_core_manager_new( "marie_rc"); pauline = linphone_core_manager_new( "pauline_rc"); - CU_ASSERT_TRUE(call(pauline,marie)); + BC_ASSERT_TRUE(call(pauline,marie)); liblinphone_tester_check_rtcp(marie,pauline); call_marie = linphone_core_get_current_call(marie->lc); - CU_ASSERT_PTR_NOT_NULL(call_marie); + BC_ASSERT_PTR_NOT_NULL(call_marie); if (!call_marie) goto end; ms_message("== Call is OK =="); @@ -3690,9 +3691,9 @@ static void call_with_paused_no_sdp_on_resume() { linphone_core_pause_call(marie->lc,call_marie); ms_message("== Call pausing =="); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallPausing,1)); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallPausedByRemote,1)); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallPaused,1)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallPausing,1)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallPausedByRemote,1)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallPaused,1)); /*stay in pause a little while in order to generate traffic*/ wait_for_until(pauline->lc, marie->lc, NULL, 5, 2000); @@ -3703,19 +3704,19 @@ static void call_with_paused_no_sdp_on_resume() { linphone_core_resume_call(marie->lc,call_marie); - CU_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&marie->stat.number_of_LinphoneCallStreamsRunning,2)); - CU_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&pauline->stat.number_of_LinphoneCallStreamsRunning,2)); + BC_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&marie->stat.number_of_LinphoneCallStreamsRunning,2)); + BC_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&pauline->stat.number_of_LinphoneCallStreamsRunning,2)); wait_for_until(marie->lc, pauline->lc, &dummy, 1, 3000); - CU_ASSERT_TRUE(linphone_call_get_audio_stats(call_marie)->download_bandwidth>70); - CU_ASSERT_TRUE(linphone_call_get_audio_stats(linphone_core_get_current_call(pauline->lc))->download_bandwidth>70); + BC_ASSERT_TRUE(linphone_call_get_audio_stats(call_marie)->download_bandwidth>70); + BC_ASSERT_TRUE(linphone_call_get_audio_stats(linphone_core_get_current_call(pauline->lc))->download_bandwidth>70); end: end_call(marie,pauline); linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); leaked_objects=belle_sip_object_get_object_count()-begin; - CU_ASSERT_TRUE(leaked_objects==0); + BC_ASSERT_TRUE(leaked_objects==0); if (leaked_objects>0){ belle_sip_object_dump_active_objects(); } @@ -3755,8 +3756,8 @@ static void early_media_without_sdp_in_200_base( bool_t use_video, bool_t use_ic marie_call = linphone_core_invite_address_with_params(marie->lc, pauline->identity, params); marie_call_log = linphone_call_get_call_log(marie_call); - CU_ASSERT_TRUE(wait_for_list(lcs, &pauline->stat.number_of_LinphoneCallIncomingReceived,1,3000)); - CU_ASSERT_TRUE(wait_for_list(lcs, &marie->stat.number_of_LinphoneCallOutgoingRinging,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs, &pauline->stat.number_of_LinphoneCallIncomingReceived,1,3000)); + BC_ASSERT_TRUE(wait_for_list(lcs, &marie->stat.number_of_LinphoneCallOutgoingRinging,1,1000)); if (linphone_core_inc_invite_pending(pauline->lc)) { LinphoneCall* pauline_call = linphone_core_get_current_call(pauline->lc); @@ -3764,8 +3765,8 @@ static void early_media_without_sdp_in_200_base( bool_t use_video, bool_t use_ic /* send a 183 to initiate the early media */ linphone_core_accept_early_media(pauline->lc, pauline_call); - CU_ASSERT_TRUE( wait_for_list(lcs, &pauline->stat.number_of_LinphoneCallIncomingEarlyMedia,1,2000) ); - CU_ASSERT_TRUE( wait_for_list(lcs, &marie->stat.number_of_LinphoneCallOutgoingEarlyMedia,1,2000) ); + BC_ASSERT_TRUE( wait_for_list(lcs, &pauline->stat.number_of_LinphoneCallIncomingEarlyMedia,1,2000) ); + BC_ASSERT_TRUE( wait_for_list(lcs, &marie->stat.number_of_LinphoneCallOutgoingEarlyMedia,1,2000) ); liblinphone_tester_check_rtcp(marie, pauline); @@ -3773,11 +3774,11 @@ static void early_media_without_sdp_in_200_base( bool_t use_video, bool_t use_ic sal_call_set_sdp_handling(pauline_call->op, SalOpSDPSimulateRemove); linphone_core_accept_call(pauline->lc, pauline_call); - CU_ASSERT_TRUE(wait_for_list(lcs, &marie->stat.number_of_LinphoneCallConnected, 1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs, &marie->stat.number_of_LinphoneCallConnected, 1,1000)); connected_time=ms_get_cur_time_ms(); - CU_ASSERT_TRUE(wait_for_list(lcs, &marie->stat.number_of_LinphoneCallStreamsRunning, 1,3000)); + BC_ASSERT_TRUE(wait_for_list(lcs, &marie->stat.number_of_LinphoneCallStreamsRunning, 1,3000)); - CU_ASSERT_EQUAL(marie_call, linphone_core_get_current_call(marie->lc)); + BC_ASSERT_PTR_EQUAL(marie_call, linphone_core_get_current_call(marie->lc)); liblinphone_tester_check_rtcp(marie, pauline); /*just to have a call duration !=0*/ @@ -3785,10 +3786,10 @@ static void early_media_without_sdp_in_200_base( bool_t use_video, bool_t use_ic linphone_core_terminate_all_calls(pauline->lc); - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallEnd,1,1000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallEnd,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallEnd,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallEnd,1,1000)); ended_time=ms_get_cur_time_ms(); - CU_ASSERT_TRUE( labs((linphone_call_log_get_duration(marie_call_log)*1000) - (int64_t)(ended_time - connected_time)) <=1000 ); + BC_ASSERT_TRUE( labs((linphone_call_log_get_duration(marie_call_log)*1000) - (int64_t)(ended_time - connected_time)) <=1000 ); ms_list_free(lcs); } @@ -3832,15 +3833,15 @@ static void call_with_generic_cn(void) { linphone_core_set_record_file(pauline->lc, recorded_file); linphone_core_enable_generic_confort_noise(marie->lc, TRUE); linphone_core_enable_generic_confort_noise(pauline->lc, TRUE); - CU_ASSERT_TRUE(call(marie,pauline)); + BC_ASSERT_TRUE(call(marie,pauline)); pauline_call=linphone_core_get_current_call(pauline->lc); - CU_ASSERT_PTR_NOT_NULL(pauline_call); + BC_ASSERT_PTR_NOT_NULL(pauline_call); if (pauline_call){ const rtp_stats_t *rtps; wait_for_until(marie->lc, pauline->lc, NULL, 0, 8000); rtps=rtp_session_get_stats(pauline_call->audiostream->ms.sessions.rtp_session); - CU_ASSERT_TRUE(rtps->packet_recv<=300 && rtps->packet_recv>=200); + BC_ASSERT_TRUE(rtps->packet_recv<=300 && rtps->packet_recv>=200); } end_call(marie,pauline); @@ -3849,9 +3850,9 @@ static void call_with_generic_cn(void) { int err; err=stat(recorded_file,&stbuf); - CU_ASSERT_EQUAL(err, 0); + BC_ASSERT_EQUAL(err, 0, int, "%d"); if (err==0){ - CU_ASSERT_TRUE(stbuf.st_size>120000); + BC_ASSERT_TRUE(stbuf.st_size>120000); } } @@ -3859,7 +3860,7 @@ static void call_with_generic_cn(void) { linphone_core_manager_destroy(pauline); leaked_objects=belle_sip_object_get_object_count()-begin; - CU_ASSERT_TRUE(leaked_objects==0); + BC_ASSERT_TRUE(leaked_objects==0); if (leaked_objects>0){ belle_sip_object_dump_active_objects(); } @@ -3913,24 +3914,24 @@ static void call_with_transport_change_base(bool_t succesfull_call) { sip_tr.tls_port = 0; linphone_core_set_sip_transports(marie->lc,&sip_tr); if (succesfull_call) { - CU_ASSERT_TRUE(call(marie,pauline)); + BC_ASSERT_TRUE(call(marie,pauline)); linphone_core_terminate_all_calls(marie->lc); } else linphone_core_invite(marie->lc,"nexiste_pas"); if (succesfull_call) - CU_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&marie->stat.number_of_LinphoneCallEnd,1)); - CU_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&marie->stat.number_of_LinphoneCallReleased,1)); + BC_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&marie->stat.number_of_LinphoneCallEnd,1)); + BC_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&marie->stat.number_of_LinphoneCallReleased,1)); if (succesfull_call) { - CU_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&pauline->stat.number_of_LinphoneCallEnd,1)); - CU_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&pauline->stat.number_of_LinphoneCallReleased,1)); + BC_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&pauline->stat.number_of_LinphoneCallEnd,1)); + BC_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&pauline->stat.number_of_LinphoneCallReleased,1)); } linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); leaked_objects=belle_sip_object_get_object_count()-begin; - CU_ASSERT_TRUE(leaked_objects==0); + BC_ASSERT_TRUE(leaked_objects==0); if (leaked_objects>0){ belle_sip_object_dump_active_objects(); } @@ -3975,9 +3976,9 @@ static void video_call_with_re_invite_inactive_followed_by_re_invite_base(Linpho linphone_core_update_call(marie->lc, linphone_core_get_current_call(marie->lc),params); linphone_call_params_destroy(params); - CU_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&marie->stat.number_of_LinphoneCallUpdating,1)); - CU_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&marie->stat.number_of_LinphoneCallPaused,1)); - CU_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&pauline->stat.number_of_LinphoneCallPausedByRemote,1)); + BC_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&marie->stat.number_of_LinphoneCallUpdating,1)); + BC_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&marie->stat.number_of_LinphoneCallPaused,1)); + BC_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&pauline->stat.number_of_LinphoneCallPausedByRemote,1)); check_media_direction(marie,linphone_core_get_current_call(marie->lc),lcs,LinphoneMediaDirectionInactive,LinphoneMediaDirectionInactive); check_media_direction(pauline,linphone_core_get_current_call(pauline->lc), lcs, LinphoneMediaDirectionInactive, LinphoneMediaDirectionInactive); @@ -3997,18 +3998,18 @@ static void video_call_with_re_invite_inactive_followed_by_re_invite_base(Linpho linphone_core_resume_call(marie->lc,linphone_core_get_current_call(marie->lc)); - CU_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&marie->stat.number_of_LinphoneCallResuming,1)); - CU_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&marie->stat.number_of_LinphoneCallStreamsRunning,2)); - CU_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&pauline->stat.number_of_LinphoneCallStreamsRunning,2)); + BC_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&marie->stat.number_of_LinphoneCallResuming,1)); + BC_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&marie->stat.number_of_LinphoneCallStreamsRunning,2)); + BC_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&pauline->stat.number_of_LinphoneCallStreamsRunning,2)); check_media_direction(marie,linphone_core_get_current_call(marie->lc),lcs,LinphoneMediaDirectionSendRecv,LinphoneMediaDirectionSendRecv); check_media_direction(pauline,linphone_core_get_current_call(pauline->lc),lcs,LinphoneMediaDirectionSendRecv,LinphoneMediaDirectionSendRecv); /*assert that after pause and resume, SRTP is still being used*/ current_params = linphone_call_get_current_params(linphone_core_get_current_call(pauline->lc)); - CU_ASSERT_TRUE(linphone_call_params_get_media_encryption(current_params) == mode); + BC_ASSERT_TRUE(linphone_call_params_get_media_encryption(current_params) == mode); current_params = linphone_call_get_current_params(linphone_core_get_current_call(marie->lc)); - CU_ASSERT_TRUE(linphone_call_params_get_media_encryption(current_params) == mode); + BC_ASSERT_TRUE(linphone_call_params_get_media_encryption(current_params) == mode); } end_call(marie,pauline); @@ -4016,7 +4017,7 @@ static void video_call_with_re_invite_inactive_followed_by_re_invite_base(Linpho linphone_core_manager_destroy(pauline); leaked_objects=belle_sip_object_get_object_count()-begin; - CU_ASSERT_TRUE(leaked_objects==0); + BC_ASSERT_TRUE(leaked_objects==0); if (leaked_objects>0){ belle_sip_object_dump_active_objects(); } diff --git a/tester/common/bc_tester_utils.c b/tester/common/bc_tester_utils.c index 77eb0372c..7c47dc25f 100644 --- a/tester/common/bc_tester_utils.c +++ b/tester/common/bc_tester_utils.c @@ -24,6 +24,7 @@ along with this program. If not, see . #include +#include "CUnit/Basic.h" #include "CUnit/Automated.h" #if WINAPI_FAMILY_PHONE_APP diff --git a/tester/common/bc_tester_utils.h b/tester/common/bc_tester_utils.h index 6bd17b03c..fcde1af9d 100644 --- a/tester/common/bc_tester_utils.h +++ b/tester/common/bc_tester_utils.h @@ -20,9 +20,10 @@ #ifndef TESTER_UTILS_H #define TESTER_UTILS_H -#include "CUnit/Basic.h" #include #include +#include +#include extern const char *bc_tester_read_dir_prefix; extern const char *bc_tester_writable_dir_prefix; @@ -31,6 +32,8 @@ extern int bc_printf_verbosity_info; extern int bc_printf_verbosity_error; typedef void (*test_function_t)(void); +typedef int (*init_function_t)(void); +typedef int (*cleanup_function_t)(void); typedef int (*test_suite_function_t)(const char *name); typedef struct { @@ -40,8 +43,8 @@ typedef struct { typedef struct { const char *name; - CU_InitializeFunc init_func; - CU_CleanupFunc cleanup_func; + init_function_t init_func; + cleanup_function_t cleanup_func; int nb_tests; test_t *tests; } test_suite_t; @@ -85,63 +88,62 @@ int bc_tester_suite_index(const char *suite_name); */ char * bc_tester_res(const char *name); -/*Redefine the CU_... macros WITHOUT final ';' semicolon, to allow IF conditions */ -#define BC_ASSERT_EQUAL(actual, expected) CU_assertImplementation(((actual) == (expected)), __LINE__, ("CU_ASSERT_EQUAL(" #actual "," #expected ")"), __FILE__, "", CU_FALSE) -#define BC_PASS(msg) CU_assertImplementation(CU_TRUE, __LINE__, ("CU_PASS(" #msg ")"), __FILE__, "", CU_FALSE) -#define BC_ASSERT(value) CU_assertImplementation((value), __LINE__, #value, __FILE__, "", CU_FALSE) -#define BC_ASSERT_FATAL(value) CU_assertImplementation((value), __LINE__, #value, __FILE__, "", CU_TRUE) -#define BC_TEST(value) CU_assertImplementation((value), __LINE__, #value, __FILE__, "", CU_FALSE) -#define BC_TEST_FATAL(value) CU_assertImplementation((value), __LINE__, #value, __FILE__, "", CU_TRUE) -#define BC_ASSERT_TRUE(value) CU_assertImplementation((value), __LINE__, ("CU_ASSERT_TRUE(" #value ")"), __FILE__, "", CU_FALSE) -#define BC_ASSERT_TRUE_FATAL(value) CU_assertImplementation((value), __LINE__, ("CU_ASSERT_TRUE_FATAL(" #value ")"), __FILE__, "", CU_TRUE) -#define BC_ASSERT_FALSE(value) CU_assertImplementation(!(value), __LINE__, ("CU_ASSERT_FALSE(" #value ")"), __FILE__, "", CU_FALSE) -#define BC_ASSERT_FALSE_FATAL(value) CU_assertImplementation(!(value), __LINE__, ("CU_ASSERT_FALSE_FATAL(" #value ")"), __FILE__, "", CU_TRUE) -#define BC_ASSERT_EQUAL(actual, expected) CU_assertImplementation(((actual) == (expected)), __LINE__, ("CU_ASSERT_EQUAL(" #actual "," #expected ")"), __FILE__, "", CU_FALSE) -#define BC_ASSERT_EQUAL_FATAL(actual, expected) CU_assertImplementation(((actual) == (expected)), __LINE__, ("CU_ASSERT_EQUAL_FATAL(" #actual "," #expected ")"), __FILE__, "", CU_TRUE) -#define BC_ASSERT_NOT_EQUAL(actual, expected) CU_assertImplementation(((actual) != (expected)), __LINE__, ("CU_ASSERT_NOT_EQUAL(" #actual "," #expected ")"), __FILE__, "", CU_FALSE) -#define BC_ASSERT_NOT_EQUAL_FATAL(actual, expected) CU_assertImplementation(((actual) != (expected)), __LINE__, ("CU_ASSERT_NOT_EQUAL_FATAL(" #actual "," #expected ")"), __FILE__, "", CU_TRUE) -#define BC_ASSERT_PTR_EQUAL(actual, expected) CU_assertImplementation(((const void*)(actual) == (const void*)(expected)), __LINE__, ("CU_ASSERT_PTR_EQUAL(" #actual "," #expected ")"), __FILE__, "", CU_FALSE) -#define BC_ASSERT_PTR_EQUAL_FATAL(actual, expected) CU_assertImplementation(((const void*)(actual) == (const void*)(expected)), __LINE__, ("CU_ASSERT_PTR_EQUAL_FATAL(" #actual "," #expected ")"), __FILE__, "", CU_TRUE) -#define BC_ASSERT_PTR_NOT_EQUAL(actual, expected) CU_assertImplementation(((const void*)(actual) != (const void*)(expected)), __LINE__, ("CU_ASSERT_PTR_NOT_EQUAL(" #actual "," #expected ")"), __FILE__, "", CU_FALSE) -#define BC_ASSERT_PTR_NOT_EQUAL_FATAL(actual, expected) CU_assertImplementation(((const void*)(actual) != (const void*)(expected)), __LINE__, ("CU_ASSERT_PTR_NOT_EQUAL_FATAL(" #actual "," #expected ")"), __FILE__, "", CU_TRUE) -#define BC_ASSERT_PTR_NULL(value) CU_assertImplementation((NULL == (const void*)(value)), __LINE__, ("CU_ASSERT_PTR_NULL(" #value")"), __FILE__, "", CU_FALSE) -#define BC_ASSERT_PTR_NULL_FATAL(value) CU_assertImplementation((NULL == (const void*)(value)), __LINE__, ("CU_ASSERT_PTR_NULL_FATAL(" #value")"), __FILE__, "", CU_TRUE) -#define BC_ASSERT_PTR_NOT_NULL(value) CU_assertImplementation((NULL != (const void*)(value)), __LINE__, ("CU_ASSERT_PTR_NOT_NULL(" #value")"), __FILE__, "", CU_FALSE) -#define BC_ASSERT_PTR_NOT_NULL_FATAL(value) CU_assertImplementation((NULL != (const void*)(value)), __LINE__, ("CU_ASSERT_PTR_NOT_NULL_FATAL(" #value")"), __FILE__, "", CU_TRUE) -#define BC_ASSERT_STRING_EQUAL(actual, expected) CU_assertImplementation(!(strcmp((const char*)(actual), (const char*)(expected))), __LINE__, ("CU_ASSERT_STRING_EQUAL(" #actual "," #expected ")"), __FILE__, "", CU_FALSE) -#define BC_ASSERT_STRING_EQUAL_FATAL(actual, expected) CU_assertImplementation(!(strcmp((const char*)(actual), (const char*)(expected))), __LINE__, ("CU_ASSERT_STRING_EQUAL_FATAL(" #actual "," #expected ")"), __FILE__, "", CU_TRUE) -#define BC_ASSERT_STRING_NOT_EQUAL(actual, expected) CU_assertImplementation((strcmp((const char*)(actual), (const char*)(expected))), __LINE__, ("CU_ASSERT_STRING_NOT_EQUAL(" #actual "," #expected ")"), __FILE__, "", CU_FALSE) -#define BC_ASSERT_STRING_NOT_EQUAL_FATAL(actual, expected) CU_assertImplementation((strcmp((const char*)(actual), (const char*)(expected))), __LINE__, ("CU_ASSERT_STRING_NOT_EQUAL_FATAL(" #actual "," #expected ")"), __FILE__, "", CU_TRUE) -#define BC_ASSERT_NSTRING_EQUAL(actual, expected, count) CU_assertImplementation(!(strncmp((const char*)(actual), (const char*)(expected), (size_t)(count))), __LINE__, ("CU_ASSERT_NSTRING_EQUAL(" #actual "," #expected "," #count ")"), __FILE__, "", CU_FALSE) -#define BC_ASSERT_NSTRING_EQUAL_FATAL(actual, expected, count) CU_assertImplementation(!(strncmp((const char*)(actual), (const char*)(expected), (size_t)(count))), __LINE__, ("CU_ASSERT_NSTRING_EQUAL_FATAL(" #actual "," #expected "," #count ")"), __FILE__, "", CU_TRUE) -#define BC_ASSERT_NSTRING_NOT_EQUAL(actual, expected, count) CU_assertImplementation((strncmp((const char*)(actual), (const char*)(expected), (size_t)(count))), __LINE__, ("CU_ASSERT_NSTRING_NOT_EQUAL(" #actual "," #expected "," #count ")"), __FILE__, "", CU_FALSE) -#define BC_ASSERT_NSTRING_NOT_EQUAL_FATAL(actual, expected, count) CU_assertImplementation((strncmp((const char*)(actual), (const char*)(expected), (size_t)(count))), __LINE__, ("CU_ASSERT_NSTRING_NOT_EQUAL_FATAL(" #actual "," #expected "," #count ")"), __FILE__, "", CU_TRUE) -#define BC_ASSERT_DOUBLE_EQUAL(actual, expected, granularity) CU_assertImplementation(((fabs((double)(actual) - (expected)) <= fabs((double)(granularity)))), __LINE__, ("CU_ASSERT_DOUBLE_EQUAL(" #actual "," #expected "," #granularity ")"), __FILE__, "", CU_FALSE) -#define BC_ASSERT_DOUBLE_EQUAL_FATAL(actual, expected, granularity) CU_assertImplementation(((fabs((double)(actual) - (expected)) <= fabs((double)(granularity)))), __LINE__, ("CU_ASSERT_DOUBLE_EQUAL_FATAL(" #actual "," #expected "," #granularity ")"), __FILE__, "", CU_TRUE) -#define BC_ASSERT_DOUBLE_NOT_EQUAL(actual, expected, granularity) CU_assertImplementation(((fabs((double)(actual) - (expected)) > fabs((double)(granularity)))), __LINE__, ("CU_ASSERT_DOUBLE_NOT_EQUAL(" #actual "," #expected "," #granularity ")"), __FILE__, "", CU_FALSE) -#define BC_ASSERT_DOUBLE_NOT_EQUAL_FATAL(actual, expected, granularity) CU_assertImplementation(((fabs((double)(actual) - (expected)) > fabs((double)(granularity)))), __LINE__, ("CU_ASSERT_DOUBLE_NOT_EQUAL_FATAL(" #actual "," #expected "," #granularity ")"), __FILE__, "", CU_TRUE) -#define BC_ASSERT_GREATER(actual, expected) CU_assertImplementation(((actual) >= (expected)), __LINE__, ("CU_ASSERT_GREATER(" #actual "," #expected ")"), __FILE__, "", CU_FALSE) -#define BC_ASSERT_LOWER(actual, expected) CU_assertImplementation(((actual) <= (expected)), __LINE__, ("CU_ASSERT_LOWER(" #actual "," #expected ")"), __FILE__, "", CU_FALSE) -/*Add some custom defines with logs in case of fail*/ -#define BC_ASSERT_EQUAL_WITH_TYPE(actual, expected, type, type_format) { \ - type cactual = (actual), cexpected = (expected); \ - if (! BC_ASSERT_EQUAL(cactual, cexpected)) { \ - bc_tester_printf(bc_printf_verbosity_error, "%s:%d - Expected " #actual " = " #expected " but was " type_format " != " type_format "\n", __FILE__, __LINE__, cactual, cexpected); \ - } \ -} -#define BC_ASSERT_GREATER_WITH_TYPE(actual, expected, type, type_format) { \ - type cactual = (actual), cexpected = (expected); \ - if (! BC_ASSERT_GREATER(cactual, cexpected)) { \ - bc_tester_printf(bc_printf_verbosity_error, "%s:%d - Expected " #actual " >= " #expected " but was " type_format " < " type_format "\n", __FILE__, __LINE__, cactual, cexpected); \ - } \ -} -#define BC_ASSERT_LOWER_WITH_TYPE(actual, expected, type, type_format) { \ - type cactual = (actual), cexpected = (expected); \ - if (! BC_ASSERT_LOWER(cactual, cexpected)) { \ - bc_tester_printf(bc_printf_verbosity_error, "%s:%d - Expected " #actual " <= " #expected " but was " type_format " > " type_format "\n", __FILE__, __LINE__, cactual, cexpected); \ - } \ -} +/*Redefine the CU_... macros WITHOUT final ';' semicolon, to allow IF conditions and with smarter error message */ +extern int CU_assertImplementation(int bValue, + unsigned int uiLine, + const char *strCondition, + const char *strFile, + const char *strFunction, + int bFatal); + +#define _BC_ASSERT(pred, format, fatal) CU_assertImplementation(pred, __LINE__, format, __FILE__, "", fatal) +#define _BC_ASSERT_PRED(name, pred, actual, expected, type, fatal, ...) \ + do { \ + char format[4096] = {0}; \ + type cactual = (actual); \ + type cexpected = (expected); \ + snprintf(format, 4096, name "(" #actual ", " #expected ") - " __VA_ARGS__); \ + _BC_ASSERT(pred, format, fatal); \ + } while (0) +#define BC_PASS(msg) _BC_ASSERT(TRUE, "BC_PASS(" #msg ").", FALSE) +#define BC_FAIL(msg) _BC_ASSERT(FALSE, "BC_FAIL(" #msg ").", FALSE) +#define BC_ASSERT(value) _BC_ASSERT((value), #value, FALSE) +#define BC_ASSERT_FATAL(value) _BC_ASSERT((value), #value, TRUE) +#define BC_TEST(value) _BC_ASSERT((value), #value, FALSE) +#define BC_TEST_FATAL(value) _BC_ASSERT((value), #value, TRUE) +#define BC_ASSERT_TRUE(value) _BC_ASSERT((value), ("BC_ASSERT_TRUE(" #value ")"), FALSE) +#define BC_ASSERT_TRUE_FATAL(value) _BC_ASSERT((value), ("BC_ASSERT_TRUE_FATAL(" #value ")"), TRUE) +#define BC_ASSERT_FALSE(value) _BC_ASSERT(!(value), ("BC_ASSERT_FALSE(" #value ")"), FALSE) +#define BC_ASSERT_FALSE_FATAL(value) _BC_ASSERT(!(value), ("BC_ASSERT_FALSE_FATAL(" #value ")"), TRUE) +#define BC_ASSERT_EQUAL(actual, expected, type, type_format) _BC_ASSERT_PRED("BC_ASSERT_EQUAL", ((cactual) == (cexpected)), actual, expected, type, FALSE, "Expected " type_format " but was " type_format ".", cexpected, cactual) +#define BC_ASSERT_EQUAL_FATAL(actual, expected, type, type_format) _BC_ASSERT_PRED("BC_ASSERT_EQUAL_FATAL", ((cactual) == (cexpected)), actual, expected, type, TRUE, "Expected " type_format " but was " type_format ".", cexpected, cactual) +#define BC_ASSERT_NOT_EQUAL(actual, expected, type, type_format) _BC_ASSERT_PRED("BC_ASSERT_NOT_EQUAL", ((cactual) != (cexpected)), actual, expected, type, FALSE, "Expected NOT " type_format " but it was.", cexpected) +#define BC_ASSERT_NOT_EQUAL_FATAL(actual, expected, type, type_format) _BC_ASSERT_PRED("BC_ASSERT_NOT_EQUAL_FATAL", ((cactual) != (cexpected)), actual, expected, type, TRUE, "Expected NOT " type_format " but it was.", cexpected) +#define BC_ASSERT_PTR_EQUAL(actual, expected) _BC_ASSERT_PRED("BC_ASSERT_PTR_EQUAL", ((cactual) == (cexpected)), (const void*)(actual), (const void*)(expected), const void*, FALSE, "Expected %p but was %p.", cexpected, cactual) +#define BC_ASSERT_PTR_EQUAL_FATAL(actual, expected) _BC_ASSERT_PRED("BC_ASSERT_PTR_EQUAL_FATAL", ((cactual) == (cexpected)), (const void*)(actual), (const void*)(expected), const void*, TRUE, "Expected %p but was %p.", cexpected, cactual) +#define BC_ASSERT_PTR_NOT_EQUAL(actual, expected) _BC_ASSERT_PRED("BC_ASSERT_PTR_NOT_EQUAL", ((cactual) != (cexpected)), (const void*)(actual), (const void*)(expected), const void*, FALSE, "Expected NOT %p but it was.", cexpected) +#define BC_ASSERT_PTR_NOT_EQUAL_FATAL(actual, expected) _BC_ASSERT_PRED("BC_ASSERT_PTR_NOT_EQUAL_FATAL", ((cactual) != (cexpected)), (const void*)(actual), (const void*)(expected), const void*, TRUE, "Expected NOT %p but it was.", cexpected) +#define BC_ASSERT_PTR_NULL(value) _BC_ASSERT_PRED("BC_ASSERT_PTR_NULL", ((cactual) == (cexpected)), (const void*)(value), (const void*)NULL, const void*, FALSE, "Expected NULL but was %p.", cactual) +#define BC_ASSERT_PTR_NULL_FATAL(value) _BC_ASSERT_PRED("BC_ASSERT_PTR_NULL_FATAL", ((cactual) == (cexpected)), (const void*)(value), (const void*)NULL, const void*, TRUE, "Expected NULL but was %p.", cactual) +#define BC_ASSERT_PTR_NOT_NULL(value) _BC_ASSERT_PRED("BC_ASSERT_PTR_NOT_NULL", ((cactual) != (cexpected)), (const void*)(value), (const void*)NULL, const void*, FALSE, "Expected NOT NULL but it was.") +#define BC_ASSERT_PTR_NOT_NULL_FATAL(value) _BC_ASSERT_PRED("BC_ASSERT_PTR_NOT_NULL_FATAL", ((cactual) != (cexpected)), (const void*)(value), (const void*)NULL, const void*, TRUE, "Expected NOT NULL but it was.") +#define BC_ASSERT_STRING_EQUAL(actual, expected) _BC_ASSERT_PRED("BC_ASSERT_STRING_EQUAL", !(strcmp((const char*)(cactual), (const char*)(cexpected))), actual, expected, const char*, FALSE, "Expected %s but was %s.", cexpected, cactual) +#define BC_ASSERT_STRING_EQUAL_FATAL(actual, expected) _BC_ASSERT_PRED("BC_ASSERT_STRING_EQUAL_FATAL", !(strcmp((const char*)(cactual), (const char*)(cexpected))), actual, expected, const char*, TRUE, "Expected %s but was %s.", cexpected, cactual) +#define BC_ASSERT_STRING_NOT_EQUAL(actual, expected) _BC_ASSERT_PRED("BC_ASSERT_STRING_NOT_EQUAL", (strcmp((const char*)(cactual), (const char*)(cexpected))), actual, expected, const char*, FALSE, "Expected NOT %s but it was.", cexpected) +#define BC_ASSERT_STRING_NOT_EQUAL_FATAL(actual, expected) _BC_ASSERT_PRED("BC_ASSERT_STRING_NOT_EQUAL_FATAL", (strcmp((const char*)(cactual), (const char*)(cexpected))), actual, expected, const char*, TRUE, "Expected NOT %s but it was.", cexpected) +#define BC_ASSERT_NSTRING_EQUAL(actual, expected, count) _BC_ASSERT_PRED("BC_ASSERT_NSTRING_EQUAL", !(strncmp((const char*)(cactual), (const char*)(cexpected), (size_t)(count))), actual, expected, const char*, FALSE, "Expected %*s but was %*s.", (int)(count), cexpected, (int)(count), cactual) +#define BC_ASSERT_NSTRING_EQUAL_FATAL(actual, expected, count) _BC_ASSERT_PRED("BC_ASSERT_NSTRING_EQUAL_FATAL", !(strncmp((const char*)(cactual), (const char*)(cexpected), (size_t)(count))), actual, expected, const char*, TRUE, "Expected %*s but was %*s.", (int)count, cexpected, (int)count, cactual) +#define BC_ASSERT_NSTRING_NOT_EQUAL(actual, expected, count) _BC_ASSERT_PRED("BC_ASSERT_NSTRING_NOT_EQUAL", (strncmp((const char*)(cactual), (const char*)(cexpected), (size_t)(count))), actual, expected, const char*, FALSE, "Expected %*s but it was.", (int)count, cexpected) +#define BC_ASSERT_NSTRING_NOT_EQUAL_FATAL(actual, expected, count) _BC_ASSERT_PRED("BC_ASSERT_NSTRING_NOT_EQUAL_FATAL", (strncmp((const char*)(cactual), (const char*)(cexpected), (size_t)(count))), actual, expected, const char*, TRUE, "Expected %*s but it was.", (int)count, cexpected) +#define BC_ASSERT_DOUBLE_EQUAL(actual, expected, granularity) _BC_ASSERT_PRED("BC_ASSERT_DOUBLE_EQUAL", ((fabs((double)(cactual) - (cexpected)) <= fabs((double)(granularity)))), actual, expected, double, FALSE, "Expected %f but was %f.", cexpected, cactual) +#define BC_ASSERT_DOUBLE_EQUAL_FATAL(actual, expected, granularity) _BC_ASSERT_PRED("BC_ASSERT_DOUBLE_EQUAL_FATAL", ((fabs((double)(cactual) - (cexpected)) <= fabs((double)(granularity)))), actual, expected, double, TRUE, "Expected %f but was %f.", cexpected, cactual) +#define BC_ASSERT_DOUBLE_NOT_EQUAL(actual, expected, granularity) _BC_ASSERT_PRED("BC_ASSERT_DOUBLE_NOT_EQUAL", ((fabs((double)(cactual) - (cexpected)) > fabs((double)(granularity)))), actual, expected, double, FALSE, "Expected %f but was %f.", cexpected, cactual) +#define BC_ASSERT_DOUBLE_NOT_EQUAL_FATAL(actual, expected, granularity) _BC_ASSERT_PRED("BC_ASSERT_DOUBLE_NOT_EQUAL_FATAL", ((fabs((double)(cactual) - (cexpected)) > fabs((double)(granularity)))), actual, expected, double, TRUE, "Expected %f but was %f.", cexpected, cactual) + +/*Custom defines*/ +#define BC_ASSERT_GREATER(actual, lower, type, type_format) _BC_ASSERT_PRED("BC_ASSERT_GREATER", ((cactual) >= (cexpected)), actual, lower, type, FALSE, "Expected " type_format " but was " type_format ".", cexpected, cactual) +#define BC_ASSERT_LOWER(actual, lower, type, type_format) _BC_ASSERT_PRED("BC_ASSERT_LOWER", ((cactual) <= (cexpected)), actual, lower, type, FALSE, "Expected " type_format " but was " type_format ".", cexpected, cactual) #ifdef __cplusplus } diff --git a/tester/dtmf_tester.c b/tester/dtmf_tester.c index c4c2e3bfe..22d03837c 100644 --- a/tester/dtmf_tester.c +++ b/tester/dtmf_tester.c @@ -43,12 +43,12 @@ void send_dtmf_base(bool_t use_rfc2833, bool_t use_sipinfo, char dtmf, char* dtm linphone_core_set_use_rfc2833_for_dtmf(pauline->lc, use_rfc2833); linphone_core_set_use_info_for_dtmf(pauline->lc, use_sipinfo); - CU_ASSERT_TRUE(call(pauline,marie)); + BC_ASSERT_TRUE(call(pauline,marie)); marie_call = linphone_core_get_current_call(marie->lc); - - CU_ASSERT_PTR_NOT_NULL(marie_call); - + + BC_ASSERT_PTR_NOT_NULL(marie_call); + if (!marie_call) return; if (dtmf != '\0') { @@ -56,7 +56,7 @@ void send_dtmf_base(bool_t use_rfc2833, bool_t use_sipinfo, char dtmf, char* dtm linphone_call_send_dtmf(marie_call, dtmf); /*wait for the DTMF to be received from pauline*/ - CU_ASSERT_TRUE(wait_for_until(marie->lc, pauline->lc, &pauline->stat.dtmf_count, dtmf_count_prev+1, 10000)); + BC_ASSERT_TRUE(wait_for_until(marie->lc, pauline->lc, &pauline->stat.dtmf_count, dtmf_count_prev+1, 10000)); expected = ms_strdup_printf("%c", dtmf); } @@ -66,29 +66,29 @@ void send_dtmf_base(bool_t use_rfc2833, bool_t use_sipinfo, char dtmf, char* dtm linphone_call_send_dtmfs(marie_call, dtmf_seq); /*wait for the DTMF sequence to be received from pauline*/ - CU_ASSERT_TRUE(wait_for_until(marie->lc, pauline->lc, &pauline->stat.dtmf_count, dtmf_count_prev + strlen(dtmf_seq), 10000 + dtmf_delay_ms * strlen(dtmf_seq))); + BC_ASSERT_TRUE(wait_for_until(marie->lc, pauline->lc, &pauline->stat.dtmf_count, dtmf_count_prev + strlen(dtmf_seq), 10000 + dtmf_delay_ms * strlen(dtmf_seq))); expected = (dtmf!='\0')?ms_strdup_printf("%c%s",dtmf,dtmf_seq):ms_strdup(dtmf_seq); } if (expected != NULL) { - CU_ASSERT_PTR_NOT_NULL(pauline->stat.dtmf_list_received); + BC_ASSERT_PTR_NOT_NULL(pauline->stat.dtmf_list_received); if (pauline->stat.dtmf_list_received) { - CU_ASSERT_STRING_EQUAL(pauline->stat.dtmf_list_received, expected); + BC_ASSERT_STRING_EQUAL(pauline->stat.dtmf_list_received, expected); } ms_free(expected); } else { - CU_ASSERT_PTR_NULL(pauline->stat.dtmf_list_received); + BC_ASSERT_PTR_NULL(pauline->stat.dtmf_list_received); } } void send_dtmf_cleanup() { - CU_ASSERT_PTR_NULL(marie_call->dtmfs_timer); - CU_ASSERT_PTR_NULL(marie_call->dtmf_sequence); + BC_ASSERT_PTR_NULL(marie_call->dtmfs_timer); + BC_ASSERT_PTR_NULL(marie_call->dtmf_sequence); /*just to sleep*/ linphone_core_terminate_all_calls(pauline->lc); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallEnd,1)); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallEnd,1)); + 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)); linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); @@ -116,7 +116,7 @@ static void send_dtmfs_sequence_sip_info() { static void send_dtmfs_sequence_not_ready() { marie = linphone_core_manager_new( "marie_rc"); - CU_ASSERT_EQUAL(linphone_call_send_dtmfs(linphone_core_get_current_call(marie->lc), "123"), -1); + BC_ASSERT_EQUAL(linphone_call_send_dtmfs(linphone_core_get_current_call(marie->lc), "123"), -1, int, "%d"); linphone_core_manager_destroy(marie); } @@ -127,13 +127,13 @@ static void send_dtmfs_sequence_call_state_changed() { linphone_call_send_dtmfs(marie_call, "123456789123456789"); /*just after, change call state, and expect DTMF to be canceled*/ linphone_core_pause_call(marie_call->core,marie_call); - CU_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&marie->stat.number_of_LinphoneCallPausing,1)); - CU_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&marie->stat.number_of_LinphoneCallPaused,1)); + BC_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&marie->stat.number_of_LinphoneCallPausing,1)); + BC_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&marie->stat.number_of_LinphoneCallPaused,1)); /*wait a few time to ensure that no DTMF are received*/ wait_for_until(marie->lc, pauline->lc, NULL, 0, 1000); - CU_ASSERT_PTR_NULL(pauline->stat.dtmf_list_received); + BC_ASSERT_PTR_NULL(pauline->stat.dtmf_list_received); send_dtmf_cleanup(); } diff --git a/tester/eventapi_tester.c b/tester/eventapi_tester.c index fbe48f9a4..8ac8e2c18 100644 --- a/tester/eventapi_tester.c +++ b/tester/eventapi_tester.c @@ -17,8 +17,7 @@ */ -#include -#include "CUnit/Basic.h" + #include "linphonecore.h" #include "private.h" #include "lpconfig.h" @@ -39,8 +38,8 @@ const char *liblinphone_tester_get_notify_content(void){ void linphone_notify_received(LinphoneCore *lc, LinphoneEvent *lev, const char *eventname, const LinphoneContent *content){ LinphoneCoreManager *mgr; - CU_ASSERT_PTR_NOT_NULL_FATAL(content); - CU_ASSERT_TRUE(strcmp(notify_content,(const char*)linphone_content_get_buffer(content))==0); + BC_ASSERT_PTR_NOT_NULL_FATAL(content); + BC_ASSERT_TRUE(strcmp(notify_content,(const char*)linphone_content_get_buffer(content))==0); mgr=get_manager(lc); mgr->stat.number_of_NotifyReceived++; } @@ -55,7 +54,7 @@ void linphone_subscription_state_change(LinphoneCore *lc, LinphoneEvent *lev, Li linphone_content_set_type(content,"application"); linphone_content_set_subtype(content,"somexml2"); linphone_content_set_buffer(content,notify_content,strlen(notify_content)); - + ms_message("Subscription state [%s] from [%s]",linphone_subscription_state_to_string(state),from); ms_free(from); @@ -107,10 +106,10 @@ void linphone_publish_state_changed(LinphoneCore *lc, LinphoneEvent *ev, Linphon ms_free(from); switch(state){ case LinphonePublishProgress: counters->number_of_LinphonePublishProgress++; break; - case LinphonePublishOk: + case LinphonePublishOk: /*make sure custom header access API is working*/ - CU_ASSERT_PTR_NOT_NULL(linphone_event_get_custom_header(ev,"From")); - counters->number_of_LinphonePublishOk++; + BC_ASSERT_PTR_NOT_NULL(linphone_event_get_custom_header(ev,"From")); + counters->number_of_LinphonePublishOk++; break; case LinphonePublishError: counters->number_of_LinphonePublishError++; break; case LinphonePublishExpiring: counters->number_of_LinphonePublishExpiring++; break; @@ -118,7 +117,7 @@ void linphone_publish_state_changed(LinphoneCore *lc, LinphoneEvent *ev, Linphon default: break; } - + } static void subscribe_test_declined(void) { @@ -140,16 +139,16 @@ static void subscribe_test_declined(void) { lev=linphone_core_subscribe(marie->lc,pauline->identity,"dodo",600,content); linphone_event_ref(lev); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneSubscriptionOutgoingInit,1,1000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneSubscriptionIncomingReceived,1,3000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneSubscriptionError,1,21000));/*yes flexisip may wait 20 secs in case of forking*/ + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneSubscriptionOutgoingInit,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneSubscriptionIncomingReceived,1,3000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneSubscriptionError,1,21000));/*yes flexisip may wait 20 secs in case of forking*/ ei=linphone_event_get_error_info(lev); - CU_ASSERT_PTR_NOT_NULL(ei); + BC_ASSERT_PTR_NOT_NULL(ei); if (ei){ - CU_ASSERT_EQUAL(linphone_error_info_get_protocol_code(ei),603); - CU_ASSERT_PTR_NOT_NULL(linphone_error_info_get_phrase(ei)); + BC_ASSERT_EQUAL(linphone_error_info_get_protocol_code(ei),603, int, "%d"); + BC_ASSERT_PTR_NOT_NULL(linphone_error_info_get_phrase(ei)); } - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneSubscriptionTerminated,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneSubscriptionTerminated,1,1000)); linphone_content_unref(content); linphone_event_unref(lev); @@ -183,33 +182,33 @@ static void subscribe_test_with_args(bool_t terminated_by_subscriber, RefreshTes linphone_content_set_buffer(content,subscribe_content,strlen(subscribe_content)); lev=linphone_core_subscribe(marie->lc,pauline->identity,"dodo",expires,content); - - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneSubscriptionOutgoingInit,1,1000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneSubscriptionIncomingReceived,1,3000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneSubscriptionActive,1,3000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneSubscriptionActive,1,1000)); + + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneSubscriptionOutgoingInit,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneSubscriptionIncomingReceived,1,3000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneSubscriptionActive,1,3000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneSubscriptionActive,1,1000)); /*make sure marie receives first notification before terminating*/ - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_NotifyReceived,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_NotifyReceived,1,1000)); if (refresh_type==AutoRefresh){ wait_for_list(lcs,NULL,0,6000); - CU_ASSERT_TRUE(linphone_event_get_subscription_state(pauline->lev)==LinphoneSubscriptionActive); + BC_ASSERT_TRUE(linphone_event_get_subscription_state(pauline->lev)==LinphoneSubscriptionActive); }else if (refresh_type==ManualRefresh){ - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneSubscriptionExpiring,1,4000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneSubscriptionExpiring,1,4000)); linphone_event_update_subscribe(lev,NULL); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneSubscriptionActive,2,2000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneSubscriptionActive,2,2000)); } if (terminated_by_subscriber){ linphone_event_terminate(lev); }else{ - CU_ASSERT_PTR_NOT_NULL_FATAL(pauline->lev); + BC_ASSERT_PTR_NOT_NULL_FATAL(pauline->lev); linphone_event_terminate(pauline->lev); } - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneSubscriptionTerminated,1,1000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneSubscriptionTerminated,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneSubscriptionTerminated,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneSubscriptionTerminated,1,1000)); linphone_content_unref(content); linphone_core_manager_destroy(marie); @@ -223,7 +222,7 @@ static void subscribe_test_with_args2(bool_t terminated_by_subscriber, RefreshTe LinphoneEvent *lev; int expires= refresh_type!=NoRefresh ? 4 : 600; MSList* lcs=ms_list_append(NULL,marie->lc); - + lcs=ms_list_append(lcs,pauline->lc); if (refresh_type==ManualRefresh){ @@ -240,37 +239,37 @@ static void subscribe_test_with_args2(bool_t terminated_by_subscriber, RefreshTe linphone_event_add_custom_header(lev,"My-Header2","pimpon"); linphone_event_send_subscribe(lev,content); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneSubscriptionOutgoingInit,1,1000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneSubscriptionIncomingReceived,1,3000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneSubscriptionOutgoingInit,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneSubscriptionIncomingReceived,1,3000)); /*check good receipt of custom headers*/ - CU_ASSERT_STRING_EQUAL(linphone_event_get_custom_header(pauline->lev,"My-Header"),"pouet"); - CU_ASSERT_STRING_EQUAL(linphone_event_get_custom_header(pauline->lev,"My-Header2"),"pimpon"); - - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneSubscriptionActive,1,5000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneSubscriptionActive,1,5000)); + BC_ASSERT_STRING_EQUAL(linphone_event_get_custom_header(pauline->lev,"My-Header"),"pouet"); + BC_ASSERT_STRING_EQUAL(linphone_event_get_custom_header(pauline->lev,"My-Header2"),"pimpon"); + + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneSubscriptionActive,1,5000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneSubscriptionActive,1,5000)); /*make sure marie receives first notification before terminating*/ - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_NotifyReceived,1,5000)); - + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_NotifyReceived,1,5000)); + if (refresh_type==AutoRefresh){ wait_for_list(lcs,NULL,0,6000); - CU_ASSERT_TRUE(linphone_event_get_subscription_state(pauline->lev)==LinphoneSubscriptionActive); + BC_ASSERT_TRUE(linphone_event_get_subscription_state(pauline->lev)==LinphoneSubscriptionActive); }else if (refresh_type==ManualRefresh){ - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneSubscriptionExpiring,1,4000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneSubscriptionExpiring,1,4000)); linphone_event_update_subscribe(lev,NULL); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneSubscriptionActive,2,5000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneSubscriptionActive,2,5000)); } if (terminated_by_subscriber){ linphone_event_terminate(lev); }else{ - CU_ASSERT_PTR_NOT_NULL_FATAL(pauline->lev); + BC_ASSERT_PTR_NOT_NULL_FATAL(pauline->lev); linphone_event_terminate(pauline->lev); } - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneSubscriptionTerminated,1,5000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneSubscriptionTerminated,1,5000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneSubscriptionTerminated,1,5000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneSubscriptionTerminated,1,5000)); linphone_content_unref(content); linphone_core_manager_destroy(marie); @@ -285,7 +284,7 @@ static void subscribe_test_terminated_by_notifier(void){ subscribe_test_with_args(FALSE,NoRefresh); } -/* Caution: this test does not really check that the subscribe are refreshed, because the core is not managing the expiration of +/* Caution: this test does not really check that the subscribe are refreshed, because the core is not managing the expiration of * unrefreshed subscribe dialogs. So it is just checking that it is not crashing. */ static void subscribe_test_refreshed(void){ @@ -320,21 +319,21 @@ static void publish_test_with_args(bool_t refresh, int expires){ linphone_event_send_publish(lev,content); linphone_event_ref(lev); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphonePublishProgress,1,1000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphonePublishOk,1,3000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphonePublishProgress,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphonePublishOk,1,3000)); if (!refresh){ - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphonePublishExpiring,1,5000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphonePublishExpiring,1,5000)); linphone_event_update_publish(lev,content); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphonePublishProgress,1,1000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphonePublishOk,1,3000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphonePublishProgress,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphonePublishOk,1,3000)); }else{ - + } linphone_event_terminate(lev); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphonePublishCleared,1,3000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphonePublishCleared,1,3000)); linphone_event_unref(lev); diff --git a/tester/flexisip_tester.c b/tester/flexisip_tester.c index d32740440..9c381aea3 100644 --- a/tester/flexisip_tester.c +++ b/tester/flexisip_tester.c @@ -16,8 +16,7 @@ along with this program. If not, see . */ -#include -#include "CUnit/Basic.h" + #include "linphonecore.h" #include "lpconfig.h" #include "private.h" @@ -42,13 +41,13 @@ static void subscribe_forking(void) { lev=linphone_core_subscribe(marie->lc,pauline->identity,"dodo",expires,content); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneSubscriptionOutgoingInit,1,1000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneSubscriptionIncomingReceived,1,3000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline2->stat.number_of_LinphoneSubscriptionIncomingReceived,1,1000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneSubscriptionActive,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneSubscriptionOutgoingInit,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneSubscriptionIncomingReceived,1,3000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline2->stat.number_of_LinphoneSubscriptionIncomingReceived,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneSubscriptionActive,1,1000)); /*make sure marie receives first notification before terminating*/ - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_NotifyReceived,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_NotifyReceived,1,1000)); linphone_event_terminate(lev); @@ -72,10 +71,10 @@ static void message_forking(void) { lcs=ms_list_append(lcs,marie2->lc); linphone_chat_room_send_message2(chat_room,message,liblinphone_tester_chat_message_state_change,pauline->lc); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneMessageReceived,1,3000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie2->stat.number_of_LinphoneMessageReceived,1,1000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneMessageDelivered,1,1000)); - CU_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageInProgress,1); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneMessageReceived,1,3000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie2->stat.number_of_LinphoneMessageReceived,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneMessageDelivered,1,1000)); + BC_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageInProgress,1, int, "%d"); linphone_core_manager_destroy(marie); linphone_core_manager_destroy(marie2); linphone_core_manager_destroy(pauline); @@ -102,21 +101,21 @@ static void message_forking_with_unreachable_recipients(void) { linphone_core_set_network_reachable(marie3->lc,FALSE); linphone_chat_room_send_message2(chat_room,message,liblinphone_tester_chat_message_state_change,pauline->lc); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneMessageReceived,1,3000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneMessageDelivered,1,1000)); - CU_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageInProgress,1); - CU_ASSERT_TRUE( marie2->stat.number_of_LinphoneMessageReceived==0); - CU_ASSERT_TRUE( marie3->stat.number_of_LinphoneMessageReceived==0); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneMessageReceived,1,3000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneMessageDelivered,1,1000)); + BC_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageInProgress,1, int, "%d"); + BC_ASSERT_TRUE( marie2->stat.number_of_LinphoneMessageReceived==0); + BC_ASSERT_TRUE( marie3->stat.number_of_LinphoneMessageReceived==0); /*marie 2 goes online */ linphone_core_set_network_reachable(marie2->lc,TRUE); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie2->stat.number_of_LinphoneMessageReceived,1,3000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie2->stat.number_of_LinphoneMessageReceived,1,3000)); /*wait a long time so that all transactions are expired*/ wait_for_list(lcs,NULL,0,32000); /*marie 3 goes online now*/ linphone_core_set_network_reachable(marie3->lc,TRUE); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie3->stat.number_of_LinphoneMessageReceived,1,3000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie3->stat.number_of_LinphoneMessageReceived,1,3000)); linphone_core_manager_destroy(marie); linphone_core_manager_destroy(marie2); @@ -146,27 +145,27 @@ static void message_forking_with_all_recipients_unreachable(void) { linphone_chat_room_send_message2(chat_room,message,liblinphone_tester_chat_message_state_change,pauline->lc); - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneMessageInProgress,1,5000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneMessageInProgress,1,5000)); /*flexisip will accept the message with 202 after 16 seconds*/ - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneMessageDelivered,1,18000)); - CU_ASSERT_TRUE( marie->stat.number_of_LinphoneMessageReceived==0); - CU_ASSERT_TRUE( marie2->stat.number_of_LinphoneMessageReceived==0); - CU_ASSERT_TRUE( marie3->stat.number_of_LinphoneMessageReceived==0); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneMessageDelivered,1,18000)); + BC_ASSERT_TRUE( marie->stat.number_of_LinphoneMessageReceived==0); + BC_ASSERT_TRUE( marie2->stat.number_of_LinphoneMessageReceived==0); + BC_ASSERT_TRUE( marie3->stat.number_of_LinphoneMessageReceived==0); /*marie 1 goes online */ linphone_core_set_network_reachable(marie->lc,TRUE); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneMessageReceived,1,3000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneMessageReceived,1,3000)); /*marie 2 goes online */ linphone_core_set_network_reachable(marie2->lc,TRUE); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie2->stat.number_of_LinphoneMessageReceived,1,3000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie2->stat.number_of_LinphoneMessageReceived,1,3000)); /*wait a long time so that all transactions are expired*/ wait_for_list(lcs,NULL,0,32000); /*marie 3 goes online now*/ linphone_core_set_network_reachable(marie3->lc,TRUE); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie3->stat.number_of_LinphoneMessageReceived,1,3000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie3->stat.number_of_LinphoneMessageReceived,1,3000)); linphone_core_manager_destroy(marie); linphone_core_manager_destroy(marie2); @@ -193,26 +192,26 @@ static void call_forking(void){ linphone_core_invite_address(pauline->lc,marie->identity); /*pauline should hear ringback*/ - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallOutgoingRinging,1,3000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallOutgoingRinging,1,3000)); /*all devices from Marie should be ringing*/ - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallIncomingReceived,1,3000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie2->stat.number_of_LinphoneCallIncomingReceived,1,3000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie3->stat.number_of_LinphoneCallIncomingReceived,1,3000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallIncomingReceived,1,3000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie2->stat.number_of_LinphoneCallIncomingReceived,1,3000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie3->stat.number_of_LinphoneCallIncomingReceived,1,3000)); /*marie accepts the call on its first device*/ linphone_core_accept_call(marie->lc,linphone_core_get_current_call(marie->lc)); - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallConnected,1,1000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallStreamsRunning,1,1000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallConnected,1,1000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallStreamsRunning,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallConnected,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallStreamsRunning,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallConnected,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallStreamsRunning,1,1000)); /*other devices should stop ringing*/ - CU_ASSERT_TRUE(wait_for_list(lcs,&marie2->stat.number_of_LinphoneCallEnd,1,1000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie3->stat.number_of_LinphoneCallEnd,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie2->stat.number_of_LinphoneCallEnd,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie3->stat.number_of_LinphoneCallEnd,1,1000)); linphone_core_terminate_call(pauline->lc,linphone_core_get_current_call(pauline->lc)); - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallEnd,1,1000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallEnd,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallEnd,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallEnd,1,1000)); linphone_core_manager_destroy(pauline); linphone_core_manager_destroy(marie); @@ -237,27 +236,27 @@ static void call_forking_with_urgent_reply(void){ linphone_core_set_user_agent(marie3->lc,"Natted Linphone",NULL); linphone_core_set_user_agent(pauline->lc,"Natted Linphone",NULL); - CU_ASSERT_TRUE(linphone_core_media_encryption_supported(pauline->lc,LinphoneMediaEncryptionSRTP)); + BC_ASSERT_TRUE(linphone_core_media_encryption_supported(pauline->lc,LinphoneMediaEncryptionSRTP)); linphone_core_set_media_encryption(pauline->lc,LinphoneMediaEncryptionSRTP); linphone_core_set_network_reachable(marie2->lc,FALSE); linphone_core_set_network_reachable(marie3->lc,FALSE); linphone_core_invite_address(pauline->lc,marie->identity); /*pauline should hear ringback, after 5 seconds, when it will retry without SRTP*/ - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallOutgoingRinging,1,9000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallOutgoingRinging,1,9000)); /*Marie should be ringing*/ - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallIncomingReceived,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallIncomingReceived,1,1000)); /*marie accepts the call on its first device*/ linphone_core_accept_call(marie->lc,linphone_core_get_current_call(marie->lc)); - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallConnected,1,1000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallStreamsRunning,1,1000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallConnected,1,1000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallStreamsRunning,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallConnected,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallStreamsRunning,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallConnected,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallStreamsRunning,1,1000)); linphone_core_terminate_call(pauline->lc,linphone_core_get_current_call(pauline->lc)); - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallEnd,1,1000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallEnd,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallEnd,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallEnd,1,1000)); linphone_core_manager_destroy(pauline); linphone_core_manager_destroy(marie); @@ -284,20 +283,20 @@ static void call_forking_cancelled(void){ linphone_core_invite_address(pauline->lc,marie->identity); /*pauline should hear ringback*/ - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallOutgoingRinging,1,3000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallOutgoingRinging,1,3000)); /*all devices from Marie should be ringing*/ - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallIncomingReceived,1,1000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie2->stat.number_of_LinphoneCallIncomingReceived,1,1000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie3->stat.number_of_LinphoneCallIncomingReceived,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallIncomingReceived,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie2->stat.number_of_LinphoneCallIncomingReceived,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie3->stat.number_of_LinphoneCallIncomingReceived,1,1000)); /*pauline finally cancels the call*/ linphone_core_terminate_call(pauline->lc,linphone_core_get_current_call(pauline->lc)); - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallEnd,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallEnd,1,1000)); /*all devices should stop ringing*/ - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallEnd,1,1000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie2->stat.number_of_LinphoneCallEnd,1,1000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie3->stat.number_of_LinphoneCallEnd,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallEnd,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie2->stat.number_of_LinphoneCallEnd,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie3->stat.number_of_LinphoneCallEnd,1,1000)); linphone_core_manager_destroy(pauline); linphone_core_manager_destroy(marie); @@ -324,11 +323,11 @@ static void call_forking_declined(bool_t declined_globaly){ linphone_core_invite_address(pauline->lc,marie->identity); /*pauline should hear ringback*/ - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallOutgoingRinging,1,3000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallOutgoingRinging,1,3000)); /*all devices from Marie should be ringing*/ - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallIncomingReceived,1,1000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie2->stat.number_of_LinphoneCallIncomingReceived,1,1000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie3->stat.number_of_LinphoneCallIncomingReceived,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallIncomingReceived,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie2->stat.number_of_LinphoneCallIncomingReceived,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie3->stat.number_of_LinphoneCallIncomingReceived,1,1000)); /*marie1 finally declines the call*/ linphone_core_decline_call(marie->lc,linphone_core_get_current_call(marie->lc), @@ -336,22 +335,22 @@ static void call_forking_declined(bool_t declined_globaly){ ); if (declined_globaly){ - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallEnd,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallEnd,1,1000)); /*all devices should stop ringing*/ - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallEnd,1,1000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie2->stat.number_of_LinphoneCallEnd,1,1000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie3->stat.number_of_LinphoneCallEnd,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallEnd,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie2->stat.number_of_LinphoneCallEnd,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie3->stat.number_of_LinphoneCallEnd,1,1000)); }else{ /*pauline should continue ringing and be able to hear a call taken by marie2 */ linphone_core_accept_call(marie2->lc, linphone_core_get_current_call(marie2->lc)); - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallStreamsRunning,1,2000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie2->stat.number_of_LinphoneCallStreamsRunning,1,2000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallStreamsRunning,1,2000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie2->stat.number_of_LinphoneCallStreamsRunning,1,2000)); liblinphone_tester_check_rtcp(pauline,marie2); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallEnd,1,3000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie3->stat.number_of_LinphoneCallEnd,1,3000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallEnd,1,3000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie3->stat.number_of_LinphoneCallEnd,1,3000)); linphone_core_terminate_call(marie2->lc,linphone_core_get_current_call(marie2->lc)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie2->stat.number_of_LinphoneCallEnd,1,3000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallEnd,1,3000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie2->stat.number_of_LinphoneCallEnd,1,3000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallEnd,1,3000)); } linphone_core_manager_destroy(pauline); @@ -390,22 +389,22 @@ static void call_forking_with_push_notification_single(void){ linphone_core_set_network_reachable(marie->lc,TRUE); /*Marie shall receive the call immediately*/ - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallIncomingReceived,1,5000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallIncomingReceived,1,5000)); /*pauline should hear ringback as well*/ - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallOutgoingRinging,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallOutgoingRinging,1,1000)); /*marie accepts the call*/ linphone_core_accept_call(marie->lc,linphone_core_get_current_call(marie->lc)); - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallConnected,1,5000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallStreamsRunning,1,1000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallConnected,1,1000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallStreamsRunning,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallConnected,1,5000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallStreamsRunning,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallConnected,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallStreamsRunning,1,1000)); liblinphone_tester_check_rtcp(pauline,marie); linphone_core_terminate_call(pauline->lc,linphone_core_get_current_call(pauline->lc)); - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallEnd,1,5000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallEnd,1,5000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallEnd,1,5000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallEnd,1,5000)); linphone_core_manager_destroy(pauline); linphone_core_manager_destroy(marie); @@ -432,32 +431,32 @@ static void call_forking_with_push_notification_multiple(void){ linphone_core_invite_address(pauline->lc,marie->identity); /*marie1 will ring*/ - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallIncomingReceived,1,5000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallIncomingReceived,1,5000)); /*pauline should hear ringback as well*/ - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallOutgoingRinging,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallOutgoingRinging,1,1000)); /*the server is expected to send a push notification to marie2, this will wake up linphone, that will reconnect:*/ linphone_core_set_network_reachable(marie2->lc,TRUE); /*Marie shall receive the call immediately*/ - CU_ASSERT_TRUE(wait_for_list(lcs,&marie2->stat.number_of_LinphoneCallIncomingReceived,1,5000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie2->stat.number_of_LinphoneCallIncomingReceived,1,5000)); /*marie2 accepts the call*/ linphone_core_accept_call(marie2->lc,linphone_core_get_current_call(marie2->lc)); - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallConnected,1,1000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallStreamsRunning,1,1000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie2->stat.number_of_LinphoneCallConnected,1,1000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie2->stat.number_of_LinphoneCallStreamsRunning,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallConnected,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallStreamsRunning,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie2->stat.number_of_LinphoneCallConnected,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie2->stat.number_of_LinphoneCallStreamsRunning,1,1000)); /*call to marie1 should be cancelled*/ - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallEnd,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallEnd,1,1000)); liblinphone_tester_check_rtcp(pauline,marie2); linphone_core_terminate_call(pauline->lc,linphone_core_get_current_call(pauline->lc)); - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallEnd,1,1000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie2->stat.number_of_LinphoneCallEnd,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallEnd,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie2->stat.number_of_LinphoneCallEnd,1,1000)); linphone_core_manager_destroy(pauline); linphone_core_manager_destroy(marie); @@ -482,18 +481,18 @@ static void call_forking_not_responded(void){ linphone_core_invite_address(pauline->lc,marie->identity); /*pauline should hear ringback*/ - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallOutgoingRinging,1,3000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallOutgoingRinging,1,3000)); /*all devices from Marie should be ringing*/ - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallIncomingReceived,1,1000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie2->stat.number_of_LinphoneCallIncomingReceived,1,1000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie3->stat.number_of_LinphoneCallIncomingReceived,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallIncomingReceived,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie2->stat.number_of_LinphoneCallIncomingReceived,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie3->stat.number_of_LinphoneCallIncomingReceived,1,1000)); /*nobody answers, flexisip should close the call after XX seconds*/ - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallError,1,22000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallError,1,22000)); /*all devices should stop ringing*/ - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallEnd,1,1000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie2->stat.number_of_LinphoneCallEnd,1,1000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie3->stat.number_of_LinphoneCallEnd,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallEnd,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie2->stat.number_of_LinphoneCallEnd,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie3->stat.number_of_LinphoneCallEnd,1,1000)); linphone_core_manager_destroy(pauline); linphone_core_manager_destroy(marie); @@ -541,10 +540,10 @@ static void early_media_call_forking(void) { linphone_core_invite_address_with_params(pauline->lc,marie1->identity,params); linphone_call_params_destroy(params); - CU_ASSERT_TRUE(wait_for_list(lcs, &marie1->stat.number_of_LinphoneCallIncomingEarlyMedia,1,3000)); - CU_ASSERT_TRUE(wait_for_list(lcs, &marie2->stat.number_of_LinphoneCallIncomingEarlyMedia,1,3000)); - CU_ASSERT_TRUE(wait_for_list(lcs, &pauline->stat.number_of_LinphoneCallOutgoingEarlyMedia,1,3000)); - CU_ASSERT_EQUAL(pauline->stat.number_of_LinphoneCallOutgoingEarlyMedia,1); + BC_ASSERT_TRUE(wait_for_list(lcs, &marie1->stat.number_of_LinphoneCallIncomingEarlyMedia,1,3000)); + BC_ASSERT_TRUE(wait_for_list(lcs, &marie2->stat.number_of_LinphoneCallIncomingEarlyMedia,1,3000)); + BC_ASSERT_TRUE(wait_for_list(lcs, &pauline->stat.number_of_LinphoneCallOutgoingEarlyMedia,1,3000)); + BC_ASSERT_EQUAL(pauline->stat.number_of_LinphoneCallOutgoingEarlyMedia,1, int, "%d"); pauline_call=linphone_core_get_current_call(pauline->lc); marie1_call=linphone_core_get_current_call(marie1->lc); @@ -552,30 +551,30 @@ static void early_media_call_forking(void) { /*wait a bit that streams are established*/ wait_for_list(lcs,&dummy,1,6000); - CU_ASSERT_TRUE(linphone_call_get_audio_stats(pauline_call)->download_bandwidth>60 + BC_ASSERT_TRUE(linphone_call_get_audio_stats(pauline_call)->download_bandwidth>60 && linphone_call_get_audio_stats(pauline_call)->download_bandwidth<99); - CU_ASSERT_TRUE(linphone_call_get_audio_stats(marie1_call)->download_bandwidth>60 + BC_ASSERT_TRUE(linphone_call_get_audio_stats(marie1_call)->download_bandwidth>60 && linphone_call_get_audio_stats(marie1_call)->download_bandwidth<99); - CU_ASSERT_TRUE(linphone_call_get_audio_stats(marie2_call)->download_bandwidth>60 + BC_ASSERT_TRUE(linphone_call_get_audio_stats(marie2_call)->download_bandwidth>60 && linphone_call_get_audio_stats(marie2_call)->download_bandwidth<99); linphone_core_accept_call(marie1->lc,linphone_core_get_current_call(marie1->lc)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie1->stat.number_of_LinphoneCallStreamsRunning,1,3000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallStreamsRunning,1,3000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie1->stat.number_of_LinphoneCallStreamsRunning,1,3000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallStreamsRunning,1,3000)); /*marie2 should get her call terminated*/ - CU_ASSERT_TRUE(wait_for_list(lcs,&marie2->stat.number_of_LinphoneCallEnd,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie2->stat.number_of_LinphoneCallEnd,1,1000)); /*wait a bit that streams are established*/ wait_for_list(lcs,&dummy,1,3000); - CU_ASSERT_TRUE(linphone_call_get_audio_stats(pauline_call)->download_bandwidth>60 + BC_ASSERT_TRUE(linphone_call_get_audio_stats(pauline_call)->download_bandwidth>60 && linphone_call_get_audio_stats(pauline_call)->download_bandwidth<99 ); - CU_ASSERT_TRUE(linphone_call_get_audio_stats(marie1_call)->download_bandwidth>60 + BC_ASSERT_TRUE(linphone_call_get_audio_stats(marie1_call)->download_bandwidth>60 && linphone_call_get_audio_stats(marie1_call)->download_bandwidth<99 ); linphone_core_terminate_all_calls(pauline->lc); - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallEnd,1,5000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie1->stat.number_of_LinphoneCallEnd,1,5000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallEnd,1,5000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie1->stat.number_of_LinphoneCallEnd,1,5000)); ms_list_free(lcs); linphone_core_manager_destroy(marie1); @@ -599,23 +598,23 @@ static void call_with_sips(void){ linphone_core_invite_address(marie->lc,pauline1->identity); /*marie should hear ringback*/ - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallOutgoingRinging,1,3000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallOutgoingRinging,1,3000)); /*Only the sips registered device from pauline should ring*/ - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline1->stat.number_of_LinphoneCallIncomingReceived,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline1->stat.number_of_LinphoneCallIncomingReceived,1,1000)); /*pauline accepts the call */ linphone_core_accept_call(pauline1->lc,linphone_core_get_current_call(pauline1->lc)); - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline1->stat.number_of_LinphoneCallConnected,1,1000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline1->stat.number_of_LinphoneCallStreamsRunning,1,1000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallConnected,1,1000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallStreamsRunning,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline1->stat.number_of_LinphoneCallConnected,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline1->stat.number_of_LinphoneCallStreamsRunning,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallConnected,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallStreamsRunning,1,1000)); /*pauline2 should not have ring*/ - CU_ASSERT_TRUE(pauline2->stat.number_of_LinphoneCallIncomingReceived==0); + BC_ASSERT_TRUE(pauline2->stat.number_of_LinphoneCallIncomingReceived==0); linphone_core_terminate_call(pauline1->lc,linphone_core_get_current_call(pauline1->lc)); - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline1->stat.number_of_LinphoneCallEnd,1,3000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallEnd,1,3000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline1->stat.number_of_LinphoneCallEnd,1,3000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallEnd,1,3000)); linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline1); @@ -643,11 +642,11 @@ static void call_with_sips_not_achievable(void){ linphone_address_unref(dest); /*Call should be rejected by server with 480*/ - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallError,1,6000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallError,1,6000)); ei=linphone_call_get_error_info(call); - CU_ASSERT_PTR_NOT_NULL(ei); + BC_ASSERT_PTR_NOT_NULL(ei); if (ei){ - CU_ASSERT_EQUAL(linphone_error_info_get_reason(ei), LinphoneReasonTemporarilyUnavailable); + BC_ASSERT_EQUAL(linphone_error_info_get_reason(ei), LinphoneReasonTemporarilyUnavailable, int, "%d"); } linphone_core_manager_destroy(marie); @@ -680,20 +679,20 @@ static void call_with_ipv6(void) { linphone_core_set_user_agent(marie->lc,"Natted Linphone",NULL); linphone_core_set_user_agent(pauline->lc,"Natted Linphone",NULL); - CU_ASSERT_TRUE(call(marie,pauline)); + BC_ASSERT_TRUE(call(marie,pauline)); pauline_call=linphone_core_get_current_call(pauline->lc); - CU_ASSERT_PTR_NOT_NULL(pauline_call); + BC_ASSERT_PTR_NOT_NULL(pauline_call); if (pauline_call){ /*check that the remote contact is IPv6*/ const char *contact=linphone_call_get_remote_contact(pauline_call); LinphoneAddress *ct_addr; - CU_ASSERT_PTR_NOT_NULL(contact); + BC_ASSERT_PTR_NOT_NULL(contact); if (contact){ ct_addr=linphone_address_new(contact); - CU_ASSERT_PTR_NOT_NULL(ct_addr); + BC_ASSERT_PTR_NOT_NULL(ct_addr); if (ct_addr){ - CU_ASSERT_TRUE(strchr(linphone_address_get_domain(ct_addr),':')!=NULL); + BC_ASSERT_TRUE(strchr(linphone_address_get_domain(ct_addr),':')!=NULL); } linphone_address_destroy(ct_addr); } @@ -707,7 +706,7 @@ static void call_with_ipv6(void) { liblinphone_tester_enable_ipv6(FALSE); leaked_objects=belle_sip_object_get_object_count()-begin; - CU_ASSERT_TRUE(leaked_objects==0); + BC_ASSERT_TRUE(leaked_objects==0); if (leaked_objects>0){ belle_sip_object_dump_active_objects(); } @@ -727,13 +726,13 @@ static void file_transfer_message_rcs_to_external_body_client(void) { LinphoneCoreManager* marie = linphone_core_manager_init( "marie_rc"); LinphoneCoreManager* pauline = linphone_core_manager_init( "pauline_rc"); - + linphone_proxy_config_set_custom_header(marie->lc->default_proxy, "Accept", "application/sdp"); linphone_core_manager_start(marie, "marie_rc", TRUE); - + linphone_proxy_config_set_custom_header(pauline->lc->default_proxy, "Accept", "application/sdp, text/plain, application/vnd.gsma.rcs-ft-http+xml"); linphone_core_manager_start(pauline, "pauline_rc", TRUE); - + reset_counters(&marie->stat); reset_counters(&pauline->stat); @@ -767,7 +766,7 @@ static void file_transfer_message_rcs_to_external_body_client(void) { linphone_chat_message_cbs_set_msg_state_changed(cbs,liblinphone_tester_chat_message_msg_state_changed); linphone_chat_message_cbs_set_file_transfer_send(cbs, file_transfer_send); linphone_chat_room_send_chat_message(chat_room,message); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneMessageExtBodyReceived,1)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneMessageExtBodyReceived,1)); fclose(file_to_send); if (marie->stat.last_received_chat_message ) { cbs = linphone_chat_message_get_callbacks(marie->stat.last_received_chat_message); @@ -775,12 +774,12 @@ static void file_transfer_message_rcs_to_external_body_client(void) { linphone_chat_message_cbs_set_file_transfer_recv(cbs, file_transfer_received); linphone_chat_message_download_file(marie->stat.last_received_chat_message); } - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneMessageFileTransferDone,1)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneMessageFileTransferDone,1)); - CU_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageInProgress,1); - CU_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageDelivered,1); - CU_ASSERT_EQUAL(marie->stat.number_of_LinphoneMessageExtBodyReceived,1); - CU_ASSERT_TRUE(compare_files(send_filepath, receive_filepath)); + BC_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageInProgress,1, int, "%d"); + BC_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageDelivered,1, int, "%d"); + BC_ASSERT_EQUAL(marie->stat.number_of_LinphoneMessageExtBodyReceived,1, int, "%d"); + BC_ASSERT_TRUE(compare_files(send_filepath, receive_filepath)); linphone_content_unref(content); linphone_core_manager_destroy(marie); @@ -807,29 +806,29 @@ static void send_file_transfer_message_using_external_body_url(LinphoneCoreManag linphone_chat_message_set_external_body_url(message, "https://www.linphone.org:444//tmp/54ec58280ace9_c30709218df8eaba61d1.jpg"); linphone_chat_room_send_chat_message(chat_room, message); - CU_ASSERT_TRUE(wait_for(pauline->lc, marie->lc, &marie->stat.number_of_LinphoneMessageReceived, 1)); + BC_ASSERT_TRUE(wait_for(pauline->lc, marie->lc, &marie->stat.number_of_LinphoneMessageReceived, 1)); if (marie->stat.last_received_chat_message) { linphone_chat_message_download_file(marie->stat.last_received_chat_message); } - CU_ASSERT_TRUE(wait_for(pauline->lc, marie->lc, &marie->stat.number_of_LinphoneMessageExtBodyReceived, 1)); + BC_ASSERT_TRUE(wait_for(pauline->lc, marie->lc, &marie->stat.number_of_LinphoneMessageExtBodyReceived, 1)); - CU_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageInProgress, 1); - CU_ASSERT_EQUAL(marie->stat.number_of_LinphoneMessageExtBodyReceived, 1); + BC_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageInProgress, 1, int, "%d"); + BC_ASSERT_EQUAL(marie->stat.number_of_LinphoneMessageExtBodyReceived, 1, int, "%d"); } static void file_transfer_message_external_body_to_external_body_client(void) { LinphoneCoreManager* marie = linphone_core_manager_init( "marie_rc"); LinphoneCoreManager* pauline = linphone_core_manager_init( "pauline_rc"); - + linphone_proxy_config_set_custom_header(marie->lc->default_proxy, "Accept", "application/sdp"); linphone_core_manager_start(marie, "marie_rc", TRUE); - + linphone_proxy_config_set_custom_header(pauline->lc->default_proxy, "Accept", "application/sdp"); linphone_core_manager_start(pauline, "pauline_rc", TRUE); - + reset_counters(&marie->stat); reset_counters(&pauline->stat); - + linphone_core_refresh_registers(marie->lc); linphone_core_refresh_registers(pauline->lc); @@ -842,13 +841,13 @@ static void file_transfer_message_external_body_to_external_body_client(void) { static void file_transfer_message_external_body_to_rcs_client(void) { LinphoneCoreManager* marie = linphone_core_manager_init( "marie_rc"); LinphoneCoreManager* pauline = linphone_core_manager_init( "pauline_rc"); - + linphone_proxy_config_set_custom_header(marie->lc->default_proxy, "Accept", "application/sdp"); linphone_core_manager_start(marie, "marie_rc", TRUE); - + linphone_proxy_config_set_custom_header(pauline->lc->default_proxy, "Accept", "application/sdp, text/plain, application/vnd.gsma.rcs-ft-http+xml"); linphone_core_manager_start(pauline, "pauline_rc", TRUE); - + reset_counters(&marie->stat); reset_counters(&pauline->stat); @@ -865,13 +864,13 @@ static void dos_module_trigger(void) { int number_of_messge_to_send = 100; LinphoneCoreManager* marie = linphone_core_manager_new("marie_rc"); LinphoneCoreManager* pauline = linphone_core_manager_new("pauline_rc"); - + reset_counters(&marie->stat); reset_counters(&pauline->stat); - + to = linphone_address_as_string(marie->identity); chat_room = linphone_core_create_chat_room(pauline->lc,to); - + do { char msg[128]; sprintf(msg, "Flood message number %i", i); @@ -880,15 +879,15 @@ static void dos_module_trigger(void) { i++; } while (i < number_of_messge_to_send); // At this point we should be banned for a minute - + ms_usleep(90000000); // Wait 90 seconds to ensure we are not banned anymore - CU_ASSERT_TRUE(marie->stat.number_of_LinphoneMessageReceived < number_of_messge_to_send); - + BC_ASSERT_TRUE(marie->stat.number_of_LinphoneMessageReceived < number_of_messge_to_send); + reset_counters(&marie->stat); reset_counters(&pauline->stat); - + linphone_chat_room_send_message(chat_room, "This one should pass through"); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneMessageReceived, 1)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneMessageReceived, 1)); linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); diff --git a/tester/liblinphone_tester.c b/tester/liblinphone_tester.c index 0469b3675..d4f42190d 100644 --- a/tester/liblinphone_tester.c +++ b/tester/liblinphone_tester.c @@ -16,8 +16,7 @@ along with this program. If not, see . */ -#include -#include "CUnit/Basic.h" + #include "linphonecore.h" #include "private.h" #include "liblinphone_tester.h" @@ -28,7 +27,6 @@ #include #endif - static FILE * log_file = NULL; #ifdef ANDROID diff --git a/tester/log_collection_tester.c b/tester/log_collection_tester.c index 9a5d8b179..683e9ecd7 100644 --- a/tester/log_collection_tester.c +++ b/tester/log_collection_tester.c @@ -136,7 +136,7 @@ static FILE* gzuncompress(const char* filepath) { memset(buffer, 0, strlen(buffer)); } fclose(output); - CU_ASSERT_EQUAL(gzclose(file), Z_OK); + BC_ASSERT_EQUAL(gzclose(file), Z_OK, int, "%d"); ret=fopen(newname, "rb"); ms_free(newname); return ret; @@ -169,7 +169,7 @@ static time_t check_file(LinphoneCoreManager* mgr) { uint32_t timediff = 0; FILE *file = NULL; - CU_ASSERT_PTR_NOT_NULL(filepath); + BC_ASSERT_PTR_NOT_NULL(filepath); if (filepath != NULL) { int line_count = 0; @@ -186,10 +186,10 @@ static time_t check_file(LinphoneCoreManager* mgr) { #else file = fopen(filepath, "rb"); #endif - CU_ASSERT_PTR_NOT_NULL(file); + BC_ASSERT_PTR_NOT_NULL(file); if (!file) return 0; // 1) expect to find folder name in filename path - CU_ASSERT_PTR_NOT_NULL(strstr(filepath, bc_tester_writable_dir_prefix)); + BC_ASSERT_PTR_NOT_NULL(strstr(filepath, bc_tester_writable_dir_prefix)); // 2) check file contents while (getline(&line, &line_size, file) != -1) { @@ -205,13 +205,13 @@ static time_t check_file(LinphoneCoreManager* mgr) { if (strptime(date, "%Y-%m-%d %H:%M:%S", &tm_curr) != NULL) { tm_curr.tm_isdst = -1; // LOL log_time = mktime(&tm_curr); - CU_ASSERT_TRUE(log_time >= time_prev); + BC_ASSERT_TRUE(log_time >= time_prev); time_prev = log_time; } } #endif } - CU_ASSERT_TRUE(line_count > 25); + BC_ASSERT_TRUE(line_count > 25); free(line); fclose(file); ms_free(filepath); @@ -220,7 +220,7 @@ static time_t check_file(LinphoneCoreManager* mgr) { timediff = labs((long int)log_time - (long int)cur_time); (void)timediff; #ifndef WIN32 - CU_ASSERT_TRUE( timediff <= 1 ); + BC_ASSERT_TRUE( timediff <= 1 ); if( !(timediff <= 1) ){ char buffers[2][128] = {{0}}; strftime(buffers[0], sizeof(buffers[0]), "%Y-%m-%d %H:%M:%S", localtime(&log_time)); @@ -242,7 +242,7 @@ static time_t check_file(LinphoneCoreManager* mgr) { static void collect_files_disabled() { LinphoneCoreManager* marie = setup(FALSE); - CU_ASSERT_PTR_NULL(linphone_core_compress_log_collection(marie->lc)); + BC_ASSERT_PTR_NULL(linphone_core_compress_log_collection(marie->lc)); collect_cleanup(marie); } @@ -282,7 +282,7 @@ static void logCollectionUploadStateChangedCb(LinphoneCore *lc, LinphoneCoreLogC break; case LinphoneCoreLogCollectionUploadStateDelivered: counters->number_of_LinphoneCoreLogCollectionUploadStateDelivered++; - CU_ASSERT_TRUE(strlen(info)>0) + BC_ASSERT_GREATER(strlen(info), 0, int, "%d"); break; case LinphoneCoreLogCollectionUploadStateNotDelivered: counters->number_of_LinphoneCoreLogCollectionUploadStateNotDelivered++; @@ -302,7 +302,7 @@ static void upload_collected_traces() { while (--waiting) ms_error("(test error)Waiting %d...", waiting); linphone_core_compress_log_collection(marie->lc); linphone_core_upload_log_collection(marie->lc); - CU_ASSERT_TRUE(wait_for(marie->lc,marie->lc,&marie->stat.number_of_LinphoneCoreLogCollectionUploadStateDelivered,1)); + BC_ASSERT_TRUE(wait_for(marie->lc,marie->lc,&marie->stat.number_of_LinphoneCoreLogCollectionUploadStateDelivered,1)); /*try 2 times*/ waiting=100; @@ -310,7 +310,7 @@ static void upload_collected_traces() { while (--waiting) ms_error("(test error)Waiting %d...", waiting); linphone_core_compress_log_collection(marie->lc); linphone_core_upload_log_collection(marie->lc); - CU_ASSERT_TRUE(wait_for(marie->lc,marie->lc,&marie->stat.number_of_LinphoneCoreLogCollectionUploadStateDelivered,2)); + BC_ASSERT_TRUE(wait_for(marie->lc,marie->lc,&marie->stat.number_of_LinphoneCoreLogCollectionUploadStateDelivered,2)); collect_cleanup(marie); } diff --git a/tester/message_tester.c b/tester/message_tester.c index 506d714d7..b78962885 100644 --- a/tester/message_tester.c +++ b/tester/message_tester.c @@ -17,8 +17,7 @@ */ -#include -#include "CUnit/Basic.h" + #include "linphonecore.h" #include "private.h" #include "liblinphone_tester.h" @@ -54,7 +53,7 @@ void message_received(LinphoneCore *lc, LinphoneChatRoom *room, LinphoneChatMess } else if (linphone_chat_message_get_external_body_url(message)) { counters->number_of_LinphoneMessageExtBodyReceived++; if (message_external_body_url) { - CU_ASSERT_STRING_EQUAL(linphone_chat_message_get_external_body_url(message),message_external_body_url); + BC_ASSERT_STRING_EQUAL(linphone_chat_message_get_external_body_url(message),message_external_body_url); message_external_body_url=NULL; } } @@ -199,10 +198,10 @@ static void text_message(void) { reset_counters(&pauline->stat); } linphone_chat_room_send_message(chat_room,"Bla bla bla bla"); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneMessageReceived,1)); - CU_ASSERT_EQUAL(marie->stat.number_of_LinphoneMessageReceivedLegacy,1); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneMessageReceived,1)); + BC_ASSERT_EQUAL(marie->stat.number_of_LinphoneMessageReceivedLegacy,1, int, "%d"); - CU_ASSERT_PTR_NOT_NULL(linphone_core_get_chat_room(marie->lc,pauline->identity)); + BC_ASSERT_PTR_NOT_NULL(linphone_core_get_chat_room(marie->lc,pauline->identity)); linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); @@ -225,12 +224,12 @@ static void text_message_within_dialog(void) { reset_counters(&marie->stat); reset_counters(&pauline->stat); } - CU_ASSERT_TRUE(call(marie,pauline)); + BC_ASSERT_TRUE(call(marie,pauline)); linphone_chat_room_send_message(chat_room,"Bla bla bla bla"); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneMessageReceived,1)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneMessageReceived,1)); - CU_ASSERT_PTR_NOT_NULL(linphone_core_get_chat_room(marie->lc,pauline->identity)); + BC_ASSERT_PTR_NOT_NULL(linphone_core_get_chat_room(marie->lc,pauline->identity)); linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); @@ -268,10 +267,10 @@ static void text_message_with_credential_from_auth_cb(void) { reset_counters(&pauline->stat); } linphone_chat_room_send_message(chat_room,"Bla bla bla bla"); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneMessageReceived,1)); - CU_ASSERT_EQUAL(marie->stat.number_of_LinphoneMessageReceivedLegacy,1); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneMessageReceived,1)); + BC_ASSERT_EQUAL(marie->stat.number_of_LinphoneMessageReceivedLegacy,1, int, "%d"); - CU_ASSERT_PTR_NOT_NULL(linphone_core_get_chat_room(marie->lc,pauline->identity)); + BC_ASSERT_PTR_NOT_NULL(linphone_core_get_chat_room(marie->lc,pauline->identity)); linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); @@ -293,7 +292,7 @@ static void text_message_with_privacy(void) { linphone_core_get_default_proxy(pauline->lc,&pauline_proxy); linphone_proxy_config_set_privacy(pauline_proxy,LinphonePrivacyId); - CU_ASSERT_PTR_NOT_NULL(linphone_core_get_chat_room(marie->lc,pauline->identity)); + BC_ASSERT_PTR_NOT_NULL(linphone_core_get_chat_room(marie->lc,pauline->identity)); { int dummy=0; wait_for_until(marie->lc,pauline->lc,&dummy,1,100); /*just to have time to purge message stored in the server*/ @@ -301,8 +300,8 @@ static void text_message_with_privacy(void) { reset_counters(&pauline->stat); } linphone_chat_room_send_message(chat_room,"Bla bla bla bla"); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneMessageReceived,1)); - CU_ASSERT_EQUAL(marie->stat.number_of_LinphoneMessageReceivedLegacy,1); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneMessageReceived,1)); + BC_ASSERT_EQUAL(marie->stat.number_of_LinphoneMessageReceivedLegacy,1, int, "%d"); linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); @@ -320,7 +319,7 @@ static void text_message_compatibility_mode(void) { LinphoneChatRoom* chat_room; linphone_core_get_default_proxy(marie->lc,&proxy); - CU_ASSERT_PTR_NOT_NULL (proxy); + BC_ASSERT_PTR_NOT_NULL (proxy); proxy_address=linphone_address_new(linphone_proxy_config_get_addr(proxy)); linphone_address_clean(proxy_address); tmp=linphone_address_as_string_uri_only(proxy_address); @@ -337,7 +336,7 @@ static void text_message_compatibility_mode(void) { linphone_core_set_sip_transports(marie->lc,&transport); marie->stat.number_of_LinphoneRegistrationOk=0; - CU_ASSERT_TRUE (wait_for(marie->lc,marie->lc,&marie->stat.number_of_LinphoneRegistrationOk,1)); + BC_ASSERT_TRUE (wait_for(marie->lc,marie->lc,&marie->stat.number_of_LinphoneRegistrationOk,1)); chat_room = linphone_core_create_chat_room(marie->lc,to); { @@ -347,8 +346,8 @@ static void text_message_compatibility_mode(void) { reset_counters(&pauline->stat); } linphone_chat_room_send_message(chat_room,"Bla bla bla bla"); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneMessageReceived,1)); - CU_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageReceivedLegacy,1); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneMessageReceived,1)); + BC_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageReceivedLegacy,1, int, "%d"); linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); } @@ -376,15 +375,15 @@ static void text_message_with_ack(void) { reset_counters(&pauline->stat); linphone_chat_message_cbs_set_msg_state_changed(cbs, liblinphone_tester_chat_message_msg_state_changed); linphone_chat_room_send_chat_message(chat_room,message); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneMessageReceived,1)); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneMessageDelivered,1)); - CU_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageInProgress,1); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneMessageReceived,1)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneMessageDelivered,1)); + BC_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageInProgress,1, int, "%d"); ms_free(to); linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); } leaked_objects=belle_sip_object_get_object_count()-begin; - CU_ASSERT_TRUE(leaked_objects==0); + BC_ASSERT_TRUE(leaked_objects==0); if (leaked_objects>0){ belle_sip_object_dump_active_objects(); } @@ -410,16 +409,16 @@ static void text_message_with_external_body(void) { linphone_chat_room_send_chat_message(chat_room,message); /* check transient message list: the message should be in it, and should be the only one */ - CU_ASSERT_EQUAL(ms_list_size(chat_room->transient_messages), 1); - CU_ASSERT_EQUAL(ms_list_nth_data(chat_room->transient_messages,0), message); + BC_ASSERT_EQUAL(ms_list_size(chat_room->transient_messages), 1, int, "%d"); + BC_ASSERT_PTR_EQUAL(ms_list_nth_data(chat_room->transient_messages,0), message); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneMessageReceived,1)); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneMessageDelivered,1)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneMessageReceived,1)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneMessageDelivered,1)); - CU_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageInProgress,1); - CU_ASSERT_EQUAL(marie->stat.number_of_LinphoneMessageExtBodyReceived,1); + BC_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageInProgress,1, int, "%d"); + BC_ASSERT_EQUAL(marie->stat.number_of_LinphoneMessageExtBodyReceived,1, int, "%d"); - CU_ASSERT_EQUAL(ms_list_size(chat_room->transient_messages), 0); + BC_ASSERT_EQUAL(ms_list_size(chat_room->transient_messages), 0, int, "%d"); linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); @@ -487,7 +486,7 @@ static void file_transfer_message(void) { linphone_chat_message_cbs_set_msg_state_changed(cbs,liblinphone_tester_chat_message_msg_state_changed); linphone_chat_message_cbs_set_file_transfer_send(cbs, file_transfer_send); linphone_chat_room_send_chat_message(chat_room,message); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneMessageReceivedWithFile,1)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneMessageReceivedWithFile,1)); fclose(file_to_send); if (marie->stat.last_received_chat_message ) { cbs = linphone_chat_message_get_callbacks(marie->stat.last_received_chat_message); @@ -495,12 +494,12 @@ static void file_transfer_message(void) { linphone_chat_message_cbs_set_file_transfer_recv(cbs, file_transfer_received); linphone_chat_message_download_file(marie->stat.last_received_chat_message); } - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneFileTransferDownloadSuccessful,1)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneFileTransferDownloadSuccessful,1)); - CU_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageInProgress,1); - CU_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageDelivered,1); - CU_ASSERT_EQUAL(marie->stat.number_of_LinphoneFileTransferDownloadSuccessful,1); - CU_ASSERT_TRUE(compare_files(send_filepath, receive_filepath)); + BC_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageInProgress,1, int, "%d"); + BC_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageDelivered,1, int, "%d"); + BC_ASSERT_EQUAL(marie->stat.number_of_LinphoneFileTransferDownloadSuccessful,1, int, "%d"); + BC_ASSERT_TRUE(compare_files(send_filepath, receive_filepath)); linphone_content_unref(content); linphone_core_manager_destroy(marie); @@ -554,18 +553,18 @@ static void small_file_transfer_message(void) { linphone_chat_message_cbs_set_msg_state_changed(cbs, liblinphone_tester_chat_message_msg_state_changed); linphone_chat_message_cbs_set_file_transfer_send(cbs, memory_file_transfer_send); linphone_chat_room_send_chat_message(chat_room,message); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneMessageReceivedWithFile,1)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneMessageReceivedWithFile,1)); if (marie->stat.last_received_chat_message ) { cbs = linphone_chat_message_get_callbacks(marie->stat.last_received_chat_message); linphone_chat_message_cbs_set_msg_state_changed(cbs, liblinphone_tester_chat_message_msg_state_changed); linphone_chat_message_cbs_set_file_transfer_recv(cbs, file_transfer_received); linphone_chat_message_download_file(marie->stat.last_received_chat_message); } - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneFileTransferDownloadSuccessful,1)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneFileTransferDownloadSuccessful,1)); - CU_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageInProgress,1); - CU_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageDelivered,1); - CU_ASSERT_EQUAL(marie->stat.number_of_LinphoneFileTransferDownloadSuccessful,1); + BC_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageInProgress,1, int, "%d"); + BC_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageDelivered,1, int, "%d"); + BC_ASSERT_EQUAL(marie->stat.number_of_LinphoneFileTransferDownloadSuccessful,1, int, "%d"); linphone_content_unref(content); linphone_core_manager_destroy(marie); @@ -641,18 +640,18 @@ static void lime_file_transfer_message(void) { linphone_chat_message_cbs_set_msg_state_changed(cbs, liblinphone_tester_chat_message_msg_state_changed); linphone_chat_message_cbs_set_file_transfer_send(cbs, memory_file_transfer_send); linphone_chat_room_send_chat_message(chat_room,message); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneMessageReceivedWithFile,1)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneMessageReceivedWithFile,1)); if (marie->stat.last_received_chat_message ) { cbs = linphone_chat_message_get_callbacks(marie->stat.last_received_chat_message); linphone_chat_message_cbs_set_msg_state_changed(cbs, liblinphone_tester_chat_message_msg_state_changed); linphone_chat_message_cbs_set_file_transfer_recv(cbs, file_transfer_received); linphone_chat_message_download_file(marie->stat.last_received_chat_message); } - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneFileTransferDownloadSuccessful,1)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneFileTransferDownloadSuccessful,1)); - CU_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageInProgress,1); - CU_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageDelivered,1); - CU_ASSERT_EQUAL(marie->stat.number_of_LinphoneFileTransferDownloadSuccessful,1); + BC_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageInProgress,1, int, "%d"); + BC_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageDelivered,1, int, "%d"); + BC_ASSERT_EQUAL(marie->stat.number_of_LinphoneFileTransferDownloadSuccessful,1, int, "%d"); linphone_content_unref(content); linphone_core_manager_destroy(marie); @@ -842,10 +841,10 @@ static void lime_text_message(void) { ms_free(to); linphone_chat_room_send_message(chat_room,"Bla bla bla bla"); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneMessageReceived,1)); - CU_ASSERT_EQUAL(marie->stat.number_of_LinphoneMessageReceivedLegacy,1); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneMessageReceived,1)); + BC_ASSERT_EQUAL(marie->stat.number_of_LinphoneMessageReceivedLegacy,1, int, "%d"); - CU_ASSERT_PTR_NOT_NULL(linphone_core_get_chat_room(marie->lc,pauline->identity)); + BC_ASSERT_PTR_NOT_NULL(linphone_core_get_chat_room(marie->lc,pauline->identity)); /* TODO : check the message arrived correctly deciphered */ linphone_core_manager_destroy(marie); @@ -901,18 +900,18 @@ static void file_transfer_message_io_error_upload(void) { linphone_chat_room_send_chat_message(chat_room,message); /*wait for file to be 25% uploaded and simultate a network error*/ - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.progress_of_LinphoneFileTransfer,25)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.progress_of_LinphoneFileTransfer,25)); sal_set_send_error(pauline->lc->sal, -1); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneMessageNotDelivered,1)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneMessageNotDelivered,1)); - CU_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageNotDelivered,1); - CU_ASSERT_EQUAL(marie->stat.number_of_LinphoneFileTransferDownloadSuccessful,0); + BC_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageNotDelivered,1, int, "%d"); + BC_ASSERT_EQUAL(marie->stat.number_of_LinphoneFileTransferDownloadSuccessful,0, int, "%d"); sal_set_send_error(pauline->lc->sal, 0); linphone_core_refresh_registers(pauline->lc); /*to make sure registration is back in registered and so it can be later unregistered*/ - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneRegistrationOk,pauline->stat.number_of_LinphoneRegistrationOk+1)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneRegistrationOk,pauline->stat.number_of_LinphoneRegistrationOk+1)); linphone_content_unref(content); linphone_core_manager_destroy(marie); @@ -965,21 +964,21 @@ static void file_transfer_message_io_error_download(void) { linphone_chat_room_send_message2(chat_room,message,liblinphone_tester_chat_message_state_change,pauline->lc); /* wait for marie to receive pauline's message */ - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneMessageReceivedWithFile,1)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneMessageReceivedWithFile,1)); if (marie->stat.last_received_chat_message ) { /* get last message and use it to download file */ linphone_chat_message_start_file_download(marie->stat.last_received_chat_message, liblinphone_tester_chat_message_state_change, marie->lc); /* wait for file to be 50% downloaded */ - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.progress_of_LinphoneFileTransfer, 50)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.progress_of_LinphoneFileTransfer, 50)); /* and simulate network error */ sal_set_recv_error(marie->lc->sal, -1); } - CU_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageInProgress,1); - CU_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageDelivered,1); - CU_ASSERT_EQUAL(marie->stat.number_of_LinphoneMessageNotDelivered,1); - CU_ASSERT_EQUAL(marie->stat.number_of_LinphoneFileTransferDownloadSuccessful,0); + BC_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageInProgress,1, int, "%d"); + BC_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageDelivered,1, int, "%d"); + BC_ASSERT_EQUAL(marie->stat.number_of_LinphoneMessageNotDelivered,1, int, "%d"); + BC_ASSERT_EQUAL(marie->stat.number_of_LinphoneFileTransferDownloadSuccessful,0, int, "%d"); sal_set_recv_error(marie->lc->sal, 0); linphone_core_manager_destroy(marie); @@ -1035,13 +1034,13 @@ static void file_transfer_message_upload_cancelled(void) { linphone_chat_room_send_chat_message(chat_room,message); /*wait for file to be 50% uploaded and cancel the transfer */ - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.progress_of_LinphoneFileTransfer, 50)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.progress_of_LinphoneFileTransfer, 50)); linphone_chat_message_cancel_file_transfer(message); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneMessageNotDelivered,1)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneMessageNotDelivered,1)); - CU_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageNotDelivered,1); - CU_ASSERT_EQUAL(marie->stat.number_of_LinphoneFileTransferDownloadSuccessful,0); + BC_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageNotDelivered,1, int, "%d"); + BC_ASSERT_EQUAL(marie->stat.number_of_LinphoneFileTransferDownloadSuccessful,0, int, "%d"); linphone_content_unref(content); linphone_core_manager_destroy(marie); @@ -1092,21 +1091,21 @@ static void file_transfer_message_download_cancelled(void) { linphone_chat_room_send_message2(chat_room,message,liblinphone_tester_chat_message_state_change,pauline->lc); /* wait for marie to receive pauline's message */ - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneMessageReceivedWithFile,1)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneMessageReceivedWithFile,1)); if (marie->stat.last_received_chat_message ) { /* get last message and use it to download file */ linphone_chat_message_start_file_download(marie->stat.last_received_chat_message, liblinphone_tester_chat_message_state_change, marie->lc); /* wait for file to be 50% downloaded */ - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.progress_of_LinphoneFileTransfer, 50)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.progress_of_LinphoneFileTransfer, 50)); /* and cancel the transfer */ linphone_chat_message_cancel_file_transfer(marie->stat.last_received_chat_message); } - CU_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageInProgress,1); - CU_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageDelivered,1); - CU_ASSERT_EQUAL(marie->stat.number_of_LinphoneFileTransferDownloadSuccessful,0); - CU_ASSERT_EQUAL(marie->stat.number_of_LinphoneMessageNotDelivered,1); + BC_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageInProgress,1, int, "%d"); + BC_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageDelivered,1, int, "%d"); + BC_ASSERT_EQUAL(marie->stat.number_of_LinphoneFileTransferDownloadSuccessful,0, int, "%d"); + BC_ASSERT_EQUAL(marie->stat.number_of_LinphoneMessageNotDelivered,1, int, "%d"); linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); @@ -1140,12 +1139,12 @@ static void file_transfer_using_external_body_url(void) { linphone_chat_message_set_external_body_url(message, "https://www.linphone.org:444//tmp/54ec58280ace9_c30709218df8eaba61d1.jpg"); linphone_chat_room_send_chat_message(chat_room, message); - CU_ASSERT_TRUE(wait_for(pauline->lc, marie->lc, &marie->stat.number_of_LinphoneMessageReceived, 1)); + BC_ASSERT_TRUE(wait_for(pauline->lc, marie->lc, &marie->stat.number_of_LinphoneMessageReceived, 1)); if (marie->stat.last_received_chat_message) { linphone_chat_message_download_file(marie->stat.last_received_chat_message); } - CU_ASSERT_TRUE(wait_for(pauline->lc, marie->lc, &marie->stat.number_of_LinphoneMessageExtBodyReceived, 1)); - CU_ASSERT_TRUE(wait_for(pauline->lc, marie->lc, &pauline->stat.number_of_LinphoneMessageInProgress, 1)); + BC_ASSERT_TRUE(wait_for(pauline->lc, marie->lc, &marie->stat.number_of_LinphoneMessageExtBodyReceived, 1)); + BC_ASSERT_TRUE(wait_for(pauline->lc, marie->lc, &pauline->stat.number_of_LinphoneMessageInProgress, 1)); ms_free(to); linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); @@ -1174,16 +1173,16 @@ static void text_message_with_send_error(void) { linphone_chat_room_send_chat_message(chat_room,message); /* check transient message list: the message should be in it, and should be the only one */ - CU_ASSERT_EQUAL(ms_list_size(chat_room->transient_messages), 1); - CU_ASSERT_EQUAL(ms_list_nth_data(chat_room->transient_messages,0), message); + BC_ASSERT_EQUAL(ms_list_size(chat_room->transient_messages), 1, int, "%d"); + BC_ASSERT_PTR_EQUAL(ms_list_nth_data(chat_room->transient_messages,0), message); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneMessageNotDelivered,1)); - /*CU_ASSERT_EQUAL(marie->stat.number_of_LinphoneMessageInProgress,1);*/ - CU_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageReceived,0); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneMessageNotDelivered,1)); + /*BC_ASSERT_EQUAL(marie->stat.number_of_LinphoneMessageInProgress,1, int, "%d");*/ + BC_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageReceived,0, int, "%d"); /* the message should have been discarded from transient list after an error */ - CU_ASSERT_EQUAL(ms_list_size(chat_room->transient_messages), 0); + BC_ASSERT_EQUAL(ms_list_size(chat_room->transient_messages), 0, int, "%d"); sal_set_send_error(marie->lc->sal, 0); ms_free(to); @@ -1211,8 +1210,8 @@ static void text_message_denied(void) { linphone_chat_message_cbs_set_msg_state_changed(cbs,liblinphone_tester_chat_message_msg_state_changed); linphone_chat_room_send_chat_message(chat_room,message); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneMessageNotDelivered,1)); - CU_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageReceived,0); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneMessageNotDelivered,1)); + BC_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageReceived,0, int, "%d"); ms_free(to); linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); @@ -1240,7 +1239,7 @@ static void info_message_with_args(bool_t with_content) { LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc"); - CU_ASSERT_TRUE(call(pauline,marie)); + BC_ASSERT_TRUE(call(pauline,marie)); info=linphone_core_create_info_message(marie->lc); linphone_info_message_add_header(info,"Weather","still bad"); @@ -1261,26 +1260,26 @@ static void info_message_with_args(bool_t with_content) { linphone_call_send_info_message(linphone_core_get_current_call(marie->lc),info); linphone_info_message_destroy(info); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_inforeceived,1)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_inforeceived,1)); - CU_ASSERT_PTR_NOT_NULL(pauline->stat.last_received_info_message); + BC_ASSERT_PTR_NOT_NULL(pauline->stat.last_received_info_message); hvalue=linphone_info_message_get_header(pauline->stat.last_received_info_message, "Weather"); content=linphone_info_message_get_content(pauline->stat.last_received_info_message); - CU_ASSERT_PTR_NOT_NULL(hvalue); + BC_ASSERT_PTR_NOT_NULL(hvalue); if (hvalue) - CU_ASSERT_TRUE(strcmp(hvalue,"still bad")==0); + BC_ASSERT_TRUE(strcmp(hvalue,"still bad")==0); if (with_content){ - CU_ASSERT_PTR_NOT_NULL(content); + BC_ASSERT_PTR_NOT_NULL(content); if (content) { - CU_ASSERT_PTR_NOT_NULL(linphone_content_get_buffer(content)); - CU_ASSERT_PTR_NOT_NULL(linphone_content_get_type(content)); - CU_ASSERT_PTR_NOT_NULL(linphone_content_get_subtype(content)); - if (linphone_content_get_type(content)) CU_ASSERT_TRUE(strcmp(linphone_content_get_type(content),"application")==0); - if (linphone_content_get_subtype(content)) CU_ASSERT_TRUE(strcmp(linphone_content_get_subtype(content),"somexml")==0); - if (linphone_content_get_buffer(content))CU_ASSERT_TRUE(strcmp((const char*)linphone_content_get_buffer(content),info_content)==0); - CU_ASSERT_EQUAL(linphone_content_get_size(content),strlen(info_content)); + BC_ASSERT_PTR_NOT_NULL(linphone_content_get_buffer(content)); + BC_ASSERT_PTR_NOT_NULL(linphone_content_get_type(content)); + BC_ASSERT_PTR_NOT_NULL(linphone_content_get_subtype(content)); + if (linphone_content_get_type(content)) BC_ASSERT_TRUE(strcmp(linphone_content_get_type(content),"application")==0); + if (linphone_content_get_subtype(content)) BC_ASSERT_TRUE(strcmp(linphone_content_get_subtype(content),"somexml")==0); + if (linphone_content_get_buffer(content))BC_ASSERT_TRUE(strcmp((const char*)linphone_content_get_buffer(content),info_content)==0); + BC_ASSERT_EQUAL(linphone_content_get_size(content),strlen(info_content), int, "%d"); } } linphone_core_manager_destroy(marie); @@ -1316,8 +1315,8 @@ static void is_composing_notification(void) { linphone_chat_room_compose(chat_room); wait_for_until(pauline->lc, marie->lc, &dummy, 1, 1500); /*just to sleep while iterating*/ linphone_chat_room_send_message(chat_room, "Composing a message"); - CU_ASSERT_TRUE(wait_for(pauline->lc, marie->lc, &marie->stat.number_of_LinphoneIsComposingActiveReceived, 1)); - CU_ASSERT_TRUE(wait_for(pauline->lc, marie->lc, &marie->stat.number_of_LinphoneIsComposingIdleReceived, 2)); + BC_ASSERT_TRUE(wait_for(pauline->lc, marie->lc, &marie->stat.number_of_LinphoneIsComposingActiveReceived, 1)); + BC_ASSERT_TRUE(wait_for(pauline->lc, marie->lc, &marie->stat.number_of_LinphoneIsComposingIdleReceived, 2)); linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); } @@ -1372,9 +1371,9 @@ message_tester_copy_file(const char *from, const char *to) } static int check_no_strange_time(void* data,int argc, char** argv,char** cNames) { - CU_ASSERT_EQUAL(argc, 1); - CU_ASSERT_STRING_EQUAL(cNames[0], "COUNT(*)"); // count of non updated messages should be 0 - CU_ASSERT_STRING_EQUAL(argv[0], "0"); // count of non updated messages should be 0 + BC_ASSERT_EQUAL(argc, 1, int, "%d"); + BC_ASSERT_STRING_EQUAL(cNames[0], "COUNT(*)"); // count of non updated messages should be 0 + BC_ASSERT_STRING_EQUAL(argv[0], "0"); // count of non updated messages should be 0 return 0; } @@ -1386,7 +1385,7 @@ static void message_storage_migration() { snprintf(src_db,sizeof(src_db), "%s/messages.db", bc_tester_read_dir_prefix); snprintf(tmp_db,sizeof(tmp_db), "%s/tmp.db", bc_tester_writable_dir_prefix); - CU_ASSERT_EQUAL_FATAL(message_tester_copy_file(src_db, tmp_db), 0); + BC_ASSERT_EQUAL_FATAL(message_tester_copy_file(src_db, tmp_db), 0, int, "%d"); // enable to test the performances of the migration step //linphone_core_message_storage_set_debug(marie->lc, TRUE); @@ -1396,10 +1395,10 @@ static void message_storage_migration() { linphone_core_set_chat_database_path(marie->lc, tmp_db); chatrooms = linphone_core_get_chat_rooms(marie->lc); - CU_ASSERT(ms_list_size(chatrooms) > 0); + BC_ASSERT(ms_list_size(chatrooms) > 0); // check that all messages have been migrated to the UTC time storage - CU_ASSERT(sqlite3_exec(marie->lc->db, "SELECT COUNT(*) FROM history WHERE time != '-1';", check_no_strange_time, NULL, NULL) == SQLITE_OK ); + BC_ASSERT(sqlite3_exec(marie->lc->db, "SELECT COUNT(*) FROM history WHERE time != '-1';", check_no_strange_time, NULL, NULL) == SQLITE_OK ); linphone_core_manager_destroy(marie); remove(tmp_db); @@ -1411,7 +1410,7 @@ static void history_message_count_helper(LinphoneChatRoom* chatroom, int x, int if( expected != size ){ ms_warning("History retrieved from %d to %d returned %d records, but expected %d", x, y, size, expected); } - CU_ASSERT_EQUAL(size, expected); + BC_ASSERT_EQUAL(size, expected, int, "%d"); ms_list_free_with_data(messages, (void (*)(void *))linphone_chat_message_unref); @@ -1426,12 +1425,12 @@ static void history_range_full_test(){ snprintf(src_db,sizeof(src_db), "%s/messages.db", bc_tester_read_dir_prefix); snprintf(tmp_db,sizeof(tmp_db), "%s/tmp.db", bc_tester_writable_dir_prefix); - CU_ASSERT_EQUAL_FATAL(message_tester_copy_file(src_db, tmp_db), 0); + BC_ASSERT_EQUAL_FATAL(message_tester_copy_file(src_db, tmp_db), 0, int, "%d"); linphone_core_set_chat_database_path(marie->lc, tmp_db); chatroom = linphone_core_get_chat_room(marie->lc, jehan_addr); - CU_ASSERT_PTR_NOT_NULL(chatroom); + BC_ASSERT_PTR_NOT_NULL(chatroom); if (chatroom){ // We have 20 tests to perform to fully qualify the function, here they are: history_message_count_helper(chatroom, 0, 0, 1); @@ -1468,47 +1467,47 @@ static void history_messages_count() { snprintf(src_db,sizeof(src_db), "%s/messages.db", bc_tester_read_dir_prefix); snprintf(tmp_db,sizeof(tmp_db), "%s/tmp.db", bc_tester_writable_dir_prefix); - CU_ASSERT_EQUAL_FATAL(message_tester_copy_file(src_db, tmp_db), 0); + BC_ASSERT_EQUAL_FATAL(message_tester_copy_file(src_db, tmp_db), 0, int, "%d"); linphone_core_set_chat_database_path(marie->lc, tmp_db); chatroom = linphone_core_get_chat_room(marie->lc, jehan_addr); - CU_ASSERT_PTR_NOT_NULL(chatroom); + BC_ASSERT_PTR_NOT_NULL(chatroom); if (chatroom){ messages=linphone_chat_room_get_history(chatroom,10); - CU_ASSERT_EQUAL(ms_list_size(messages), 10); + BC_ASSERT_EQUAL(ms_list_size(messages), 10, int, "%d"); ms_list_free_with_data(messages, (void (*)(void*))linphone_chat_message_unref); messages=linphone_chat_room_get_history(chatroom,1); - CU_ASSERT_EQUAL(ms_list_size(messages), 1); + BC_ASSERT_EQUAL(ms_list_size(messages), 1, int, "%d"); ms_list_free_with_data(messages, (void (*)(void*))linphone_chat_message_unref); messages=linphone_chat_room_get_history(chatroom,0); - CU_ASSERT_EQUAL(linphone_chat_room_get_history_size(chatroom), 1270); - CU_ASSERT_EQUAL(ms_list_size(messages), 1270); + BC_ASSERT_EQUAL(linphone_chat_room_get_history_size(chatroom), 1270, int, "%d"); + BC_ASSERT_EQUAL(ms_list_size(messages), 1270, int, "%d"); /*check the second most recent message*/ - CU_ASSERT_STRING_EQUAL(linphone_chat_message_get_text((LinphoneChatMessage *)messages->next->data), "Fore and aft follow each other."); + BC_ASSERT_STRING_EQUAL(linphone_chat_message_get_text((LinphoneChatMessage *)messages->next->data), "Fore and aft follow each other."); ms_list_free_with_data(messages, (void (*)(void*))linphone_chat_message_unref); /*test offset+limit: retrieve the 42th latest message only and check its content*/ messages=linphone_chat_room_get_history_range(chatroom, 42, 42); - CU_ASSERT_EQUAL(ms_list_size(messages), 1); - CU_ASSERT_STRING_EQUAL(linphone_chat_message_get_text((LinphoneChatMessage *)messages->data), "If you open yourself to the Tao is intangible and evasive, yet prefers to keep us at the mercy of the kingdom, then all of the streams of hundreds of valleys because of its limitless possibilities."); + BC_ASSERT_EQUAL(ms_list_size(messages), 1, int, "%d"); + BC_ASSERT_STRING_EQUAL(linphone_chat_message_get_text((LinphoneChatMessage *)messages->data), "If you open yourself to the Tao is intangible and evasive, yet prefers to keep us at the mercy of the kingdom, then all of the streams of hundreds of valleys because of its limitless possibilities."); ms_list_free_with_data(messages, (void (*)(void*))linphone_chat_message_unref); /*test offset without limit*/ messages = linphone_chat_room_get_history_range(chatroom, 1265, -1); - CU_ASSERT_EQUAL(ms_list_size(messages), 1270-1265); + BC_ASSERT_EQUAL(ms_list_size(messages), 1270-1265, int, "%d"); ms_list_free_with_data(messages, (void (*)(void*))linphone_chat_message_unref); /*test limit without offset*/ messages = linphone_chat_room_get_history_range(chatroom, 0, 5); - CU_ASSERT_EQUAL(ms_list_size(messages), 6); + BC_ASSERT_EQUAL(ms_list_size(messages), 6, int, "%d"); ms_list_free_with_data(messages, (void (*)(void*))linphone_chat_message_unref); /*test invalid start*/ messages = linphone_chat_room_get_history_range(chatroom, 1265, 1260); - CU_ASSERT_EQUAL(ms_list_size(messages), 1270-1265); + BC_ASSERT_EQUAL(ms_list_size(messages), 1270-1265, int, "%d"); ms_list_free_with_data(messages, (void (*)(void*))linphone_chat_message_unref); } linphone_core_manager_destroy(marie); diff --git a/tester/multi_call.c b/tester/multi_call.c index 5f580118c..2b564668d 100644 --- a/tester/multi_call.c +++ b/tester/multi_call.c @@ -51,23 +51,23 @@ static void call_waiting_indication_with_param(bool_t enable_caller_privacy) { lcs=ms_list_append(lcs,pauline->lc); lcs=ms_list_append(lcs,laure->lc); - CU_ASSERT_TRUE(call_with_caller_params(marie,pauline,marie_params)); + BC_ASSERT_TRUE(call_with_caller_params(marie,pauline,marie_params)); pauline_called_by_marie=linphone_core_get_current_call(pauline->lc); if (enable_caller_privacy) linphone_call_params_set_privacy(laure_params,LinphonePrivacyId); - CU_ASSERT_PTR_NOT_NULL(linphone_core_invite_address_with_params(laure->lc,pauline->identity,laure_params)); + BC_ASSERT_PTR_NOT_NULL(linphone_core_invite_address_with_params(laure->lc,pauline->identity,laure_params)); - CU_ASSERT_TRUE(wait_for(laure->lc + BC_ASSERT_TRUE(wait_for(laure->lc ,pauline->lc ,&pauline->stat.number_of_LinphoneCallIncomingReceived ,2)); - CU_ASSERT_EQUAL(laure->stat.number_of_LinphoneCallOutgoingProgress,1); + BC_ASSERT_EQUAL(laure->stat.number_of_LinphoneCallOutgoingProgress,1, int, "%d"); - CU_ASSERT_TRUE(wait_for(laure->lc + BC_ASSERT_TRUE(wait_for(laure->lc ,pauline->lc ,&laure->stat.number_of_LinphoneCallOutgoingRinging ,1)); @@ -81,25 +81,25 @@ static void call_waiting_indication_with_param(bool_t enable_caller_privacy) { } } - CU_ASSERT_TRUE(wait_for(laure->lc + BC_ASSERT_TRUE(wait_for(laure->lc ,pauline->lc ,&laure->stat.number_of_LinphoneCallConnected ,1)); - CU_ASSERT_TRUE(wait_for(pauline->lc + BC_ASSERT_TRUE(wait_for(pauline->lc ,marie->lc ,&marie->stat.number_of_LinphoneCallPausedByRemote ,1)); if (pauline_called_by_laure && enable_caller_privacy ) - CU_ASSERT_EQUAL(linphone_call_params_get_privacy(linphone_call_get_current_params(pauline_called_by_laure)),LinphonePrivacyId); + BC_ASSERT_EQUAL(linphone_call_params_get_privacy(linphone_call_get_current_params(pauline_called_by_laure)),LinphonePrivacyId, int, "%d"); /*wait a bit for ACK to be sent*/ wait_for_list(lcs,NULL,0,1000); linphone_core_terminate_all_calls(pauline->lc); - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallEnd,1,10000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallEnd,1,10000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&laure->stat.number_of_LinphoneCallEnd,1,10000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallEnd,1,10000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallEnd,1,10000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&laure->stat.number_of_LinphoneCallEnd,1,10000)); linphone_core_manager_destroy(marie); @@ -129,9 +129,9 @@ static void incoming_call_accepted_when_outgoing_call_in_state(LinphoneCallState if (state==LinphoneCallOutgoingRinging || state==LinphoneCallOutgoingEarlyMedia) { - CU_ASSERT_PTR_NOT_NULL(linphone_core_invite_address_with_params(marie->lc,pauline->identity,marie_params)); + BC_ASSERT_PTR_NOT_NULL(linphone_core_invite_address_with_params(marie->lc,pauline->identity,marie_params)); - CU_ASSERT_TRUE(wait_for(marie->lc + BC_ASSERT_TRUE(wait_for(marie->lc ,pauline->lc ,&pauline->stat.number_of_LinphoneCallIncomingReceived ,1)); @@ -139,29 +139,29 @@ static void incoming_call_accepted_when_outgoing_call_in_state(LinphoneCallState if (state==LinphoneCallOutgoingEarlyMedia) linphone_core_accept_early_media(pauline->lc,linphone_core_get_current_call(pauline->lc)); - CU_ASSERT_EQUAL(marie->stat.number_of_LinphoneCallOutgoingProgress,1); - CU_ASSERT_TRUE(wait_for(marie->lc + BC_ASSERT_EQUAL(marie->stat.number_of_LinphoneCallOutgoingProgress,1, int, "%d"); + BC_ASSERT_TRUE(wait_for(marie->lc ,pauline->lc ,state==LinphoneCallOutgoingEarlyMedia?&marie->stat.number_of_LinphoneCallOutgoingEarlyMedia:&marie->stat.number_of_LinphoneCallOutgoingRinging ,1)); } else if (state==LinphoneCallOutgoingProgress) { - CU_ASSERT_PTR_NOT_NULL(linphone_core_invite_address(marie->lc,pauline->identity)); + BC_ASSERT_PTR_NOT_NULL(linphone_core_invite_address(marie->lc,pauline->identity)); } else { ms_error("Unsupported state"); return; } - CU_ASSERT_TRUE(call_with_caller_params(laure,marie,laure_params)); + BC_ASSERT_TRUE(call_with_caller_params(laure,marie,laure_params)); - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallEnd,1,10000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallEnd,1,10000)); linphone_core_terminate_all_calls(marie->lc); - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallEnd,1,10000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallEnd,1,10000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&laure->stat.number_of_LinphoneCallEnd,1,10000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallEnd,1,10000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallEnd,1,10000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&laure->stat.number_of_LinphoneCallEnd,1,10000)); linphone_core_manager_destroy(marie); @@ -193,32 +193,32 @@ static void simple_conference_base(LinphoneCoreManager* marie, LinphoneCoreManag lcs=ms_list_append(lcs,pauline->lc); lcs=ms_list_append(lcs,laure->lc); - CU_ASSERT_TRUE(call(marie,pauline)); + BC_ASSERT_TRUE(call(marie,pauline)); marie_call_pauline=linphone_core_get_current_call(marie->lc); pauline_called_by_marie=linphone_core_get_current_call(pauline->lc); - CU_ASSERT_TRUE(pause_call_1(marie,marie_call_pauline,pauline,pauline_called_by_marie)); + BC_ASSERT_TRUE(pause_call_1(marie,marie_call_pauline,pauline,pauline_called_by_marie)); - CU_ASSERT_TRUE(call(marie,laure)); + BC_ASSERT_TRUE(call(marie,laure)); initial_marie_stat=marie->stat; initial_pauline_stat=pauline->stat; initial_laure_stat=laure->stat; marie_call_laure=linphone_core_get_current_call(marie->lc); - CU_ASSERT_PTR_NOT_NULL_FATAL(marie_call_laure); + BC_ASSERT_PTR_NOT_NULL_FATAL(marie_call_laure); linphone_core_add_to_conference(marie->lc,marie_call_laure); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallUpdating,initial_marie_stat.number_of_LinphoneCallUpdating+1,5000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallUpdating,initial_marie_stat.number_of_LinphoneCallUpdating+1,5000)); linphone_core_add_to_conference(marie->lc,marie_call_pauline); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallResuming,initial_marie_stat.number_of_LinphoneCallResuming+1,2000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallResuming,initial_marie_stat.number_of_LinphoneCallResuming+1,2000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallStreamsRunning,initial_pauline_stat.number_of_LinphoneCallStreamsRunning+1,5000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&laure->stat.number_of_LinphoneCallStreamsRunning,initial_laure_stat.number_of_LinphoneCallStreamsRunning+1,2000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallStreamsRunning,initial_marie_stat.number_of_LinphoneCallStreamsRunning+2,3000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallStreamsRunning,initial_pauline_stat.number_of_LinphoneCallStreamsRunning+1,5000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&laure->stat.number_of_LinphoneCallStreamsRunning,initial_laure_stat.number_of_LinphoneCallStreamsRunning+1,2000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallStreamsRunning,initial_marie_stat.number_of_LinphoneCallStreamsRunning+2,3000)); - CU_ASSERT_TRUE(linphone_core_is_in_conference(marie->lc)); - CU_ASSERT_EQUAL(linphone_core_get_conference_size(marie->lc),3); + BC_ASSERT_TRUE(linphone_core_is_in_conference(marie->lc)); + BC_ASSERT_EQUAL(linphone_core_get_conference_size(marie->lc),3, int, "%d"); /* * FIXME: check_ice cannot work as it is today because there is no current call for the party that hosts the conference @@ -234,9 +234,9 @@ static void simple_conference_base(LinphoneCoreManager* marie, LinphoneCoreManag linphone_core_terminate_conference(marie->lc); - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallEnd,1,10000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallEnd,1,10000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&laure->stat.number_of_LinphoneCallEnd,1,10000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallEnd,1,10000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallEnd,1,10000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&laure->stat.number_of_LinphoneCallEnd,1,10000)); @@ -285,7 +285,7 @@ static void simple_call_transfer(void) { lcs=ms_list_append(lcs,laure->lc); - CU_ASSERT_TRUE(call(marie,pauline)); + BC_ASSERT_TRUE(call(marie,pauline)); marie_calling_pauline=linphone_core_get_current_call(marie->lc); pauline_called_by_marie=linphone_core_get_current_call(pauline->lc); @@ -295,35 +295,35 @@ static void simple_call_transfer(void) { linphone_core_transfer_call(pauline->lc,pauline_called_by_marie,laure_identity); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallRefered,1,2000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallRefered,1,2000)); /*marie pausing pauline*/ - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallPausing,1,2000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallPausedByRemote,1,2000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallPaused,1,2000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallPausing,1,2000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallPausedByRemote,1,2000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallPaused,1,2000)); /*marie calling laure*/ - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallOutgoingProgress,1,2000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallOutgoingProgress,1,2000)); - CU_ASSERT_PTR_NOT_NULL(linphone_call_get_transfer_target_call(marie_calling_pauline)); + BC_ASSERT_PTR_NOT_NULL(linphone_call_get_transfer_target_call(marie_calling_pauline)); - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneTransferCallOutgoingInit,1,2000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&laure->stat.number_of_LinphoneCallIncomingReceived,1,2000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallOutgoingRinging,1,2000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneTransferCallOutgoingProgress,1,2000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneTransferCallOutgoingInit,1,2000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&laure->stat.number_of_LinphoneCallIncomingReceived,1,2000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallOutgoingRinging,1,2000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneTransferCallOutgoingProgress,1,2000)); linphone_core_accept_call(laure->lc,linphone_core_get_current_call(laure->lc)); - CU_ASSERT_TRUE(wait_for_list(lcs,&laure->stat.number_of_LinphoneCallConnected,1,2000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&laure->stat.number_of_LinphoneCallStreamsRunning,1,2000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallConnected,1,2000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallStreamsRunning,1,2000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&laure->stat.number_of_LinphoneCallConnected,1,2000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&laure->stat.number_of_LinphoneCallStreamsRunning,1,2000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallConnected,1,2000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallStreamsRunning,1,2000)); marie_calling_laure=linphone_core_get_current_call(marie->lc); - CU_ASSERT_PTR_NOT_NULL_FATAL(marie_calling_laure); - CU_ASSERT_TRUE(linphone_call_get_transferer_call(marie_calling_laure)==marie_calling_pauline); + BC_ASSERT_PTR_NOT_NULL_FATAL(marie_calling_laure); + BC_ASSERT_TRUE(linphone_call_get_transferer_call(marie_calling_laure)==marie_calling_pauline); - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneTransferCallConnected,1,2000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneTransferCallConnected,1,2000)); /*terminate marie to pauline call*/ - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallEnd,1,2000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallEnd,1,2000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallEnd,1,2000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallEnd,1,2000)); linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); @@ -343,7 +343,7 @@ static void unattended_call_transfer(void) { lcs=ms_list_append(lcs,laure->lc); - CU_ASSERT_TRUE(call(marie,pauline)); + BC_ASSERT_TRUE(call(marie,pauline)); pauline_called_by_marie=linphone_core_get_current_call(marie->lc); reset_counters(&marie->stat); @@ -351,25 +351,25 @@ static void unattended_call_transfer(void) { reset_counters(&laure->stat); linphone_core_transfer_call(marie->lc,pauline_called_by_marie,laure_identity); - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallRefered,1,2000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallRefered,1,2000)); /*marie ends the call */ linphone_core_terminate_call(marie->lc,pauline_called_by_marie); - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallEnd,1,2000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallEnd,1,2000)); /*Pauline starts the transfer*/ - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallOutgoingInit,1,2000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallOutgoingProgress,1,2000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&laure->stat.number_of_LinphoneCallIncomingReceived,1,2000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallOutgoingRinging,1,2000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallOutgoingInit,1,2000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallOutgoingProgress,1,2000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&laure->stat.number_of_LinphoneCallIncomingReceived,1,2000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallOutgoingRinging,1,2000)); linphone_core_accept_call(laure->lc,linphone_core_get_current_call(laure->lc)); - CU_ASSERT_TRUE(wait_for_list(lcs,&laure->stat.number_of_LinphoneCallConnected,1,2000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&laure->stat.number_of_LinphoneCallStreamsRunning,1,2000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallConnected,1,2000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallStreamsRunning,1,2000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallConnected,1,2000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&laure->stat.number_of_LinphoneCallConnected,1,2000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&laure->stat.number_of_LinphoneCallStreamsRunning,1,2000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallConnected,1,2000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallStreamsRunning,1,2000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallConnected,1,2000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallEnd,1,2000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallEnd,1,2000)); linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); @@ -383,10 +383,10 @@ static void unattended_call_transfer_with_error(void) { LinphoneCall* pauline_called_by_marie; bool_t call_ok=TRUE; MSList* lcs=ms_list_append(NULL,marie->lc); - + lcs=ms_list_append(lcs,pauline->lc); - CU_ASSERT_TRUE((call_ok=call(marie,pauline))); + BC_ASSERT_TRUE((call_ok=call(marie,pauline))); if (call_ok){ pauline_called_by_marie=linphone_core_get_current_call(marie->lc); @@ -394,21 +394,21 @@ static void unattended_call_transfer_with_error(void) { reset_counters(&pauline->stat); linphone_core_transfer_call(marie->lc,pauline_called_by_marie,"unknown_user"); - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallRefered,1,2000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallRefered,1,2000)); /*Pauline starts the transfer*/ - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallOutgoingInit,1,2000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallOutgoingInit,1,2000)); /* and immediately get an error*/ - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallError,1,2000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallError,1,2000)); /*the error must be reported back to marie*/ - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneTransferCallError,1,2000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneTransferCallError,1,2000)); /*and pauline should resume the call automatically*/ - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallResuming,1,2000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallResuming,1,2000)); /*and call should be resumed*/ - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallStreamsRunning,1,2000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallStreamsRunning,1,2000)); } linphone_core_manager_destroy(marie); @@ -429,24 +429,24 @@ static void call_transfer_existing_call_outgoing_call(void) { bool_t call_ok=TRUE; const MSList* calls; MSList* lcs=ms_list_append(NULL,marie->lc); - + lcs=ms_list_append(lcs,pauline->lc); lcs=ms_list_append(lcs,laure->lc); /*marie call pauline*/ - CU_ASSERT_TRUE((call_ok=call(marie,pauline))); + BC_ASSERT_TRUE((call_ok=call(marie,pauline))); if (call_ok){ marie_call_pauline=linphone_core_get_current_call(marie->lc); pauline_called_by_marie=linphone_core_get_current_call(pauline->lc); /*marie pause pauline*/ - CU_ASSERT_TRUE(pause_call_1(marie,marie_call_pauline,pauline,pauline_called_by_marie)); + BC_ASSERT_TRUE(pause_call_1(marie,marie_call_pauline,pauline,pauline_called_by_marie)); /*marie call laure*/ - CU_ASSERT_TRUE(call(marie,laure)); + BC_ASSERT_TRUE(call(marie,laure)); marie_call_laure=linphone_core_get_current_call(marie->lc); laure_called_by_marie=linphone_core_get_current_call(laure->lc); /*marie pause laure*/ - CU_ASSERT_TRUE(pause_call_1(marie,marie_call_laure,laure,laure_called_by_marie)); + BC_ASSERT_TRUE(pause_call_1(marie,marie_call_laure,laure,laure_called_by_marie)); reset_counters(&marie->stat); reset_counters(&pauline->stat); @@ -454,37 +454,37 @@ static void call_transfer_existing_call_outgoing_call(void) { linphone_core_transfer_call_to_another(marie->lc,marie_call_pauline,marie_call_laure); - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallRefered,1,2000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallRefered,1,2000)); /*pauline pausing marie*/ - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallPausing,1,4000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallPaused,1,4000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallPausing,1,4000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallPaused,1,4000)); /*pauline calling laure*/ - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallOutgoingProgress,1,2000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneTransferCallOutgoingInit,1,2000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&laure->stat.number_of_LinphoneCallIncomingReceived,1,2000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallOutgoingRinging,1,2000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneTransferCallOutgoingProgress,1,2000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallOutgoingProgress,1,2000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneTransferCallOutgoingInit,1,2000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&laure->stat.number_of_LinphoneCallIncomingReceived,1,2000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallOutgoingRinging,1,2000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneTransferCallOutgoingProgress,1,2000)); /*laure accept call*/ for(calls=linphone_core_get_calls(laure->lc);calls!=NULL;calls=calls->next) { lcall = (LinphoneCall*)calls->data; if (linphone_call_get_state(lcall) == LinphoneCallIncomingReceived) { - CU_ASSERT_EQUAL(linphone_call_get_replaced_call(lcall),laure_called_by_marie); + BC_ASSERT_PTR_EQUAL(linphone_call_get_replaced_call(lcall),laure_called_by_marie); linphone_core_accept_call(laure->lc,lcall); break; } } - CU_ASSERT_TRUE(wait_for_list(lcs,&laure->stat.number_of_LinphoneCallConnected,1,2000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&laure->stat.number_of_LinphoneCallStreamsRunning,1,2000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallConnected,1,2000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallStreamsRunning,1,2000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneTransferCallConnected,1,2000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&laure->stat.number_of_LinphoneCallConnected,1,2000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&laure->stat.number_of_LinphoneCallStreamsRunning,1,2000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallConnected,1,2000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallStreamsRunning,1,2000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneTransferCallConnected,1,2000)); /*terminate marie to pauline/laure call*/ - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallEnd,1,2000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallEnd,2,2000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&laure->stat.number_of_LinphoneCallEnd,1,2000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallEnd,1,2000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallEnd,2,2000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&laure->stat.number_of_LinphoneCallEnd,1,2000)); } linphone_core_manager_destroy(marie); diff --git a/tester/multicast_call_tester.c b/tester/multicast_call_tester.c index 22c7fcd8b..692f4d995 100644 --- a/tester/multicast_call_tester.c +++ b/tester/multicast_call_tester.c @@ -52,15 +52,15 @@ static void call_multicast_base(bool_t video) { linphone_core_set_audio_multicast_addr(pauline->lc,"224.1.2.3"); linphone_core_enable_audio_multicast(pauline->lc,TRUE); - CU_ASSERT_TRUE(call(pauline,marie)); + BC_ASSERT_TRUE(call(pauline,marie)); wait_for_until(marie->lc, pauline->lc, NULL, 1, 3000); if (linphone_core_get_current_call(marie->lc)) { - CU_ASSERT_TRUE(linphone_call_get_audio_stats(linphone_core_get_current_call(marie->lc))->download_bandwidth>70); + BC_ASSERT_TRUE(linphone_call_get_audio_stats(linphone_core_get_current_call(marie->lc))->download_bandwidth>70); if (video) { /*check video path*/ linphone_call_set_next_video_frame_decoded_callback(linphone_core_get_current_call(marie->lc),linphone_call_cb,marie->lc); linphone_call_send_vfu_request(linphone_core_get_current_call(marie->lc)); - CU_ASSERT_TRUE( wait_for(marie->lc,pauline->lc,&marie->stat.number_of_IframeDecoded,1)); + BC_ASSERT_TRUE( wait_for(marie->lc,pauline->lc,&marie->stat.number_of_IframeDecoded,1)); } end_call(marie,pauline); @@ -69,7 +69,7 @@ static void call_multicast_base(bool_t video) { linphone_core_manager_destroy(pauline); leaked_objects=belle_sip_object_get_object_count()-begin; - CU_ASSERT_TRUE(leaked_objects==0); + BC_ASSERT_TRUE(leaked_objects==0); if (leaked_objects>0){ belle_sip_object_dump_active_objects(); } @@ -139,8 +139,8 @@ static void early_media_with_multicast_base(bool_t video) { linphone_core_invite_address(marie->lc, pauline->identity); - CU_ASSERT_TRUE(wait_for_list(lcs, &pauline->stat.number_of_LinphoneCallIncomingReceived,1,3000)); - CU_ASSERT_TRUE(wait_for_list(lcs, &marie->stat.number_of_LinphoneCallOutgoingRinging,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs, &pauline->stat.number_of_LinphoneCallIncomingReceived,1,3000)); + BC_ASSERT_TRUE(wait_for_list(lcs, &marie->stat.number_of_LinphoneCallOutgoingRinging,1,1000)); if (linphone_core_inc_invite_pending(pauline->lc)) { @@ -151,8 +151,8 @@ static void early_media_with_multicast_base(bool_t video) { } linphone_core_accept_early_media(pauline->lc, linphone_core_get_current_call(pauline->lc)); - CU_ASSERT_TRUE( wait_for_list(lcs, &pauline->stat.number_of_LinphoneCallIncomingEarlyMedia,1,2000) ); - CU_ASSERT_TRUE( wait_for_list(lcs, &marie->stat.number_of_LinphoneCallOutgoingEarlyMedia,1,2000) ); + BC_ASSERT_TRUE( wait_for_list(lcs, &pauline->stat.number_of_LinphoneCallIncomingEarlyMedia,1,2000) ); + BC_ASSERT_TRUE( wait_for_list(lcs, &marie->stat.number_of_LinphoneCallOutgoingEarlyMedia,1,2000) ); if (linphone_core_inc_invite_pending(pauline2->lc)) { /* send a 183 to initiate the early media */ @@ -162,40 +162,40 @@ static void early_media_with_multicast_base(bool_t video) { } linphone_core_accept_early_media(pauline2->lc, linphone_core_get_current_call(pauline2->lc)); - CU_ASSERT_TRUE( wait_for_list(lcs, &pauline2->stat.number_of_LinphoneCallIncomingEarlyMedia,1,2000) ); + BC_ASSERT_TRUE( wait_for_list(lcs, &pauline2->stat.number_of_LinphoneCallIncomingEarlyMedia,1,2000) ); } wait_for_list(lcs, &dummy, 1, 3000); - CU_ASSERT_TRUE(linphone_call_get_audio_stats(linphone_core_get_current_call(pauline->lc))->download_bandwidth>70); - CU_ASSERT_TRUE(linphone_call_get_audio_stats(linphone_core_get_current_call(pauline->lc))->download_bandwidth<90); + BC_ASSERT_TRUE(linphone_call_get_audio_stats(linphone_core_get_current_call(pauline->lc))->download_bandwidth>70); + BC_ASSERT_TRUE(linphone_call_get_audio_stats(linphone_core_get_current_call(pauline->lc))->download_bandwidth<90); - CU_ASSERT_TRUE(linphone_call_get_audio_stats(linphone_core_get_current_call(pauline2->lc))->download_bandwidth>70); - CU_ASSERT_TRUE(linphone_call_get_audio_stats(linphone_core_get_current_call(pauline2->lc))->download_bandwidth<90); + BC_ASSERT_TRUE(linphone_call_get_audio_stats(linphone_core_get_current_call(pauline2->lc))->download_bandwidth>70); + BC_ASSERT_TRUE(linphone_call_get_audio_stats(linphone_core_get_current_call(pauline2->lc))->download_bandwidth<90); - CU_ASSERT_TRUE(linphone_call_params_audio_multicast_enabled(linphone_call_get_current_params(linphone_core_get_current_call(pauline->lc)))); - CU_ASSERT_TRUE(linphone_call_params_audio_multicast_enabled(linphone_call_get_current_params(linphone_core_get_current_call(marie->lc)))); + BC_ASSERT_TRUE(linphone_call_params_audio_multicast_enabled(linphone_call_get_current_params(linphone_core_get_current_call(pauline->lc)))); + BC_ASSERT_TRUE(linphone_call_params_audio_multicast_enabled(linphone_call_get_current_params(linphone_core_get_current_call(marie->lc)))); if (video) { - CU_ASSERT_TRUE(linphone_call_params_video_multicast_enabled(linphone_call_get_current_params(linphone_core_get_current_call(pauline->lc)))); - CU_ASSERT_TRUE(linphone_call_params_video_multicast_enabled(linphone_call_get_current_params(linphone_core_get_current_call(marie->lc)))); + BC_ASSERT_TRUE(linphone_call_params_video_multicast_enabled(linphone_call_get_current_params(linphone_core_get_current_call(pauline->lc)))); + BC_ASSERT_TRUE(linphone_call_params_video_multicast_enabled(linphone_call_get_current_params(linphone_core_get_current_call(marie->lc)))); } if (video) { - CU_ASSERT_TRUE( wait_for_list(lcs,&pauline->stat.number_of_IframeDecoded,1,2000)); - CU_ASSERT_TRUE( wait_for_list(lcs,&pauline2->stat.number_of_IframeDecoded,1,2000)); + BC_ASSERT_TRUE( wait_for_list(lcs,&pauline->stat.number_of_IframeDecoded,1,2000)); + BC_ASSERT_TRUE( wait_for_list(lcs,&pauline2->stat.number_of_IframeDecoded,1,2000)); } linphone_core_accept_call(pauline->lc, linphone_core_get_current_call(pauline->lc)); - CU_ASSERT_TRUE(wait_for_list(lcs, &marie->stat.number_of_LinphoneCallConnected, 1,1000)); - CU_ASSERT_TRUE(wait_for_list(lcs, &marie->stat.number_of_LinphoneCallStreamsRunning, 1,1000)); - CU_ASSERT_TRUE(wait_for_list(lcs, &pauline2->stat.number_of_LinphoneCallEnd, 1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs, &marie->stat.number_of_LinphoneCallConnected, 1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs, &marie->stat.number_of_LinphoneCallStreamsRunning, 1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs, &pauline2->stat.number_of_LinphoneCallEnd, 1,1000)); - CU_ASSERT_TRUE(linphone_call_params_audio_multicast_enabled(linphone_call_get_current_params(linphone_core_get_current_call(pauline->lc)))); - CU_ASSERT_TRUE(linphone_call_params_audio_multicast_enabled(linphone_call_get_current_params(linphone_core_get_current_call(marie->lc)))); + BC_ASSERT_TRUE(linphone_call_params_audio_multicast_enabled(linphone_call_get_current_params(linphone_core_get_current_call(pauline->lc)))); + BC_ASSERT_TRUE(linphone_call_params_audio_multicast_enabled(linphone_call_get_current_params(linphone_core_get_current_call(marie->lc)))); if (video) { - CU_ASSERT_TRUE(linphone_call_params_video_multicast_enabled(linphone_call_get_current_params(linphone_core_get_current_call(pauline->lc)))); - CU_ASSERT_TRUE(linphone_call_params_video_multicast_enabled(linphone_call_get_current_params(linphone_core_get_current_call(marie->lc)))); + BC_ASSERT_TRUE(linphone_call_params_video_multicast_enabled(linphone_call_get_current_params(linphone_core_get_current_call(pauline->lc)))); + BC_ASSERT_TRUE(linphone_call_params_video_multicast_enabled(linphone_call_get_current_params(linphone_core_get_current_call(marie->lc)))); } params=linphone_call_params_copy(linphone_call_get_current_params(linphone_core_get_current_call(pauline->lc))); @@ -211,10 +211,10 @@ static void early_media_with_multicast_base(bool_t video) { , params); linphone_call_params_destroy(params); - CU_ASSERT_TRUE(wait_for_list(lcs, &pauline->stat.number_of_LinphoneCallStreamsRunning, 2,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs, &pauline->stat.number_of_LinphoneCallStreamsRunning, 2,1000)); - CU_ASSERT_FALSE(linphone_call_params_audio_multicast_enabled(linphone_call_get_current_params(linphone_core_get_current_call(pauline->lc)))); - CU_ASSERT_FALSE(linphone_call_params_audio_multicast_enabled(linphone_call_get_current_params(linphone_core_get_current_call(marie->lc)))); + BC_ASSERT_FALSE(linphone_call_params_audio_multicast_enabled(linphone_call_get_current_params(linphone_core_get_current_call(pauline->lc)))); + BC_ASSERT_FALSE(linphone_call_params_audio_multicast_enabled(linphone_call_get_current_params(linphone_core_get_current_call(marie->lc)))); check_media_direction( pauline , linphone_core_get_current_call(pauline->lc) @@ -228,8 +228,8 @@ static void early_media_with_multicast_base(bool_t video) { , video?LinphoneMediaDirectionSendRecv:LinphoneMediaDirectionInactive); if (video) { - CU_ASSERT_FALSE(linphone_call_params_video_multicast_enabled(linphone_call_get_current_params(linphone_core_get_current_call(marie->lc)))); - CU_ASSERT_FALSE(linphone_call_params_video_multicast_enabled(linphone_call_get_current_params(linphone_core_get_current_call(pauline->lc)))); + BC_ASSERT_FALSE(linphone_call_params_video_multicast_enabled(linphone_call_get_current_params(linphone_core_get_current_call(marie->lc)))); + BC_ASSERT_FALSE(linphone_call_params_video_multicast_enabled(linphone_call_get_current_params(linphone_core_get_current_call(pauline->lc)))); } end_call(marie,pauline); } @@ -239,7 +239,7 @@ static void early_media_with_multicast_base(bool_t video) { linphone_core_manager_destroy(pauline2); leaked_objects=belle_sip_object_get_object_count()-begin; - CU_ASSERT_EQUAL(leaked_objects,0); + BC_ASSERT_EQUAL(leaked_objects,0, int, "%d"); if (leaked_objects>0){ belle_sip_object_dump_active_objects(); } diff --git a/tester/offeranswer_tester.c b/tester/offeranswer_tester.c index 8225faf9d..4302969c1 100644 --- a/tester/offeranswer_tester.c +++ b/tester/offeranswer_tester.c @@ -46,13 +46,13 @@ static void start_with_no_config(void){ int speex16_codec_pos=get_codec_position(codecs, "speex", 16000); PayloadType *pt; opus_codec_pos=get_codec_position(codecs, "opus", 48000); - if (opus_codec_pos!=-1) CU_ASSERT_TRUE(opus_codec_pos==0); - CU_ASSERT_TRUE(speex16_codec_poslc,"pcmu",-1); disable_all_audio_codecs_except_one(pauline->lc,"pcmu",-1); - + /*marie set a fantasy number to PCMU*/ linphone_core_set_payload_type_number(marie->lc, linphone_core_find_payload_type(marie->lc, "PCMU", 8000, -1), 104); - - CU_ASSERT_TRUE(call(marie,pauline)); + + BC_ASSERT_TRUE(call(marie,pauline)); pauline_call=linphone_core_get_current_call(pauline->lc); - CU_ASSERT_PTR_NOT_NULL(pauline_call); + BC_ASSERT_PTR_NOT_NULL(pauline_call); if (pauline_call){ LinphoneCallParams *params; check_payload_type_numbers(linphone_core_get_current_call(marie->lc), pauline_call, 104); /*make a reinvite in the other direction*/ - linphone_core_update_call(pauline->lc, pauline_call, + linphone_core_update_call(pauline->lc, pauline_call, params=linphone_core_create_call_params(pauline->lc, pauline_call)); linphone_call_params_unref(params); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallUpdating,1)); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallUpdatedByRemote,1)); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallStreamsRunning,2)); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallStreamsRunning,2)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallUpdating,1)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallUpdatedByRemote,1)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallStreamsRunning,2)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallStreamsRunning,2)); /*payload type numbers shall remain the same*/ check_payload_type_numbers(linphone_core_get_current_call(marie->lc), pauline_call, 104); } @@ -116,7 +116,7 @@ static void simple_call_with_different_codec_mappings(void) { linphone_core_manager_destroy(pauline); leaked_objects=belle_sip_object_get_object_count()-begin; - CU_ASSERT_TRUE(leaked_objects==0); + BC_ASSERT_TRUE(leaked_objects==0); if (leaked_objects>0){ belle_sip_object_dump_active_objects(); } @@ -137,20 +137,20 @@ static void call_failed_because_of_codecs(void) { disable_all_audio_codecs_except_one(pauline->lc,"pcma",-1); out_call = linphone_core_invite_address(pauline->lc,marie->identity); linphone_call_ref(out_call); - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallOutgoingInit,1)); + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallOutgoingInit,1)); /*flexisip will retain the 488 until the "urgent reply" timeout (I.E 5s) arrives.*/ - CU_ASSERT_TRUE(wait_for_until(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallError,1,7000)); - CU_ASSERT_EQUAL(linphone_call_get_reason(out_call),LinphoneReasonNotAcceptable); - CU_ASSERT_EQUAL(marie->stat.number_of_LinphoneCallIncomingReceived,0); - CU_ASSERT_EQUAL(marie->stat.number_of_LinphoneCallReleased,0); + BC_ASSERT_TRUE(wait_for_until(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallError,1,7000)); + BC_ASSERT_EQUAL(linphone_call_get_reason(out_call),LinphoneReasonNotAcceptable, int, "%d"); + BC_ASSERT_EQUAL(marie->stat.number_of_LinphoneCallIncomingReceived,0, int, "%d"); + BC_ASSERT_EQUAL(marie->stat.number_of_LinphoneCallReleased,0, int, "%d"); linphone_call_unref(out_call); linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); } leaked_objects=belle_sip_object_get_object_count()-begin; - CU_ASSERT_TRUE(leaked_objects==0); + BC_ASSERT_TRUE(leaked_objects==0); if (leaked_objects>0){ belle_sip_object_dump_active_objects(); } @@ -194,23 +194,23 @@ static void profile_call_base(bool_t avpf1, LinphoneMediaEncryption srtp1,bool_t } - CU_ASSERT_TRUE(call(marie, pauline)); - CU_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &marie->stat.number_of_LinphoneCallStreamsRunning, 1)); - CU_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &pauline->stat.number_of_LinphoneCallStreamsRunning, 1)); + BC_ASSERT_TRUE(call(marie, pauline)); + BC_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &marie->stat.number_of_LinphoneCallStreamsRunning, 1)); + BC_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &pauline->stat.number_of_LinphoneCallStreamsRunning, 1)); if (linphone_core_get_current_call(marie->lc)) { params = linphone_call_get_current_params(linphone_core_get_current_call(marie->lc)); - CU_ASSERT_STRING_EQUAL(linphone_call_params_get_rtp_profile(params), expected_profile); + BC_ASSERT_STRING_EQUAL(linphone_call_params_get_rtp_profile(params), expected_profile); } if (linphone_core_get_current_call(pauline->lc)) { params = linphone_call_get_current_params(linphone_core_get_current_call(pauline->lc)); - CU_ASSERT_STRING_EQUAL(linphone_call_params_get_rtp_profile(params), expected_profile); + BC_ASSERT_STRING_EQUAL(linphone_call_params_get_rtp_profile(params), expected_profile); } linphone_core_terminate_all_calls(marie->lc); - CU_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &marie->stat.number_of_LinphoneCallEnd, 1)); - CU_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &pauline->stat.number_of_LinphoneCallEnd, 1)); - CU_ASSERT_EQUAL(marie->stat.number_of_LinphoneCallConnected, 1); - CU_ASSERT_EQUAL(pauline->stat.number_of_LinphoneCallConnected, 1); + BC_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &marie->stat.number_of_LinphoneCallEnd, 1)); + BC_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &pauline->stat.number_of_LinphoneCallEnd, 1)); + BC_ASSERT_EQUAL(marie->stat.number_of_LinphoneCallConnected, 1, int, "%d"); + BC_ASSERT_EQUAL(pauline->stat.number_of_LinphoneCallConnected, 1, int, "%d"); end: linphone_core_manager_destroy(pauline); linphone_core_manager_destroy(marie); diff --git a/tester/player_tester.c b/tester/player_tester.c index e72cac9cd..909fdffe9 100644 --- a/tester/player_tester.c +++ b/tester/player_tester.c @@ -39,11 +39,11 @@ static void play_file(const char *filename, bool_t unsupported_format, const cha bool_t eof = FALSE; lc_manager = linphone_core_manager_new("marie_rc"); - CU_ASSERT_PTR_NOT_NULL(lc_manager); + BC_ASSERT_PTR_NOT_NULL(lc_manager); if(lc_manager == NULL) return; player = linphone_core_create_local_player(lc_manager->lc, ms_snd_card_manager_get_default_card(ms_snd_card_manager_get()), video_stream_get_default_video_renderer(), 0); - CU_ASSERT_PTR_NOT_NULL(player); + BC_ASSERT_PTR_NOT_NULL(player); if(player == NULL) goto fail; res = linphone_player_open(player, filename, eof_callback, &eof); @@ -51,17 +51,17 @@ static void play_file(const char *filename, bool_t unsupported_format, const cha || (audio_mime == NULL && video_mime == NULL) || (video_mime == NULL && audio_mime && !ms_filter_codec_supported(audio_mime)) || (audio_mime == NULL && video_mime && !ms_filter_codec_supported(video_mime))) { - CU_ASSERT_EQUAL(res, -1); + BC_ASSERT_EQUAL(res, -1, int, "%d"); } else { - CU_ASSERT_EQUAL(res, 0); + BC_ASSERT_EQUAL(res, 0, int, "%d"); } if(res == -1) goto fail; res = linphone_player_start(player); - CU_ASSERT_EQUAL(res, 0); + BC_ASSERT_EQUAL(res, 0, int, "%d"); if(res == -1) goto fail; - CU_ASSERT_TRUE(wait_for_eof(&eof, &time, 100, 13000)); + BC_ASSERT_TRUE(wait_for_eof(&eof, &time, 100, 13000)); linphone_player_close(player); diff --git a/tester/presence_tester.c b/tester/presence_tester.c index 3b711e52e..ef16102a0 100644 --- a/tester/presence_tester.c +++ b/tester/presence_tester.c @@ -16,8 +16,7 @@ along with this program. If not, see . */ -#include -#include "CUnit/Basic.h" + #include "linphonecore.h" #include "private.h" #include "liblinphone_tester.h" @@ -169,11 +168,11 @@ static bool_t subscribe_to_callee_presence(LinphoneCoreManager* caller_mgr,Linph result&=wait_for(caller_mgr->lc,callee_mgr->lc,&callee_mgr->stat.number_of_LinphonePresenceActivityOnline,initial_callee.number_of_LinphonePresenceActivityOnline+1); */ - CU_ASSERT_EQUAL(callee_mgr->stat.number_of_NewSubscriptionRequest,initial_callee.number_of_NewSubscriptionRequest+1); + BC_ASSERT_EQUAL(callee_mgr->stat.number_of_NewSubscriptionRequest,initial_callee.number_of_NewSubscriptionRequest+1, int, "%d"); /*without proxy, callee cannot subscribe to caller - CU_ASSERT_EQUAL(callee_mgr->stat.number_of_NotifyReceived,initial_callee.number_of_NotifyReceived+1); + BC_ASSERT_EQUAL(callee_mgr->stat.number_of_NotifyReceived,initial_callee.number_of_NotifyReceived+1, int, "%d"); */ - CU_ASSERT_EQUAL(caller_mgr->stat.number_of_NotifyReceived,initial_caller.number_of_NotifyReceived+1); + BC_ASSERT_EQUAL(caller_mgr->stat.number_of_NotifyReceived,initial_caller.number_of_NotifyReceived+1, int, "%d"); ms_free(identity); return result; @@ -187,27 +186,27 @@ static void subscribe_failure_handle_by_app(void) { char* lf_identity=linphone_address_as_string_uri_only(pauline->identity); linphone_core_get_default_proxy(marie->lc,&config); - CU_ASSERT_TRUE(subscribe_to_callee_presence(marie,pauline)); + BC_ASSERT_TRUE(subscribe_to_callee_presence(marie,pauline)); wait_for(marie->lc,pauline->lc,&pauline->stat.number_of_NewSubscriptionRequest,1); /*just to wait for unsubscription even if not notified*/ sal_set_recv_error(marie->lc->sal, 0); /*simulate an error*/ - CU_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&marie->stat.number_of_LinphoneRegistrationProgress,2)); - CU_ASSERT_EQUAL(linphone_proxy_config_get_error(config),LinphoneReasonIOError); + BC_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&marie->stat.number_of_LinphoneRegistrationProgress,2)); + BC_ASSERT_EQUAL(linphone_proxy_config_get_error(config),LinphoneReasonIOError, int, "%d"); sal_set_recv_error(marie->lc->sal, 1); lf = linphone_core_get_friend_by_address(marie->lc,lf_identity); linphone_friend_edit(lf); linphone_friend_enable_subscribes(lf,FALSE); /*disable subscription*/ linphone_friend_done(lf); - CU_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&marie->stat.number_of_LinphoneRegistrationOk,2)); /*wait for register ok*/ + BC_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&marie->stat.number_of_LinphoneRegistrationOk,2)); /*wait for register ok*/ linphone_friend_edit(lf); linphone_friend_enable_subscribes(lf,TRUE); linphone_friend_done(lf); - CU_ASSERT_FALSE(wait_for(marie->lc,pauline->lc,&pauline->stat.number_of_NewSubscriptionRequest,2)); /*just to wait for unsubscription even if not notified*/ + BC_ASSERT_FALSE(wait_for(marie->lc,pauline->lc,&pauline->stat.number_of_NewSubscriptionRequest,2)); /*just to wait for unsubscription even if not notified*/ linphone_core_manager_destroy(marie); - CU_ASSERT_FALSE(wait_for(NULL,pauline->lc,&pauline->stat.number_of_NewSubscriptionRequest,3)); /*just to wait for unsubscription even if not notified*/ + BC_ASSERT_FALSE(wait_for(NULL,pauline->lc,&pauline->stat.number_of_NewSubscriptionRequest,3)); /*just to wait for unsubscription even if not notified*/ linphone_core_manager_destroy(pauline); } @@ -216,12 +215,12 @@ static void simple_subscribe(void) { LinphoneCoreManager* marie = presence_linphone_core_manager_new("marie"); LinphoneCoreManager* pauline = presence_linphone_core_manager_new("pauline"); - CU_ASSERT_TRUE(subscribe_to_callee_presence(marie,pauline)); + BC_ASSERT_TRUE(subscribe_to_callee_presence(marie,pauline)); linphone_core_manager_destroy(marie); /*unsubscribe is not reported ?*/ - CU_ASSERT_FALSE(wait_for(NULL,pauline->lc,&pauline->stat.number_of_NewSubscriptionRequest,2)); /*just to wait for unsubscription even if not notified*/ + BC_ASSERT_FALSE(wait_for(NULL,pauline->lc,&pauline->stat.number_of_NewSubscriptionRequest,2)); /*just to wait for unsubscription even if not notified*/ linphone_core_manager_destroy(pauline); } @@ -244,18 +243,18 @@ static void call_with_presence(void) { LinphoneCoreManager* pauline = presence_linphone_core_manager_new("pauline"); LinphoneVideoPolicy pol={0}; linphone_core_set_video_policy(marie->lc,&pol); - CU_ASSERT_TRUE(subscribe_to_callee_presence(marie,pauline)); - CU_ASSERT_TRUE(subscribe_to_callee_presence(pauline,marie)); + BC_ASSERT_TRUE(subscribe_to_callee_presence(marie,pauline)); + BC_ASSERT_TRUE(subscribe_to_callee_presence(pauline,marie)); - CU_ASSERT_TRUE(call(marie,pauline)); - CU_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&marie->stat.number_of_LinphonePresenceActivityOnThePhone,1)); - CU_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&pauline->stat.number_of_LinphonePresenceActivityOnThePhone,1)); + BC_ASSERT_TRUE(call(marie,pauline)); + BC_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&marie->stat.number_of_LinphonePresenceActivityOnThePhone,1)); + BC_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&pauline->stat.number_of_LinphonePresenceActivityOnThePhone,1)); reset_counters(&marie->stat); reset_counters(&pauline->stat); linphone_core_terminate_all_calls(marie->lc); - CU_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&pauline->stat.number_of_LinphonePresenceActivityOnline,1)); - CU_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&marie->stat.number_of_LinphonePresenceActivityOnline,1)); + BC_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&pauline->stat.number_of_LinphonePresenceActivityOnline,1)); + BC_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&marie->stat.number_of_LinphonePresenceActivityOnline,1)); linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); } @@ -277,48 +276,48 @@ static void presence_information(void) { char *contact2; time_t current_timestamp, presence_timestamp; - CU_ASSERT_TRUE(subscribe_to_callee_presence(marie, pauline)); + BC_ASSERT_TRUE(subscribe_to_callee_presence(marie, pauline)); /* Presence activity without description. */ presence = linphone_presence_model_new_with_activity(LinphonePresenceActivityDinner, NULL); linphone_core_set_presence_model(pauline->lc, presence); wait_for(marie->lc,pauline->lc,&marie->stat.number_of_LinphonePresenceActivityDinner,1); - CU_ASSERT_EQUAL(marie->stat.number_of_LinphonePresenceActivityDinner, 1); + BC_ASSERT_EQUAL(marie->stat.number_of_LinphonePresenceActivityDinner, 1, int, "%d"); activity = linphone_presence_model_get_activity(marie->stat.last_received_presence); - CU_ASSERT_PTR_NOT_NULL(activity); - CU_ASSERT_EQUAL(linphone_presence_activity_get_type(activity), LinphonePresenceActivityDinner); + BC_ASSERT_PTR_NOT_NULL(activity); + BC_ASSERT_EQUAL(linphone_presence_activity_get_type(activity), LinphonePresenceActivityDinner, int, "%d"); description = linphone_presence_activity_get_description(activity); - CU_ASSERT_PTR_NULL(description); + BC_ASSERT_PTR_NULL(description); /* Presence activity with description. */ presence = linphone_presence_model_new_with_activity(LinphonePresenceActivitySteering, bike_description); linphone_core_set_presence_model(pauline->lc, presence); wait_for(marie->lc,pauline->lc,&marie->stat.number_of_LinphonePresenceActivitySteering,1); - CU_ASSERT_EQUAL(marie->stat.number_of_LinphonePresenceActivitySteering, 1); + BC_ASSERT_EQUAL(marie->stat.number_of_LinphonePresenceActivitySteering, 1, int, "%d"); activity = linphone_presence_model_get_activity(marie->stat.last_received_presence); - CU_ASSERT_PTR_NOT_NULL(activity); - CU_ASSERT_EQUAL(linphone_presence_activity_get_type(activity), LinphonePresenceActivitySteering); + BC_ASSERT_PTR_NOT_NULL(activity); + BC_ASSERT_EQUAL(linphone_presence_activity_get_type(activity), LinphonePresenceActivitySteering, int, "%d"); description = linphone_presence_activity_get_description(activity); - CU_ASSERT_PTR_NOT_NULL(description); - if (description != NULL) CU_ASSERT_EQUAL(strcmp(description, bike_description), 0); + BC_ASSERT_PTR_NOT_NULL(description); + if (description != NULL) BC_ASSERT_EQUAL(strcmp(description, bike_description), 0, int, "%d"); /* Presence activity with description and note. */ presence = linphone_presence_model_new_with_activity_and_note(LinphonePresenceActivityVacation, NULL, vacation_note, vacation_lang); linphone_core_set_presence_model(pauline->lc, presence); wait_for(marie->lc,pauline->lc,&marie->stat.number_of_LinphonePresenceActivityVacation,1); - CU_ASSERT_EQUAL(marie->stat.number_of_LinphonePresenceActivityVacation, 1); + BC_ASSERT_EQUAL(marie->stat.number_of_LinphonePresenceActivityVacation, 1, int, "%d"); activity = linphone_presence_model_get_activity(marie->stat.last_received_presence); - CU_ASSERT_PTR_NOT_NULL(activity); - CU_ASSERT_EQUAL(linphone_presence_activity_get_type(activity), LinphonePresenceActivityVacation); + BC_ASSERT_PTR_NOT_NULL(activity); + BC_ASSERT_EQUAL(linphone_presence_activity_get_type(activity), LinphonePresenceActivityVacation, int, "%d"); description = linphone_presence_activity_get_description(activity); - CU_ASSERT_PTR_NULL(description); + BC_ASSERT_PTR_NULL(description); note = linphone_presence_model_get_note(marie->stat.last_received_presence, NULL); - CU_ASSERT_PTR_NOT_NULL(note); + BC_ASSERT_PTR_NOT_NULL(note); if (note != NULL) { note_content = linphone_presence_note_get_content(note); - CU_ASSERT_PTR_NOT_NULL(note_content); + BC_ASSERT_PTR_NOT_NULL(note_content); if (note_content != NULL) { - CU_ASSERT_EQUAL(strcmp(note_content, vacation_note), 0); + BC_ASSERT_EQUAL(strcmp(note_content, vacation_note), 0, int, "%d"); } } @@ -327,11 +326,11 @@ static void presence_information(void) { linphone_presence_model_set_contact(presence, contact); linphone_core_set_presence_model(pauline->lc, presence); wait_for(marie->lc,pauline->lc,&marie->stat.number_of_LinphonePresenceActivityOnThePhone,1); - CU_ASSERT_EQUAL(marie->stat.number_of_LinphonePresenceActivityOnThePhone, 1); + BC_ASSERT_EQUAL(marie->stat.number_of_LinphonePresenceActivityOnThePhone, 1, int, "%d"); contact2 = linphone_presence_model_get_contact(presence); - CU_ASSERT_PTR_NOT_NULL(contact2); + BC_ASSERT_PTR_NOT_NULL(contact2); if (contact2 != NULL) { - CU_ASSERT_EQUAL(strcmp(contact, contact2), 0); + BC_ASSERT_EQUAL(strcmp(contact, contact2), 0, int, "%d"); ms_free(contact2); } @@ -340,9 +339,9 @@ static void presence_information(void) { presence = linphone_presence_model_new_with_activity(LinphonePresenceActivityShopping, NULL); linphone_core_set_presence_model(pauline->lc, presence); wait_for(marie->lc,pauline->lc,&marie->stat.number_of_LinphonePresenceActivityShopping,1); - CU_ASSERT_EQUAL(marie->stat.number_of_LinphonePresenceActivityShopping, 1); + BC_ASSERT_EQUAL(marie->stat.number_of_LinphonePresenceActivityShopping, 1, int, "%d"); presence_timestamp = linphone_presence_model_get_timestamp(presence); - CU_ASSERT_TRUE(presence_timestamp >= current_timestamp); + BC_ASSERT_TRUE(presence_timestamp >= current_timestamp); linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); @@ -367,7 +366,7 @@ static void test_subscribe_notify_publish(void) { /*wait for subscribe acknowledgment*/ wait_for_until(pauline->lc,marie->lc,&pauline->stat.number_of_NotifyReceived,1,2000); - CU_ASSERT_EQUAL(LinphoneStatusOffline,linphone_friend_get_status(lf)); + BC_ASSERT_EQUAL(LinphoneStatusOffline,linphone_friend_get_status(lf), int, "%d"); /*enable publish*/ @@ -380,23 +379,23 @@ static void test_subscribe_notify_publish(void) { /*wait for marie status*/ wait_for_until(pauline->lc,marie->lc,&pauline->stat.number_of_NotifyReceived,2,2000); - CU_ASSERT_EQUAL(LinphoneStatusOnline,linphone_friend_get_status(lf)); + BC_ASSERT_EQUAL(LinphoneStatusOnline,linphone_friend_get_status(lf), int, "%d"); presence =linphone_presence_model_new_with_activity(LinphonePresenceActivityBusy,NULL); linphone_core_set_presence_model(marie->lc,presence); /*wait for new status*/ wait_for_until(pauline->lc,marie->lc,&pauline->stat.number_of_NotifyReceived,3,2000); - CU_ASSERT_EQUAL(LinphoneStatusBusy,linphone_friend_get_status(lf)); + BC_ASSERT_EQUAL(LinphoneStatusBusy,linphone_friend_get_status(lf), int, "%d"); /*wait for refresh*/ wait_for_until(pauline->lc,marie->lc,&pauline->stat.number_of_NotifyReceived,4,5000); - CU_ASSERT_EQUAL(LinphoneStatusBusy,linphone_friend_get_status(lf)); + BC_ASSERT_EQUAL(LinphoneStatusBusy,linphone_friend_get_status(lf), int, "%d"); /*linphone_core_remove_friend(pauline->lc,lf);*/ /*wait for final notify*/ /*wait_for_until(pauline->lc,marie->lc,&pauline->stat.number_of_NotifyReceived,4,5000); - CU_ASSERT_EQUAL(LinphonePresenceActivityOffline,linphone_friend_get_status(lf)); + BC_ASSERT_EQUAL(LinphonePresenceActivityOffline,linphone_friend_get_status(lf), int, "%d"); */ linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); @@ -426,7 +425,7 @@ static void test_forked_subscribe_notify_publish(void) { /*wait for subscribe acknowledgment*/ wait_for_list(lcs,&pauline->stat.number_of_NotifyReceived,1,2000); - CU_ASSERT_EQUAL(LinphoneStatusOffline,linphone_friend_get_status(lf)); + BC_ASSERT_EQUAL(LinphoneStatusOffline,linphone_friend_get_status(lf), int, "%d"); /*enable publish*/ @@ -445,21 +444,21 @@ static void test_forked_subscribe_notify_publish(void) { /*wait for marie status*/ wait_for_list(lcs,&pauline->stat.number_of_NotifyReceived,3,2000); - CU_ASSERT_EQUAL(LinphoneStatusOnline,linphone_friend_get_status(lf)); + BC_ASSERT_EQUAL(LinphoneStatusOnline,linphone_friend_get_status(lf), int, "%d"); presence =linphone_presence_model_new_with_activity(LinphonePresenceActivityBusy,NULL); linphone_core_set_presence_model(marie->lc,presence); /*wait for new status*/ wait_for_list(lcs,&pauline->stat.number_of_NotifyReceived,4,2000); - CU_ASSERT_EQUAL(LinphoneStatusBusy,linphone_friend_get_status(lf)); + BC_ASSERT_EQUAL(LinphoneStatusBusy,linphone_friend_get_status(lf), int, "%d"); presence =linphone_presence_model_new_with_activity( LinphonePresenceActivityMeeting,NULL); linphone_core_set_presence_model(marie2->lc,presence); /*wait for new status*/ wait_for_list(lcs,&pauline->stat.number_of_NotifyReceived,5,2000); - CU_ASSERT_EQUAL(LinphoneStatusBusy,linphone_friend_get_status(lf)); /*because liblinphone compositor is very simple for now (I.E only take first occurence)*/ + BC_ASSERT_EQUAL(LinphoneStatusBusy,linphone_friend_get_status(lf), int, "%d"); /*because liblinphone compositor is very simple for now (I.E only take first occurence)*/ linphone_core_manager_destroy(marie); linphone_core_manager_destroy(marie2); diff --git a/tester/quality_reporting_tester.c b/tester/quality_reporting_tester.c index ca8f563e1..e5c97b8ee 100644 --- a/tester/quality_reporting_tester.c +++ b/tester/quality_reporting_tester.c @@ -34,59 +34,59 @@ void on_report_send_mandatory(const LinphoneCall *call, int stream_type, const L }else{ ms = (MediaStream*)call->videostream; } - CU_ASSERT_TRUE( + BC_ASSERT_TRUE( __strstr(body, "VQIntervalReport\r\n") == body || __strstr(body, "VQSessionReport\r\n") == body || __strstr(body, "VQSessionReport: CallTerm\r\n") == body ); - CU_ASSERT_PTR_NOT_NULL(body=__strstr(body, "CallID:")); - CU_ASSERT_PTR_NOT_NULL(body=__strstr(body, "LocalID:")); - CU_ASSERT_PTR_NOT_NULL(body=__strstr(body, "RemoteID:")); - CU_ASSERT_PTR_NOT_NULL(body=__strstr(body, "OrigID:")); - CU_ASSERT_PTR_NOT_NULL(body=__strstr(body, "LocalGroup:")); - CU_ASSERT_PTR_NOT_NULL(body=__strstr(body, "RemoteGroup:")); - CU_ASSERT_PTR_NOT_NULL(body=__strstr(body, "LocalAddr:")); - CU_ASSERT_PTR_NOT_NULL(body=__strstr(body, "IP=")); - CU_ASSERT_PTR_NOT_NULL(body=__strstr(body, "PORT=")); - CU_ASSERT_PTR_NOT_NULL(body=__strstr(body, "SSRC=")); - CU_ASSERT_PTR_NOT_NULL(body=__strstr(body, "RemoteAddr:")); - CU_ASSERT_PTR_NOT_NULL(body=__strstr(body, "IP=")); - CU_ASSERT_PTR_NOT_NULL(body=__strstr(body, "PORT=")); - CU_ASSERT_PTR_NOT_NULL(body=__strstr(body, "SSRC=")); - CU_ASSERT_PTR_NOT_NULL(body=__strstr(body, "LocalMetrics:")); - CU_ASSERT_PTR_NOT_NULL(body=__strstr(body, "Timestamps:")); - CU_ASSERT_PTR_NOT_NULL(body=__strstr(body, "START=")); - CU_ASSERT_PTR_NOT_NULL(body=__strstr(body, "STOP=")); + BC_ASSERT_PTR_NOT_NULL(body=__strstr(body, "CallID:")); + BC_ASSERT_PTR_NOT_NULL(body=__strstr(body, "LocalID:")); + BC_ASSERT_PTR_NOT_NULL(body=__strstr(body, "RemoteID:")); + BC_ASSERT_PTR_NOT_NULL(body=__strstr(body, "OrigID:")); + BC_ASSERT_PTR_NOT_NULL(body=__strstr(body, "LocalGroup:")); + BC_ASSERT_PTR_NOT_NULL(body=__strstr(body, "RemoteGroup:")); + BC_ASSERT_PTR_NOT_NULL(body=__strstr(body, "LocalAddr:")); + BC_ASSERT_PTR_NOT_NULL(body=__strstr(body, "IP=")); + BC_ASSERT_PTR_NOT_NULL(body=__strstr(body, "PORT=")); + BC_ASSERT_PTR_NOT_NULL(body=__strstr(body, "SSRC=")); + BC_ASSERT_PTR_NOT_NULL(body=__strstr(body, "RemoteAddr:")); + BC_ASSERT_PTR_NOT_NULL(body=__strstr(body, "IP=")); + BC_ASSERT_PTR_NOT_NULL(body=__strstr(body, "PORT=")); + BC_ASSERT_PTR_NOT_NULL(body=__strstr(body, "SSRC=")); + BC_ASSERT_PTR_NOT_NULL(body=__strstr(body, "LocalMetrics:")); + BC_ASSERT_PTR_NOT_NULL(body=__strstr(body, "Timestamps:")); + BC_ASSERT_PTR_NOT_NULL(body=__strstr(body, "START=")); + BC_ASSERT_PTR_NOT_NULL(body=__strstr(body, "STOP=")); - CU_ASSERT_PTR_NOT_NULL(body=__strstr(body, "SessionDesc:")); - CU_ASSERT_PTR_NOT_NULL(body=__strstr(body, "PT=")); - CU_ASSERT_PTR_NOT_NULL(body=__strstr(body, "PD=")); - CU_ASSERT_PTR_NOT_NULL(body=__strstr(body, "SR=")); + BC_ASSERT_PTR_NOT_NULL(body=__strstr(body, "SessionDesc:")); + BC_ASSERT_PTR_NOT_NULL(body=__strstr(body, "PT=")); + BC_ASSERT_PTR_NOT_NULL(body=__strstr(body, "PD=")); + BC_ASSERT_PTR_NOT_NULL(body=__strstr(body, "SR=")); /* We should have not reached RemoteMetrics section yet */ - CU_ASSERT_TRUE(!remote_metrics_start || body < remote_metrics_start); + BC_ASSERT_TRUE(!remote_metrics_start || body < remote_metrics_start); - CU_ASSERT_PTR_NOT_NULL(body=__strstr(body, "DialogID:")); + BC_ASSERT_PTR_NOT_NULL(body=__strstr(body, "DialogID:")); if (report->remote_metrics.rtcp_sr_count&&ms!=NULL&&ms->rc!=NULL){ /* Hack: reset rtcp_sr_count to 0 because in case of interval reports, we need one RTCP SR by interval */ report->remote_metrics.rtcp_sr_count=0; - CU_ASSERT_PTR_NOT_NULL(body=__strstr(body, "AdaptiveAlg:")); + BC_ASSERT_PTR_NOT_NULL(body=__strstr(body, "AdaptiveAlg:")); } } char * on_report_send_verify_metrics(const reporting_content_metrics_t *metrics, char * body){ if (metrics->rtcp_xr_count){ - CU_ASSERT_PTR_NOT_NULL(body=__strstr(body, "SessionDesc:")); - CU_ASSERT_PTR_NOT_NULL(body=__strstr(body, "JitterBuffer:")); - CU_ASSERT_PTR_NOT_NULL(body=__strstr(body, "PacketLoss:")); + BC_ASSERT_PTR_NOT_NULL(body=__strstr(body, "SessionDesc:")); + BC_ASSERT_PTR_NOT_NULL(body=__strstr(body, "JitterBuffer:")); + BC_ASSERT_PTR_NOT_NULL(body=__strstr(body, "PacketLoss:")); } if (metrics->rtcp_sr_count+metrics->rtcp_xr_count>0){ - CU_ASSERT_PTR_NOT_NULL(body=__strstr(body, "Delay:")); + BC_ASSERT_PTR_NOT_NULL(body=__strstr(body, "Delay:")); } if (metrics->rtcp_xr_count){ - CU_ASSERT_PTR_NOT_NULL(body=__strstr(body, "QualityEst:")); + BC_ASSERT_PTR_NOT_NULL(body=__strstr(body, "QualityEst:")); } return body; @@ -97,8 +97,8 @@ void on_report_send_with_rtcp_xr_local(const LinphoneCall *call, int stream_type char * remote_metrics_start = __strstr(body, "RemoteMetrics:"); reporting_session_report_t * report = call->log->reporting.reports[stream_type]; on_report_send_mandatory(call,stream_type,content); - CU_ASSERT_PTR_NOT_NULL(body=__strstr(body, "LocalMetrics:")); - CU_ASSERT_TRUE(!remote_metrics_start || on_report_send_verify_metrics(&report->local_metrics,body) < remote_metrics_start); + BC_ASSERT_PTR_NOT_NULL(body=__strstr(body, "LocalMetrics:")); + BC_ASSERT_TRUE(!remote_metrics_start || on_report_send_verify_metrics(&report->local_metrics,body) < remote_metrics_start); } void on_report_send_with_rtcp_xr_remote(const LinphoneCall *call, int stream_type, const LinphoneContent *content){ char * body = (char*)linphone_content_get_buffer(content); @@ -106,8 +106,8 @@ void on_report_send_with_rtcp_xr_remote(const LinphoneCall *call, int stream_typ on_report_send_mandatory(call,stream_type,content); if (report->remote_metrics.rtcp_sr_count+report->remote_metrics.rtcp_xr_count>0){ - CU_ASSERT_PTR_NOT_NULL(body=__strstr(body, "RemoteMetrics:")); - CU_ASSERT_PTR_NOT_NULL(body=__strstr(body, "Timestamps:")); + BC_ASSERT_PTR_NOT_NULL(body=__strstr(body, "RemoteMetrics:")); + BC_ASSERT_PTR_NOT_NULL(body=__strstr(body, "Timestamps:")); on_report_send_verify_metrics(&report->remote_metrics,body); } } @@ -127,15 +127,15 @@ bool_t create_call_for_quality_reporting_tests( bool_t call_succeeded = call_with_params(marie,pauline,params_marie,params_pauline); - CU_ASSERT_TRUE(call_succeeded); + BC_ASSERT_TRUE(call_succeeded); if (call_succeeded) { if (call_marie) { *call_marie = linphone_core_get_current_call(marie->lc); - CU_ASSERT_PTR_NOT_NULL(*call_marie); + BC_ASSERT_PTR_NOT_NULL(*call_marie); } if (call_pauline) { *call_pauline = linphone_core_get_current_call(pauline->lc); - CU_ASSERT_PTR_NOT_NULL(*call_pauline); + BC_ASSERT_PTR_NOT_NULL(*call_pauline); } } return call_succeeded; @@ -149,17 +149,17 @@ static void quality_reporting_not_used_without_config() { if (create_call_for_quality_reporting_tests(marie, pauline, &call_marie, &call_pauline, NULL, NULL)) { // marie has stats collection enabled but pauline has not - CU_ASSERT_TRUE(linphone_proxy_config_quality_reporting_enabled(call_marie->dest_proxy)); - CU_ASSERT_FALSE(linphone_proxy_config_quality_reporting_enabled(call_pauline->dest_proxy)); + BC_ASSERT_TRUE(linphone_proxy_config_quality_reporting_enabled(call_marie->dest_proxy)); + BC_ASSERT_FALSE(linphone_proxy_config_quality_reporting_enabled(call_pauline->dest_proxy)); - CU_ASSERT_EQUAL(strcmp("sip:collector@sip.example.org", - linphone_proxy_config_get_quality_reporting_collector(call_marie->dest_proxy)), 0); + BC_ASSERT_STRING_EQUAL(linphone_proxy_config_get_quality_reporting_collector(call_marie->dest_proxy), + "sip:collector@sip.example.org"); // this field should be already filled - CU_ASSERT_PTR_NOT_NULL(call_marie->log->reporting.reports[0]->info.local_addr.ip); + BC_ASSERT_PTR_NOT_NULL(call_marie->log->reporting.reports[0]->info.local_addr.ip); // but not this one since it is updated at the end of call - CU_ASSERT_PTR_NULL(call_marie->log->reporting.reports[0]->dialog_id); + BC_ASSERT_PTR_NULL(call_marie->log->reporting.reports[0]->dialog_id); } linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); @@ -175,13 +175,13 @@ static void quality_reporting_not_sent_if_call_not_started() { out_call = linphone_core_invite(marie->lc,"pauline"); linphone_call_ref(out_call); - CU_ASSERT_TRUE(wait_for_until(marie->lc,pauline->lc,&marie->stat.number_of_LinphoneCallError,1, 10000)); - CU_ASSERT_EQUAL(marie->stat.number_of_LinphoneCallError,1); + BC_ASSERT_TRUE(wait_for_until(marie->lc,pauline->lc,&marie->stat.number_of_LinphoneCallError,1, 10000)); + BC_ASSERT_EQUAL(marie->stat.number_of_LinphoneCallError,1, int, "%d"); if (ms_list_size(linphone_core_get_call_logs(marie->lc))>0) { out_call_log=(LinphoneCallLog*)(linphone_core_get_call_logs(marie->lc)->data); - CU_ASSERT_PTR_NOT_NULL(out_call_log); - CU_ASSERT_EQUAL(linphone_call_log_get_status(out_call_log),LinphoneCallAborted); + BC_ASSERT_PTR_NOT_NULL(out_call_log); + BC_ASSERT_EQUAL(linphone_call_log_get_status(out_call_log),LinphoneCallAborted, int, "%d"); } linphone_call_unref(out_call); @@ -189,8 +189,8 @@ static void quality_reporting_not_sent_if_call_not_started() { wait_for_until(marie->lc,NULL,NULL,0,1000); // since the callee was busy, there should be no publish to do - CU_ASSERT_EQUAL(marie->stat.number_of_LinphonePublishProgress,0); - CU_ASSERT_EQUAL(marie->stat.number_of_LinphonePublishOk,0); + BC_ASSERT_EQUAL(marie->stat.number_of_LinphonePublishProgress,0, int, "%d"); + BC_ASSERT_EQUAL(marie->stat.number_of_LinphonePublishOk,0, int, "%d"); linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); @@ -207,8 +207,8 @@ static void quality_reporting_not_sent_if_low_bandwidth() { if (create_call_for_quality_reporting_tests(marie, pauline, NULL, NULL, marie_params, NULL)) { linphone_core_terminate_all_calls(marie->lc); - CU_ASSERT_EQUAL(marie->stat.number_of_LinphonePublishProgress,0); - CU_ASSERT_EQUAL(marie->stat.number_of_LinphonePublishOk,0); + BC_ASSERT_EQUAL(marie->stat.number_of_LinphonePublishProgress,0, int, "%d"); + BC_ASSERT_EQUAL(marie->stat.number_of_LinphonePublishOk,0, int, "%d"); } linphone_call_params_destroy(marie_params); linphone_core_manager_destroy(marie); @@ -232,9 +232,9 @@ static void quality_reporting_invalid_report() { linphone_core_terminate_all_calls(marie->lc); - CU_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&marie->stat.number_of_LinphonePublishProgress,1)); - CU_ASSERT_TRUE(wait_for_until(marie->lc,pauline->lc,&marie->stat.number_of_LinphonePublishError,1,3000)); - CU_ASSERT_EQUAL(marie->stat.number_of_LinphonePublishOk,0); + BC_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&marie->stat.number_of_LinphonePublishProgress,1)); + BC_ASSERT_TRUE(wait_for_until(marie->lc,pauline->lc,&marie->stat.number_of_LinphonePublishError,1,3000)); + BC_ASSERT_EQUAL(marie->stat.number_of_LinphonePublishOk,0, int, "%d"); } linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); @@ -252,17 +252,17 @@ static void quality_reporting_at_call_termination() { linphone_core_terminate_all_calls(marie->lc); // now dialog id should be filled - CU_ASSERT_PTR_NOT_NULL(call_marie->log->reporting.reports[0]->dialog_id); + BC_ASSERT_PTR_NOT_NULL(call_marie->log->reporting.reports[0]->dialog_id); - CU_ASSERT_TRUE(wait_for_until(marie->lc,pauline->lc,&marie->stat.number_of_LinphoneCallReleased,1, 10000)); - CU_ASSERT_TRUE(wait_for_until(pauline->lc,NULL,&pauline->stat.number_of_LinphoneCallReleased,1, 10000)); + BC_ASSERT_TRUE(wait_for_until(marie->lc,pauline->lc,&marie->stat.number_of_LinphoneCallReleased,1, 10000)); + BC_ASSERT_TRUE(wait_for_until(pauline->lc,NULL,&pauline->stat.number_of_LinphoneCallReleased,1, 10000)); - CU_ASSERT_PTR_NULL(linphone_core_get_current_call(marie->lc)); - CU_ASSERT_PTR_NULL(linphone_core_get_current_call(pauline->lc)); + BC_ASSERT_PTR_NULL(linphone_core_get_current_call(marie->lc)); + BC_ASSERT_PTR_NULL(linphone_core_get_current_call(pauline->lc)); // PUBLISH submission to the collector should be ok - CU_ASSERT_TRUE(wait_for(marie->lc,NULL,&marie->stat.number_of_LinphonePublishProgress,1)); - CU_ASSERT_TRUE(wait_for(marie->lc,NULL,&marie->stat.number_of_LinphonePublishOk,1)); + BC_ASSERT_TRUE(wait_for(marie->lc,NULL,&marie->stat.number_of_LinphonePublishProgress,1)); + BC_ASSERT_TRUE(wait_for(marie->lc,NULL,&marie->stat.number_of_LinphonePublishOk,1)); } linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); @@ -278,12 +278,12 @@ static void quality_reporting_interval_report() { linphone_reporting_set_on_report_send(call_marie, on_report_send_mandatory); linphone_proxy_config_set_quality_reporting_interval(call_marie->dest_proxy, 10); - CU_ASSERT_PTR_NOT_NULL(linphone_core_get_current_call(marie->lc)); - CU_ASSERT_PTR_NOT_NULL(linphone_core_get_current_call(pauline->lc)); + BC_ASSERT_PTR_NOT_NULL(linphone_core_get_current_call(marie->lc)); + BC_ASSERT_PTR_NOT_NULL(linphone_core_get_current_call(pauline->lc)); // PUBLISH submission to the collector should be ok - CU_ASSERT_TRUE(wait_for_until(marie->lc,pauline->lc,&marie->stat.number_of_LinphonePublishProgress,3,60000)); - CU_ASSERT_TRUE(wait_for_until(marie->lc,pauline->lc,&marie->stat.number_of_LinphonePublishOk,3,60000)); + BC_ASSERT_TRUE(wait_for_until(marie->lc,pauline->lc,&marie->stat.number_of_LinphonePublishProgress,3,60000)); + BC_ASSERT_TRUE(wait_for_until(marie->lc,pauline->lc,&marie->stat.number_of_LinphonePublishOk,3,60000)); } linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); @@ -309,25 +309,25 @@ static void quality_reporting_session_report_if_video_stopped() { if (create_call_for_quality_reporting_tests(marie, pauline, &call_marie, &call_pauline, marie_params, pauline_params)) { linphone_reporting_set_on_report_send(call_marie, on_report_send_with_rtcp_xr_local); - CU_ASSERT_EQUAL(marie->stat.number_of_LinphonePublishProgress,0); - CU_ASSERT_EQUAL(marie->stat.number_of_LinphonePublishOk,0); + BC_ASSERT_EQUAL(marie->stat.number_of_LinphonePublishProgress,0, int, "%d"); + BC_ASSERT_EQUAL(marie->stat.number_of_LinphonePublishOk,0, int, "%d"); - CU_ASSERT_TRUE(wait_for_until(marie->lc,pauline->lc,NULL,0,3000)); - CU_ASSERT_TRUE(linphone_call_params_video_enabled(linphone_call_get_current_params(call_pauline))); + BC_ASSERT_TRUE(wait_for_until(marie->lc,pauline->lc,NULL,0,3000)); + BC_ASSERT_TRUE(linphone_call_params_video_enabled(linphone_call_get_current_params(call_pauline))); /*remove video*/ linphone_call_params_enable_video(pauline_params,FALSE); linphone_core_update_call(pauline->lc,call_pauline,pauline_params); - CU_ASSERT_TRUE(wait_for_until(marie->lc,pauline->lc,&marie->stat.number_of_LinphonePublishProgress,1,5000)); - CU_ASSERT_TRUE(wait_for_until(marie->lc,pauline->lc,&marie->stat.number_of_LinphonePublishOk,1,5000)); + BC_ASSERT_TRUE(wait_for_until(marie->lc,pauline->lc,&marie->stat.number_of_LinphonePublishProgress,1,5000)); + BC_ASSERT_TRUE(wait_for_until(marie->lc,pauline->lc,&marie->stat.number_of_LinphonePublishOk,1,5000)); - CU_ASSERT_FALSE(linphone_call_params_video_enabled(linphone_call_get_current_params(call_pauline))); + BC_ASSERT_FALSE(linphone_call_params_video_enabled(linphone_call_get_current_params(call_pauline))); linphone_core_terminate_all_calls(marie->lc); - CU_ASSERT_TRUE(wait_for_until(marie->lc,pauline->lc,&marie->stat.number_of_LinphonePublishProgress,2,5000)); - CU_ASSERT_TRUE(wait_for_until(marie->lc,pauline->lc,&marie->stat.number_of_LinphonePublishOk,2,5000)); + BC_ASSERT_TRUE(wait_for_until(marie->lc,pauline->lc,&marie->stat.number_of_LinphonePublishProgress,2,5000)); + BC_ASSERT_TRUE(wait_for_until(marie->lc,pauline->lc,&marie->stat.number_of_LinphonePublishOk,2,5000)); } linphone_call_params_destroy(marie_params); linphone_call_params_destroy(pauline_params); diff --git a/tester/register_tester.c b/tester/register_tester.c index ee945f0da..5f13243cc 100644 --- a/tester/register_tester.c +++ b/tester/register_tester.c @@ -16,8 +16,7 @@ along with this program. If not, see . */ -#include -#include "CUnit/Basic.h" + #include "linphonecore.h" #include "private.h" #include "liblinphone_tester.h" @@ -64,7 +63,7 @@ void registration_state_changed(struct _LinphoneCore *lc, LinphoneProxyConfig *c case LinphoneRegistrationCleared:counters->number_of_LinphoneRegistrationCleared++;break; case LinphoneRegistrationFailed:counters->number_of_LinphoneRegistrationFailed++;break; default: - CU_FAIL("unexpected event");break; + BC_FAIL("unexpected event");break; } } @@ -84,7 +83,7 @@ static void register_with_refresh_base_3(LinphoneCore* lc const char* server_addr; LinphoneAuthInfo *info; - CU_ASSERT_PTR_NOT_NULL(lc); + BC_ASSERT_PTR_NOT_NULL(lc); if (!lc) return; counters = get_stats(lc); reset_counters(counters); @@ -116,7 +115,7 @@ static void register_with_refresh_base_3(LinphoneCore* lc linphone_core_iterate(lc); if (counters->number_of_auth_info_requested>0 && linphone_proxy_config_get_state(proxy_cfg) == LinphoneRegistrationFailed && late_auth_info) { if (!linphone_core_get_auth_info_list(lc)) { - CU_ASSERT_EQUAL(linphone_proxy_config_get_error(proxy_cfg),LinphoneReasonUnauthorized); + BC_ASSERT_EQUAL(linphone_proxy_config_get_error(proxy_cfg),LinphoneReasonUnauthorized, int, "%d"); info=linphone_auth_info_new(test_username,NULL,test_password,NULL,auth_domain,NULL); /*create authentication structure from identity*/ linphone_core_add_auth_info(lc,info); /*add authentication info to LinphoneCore*/ } @@ -126,15 +125,15 @@ static void register_with_refresh_base_3(LinphoneCore* lc break; /*no need to continue*/ ms_usleep(100000); } - CU_ASSERT_EQUAL(linphone_proxy_config_is_registered(proxy_cfg),(expected_final_state == LinphoneRegistrationOk)); - CU_ASSERT_EQUAL(counters->number_of_LinphoneRegistrationNone,0); - CU_ASSERT_TRUE(counters->number_of_LinphoneRegistrationProgress>=1); + BC_ASSERT_EQUAL(linphone_proxy_config_is_registered(proxy_cfg),(expected_final_state == LinphoneRegistrationOk), int, "%d"); + BC_ASSERT_EQUAL(counters->number_of_LinphoneRegistrationNone,0, int, "%d"); + BC_ASSERT_TRUE(counters->number_of_LinphoneRegistrationProgress>=1); if (expected_final_state == LinphoneRegistrationOk) { - CU_ASSERT_EQUAL(counters->number_of_LinphoneRegistrationOk,1+(refresh!=0)); - CU_ASSERT_EQUAL(counters->number_of_LinphoneRegistrationFailed,late_auth_info?1:0); + BC_ASSERT_EQUAL(counters->number_of_LinphoneRegistrationOk,1+(refresh!=0), int, "%d"); + BC_ASSERT_EQUAL(counters->number_of_LinphoneRegistrationFailed,late_auth_info?1:0, int, "%d"); } else /*checking to be done outside this functions*/ - CU_ASSERT_EQUAL(counters->number_of_LinphoneRegistrationCleared,0); + BC_ASSERT_EQUAL(counters->number_of_LinphoneRegistrationCleared,0, int, "%d"); } @@ -155,7 +154,7 @@ static void register_with_refresh(LinphoneCoreManager* lcm, bool_t refresh,const stats* counters = &lcm->stat; register_with_refresh_base(lcm->lc,refresh,domain,route); linphone_core_manager_stop(lcm); - CU_ASSERT_EQUAL(counters->number_of_LinphoneRegistrationCleared,1); + BC_ASSERT_EQUAL(counters->number_of_LinphoneRegistrationCleared,1, int, "%d"); } static void register_with_refresh_with_send_error() { @@ -174,10 +173,10 @@ static void register_with_refresh_with_send_error() { linphone_core_iterate(lcm->lc); ms_usleep(100000); } - CU_ASSERT_EQUAL(counters->number_of_LinphoneRegistrationFailed,0); - CU_ASSERT_EQUAL(counters->number_of_LinphoneRegistrationProgress,2); + BC_ASSERT_EQUAL(counters->number_of_LinphoneRegistrationFailed,0, int, "%d"); + BC_ASSERT_EQUAL(counters->number_of_LinphoneRegistrationProgress,2, int, "%d"); - CU_ASSERT_EQUAL(counters->number_of_LinphoneRegistrationCleared,0); + BC_ASSERT_EQUAL(counters->number_of_LinphoneRegistrationCleared,0, int, "%d"); linphone_core_manager_destroy(lcm); } @@ -186,7 +185,7 @@ static void simple_register(){ LinphoneCoreManager* lcm = create_lcm(); stats* counters = &lcm->stat; register_with_refresh(lcm,FALSE,NULL,NULL); - CU_ASSERT_EQUAL(counters->number_of_auth_info_requested,0); + BC_ASSERT_EQUAL(counters->number_of_auth_info_requested,0, int, "%d"); linphone_core_manager_destroy(lcm); } @@ -204,8 +203,8 @@ static void register_with_custom_headers(void){ linphone_core_set_network_reachable(marie->lc, TRUE); wait_for(marie->lc, NULL, &marie->stat.number_of_LinphoneRegistrationOk,initial_register_ok+1); value=linphone_proxy_config_get_custom_header(cfg, "Server"); - CU_ASSERT_PTR_NOT_NULL(value); - if (value) CU_ASSERT_TRUE(strstr(value, "Flexisip")!=NULL); + BC_ASSERT_PTR_NOT_NULL(value); + if (value) BC_ASSERT_TRUE(strstr(value, "Flexisip")!=NULL); linphone_core_manager_destroy(marie); } @@ -221,10 +220,10 @@ static void simple_unregister(){ reset_counters(counters); /*clear stats*/ /*nothing is supposed to arrive until done*/ - CU_ASSERT_FALSE(wait_for_until(lcm->lc,lcm->lc,&counters->number_of_LinphoneRegistrationCleared,1,3000)); + BC_ASSERT_FALSE(wait_for_until(lcm->lc,lcm->lc,&counters->number_of_LinphoneRegistrationCleared,1,3000)); linphone_proxy_config_enable_register(proxy_config,FALSE); linphone_proxy_config_done(proxy_config); - CU_ASSERT_TRUE(wait_for(lcm->lc,lcm->lc,&counters->number_of_LinphoneRegistrationCleared,1)); + BC_ASSERT_TRUE(wait_for(lcm->lc,lcm->lc,&counters->number_of_LinphoneRegistrationCleared,1)); linphone_core_manager_destroy(lcm); } @@ -240,16 +239,16 @@ static void change_expires(){ reset_counters(counters); /*clear stats*/ /*nothing is supposed to arrive until done*/ - CU_ASSERT_FALSE(wait_for_until(lcm->lc,lcm->lc,&counters->number_of_LinphoneRegistrationCleared,1,3000)); + BC_ASSERT_FALSE(wait_for_until(lcm->lc,lcm->lc,&counters->number_of_LinphoneRegistrationCleared,1,3000)); linphone_proxy_config_set_expires(proxy_config,3); linphone_proxy_config_done(proxy_config); - CU_ASSERT_TRUE(wait_for(lcm->lc,lcm->lc,&counters->number_of_LinphoneRegistrationOk,1)); + BC_ASSERT_TRUE(wait_for(lcm->lc,lcm->lc,&counters->number_of_LinphoneRegistrationOk,1)); /*wait 2s without receive refresh*/ - CU_ASSERT_FALSE(wait_for_until(lcm->lc,lcm->lc,&counters->number_of_LinphoneRegistrationOk,2,2000)); + BC_ASSERT_FALSE(wait_for_until(lcm->lc,lcm->lc,&counters->number_of_LinphoneRegistrationOk,2,2000)); /* now, it should be ok*/ - CU_ASSERT_TRUE(wait_for(lcm->lc,lcm->lc,&counters->number_of_LinphoneRegistrationOk,2)); + BC_ASSERT_TRUE(wait_for(lcm->lc,lcm->lc,&counters->number_of_LinphoneRegistrationOk,2)); linphone_core_manager_destroy(lcm); @@ -260,7 +259,7 @@ static void simple_register_with_refresh() { LinphoneCoreManager* lcm = create_lcm(); stats* counters = &lcm->stat; register_with_refresh(lcm,TRUE,NULL,NULL); - CU_ASSERT_EQUAL(counters->number_of_auth_info_requested,0); + BC_ASSERT_EQUAL(counters->number_of_auth_info_requested,0, int, "%d"); linphone_core_manager_destroy(lcm); } @@ -270,7 +269,7 @@ static void simple_auth_register_with_refresh() { char route[256]; sprintf(route,"sip:%s",test_route); register_with_refresh(lcm,TRUE,auth_domain,route); - CU_ASSERT_EQUAL(counters->number_of_auth_info_requested,1); + BC_ASSERT_EQUAL(counters->number_of_auth_info_requested,1, int, "%d"); linphone_core_manager_destroy(lcm); } @@ -313,7 +312,7 @@ static void simple_authenticated_register(){ linphone_core_add_auth_info(lcm->lc,info); /*add authentication info to LinphoneCore*/ counters = &lcm->stat; register_with_refresh(lcm,FALSE,auth_domain,route); - CU_ASSERT_EQUAL(counters->number_of_auth_info_requested,0); + BC_ASSERT_EQUAL(counters->number_of_auth_info_requested,0, int, "%d"); } static void ha1_authenticated_register(){ @@ -328,7 +327,7 @@ static void ha1_authenticated_register(){ linphone_core_add_auth_info(lcm->lc,info); /*add authentication info to LinphoneCore*/ counters = &lcm->stat; register_with_refresh(lcm,FALSE,auth_domain,route); - CU_ASSERT_EQUAL(counters->number_of_auth_info_requested,0); + BC_ASSERT_EQUAL(counters->number_of_auth_info_requested,0, int, "%d"); } static void authenticated_register_with_no_initial_credentials(){ @@ -347,7 +346,7 @@ static void authenticated_register_with_no_initial_credentials(){ counters= get_stats(mgr->lc); counters->number_of_auth_info_requested=0; register_with_refresh(mgr,FALSE,auth_domain,route); - CU_ASSERT_EQUAL(counters->number_of_auth_info_requested,1); + BC_ASSERT_EQUAL(counters->number_of_auth_info_requested,1, int, "%d"); linphone_core_manager_destroy(mgr); } @@ -364,7 +363,7 @@ static void authenticated_register_with_late_credentials(){ counters = get_stats(mgr->lc); register_with_refresh_base_2(mgr->lc,FALSE,auth_domain,route,TRUE,transport); - CU_ASSERT_EQUAL(counters->number_of_auth_info_requested,1); + BC_ASSERT_EQUAL(counters->number_of_auth_info_requested,1, int, "%d"); linphone_core_manager_destroy(mgr); } @@ -384,9 +383,9 @@ static void authenticated_register_with_wrong_late_credentials(){ counters = get_stats(mgr->lc); register_with_refresh_base_3(mgr->lc,FALSE,auth_domain,route,TRUE,transport,LinphoneRegistrationFailed); - CU_ASSERT_EQUAL(counters->number_of_auth_info_requested,2); - CU_ASSERT_EQUAL(counters->number_of_LinphoneRegistrationFailed,2); - CU_ASSERT_EQUAL(counters->number_of_LinphoneRegistrationProgress,2); + BC_ASSERT_EQUAL(counters->number_of_auth_info_requested,2, int, "%d"); + BC_ASSERT_EQUAL(counters->number_of_LinphoneRegistrationFailed,2, int, "%d"); + BC_ASSERT_EQUAL(counters->number_of_LinphoneRegistrationProgress,2, int, "%d"); test_password=saved_test_passwd; linphone_core_manager_destroy(mgr); @@ -407,23 +406,23 @@ static void authenticated_register_with_wrong_credentials_with_params_base(const linphone_core_add_auth_info(mgr->lc,info); /*add wrong authentication info to LinphoneCore*/ counters = get_stats(mgr->lc); register_with_refresh_base_3(mgr->lc,TRUE,auth_domain,route,FALSE,transport,LinphoneRegistrationFailed); - //CU_ASSERT_EQUAL(counters->number_of_auth_info_requested,3); register_with_refresh_base_3 does not alow to precisely check number of number_of_auth_info_requested + //BC_ASSERT_EQUAL(counters->number_of_auth_info_requested,3, int, "%d"); register_with_refresh_base_3 does not alow to precisely check number of number_of_auth_info_requested /*wait for retry*/ - CU_ASSERT_TRUE(wait_for(mgr->lc,mgr->lc,&counters->number_of_auth_info_requested,4)); - CU_ASSERT_EQUAL(counters->number_of_LinphoneRegistrationFailed,1); + BC_ASSERT_TRUE(wait_for(mgr->lc,mgr->lc,&counters->number_of_auth_info_requested,4)); + BC_ASSERT_EQUAL(counters->number_of_LinphoneRegistrationFailed,1, int, "%d"); /*check the detailed error info */ if (!user_agent || strcmp(user_agent,"tester-no-403")!=0){ LinphoneProxyConfig *cfg=NULL; linphone_core_get_default_proxy(mgr->lc,&cfg); - CU_ASSERT_PTR_NOT_NULL(cfg); + BC_ASSERT_PTR_NOT_NULL(cfg); if (cfg){ const LinphoneErrorInfo *ei=linphone_proxy_config_get_error_info(cfg); const char *phrase=linphone_error_info_get_phrase(ei); - CU_ASSERT_PTR_NOT_NULL(phrase); - if (phrase) CU_ASSERT_TRUE(strcmp(phrase,"Forbidden")==0); - CU_ASSERT_EQUAL(linphone_error_info_get_protocol_code(ei),403); - CU_ASSERT_PTR_NULL(linphone_error_info_get_details(ei)); + BC_ASSERT_PTR_NOT_NULL(phrase); + if (phrase) BC_ASSERT_TRUE(strcmp(phrase,"Forbidden")==0); + BC_ASSERT_EQUAL(linphone_error_info_get_protocol_code(ei),403, int, "%d"); + BC_ASSERT_PTR_NULL(linphone_error_info_get_details(ei)); } } @@ -450,7 +449,7 @@ static void authenticated_register_with_wrong_credentials_2() { linphone_proxy_config_enable_register(proxy,FALSE); linphone_proxy_config_done(proxy); current_in_progress=counters->number_of_LinphoneRegistrationProgress; - CU_ASSERT_FALSE(wait_for(mgr->lc,mgr->lc,&counters->number_of_LinphoneRegistrationProgress,current_in_progress+1)); + BC_ASSERT_FALSE(wait_for(mgr->lc,mgr->lc,&counters->number_of_LinphoneRegistrationProgress,current_in_progress+1)); linphone_core_manager_destroy(mgr); } @@ -460,8 +459,8 @@ static void authenticated_register_with_wrong_credentials_without_403() { static LinphoneCoreManager* configure_lcm(void) { LinphoneCoreManager *mgr=linphone_core_manager_new( "multi_account_rc"); stats *counters=&mgr->stat; - CU_ASSERT_TRUE(wait_for(mgr->lc,mgr->lc,&counters->number_of_LinphoneRegistrationOk,ms_list_size(linphone_core_get_proxy_config_list(mgr->lc)))); - CU_ASSERT_EQUAL(counters->number_of_LinphoneRegistrationFailed,0); + BC_ASSERT_TRUE(wait_for(mgr->lc,mgr->lc,&counters->number_of_LinphoneRegistrationOk,ms_list_size(linphone_core_get_proxy_config_list(mgr->lc)))); + BC_ASSERT_EQUAL(counters->number_of_LinphoneRegistrationFailed,0, int, "%d"); return mgr; } @@ -479,10 +478,10 @@ static void network_state_change(){ counters = get_stats(lc); register_ok=counters->number_of_LinphoneRegistrationOk; linphone_core_set_network_reachable(lc,FALSE); - CU_ASSERT_TRUE(wait_for(lc,lc,&counters->number_of_NetworkReachableFalse,1)); - CU_ASSERT_TRUE(wait_for(lc,lc,&counters->number_of_LinphoneRegistrationNone,register_ok)); + BC_ASSERT_TRUE(wait_for(lc,lc,&counters->number_of_NetworkReachableFalse,1)); + BC_ASSERT_TRUE(wait_for(lc,lc,&counters->number_of_LinphoneRegistrationNone,register_ok)); linphone_core_set_network_reachable(lc,TRUE); - CU_ASSERT_TRUE(wait_for(lc,lc,&counters->number_of_NetworkReachableTrue,1)); + BC_ASSERT_TRUE(wait_for(lc,lc,&counters->number_of_NetworkReachableTrue,1)); wait_for(lc,lc,&counters->number_of_LinphoneRegistrationOk,2*register_ok); linphone_core_manager_destroy(mgr); @@ -522,9 +521,9 @@ static void transport_change(){ /*keep only udp*/ linphone_core_set_sip_transports(lc,&sip_tr); - CU_ASSERT_TRUE(wait_for(lc,lc,&counters->number_of_LinphoneRegistrationOk,register_ok+number_of_udp_proxy)); + BC_ASSERT_TRUE(wait_for(lc,lc,&counters->number_of_LinphoneRegistrationOk,register_ok+number_of_udp_proxy)); - CU_ASSERT_TRUE(wait_for(lc,lc,&counters->number_of_LinphoneRegistrationFailed,total_number_of_proxies-number_of_udp_proxy)); + BC_ASSERT_TRUE(wait_for(lc,lc,&counters->number_of_LinphoneRegistrationFailed,total_number_of_proxies-number_of_udp_proxy)); linphone_core_manager_destroy(mgr); } @@ -544,7 +543,7 @@ static void proxy_transport_change(){ reset_counters(counters); /*clear stats*/ linphone_proxy_config_edit(proxy_config); - CU_ASSERT_FALSE(wait_for_until(lcm->lc,lcm->lc,&counters->number_of_LinphoneRegistrationCleared,1,3000)); + BC_ASSERT_FALSE(wait_for_until(lcm->lc,lcm->lc,&counters->number_of_LinphoneRegistrationCleared,1,3000)); addr = linphone_address_new(linphone_proxy_config_get_addr(proxy_config)); if (LinphoneTransportTcp == linphone_address_get_transport(addr)) { @@ -556,9 +555,9 @@ static void proxy_transport_change(){ linphone_proxy_config_done(proxy_config); - CU_ASSERT(wait_for(lcm->lc,lcm->lc,&counters->number_of_LinphoneRegistrationOk,1)); + BC_ASSERT(wait_for(lcm->lc,lcm->lc,&counters->number_of_LinphoneRegistrationOk,1)); /*as we change p[roxy server destination, we should'nt be notified about the clear*/ - CU_ASSERT_EQUAL(counters->number_of_LinphoneRegistrationCleared,0); + BC_ASSERT_EQUAL(counters->number_of_LinphoneRegistrationCleared,0, int, "%d"); ms_free(addr_as_string); linphone_address_destroy(addr); linphone_core_manager_destroy(lcm); @@ -580,16 +579,16 @@ static void proxy_transport_change_with_wrong_port() { linphone_core_get_default_proxy(lcm->lc,&proxy_config); linphone_proxy_config_edit(proxy_config); - CU_ASSERT_FALSE(wait_for_until(lcm->lc,lcm->lc,&counters->number_of_LinphoneRegistrationCleared,1,3000)); + BC_ASSERT_FALSE(wait_for_until(lcm->lc,lcm->lc,&counters->number_of_LinphoneRegistrationCleared,1,3000)); linphone_proxy_config_set_server_addr(proxy_config,route); linphone_proxy_config_done(proxy_config); - CU_ASSERT(wait_for(lcm->lc,lcm->lc,&counters->number_of_LinphoneRegistrationOk,1)); + BC_ASSERT(wait_for(lcm->lc,lcm->lc,&counters->number_of_LinphoneRegistrationOk,1)); /*as we change proxy server destination, we should'nt be notified about the clear*/ - CU_ASSERT_EQUAL(counters->number_of_LinphoneRegistrationCleared,0); - CU_ASSERT_EQUAL(counters->number_of_LinphoneRegistrationOk,1); - CU_ASSERT_EQUAL(counters->number_of_LinphoneRegistrationProgress,1); - CU_ASSERT_EQUAL(counters->number_of_LinphoneRegistrationFailed,0); + BC_ASSERT_EQUAL(counters->number_of_LinphoneRegistrationCleared,0, int, "%d"); + BC_ASSERT_EQUAL(counters->number_of_LinphoneRegistrationOk,1, int, "%d"); + BC_ASSERT_EQUAL(counters->number_of_LinphoneRegistrationProgress,1, int, "%d"); + BC_ASSERT_EQUAL(counters->number_of_LinphoneRegistrationFailed,0, int, "%d"); linphone_core_manager_destroy(lcm); @@ -611,14 +610,14 @@ static void proxy_transport_change_with_wrong_port_givin_up() { linphone_core_get_default_proxy(lcm->lc,&proxy_config); linphone_proxy_config_edit(proxy_config); - CU_ASSERT_FALSE(wait_for_until(lcm->lc,lcm->lc,&counters->number_of_LinphoneRegistrationCleared,1,3000)); + BC_ASSERT_FALSE(wait_for_until(lcm->lc,lcm->lc,&counters->number_of_LinphoneRegistrationCleared,1,3000)); linphone_proxy_config_enableregister(proxy_config,FALSE); linphone_proxy_config_done(proxy_config); - CU_ASSERT(wait_for(lcm->lc,lcm->lc,&counters->number_of_LinphoneRegistrationCleared,1)); - CU_ASSERT_EQUAL(counters->number_of_LinphoneRegistrationOk,0); - CU_ASSERT_EQUAL(counters->number_of_LinphoneRegistrationProgress,1); - CU_ASSERT_EQUAL(counters->number_of_LinphoneRegistrationFailed,0); + BC_ASSERT(wait_for(lcm->lc,lcm->lc,&counters->number_of_LinphoneRegistrationCleared,1)); + BC_ASSERT_EQUAL(counters->number_of_LinphoneRegistrationOk,0, int, "%d"); + BC_ASSERT_EQUAL(counters->number_of_LinphoneRegistrationProgress,1, int, "%d"); + BC_ASSERT_EQUAL(counters->number_of_LinphoneRegistrationFailed,0, int, "%d"); linphone_core_manager_destroy(lcm); @@ -639,8 +638,8 @@ static void io_recv_error(){ number_of_udp_proxy=get_number_of_udp_proxy(lc); sal_set_recv_error(lc->sal, 0); - CU_ASSERT_TRUE(wait_for(lc,lc,&counters->number_of_LinphoneRegistrationProgress,2*(register_ok-number_of_udp_proxy) /*because 1 udp*/)); - CU_ASSERT_EQUAL(counters->number_of_LinphoneRegistrationFailed,0) + BC_ASSERT_TRUE(wait_for(lc,lc,&counters->number_of_LinphoneRegistrationProgress,2*(register_ok-number_of_udp_proxy) /*because 1 udp*/)); + BC_ASSERT_EQUAL(counters->number_of_LinphoneRegistrationFailed,0,int,"%d"); sal_set_recv_error(lc->sal, 1); /*reset*/ @@ -662,11 +661,11 @@ static void io_recv_error_retry_immediatly(){ number_of_udp_proxy=get_number_of_udp_proxy(lc); sal_set_recv_error(lc->sal, 0); - CU_ASSERT_TRUE(wait_for(lc,NULL,&counters->number_of_LinphoneRegistrationProgress,(register_ok-number_of_udp_proxy)+register_ok /*because 1 udp*/)); - CU_ASSERT_EQUAL(counters->number_of_LinphoneRegistrationFailed,0) + BC_ASSERT_TRUE(wait_for(lc,NULL,&counters->number_of_LinphoneRegistrationProgress,(register_ok-number_of_udp_proxy)+register_ok /*because 1 udp*/)); + BC_ASSERT_EQUAL(counters->number_of_LinphoneRegistrationFailed,0,int,"%d"); sal_set_recv_error(lc->sal, 1); /*reset*/ - CU_ASSERT_TRUE(wait_for(lc,lc,&counters->number_of_LinphoneRegistrationOk,register_ok-number_of_udp_proxy+register_ok)); + BC_ASSERT_TRUE(wait_for(lc,lc,&counters->number_of_LinphoneRegistrationOk,register_ok-number_of_udp_proxy+register_ok)); linphone_core_manager_destroy(mgr); } @@ -683,7 +682,7 @@ static void io_recv_error_late_recovery(){ lc=mgr->lc; sal_set_refresher_retry_after(lc->sal,1000); counters=&mgr->stat; - CU_ASSERT_TRUE(wait_for(mgr->lc,mgr->lc,&counters->number_of_LinphoneRegistrationOk,ms_list_size(linphone_core_get_proxy_config_list(mgr->lc)))); + BC_ASSERT_TRUE(wait_for(mgr->lc,mgr->lc,&counters->number_of_LinphoneRegistrationOk,ms_list_size(linphone_core_get_proxy_config_list(mgr->lc)))); counters = get_stats(lc); @@ -693,15 +692,15 @@ static void io_recv_error_late_recovery(){ sal_set_recv_error(lc->sal, 0); sal_set_send_error(lc->sal, -1); - CU_ASSERT_TRUE(wait_for(lc,NULL,&counters->number_of_LinphoneRegistrationProgress,(register_ok-number_of_udp_proxy)+register_ok /*because 1 udp*/)); - CU_ASSERT_EQUAL(counters->number_of_LinphoneRegistrationFailed,0) + BC_ASSERT_TRUE(wait_for(lc,NULL,&counters->number_of_LinphoneRegistrationProgress,(register_ok-number_of_udp_proxy)+register_ok /*because 1 udp*/)); + BC_ASSERT_EQUAL(counters->number_of_LinphoneRegistrationFailed,0,int,"%d"); - CU_ASSERT_TRUE(wait_for_list(lcs=ms_list_append(NULL,lc),&counters->number_of_LinphoneRegistrationFailed,(register_ok-number_of_udp_proxy),sal_get_refresher_retry_after(lc->sal)+3000)); + BC_ASSERT_TRUE(wait_for_list(lcs=ms_list_append(NULL,lc),&counters->number_of_LinphoneRegistrationFailed,(register_ok-number_of_udp_proxy),sal_get_refresher_retry_after(lc->sal)+3000)); sal_set_recv_error(lc->sal, 1); /*reset*/ sal_set_send_error(lc->sal, 0); - CU_ASSERT_TRUE(wait_for_list(lcs=ms_list_append(NULL,lc),&counters->number_of_LinphoneRegistrationOk,register_ok-number_of_udp_proxy +register_ok,sal_get_refresher_retry_after(lc->sal)+3000)); + BC_ASSERT_TRUE(wait_for_list(lcs=ms_list_append(NULL,lc),&counters->number_of_LinphoneRegistrationOk,register_ok-number_of_udp_proxy +register_ok,sal_get_refresher_retry_after(lc->sal)+3000)); linphone_core_manager_destroy(mgr); } @@ -728,15 +727,15 @@ static void io_recv_error_without_active_register(){ } ms_list_free(proxys); /*wait for unregistrations*/ - CU_ASSERT_TRUE(wait_for(lc,lc,&counters->number_of_LinphoneRegistrationCleared,register_ok /*because 1 udp*/)); + BC_ASSERT_TRUE(wait_for(lc,lc,&counters->number_of_LinphoneRegistrationCleared,register_ok /*because 1 udp*/)); sal_set_recv_error(lc->sal, 0); /*nothing should happen because no active registration*/ wait_for_until(lc,lc, &dummy, 1, 3000); - CU_ASSERT_TRUE(counters->number_of_LinphoneRegistrationProgress == ms_list_size(linphone_core_get_proxy_config_list(lc))); + BC_ASSERT_TRUE(counters->number_of_LinphoneRegistrationProgress == ms_list_size(linphone_core_get_proxy_config_list(lc))); - CU_ASSERT_EQUAL(counters->number_of_LinphoneRegistrationFailed,0) + BC_ASSERT_EQUAL(counters->number_of_LinphoneRegistrationFailed,0,int,"%d"); sal_set_recv_error(lc->sal, 1); /*reset*/ @@ -754,15 +753,15 @@ static void tls_certificate_failure(){ snprintf(rootcapath,sizeof(rootcapath), "%s/certificates/cn/agent.pem", bc_tester_read_dir_prefix); /*bad root ca*/ linphone_core_set_root_ca(mgr->lc,rootcapath); linphone_core_set_network_reachable(lc,TRUE); - CU_ASSERT_TRUE(wait_for(mgr->lc,mgr->lc,&mgr->stat.number_of_LinphoneRegistrationFailed,1)); + BC_ASSERT_TRUE(wait_for(mgr->lc,mgr->lc,&mgr->stat.number_of_LinphoneRegistrationFailed,1)); linphone_core_set_root_ca(mgr->lc,NULL); /*no root ca*/ linphone_core_refresh_registers(mgr->lc); - CU_ASSERT_TRUE(wait_for(lc,lc,&mgr->stat.number_of_LinphoneRegistrationFailed,2)); + BC_ASSERT_TRUE(wait_for(lc,lc,&mgr->stat.number_of_LinphoneRegistrationFailed,2)); snprintf(rootcapath,sizeof(rootcapath), "%s/certificates/cn/cafile.pem", bc_tester_read_dir_prefix); /*goot root ca*/ linphone_core_set_root_ca(mgr->lc,rootcapath); linphone_core_refresh_registers(mgr->lc); - CU_ASSERT_TRUE(wait_for(lc,lc,&mgr->stat.number_of_LinphoneRegistrationOk,1)); - CU_ASSERT_EQUAL(mgr->stat.number_of_LinphoneRegistrationFailed,2); + BC_ASSERT_TRUE(wait_for(lc,lc,&mgr->stat.number_of_LinphoneRegistrationOk,1)); + BC_ASSERT_EQUAL(mgr->stat.number_of_LinphoneRegistrationFailed,2, int, "%d"); linphone_core_destroy(mgr->lc); } @@ -785,7 +784,7 @@ static void tls_with_non_tls_server(){ linphone_proxy_config_set_server_addr(proxy_cfg,tmp); linphone_proxy_config_done(proxy_cfg); linphone_address_destroy(addr); - CU_ASSERT_TRUE(wait_for_until(lc,lc,&mgr->stat.number_of_LinphoneRegistrationFailed,1,5000)); + BC_ASSERT_TRUE(wait_for_until(lc,lc,&mgr->stat.number_of_LinphoneRegistrationFailed,1,5000)); linphone_core_manager_destroy(mgr); } @@ -799,8 +798,8 @@ static void tls_alt_name_register(){ snprintf(rootcapath,sizeof(rootcapath), "%s/certificates/cn/cafile.pem", bc_tester_read_dir_prefix); linphone_core_set_root_ca(mgr->lc,rootcapath); linphone_core_refresh_registers(mgr->lc); - CU_ASSERT_TRUE(wait_for(lc,lc,&mgr->stat.number_of_LinphoneRegistrationOk,1)); - CU_ASSERT_EQUAL(mgr->stat.number_of_LinphoneRegistrationFailed,0); + BC_ASSERT_TRUE(wait_for(lc,lc,&mgr->stat.number_of_LinphoneRegistrationOk,1)); + BC_ASSERT_EQUAL(mgr->stat.number_of_LinphoneRegistrationFailed,0, int, "%d"); linphone_core_manager_destroy(mgr); } @@ -814,8 +813,8 @@ static void tls_wildcard_register(){ snprintf(rootcapath,sizeof(rootcapath), "%s/certificates/cn/cafile.pem", bc_tester_read_dir_prefix); linphone_core_set_root_ca(mgr->lc,rootcapath); linphone_core_refresh_registers(mgr->lc); - CU_ASSERT_TRUE(wait_for(lc,lc,&mgr->stat.number_of_LinphoneRegistrationOk,2)); - CU_ASSERT_EQUAL(mgr->stat.number_of_LinphoneRegistrationFailed,0); + BC_ASSERT_TRUE(wait_for(lc,lc,&mgr->stat.number_of_LinphoneRegistrationOk,2)); + BC_ASSERT_EQUAL(mgr->stat.number_of_LinphoneRegistrationFailed,0, int, "%d"); linphone_core_destroy(mgr->lc); } diff --git a/tester/remote_provisioning_tester.c b/tester/remote_provisioning_tester.c index 12c194a67..ad3c5ebb1 100644 --- a/tester/remote_provisioning_tester.c +++ b/tester/remote_provisioning_tester.c @@ -16,8 +16,7 @@ along with this program. If not, see . */ -#include -#include "CUnit/Basic.h" + #include "linphonecore.h" #include "private.h" #include "liblinphone_tester.h" @@ -38,64 +37,64 @@ void linphone_configuration_status(LinphoneCore *lc, LinphoneConfiguringState st static void remote_provisioning_skipped(void) { LinphoneCoreManager* marie = linphone_core_manager_new2("marie_rc", FALSE); - CU_ASSERT_TRUE(wait_for(marie->lc,NULL,&marie->stat.number_of_LinphoneConfiguringSkipped,1)); + BC_ASSERT_TRUE(wait_for(marie->lc,NULL,&marie->stat.number_of_LinphoneConfiguringSkipped,1)); linphone_core_manager_destroy(marie); } static void remote_provisioning_http(void) { LinphoneCoreManager* marie = linphone_core_manager_new2("marie_remote_rc", FALSE); - CU_ASSERT_TRUE(wait_for(marie->lc,NULL,&marie->stat.number_of_LinphoneConfiguringSuccessful,1)); - CU_ASSERT_TRUE(wait_for(marie->lc,NULL,&marie->stat.number_of_LinphoneRegistrationOk,1)); + BC_ASSERT_TRUE(wait_for(marie->lc,NULL,&marie->stat.number_of_LinphoneConfiguringSuccessful,1)); + BC_ASSERT_TRUE(wait_for(marie->lc,NULL,&marie->stat.number_of_LinphoneRegistrationOk,1)); linphone_core_manager_destroy(marie); } static void remote_provisioning_transient(void) { LinphoneCoreManager* marie = linphone_core_manager_new2("marie_transient_remote_rc", FALSE); - CU_ASSERT_TRUE(wait_for(marie->lc,NULL,&marie->stat.number_of_LinphoneConfiguringSuccessful,1)); - CU_ASSERT_TRUE(wait_for(marie->lc,NULL,&marie->stat.number_of_LinphoneRegistrationOk,1)); - CU_ASSERT_TRUE(linphone_core_is_provisioning_transient(marie->lc) == TRUE); - CU_ASSERT_TRUE(linphone_core_get_provisioning_uri(marie->lc) == NULL); + BC_ASSERT_TRUE(wait_for(marie->lc,NULL,&marie->stat.number_of_LinphoneConfiguringSuccessful,1)); + BC_ASSERT_TRUE(wait_for(marie->lc,NULL,&marie->stat.number_of_LinphoneRegistrationOk,1)); + BC_ASSERT_TRUE(linphone_core_is_provisioning_transient(marie->lc) == TRUE); + BC_ASSERT_TRUE(linphone_core_get_provisioning_uri(marie->lc) == NULL); linphone_core_manager_destroy(marie); } static void remote_provisioning_https(void) { LinphoneCoreManager* marie = linphone_core_manager_new2("marie_remote_https_rc", FALSE); - CU_ASSERT_TRUE(wait_for(marie->lc,NULL,&marie->stat.number_of_LinphoneConfiguringSuccessful,1)); - CU_ASSERT_TRUE(wait_for(marie->lc,NULL,&marie->stat.number_of_LinphoneRegistrationOk,1)); + BC_ASSERT_TRUE(wait_for(marie->lc,NULL,&marie->stat.number_of_LinphoneConfiguringSuccessful,1)); + BC_ASSERT_TRUE(wait_for(marie->lc,NULL,&marie->stat.number_of_LinphoneRegistrationOk,1)); linphone_core_manager_destroy(marie); } static void remote_provisioning_not_found(void) { LinphoneCoreManager* marie = linphone_core_manager_new2("marie_remote_404_rc", FALSE); - CU_ASSERT_TRUE(wait_for(marie->lc,NULL,&marie->stat.number_of_LinphoneConfiguringFailed,1)); + BC_ASSERT_TRUE(wait_for(marie->lc,NULL,&marie->stat.number_of_LinphoneConfiguringFailed,1)); linphone_core_manager_destroy(marie); } static void remote_provisioning_invalid(void) { LinphoneCoreManager* marie = linphone_core_manager_new2("marie_remote_invalid_rc", FALSE); - CU_ASSERT_TRUE(wait_for(marie->lc,NULL,&marie->stat.number_of_LinphoneConfiguringFailed,1)); + BC_ASSERT_TRUE(wait_for(marie->lc,NULL,&marie->stat.number_of_LinphoneConfiguringFailed,1)); linphone_core_manager_destroy(marie); } static void remote_provisioning_invalid_uri(void) { LinphoneCoreManager* marie = linphone_core_manager_new2("marie_remote_invalid_uri_rc", FALSE); - CU_ASSERT_TRUE(wait_for(marie->lc,NULL,&marie->stat.number_of_LinphoneConfiguringFailed,1)); + BC_ASSERT_TRUE(wait_for(marie->lc,NULL,&marie->stat.number_of_LinphoneConfiguringFailed,1)); linphone_core_manager_destroy(marie); } static void remote_provisioning_default_values(void) { LinphoneProxyConfig *lpc; LinphoneCoreManager* marie = linphone_core_manager_new2("marie_remote_default_values_rc", FALSE); - CU_ASSERT_TRUE(wait_for(marie->lc,NULL,&marie->stat.number_of_LinphoneConfiguringSuccessful,1)); + BC_ASSERT_TRUE(wait_for(marie->lc,NULL,&marie->stat.number_of_LinphoneConfiguringSuccessful,1)); lpc = linphone_core_create_proxy_config(marie->lc); - CU_ASSERT_TRUE(lpc->reg_sendregister == TRUE); - CU_ASSERT_TRUE(lpc->expires == 604800); - CU_ASSERT_STRING_EQUAL(lpc->reg_proxy, ""); - CU_ASSERT_STRING_EQUAL(lpc->reg_route, ""); - CU_ASSERT_STRING_EQUAL(lpc->reg_identity, "sip:?@sip.linphone.org"); + BC_ASSERT_TRUE(lpc->reg_sendregister == TRUE); + BC_ASSERT_TRUE(lpc->expires == 604800); + BC_ASSERT_STRING_EQUAL(lpc->reg_proxy, ""); + BC_ASSERT_STRING_EQUAL(lpc->reg_route, ""); + BC_ASSERT_STRING_EQUAL(lpc->reg_identity, "sip:?@sip.linphone.org"); { LpConfig* lp = linphone_core_get_config(marie->lc); - CU_ASSERT_STRING_EQUAL(lp_config_get_string(lp,"app","toto","empty"),"titi"); + BC_ASSERT_STRING_EQUAL(lp_config_get_string(lp,"app","toto","empty"),"titi"); } linphone_core_manager_destroy(marie); @@ -112,10 +111,10 @@ static void remote_provisioning_file(void) { #else marie = linphone_core_manager_new2("marie_remote_localfile_rc", FALSE); #endif - CU_ASSERT_TRUE(wait_for(marie->lc,NULL,&marie->stat.number_of_LinphoneConfiguringSuccessful,1)); + BC_ASSERT_TRUE(wait_for(marie->lc,NULL,&marie->stat.number_of_LinphoneConfiguringSuccessful,1)); conf = linphone_core_get_config( marie->lc ); - CU_ASSERT_EQUAL( lp_config_get_int(conf,"misc","tester_file_ok", 0), 1 ); + BC_ASSERT_EQUAL( lp_config_get_int(conf,"misc","tester_file_ok", 0), 1 , int, "%d"); linphone_core_manager_destroy(marie); } diff --git a/tester/setup_tester.c b/tester/setup_tester.c index 217f257e6..cb1bcb883 100644 --- a/tester/setup_tester.c +++ b/tester/setup_tester.c @@ -16,8 +16,7 @@ along with this program. If not, see . */ -#include -#include "CUnit/Basic.h" + #include "linphonecore.h" #include "liblinphone_tester.h" #include "lpconfig.h" @@ -26,7 +25,7 @@ static void linphone_version_test(void){ const char *version=linphone_core_get_version(); /*make sure the git version is always included in the version number*/ - CU_ASSERT_TRUE(strstr(version,"unknown")==NULL); + BC_ASSERT_TRUE(strstr(version,"unknown")==NULL); } static void core_init_test(void) { @@ -36,7 +35,7 @@ static void core_init_test(void) { lc = linphone_core_new(&v_table,NULL,NULL,NULL); /* until we have good certificates on our test server... */ linphone_core_verify_server_certificates(lc,FALSE); - CU_ASSERT_PTR_NOT_NULL_FATAL(lc); + BC_ASSERT_PTR_NOT_NULL_FATAL(lc); linphone_core_destroy(lc); } @@ -50,10 +49,10 @@ static void core_sip_transport_test(void) { LCSipTransports tr; memset (&v_table,0,sizeof(v_table)); lc = linphone_core_new(&v_table,NULL,NULL,NULL); - CU_ASSERT_PTR_NOT_NULL_FATAL(lc); + BC_ASSERT_PTR_NOT_NULL_FATAL(lc); linphone_core_get_sip_transports(lc,&tr); - CU_ASSERT_EQUAL(tr.udp_port,5060); /*default config*/ - CU_ASSERT_EQUAL(tr.tcp_port,5060); /*default config*/ + BC_ASSERT_EQUAL(tr.udp_port,5060, int, "%d"); /*default config*/ + BC_ASSERT_EQUAL(tr.tcp_port,5060, int, "%d"); /*default config*/ tr.udp_port=LC_SIP_TRANSPORT_RANDOM; tr.tcp_port=LC_SIP_TRANSPORT_RANDOM; @@ -62,12 +61,12 @@ static void core_sip_transport_test(void) { linphone_core_set_sip_transports(lc,&tr); linphone_core_get_sip_transports(lc,&tr); - CU_ASSERT_NOT_EQUAL(tr.udp_port,5060); /*default config*/ - CU_ASSERT_NOT_EQUAL(tr.tcp_port,5060); /*default config*/ + BC_ASSERT_NOT_EQUAL(tr.udp_port,5060,int,"%d"); /*default config*/ + BC_ASSERT_NOT_EQUAL(tr.tcp_port,5060,int,"%d"); /*default config*/ - CU_ASSERT_EQUAL(lp_config_get_int(linphone_core_get_config(lc),"sip","sip_port",-2),LC_SIP_TRANSPORT_RANDOM); - CU_ASSERT_EQUAL(lp_config_get_int(linphone_core_get_config(lc),"sip","sip_tcp_port",-2),LC_SIP_TRANSPORT_RANDOM); - CU_ASSERT_EQUAL(lp_config_get_int(linphone_core_get_config(lc),"sip","sip_tls_port",-2),LC_SIP_TRANSPORT_RANDOM); + BC_ASSERT_EQUAL(lp_config_get_int(linphone_core_get_config(lc),"sip","sip_port",-2),LC_SIP_TRANSPORT_RANDOM, int, "%d"); + BC_ASSERT_EQUAL(lp_config_get_int(linphone_core_get_config(lc),"sip","sip_tcp_port",-2),LC_SIP_TRANSPORT_RANDOM, int, "%d"); + BC_ASSERT_EQUAL(lp_config_get_int(linphone_core_get_config(lc),"sip","sip_tls_port",-2),LC_SIP_TRANSPORT_RANDOM, int, "%d"); linphone_core_destroy(lc); } @@ -81,14 +80,14 @@ static void linphone_interpret_url_test() memset ( &v_table,0,sizeof ( v_table ) ); lc = linphone_core_new ( &v_table,NULL,NULL,NULL ); - CU_ASSERT_PTR_NOT_NULL_FATAL ( lc ); + BC_ASSERT_PTR_NOT_NULL_FATAL ( lc ); address = linphone_core_interpret_url(lc, sips_address); - CU_ASSERT_PTR_NOT_NULL_FATAL(address); - CU_ASSERT_STRING_EQUAL_FATAL(linphone_address_get_scheme(address), "sips"); - CU_ASSERT_STRING_EQUAL_FATAL(linphone_address_get_username(address), "margaux"); - CU_ASSERT_STRING_EQUAL_FATAL(linphone_address_get_domain(address), "sip.linphone.org"); + BC_ASSERT_PTR_NOT_NULL_FATAL(address); + BC_ASSERT_STRING_EQUAL_FATAL(linphone_address_get_scheme(address), "sips"); + BC_ASSERT_STRING_EQUAL_FATAL(linphone_address_get_username(address), "margaux"); + BC_ASSERT_STRING_EQUAL_FATAL(linphone_address_get_domain(address), "sip.linphone.org"); linphone_address_destroy(address); @@ -101,11 +100,11 @@ static void linphone_lpconfig_from_buffer(){ LpConfig* conf; conf = lp_config_new_from_buffer(buffer); - CU_ASSERT_STRING_EQUAL(lp_config_get_string(conf,"buffer","test",""),"ok"); + BC_ASSERT_STRING_EQUAL(lp_config_get_string(conf,"buffer","test",""),"ok"); lp_config_destroy(conf); conf = lp_config_new_from_buffer(buffer_linebreaks); - CU_ASSERT_STRING_EQUAL(lp_config_get_string(conf,"buffer_linebreaks","test",""),"ok"); + BC_ASSERT_STRING_EQUAL(lp_config_get_string(conf,"buffer_linebreaks","test",""),"ok"); lp_config_destroy(conf); } @@ -116,11 +115,11 @@ static void linphone_lpconfig_from_buffer_zerolen_value(){ conf = lp_config_new_from_buffer(zerolen); - CU_ASSERT_STRING_EQUAL(lp_config_get_string(conf,"test","zero_len","LOL"),"LOL"); - CU_ASSERT_STRING_EQUAL(lp_config_get_string(conf,"test","non_zero_len",""),"test"); + BC_ASSERT_STRING_EQUAL(lp_config_get_string(conf,"test","zero_len","LOL"),"LOL"); + BC_ASSERT_STRING_EQUAL(lp_config_get_string(conf,"test","non_zero_len",""),"test"); lp_config_set_string(conf, "test", "non_zero_len", ""); /* should remove "non_zero_len" */ - CU_ASSERT_STRING_EQUAL(lp_config_get_string(conf,"test","non_zero_len","LOL"), "LOL"); + BC_ASSERT_STRING_EQUAL(lp_config_get_string(conf,"test","non_zero_len","LOL"), "LOL"); lp_config_destroy(conf); } @@ -135,13 +134,13 @@ static void linphone_lpconfig_from_file_zerolen_value(){ stores the app bundle in read-only */ conf = lp_config_new_with_factory(NULL, rc_path); - CU_ASSERT_STRING_EQUAL(lp_config_get_string(conf,"test","zero_len","LOL"),"LOL"); + BC_ASSERT_STRING_EQUAL(lp_config_get_string(conf,"test","zero_len","LOL"),"LOL"); // non_zero_len=test -> should return test - CU_ASSERT_STRING_EQUAL(lp_config_get_string(conf,"test","non_zero_len",""),"test"); + BC_ASSERT_STRING_EQUAL(lp_config_get_string(conf,"test","non_zero_len",""),"test"); lp_config_set_string(conf, "test", "non_zero_len", ""); /* should remove "non_zero_len" */ - CU_ASSERT_STRING_EQUAL(lp_config_get_string(conf,"test","non_zero_len","LOL"), "LOL"); + BC_ASSERT_STRING_EQUAL(lp_config_get_string(conf,"test","non_zero_len","LOL"), "LOL"); ms_free(rc_path); lp_config_destroy(conf); @@ -154,15 +153,15 @@ static void linphone_lpconfig_from_xml_zerolen_value(){ LinphoneCoreManager* mgr = linphone_core_manager_new2("empty_rc",FALSE); - CU_ASSERT_EQUAL(linphone_remote_provisioning_load_file(mgr->lc, xml_path), 0); + BC_ASSERT_EQUAL(linphone_remote_provisioning_load_file(mgr->lc, xml_path), 0, int, "%d"); conf = mgr->lc->config; - CU_ASSERT_STRING_EQUAL(lp_config_get_string(conf,"test","zero_len","LOL"),"LOL"); - CU_ASSERT_STRING_EQUAL(lp_config_get_string(conf,"test","non_zero_len",""),"test"); + BC_ASSERT_STRING_EQUAL(lp_config_get_string(conf,"test","zero_len","LOL"),"LOL"); + BC_ASSERT_STRING_EQUAL(lp_config_get_string(conf,"test","non_zero_len",""),"test"); lp_config_set_string(conf, "test", "non_zero_len", ""); /* should remove "non_zero_len" */ - CU_ASSERT_STRING_EQUAL(lp_config_get_string(conf,"test","non_zero_len","LOL"), "LOL"); + BC_ASSERT_STRING_EQUAL(lp_config_get_string(conf,"test","non_zero_len","LOL"), "LOL"); linphone_core_manager_destroy(mgr); ms_free(xml_path); @@ -176,15 +175,15 @@ void linphone_proxy_config_address_equal_test() { LinphoneAddress *e = linphone_address_new("sip:toto@titi;transport=udp"); LinphoneAddress *f = linphone_address_new("sip:toto@titi?X-Create-Account=yes"); - CU_ASSERT_EQUAL(linphone_proxy_config_address_equal(a,NULL), LinphoneProxyConfigAddressDifferent); - CU_ASSERT_EQUAL(linphone_proxy_config_address_equal(a,b), LinphoneProxyConfigAddressDifferent); - CU_ASSERT_EQUAL(linphone_proxy_config_address_equal(a,c), LinphoneProxyConfigAddressDifferent); - CU_ASSERT_EQUAL(linphone_proxy_config_address_equal(a,d), LinphoneProxyConfigAddressDifferent); - CU_ASSERT_EQUAL(linphone_proxy_config_address_equal(a,e), LinphoneProxyConfigAddressWeakEqual); - CU_ASSERT_EQUAL(linphone_proxy_config_address_equal(NULL,NULL), LinphoneProxyConfigAddressEqual); - CU_ASSERT_EQUAL(linphone_proxy_config_address_equal(a,f), LinphoneProxyConfigAddressWeakEqual); - CU_ASSERT_EQUAL(linphone_proxy_config_address_equal(c,f), LinphoneProxyConfigAddressDifferent); - CU_ASSERT_EQUAL(linphone_proxy_config_address_equal(e,f), LinphoneProxyConfigAddressWeakEqual); + BC_ASSERT_EQUAL(linphone_proxy_config_address_equal(a,NULL), LinphoneProxyConfigAddressDifferent, int, "%d"); + BC_ASSERT_EQUAL(linphone_proxy_config_address_equal(a,b), LinphoneProxyConfigAddressDifferent, int, "%d"); + BC_ASSERT_EQUAL(linphone_proxy_config_address_equal(a,c), LinphoneProxyConfigAddressDifferent, int, "%d"); + BC_ASSERT_EQUAL(linphone_proxy_config_address_equal(a,d), LinphoneProxyConfigAddressDifferent, int, "%d"); + BC_ASSERT_EQUAL(linphone_proxy_config_address_equal(a,e), LinphoneProxyConfigAddressWeakEqual, int, "%d"); + BC_ASSERT_EQUAL(linphone_proxy_config_address_equal(NULL,NULL), LinphoneProxyConfigAddressEqual, int, "%d"); + BC_ASSERT_EQUAL(linphone_proxy_config_address_equal(a,f), LinphoneProxyConfigAddressWeakEqual, int, "%d"); + BC_ASSERT_EQUAL(linphone_proxy_config_address_equal(c,f), LinphoneProxyConfigAddressDifferent, int, "%d"); + BC_ASSERT_EQUAL(linphone_proxy_config_address_equal(e,f), LinphoneProxyConfigAddressWeakEqual, int, "%d"); linphone_address_destroy(a); linphone_address_destroy(b); @@ -200,36 +199,36 @@ void linphone_proxy_config_is_server_config_changed_test() { linphone_proxy_config_set_identity(proxy_config,"sip:toto@titi"); linphone_proxy_config_edit(proxy_config); linphone_proxy_config_set_identity(proxy_config,"sips:toto@titi"); - CU_ASSERT_EQUAL(linphone_proxy_config_is_server_config_changed(proxy_config), LinphoneProxyConfigAddressDifferent); + BC_ASSERT_EQUAL(linphone_proxy_config_is_server_config_changed(proxy_config), LinphoneProxyConfigAddressDifferent, int, "%d"); linphone_proxy_config_set_server_addr(proxy_config,"sip:sip.linphone.org"); linphone_proxy_config_edit(proxy_config); linphone_proxy_config_set_server_addr(proxy_config,"sip:toto.com"); - CU_ASSERT_EQUAL(linphone_proxy_config_is_server_config_changed(proxy_config), LinphoneProxyConfigAddressDifferent); + BC_ASSERT_EQUAL(linphone_proxy_config_is_server_config_changed(proxy_config), LinphoneProxyConfigAddressDifferent, int, "%d"); linphone_proxy_config_set_server_addr(proxy_config,"sip:sip.linphone.org"); linphone_proxy_config_edit(proxy_config); linphone_proxy_config_set_server_addr(proxy_config,"sip:sip.linphone.org:4444"); - CU_ASSERT_EQUAL(linphone_proxy_config_is_server_config_changed(proxy_config), LinphoneProxyConfigAddressDifferent); + BC_ASSERT_EQUAL(linphone_proxy_config_is_server_config_changed(proxy_config), LinphoneProxyConfigAddressDifferent, int, "%d"); linphone_proxy_config_set_server_addr(proxy_config,"sip:sip.linphone.org"); linphone_proxy_config_edit(proxy_config); linphone_proxy_config_set_server_addr(proxy_config,"sip:sip.linphone.org;transport=tcp"); - CU_ASSERT_EQUAL(linphone_proxy_config_is_server_config_changed(proxy_config), LinphoneProxyConfigAddressDifferent); + BC_ASSERT_EQUAL(linphone_proxy_config_is_server_config_changed(proxy_config), LinphoneProxyConfigAddressDifferent, int, "%d"); linphone_proxy_config_set_server_addr(proxy_config,"sip:sip.linphone.org"); linphone_proxy_config_edit(proxy_config); linphone_proxy_config_set_server_addr(proxy_config,"sip:sip.linphone.org;param=blue"); - CU_ASSERT_EQUAL(linphone_proxy_config_is_server_config_changed(proxy_config), LinphoneProxyConfigAddressWeakEqual); + BC_ASSERT_EQUAL(linphone_proxy_config_is_server_config_changed(proxy_config), LinphoneProxyConfigAddressWeakEqual, int, "%d"); linphone_proxy_config_edit(proxy_config); linphone_proxy_config_set_contact_parameters(proxy_config,"blabla=blue"); - CU_ASSERT_EQUAL(linphone_proxy_config_is_server_config_changed(proxy_config), LinphoneProxyConfigAddressEqual); + BC_ASSERT_EQUAL(linphone_proxy_config_is_server_config_changed(proxy_config), LinphoneProxyConfigAddressEqual, int, "%d"); linphone_proxy_config_edit(proxy_config); linphone_proxy_config_enable_register(proxy_config,TRUE); - CU_ASSERT_EQUAL(linphone_proxy_config_is_server_config_changed(proxy_config), LinphoneProxyConfigAddressEqual); + BC_ASSERT_EQUAL(linphone_proxy_config_is_server_config_changed(proxy_config), LinphoneProxyConfigAddressEqual, int, "%d"); linphone_proxy_config_destroy(proxy_config); } @@ -239,7 +238,7 @@ static void chat_root_test(void) { LinphoneCore* lc; memset (&v_table,0,sizeof(v_table)); lc = linphone_core_new(&v_table,NULL,NULL,NULL); - CU_ASSERT_PTR_NOT_NULL_FATAL(lc); + BC_ASSERT_PTR_NOT_NULL_FATAL(lc); linphone_core_create_chat_room(lc,"sip:toto@titi.com"); linphone_core_destroy(lc); } @@ -252,14 +251,14 @@ static void devices_reload_test(void) { devid1 = ms_strdup(linphone_core_get_capture_device(mgr->lc)); linphone_core_reload_sound_devices(mgr->lc); devid2 = ms_strdup(linphone_core_get_capture_device(mgr->lc)); - CU_ASSERT_STRING_EQUAL(devid1, devid2); + BC_ASSERT_STRING_EQUAL(devid1, devid2); ms_free(devid1); ms_free(devid2); devid1 = ms_strdup(linphone_core_get_video_device(mgr->lc)); linphone_core_reload_video_devices(mgr->lc); devid2 = ms_strdup(linphone_core_get_video_device(mgr->lc)); - CU_ASSERT_STRING_EQUAL(devid1, devid2); + BC_ASSERT_STRING_EQUAL(devid1, devid2); ms_free(devid1); ms_free(devid2); diff --git a/tester/stun_tester.c b/tester/stun_tester.c index 58a069f3d..03aa1ac13 100644 --- a/tester/stun_tester.c +++ b/tester/stun_tester.c @@ -16,8 +16,7 @@ along with this program. If not, see . */ -#include -#include "CUnit/Basic.h" + #include "linphonecore.h" #include "private.h" #include "liblinphone_tester.h" @@ -57,10 +56,10 @@ static void linphone_stun_test_encode() size_t bigLen = STUN_MAX_MESSAGE_SIZE; size_t len = test_stun_encode(smallBuff, smallLen, TRUE); - CU_ASSERT(len == -1); + BC_ASSERT(len == -1); len = test_stun_encode(bigBuff, bigLen, TRUE); - CU_ASSERT(len > 0); + BC_ASSERT(len > 0); ms_message("STUN message encoded in %i bytes", (int)len); } @@ -77,20 +76,20 @@ static void linphone_stun_test_grab_ip() dummy_call.media_ports[1].rtp_port = 9078; linphone_core_set_stun_server(lc_stun->lc, stun_address); - CU_ASSERT_STRING_EQUAL(stun_address, linphone_core_get_stun_server(lc_stun->lc)); + BC_ASSERT_STRING_EQUAL(stun_address, linphone_core_get_stun_server(lc_stun->lc)); wait_for(lc_stun->lc,lc_stun->lc,&tmp,1); ping_time = linphone_core_run_stun_tests(lc_stun->lc, &dummy_call); - CU_ASSERT(ping_time != -1); + BC_ASSERT(ping_time != -1); ms_message("Round trip to STUN: %d ms", ping_time); - CU_ASSERT( dummy_call.ac.addr[0] != '\0'); - CU_ASSERT( dummy_call.ac.port != 0); + BC_ASSERT( dummy_call.ac.addr[0] != '\0'); + BC_ASSERT( dummy_call.ac.port != 0); #ifdef VIDEO_ENABLED - CU_ASSERT( dummy_call.vc.addr[0] != '\0'); - CU_ASSERT( dummy_call.vc.port != 0); + BC_ASSERT( dummy_call.vc.addr[0] != '\0'); + BC_ASSERT( dummy_call.vc.port != 0); #endif ms_message("STUN test result: local audio port maps to %s:%i", diff --git a/tester/tester.c b/tester/tester.c index fe3054c0b..5c2f16f8f 100644 --- a/tester/tester.c +++ b/tester/tester.c @@ -67,15 +67,15 @@ void liblinphone_tester_enable_ipv6(bool_t enabled){ LinphoneAddress * create_linphone_address(const char * domain) { LinphoneAddress *addr = linphone_address_new(NULL); - CU_ASSERT_PTR_NOT_NULL_FATAL(addr); + BC_ASSERT_PTR_NOT_NULL_FATAL(addr); linphone_address_set_username(addr,test_username); - CU_ASSERT_STRING_EQUAL(test_username,linphone_address_get_username(addr)); + BC_ASSERT_STRING_EQUAL(test_username,linphone_address_get_username(addr)); if (!domain) domain= test_route; linphone_address_set_domain(addr,domain); - CU_ASSERT_STRING_EQUAL(domain,linphone_address_get_domain(addr)); + BC_ASSERT_STRING_EQUAL(domain,linphone_address_get_domain(addr)); linphone_address_set_display_name(addr, NULL); linphone_address_set_display_name(addr, "Mr Tester"); - CU_ASSERT_STRING_EQUAL("Mr Tester",linphone_address_get_display_name(addr)); + BC_ASSERT_STRING_EQUAL("Mr Tester",linphone_address_get_display_name(addr)); return addr; } @@ -107,7 +107,7 @@ LinphoneCore* configure_lc_from(LinphoneCoreVTable* v_table, const char* path, c if (file){ filepath = ms_strdup_printf("%s/%s", path, file); - CU_ASSERT_TRUE_FATAL(ortp_file_exist(filepath)==0); + BC_ASSERT_TRUE_FATAL(ortp_file_exist(filepath)==0); config = lp_config_new_with_factory(NULL,filepath); } @@ -297,7 +297,7 @@ void linphone_core_manager_start(LinphoneCoreManager *mgr, const char* rc_file, LinphoneProxyConfig* proxy; int proxy_count; - /*CU_ASSERT_EQUAL(ms_list_size(linphone_core_get_proxy_config_list(lc)),proxy_count);*/ + /*BC_ASSERT_EQUAL(ms_list_size(linphone_core_get_proxy_config_list(lc)),proxy_count, int, "%d");*/ if (check_for_proxies && rc_file) /**/ proxy_count=ms_list_size(linphone_core_get_proxy_config_list(mgr->lc)); else @@ -311,7 +311,7 @@ void linphone_core_manager_start(LinphoneCoreManager *mgr, const char* rc_file, ms_error("Did not register after %d seconds for %d proxies", REGISTER_TIMEOUT, proxy_count); } } - CU_ASSERT_EQUAL(mgr->stat.number_of_LinphoneRegistrationOk,proxy_count); + BC_ASSERT_EQUAL(mgr->stat.number_of_LinphoneRegistrationOk,proxy_count, int, "%d"); enable_codec(mgr->lc,"PCMU",8000); linphone_core_get_default_proxy(mgr->lc,&proxy); diff --git a/tester/transport_tester.c b/tester/transport_tester.c index 7cd8c5ac2..4bfae42a2 100644 --- a/tester/transport_tester.c +++ b/tester/transport_tester.c @@ -52,7 +52,7 @@ static char* get_public_contact_ip(LinphoneCore* lc) { long contact_host_ip_len; char contact_host_ip[255]; char * contact = linphone_proxy_config_get_contact(linphone_core_get_default_proxy_config(lc)); - CU_ASSERT_PTR_NOT_NULL(contact); + BC_ASSERT_PTR_NOT_NULL(contact); contact_host_ip_len = strchr(contact, ':')-contact; strncpy(contact_host_ip, contact, contact_host_ip_len); contact_host_ip[contact_host_ip_len]='\0'; @@ -72,30 +72,30 @@ static void call_with_transport_base(LinphoneTunnelMode tunnel_mode, bool_t with const char * tunnel_ip = get_ip_from_hostname("tunnel.linphone.org"); char *public_ip, *public_ip2=NULL; - CU_ASSERT_TRUE(wait_for(pauline->lc,NULL,&pauline->stat.number_of_LinphoneRegistrationOk,1)); + BC_ASSERT_TRUE(wait_for(pauline->lc,NULL,&pauline->stat.number_of_LinphoneRegistrationOk,1)); public_ip = get_public_contact_ip(pauline->lc); - CU_ASSERT_STRING_NOT_EQUAL(public_ip, tunnel_ip); + BC_ASSERT_STRING_NOT_EQUAL(public_ip, tunnel_ip); linphone_core_set_media_encryption(pauline->lc, encryption); - + if (with_video_and_ice){ /*we want to test that tunnel is able to work with long SIP message, above mtu. * Enable ICE and many codec to make the SIP message bigger*/ linphone_core_set_firewall_policy(marie->lc, LinphonePolicyUseIce); linphone_core_set_firewall_policy(pauline->lc, LinphonePolicyUseIce); - linphone_core_enable_payload_type(pauline->lc, + linphone_core_enable_payload_type(pauline->lc, linphone_core_find_payload_type(pauline->lc, "speex", 32000, 1), TRUE); - linphone_core_enable_payload_type(pauline->lc, + linphone_core_enable_payload_type(pauline->lc, linphone_core_find_payload_type(pauline->lc, "speex", 16000, 1), TRUE); - linphone_core_enable_payload_type(pauline->lc, + linphone_core_enable_payload_type(pauline->lc, linphone_core_find_payload_type(pauline->lc, "G722", 8000, 1), TRUE); - linphone_core_enable_payload_type(marie->lc, + linphone_core_enable_payload_type(marie->lc, linphone_core_find_payload_type(marie->lc, "speex", 32000, 1), TRUE); - linphone_core_enable_payload_type(marie->lc, + linphone_core_enable_payload_type(marie->lc, linphone_core_find_payload_type(marie->lc, "speex", 16000, 1), TRUE); - linphone_core_enable_payload_type(marie->lc, + linphone_core_enable_payload_type(marie->lc, linphone_core_find_payload_type(marie->lc, "G722", 8000, 1), TRUE); - + } if (tunnel_mode != LinphoneTunnelModeDisable){ @@ -111,14 +111,14 @@ static void call_with_transport_base(LinphoneTunnelMode tunnel_mode, bool_t with /* * Enabling the tunnel with sip cause another REGISTER to be made. - * In automatic mode, the udp test should conclude (assuming we have a normal network), that no + * In automatic mode, the udp test should conclude (assuming we have a normal network), that no * tunnel is needed. Thus the number of registrations should stay to 1. - * The library is missing a notification of "tunnel connectivity test finished" to enable the + * The library is missing a notification of "tunnel connectivity test finished" to enable the * full testing of the automatic mode. */ if (tunnel_mode == LinphoneTunnelModeEnable && with_sip) { - CU_ASSERT_TRUE(wait_for(pauline->lc,NULL,&pauline->stat.number_of_LinphoneRegistrationOk,2)); + BC_ASSERT_TRUE(wait_for(pauline->lc,NULL,&pauline->stat.number_of_LinphoneRegistrationOk,2)); /* Ensure that we did use the tunnel. If so, we should see contact changed from: Contact: ;.[...] To: @@ -126,32 +126,32 @@ static void call_with_transport_base(LinphoneTunnelMode tunnel_mode, bool_t with */ ms_free(public_ip); public_ip = get_public_contact_ip(pauline->lc); - CU_ASSERT_STRING_EQUAL(public_ip, tunnel_ip); + BC_ASSERT_STRING_EQUAL(public_ip, tunnel_ip); } else { public_ip2 = get_public_contact_ip(pauline->lc); - CU_ASSERT_STRING_EQUAL(public_ip, public_ip2); + BC_ASSERT_STRING_EQUAL(public_ip, public_ip2); } } - CU_ASSERT_TRUE(call(pauline,marie)); + BC_ASSERT_TRUE(call(pauline,marie)); pauline_call=linphone_core_get_current_call(pauline->lc); - CU_ASSERT_PTR_NOT_NULL(pauline_call); + BC_ASSERT_PTR_NOT_NULL(pauline_call); if (pauline_call!=NULL){ - CU_ASSERT_EQUAL(linphone_call_params_get_media_encryption(linphone_call_get_current_params(pauline_call)), + BC_ASSERT_PTR_EQUAL(linphone_call_params_get_media_encryption(linphone_call_get_current_params(pauline_call)), encryption); } if (tunnel_mode == LinphoneTunnelModeEnable && with_sip){ /* make sure the call from pauline arrived from the tunnel by checking the contact address*/ marie_call = linphone_core_get_current_call(marie->lc); - CU_ASSERT_PTR_NOT_NULL(marie_call); + BC_ASSERT_PTR_NOT_NULL(marie_call); if (marie_call){ const char *remote_contact = linphone_call_get_remote_contact(marie_call); - CU_ASSERT_PTR_NOT_NULL(remote_contact); + BC_ASSERT_PTR_NOT_NULL(remote_contact); if (remote_contact){ LinphoneAddress *tmp = linphone_address_new(remote_contact); - CU_ASSERT_PTR_NOT_NULL(tmp); + BC_ASSERT_PTR_NOT_NULL(tmp); if (tmp){ - CU_ASSERT_STRING_EQUAL(linphone_address_get_domain(tmp), tunnel_ip); + BC_ASSERT_STRING_EQUAL(linphone_address_get_domain(tmp), tunnel_ip); linphone_address_destroy(tmp); } } @@ -159,7 +159,7 @@ static void call_with_transport_base(LinphoneTunnelMode tunnel_mode, bool_t with } #ifdef VIDEO_ENABLED if (with_video_and_ice){ - CU_ASSERT_TRUE(add_video(pauline, marie, TRUE)); + BC_ASSERT_TRUE(add_video(pauline, marie, TRUE)); } #endif end_call(pauline,marie); diff --git a/tester/upnp_tester.c b/tester/upnp_tester.c index 656c9c3eb..3f39b0c9c 100644 --- a/tester/upnp_tester.c +++ b/tester/upnp_tester.c @@ -16,8 +16,7 @@ along with this program. If not, see . */ -#include -#include "CUnit/Basic.h" + #include "linphonecore.h" #include "lpconfig.h" #include "private.h" @@ -28,7 +27,7 @@ static void upnp_start_n_stop(void) { LinphoneCoreManager* lc_upnp = linphone_core_manager_new2( "upnp_rc", FALSE); wait_for(lc_upnp->lc,lc_upnp->lc,&tmp,1); #ifdef BUILD_UPNP - CU_ASSERT_TRUE(lc_upnp->lc->upnp != NULL); + BC_ASSERT_TRUE(lc_upnp->lc->upnp != NULL); #endif linphone_core_manager_destroy(lc_upnp); } @@ -37,7 +36,7 @@ static void upnp_check_state(void) { int tmp = 0; LinphoneCoreManager* lc_upnp = linphone_core_manager_new2( "upnp_rc", FALSE); wait_for(lc_upnp->lc,lc_upnp->lc,&tmp,1); - CU_ASSERT_TRUE(linphone_core_get_upnp_state(lc_upnp->lc) == LinphoneUpnpStateOk); + BC_ASSERT_TRUE(linphone_core_get_upnp_state(lc_upnp->lc) == LinphoneUpnpStateOk); linphone_core_manager_destroy(lc_upnp); } @@ -47,7 +46,7 @@ static void upnp_check_ipaddress(void) { LinphoneCoreManager* lc_upnp = linphone_core_manager_new2( "upnp_rc", FALSE); wait_for(lc_upnp->lc,lc_upnp->lc,&tmp,1); addr = linphone_core_get_upnp_external_ipaddress(lc_upnp->lc); - CU_ASSERT_TRUE(addr != NULL && strlen(addr)>=7); + BC_ASSERT_TRUE(addr != NULL && strlen(addr)>=7); linphone_core_manager_destroy(lc_upnp); } diff --git a/tester/video_tester.c b/tester/video_tester.c index e61450f02..163d2f3f0 100644 --- a/tester/video_tester.c +++ b/tester/video_tester.c @@ -19,8 +19,7 @@ #if defined(VIDEO_ENABLED) && defined(HAVE_GTK) -#include -#include "CUnit/Basic.h" + #include "linphonecore.h" #include "liblinphone_tester.h" #include "lpconfig.h" @@ -168,11 +167,11 @@ static bool_t video_call_with_params(LinphoneCoreManager* caller_mgr, LinphoneCo bool_t result = TRUE; bool_t did_received_call; - CU_ASSERT_PTR_NOT_NULL(linphone_core_invite_address_with_params(caller_mgr->lc, callee_mgr->identity, caller_params)); + BC_ASSERT_PTR_NOT_NULL(linphone_core_invite_address_with_params(caller_mgr->lc, callee_mgr->identity, caller_params)); did_received_call = wait_for(callee_mgr->lc, caller_mgr->lc, &callee_mgr->stat.number_of_LinphoneCallIncomingReceived, initial_callee.number_of_LinphoneCallIncomingReceived + 1); if (!did_received_call) return 0; - CU_ASSERT_EQUAL(caller_mgr->stat.number_of_LinphoneCallOutgoingProgress, initial_caller.number_of_LinphoneCallOutgoingProgress + 1); + BC_ASSERT_EQUAL(caller_mgr->stat.number_of_LinphoneCallOutgoingProgress, initial_caller.number_of_LinphoneCallOutgoingProgress + 1, int, "%d"); while (caller_mgr->stat.number_of_LinphoneCallOutgoingRinging != (initial_caller.number_of_LinphoneCallOutgoingRinging + 1) && caller_mgr->stat.number_of_LinphoneCallOutgoingEarlyMedia != (initial_caller.number_of_LinphoneCallOutgoingEarlyMedia + 1) @@ -182,10 +181,10 @@ static bool_t video_call_with_params(LinphoneCoreManager* caller_mgr, LinphoneCo ms_usleep(100000); } - CU_ASSERT_TRUE((caller_mgr->stat.number_of_LinphoneCallOutgoingRinging == initial_caller.number_of_LinphoneCallOutgoingRinging + 1) + BC_ASSERT_TRUE((caller_mgr->stat.number_of_LinphoneCallOutgoingRinging == initial_caller.number_of_LinphoneCallOutgoingRinging + 1) || (caller_mgr->stat.number_of_LinphoneCallOutgoingEarlyMedia == initial_caller.number_of_LinphoneCallOutgoingEarlyMedia + 1)); - CU_ASSERT_PTR_NOT_NULL(linphone_core_get_current_call_remote_address(callee_mgr->lc)); + BC_ASSERT_PTR_NOT_NULL(linphone_core_get_current_call_remote_address(callee_mgr->lc)); if(!linphone_core_get_current_call(caller_mgr->lc) || !linphone_core_get_current_call(callee_mgr->lc) || !linphone_core_get_current_call_remote_address(callee_mgr->lc)) { return 0; } @@ -193,8 +192,8 @@ static bool_t video_call_with_params(LinphoneCoreManager* caller_mgr, LinphoneCo if (automatically_accept == TRUE) { linphone_core_accept_call_with_params(callee_mgr->lc, linphone_core_get_current_call(callee_mgr->lc), callee_params); - CU_ASSERT_TRUE(wait_for(callee_mgr->lc, caller_mgr->lc, &callee_mgr->stat.number_of_LinphoneCallConnected, initial_callee.number_of_LinphoneCallConnected + 1)); - CU_ASSERT_TRUE(wait_for(callee_mgr->lc, caller_mgr->lc, &caller_mgr->stat.number_of_LinphoneCallConnected, initial_callee.number_of_LinphoneCallConnected + 1)); + BC_ASSERT_TRUE(wait_for(callee_mgr->lc, caller_mgr->lc, &callee_mgr->stat.number_of_LinphoneCallConnected, initial_callee.number_of_LinphoneCallConnected + 1)); + BC_ASSERT_TRUE(wait_for(callee_mgr->lc, caller_mgr->lc, &caller_mgr->stat.number_of_LinphoneCallConnected, initial_callee.number_of_LinphoneCallConnected + 1)); result = wait_for(callee_mgr->lc, caller_mgr->lc, &caller_mgr->stat.number_of_LinphoneCallStreamsRunning, initial_caller.number_of_LinphoneCallStreamsRunning + 1) && wait_for(callee_mgr->lc, caller_mgr->lc, &callee_mgr->stat.number_of_LinphoneCallStreamsRunning, initial_callee.number_of_LinphoneCallStreamsRunning + 1); } @@ -255,28 +254,28 @@ static void early_media_video_during_video_call_test(void) { laure_params = configure_for_early_media_video_sending(laure); /* Normal automatically accepted video call from marie to pauline. */ - CU_ASSERT_TRUE(video_call_with_params(marie, pauline, marie_params, pauline_params, TRUE)); + BC_ASSERT_TRUE(video_call_with_params(marie, pauline, marie_params, pauline_params, TRUE)); /* Wait for 2s. */ wait_for_three_cores(marie->lc, pauline->lc, NULL, 2000); /* Early media video call from laure to marie. */ - CU_ASSERT_TRUE(video_call_with_params(laure, marie, laure_params, NULL, FALSE)); + BC_ASSERT_TRUE(video_call_with_params(laure, marie, laure_params, NULL, FALSE)); /* Wait for 2s. */ wait_for_three_cores(marie->lc, pauline->lc, laure->lc, 2000); linphone_core_terminate_all_calls(marie->lc); - CU_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &marie->stat.number_of_LinphoneCallEnd, 1)); - CU_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &pauline->stat.number_of_LinphoneCallEnd, 1)); - CU_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &marie->stat.number_of_LinphoneCallReleased, 1)); - CU_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &pauline->stat.number_of_LinphoneCallReleased, 1)); - CU_ASSERT_TRUE(wait_for(marie->lc, laure->lc, &marie->stat.number_of_LinphoneCallEnd, 1)); - CU_ASSERT_TRUE(wait_for(marie->lc, laure->lc, &laure->stat.number_of_LinphoneCallEnd, 1)); + BC_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &marie->stat.number_of_LinphoneCallEnd, 1)); + BC_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &pauline->stat.number_of_LinphoneCallEnd, 1)); + BC_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &marie->stat.number_of_LinphoneCallReleased, 1)); + BC_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &pauline->stat.number_of_LinphoneCallReleased, 1)); + BC_ASSERT_TRUE(wait_for(marie->lc, laure->lc, &marie->stat.number_of_LinphoneCallEnd, 1)); + BC_ASSERT_TRUE(wait_for(marie->lc, laure->lc, &laure->stat.number_of_LinphoneCallEnd, 1)); - CU_ASSERT_EQUAL(marie->stat.number_of_video_windows_created, 2); - CU_ASSERT_EQUAL(pauline->stat.number_of_video_windows_created, 1); - CU_ASSERT_EQUAL(laure->stat.number_of_video_windows_created, 1); + BC_ASSERT_EQUAL(marie->stat.number_of_video_windows_created, 2, int, "%d"); + BC_ASSERT_EQUAL(pauline->stat.number_of_video_windows_created, 1, int, "%d"); + BC_ASSERT_EQUAL(laure->stat.number_of_video_windows_created, 1, int, "%d"); linphone_call_params_unref(marie_params); linphone_call_params_unref(pauline_params); @@ -311,22 +310,22 @@ static void two_incoming_early_media_video_calls_test(void) { ms_free(ringback_path); /* Early media video call from pauline to marie. */ - CU_ASSERT_TRUE(video_call_with_params(pauline, marie, pauline_params, NULL, FALSE)); + BC_ASSERT_TRUE(video_call_with_params(pauline, marie, pauline_params, NULL, FALSE)); /* Wait for 2s. */ wait_for_three_cores(marie->lc, pauline->lc, NULL, 2000); /* Early media video call from laure to marie. */ - CU_ASSERT_TRUE(video_call_with_params(laure, marie, laure_params, NULL, FALSE)); + BC_ASSERT_TRUE(video_call_with_params(laure, marie, laure_params, NULL, FALSE)); /* Wait for 2s. */ wait_for_three_cores(marie->lc, pauline->lc, laure->lc, 2000); - CU_ASSERT_EQUAL(linphone_core_get_calls_nb(marie->lc), 2); + BC_ASSERT_EQUAL(linphone_core_get_calls_nb(marie->lc), 2, int, "%d"); if (linphone_core_get_calls_nb(marie->lc) == 2) { calls_list = linphone_core_get_calls(marie->lc); call = (LinphoneCall *)ms_list_nth_data(calls_list, 0); - CU_ASSERT_PTR_NOT_NULL(call); + BC_ASSERT_PTR_NOT_NULL(call); if (call != NULL) { LinphoneCallParams *params = linphone_call_params_copy(linphone_call_get_current_params(call)); linphone_call_params_set_audio_direction(params, LinphoneMediaDirectionSendRecv); @@ -339,16 +338,16 @@ static void two_incoming_early_media_video_calls_test(void) { } linphone_core_terminate_all_calls(marie->lc); - CU_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &marie->stat.number_of_LinphoneCallEnd, 1)); - CU_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &pauline->stat.number_of_LinphoneCallEnd, 1)); - CU_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &marie->stat.number_of_LinphoneCallReleased, 1)); - CU_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &pauline->stat.number_of_LinphoneCallReleased, 1)); - CU_ASSERT_TRUE(wait_for(marie->lc, laure->lc, &marie->stat.number_of_LinphoneCallEnd, 1)); - CU_ASSERT_TRUE(wait_for(marie->lc, laure->lc, &laure->stat.number_of_LinphoneCallEnd, 1)); + BC_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &marie->stat.number_of_LinphoneCallEnd, 1)); + BC_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &pauline->stat.number_of_LinphoneCallEnd, 1)); + BC_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &marie->stat.number_of_LinphoneCallReleased, 1)); + BC_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &pauline->stat.number_of_LinphoneCallReleased, 1)); + BC_ASSERT_TRUE(wait_for(marie->lc, laure->lc, &marie->stat.number_of_LinphoneCallEnd, 1)); + BC_ASSERT_TRUE(wait_for(marie->lc, laure->lc, &laure->stat.number_of_LinphoneCallEnd, 1)); - CU_ASSERT_EQUAL(marie->stat.number_of_video_windows_created, 2); - CU_ASSERT_EQUAL(pauline->stat.number_of_video_windows_created, 1); - CU_ASSERT_EQUAL(laure->stat.number_of_video_windows_created, 1); + BC_ASSERT_EQUAL(marie->stat.number_of_video_windows_created, 2, int, "%d"); + BC_ASSERT_EQUAL(pauline->stat.number_of_video_windows_created, 1, int, "%d"); + BC_ASSERT_EQUAL(laure->stat.number_of_video_windows_created, 1, int, "%d"); linphone_call_params_unref(marie_params); linphone_call_params_unref(pauline_params); @@ -370,23 +369,23 @@ static void early_media_video_with_inactive_audio(void) { pauline_params = configure_for_early_media_video_sending(pauline); /* Early media video call from pauline to marie. */ - CU_ASSERT_TRUE(video_call_with_params(pauline, marie, pauline_params, NULL, FALSE)); + BC_ASSERT_TRUE(video_call_with_params(pauline, marie, pauline_params, NULL, FALSE)); /* Wait for 2s. */ wait_for_three_cores(marie->lc, pauline->lc, NULL, 2000); /* Check that we are in LinphoneCallOutgoingEarlyMedia state and that the ringstream is present meaning we are playing the ringback tone. */ - CU_ASSERT_EQUAL(linphone_call_get_state(linphone_core_get_current_call(pauline->lc)), LinphoneCallOutgoingEarlyMedia); - CU_ASSERT_PTR_NOT_NULL(pauline->lc->ringstream); + BC_ASSERT_EQUAL(linphone_call_get_state(linphone_core_get_current_call(pauline->lc)), LinphoneCallOutgoingEarlyMedia, int, "%d"); + BC_ASSERT_PTR_NOT_NULL(pauline->lc->ringstream); linphone_core_terminate_all_calls(marie->lc); - CU_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &marie->stat.number_of_LinphoneCallEnd, 1)); - CU_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &pauline->stat.number_of_LinphoneCallEnd, 1)); - CU_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &marie->stat.number_of_LinphoneCallReleased, 1)); - CU_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &pauline->stat.number_of_LinphoneCallReleased, 1)); + BC_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &marie->stat.number_of_LinphoneCallEnd, 1)); + BC_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &pauline->stat.number_of_LinphoneCallEnd, 1)); + BC_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &marie->stat.number_of_LinphoneCallReleased, 1)); + BC_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &pauline->stat.number_of_LinphoneCallReleased, 1)); - CU_ASSERT_EQUAL(marie->stat.number_of_video_windows_created, 1); - CU_ASSERT_EQUAL(pauline->stat.number_of_video_windows_created, 1); + BC_ASSERT_EQUAL(marie->stat.number_of_video_windows_created, 1, int, "%d"); + BC_ASSERT_EQUAL(pauline->stat.number_of_video_windows_created, 1, int, "%d"); linphone_call_params_unref(marie_params); linphone_call_params_unref(pauline_params); @@ -432,52 +431,52 @@ static void forked_outgoing_early_media_video_call_with_inactive_audio_test(void linphone_core_invite_address_with_params(pauline->lc, marie1->identity, pauline_params); linphone_call_params_destroy(pauline_params); - CU_ASSERT_TRUE(wait_for_list(lcs, &marie1->stat.number_of_LinphoneCallIncomingEarlyMedia, 1, 3000)); - CU_ASSERT_TRUE(wait_for_list(lcs, &marie2->stat.number_of_LinphoneCallIncomingEarlyMedia, 1, 3000)); - CU_ASSERT_TRUE(wait_for_list(lcs, &pauline->stat.number_of_LinphoneCallOutgoingEarlyMedia, 1, 3000)); + BC_ASSERT_TRUE(wait_for_list(lcs, &marie1->stat.number_of_LinphoneCallIncomingEarlyMedia, 1, 3000)); + BC_ASSERT_TRUE(wait_for_list(lcs, &marie2->stat.number_of_LinphoneCallIncomingEarlyMedia, 1, 3000)); + BC_ASSERT_TRUE(wait_for_list(lcs, &pauline->stat.number_of_LinphoneCallOutgoingEarlyMedia, 1, 3000)); pauline_call = linphone_core_get_current_call(pauline->lc); marie1_call = linphone_core_get_current_call(marie1->lc); marie2_call = linphone_core_get_current_call(marie2->lc); - CU_ASSERT_PTR_NOT_NULL(pauline_call); - CU_ASSERT_PTR_NOT_NULL(marie1_call); - CU_ASSERT_PTR_NOT_NULL(marie2_call); + BC_ASSERT_PTR_NOT_NULL(pauline_call); + BC_ASSERT_PTR_NOT_NULL(marie1_call); + BC_ASSERT_PTR_NOT_NULL(marie2_call); if (pauline_call && marie1_call && marie2_call) { /* wait a bit that streams are established */ wait_for_list(lcs, &dummy, 1, 6000); - CU_ASSERT_TRUE(linphone_call_get_audio_stats(pauline_call)->download_bandwidth == 0); - CU_ASSERT_TRUE(linphone_call_get_audio_stats(marie1_call)->download_bandwidth == 0); - CU_ASSERT_TRUE(linphone_call_get_audio_stats(marie2_call)->download_bandwidth == 0); - CU_ASSERT_TRUE(linphone_call_get_video_stats(pauline_call)->download_bandwidth == 0); - CU_ASSERT_TRUE(linphone_call_get_video_stats(marie1_call)->download_bandwidth > 0); - CU_ASSERT_TRUE(linphone_call_get_video_stats(marie2_call)->download_bandwidth > 0); + BC_ASSERT_TRUE(linphone_call_get_audio_stats(pauline_call)->download_bandwidth == 0); + BC_ASSERT_TRUE(linphone_call_get_audio_stats(marie1_call)->download_bandwidth == 0); + BC_ASSERT_TRUE(linphone_call_get_audio_stats(marie2_call)->download_bandwidth == 0); + BC_ASSERT_TRUE(linphone_call_get_video_stats(pauline_call)->download_bandwidth == 0); + BC_ASSERT_TRUE(linphone_call_get_video_stats(marie1_call)->download_bandwidth > 0); + BC_ASSERT_TRUE(linphone_call_get_video_stats(marie2_call)->download_bandwidth > 0); linphone_call_params_set_audio_direction(marie1_params, LinphoneMediaDirectionSendRecv); linphone_core_accept_call_with_params(marie1->lc, linphone_core_get_current_call(marie1->lc), marie1_params); - CU_ASSERT_TRUE(wait_for_list(lcs, &marie1->stat.number_of_LinphoneCallStreamsRunning, 1, 3000)); - CU_ASSERT_TRUE(wait_for_list(lcs, &pauline->stat.number_of_LinphoneCallStreamsRunning, 1, 3000)); + BC_ASSERT_TRUE(wait_for_list(lcs, &marie1->stat.number_of_LinphoneCallStreamsRunning, 1, 3000)); + BC_ASSERT_TRUE(wait_for_list(lcs, &pauline->stat.number_of_LinphoneCallStreamsRunning, 1, 3000)); /* marie2 should get her call terminated */ - CU_ASSERT_TRUE(wait_for_list(lcs, &marie2->stat.number_of_LinphoneCallEnd, 1, 1000)); + BC_ASSERT_TRUE(wait_for_list(lcs, &marie2->stat.number_of_LinphoneCallEnd, 1, 1000)); /*wait a bit that streams are established*/ wait_for_list(lcs, &dummy, 1, 3000); - CU_ASSERT_TRUE(linphone_call_get_audio_stats(pauline_call)->download_bandwidth > 71); - CU_ASSERT_TRUE(linphone_call_get_audio_stats(marie1_call)->download_bandwidth > 71); - CU_ASSERT_TRUE(linphone_call_get_video_stats(pauline_call)->download_bandwidth > 0); - CU_ASSERT_TRUE(linphone_call_get_video_stats(marie1_call)->download_bandwidth > 0); + BC_ASSERT_TRUE(linphone_call_get_audio_stats(pauline_call)->download_bandwidth > 71); + BC_ASSERT_TRUE(linphone_call_get_audio_stats(marie1_call)->download_bandwidth > 71); + BC_ASSERT_TRUE(linphone_call_get_video_stats(pauline_call)->download_bandwidth > 0); + BC_ASSERT_TRUE(linphone_call_get_video_stats(marie1_call)->download_bandwidth > 0); /* send an INFO in reverse side to check that dialogs are properly established */ info = linphone_core_create_info_message(marie1->lc); linphone_call_send_info_message(marie1_call, info); - CU_ASSERT_TRUE(wait_for_list(lcs, &pauline->stat.number_of_inforeceived, 1, 3000)); + BC_ASSERT_TRUE(wait_for_list(lcs, &pauline->stat.number_of_inforeceived, 1, 3000)); } linphone_core_terminate_all_calls(pauline->lc); - CU_ASSERT_TRUE(wait_for_list(lcs, &pauline->stat.number_of_LinphoneCallEnd, 1, 3000)); - CU_ASSERT_TRUE(wait_for_list(lcs, &marie1->stat.number_of_LinphoneCallEnd, 1, 3000)); + BC_ASSERT_TRUE(wait_for_list(lcs, &pauline->stat.number_of_LinphoneCallEnd, 1, 3000)); + BC_ASSERT_TRUE(wait_for_list(lcs, &marie1->stat.number_of_LinphoneCallEnd, 1, 3000)); linphone_call_params_destroy(marie1_params); linphone_call_params_destroy(marie2_params); From 38ff54a6bf747b07e3062de6af02d066ba66ca87 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Thu, 14 May 2015 08:42:29 +0200 Subject: [PATCH 146/157] fix comilation issue for android build --- tester/call_tester.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tester/call_tester.c b/tester/call_tester.c index 2cc6455b9..f0cf5facd 100644 --- a/tester/call_tester.c +++ b/tester/call_tester.c @@ -3086,6 +3086,7 @@ static void multiple_early_media(void) { linphone_core_manager_destroy(marie2); linphone_core_manager_destroy(pauline); } +#endif void check_media_direction(LinphoneCoreManager* mgr, LinphoneCall *call, MSList* lcs,LinphoneMediaDirection audio_dir, LinphoneMediaDirection video_dir) { BC_ASSERT_PTR_NOT_NULL(call); @@ -3095,11 +3096,12 @@ void check_media_direction(LinphoneCoreManager* mgr, LinphoneCall *call, MSList* int dummy = 0; const LinphoneCallParams *params = linphone_call_get_current_params(call); BC_ASSERT_EQUAL(audio_dir,linphone_call_params_get_audio_direction(params), int, "%d"); +#ifdef VIDEO_ENABLED BC_ASSERT_EQUAL(video_dir,linphone_call_params_get_video_direction(params), int, "%d"); - linphone_call_set_next_video_frame_decoded_callback(call,linphone_call_cb,mgr->lc); linphone_call_send_vfu_request(call); + wait_for_list(lcs,&dummy,1,2000); /*on some device, it may take 3 to 4s to get audio from mic*/ switch (video_dir) { @@ -3117,7 +3119,7 @@ void check_media_direction(LinphoneCoreManager* mgr, LinphoneCall *call, MSList* } BC_ASSERT_TRUE(wait_for_list(lcs, &mgr->stat.number_of_IframeDecoded,current_recv_iframe + expected_recv_iframe,3000)); - +#endif switch (audio_dir) { case LinphoneMediaDirectionInactive: BC_ASSERT_TRUE(linphone_call_get_audio_stats(call)->upload_bandwidth<5); @@ -3135,7 +3137,7 @@ void check_media_direction(LinphoneCoreManager* mgr, LinphoneCall *call, MSList* } } - +#ifdef VIDEO_ENABLED static void accept_call_in_send_only_base(LinphoneCoreManager* pauline, LinphoneCoreManager *marie, MSList *lcs) { #define DEFAULT_WAIT_FOR 10000 LinphoneCallParams *params; From d1d54e831a14c32438f546ebf4a0ff8eced46531 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Thu, 14 May 2015 09:06:03 +0200 Subject: [PATCH 147/157] fix audio only compilation issue --- tester/call_tester.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tester/call_tester.c b/tester/call_tester.c index f0cf5facd..adfdf960f 100644 --- a/tester/call_tester.c +++ b/tester/call_tester.c @@ -3091,12 +3091,12 @@ static void multiple_early_media(void) { void check_media_direction(LinphoneCoreManager* mgr, LinphoneCall *call, MSList* lcs,LinphoneMediaDirection audio_dir, LinphoneMediaDirection video_dir) { BC_ASSERT_PTR_NOT_NULL(call); if (call) { + const LinphoneCallParams *params = linphone_call_get_current_params(call); +#ifdef VIDEO_ENABLED int current_recv_iframe = mgr->stat.number_of_IframeDecoded; int expected_recv_iframe=0; int dummy = 0; - const LinphoneCallParams *params = linphone_call_get_current_params(call); - BC_ASSERT_EQUAL(audio_dir,linphone_call_params_get_audio_direction(params), int, "%d"); -#ifdef VIDEO_ENABLED + BC_ASSERT_EQUAL(video_dir,linphone_call_params_get_video_direction(params), int, "%d"); linphone_call_set_next_video_frame_decoded_callback(call,linphone_call_cb,mgr->lc); linphone_call_send_vfu_request(call); @@ -3120,6 +3120,7 @@ void check_media_direction(LinphoneCoreManager* mgr, LinphoneCall *call, MSList* BC_ASSERT_TRUE(wait_for_list(lcs, &mgr->stat.number_of_IframeDecoded,current_recv_iframe + expected_recv_iframe,3000)); #endif + BC_ASSERT_EQUAL(audio_dir,linphone_call_params_get_audio_direction(params), int, "%d"); switch (audio_dir) { case LinphoneMediaDirectionInactive: BC_ASSERT_TRUE(linphone_call_get_audio_stats(call)->upload_bandwidth<5); From 028fe666625d1c020030987a8751ebda8ac5fb34 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Thu, 14 May 2015 12:28:25 +0200 Subject: [PATCH 148/157] fix broken offer answer with SDP connection address --- coreapi/linphonecall.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c index 4d44000c3..fa21303f6 100644 --- a/coreapi/linphonecall.c +++ b/coreapi/linphonecall.c @@ -1071,9 +1071,10 @@ LinphoneCall * linphone_call_new_incoming(LinphoneCore *lc, LinphoneAddress *fro linphone_call_set_compatible_incoming_call_parameters(call, md); /* set multicast role & address if any*/ for (i=0;inb_streams;i++){ - if (!sal_call_is_offerer(op) && ms_is_multicast(md->streams[i].rtp_addr)) + if (!sal_call_is_offerer(op) && ms_is_multicast(md->streams[i].rtp_addr)){ md->streams[i].multicast_role = SalMulticastReceiver; - strncpy(call->media_ports[i].multicast_ip,md->streams[i].rtp_addr,sizeof(call->media_ports[i].multicast_ip)); + strncpy(call->media_ports[i].multicast_ip,md->streams[i].rtp_addr,sizeof(call->media_ports[i].multicast_ip)); + } } } From 5c7d1f0396a17093f9558ca6f22b78e338502d3b Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Fri, 15 May 2015 00:35:01 +0200 Subject: [PATCH 149/157] add test for stereo support with opus --- mediastreamer2 | 2 +- tester/call_tester.c | 92 ++++++++++++++++++++++++++++++++++-- tester/liblinphone_tester.h | 2 +- tester/sounds/vrroom.wav | Bin 0 -> 1123520 bytes tester/tester.c | 6 +-- 5 files changed, 93 insertions(+), 9 deletions(-) create mode 100644 tester/sounds/vrroom.wav diff --git a/mediastreamer2 b/mediastreamer2 index 2a5bf7675..13f519ca6 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 2a5bf7675c635945248d5e04428736c85069d773 +Subproject commit 13f519ca621bb0a891e0b344cfb234ba3f104810 diff --git a/tester/call_tester.c b/tester/call_tester.c index adfdf960f..7b8323afb 100644 --- a/tester/call_tester.c +++ b/tester/call_tester.c @@ -2364,7 +2364,7 @@ static void call_with_file_player(void) { { double similar; const int threshold = 90; - BC_ASSERT_EQUAL(ms_audio_diff(hellopath,recordpath,&similar,audio_cmp_min_overlap,NULL,NULL), 0, int, "%d"); + BC_ASSERT_EQUAL(ms_audio_diff(hellopath,recordpath,&similar,audio_cmp_max_shift,NULL,NULL), 0, int, "%d"); BC_ASSERT_GREATER(100*similar, threshold, int, "%d"); BC_ASSERT_LOWER(100*similar, 100, int, "%d"); if (threshold < 100*similar && 100*similar < 100) { @@ -2442,7 +2442,7 @@ static void call_with_mkv_file_player(void) { 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)); #ifdef DO_AUDIO_CMP - BC_ASSERT_TRUE(ms_audio_diff(hellowav,recordpath,&similar,audio_cmp_min_overlap,NULL,NULL)==0); + BC_ASSERT_TRUE(ms_audio_diff(hellowav,recordpath,&similar,audio_cmp_max_shift,NULL,NULL)==0); BC_ASSERT_TRUE(similar>threshold); BC_ASSERT_TRUE(similar<=1.0); if(similar>threshold && similar<=1.0) { @@ -4057,6 +4057,89 @@ static void video_call_ice_params() { } #endif +static void simple_stereo_call(const char *codec_name, int clock_rate, int bitrate_override) { + int begin; + int leaked_objects; + LinphoneCoreManager* marie; + LinphoneCoreManager* pauline; + PayloadType *pt; + char *stereo_file = ms_strdup_printf("%s/%s",bc_tester_read_dir_prefix,"sounds/vrroom.wav"); + char *recordpath = create_filepath(bc_tester_writable_dir_prefix, "stereo-record", "wav"); + int dummy=0; + + belle_sip_object_enable_leak_detector(TRUE); + begin=belle_sip_object_get_object_count(); + + marie = linphone_core_manager_new( "marie_rc"); + pauline = linphone_core_manager_new( "pauline_rc"); + + /*make sure we have opus*/ + pt = linphone_core_find_payload_type(marie->lc, codec_name, clock_rate, 2); + if (!pt) { + ms_warning("%s not available, stereo with %s not tested.",codec_name, codec_name); + goto end; + } + payload_type_set_recv_fmtp(pt, NULL); /*remove fmtp that by default contain stereo=0*/ + if (bitrate_override) linphone_core_set_payload_type_bitrate(marie->lc, pt, bitrate_override); + pt = linphone_core_find_payload_type(pauline->lc, codec_name, clock_rate, 2); + payload_type_set_recv_fmtp(pt, NULL); + if (bitrate_override) linphone_core_set_payload_type_bitrate(pauline->lc, pt, bitrate_override); + + disable_all_audio_codecs_except_one(marie->lc, codec_name, clock_rate); + disable_all_audio_codecs_except_one(pauline->lc, codec_name, clock_rate); + + linphone_core_set_use_files(marie->lc, TRUE); + linphone_core_set_play_file(marie->lc, stereo_file); + linphone_core_set_use_files(pauline->lc, TRUE); + linphone_core_set_record_file(pauline->lc, recordpath); + + remove(recordpath); + + /*stereo is supported only without volume control, echo canceller...*/ + lp_config_set_string(marie->lc->config,"sound","features","NONE"); + lp_config_set_string(pauline->lc->config,"sound","features","NONE"); + + if (!BC_ASSERT_TRUE(call(marie,pauline))) goto end; + wait_for_until(marie->lc, pauline->lc, &dummy, 1,6000); + end_call(marie,pauline); + + if (clock_rate!=48000) ms_warning("Similarity checking not implemented for files not having the same sampling rate"); + else{ +#if !defined(__arm__) && !defined(__arm64__) && !TARGET_IPHONE_SIMULATOR && !defined(ANDROID) + double similar; + const int threshold = 70; + CU_ASSERT_EQUAL(ms_audio_diff(stereo_file,recordpath,&similar,audio_cmp_max_shift,NULL,NULL), 0); + CU_ASSERT_TRUE(100*similar >= threshold); + CU_ASSERT_TRUE(100*similar <= 100); + if (threshold < 100*similar && 100*similar <= 100) { + ms_error("similarity is %g", similar); + //remove(recordpath); + } +#endif + } + + +end: + linphone_core_manager_destroy(marie); + linphone_core_manager_destroy(pauline); + ms_free(stereo_file); + ms_free(recordpath); + + leaked_objects=belle_sip_object_get_object_count()-begin; + CU_ASSERT_TRUE(leaked_objects==0); + if (leaked_objects>0){ + belle_sip_object_dump_active_objects(); + } +} + +static void simple_stereo_call_l16(void){ + simple_stereo_call("L16", 44100, 0); +} + +static void simple_stereo_call_opus(void){ + simple_stereo_call("opus", 48000, 150); +} + test_t call_tests[] = { { "Phone number normalization", phone_number_normalization }, { "Early declined call", early_declined_call }, @@ -4176,8 +4259,9 @@ test_t call_tests[] = { { "Outgoing REINVITE with invalid SDP in ACK",outgoing_reinvite_with_invalid_ack_sdp}, { "Call with generic CN", call_with_generic_cn }, { "Call with transport change after released", call_with_transport_change_after_released }, - { "Unsuccessful call with transport change after released",unsucessfull_call_with_transport_change_after_released} - + { "Unsuccessful call with transport change after released",unsucessfull_call_with_transport_change_after_released}, + { "Simple stereo call with L16", simple_stereo_call_l16 }, + { "Simple stereo call with opus", simple_stereo_call_opus } }; test_suite_t call_test_suite = { diff --git a/tester/liblinphone_tester.h b/tester/liblinphone_tester.h index 28fcfad3b..4fb0e2fa0 100644 --- a/tester/liblinphone_tester.h +++ b/tester/liblinphone_tester.h @@ -310,7 +310,7 @@ bool_t pause_call_1(LinphoneCoreManager* mgr_1,LinphoneCall* call_1,LinphoneCore bool_t compare_files(const char *path1, const char *path2); void check_media_direction(LinphoneCoreManager* mgr, LinphoneCall *call, MSList* lcs,LinphoneMediaDirection audio_dir, LinphoneMediaDirection video_dir); -static const int audio_cmp_min_overlap=90; +static const int audio_cmp_max_shift=20; #endif /* LIBLINPHONE_TESTER_H_ */ diff --git a/tester/sounds/vrroom.wav b/tester/sounds/vrroom.wav new file mode 100644 index 0000000000000000000000000000000000000000..673a3addc70e3d06b7eff1a3e45ce879e11bdf87 GIT binary patch literal 1123520 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

C4a4sojSln-;*nFdzcm+scpiBJOYmLi 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Ξj;w%l8 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

+r}f!YdnWA12TB23q20x+(rntJEzxZI{p)Kh$UO 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�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�dFAZ-LMvCy-G#+&PD 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

$HUT@1S>C7k~7nSYZ$0x)`Uaxwih` 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%0D; zdK?5aJshoU($q?e&nE*t<8ui)IJ{pTDPg6T+&mW4dEoks%2U2)JbuoKR#%?iU)oy} z$P$_*}Dl>|C$f#$0v3ANe{7D8WrGT6FG4$)mW zN;IO@e|Q95iN|`$zrkC6UifAmN6&^ZikL9{X?$=}7CPGmcxN$BC8$UaJVXAVu*X6@#

c~wDw5f$w(rm}P2@6SPBrZnnr*44AT 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 #endif - static bool_t liblinphone_tester_ipv6_enabled=FALSE; - static int liblinphone_tester_keep_accounts_flag = 0; - static int manager_count = 0; +static bool_t liblinphone_tester_ipv6_enabled=FALSE; +static int liblinphone_tester_keep_accounts_flag = 0; +static int manager_count = 0; const char* test_domain="sipopen.example.org"; const char* auth_domain="sip.example.org"; From 8eb0f91a9291964781db0658e6cd25a4b1f54a98 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Fri, 15 May 2015 14:59:04 +0200 Subject: [PATCH 150/157] More improvements on local refs in JNI layer for Android --- coreapi/linphonecore_jni.cc | 70 +++++++++++++++++++++++++++---------- 1 file changed, 51 insertions(+), 19 deletions(-) diff --git a/coreapi/linphonecore_jni.cc b/coreapi/linphonecore_jni.cc index af0881cce..b310ac543 100644 --- a/coreapi/linphonecore_jni.cc +++ b/coreapi/linphonecore_jni.cc @@ -1049,12 +1049,16 @@ public: } LinphoneCoreVTable *table = linphone_core_get_current_vtable(lc); LinphoneCoreData* lcData = (LinphoneCoreData*)linphone_core_v_table_get_user_data(table); + jobject jcontent = content ? create_java_linphone_content(env, content) : NULL; env->CallVoidMethod(lcData->listener, lcData->fileTransferProgressIndicationId, lcData->core, (jmsg = getChatMessage(env, message)), - content ? create_java_linphone_content(env, content) : NULL, + jcontent, progress); + if (jcontent) { + env->DeleteLocalRef(jcontent); + } } static void fileTransferSend(LinphoneCore *lc, LinphoneChatMessage *message, const LinphoneContent* content, char* buff, size_t* size) { @@ -1068,13 +1072,21 @@ public: } LinphoneCoreVTable *table = linphone_core_get_current_vtable(lc); LinphoneCoreData* lcData = (LinphoneCoreData*)linphone_core_v_table_get_user_data(table); + jobject jcontent = content ? create_java_linphone_content(env, content) : NULL; + jobject jbuffer = buff ? env->NewDirectByteBuffer(buff, asking) : NULL; *size = env->CallIntMethod(lcData->listener, lcData->fileTransferSendId, lcData->core, (jmsg = getChatMessage(env, message)), - content ? create_java_linphone_content(env, content) : NULL, - buff ? env->NewDirectByteBuffer(buff, asking) : NULL, + jcontent, + jbuffer, asking); + if (jcontent) { + env->DeleteLocalRef(jcontent); + } + if (jbuffer) { + env->DeleteLocalRef(jbuffer); + } } static void fileTransferRecv(LinphoneCore *lc, LinphoneChatMessage *message, const LinphoneContent* content, const char* buff, size_t size) { @@ -1090,14 +1102,18 @@ public: jbyteArray jbytes = env->NewByteArray(size); env->SetByteArrayRegion(jbytes, 0, size, (jbyte*)buff); + jobject jcontent = content ? create_java_linphone_content(env, content) : NULL; env->CallVoidMethod(lcData->listener, lcData->fileTransferRecvId, lcData->core, (jmsg = getChatMessage(env, message)), - content ? create_java_linphone_content(env, content) : NULL, + jcontent, jbytes, size); + if (jcontent) { + env->DeleteLocalRef(jcontent); + } } static void logCollectionUploadProgressIndication(LinphoneCore *lc, size_t offset, size_t total) { JNIEnv *env = 0; @@ -3316,15 +3332,16 @@ static void message_state_changed(LinphoneChatMessage* msg, LinphoneChatMessageS jclass clazz = (jclass) env->GetObjectClass(listener); jmethodID method = env->GetMethodID(clazz, "onLinphoneChatMessageStateChanged","(Lorg/linphone/core/LinphoneChatMessage;Lorg/linphone/core/LinphoneChatMessage$State;)V"); jobject jmessage = getChatMessage(env, msg); - - jclass chatMessageStateClass = (jclass)env->NewGlobalRef(env->FindClass("org/linphone/core/LinphoneChatMessage$State")); + env->DeleteLocalRef(clazz); + + jclass chatMessageStateClass = (jclass)env->FindClass("org/linphone/core/LinphoneChatMessage$State"); jmethodID chatMessageStateFromIntId = env->GetStaticMethodID(chatMessageStateClass, "fromInt","(I)Lorg/linphone/core/LinphoneChatMessage$State;"); env->CallVoidMethod(listener, method, jmessage, env->CallStaticObjectMethod(chatMessageStateClass, chatMessageStateFromIntId, (jint)state)); if (state == LinphoneChatMessageStateDelivered || state == LinphoneChatMessageStateNotDelivered) { env->DeleteGlobalRef(listener); - env->DeleteGlobalRef(chatMessageStateClass); } + env->DeleteLocalRef(chatMessageStateClass); } static void file_transfer_progress_indication(LinphoneChatMessage *msg, const LinphoneContent* content, size_t offset, size_t total) { @@ -3338,6 +3355,7 @@ static void file_transfer_progress_indication(LinphoneChatMessage *msg, const Li jobject listener = (jobject) msg->cb_ud; jclass clazz = (jclass) env->GetObjectClass(listener); jmethodID method = env->GetMethodID(clazz, "onLinphoneChatMessageFileTransferProgressChanged", "(Lorg/linphone/core/LinphoneChatMessage;Lorg/linphone/core/LinphoneContent;II)V"); + env->DeleteLocalRef(clazz); jobject jmessage = getChatMessage(env, msg); jobject jcontent = content ? create_java_linphone_content(env, content) : NULL; env->CallVoidMethod(listener, method, jmessage, jcontent, offset, total); @@ -3357,6 +3375,8 @@ static void file_transfer_recv(LinphoneChatMessage *msg, const LinphoneContent* jobject listener = (jobject) msg->cb_ud; jclass clazz = (jclass) env->GetObjectClass(listener); jmethodID method = env->GetMethodID(clazz, "onLinphoneChatMessageFileTransferReceived", "(Lorg/linphone/core/LinphoneChatMessage;Lorg/linphone/core/LinphoneContent;Lorg/linphone/core/LinphoneBuffer;)V"); + env->DeleteLocalRef(clazz); + jobject jmessage = getChatMessage(env, msg); jobject jbuffer = buffer ? create_java_linphone_buffer(env, buffer) : NULL; jobject jcontent = content ? create_java_linphone_content(env, content) : NULL; @@ -3381,6 +3401,8 @@ static LinphoneBuffer* file_transfer_send(LinphoneChatMessage *msg, const Linph jobject listener = (jobject) msg->cb_ud; jclass clazz = (jclass) env->GetObjectClass(listener); jmethodID method = env->GetMethodID(clazz, "onLinphoneChatMessageFileTransferSent","(Lorg/linphone/core/LinphoneChatMessage;Lorg/linphone/core/LinphoneContent;IILorg/linphone/core/LinphoneBuffer;)V"); + env->DeleteLocalRef(clazz); + jobject jmessage = getChatMessage(env, msg); jobject jbuffer = create_java_linphone_buffer(env, NULL); jobject jcontent = content ? create_java_linphone_content(env, content) : NULL; @@ -4654,7 +4676,7 @@ static jobject create_java_linphone_content(JNIEnv *env, const LinphoneContent * jint jsize = 0; const LinphoneContentPrivate *content = LINPHONE_CONTENT_PRIVATE(icontent); - contentClass = (jclass)env->NewGlobalRef(env->FindClass("org/linphone/core/LinphoneContentImpl")); + contentClass = (jclass)env->FindClass("org/linphone/core/LinphoneContentImpl"); ctor = env->GetMethodID(contentClass,"", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[BLjava/lang/String;I)V"); jtype = env->NewStringUTF(content->type); @@ -4669,7 +4691,17 @@ static jobject create_java_linphone_content(JNIEnv *env, const LinphoneContent * } jobject jobj = env->NewObject(contentClass, ctor, jname, jtype, jsubtype, jdata, jencoding, jsize); - env->DeleteGlobalRef(contentClass); + + env->DeleteLocalRef(contentClass); + env->DeleteLocalRef(jtype); + env->DeleteLocalRef(jsubtype); + if (jencoding) { + env->DeleteLocalRef(jencoding); + } + if (jname) { + env->DeleteLocalRef(jname); + } + return jobj; } @@ -4679,7 +4711,7 @@ static jobject create_java_linphone_buffer(JNIEnv *env, const LinphoneBuffer *bu jbyteArray jdata = NULL; jint jsize = 0; - bufferClass = (jclass)env->NewGlobalRef(env->FindClass("org/linphone/core/LinphoneBufferImpl")); + bufferClass = (jclass)env->FindClass("org/linphone/core/LinphoneBufferImpl"); ctor = env->GetMethodID(bufferClass,"", "([BI)V"); jsize = buffer ? (jint) buffer->size : 0; @@ -4689,32 +4721,32 @@ static jobject create_java_linphone_buffer(JNIEnv *env, const LinphoneBuffer *bu } jobject jobj = env->NewObject(bufferClass, ctor, jdata, jsize); - env->DeleteGlobalRef(bufferClass); + env->DeleteLocalRef(bufferClass); return jobj; } static LinphoneBuffer* create_c_linphone_buffer_from_java_linphone_buffer(JNIEnv *env, jobject jbuffer) { jclass bufferClass; jmethodID getSizeMethod, getDataMethod; - LinphoneBuffer *buffer; + LinphoneBuffer *buffer = NULL; jint jsize; jobject jdata; jbyteArray jcontent; uint8_t *content; - bufferClass = (jclass)env->NewGlobalRef(env->FindClass("org/linphone/core/LinphoneBufferImpl")); + bufferClass = (jclass)env->FindClass("org/linphone/core/LinphoneBufferImpl"); getSizeMethod = env->GetMethodID(bufferClass, "getSize", "()I"); getDataMethod = env->GetMethodID(bufferClass, "getContent", "()[B"); jsize = env->CallIntMethod(jbuffer, getSizeMethod); jdata = env->CallObjectMethod(jbuffer, getDataMethod); jcontent = reinterpret_cast(jdata); - content = (uint8_t*)env->GetByteArrayElements(jcontent, NULL); - - buffer = linphone_buffer_new_from_data(content, (size_t)jsize); - - env->ReleaseByteArrayElements(jcontent, (jbyte*)content, JNI_ABORT); - env->DeleteGlobalRef(bufferClass); + if (jcontent != NULL) { + content = (uint8_t*)env->GetByteArrayElements(jcontent, NULL); + buffer = linphone_buffer_new_from_data(content, (size_t)jsize); + env->ReleaseByteArrayElements(jcontent, (jbyte*)content, JNI_ABORT); + } + env->DeleteLocalRef(bufferClass); return buffer; } From 5d5808b705214fb1db2ae8241d5476606e09eb97 Mon Sep 17 00:00:00 2001 From: Guillaume BIENKOWSKI Date: Mon, 18 May 2015 09:20:36 +0200 Subject: [PATCH 151/157] Update ms2 --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index 13f519ca6..8bd02510c 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 13f519ca621bb0a891e0b344cfb234ba3f104810 +Subproject commit 8bd02510cd99b3c246b0959da5494a5e27328df5 From b2d2d6ec2ffd2acea6ef95b1c89a2f1609dae573 Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Mon, 18 May 2015 09:50:20 +0200 Subject: [PATCH 152/157] tester: remove unused/unneeded includes --- tester/call_tester.c | 30 ++++++++++++++---------------- tester/log_collection_tester.c | 2 -- tester/multi_call.c | 2 -- tester/offeranswer_tester.c | 3 --- tester/transport_tester.c | 3 --- 5 files changed, 14 insertions(+), 26 deletions(-) diff --git a/tester/call_tester.c b/tester/call_tester.c index 7b8323afb..2d82d5f7f 100644 --- a/tester/call_tester.c +++ b/tester/call_tester.c @@ -17,10 +17,8 @@ */ -#include -#include + #include #include -#include "CUnit/Basic.h" #include "linphonecore.h" #include "lpconfig.h" #include "private.h" @@ -78,7 +76,7 @@ void call_state_changed(LinphoneCore *lc, LinphoneCall *call, LinphoneCallState case LinphoneCallEarlyUpdating: counters->number_of_LinphoneCallEarlyUpdating++;break; case LinphoneCallEarlyUpdatedByRemote: counters->number_of_LinphoneCallEarlyUpdatedByRemote++;break; default: - CU_FAIL("unexpected event");break; + BC_FAIL("unexpected event");break; } } @@ -132,7 +130,7 @@ void linphone_transfer_state_changed(LinphoneCore *lc, LinphoneCall *transfered, case LinphoneCallStreamsRunning :counters->number_of_LinphoneTransferCallStreamsRunning++;break; case LinphoneCallError :counters->number_of_LinphoneTransferCallError++;break; default: - CU_FAIL("unexpected event");break; + BC_FAIL("unexpected event");break; } } @@ -4072,7 +4070,7 @@ static void simple_stereo_call(const char *codec_name, int clock_rate, int bitra marie = linphone_core_manager_new( "marie_rc"); pauline = linphone_core_manager_new( "pauline_rc"); - + /*make sure we have opus*/ pt = linphone_core_find_payload_type(marie->lc, codec_name, clock_rate, 2); if (!pt) { @@ -4084,17 +4082,17 @@ static void simple_stereo_call(const char *codec_name, int clock_rate, int bitra pt = linphone_core_find_payload_type(pauline->lc, codec_name, clock_rate, 2); payload_type_set_recv_fmtp(pt, NULL); if (bitrate_override) linphone_core_set_payload_type_bitrate(pauline->lc, pt, bitrate_override); - + disable_all_audio_codecs_except_one(marie->lc, codec_name, clock_rate); disable_all_audio_codecs_except_one(pauline->lc, codec_name, clock_rate); - + linphone_core_set_use_files(marie->lc, TRUE); linphone_core_set_play_file(marie->lc, stereo_file); linphone_core_set_use_files(pauline->lc, TRUE); linphone_core_set_record_file(pauline->lc, recordpath); - + remove(recordpath); - + /*stereo is supported only without volume control, echo canceller...*/ lp_config_set_string(marie->lc->config,"sound","features","NONE"); lp_config_set_string(pauline->lc->config,"sound","features","NONE"); @@ -4102,15 +4100,15 @@ static void simple_stereo_call(const char *codec_name, int clock_rate, int bitra if (!BC_ASSERT_TRUE(call(marie,pauline))) goto end; wait_for_until(marie->lc, pauline->lc, &dummy, 1,6000); end_call(marie,pauline); - + if (clock_rate!=48000) ms_warning("Similarity checking not implemented for files not having the same sampling rate"); else{ #if !defined(__arm__) && !defined(__arm64__) && !TARGET_IPHONE_SIMULATOR && !defined(ANDROID) double similar; const int threshold = 70; - CU_ASSERT_EQUAL(ms_audio_diff(stereo_file,recordpath,&similar,audio_cmp_max_shift,NULL,NULL), 0); - CU_ASSERT_TRUE(100*similar >= threshold); - CU_ASSERT_TRUE(100*similar <= 100); + BC_ASSERT_EQUAL(ms_audio_diff(stereo_file,recordpath,&similar,audio_cmp_max_shift,NULL,NULL), 0, int, "%d"); + BC_ASSERT_TRUE(100*similar >= threshold); + BC_ASSERT_TRUE(100*similar <= 100); if (threshold < 100*similar && 100*similar <= 100) { ms_error("similarity is %g", similar); //remove(recordpath); @@ -4118,7 +4116,7 @@ static void simple_stereo_call(const char *codec_name, int clock_rate, int bitra #endif } - + end: linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); @@ -4126,7 +4124,7 @@ end: ms_free(recordpath); leaked_objects=belle_sip_object_get_object_count()-begin; - CU_ASSERT_TRUE(leaked_objects==0); + BC_ASSERT_TRUE(leaked_objects==0); if (leaked_objects>0){ belle_sip_object_dump_active_objects(); } diff --git a/tester/log_collection_tester.c b/tester/log_collection_tester.c index 683e9ecd7..14c57674d 100644 --- a/tester/log_collection_tester.c +++ b/tester/log_collection_tester.c @@ -16,13 +16,11 @@ along with this program. If not, see . */ -#include #ifndef __USE_XOPEN /*on Debian OS, time.h does declare strptime only if __USE_XOPEN is declared */ #define __USE_XOPEN #endif #include -#include "CUnit/Basic.h" #include "linphonecore.h" #include "private.h" #include "liblinphone_tester.h" diff --git a/tester/multi_call.c b/tester/multi_call.c index 2b564668d..b0fed70cc 100644 --- a/tester/multi_call.c +++ b/tester/multi_call.c @@ -17,10 +17,8 @@ */ -#include #include #include -#include "CUnit/Basic.h" #include "linphonecore.h" #include "lpconfig.h" #include "private.h" diff --git a/tester/offeranswer_tester.c b/tester/offeranswer_tester.c index 4302969c1..67d9c9d62 100644 --- a/tester/offeranswer_tester.c +++ b/tester/offeranswer_tester.c @@ -16,11 +16,8 @@ along with this program. If not, see . */ - -#include #include #include -#include "CUnit/Basic.h" #include "linphonecore.h" #include "lpconfig.h" #include "private.h" diff --git a/tester/transport_tester.c b/tester/transport_tester.c index 4bfae42a2..aae69c3a0 100644 --- a/tester/transport_tester.c +++ b/tester/transport_tester.c @@ -16,11 +16,8 @@ along with this program. If not, see . */ - -#include #include #include -#include "CUnit/Basic.h" #include "linphonecore.h" #include "lpconfig.h" #include "private.h" From fd159f62cd1b503f18ec5ddd44a1a59a8574997e Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Mon, 18 May 2015 11:11:28 +0200 Subject: [PATCH 153/157] Fix build on Linux. --- tester/log_collection_tester.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tester/log_collection_tester.c b/tester/log_collection_tester.c index 14c57674d..3d55075c7 100644 --- a/tester/log_collection_tester.c +++ b/tester/log_collection_tester.c @@ -16,9 +16,8 @@ along with this program. If not, see . */ -#ifndef __USE_XOPEN - /*on Debian OS, time.h does declare strptime only if __USE_XOPEN is declared */ - #define __USE_XOPEN +#ifndef _XOPEN_SOURCE + #define _XOPEN_SOURCE 700 // To have definition of strptime, snprintf and getline #endif #include #include "linphonecore.h" From 2dc1116da8fcaf4d188d1b97123f8eb14d940e95 Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Mon, 18 May 2015 13:55:22 +0200 Subject: [PATCH 154/157] tester: move from BC_ASSERT_TRUE to more accurate asserts for some tests --- mediastreamer2 | 2 +- tester/call_tester.c | 10 +++------ tester/common/bc_tester_utils.h | 4 ++-- tester/flexisip_tester.c | 38 ++++++++++++++++----------------- 4 files changed, 25 insertions(+), 29 deletions(-) diff --git a/mediastreamer2 b/mediastreamer2 index 8bd02510c..ebf5adcbb 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 8bd02510cd99b3c246b0959da5494a5e27328df5 +Subproject commit ebf5adcbb3a9e48ef5d71635cdfc62ecddba10d4 diff --git a/tester/call_tester.c b/tester/call_tester.c index 2d82d5f7f..77eb6deda 100644 --- a/tester/call_tester.c +++ b/tester/call_tester.c @@ -4105,14 +4105,10 @@ static void simple_stereo_call(const char *codec_name, int clock_rate, int bitra else{ #if !defined(__arm__) && !defined(__arm64__) && !TARGET_IPHONE_SIMULATOR && !defined(ANDROID) double similar; - const int threshold = 70; + const double threshold = .7f; BC_ASSERT_EQUAL(ms_audio_diff(stereo_file,recordpath,&similar,audio_cmp_max_shift,NULL,NULL), 0, int, "%d"); - BC_ASSERT_TRUE(100*similar >= threshold); - BC_ASSERT_TRUE(100*similar <= 100); - if (threshold < 100*similar && 100*similar <= 100) { - ms_error("similarity is %g", similar); - //remove(recordpath); - } + BC_ASSERT_GREATER(100*similar, threshold, float, "%f"); + BC_ASSERT_LOWER(100*similar, 1.f, float, "%f"); #endif } diff --git a/tester/common/bc_tester_utils.h b/tester/common/bc_tester_utils.h index fcde1af9d..a0e95884a 100644 --- a/tester/common/bc_tester_utils.h +++ b/tester/common/bc_tester_utils.h @@ -142,8 +142,8 @@ extern int CU_assertImplementation(int bValue, #define BC_ASSERT_DOUBLE_NOT_EQUAL_FATAL(actual, expected, granularity) _BC_ASSERT_PRED("BC_ASSERT_DOUBLE_NOT_EQUAL_FATAL", ((fabs((double)(cactual) - (cexpected)) > fabs((double)(granularity)))), actual, expected, double, TRUE, "Expected %f but was %f.", cexpected, cactual) /*Custom defines*/ -#define BC_ASSERT_GREATER(actual, lower, type, type_format) _BC_ASSERT_PRED("BC_ASSERT_GREATER", ((cactual) >= (cexpected)), actual, lower, type, FALSE, "Expected " type_format " but was " type_format ".", cexpected, cactual) -#define BC_ASSERT_LOWER(actual, lower, type, type_format) _BC_ASSERT_PRED("BC_ASSERT_LOWER", ((cactual) <= (cexpected)), actual, lower, type, FALSE, "Expected " type_format " but was " type_format ".", cexpected, cactual) +#define BC_ASSERT_GREATER(actual, lower, type, type_format) _BC_ASSERT_PRED("BC_ASSERT_GREATER", ((cactual) >= (cexpected)), actual, lower, type, FALSE, "Expected at least " type_format " but was " type_format ".", cexpected, cactual) +#define BC_ASSERT_LOWER(actual, lower, type, type_format) _BC_ASSERT_PRED("BC_ASSERT_LOWER", ((cactual) <= (cexpected)), actual, lower, type, FALSE, "Expected at most " type_format " but was " type_format ".", cexpected, cactual) #ifdef __cplusplus } diff --git a/tester/flexisip_tester.c b/tester/flexisip_tester.c index 9c381aea3..926221836 100644 --- a/tester/flexisip_tester.c +++ b/tester/flexisip_tester.c @@ -104,8 +104,8 @@ static void message_forking_with_unreachable_recipients(void) { BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneMessageReceived,1,3000)); BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneMessageDelivered,1,1000)); BC_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageInProgress,1, int, "%d"); - BC_ASSERT_TRUE( marie2->stat.number_of_LinphoneMessageReceived==0); - BC_ASSERT_TRUE( marie3->stat.number_of_LinphoneMessageReceived==0); + BC_ASSERT_EQUAL(marie2->stat.number_of_LinphoneMessageReceived, 0, int, "%d"); + BC_ASSERT_EQUAL(marie3->stat.number_of_LinphoneMessageReceived, 0, int, "%d"); /*marie 2 goes online */ linphone_core_set_network_reachable(marie2->lc,TRUE); BC_ASSERT_TRUE(wait_for_list(lcs,&marie2->stat.number_of_LinphoneMessageReceived,1,3000)); @@ -148,9 +148,9 @@ static void message_forking_with_all_recipients_unreachable(void) { BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneMessageInProgress,1,5000)); /*flexisip will accept the message with 202 after 16 seconds*/ BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneMessageDelivered,1,18000)); - BC_ASSERT_TRUE( marie->stat.number_of_LinphoneMessageReceived==0); - BC_ASSERT_TRUE( marie2->stat.number_of_LinphoneMessageReceived==0); - BC_ASSERT_TRUE( marie3->stat.number_of_LinphoneMessageReceived==0); + BC_ASSERT_EQUAL( marie->stat.number_of_LinphoneMessageReceived, 0, int, "%d"); + BC_ASSERT_EQUAL( marie2->stat.number_of_LinphoneMessageReceived, 0, int, "%d"); + BC_ASSERT_EQUAL( marie3->stat.number_of_LinphoneMessageReceived, 0, int, "%d"); /*marie 1 goes online */ linphone_core_set_network_reachable(marie->lc,TRUE); @@ -551,12 +551,12 @@ static void early_media_call_forking(void) { /*wait a bit that streams are established*/ wait_for_list(lcs,&dummy,1,6000); - BC_ASSERT_TRUE(linphone_call_get_audio_stats(pauline_call)->download_bandwidth>60 - && linphone_call_get_audio_stats(pauline_call)->download_bandwidth<99); - BC_ASSERT_TRUE(linphone_call_get_audio_stats(marie1_call)->download_bandwidth>60 - && linphone_call_get_audio_stats(marie1_call)->download_bandwidth<99); - BC_ASSERT_TRUE(linphone_call_get_audio_stats(marie2_call)->download_bandwidth>60 - && linphone_call_get_audio_stats(marie2_call)->download_bandwidth<99); + BC_ASSERT_GREATER(linphone_call_get_audio_stats(pauline_call)->download_bandwidth, 60, int, "%d"); + BC_ASSERT_LOWER(linphone_call_get_audio_stats(pauline_call)->download_bandwidth, 99, int, "%d"); + BC_ASSERT_GREATER(linphone_call_get_audio_stats(marie1_call)->download_bandwidth, 60, int, "%d"); + BC_ASSERT_LOWER(linphone_call_get_audio_stats(marie1_call)->download_bandwidth, 99, int, "%d"); + BC_ASSERT_GREATER(linphone_call_get_audio_stats(marie2_call)->download_bandwidth, 60, int, "%d"); + BC_ASSERT_LOWER(linphone_call_get_audio_stats(marie2_call)->download_bandwidth, 99, int, "%d"); linphone_core_accept_call(marie1->lc,linphone_core_get_current_call(marie1->lc)); BC_ASSERT_TRUE(wait_for_list(lcs,&marie1->stat.number_of_LinphoneCallStreamsRunning,1,3000)); @@ -567,10 +567,10 @@ static void early_media_call_forking(void) { /*wait a bit that streams are established*/ wait_for_list(lcs,&dummy,1,3000); - BC_ASSERT_TRUE(linphone_call_get_audio_stats(pauline_call)->download_bandwidth>60 - && linphone_call_get_audio_stats(pauline_call)->download_bandwidth<99 ); - BC_ASSERT_TRUE(linphone_call_get_audio_stats(marie1_call)->download_bandwidth>60 - && linphone_call_get_audio_stats(marie1_call)->download_bandwidth<99 ); + BC_ASSERT_GREATER(linphone_call_get_audio_stats(pauline_call)->download_bandwidth, 60, int, "%d"); + BC_ASSERT_LOWER(linphone_call_get_audio_stats(pauline_call)->download_bandwidth, 99, int, "%d"); + BC_ASSERT_GREATER(linphone_call_get_audio_stats(marie1_call)->download_bandwidth, 60, int, "%d"); + BC_ASSERT_LOWER(linphone_call_get_audio_stats(marie1_call)->download_bandwidth, 99, int, "%d"); linphone_core_terminate_all_calls(pauline->lc); BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallEnd,1,5000)); @@ -610,7 +610,7 @@ static void call_with_sips(void){ BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallStreamsRunning,1,1000)); /*pauline2 should not have ring*/ - BC_ASSERT_TRUE(pauline2->stat.number_of_LinphoneCallIncomingReceived==0); + BC_ASSERT_EQUAL(pauline2->stat.number_of_LinphoneCallIncomingReceived, 0, int, "%d"); linphone_core_terminate_call(pauline1->lc,linphone_core_get_current_call(pauline1->lc)); BC_ASSERT_TRUE(wait_for_list(lcs,&pauline1->stat.number_of_LinphoneCallEnd,1,3000)); @@ -692,7 +692,7 @@ static void call_with_ipv6(void) { ct_addr=linphone_address_new(contact); BC_ASSERT_PTR_NOT_NULL(ct_addr); if (ct_addr){ - BC_ASSERT_TRUE(strchr(linphone_address_get_domain(ct_addr),':')!=NULL); + BC_ASSERT_PTR_NOT_NULL(strchr(linphone_address_get_domain(ct_addr),':')); } linphone_address_destroy(ct_addr); } @@ -706,7 +706,7 @@ static void call_with_ipv6(void) { liblinphone_tester_enable_ipv6(FALSE); leaked_objects=belle_sip_object_get_object_count()-begin; - BC_ASSERT_TRUE(leaked_objects==0); + BC_ASSERT_EQUAL(leaked_objects, 0, int, "%d"); if (leaked_objects>0){ belle_sip_object_dump_active_objects(); } @@ -881,7 +881,7 @@ static void dos_module_trigger(void) { // At this point we should be banned for a minute ms_usleep(90000000); // Wait 90 seconds to ensure we are not banned anymore - BC_ASSERT_TRUE(marie->stat.number_of_LinphoneMessageReceived < number_of_messge_to_send); + BC_ASSERT_LOWER(marie->stat.number_of_LinphoneMessageReceived, number_of_messge_to_send, int, "%d"); reset_counters(&marie->stat); reset_counters(&pauline->stat); From c8ca91ec23a7aae8a393f3a94a1c42e74f06a599 Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Mon, 18 May 2015 15:19:01 +0200 Subject: [PATCH 155/157] tester: fix some tests --- tester/call_tester.c | 4 ++-- tester/multicast_call_tester.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tester/call_tester.c b/tester/call_tester.c index 77eb6deda..e3ddacfc0 100644 --- a/tester/call_tester.c +++ b/tester/call_tester.c @@ -4107,8 +4107,8 @@ static void simple_stereo_call(const char *codec_name, int clock_rate, int bitra double similar; const double threshold = .7f; BC_ASSERT_EQUAL(ms_audio_diff(stereo_file,recordpath,&similar,audio_cmp_max_shift,NULL,NULL), 0, int, "%d"); - BC_ASSERT_GREATER(100*similar, threshold, float, "%f"); - BC_ASSERT_LOWER(100*similar, 1.f, float, "%f"); + BC_ASSERT_GREATER(similar, threshold, float, "%f"); + BC_ASSERT_LOWER(similar, 1.f, float, "%f"); #endif } diff --git a/tester/multicast_call_tester.c b/tester/multicast_call_tester.c index 692f4d995..3453463a0 100644 --- a/tester/multicast_call_tester.c +++ b/tester/multicast_call_tester.c @@ -55,7 +55,7 @@ static void call_multicast_base(bool_t video) { BC_ASSERT_TRUE(call(pauline,marie)); wait_for_until(marie->lc, pauline->lc, NULL, 1, 3000); if (linphone_core_get_current_call(marie->lc)) { - BC_ASSERT_TRUE(linphone_call_get_audio_stats(linphone_core_get_current_call(marie->lc))->download_bandwidth>70); + BC_ASSERT_GREATER(linphone_call_get_audio_stats(linphone_core_get_current_call(marie->lc))->download_bandwidth,70,int,"%d"); if (video) { /*check video path*/ linphone_call_set_next_video_frame_decoded_callback(linphone_core_get_current_call(marie->lc),linphone_call_cb,marie->lc); From 1f6fcb6393d99678b1441a9ded897e80b117d5a4 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Mon, 18 May 2015 15:35:36 +0200 Subject: [PATCH 156/157] Fix negociation of rtcp-fb attributes in SDP. Some attributes could be added by us on incoming call whereas it should not be done. --- coreapi/bellesip_sal/sal_sdp.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/coreapi/bellesip_sal/sal_sdp.c b/coreapi/bellesip_sal/sal_sdp.c index 2ce189d48..b254c67d8 100644 --- a/coreapi/bellesip_sal/sal_sdp.c +++ b/coreapi/bellesip_sal/sal_sdp.c @@ -128,6 +128,11 @@ static void add_rtcp_fb_attributes(belle_sdp_media_description_t *media_desc, co payload_type_set_flag(pt, PAYLOAD_TYPE_RTCP_FEEDBACK_ENABLED); avpf_params = payload_type_get_avpf_params(pt); + /* Add trr-int if not set generally. */ + if (general_trr_int != TRUE) { + add_rtcp_fb_trr_int_attribute(media_desc, payload_type_get_number(pt), avpf_params.trr_interval); + } + /* Add rtcp-fb attributes according to the AVPF features of the payload types. */ if (avpf_params.features & PAYLOAD_TYPE_AVPF_PLI) { add_rtcp_fb_nack_attribute(media_desc, payload_type_get_number(pt), BELLE_SDP_RTCP_FB_PLI); @@ -538,9 +543,6 @@ static void apply_rtcp_fb_attribute_to_payload(belle_sdp_rtcp_fb_attribute_t *fb switch (belle_sdp_rtcp_fb_attribute_get_type(fb_attribute)) { case BELLE_SDP_RTCP_FB_NACK: switch (belle_sdp_rtcp_fb_attribute_get_param(fb_attribute)) { - case BELLE_SDP_RTCP_FB_NONE: - avpf_params.features |= PAYLOAD_TYPE_AVPF_PLI | PAYLOAD_TYPE_AVPF_SLI | PAYLOAD_TYPE_AVPF_RPSI; - break; case BELLE_SDP_RTCP_FB_PLI: avpf_params.features |= PAYLOAD_TYPE_AVPF_PLI; break; @@ -550,6 +552,7 @@ static void apply_rtcp_fb_attribute_to_payload(belle_sdp_rtcp_fb_attribute_t *fb case BELLE_SDP_RTCP_FB_RPSI: avpf_params.features |= PAYLOAD_TYPE_AVPF_RPSI; break; + case BELLE_SDP_RTCP_FB_NONE: default: break; } @@ -581,6 +584,15 @@ static void sdp_parse_rtcp_fb_parameters(belle_sdp_media_description_t *media_de PayloadType *pt; int8_t pt_num; + /* Clear the AVPF features for all payload types. */ + for (pt_it = stream->payloads; pt_it != NULL; pt_it = pt_it->next) { + PayloadTypeAvpfParams avpf_params; + pt = (PayloadType *)pt_it->data; + avpf_params = payload_type_get_avpf_params(pt); + avpf_params.features = PAYLOAD_TYPE_AVPF_NONE; + payload_type_set_avpf_params(pt, avpf_params); + } + /* Handle rtcp-fb attributes that concern all payload types. */ for (it = belle_sdp_media_description_get_attributes(media_desc); it != NULL; it = it->next) { attribute = BELLE_SDP_ATTRIBUTE(it->data); From 5200810ca8e94ba03f96c1ed1210dd5e08806d1b Mon Sep 17 00:00:00 2001 From: Johan Pascal Date: Mon, 18 May 2015 23:55:12 +0200 Subject: [PATCH 157/157] Clean Lime tests --- .gitignore | 1 + tester/ZIDCache.xml | 2 - tester/ZIDCacheAlice.xml | 2 - tester/ZIDCacheBob.xml | 4 - tester/message_tester.c | 187 ++++++++++++++++++++++----------------- 5 files changed, 107 insertions(+), 89 deletions(-) delete mode 100644 tester/ZIDCache.xml delete mode 100644 tester/ZIDCacheAlice.xml delete mode 100644 tester/ZIDCacheBob.xml diff --git a/.gitignore b/.gitignore index 61763ce43..bceba742e 100644 --- a/.gitignore +++ b/.gitignore @@ -87,4 +87,5 @@ tools/lp-autoanswer build/macos/pkg-distribution.xml tester/record_for_lc_*.wav tester/record-call_with_file_player.wav +tester/ZIDCache*.xml diff --git a/tester/ZIDCache.xml b/tester/ZIDCache.xml deleted file mode 100644 index 6c96b40cc..000000000 --- a/tester/ZIDCache.xml +++ /dev/null @@ -1,2 +0,0 @@ - -ef7692d0792a67491ae2d44e005dbe0399643d953a2202dd9b5c8f06f3b6c2c695f2dfc3c26f31f5fef8661f8c5fe7c95aeb5c5b0435b045f8324dd18ea905171ec2be89f879d01d5994132048d92ea020778cbdf31c605e2fdcef69380937c2cf221f7d11526f286c39f49641452ba9012521c705094899pipo1@pipo.com963c57bb28e62068d2df23e8f9b771932d3c57bb28e62068d2df23e8f9b7719305d9ac653a83c4559cb0ae7394e7cd3b2d3c57bb28e62068d2df23e8f9b771935f9aa1e5e4c7ec88fa389a9f6b8879b42d3c57bb28e62068d2df23e8f9b7719302ffd51e7316a6c6f53a50fcf01b01bf2d3c57bb28e62068d2df23e8f9b7719300000069000001e8011234567889643d953a2202ee9b5c8f06f3b6c2c695f2dfc3c26f31f5fef8661f8c5fe7c95aeb5c5b0435b045f8324dd18ea905171ec2be89f879d01d5994132048d92ea020778cbdf31c605e2fdcef69380937c2cf221f7d11526f286c39f49641452ba9012521c705094899pipo1@pipo.com123456789012345678901234567890123456765431262068d2df23e8f9b7719325d9ac653a83c4559cb0ae7394e7cd3b2d3c57bb28e62068d2df23e8f9b77193f69aa1e5e4c7ec88fa389a9f6b8879b42d3c57bb28e62068d2df23e8f9b7719322ffd51e7316a6c6f53a50fcf01b01bf2d3c57bb28e62068d2df23e8f9b77193000000010000000001 diff --git a/tester/ZIDCacheAlice.xml b/tester/ZIDCacheAlice.xml deleted file mode 100644 index 0edd84bd9..000000000 --- a/tester/ZIDCacheAlice.xml +++ /dev/null @@ -1,2 +0,0 @@ - -ef7692d0792a67491ae2d44e005dbe0399643d953a2202dd9b5c8f06f3b6c2c695f2dfc3c26f31f5fef8661f8c5fe7c95aeb5c5b0435b045f8324dd18ea905171ec2be89f879d01d5994132048d92ea020778cbdf31c605e2fdcef69380937c2cf221f7d11526f286c39f49641452ba9012521c705094899sip:pauline@sip.example.org9111ebeb52e50edcc6fcb3eea1a2d3ae3c2c75d3668923e83c59d0f47245515060f020a3fe11dc2cc0e1e8ed9341b4cd14944db806ca4fc95456bbe45d95c43a5f9aa1e5e4c7ec88fa389a9f6b8879b42d3c57bb28e62068d2df23e8f9b77193bcffd51e7316a6c6f53a50fcf01b01bf2d3c57bb28e62068d2df23e8f9b7719300000080000001cf011234567889643d953a2202ee9b5c8f06f3b6c2c695f2dfc3c26f31f5fef8661f8c5fe7c95aeb5c5b0435b045f8324dd18ea905171ec2be89f879d01d5994132048d92ea020778cbdf31c605e2fdcef69380937c2cf221f7d11526f286c39f49641452ba9012521c705094899sip:pauline@sip.example.org72d80ab1cad243cf45634980c1d02cfb2df81ce0dd5dfcf1ebeacfc5345a917625d9ac653a83c4559cb0ae7394e7cd3b2d3c57bb28e62068d2df23e8f9b77193f69aa1e5e4c7ec88fa389a9f6b8879b42d3c57bb28e62068d2df23e8f9b7719322ffd51e7316a6c6f53a50fcf01b01bf2d3c57bb28e62068d2df23e8f9b771930000000f00000000 diff --git a/tester/ZIDCacheBob.xml b/tester/ZIDCacheBob.xml deleted file mode 100644 index 3795074a2..000000000 --- a/tester/ZIDCacheBob.xml +++ /dev/null @@ -1,4 +0,0 @@ - -005dbe0399643d953a2202dd - ef7692d0792a67491ae2d44e9b5c8f06f3b6c2c695f2dfc3c26f31f5fef8661f8c5fe7c95aeb5c5b0435b045f8324dd18ea905171ec2be89f879d01d5994132048d92ea020778cbdf31c605e2fdcef69380937c2cf221f7d11526f286c39f49641452ba9012521c705094899sip:marie@sip.example.org9111ebeb52e50edcc6fcb3eea1a2d3ae3c2c75d3668923e83c59d0f47245515060f020a3fe11dc2cc0e1e8ed9341b4cd14944db806ca4fc95456bbe45d95c43a5f9aa1e5e4c7ec88fa389a9f6b8879b42d3c57bb28e62068d2df23e8f9b77193bcffd51e7316a6c6f53a50fcf01b01bf2d3c57bb28e62068d2df23e8f9b7719300000080000001cf01 - 1234567889643d953a2202ee9b5c8f06f3b6c2c695f2dfc3c26f31f5fef8661f8c5fe7c95aeb5c5b0435b045f8324dd18ea905171ec2be89f879d01d5994132048d92ea020778cbdf31c605e2fdcef69380937c2cf221f7d11526f286c39f49641452ba9012521c705094899sip:marie@sip.example.org81e6e6362c34dc974263d1f77cbb9a8d6d6a718330994379099a8fa19fb12faa25d9ac653a83c4559cb0ae7394e7cd3b2d3c57bb28e62068d2df23e8f9b77193f69aa1e5e4c7ec88fa389a9f6b8879b42d3c57bb28e62068d2df23e8f9b7719322ffd51e7316a6c6f53a50fcf01b01bf2d3c57bb28e62068d2df23e8f9b771930000002e0000000001 diff --git a/tester/message_tester.c b/tester/message_tester.c index b78962885..7e27f0ff4 100644 --- a/tester/message_tester.c +++ b/tester/message_tester.c @@ -661,13 +661,19 @@ static void lime_file_transfer_message(void) { static void printHex(char *title, uint8_t *data, uint32_t length) { int i; - printf ("%s : ", title); + char debug_string_buffer[2048]; + char *debug_string = debug_string_buffer; + sprintf (debug_string, "%s : ", title); + debug_string += strlen(title)+3; for (i=0; i\nef7692d0792a67491ae2d44e005dbe0399643d953a2202dd9b5c8f06f3b6c2c695f2dfc3c26f31f5fef8661f8c5fe7c95aeb5c5b0435b045f8324dd18ea905171ec2be89f879d01d5994132048d92ea020778cbdf31c605e2fdcef69380937c2cf221f7d11526f286c39f49641452ba9012521c705094899pipo1@pipo.com963c57bb28e62068d2df23e8f9b771932d3c57bb28e62068d2df23e8f9b7719305d9ac653a83c4559cb0ae7394e7cd3b2d3c57bb28e62068d2df23e8f9b771935f9aa1e5e4c7ec88fa389a9f6b8879b42d3c57bb28e62068d2df23e8f9b7719302ffd51e7316a6c6f53a50fcf01b01bf2d3c57bb28e62068d2df23e8f9b7719300000069000001e8011234567889643d953a2202ee9b5c8f06f3b6c2c695f2dfc3c26f31f5fef8661f8c5fe7c95aeb5c5b0435b045f8324dd18ea905171ec2be89f879d01d5994132048d92ea020778cbdf31c605e2fdcef69380937c2cf221f7d11526f286c39f49641452ba9012521c705094899pipo1@pipo.com123456789012345678901234567890123456765431262068d2df23e8f9b7719325d9ac653a83c4559cb0ae7394e7cd3b2d3c57bb28e62068d2df23e8f9b77193f69aa1e5e4c7ec88fa389a9f6b8879b42d3c57bb28e62068d2df23e8f9b7719322ffd51e7316a6c6f53a50fcf01b01bf2d3c57bb28e62068d2df23e8f9b77193000000010000000001"); + fclose(CACHE); + CACHE = fopen("ZIDCache.xml", "rb+"); + cacheBufferString = (uint8_t*) ms_load_file_content(CACHE, &size); + *(cacheBufferString+size) = '\0'; + fclose(CACHE); + /* parse it to an xmlDoc */ + cacheBuffer = xmlParseDoc(cacheBufferString); + ms_free(cacheBufferString); + + /* get data from cache : sender */ + associatedKeys.peerURI = (uint8_t *)malloc(15); + memcpy(associatedKeys.peerURI, "pipo1@pipo.com", 15); + associatedKeys.associatedZIDNumber = 0; + retval = lime_getCachedSndKeysByURI(cacheBuffer, &associatedKeys); + BC_ASSERT_EQUAL_FATAL(retval, 0, int, "%d"); + BC_ASSERT_EQUAL_FATAL(associatedKeys.associatedZIDNumber, 2, int, "%d"); /* there are 2 keys associated to pipo1@pipo.com address in the cache above*/ + ms_message("Get cached key by URI, for sender, return %d keys", associatedKeys.associatedZIDNumber); + + for (i=0; ipeerZID, 12); + printHex("key", associatedKeys.peerKeys[i]->key, 32); + printHex("sessionID", associatedKeys.peerKeys[i]->sessionId, 32); + ms_message("session index %d\n", associatedKeys.peerKeys[i]->sessionIndex); + } + + /* get data from cache : receiver */ + memcpy(associatedKey.peerZID, targetZID, 12); + retval = lime_getCachedRcvKeyByZid(cacheBuffer, &associatedKey); + BC_ASSERT_EQUAL_FATAL(retval, 0, int, "%d"); + printHex("Got receiver key for ZID", targetZID, 12); + printHex("Key", associatedKey.key, 32); + printHex("sessionID", associatedKey.sessionId, 32); + ms_message("session index %d\n", associatedKey.sessionIndex); + + /* encrypt/decrypt a message */ + lime_encryptMessage(associatedKeys.peerKeys[0], (uint8_t *)PLAIN_TEXT_TEST_MESSAGE, strlen(PLAIN_TEXT_TEST_MESSAGE), senderZID, encryptedMessage); + printHex("Ciphered", encryptedMessage, strlen((char *)encryptedMessage)); + /* invert sender and receiverZID to decrypt/authenticate */ + memcpy(receiverZID, associatedKeys.peerKeys[0]->peerZID, 12); + memcpy(associatedKeys.peerKeys[0]->peerZID, senderZID, 12); + retval = lime_decryptMessage(associatedKeys.peerKeys[0], encryptedMessage, strlen(PLAIN_TEXT_TEST_MESSAGE)+16, receiverZID, plainMessage); + BC_ASSERT_EQUAL_FATAL(retval, 0, int, "%d"); + BC_ASSERT_STRING_EQUAL((char *)plainMessage, (char *)PLAIN_TEXT_TEST_MESSAGE); + ms_message("Decrypt and auth returned %d\nPlain text is %s\n", retval, plainMessage); + + /* update receiver data */ + associatedKey.sessionIndex++; + associatedKey.key[0]++; + associatedKey.sessionId[0]++; + retval = lime_setCachedKey(cacheBuffer, &associatedKey, LIME_RECEIVER); + BC_ASSERT_EQUAL_FATAL(retval, 0, int, "%d"); + + /* update sender data */ + associatedKeys.peerKeys[0]->sessionIndex++; + associatedKeys.peerKeys[0]->key[0]++; + associatedKeys.peerKeys[0]->sessionId[0]++; + retval = lime_setCachedKey(cacheBuffer, associatedKeys.peerKeys[0], LIME_SENDER); + BC_ASSERT_EQUAL_FATAL(retval, 0, int, "%d"); + + /* free memory */ + lime_freeKeys(associatedKeys); + + /* write the file */ + /* dump the xml document into a string */ + xmlDocDumpFormatMemoryEnc(cacheBuffer, &xmlStringOutput, &xmlStringLength, "UTF-8", 0); + /* write it to the file */ + CACHE = fopen("ZIDCache.xml", "w+"); + fwrite(xmlStringOutput, 1, xmlStringLength, CACHE); + xmlFree(xmlStringOutput); + fclose(CACHE); + xmlFreeDoc(cacheBuffer); + + /**** Higher level tests using 2 caches to encrypt/decrypt a message ****/ + /* Create Alice cache file and then load it */ + CACHE = fopen("ZIDCacheAlice.xml", "wb"); + fprintf(CACHE, "\nef7692d0792a67491ae2d44e005dbe0399643d953a2202dd9b5c8f06f3b6c2c695f2dfc3c26f31f5fef8661f8c5fe7c95aeb5c5b0435b045f8324dd18ea905171ec2be89f879d01d5994132048d92ea020778cbdf31c605e2fdcef69380937c2cf221f7d11526f286c39f49641452ba9012521c705094899sip:pauline@sip.example.org9111ebeb52e50edcc6fcb3eea1a2d3ae3c2c75d3668923e83c59d0f47245515060f020a3fe11dc2cc0e1e8ed9341b4cd14944db806ca4fc95456bbe45d95c43a5f9aa1e5e4c7ec88fa389a9f6b8879b42d3c57bb28e62068d2df23e8f9b77193bcffd51e7316a6c6f53a50fcf01b01bf2d3c57bb28e62068d2df23e8f9b7719300000080000001cf011234567889643d953a2202ee9b5c8f06f3b6c2c695f2dfc3c26f31f5fef8661f8c5fe7c95aeb5c5b0435b045f8324dd18ea905171ec2be89f879d01d5994132048d92ea020778cbdf31c605e2fdcef69380937c2cf221f7d11526f286c39f49641452ba9012521c705094899sip:pauline@sip.example.org72d80ab1cad243cf45634980c1d02cfb2df81ce0dd5dfcf1ebeacfc5345a917625d9ac653a83c4559cb0ae7394e7cd3b2d3c57bb28e62068d2df23e8f9b77193f69aa1e5e4c7ec88fa389a9f6b8879b42d3c57bb28e62068d2df23e8f9b7719322ffd51e7316a6c6f53a50fcf01b01bf2d3c57bb28e62068d2df23e8f9b771930000000f00000000"); + fclose(CACHE); + CACHE = fopen("ZIDCacheAlice.xml", "rb+"); cacheBufferString = (uint8_t *)ms_load_file_content(CACHE, &size); *(cacheBufferString+size) = '\0'; fclose(CACHE); @@ -697,7 +786,10 @@ static void lime_unit(void) { cacheBufferAlice = xmlParseDoc(cacheBufferString); ms_free(cacheBufferString); - /* Load Bob cache file */ + /* Create Bob cache file and then load it */ + CACHE = fopen("ZIDCacheBob.xml", "wb"); + fprintf(CACHE, "\n005dbe0399643d953a2202ddef7692d0792a67491ae2d44e9b5c8f06f3b6c2c695f2dfc3c26f31f5fef8661f8c5fe7c95aeb5c5b0435b045f8324dd18ea905171ec2be89f879d01d5994132048d92ea020778cbdf31c605e2fdcef69380937c2cf221f7d11526f286c39f49641452ba9012521c705094899sip:marie@sip.example.org9111ebeb52e50edcc6fcb3eea1a2d3ae3c2c75d3668923e83c59d0f47245515060f020a3fe11dc2cc0e1e8ed9341b4cd14944db806ca4fc95456bbe45d95c43a5f9aa1e5e4c7ec88fa389a9f6b8879b42d3c57bb28e62068d2df23e8f9b77193bcffd51e7316a6c6f53a50fcf01b01bf2d3c57bb28e62068d2df23e8f9b7719300000080000001cf011234567889643d953a2202ee9b5c8f06f3b6c2c695f2dfc3c26f31f5fef8661f8c5fe7c95aeb5c5b0435b045f8324dd18ea905171ec2be89f879d01d5994132048d92ea020778cbdf31c605e2fdcef69380937c2cf221f7d11526f286c39f49641452ba9012521c705094899sip:marie@sip.example.org81e6e6362c34dc974263d1f77cbb9a8d6d6a718330994379099a8fa19fb12faa25d9ac653a83c4559cb0ae7394e7cd3b2d3c57bb28e62068d2df23e8f9b77193f69aa1e5e4c7ec88fa389a9f6b8879b42d3c57bb28e62068d2df23e8f9b7719322ffd51e7316a6c6f53a50fcf01b01bf2d3c57bb28e62068d2df23e8f9b771930000002e0000000001"); + fclose(CACHE); CACHE = fopen("ZIDCacheBob.xml", "rb+"); cacheBufferString = (uint8_t *)ms_load_file_content(CACHE, &size); *(cacheBufferString+size) = '\0'; @@ -709,19 +801,20 @@ static void lime_unit(void) { /* encrypt a message */ - retval = lime_createMultipartMessage(cacheBufferAlice, (uint8_t *)"Bonjour les petits lapins,ca va? éh oui oui", (uint8_t *)"sip:pauline@sip.example.org", &multipartMessage); + retval = lime_createMultipartMessage(cacheBufferAlice, (uint8_t *)PLAIN_TEXT_TEST_MESSAGE, (uint8_t *)"sip:pauline@sip.example.org", &multipartMessage); - printf("create message return %d\n", retval); + BC_ASSERT_EQUAL_FATAL(retval, 0, int, "%d"); if (retval == 0) { - printf("message is %s\n", multipartMessage); + ms_message("Encrypted message created is %s", multipartMessage); } /* decrypt the multipart message */ retval = lime_decryptMultipartMessage(cacheBufferBob, multipartMessage, &decryptedMessage); - printf("decrypt message return %d\n", retval); + BC_ASSERT_EQUAL_FATAL(retval, 0, int, "%d"); if (retval == 0) { - printf("message is %s##END\n", decryptedMessage); + BC_ASSERT_STRING_EQUAL((char *)decryptedMessage, (char *)PLAIN_TEXT_TEST_MESSAGE); + ms_message("Succesfully decrypted message is %s", decryptedMessage); } free(multipartMessage); free(decryptedMessage); @@ -745,74 +838,6 @@ static void lime_unit(void) { xmlFreeDoc(cacheBufferAlice); xmlFreeDoc(cacheBufferBob); - - /* Load cache file */ - CACHE = fopen("ZIDCache.xml", "rb+"); - cacheBufferString = (uint8_t*) ms_load_file_content(CACHE, &size); - *(cacheBufferString+size) = '\0'; - fclose(CACHE); - /* parse it to an xmlDoc */ - cacheBuffer = xmlParseDoc(cacheBufferString); - ms_free(cacheBufferString); - - /* get data from cache : sender */ - associatedKeys.peerURI = (uint8_t *)malloc(15); - memcpy(associatedKeys.peerURI, "pipo1@pipo.com", 15); - associatedKeys.associatedZIDNumber = 0; - retval = lime_getCachedSndKeysByURI(cacheBuffer, &associatedKeys); - printf("getCachedKeys returns %d, number of key found %d\n", retval, associatedKeys.associatedZIDNumber); - - for (i=0; ipeerZID, 12); - printHex("key", associatedKeys.peerKeys[i]->key, 32); - printHex("sessionID", associatedKeys.peerKeys[i]->sessionId, 32); - printf("session index %d\n", associatedKeys.peerKeys[i]->sessionIndex); - } - - /* get data from cache : receiver */ - memcpy(associatedKey.peerZID, targetZID, 12); - retval = lime_getCachedRcvKeyByZid(cacheBuffer, &associatedKey); - printf("getCachedKey by ZID return %d\n", retval); - - printHex("Key", associatedKey.key, 32); - printHex("sessionID", associatedKey.sessionId, 32); - printf("session index %d\n", associatedKey.sessionIndex); - - /* encrypt/decrypt a message */ - lime_encryptMessage(associatedKeys.peerKeys[0], (uint8_t *)"bla Bla bla b! Pipo", 20, senderZID, encryptedMessage); - printHex("Ciphered", encryptedMessage, 32); - /* invert sender and receiverZID to decrypt/authenticate */ - memcpy(receiverZID, associatedKeys.peerKeys[0]->peerZID, 12); - memcpy(associatedKeys.peerKeys[0]->peerZID, senderZID, 12); - retval = lime_decryptMessage(associatedKeys.peerKeys[0], encryptedMessage, 36, receiverZID, plainMessage); - printf("Decrypt and auth returned %d\nPlain: %s\n", retval, plainMessage); - - /* update receiver data */ - associatedKey.sessionIndex++; - associatedKey.key[0]++; - associatedKey.sessionId[0]++; - retval = lime_setCachedKey(cacheBuffer, &associatedKey, LIME_RECEIVER); - printf("setCachedKey return %d\n", retval); - - /* update sender data */ - associatedKeys.peerKeys[0]->sessionIndex++; - associatedKeys.peerKeys[0]->key[0]++; - associatedKeys.peerKeys[0]->sessionId[0]++; - retval = lime_setCachedKey(cacheBuffer, associatedKeys.peerKeys[0], LIME_SENDER); - printf("setCachedKey return %d\n", retval); - - /* free memory */ - lime_freeKeys(associatedKeys); - - /* write the file */ - /* dump the xml document into a string */ - xmlDocDumpFormatMemoryEnc(cacheBuffer, &xmlStringOutput, &xmlStringLength, "UTF-8", 0); - /* write it to the file */ - CACHE = fopen("ZIDCache.xml", "w+"); - fwrite(xmlStringOutput, 1, xmlStringLength, CACHE); - xmlFree(xmlStringOutput); - fclose(CACHE); - xmlFreeDoc(cacheBuffer); } static void lime_text_message(void) {

7{5PO< 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%0DRTxS{hH_UiDwf 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 z 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