From fd0a7cfd739a29b69451609ef86cbce0c78eb6fc Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Fri, 13 Feb 2015 18:01:45 +0100 Subject: [PATCH 01/90] add more DTLS tests --- coreapi/callbacks.c | 2 +- coreapi/linphonecall.c | 106 ++++++++++++++++++++++------------------- tester/call_tester.c | 91 ++++++++++++++++++++++++++++++----- 3 files changed, 138 insertions(+), 61 deletions(-) diff --git a/coreapi/callbacks.c b/coreapi/callbacks.c index 47032e22e..7e0254b99 100644 --- a/coreapi/callbacks.c +++ b/coreapi/callbacks.c @@ -221,7 +221,7 @@ static bool_t is_duplicate_call(LinphoneCore *lc, const LinphoneAddress *from, c static bool_t already_a_call_with_remote_address(const LinphoneCore *lc, const LinphoneAddress *remote) { MSList *elem; - ms_warning(" searching for already_a_call_with_remote_address."); + ms_message("Searching for already_a_call_with_remote_address."); for(elem=lc->calls;elem!=NULL;elem=elem->next){ const LinphoneCall *call=(LinphoneCall*)elem->data; diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c index 164beb5ca..f5aff970d 100644 --- a/coreapi/linphonecall.c +++ b/coreapi/linphonecall.c @@ -2430,6 +2430,30 @@ static void linphone_call_start_audio_stream(LinphoneCall *call, bool_t muted, b setup_ring_player(lc,call); } + if (sal_stream_description_has_dtls(stream) == TRUE) { + /* DTLS engine was already initialised during stream init. Before starting it we must be sure that the role(client or server) is set. + * Role may have already been set to server if we initiate the call and already received a packet from peer, in that case do nothing */ + SalDtlsRole salRole = stream->dtls_role; + if (salRole==SalDtlsRoleInvalid) { /* it's invalid in streams[0] but check also at session level */ + salRole = call->resultdesc->dtls_role; + } + + if (salRole!=SalDtlsRoleInvalid) { /* if DTLS is available at both end points */ + /* give the peer certificate fingerprint to dtls context */ + SalMediaDescription *remote_desc = sal_call_get_remote_media_description(call->op); + ms_dtls_srtp_set_peer_fingerprint(call->audiostream->ms.sessions.dtls_context, remote_desc->streams[0].dtls_fingerprint); + } else { + ms_warning("unable to start DTLS engine on audiostream, Dtls role in resulting media description is invalid\n"); + } + if (salRole == SalDtlsRoleIsClient) { /* local endpoint is client */ + ms_dtls_srtp_set_role(call->audiostream->ms.sessions.dtls_context, MSDtlsSrtpRoleIsClient); /* set the role to client */ + ms_dtls_srtp_start(call->audiostream->ms.sessions.dtls_context); /* then start the engine, it will send the DTLS client Hello */ + } else if (salRole == SalDtlsRoleIsServer) { /* local endpoint is server */ + ms_dtls_srtp_set_role(call->audiostream->ms.sessions.dtls_context, MSDtlsSrtpRoleIsServer); /* this may complete the server setup */ + /* no need to start engine, we are waiting for DTLS Client Hello */ + } + } + if (call->params->in_conference){ /*transform the graph to connect it to the conference filter */ mute=stream->dir==SalStreamRecvOnly; @@ -2555,6 +2579,28 @@ static void linphone_call_start_video_stream(LinphoneCall *call, bool_t all_inpu used_pt, linphone_core_get_video_jittcomp(lc), cam); } } + if (sal_stream_description_has_dtls(vstream) == TRUE) { + /*DTLS*/ + SalDtlsRole salRole = vstream->dtls_role; + if (salRole==SalDtlsRoleInvalid) { /* it's invalid in streams[0] but check also at session level */ + salRole = call->resultdesc->dtls_role; + } + + if (salRole!=SalDtlsRoleInvalid) { /* if DTLS is available at both end points */ + /* give the peer certificate fingerprint to dtls context */ + SalMediaDescription *remote_desc = sal_call_get_remote_media_description(call->op); + ms_dtls_srtp_set_peer_fingerprint(call->videostream->ms.sessions.dtls_context, remote_desc->streams[1].dtls_fingerprint); + } else { + ms_warning("unable to start DTLS engine on videostream, Dtls role in resulting media description is invalid\n"); + } + if (salRole == SalDtlsRoleIsClient) { /* local endpoint is client */ + ms_dtls_srtp_set_role(call->videostream->ms.sessions.dtls_context, MSDtlsSrtpRoleIsClient); /* set the role to client */ + ms_dtls_srtp_start(call->videostream->ms.sessions.dtls_context); /* then start the engine, it will send the DTLS client Hello */ + } else if (salRole == SalDtlsRoleIsServer) { /* local endpoint is server */ + ms_dtls_srtp_set_role(call->videostream->ms.sessions.dtls_context, MSDtlsSrtpRoleIsServer); /* this may complete the server setup */ + /* no need to start engine, we are waiting for DTLS Client Hello */ + } + } }else ms_warning("No video stream accepted."); }else{ ms_message("No valid video stream defined."); @@ -2605,6 +2651,7 @@ void linphone_call_start_media_streams(LinphoneCall *call, bool_t all_inputs_mut call->playing_ringbacktone=send_ringbacktone; call->up_bw=linphone_core_get_upload_bandwidth(lc); + /*might be moved in audio/video stream_start*/ if (call->params->media_encryption==LinphoneMediaEncryptionZRTP) { MSZrtpParams params; memset(¶ms,0,sizeof(MSZrtpParams)); @@ -2618,52 +2665,7 @@ 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==LinphoneMediaEncryptionDTLS) { - /* DTLS engine was already initialised during stream init. Before starting it we must be sure that the role(client or server) is set. - * Role may have already been set to server if we initiate the call and already received a packet from peer, in that case do nothing */ - SalDtlsRole salRole = call->resultdesc->streams[0].dtls_role; /* TODO: is streams[0] necessary the audiostream in the media description ? */ - if (salRole==SalDtlsRoleInvalid) { /* it's invalid in streams[0] but check also at session level */ - salRole = call->resultdesc->dtls_role; - } - - if (salRole!=SalDtlsRoleInvalid) { /* if DTLS is available at both end points */ - /* give the peer certificate fingerprint to dtls context */ - SalMediaDescription *remote_desc = sal_call_get_remote_media_description(call->op); - ms_dtls_srtp_set_peer_fingerprint(call->audiostream->ms.sessions.dtls_context, remote_desc->streams[0].dtls_fingerprint); - } else { - ms_warning("unable to start DTLS engine on audiostream, Dtls role in resulting media description is invalid\n"); - } - if (salRole == SalDtlsRoleIsClient) { /* local endpoint is client */ - ms_dtls_srtp_set_role(call->audiostream->ms.sessions.dtls_context, MSDtlsSrtpRoleIsClient); /* set the role to client */ - ms_dtls_srtp_start(call->audiostream->ms.sessions.dtls_context); /* then start the engine, it will send the DTLS client Hello */ - } else if (salRole == SalDtlsRoleIsServer) { /* local endpoint is server */ - ms_dtls_srtp_set_role(call->audiostream->ms.sessions.dtls_context, MSDtlsSrtpRoleIsServer); /* this may complete the server setup */ - /* no need to start engine, we are waiting for DTLS Client Hello */ - } -#ifdef VIDEO_ENABLED - salRole = call->resultdesc->streams[1].dtls_role; /* TODO: is streams[1] necessary the videostream in the media description ? */ - if (salRole==SalDtlsRoleInvalid) { /* it's invalid in streams[0] but check also at session level */ - salRole = call->resultdesc->dtls_role; - } - - if (salRole!=SalDtlsRoleInvalid) { /* if DTLS is available at both end points */ - /* give the peer certificate fingerprint to dtls context */ - SalMediaDescription *remote_desc = sal_call_get_remote_media_description(call->op); - ms_dtls_srtp_set_peer_fingerprint(call->videostream->ms.sessions.dtls_context, remote_desc->streams[1].dtls_fingerprint); - } else { - ms_warning("unable to start DTLS engine on videostream, Dtls role in resulting media description is invalid\n"); - } - if (salRole == SalDtlsRoleIsClient) { /* local endpoint is client */ - ms_dtls_srtp_set_role(call->videostream->ms.sessions.dtls_context, MSDtlsSrtpRoleIsClient); /* set the role to client */ - ms_dtls_srtp_start(call->videostream->ms.sessions.dtls_context); /* then start the engine, it will send the DTLS client Hello */ - } else if (salRole == SalDtlsRoleIsServer) { /* local endpoint is server */ - ms_dtls_srtp_set_role(call->videostream->ms.sessions.dtls_context, MSDtlsSrtpRoleIsServer); /* this may complete the server setup */ - /* no need to start engine, we are waiting for DTLS Client Hello */ - } - -#endif - - } else { + }else if (call->params->media_encryption==LinphoneMediaEncryptionSRTP){ call->current_params->media_encryption=linphone_call_all_streams_encrypted(call) ? LinphoneMediaEncryptionSRTP : LinphoneMediaEncryptionNone; } @@ -3269,10 +3271,18 @@ static void handle_ice_events(LinphoneCall *call, OrtpEvent *ev){ if (evt == ORTP_EVENT_ICE_SESSION_PROCESSING_FINISHED) { LinphoneCallParams *params = linphone_call_params_copy(call->current_params); - if (call->params->media_encryption == LinphoneMediaEncryptionZRTP) { - /* preserve media encryption param because at that time ZRTP negociation may still be ongoing*/ + switch (call->params->media_encryption) { + case LinphoneMediaEncryptionZRTP: + case LinphoneMediaEncryptionDTLS: + /* preserve media encryption param because at that time ZRTP/SRTP-DTLS negociation may still be ongoing*/ params->media_encryption=call->params->media_encryption; + break; + case LinphoneMediaEncryptionSRTP: + case LinphoneMediaEncryptionNone: + /*keep all values to make sure a warning will be generated by compiler if new enum value is added*/ + break; } + switch (ice_session_state(call->ice_session)) { case IS_Completed: ice_session_select_candidates(call->ice_session); diff --git a/tester/call_tester.c b/tester/call_tester.c index be6e4a29c..3dcc2a270 100644 --- a/tester/call_tester.c +++ b/tester/call_tester.c @@ -1350,18 +1350,33 @@ static bool_t add_video(LinphoneCoreManager* caller,LinphoneCoreManager* callee) CU_ASSERT_TRUE(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) { - /*wait for encryption to be on, in case of zrtp, it can take a few seconds*/ - if (linphone_core_get_media_encryption(caller->lc) == LinphoneMediaEncryptionZRTP) - wait_for(callee->lc,caller->lc,&caller->stat.number_of_LinphoneCallEncryptedOn,initial_caller_stat.number_of_LinphoneCallEncryptedOn+1); - if (linphone_core_get_media_encryption(callee->lc) == LinphoneMediaEncryptionZRTP) - wait_for(callee->lc,caller->lc,&callee->stat.number_of_LinphoneCallEncryptedOn,initial_callee_stat.number_of_LinphoneCallEncryptedOn+1); + const LinphoneCallParams* call_param; - { - const LinphoneCallParams* call_param = linphone_call_get_current_params(linphone_core_get_current_call(callee->lc)); + switch (linphone_core_get_media_encryption(caller->lc)) { + case LinphoneMediaEncryptionZRTP: + case LinphoneMediaEncryptionDTLS: + /*wait for encryption to be on, in case of zrtp/dtls, it can take a few seconds*/ + wait_for(callee->lc,caller->lc,&caller->stat.number_of_LinphoneCallEncryptedOn,initial_caller_stat.number_of_LinphoneCallEncryptedOn+1); + break; + case LinphoneMediaEncryptionNone: + case LinphoneMediaEncryptionSRTP: + break; + } + switch (linphone_core_get_media_encryption(callee->lc)) { + case LinphoneMediaEncryptionZRTP: + case LinphoneMediaEncryptionDTLS: + wait_for(callee->lc,caller->lc,&callee->stat.number_of_LinphoneCallEncryptedOn,initial_callee_stat.number_of_LinphoneCallEncryptedOn+1); + break; + case LinphoneMediaEncryptionNone: + case LinphoneMediaEncryptionSRTP: + break; + } + + 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)); 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)); - } + } linphone_call_set_next_video_frame_decoded_callback(call_obj,linphone_call_cb,callee->lc); @@ -1548,7 +1563,7 @@ static void call_with_declined_video_using_policy(void) { call_with_declined_video_base(TRUE); } -static void video_call_base(LinphoneCoreManager* pauline,LinphoneCoreManager* marie, bool_t using_policy) { +static void video_call_base(LinphoneCoreManager* pauline,LinphoneCoreManager* marie, bool_t using_policy,LinphoneMediaEncryption mode) { LinphoneCallTestParams caller_test_params = {0}, callee_test_params = {0}; LinphoneCall* marie_call; LinphoneCall* pauline_call; @@ -1569,6 +1584,9 @@ static void video_call_base(LinphoneCoreManager* pauline,LinphoneCoreManager* ma linphone_core_set_video_policy(pauline->lc,&pauline_policy); } + linphone_core_set_media_encryption(marie->lc,mode); + linphone_core_set_media_encryption(pauline->lc,mode); + caller_test_params.base=linphone_core_create_default_call_parameters(pauline->lc); if (!using_policy) linphone_call_params_enable_video(caller_test_params.base,TRUE); @@ -1605,15 +1623,38 @@ static void video_call_base(LinphoneCoreManager* pauline,LinphoneCoreManager* ma static void video_call(void) { LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc"); - video_call_base(marie,pauline,FALSE); + video_call_base(marie,pauline,FALSE,LinphoneMediaEncryptionNone); linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); } +static void video_call_zrtp(void) { + LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); + LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc"); + if (linphone_core_media_encryption_supported(marie->lc,LinphoneMediaEncryptionDTLS)) { + video_call_base(marie,pauline,FALSE,LinphoneMediaEncryptionZRTP); + } else + ms_message("Skipping video_call_zrtp"); + linphone_core_manager_destroy(marie); + linphone_core_manager_destroy(pauline); +} + +static void video_call_dtls(void) { + LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); + LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc"); + if (linphone_core_media_encryption_supported(pauline->lc,LinphoneMediaEncryptionDTLS)) { + video_call_base(marie,pauline,FALSE,LinphoneMediaEncryptionDTLS); + } else + ms_message("Skipping video_call_dtls"); + linphone_core_manager_destroy(marie); + linphone_core_manager_destroy(pauline); + +} + static void video_call_using_policy(void) { LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc"); - video_call_base(marie,pauline,TRUE); + video_call_base(marie,pauline,TRUE,LinphoneMediaEncryptionNone); linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); } @@ -1622,7 +1663,7 @@ static void video_call_no_sdp(void) { LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc"); linphone_core_enable_sdp_200_ack(pauline->lc,TRUE); - video_call_base(pauline,marie,FALSE); + video_call_base(pauline,marie,FALSE,LinphoneMediaEncryptionNone); linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); } @@ -2066,6 +2107,21 @@ static void dtls_srtp_call() { call_base(LinphoneMediaEncryptionDTLS,FALSE,FALSE,LinphonePolicyNoFirewall,FALSE); } +static void dtls_srtp_ice_call() { + call_base(LinphoneMediaEncryptionDTLS,FALSE,FALSE,LinphonePolicyUseIce,FALSE); +} +#ifdef VIDEO_ENABLED +static void dtls_srtp_video_call() { + call_base(LinphoneMediaEncryptionDTLS,TRUE,FALSE,LinphonePolicyNoFirewall,FALSE); +} + +static void dtls_srtp_ice_video_call() { + call_base(LinphoneMediaEncryptionDTLS,TRUE,FALSE,LinphonePolicyUseIce,FALSE); +} +static void dtls_srtp_ice_video_call_with_relay() { + call_base(LinphoneMediaEncryptionDTLS,TRUE,TRUE,LinphonePolicyUseIce,FALSE); +} +#endif static void call_with_declined_srtp(void) { LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc"); @@ -2342,6 +2398,10 @@ static void zrtp_ice_call_with_relay(void) { call_base(LinphoneMediaEncryptionZRTP,FALSE,TRUE,LinphonePolicyUseIce,FALSE); } +static void dtls_ice_call_with_relay(void) { + call_base(LinphoneMediaEncryptionDTLS,FALSE,TRUE,LinphonePolicyUseIce,FALSE); +} + static void early_media_call(void) { LinphoneCoreManager* marie = linphone_core_manager_new( "marie_early_rc"); LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc"); @@ -3568,6 +3628,8 @@ test_t call_tests[] = { { "Audio call with ICE no matching audio codecs", audio_call_with_ice_no_matching_audio_codecs }, #ifdef VIDEO_ENABLED { "Simple video call",video_call}, + { "Simple ZRTP video call",video_call_zrtp}, + { "Simple DTLS video call",video_call_dtls}, { "Simple video call using policy",video_call_using_policy}, { "Video call without SDP",video_call_no_sdp}, { "SRTP ice video call", srtp_video_ice_call }, @@ -3584,10 +3646,15 @@ test_t call_tests[] = { { "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 }, + { "DTLS SRTP video call",dtls_srtp_video_call}, + { "DTLS SRTP ice video call",dtls_srtp_ice_video_call}, + { "DTLS SRTP ice video call with relay",dtls_srtp_ice_video_call_with_relay}, #endif { "SRTP ice call", srtp_ice_call }, { "ZRTP ice call", zrtp_ice_call }, { "ZRTP ice call with relay", zrtp_ice_call_with_relay}, + { "DTLS SRTP ice call",dtls_srtp_ice_call}, + { "DTLS ice call with relay", dtls_ice_call_with_relay}, { "Call with privacy", call_with_privacy }, { "Call with privacy 2", call_with_privacy2 }, { "Call rejected because of wrong credential", call_rejected_because_wrong_credentials}, From 9b364df8f4c371a349ac4303b1662886aeff803d Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Sat, 14 Feb 2015 10:21:33 +0100 Subject: [PATCH 02/90] fix mkv file player test (was broken due to hello8000 changed) and fix assert not working on windows --- mediastreamer2 | 2 +- oRTP | 2 +- tester/call_tester.c | 13 +++++++++---- tester/sounds/hello8000_mkv_ref.wav | Bin 0 -> 183200 bytes 4 files changed, 11 insertions(+), 6 deletions(-) create mode 100644 tester/sounds/hello8000_mkv_ref.wav diff --git a/mediastreamer2 b/mediastreamer2 index 394858138..a9e3a9844 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 3948581385b9521c17a54c05c05d613add95e631 +Subproject commit a9e3a984485ef8d22394d06fa75497296daa4c66 diff --git a/oRTP b/oRTP index 7822737d9..22b81144d 160000 --- a/oRTP +++ b/oRTP @@ -1 +1 @@ -Subproject commit 7822737d9cce52a956594d9466cb6419595ed7a8 +Subproject commit 22b81144d313b58cfe53c1c9aa71dcf22e1f43c2 diff --git a/tester/call_tester.c b/tester/call_tester.c index 3dcc2a270..bddffa0b1 100644 --- a/tester/call_tester.c +++ b/tester/call_tester.c @@ -2230,7 +2230,7 @@ static void call_with_mkv_file_player(void) { /*make sure the record file doesn't already exists, otherwise this test will append new samples to it*/ unlink(recordpath); - snprintf(hellowav,sizeof(hellowav), "%s/sounds/hello8000.wav", liblinphone_tester_file_prefix); + snprintf(hellowav,sizeof(hellowav), "%s/sounds/hello8000_mkv_ref.wav", liblinphone_tester_file_prefix); snprintf(hellomkv,sizeof(hellomkv), "%s/sounds/hello8000.mkv", liblinphone_tester_file_prefix); /*caller uses files instead of soundcard in order to avoid mixing soundcard input with file played using call's player*/ @@ -3563,19 +3563,24 @@ static void call_with_generic_cn(void) { CU_ASSERT_PTR_NOT_NULL(pauline_call); if (pauline_call){ const rtp_stats_t *rtps; - struct stat stbuf; - int err; 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); + } + end_call(marie,pauline); + + if (pauline_call){ + struct stat stbuf; + int err; + err=stat(recorded_file,&stbuf); CU_ASSERT_EQUAL(err, 0); if (err==0){ CU_ASSERT_TRUE(stbuf.st_size>120000); } } - end_call(marie,pauline); + linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); diff --git a/tester/sounds/hello8000_mkv_ref.wav b/tester/sounds/hello8000_mkv_ref.wav new file mode 100644 index 0000000000000000000000000000000000000000..f91203cd8ebbc27ca270f148e6b8f1f7523196d2 GIT binary patch literal 183200 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 iV4<#N!ib&w{jlK4 Date: Sat, 14 Feb 2015 15:31:41 +0100 Subject: [PATCH 03/90] update ms2, add message processing loop for windows --- mediastreamer2 | 2 +- tester/tester.c | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index a9e3a9844..07a8b5693 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit a9e3a984485ef8d22394d06fa75497296daa4c66 +Subproject commit 07a8b569317d23e9442882be267d6640498a7b5e diff --git a/tester/tester.c b/tester/tester.c index 741fc8938..b046c065e 100644 --- a/tester/tester.c +++ b/tester/tester.c @@ -211,6 +211,15 @@ bool_t wait_for_list(MSList* lcs,int* counter,int value,int timeout_ms) { #endif linphone_core_iterate((LinphoneCore*)(iterator->data)); } +#ifdef WIN32 + { + MSG msg; + while (PeekMessage(&msg, NULL, 0, 0,1)){ + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } +#endif ms_usleep(20000); } if(counter && *counter Date: Sat, 14 Feb 2015 17:14:05 +0100 Subject: [PATCH 04/90] don't force using vp8 --- tester/video_tester.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tester/video_tester.c b/tester/video_tester.c index c1807f3fe..7e3809e31 100644 --- a/tester/video_tester.c +++ b/tester/video_tester.c @@ -193,7 +193,12 @@ static LinphoneCallParams * _configure_for_video(LinphoneCoreManager *manager, L linphone_core_enable_video_display(manager->lc, TRUE); params = linphone_core_create_default_call_parameters(manager->lc); linphone_call_params_enable_video(params, TRUE); - disable_all_video_codecs_except_one(manager->lc, "VP8"); + if (linphone_core_find_payload_type(manager->lc,"VP8", 90000, -1)!=NULL){ + disable_all_video_codecs_except_one(manager->lc, "VP8"); + }else{ + ms_warning("VP8 codec not available, will use MP4V-ES instead"); + disable_all_video_codecs_except_one(manager->lc, "MP4V-ES"); + } return params; } From 52e9e229bea2d20053f349c1250966710af4cb0b Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Sat, 14 Feb 2015 17:38:04 +0100 Subject: [PATCH 05/90] relax tests --- tester/call_tester.c | 16 ++++++++-------- tester/flexisip_tester.c | 8 ++++---- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/tester/call_tester.c b/tester/call_tester.c index bddffa0b1..44e1a54c8 100644 --- a/tester/call_tester.c +++ b/tester/call_tester.c @@ -226,7 +226,7 @@ bool_t call_with_params2(LinphoneCoreManager* caller_mgr CU_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)); + ||(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)); @@ -271,10 +271,10 @@ bool_t call_with_params2(LinphoneCoreManager* caller_mgr if ((linphone_core_get_media_encryption(callee_mgr->lc) == LinphoneMediaEncryptionZRTP) || (linphone_core_get_media_encryption(callee_mgr->lc) == LinphoneMediaEncryptionDTLS)) 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)); - 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(callee_mgr->lc)); + const LinphoneCallParams* call_param = linphone_call_get_current_params(linphone_core_get_current_call(callee_mgr->lc)); + 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(callee_mgr->lc)); } } return result; @@ -1983,9 +1983,9 @@ static void call_waiting_indication_with_param(bool_t enable_caller_privacy) { 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,2000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallEnd,1,2000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&laure->stat.number_of_LinphoneCallEnd,1,2000)); + 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); diff --git a/tester/flexisip_tester.c b/tester/flexisip_tester.c index 06d8200cf..9f624572c 100644 --- a/tester/flexisip_tester.c +++ b/tester/flexisip_tester.c @@ -146,7 +146,7 @@ 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,1000)); + CU_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); @@ -195,9 +195,9 @@ static void call_forking(void){ /*pauline should hear ringback*/ CU_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)); + 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)); /*marie accepts the call on its first device*/ linphone_core_accept_call(marie->lc,linphone_core_get_current_call(marie->lc)); From 3b15ef89cf924719bc04bbc6e459d639d757d2ee Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Sat, 14 Feb 2015 19:10:09 +0100 Subject: [PATCH 06/90] relax tests again --- tester/call_tester.c | 6 +++--- tester/flexisip_tester.c | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/tester/call_tester.c b/tester/call_tester.c index 44e1a54c8..e0badd199 100644 --- a/tester/call_tester.c +++ b/tester/call_tester.c @@ -2056,9 +2056,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,2000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallEnd,1,2000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&laure->stat.number_of_LinphoneCallEnd,1,2000)); + 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)); diff --git a/tester/flexisip_tester.c b/tester/flexisip_tester.c index 9f624572c..3a4069857 100644 --- a/tester/flexisip_tester.c +++ b/tester/flexisip_tester.c @@ -396,7 +396,7 @@ static void call_forking_with_push_notification_single(void){ /*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,1000)); + 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)); @@ -404,8 +404,8 @@ static void call_forking_with_push_notification_single(void){ 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,1000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallEnd,1,1000)); + 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)); linphone_core_manager_destroy(pauline); linphone_core_manager_destroy(marie); From 97c2607ec7f17c8df2079ff9d97835e5f5549867 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Sat, 14 Feb 2015 22:05:12 +0100 Subject: [PATCH 07/90] relax tests, ms2 and ortp must appear first in the link command to make sure that they are taken for inner directories. --- coreapi/Makefile.am | 4 ++-- tester/call_tester.c | 38 ++++++++++++++++++++------------------ 2 files changed, 22 insertions(+), 20 deletions(-) diff --git a/coreapi/Makefile.am b/coreapi/Makefile.am index 85f65bcf1..40a26ccab 100644 --- a/coreapi/Makefile.am +++ b/coreapi/Makefile.am @@ -131,9 +131,9 @@ endif endif liblinphone_la_LIBADD= \ - $(SIPSTACK_LIBS) \ $(MEDIASTREAMER_LIBS) \ - $(ORTP_LIBS) $(OPENSSL_LIBS) \ + $(ORTP_LIBS) \ + $(SIPSTACK_LIBS) \ $(TUNNEL_LIBS) \ $(LIBSOUP_LIBS) \ $(SQLITE3_LIBS) \ diff --git a/tester/call_tester.c b/tester/call_tester.c index e0badd199..d19161460 100644 --- a/tester/call_tester.c +++ b/tester/call_tester.c @@ -2900,32 +2900,34 @@ 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,1000)); + CU_ASSERT_TRUE(wait_for_list(lcs, &pauline->stat.number_of_LinphoneCallIncomingReceived,1,6000)); - margaux_url = linphone_address_as_string(laure->identity); - linphone_core_redirect_call(pauline->lc, linphone_core_get_current_call(pauline->lc), margaux_url); - ms_free(margaux_url); + if (linphone_core_get_current_call(pauline->lc)){ + margaux_url = linphone_address_as_string(laure->identity); + linphone_core_redirect_call(pauline->lc, linphone_core_get_current_call(pauline->lc), margaux_url); + ms_free(margaux_url); - /* laure should be ringing now */ - CU_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)); - /* the call should still be ringing on marie's side */ - CU_ASSERT_TRUE(wait_for_list(lcs, &marie->stat.number_of_LinphoneCallOutgoingRinging, 1,1000)); + /* laure should be ringing now */ + CU_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)); + /* the call should still be ringing on marie's side */ + CU_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)); + 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)); + 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)); - CU_ASSERT_EQUAL(marie_call, linphone_core_get_current_call(marie->lc)); + CU_ASSERT_EQUAL(marie_call, linphone_core_get_current_call(marie->lc)); - liblinphone_tester_check_rtcp(marie, laure); + liblinphone_tester_check_rtcp(marie, laure); - linphone_core_terminate_all_calls(laure->lc); + linphone_core_terminate_all_calls(laure->lc); - CU_ASSERT_TRUE(wait_for_list(lcs,&laure->stat.number_of_LinphoneCallEnd,1,1000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallEnd,1,1000)); + 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)); + } ms_list_free(lcs); From 847713bb82969a3c9890b7d90751778b5121f38f Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Sat, 14 Feb 2015 22:44:37 +0100 Subject: [PATCH 08/90] fix beautiful bug in getline() implementation, causing crash on windows --- tester/log_collection_tester.c | 44 ++++++++++++++++++++-------------- 1 file changed, 26 insertions(+), 18 deletions(-) diff --git a/tester/log_collection_tester.c b/tester/log_collection_tester.c index 3fbbd43c2..96531422a 100644 --- a/tester/log_collection_tester.c +++ b/tester/log_collection_tester.c @@ -35,7 +35,7 @@ /*getline is POSIX 2008, not available on many systems.*/ #if defined(ANDROID) || defined(WIN32) /* This code is public domain -- Will Hartung 4/9/09 */ -size_t getline(char **lineptr, size_t *n, FILE *stream) { +static size_t getline(char **lineptr, size_t *n, FILE *stream) { char *bufptr = NULL; char *p = bufptr; size_t size; @@ -66,9 +66,12 @@ size_t getline(char **lineptr, size_t *n, FILE *stream) { } p = bufptr; while(c != EOF) { - if ((p - bufptr) > (size - 1)) { + size_t curpos = p-bufptr; + + if (curpos > (size - 1)) { size = size + 128; bufptr = realloc(bufptr, size); + p = bufptr + curpos; if (bufptr == NULL) { return -1; } @@ -89,19 +92,19 @@ size_t getline(char **lineptr, size_t *n, FILE *stream) { #endif static LinphoneLogCollectionState old_collection_state; -void collect_init() { +static void collect_init() { old_collection_state = linphone_core_log_collection_enabled(); linphone_core_set_log_collection_path(liblinphone_tester_writable_dir_prefix); } -void collect_cleanup(LinphoneCoreManager *marie) { +static void collect_cleanup(LinphoneCoreManager *marie) { linphone_core_manager_destroy(marie); linphone_core_enable_log_collection(old_collection_state); linphone_core_reset_log_collection(); } -LinphoneCoreManager* setup(bool_t enable_logs) { +static LinphoneCoreManager* setup(bool_t enable_logs) { LinphoneCoreManager *marie; int timeout = 300; @@ -119,27 +122,28 @@ LinphoneCoreManager* setup(bool_t enable_logs) { } #if HAVE_ZLIB + /*returns uncompressed log file*/ -FILE* gzuncompress(const char* filepath) { +static FILE* gzuncompress(const char* filepath) { gzFile file = gzopen(filepath, "rb"); FILE *output = NULL; + FILE *ret; char *newname = ms_strdup_printf("%s.txt", filepath); - char buffer[512]; - output = fopen(newname, "w+"); + char buffer[512]={0}; + output = fopen(newname, "wb"); while (gzread(file, buffer, 511) > 0) { fputs(buffer, output); memset(buffer, 0, strlen(buffer)); } - + fclose(output); CU_ASSERT_EQUAL(gzclose(file), Z_OK); + ret=fopen(newname, "rb"); ms_free(newname); - - fseek(output, 0, SEEK_SET); - return (FILE*)output; + return ret; } #endif -time_t check_file(LinphoneCoreManager* mgr) { +static time_t check_file(LinphoneCoreManager* mgr) { time_t last_log = ms_time(NULL); char* filepath = linphone_core_compress_log_collection(mgr->lc); @@ -162,9 +166,10 @@ time_t check_file(LinphoneCoreManager* mgr) { // 0) if zlib is enabled, we must decompress the file first file = gzuncompress(filepath); #else - file = fopen(filepath, "r"); + file = fopen(filepath, "rb"); #endif - + CU_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, liblinphone_tester_writable_dir_prefix)); @@ -183,8 +188,6 @@ time_t check_file(LinphoneCoreManager* mgr) { time_prev = time_curr; } } -#else - ms_warning("strptime() not available for this platform, test is incomplete."); #endif } CU_ASSERT_TRUE(line_count > 25); @@ -192,12 +195,17 @@ time_t check_file(LinphoneCoreManager* mgr) { fclose(file); ms_free(filepath); - timediff = labs((long int)time_curr - (long int)last_log); + timediff = labs((long int)time_curr - (long int)last_log); + (void)timediff; +#ifndef WIN32 CU_ASSERT_TRUE( timediff <= 1 ); if( !(timediff <= 1) ){ ms_error("time_curr: %ld, last_log: %ld timediff: %u", (long int)time_curr, (long int)last_log, timediff ); } +#else + ms_warning("strptime() not available for this platform, test is incomplete."); +#endif } // return latest time in file return time_curr; From 7a2ca89183fa9fbc3ffdc9ce272e8d827c30bbdf Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Sun, 15 Feb 2015 15:01:13 +0100 Subject: [PATCH 09/90] increase tester's timeouts --- tester/eventapi_tester.c | 12 ++++++------ tester/flexisip_tester.c | 6 +++--- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/tester/eventapi_tester.c b/tester/eventapi_tester.c index abd8c0a30..fbe48f9a4 100644 --- a/tester/eventapi_tester.c +++ b/tester/eventapi_tester.c @@ -247,11 +247,11 @@ static void subscribe_test_with_args2(bool_t terminated_by_subscriber, RefreshTe 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,1000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneSubscriptionActive,1,1000)); + 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)); /*make sure marie receives first notification before terminating*/ - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_NotifyReceived,1,1000)); + CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_NotifyReceived,1,5000)); if (refresh_type==AutoRefresh){ wait_for_list(lcs,NULL,0,6000); @@ -259,7 +259,7 @@ static void subscribe_test_with_args2(bool_t terminated_by_subscriber, RefreshTe }else if (refresh_type==ManualRefresh){ CU_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)); + CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneSubscriptionActive,2,5000)); } if (terminated_by_subscriber){ @@ -269,8 +269,8 @@ static void subscribe_test_with_args2(bool_t terminated_by_subscriber, RefreshTe 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)); + 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)); linphone_content_unref(content); linphone_core_manager_destroy(marie); diff --git a/tester/flexisip_tester.c b/tester/flexisip_tester.c index 3a4069857..7f4680639 100644 --- a/tester/flexisip_tester.c +++ b/tester/flexisip_tester.c @@ -574,8 +574,8 @@ static void early_media_call_forking(void) { && 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,1000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie1->stat.number_of_LinphoneCallEnd,1,1000)); + 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)); ms_list_free(lcs); linphone_core_manager_destroy(marie1); @@ -643,7 +643,7 @@ 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,3000)); + CU_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); if (ei){ From 009fe8afc943d2c9f457f2f34f0224ffd41c0045 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Grisez?= Date: Mon, 16 Feb 2015 15:09:22 +0100 Subject: [PATCH 10/90] Add an appdata file for Linphone --- share/Makefile.am | 3 +++ share/linphone.appdata.xml | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 share/linphone.appdata.xml diff --git a/share/Makefile.am b/share/Makefile.am index f0df44261..ca8f2e233 100644 --- a/share/Makefile.am +++ b/share/Makefile.am @@ -32,6 +32,9 @@ pkgconfig_DATA=linphone.pc linphonedir=$(datadir)/linphone linphone_DATA=rootca.pem +appdatadir=$(datadir)/appdata +appdata_DATA=linphone.appdata.xml + #download root ca from mozilla using script from curl (mk-ca-bundle.pl). #if that fails (no connection, no perl SSL...) , then a rootca bundle archived in the source tree is taken instead. rootca.pem: diff --git a/share/linphone.appdata.xml b/share/linphone.appdata.xml new file mode 100644 index 000000000..db660b614 --- /dev/null +++ b/share/linphone.appdata.xml @@ -0,0 +1,36 @@ + + + + linphone.desktop + CC0-1.0 + GPL-2.0 + Linphone + SIP video soft-phone + +
    +
  • Make audio and video calls in HD
  • +
  • Create audio conferences
  • +
  • Record and store calls
  • +
  • View real-time presence status
  • +
  • Manage your address book
  • +
  • Communicate securely
  • +
  • Free subscription
  • +
+
+ + + http://www.linphone.org/uploads/images/desktop_main_window.png + Main window + + + http://www.linphone.org/uploads/images/desktop_call_view.png + Call view + + + http://www.linphone.org/uploads/images/desktop_chat_view.png + Chat view + + + http://www.linphone.org + contact@belledonne-communications.com +
From ccb890ad9431f62617d761c9b0bd601fe1340e02 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Mon, 16 Feb 2015 17:50:28 +0100 Subject: [PATCH 11/90] simplify dtls session/media description attributes mgt --- coreapi/bellesip_sal/sal_sdp.c | 59 +++++++++------------------ coreapi/linphonecall.c | 33 ++++++++------- coreapi/offeranswer.c | 74 +++++++++++++--------------------- include/sal/sal.h | 2 - mediastreamer2 | 2 +- 5 files changed, 64 insertions(+), 106 deletions(-) diff --git a/coreapi/bellesip_sal/sal_sdp.c b/coreapi/bellesip_sal/sal_sdp.c index ce780c1cf..ed34c634a 100644 --- a/coreapi/bellesip_sal/sal_sdp.c +++ b/coreapi/bellesip_sal/sal_sdp.c @@ -389,23 +389,6 @@ belle_sdp_session_description_t * media_description_to_sdp ( const SalMediaDescr if (desc->ice_pwd[0] != '\0') belle_sdp_session_description_add_attribute(session_desc, belle_sdp_attribute_create("ice-pwd",desc->ice_pwd)); if (desc->ice_ufrag[0] != '\0') belle_sdp_session_description_add_attribute(session_desc, belle_sdp_attribute_create("ice-ufrag",desc->ice_ufrag)); - /* insert DTLS session attribute if needed */ - if ((desc->dtls_role != SalDtlsRoleInvalid) && (strlen(desc->dtls_fingerprint)>0)) { - switch(desc->dtls_role) { - case SalDtlsRoleIsClient: - belle_sdp_session_description_add_attribute(session_desc, belle_sdp_attribute_create("setup","active")); - break; - case SalDtlsRoleIsServer: - belle_sdp_session_description_add_attribute(session_desc, belle_sdp_attribute_create("setup","passive")); - break; - case SalDtlsRoleUnset: - default: - belle_sdp_session_description_add_attribute(session_desc, belle_sdp_attribute_create("setup","actpass")); - break; - } - belle_sdp_session_description_add_attribute(session_desc, belle_sdp_attribute_create("fingerprint",desc->dtls_fingerprint)); - } - if (desc->rtcp_xr.enabled == TRUE) { belle_sdp_session_description_add_attribute(session_desc, create_rtcp_xr_attribute(&desc->rtcp_xr)); } @@ -777,20 +760,10 @@ static SalStreamDescription * sdp_to_stream_description(SalMediaDescription *md, } else if (strncmp(value, "passive", 7) == 0) { stream->dtls_role = SalDtlsRoleIsServer; } - - if (stream->dtls_role != SalDtlsRoleInvalid || md->dtls_role != SalDtlsRoleInvalid) { + if (stream->dtls_role != SalDtlsRoleInvalid) { attribute=belle_sdp_media_description_get_attribute(media_desc,"fingerprint"); - if (attribute && (value=belle_sdp_attribute_get_value(attribute))!=NULL){ - strncpy(stream->dtls_fingerprint, value, sizeof(stream->dtls_fingerprint)-1); - } else { - /* no valid stream attributes, get them from session */ - if (stream->dtls_role == SalDtlsRoleInvalid) stream->dtls_role = md->dtls_role; - strncpy(stream->dtls_fingerprint, md->dtls_fingerprint, strlen(md->dtls_fingerprint)+1); - } + strncpy(stream->dtls_fingerprint, belle_sdp_attribute_get_value(attribute),sizeof(stream->dtls_fingerprint)); } - } else { /* no setup attribute found in the stream, get the one from the session */ - stream->dtls_role = md->dtls_role; - strncpy(stream->dtls_fingerprint, md->dtls_fingerprint, strlen(md->dtls_fingerprint)+1); } } @@ -849,26 +822,30 @@ int sdp_to_media_description ( belle_sdp_session_description_t *session_desc, S desc->dir=SalStreamInactive; } - /* Read dtls specific session attributes if any (setup and fingerprint - rfc5763) */ - /* Presence of a valid dtls offer(setup and fingerprint attribute) is set in media Description by a dtls_fingerprint string longer than 0 - * and a dtls_role != SalDtlsRoleInvalid */ - desc->dtls_role = SalDtlsRoleInvalid; - desc->dtls_fingerprint[0] = '\0'; + /*DTLS attributes can be defined at session level.*/ value=belle_sdp_session_description_get_attribute_value(session_desc,"setup"); if (value){ + SalDtlsRole session_role; if (strncmp(value, "actpass", 7) == 0) { - desc->dtls_role = SalDtlsRoleUnset; + session_role = SalDtlsRoleUnset; } else if (strncmp(value, "active", 6) == 0) { - desc->dtls_role = SalDtlsRoleIsClient; + session_role = SalDtlsRoleIsClient; } else if (strncmp(value, "passive", 7) == 0) { - desc->dtls_role = SalDtlsRoleIsServer; + session_role = SalDtlsRoleIsServer; } + value=belle_sdp_session_description_get_attribute_value(session_desc,"fingerprint"); + if (value){ + int i; + /*copy dtls attributes to every streams, might be overwritten stream by stream*/ + for (i=0;istreams[i].dtls_fingerprint, value, sizeof(desc->streams[i].dtls_fingerprint)); + desc->streams[i].dtls_role=session_role; + } + } + } - value=belle_sdp_session_description_get_attribute_value(session_desc,"fingerprint"); - if (value){ - strncpy(desc->dtls_fingerprint, value, sizeof(desc->dtls_fingerprint)-1); - } + /* Get ICE remote ufrag and remote pwd, and ice_lite flag */ value=belle_sdp_session_description_get_attribute_value(session_desc,"ice-ufrag"); diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c index f5aff970d..8cd0c1352 100644 --- a/coreapi/linphonecall.c +++ b/coreapi/linphonecall.c @@ -438,7 +438,22 @@ static int setup_encryption_key(SalSrtpCryptoAlgo *crypto, MSCryptoSuite suite, } return 0; } +static void setup_dtls_keys(LinphoneCall *call, SalMediaDescription *md){ + int i; + for(i=0; inb_streams; i++) { + if (!sal_stream_description_active(&md->streams[i])) continue; + /* if media encryption is set to DTLS check presence of fingerprint in the call which shall have been set at stream init but it may have failed when retrieving certificate resulting in no fingerprint present and then DTLS not usable */ + if (sal_stream_description_has_dtls(&md->streams[i]) == TRUE) { + strncpy(md->streams[i].dtls_fingerprint, call->dtls_certificate_fingerprint, sizeof(md->streams[i].dtls_fingerprint)); /* get the self fingerprint from call(it's computed at stream init) */ + md->streams[i].dtls_role = SalDtlsRoleUnset; /* if we are offering, SDP will have actpass setup attribute when role is unset, if we are responding the result mediadescription will be set to SalDtlsRoleIsClient */ + } else { + md->streams[i].dtls_fingerprint[0] = '\0'; + md->streams[i].dtls_role = SalDtlsRoleInvalid; + } + } + +} static void setup_encryption_keys(LinphoneCall *call, SalMediaDescription *md){ LinphoneCore *lc=call->core; int i,j; @@ -675,16 +690,8 @@ void linphone_call_make_local_media_description(LinphoneCore *lc, LinphoneCall * l = make_codec_list(lc, &codec_hints, lc->codecs_conf.video_codecs); md->streams[i].payloads = l; } - setup_encryption_keys(call,md); - /* if media encryption is set to DTLS check presence of fingerprint in the call which shall have been set at stream init but it may have failed when retrieving certificate resulting in no fingerprint present and then DTLS not usable */ - if ((call->params->media_encryption==LinphoneMediaEncryptionDTLS) && (call->dtls_certificate_fingerprint!= NULL)) { - memcpy(md->dtls_fingerprint, call->dtls_certificate_fingerprint, strlen((const char *)(call->dtls_certificate_fingerprint))); /* get the self fingerprint from call(it's computed at stream init) */ - md->dtls_role = SalDtlsRoleUnset; /* if we are offering, SDP will have actpass setup attribute when role is unset, if we are responding the result mediadescription will be set to SalDtlsRoleIsClient */ - } else { - md->dtls_fingerprint[0] = '\0'; - md->dtls_role = SalDtlsRoleInvalid; - } + setup_dtls_keys(call,md); setup_rtcp_fb(call, md); setup_rtcp_xr(call, md); @@ -2434,10 +2441,6 @@ static void linphone_call_start_audio_stream(LinphoneCall *call, bool_t muted, b /* DTLS engine was already initialised during stream init. Before starting it we must be sure that the role(client or server) is set. * Role may have already been set to server if we initiate the call and already received a packet from peer, in that case do nothing */ SalDtlsRole salRole = stream->dtls_role; - if (salRole==SalDtlsRoleInvalid) { /* it's invalid in streams[0] but check also at session level */ - salRole = call->resultdesc->dtls_role; - } - if (salRole!=SalDtlsRoleInvalid) { /* if DTLS is available at both end points */ /* give the peer certificate fingerprint to dtls context */ SalMediaDescription *remote_desc = sal_call_get_remote_media_description(call->op); @@ -2582,10 +2585,6 @@ static void linphone_call_start_video_stream(LinphoneCall *call, bool_t all_inpu if (sal_stream_description_has_dtls(vstream) == TRUE) { /*DTLS*/ SalDtlsRole salRole = vstream->dtls_role; - if (salRole==SalDtlsRoleInvalid) { /* it's invalid in streams[0] but check also at session level */ - salRole = call->resultdesc->dtls_role; - } - if (salRole!=SalDtlsRoleInvalid) { /* if DTLS is available at both end points */ /* give the peer certificate fingerprint to dtls context */ SalMediaDescription *remote_desc = sal_call_get_remote_media_description(call->op); diff --git a/coreapi/offeranswer.c b/coreapi/offeranswer.c index 9baedd158..a74105963 100644 --- a/coreapi/offeranswer.c +++ b/coreapi/offeranswer.c @@ -394,6 +394,21 @@ static void initiate_outgoing(const SalStreamDescription *local_offer, result->rtp_ssrc=local_offer->rtp_ssrc; strncpy(result->rtcp_cname,local_offer->rtcp_cname,sizeof(result->rtcp_cname)); + // Handle dtls session attribute: if both local and remote have a dtls fingerprint and a dtls setup, get the remote fingerprint into the result + if ((local_offer->dtls_role!=SalDtlsRoleInvalid) && (remote_answer->dtls_role!=SalDtlsRoleInvalid) + &&(strlen(local_offer->dtls_fingerprint)>0) && (strlen(remote_answer->dtls_fingerprint)>0)) { + strncpy(result->dtls_fingerprint, remote_answer->dtls_fingerprint,sizeof(result->dtls_fingerprint)); + if (remote_answer->dtls_role==SalDtlsRoleIsClient) { + result->dtls_role = SalDtlsRoleIsServer; + } else { + result->dtls_role = SalDtlsRoleIsClient; + } + } else { + result->dtls_fingerprint[0] = '\0'; + result->dtls_role = SalDtlsRoleInvalid; + } + + } @@ -449,6 +464,20 @@ static void initiate_incoming(const SalStreamDescription *local_cap, result->rtp_ssrc=local_cap->rtp_ssrc; strncpy(result->rtcp_cname,local_cap->rtcp_cname,sizeof(result->rtcp_cname)); + // Handle dtls stream attribute: if both local and remote have a dtls fingerprint and a dtls setup, add the local fingerprint to the answer + // Note: local description usually stores dtls config at session level which means it apply to all streams, check this too + if (((local_cap->dtls_role!=SalDtlsRoleInvalid)) && (remote_offer->dtls_role!=SalDtlsRoleInvalid) + && (strlen(local_cap->dtls_fingerprint)>0) && (strlen(remote_offer->dtls_fingerprint)>0)) { + strncpy(result->dtls_fingerprint, local_cap->dtls_fingerprint,sizeof(result->dtls_fingerprint)); + if (remote_offer->dtls_role==SalDtlsRoleUnset) { + result->dtls_role = SalDtlsRoleIsClient; + } + } else { + result->dtls_fingerprint[0] = '\0'; + result->dtls_role = SalDtlsRoleInvalid; + } + + } @@ -484,21 +513,6 @@ int offer_answer_initiate_outgoing(const SalMediaDescription *local_offer, result->rtcp_xr.enabled = FALSE; } - // Handle dtls session attribute: if both local and remote have a dtls fingerprint and a dtls setup, get the remote fingerprint into the result - if ((local_offer->dtls_role!=SalDtlsRoleInvalid) && (remote_answer->dtls_role!=SalDtlsRoleInvalid) - &&(strlen(local_offer->dtls_fingerprint)>0) && (strlen(remote_answer->dtls_fingerprint)>0)) { - strcpy(result->dtls_fingerprint, remote_answer->dtls_fingerprint); - if (remote_answer->dtls_role==SalDtlsRoleIsClient) { - result->dtls_role = SalDtlsRoleIsServer; - } else { - result->dtls_role = SalDtlsRoleIsClient; - } - } else { - result->dtls_fingerprint[0] = '\0'; - result->dtls_role = SalDtlsRoleInvalid; - } - - return 0; } @@ -553,24 +567,6 @@ int offer_answer_initiate_incoming(const SalMediaDescription *local_capabilities }else ms_warning("Unknown protocol for mline %i, declining",i); if (ls){ initiate_incoming(ls,rs,&result->streams[i],one_matching_codec); - - // Handle dtls stream attribute: if both local and remote have a dtls fingerprint and a dtls setup, add the local fingerprint to the answer - // Note: local description usually stores dtls config at session level which means it apply to all streams, check this too - if (((ls->dtls_role!=SalDtlsRoleInvalid) || (local_capabilities->dtls_role!=SalDtlsRoleInvalid)) && (rs->dtls_role!=SalDtlsRoleInvalid) - && ((strlen(ls->dtls_fingerprint)>0) || (strlen(local_capabilities->dtls_fingerprint)>0)) && (strlen(rs->dtls_fingerprint)>0)) { - if (strlen(ls->dtls_fingerprint)>0) { /* get the fingerprint in stream description */ - strcpy(result->streams[i].dtls_fingerprint, ls->dtls_fingerprint); - } else { /* get the fingerprint in session description */ - strcpy(result->streams[i].dtls_fingerprint, local_capabilities->dtls_fingerprint); - } - if (rs->dtls_role==SalDtlsRoleUnset) { - result->streams[i].dtls_role = SalDtlsRoleIsClient; - } - } else { - result->streams[i].dtls_fingerprint[0] = '\0'; - result->streams[i].dtls_role = SalDtlsRoleInvalid; - } - // Handle media RTCP XR attribute memset(&result->streams[i].rtcp_xr, 0, sizeof(result->streams[i].rtcp_xr)); if (rs->rtcp_xr.enabled == TRUE) { @@ -611,18 +607,6 @@ int offer_answer_initiate_incoming(const SalMediaDescription *local_capabilities strcpy(result->name,local_capabilities->name); - // Handle dtls session attribute: if both local and remote have a dtls fingerprint and a dtls setup, add the local fingerprint to the answer - if ((local_capabilities->dtls_role!=SalDtlsRoleInvalid) && (remote_offer->dtls_role!=SalDtlsRoleInvalid) - &&(strlen(local_capabilities->dtls_fingerprint)>0) && (strlen(remote_offer->dtls_fingerprint)>0)) { - strcpy(result->dtls_fingerprint, local_capabilities->dtls_fingerprint); - if (remote_offer->dtls_role==SalDtlsRoleUnset) { - result->dtls_role = SalDtlsRoleIsClient; - } - } else { - result->dtls_fingerprint[0] = '\0'; - result->dtls_role = SalDtlsRoleInvalid; - } - // Handle session RTCP XR attribute memset(&result->rtcp_xr, 0, sizeof(result->rtcp_xr)); if (remote_offer->rtcp_xr.enabled == TRUE) { diff --git a/include/sal/sal.h b/include/sal/sal.h index 4eedb23ab..0b7775b9b 100644 --- a/include/sal/sal.h +++ b/include/sal/sal.h @@ -260,8 +260,6 @@ typedef struct SalMediaDescription{ bool_t ice_lite; bool_t ice_completed; bool_t pad[2]; - char dtls_fingerprint[256]; - SalDtlsRole dtls_role; } SalMediaDescription; typedef struct SalMessage{ diff --git a/mediastreamer2 b/mediastreamer2 index 07a8b5693..8d120b3c1 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 07a8b569317d23e9442882be267d6640498a7b5e +Subproject commit 8d120b3c118625b827834d1e53b93185d335c3df From d060f4bd650cfe88c8a423356bcc56ff3abf6469 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Mon, 16 Feb 2015 18:33:00 +0100 Subject: [PATCH 12/90] fix warning --- coreapi/bellesip_sal/sal_sdp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreapi/bellesip_sal/sal_sdp.c b/coreapi/bellesip_sal/sal_sdp.c index ed34c634a..1504b25c6 100644 --- a/coreapi/bellesip_sal/sal_sdp.c +++ b/coreapi/bellesip_sal/sal_sdp.c @@ -825,7 +825,7 @@ int sdp_to_media_description ( belle_sdp_session_description_t *session_desc, S /*DTLS attributes can be defined at session level.*/ value=belle_sdp_session_description_get_attribute_value(session_desc,"setup"); if (value){ - SalDtlsRole session_role; + SalDtlsRole session_role=SalDtlsRoleInvalid; if (strncmp(value, "actpass", 7) == 0) { session_role = SalDtlsRoleUnset; } else if (strncmp(value, "active", 6) == 0) { From 796f3f086b3123475ed62c7f819812907af41eec Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Mon, 16 Feb 2015 19:49:45 +0100 Subject: [PATCH 13/90] fix make distcheck --- share/Makefile.am | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/share/Makefile.am b/share/Makefile.am index ca8f2e233..0b3fb0119 100644 --- a/share/Makefile.am +++ b/share/Makefile.am @@ -52,7 +52,8 @@ EXTRA_DIST = $(LINPHONE_SOUNDS) \ audio-assistant.desktop.in \ linphone.pc.in \ Makefile.inc \ - archived-rootca.pem + archived-rootca.pem \ + $(appdata_DATA) CLEANFILES=rootca.pem From e142a42d6b85ccad6fa11222721c5cc66740124b Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Mon, 16 Feb 2015 22:30:53 +0100 Subject: [PATCH 14/90] add appdata to specfile --- linphone.spec.in | 1 + 1 file changed, 1 insertion(+) diff --git a/linphone.spec.in b/linphone.spec.in index eb8c65b51..9e10c35c1 100644 --- a/linphone.spec.in +++ b/linphone.spec.in @@ -90,6 +90,7 @@ rm -rf $RPM_BUILD_ROOT %{_datadir}/linphone %{_datadir}/pixmaps/linphone.png %{_datadir}/sounds/linphone +%{_datadir}/appdata/linphone.appdata.xml %files devel %defattr(-,root,root) From f5e0bc58de8cdd124864798076f888632ca7863f Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Tue, 17 Feb 2015 09:04:43 +0100 Subject: [PATCH 15/90] configure cert path for dtls --- coreapi/linphonecore.c | 16 +++++++--------- tester/call_tester.c | 5 +++++ 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index ef108df18..0fe68a0ae 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -1484,11 +1484,7 @@ static void misc_config_read(LinphoneCore *lc) { }else if (strcmp(uuid,"0")!=0) /*to allow to disable sip.instance*/ sal_set_uuid(lc->sal, uuid); - /* DTLS: if media_encryption DTLS SRTP is available, get or create the certificate directory */ - /*if (ms_dtls_srtp_available()){ - *//*JOHAN: USELESS? REMOVE IT*/ - //const char *user_certificate_config_path = lp_config_get_string(config,"misc","uuid",); -// }*/ + lc->user_certificates_path=ms_strdup(lp_config_get_string(config,"misc","user_certificates_path",".")); } static void linphone_core_start(LinphoneCore * lc) { @@ -1617,6 +1613,7 @@ static void linphone_core_init(LinphoneCore * lc, const LinphoneCoreVTable *vtab lc->data=userdata; lc->ringstream_autorelease=TRUE; + memcpy(local_vtable,vtable,sizeof(LinphoneCoreVTable)); lc->vtables=ms_list_append(lc->vtables,local_vtable); @@ -6760,10 +6757,11 @@ const char *linphone_core_get_zrtp_secrets_file(LinphoneCore *lc){ } void linphone_core_set_user_certificates_path(LinphoneCore *lc, const char* path){ - if (lc->user_certificates_path != NULL) { - ms_free(lc->user_certificates_path); - } - lc->user_certificates_path = path ? ms_strdup(path) : NULL; + char* new_value; + new_value = path?ms_strdup(path):NULL; + if (lc->user_certificates_path) ms_free(lc->user_certificates_path); + lp_config_set_string(lc->config,"misc","user_certificates_path",lc->user_certificates_path=new_value); + return ; } const char *linphone_core_get_user_certificates_path(LinphoneCore *lc){ diff --git a/tester/call_tester.c b/tester/call_tester.c index d19161460..9fe4c5913 100644 --- a/tester/call_tester.c +++ b/tester/call_tester.c @@ -1584,6 +1584,11 @@ static void video_call_base(LinphoneCoreManager* pauline,LinphoneCoreManager* ma linphone_core_set_video_policy(pauline->lc,&pauline_policy); } + if (mode==LinphoneMediaEncryptionDTLS) { /* for DTLS we must access certificates or at least have a directory to store them */ + marie->lc->user_certificates_path = ms_strdup_printf("%s/certificates/marie", liblinphone_tester_file_prefix); + pauline->lc->user_certificates_path = ms_strdup_printf("%s/certificates/pauline", liblinphone_tester_file_prefix); + } + linphone_core_set_media_encryption(marie->lc,mode); linphone_core_set_media_encryption(pauline->lc,mode); From e7d685e9b004a67e101d42f2e737c9428c8ac85a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Grisez?= Date: Tue, 17 Feb 2015 11:33:08 +0100 Subject: [PATCH 16/90] Update mediastreamer2 --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index 8d120b3c1..b1acdb3a5 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 8d120b3c118625b827834d1e53b93185d335c3df +Subproject commit b1acdb3a58f34e1b333ed1dbfaa6ae0aab09861f From a149f36615d7c95b8207852ef90e4b985f1aacb3 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Tue, 17 Feb 2015 12:47:08 +0100 Subject: [PATCH 17/90] Add getter API for play_file and record_file. --- coreapi/linphonecore.c | 7 +++++++ coreapi/linphonecore.h | 25 +++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index 0fe68a0ae..ae7a22222 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -5747,6 +5747,10 @@ void linphone_core_set_use_files(LinphoneCore *lc, bool_t yesno){ lc->use_files=yesno; } +const char * linphone_core_get_play_file(const LinphoneCore *lc) { + return lc->play_file; +} + /** * Sets a wav file to be played when putting somebody on hold, * or when files are used instead of soundcards (see linphone_core_set_use_files()). @@ -5769,6 +5773,9 @@ void linphone_core_set_play_file(LinphoneCore *lc, const char *file){ } } +const char * linphone_core_get_record_file(const LinphoneCore *lc) { + return lc->rec_file; +} /** * Sets a wav file where incoming stream is to be recorded, diff --git a/coreapi/linphonecore.h b/coreapi/linphonecore.h index 5a6b7f108..a909bb644 100644 --- a/coreapi/linphonecore.h +++ b/coreapi/linphonecore.h @@ -3006,7 +3006,32 @@ void linphone_core_show_video(LinphoneCore *lc, bool_t show); #define linphone_core_use_files(lc, yesno) linphone_core_set_use_files(lc, yesno) /*play/record support: use files instead of soundcard*/ LINPHONE_PUBLIC void linphone_core_set_use_files(LinphoneCore *lc, bool_t yesno); + +/** + * Get the wav file that is played when putting somebody on hold, + * or when files are used instead of soundcards (see linphone_core_set_use_files()). + * + * The file is a 16 bit linear wav file. + * @ingroup media_parameters + * @param[in] lc LinphoneCore object + * @return The path to the file that is played when putting somebody on hold. + */ +LINPHONE_PUBLIC const char * linphone_core_get_play_file(const LinphoneCore *lc); + LINPHONE_PUBLIC void linphone_core_set_play_file(LinphoneCore *lc, const char *file); + +/** + * Get the wav file where incoming stream is recorded, + * when files are used instead of soundcards (see linphone_core_set_use_files()). + * + * This feature is different from call recording (linphone_call_params_set_record_file()) + * The file is a 16 bit linear wav file. + * @ingroup media_parameters + * @param[in] lc LinphoneCore object + * @return The path to the file where incoming stream is recorded. +**/ +LINPHONE_PUBLIC const char * linphone_core_get_record_file(const LinphoneCore *lc); + LINPHONE_PUBLIC void linphone_core_set_record_file(LinphoneCore *lc, const char *file); LINPHONE_PUBLIC void linphone_core_play_dtmf(LinphoneCore *lc, char dtmf, int duration_ms); From c041745cf54cda7256da0224cde549ddc60a1181 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Tue, 17 Feb 2015 12:04:50 +0100 Subject: [PATCH 18/90] Added wp8 project without tunnel --- build/wp8/LibLinphone_no_tunnel.vcxproj | 216 ++++++++++++++++++++++++ 1 file changed, 216 insertions(+) create mode 100644 build/wp8/LibLinphone_no_tunnel.vcxproj diff --git a/build/wp8/LibLinphone_no_tunnel.vcxproj b/build/wp8/LibLinphone_no_tunnel.vcxproj new file mode 100644 index 000000000..1bc745f52 --- /dev/null +++ b/build/wp8/LibLinphone_no_tunnel.vcxproj @@ -0,0 +1,216 @@ + + + + + Debug + Win32 + + + Debug + ARM + + + Release + Win32 + + + Release + ARM + + + + {08dd0d38-d9b5-4626-b60d-b4d76b571142} + LibLinphone + en-US + 11.0 + + + + DynamicLibrary + true + v110_wp80 + false + + + DynamicLibrary + false + true + v110_wp80 + false + + + + + + + + $(SolutionDir)$(Platform)\$(Configuration)\ + $(SolutionDir)$(Platform)\$(Configuration)\$(TargetName)\ + + + false + + + + Level4 + $(ProjectDir)..\..\..\belle-sip\include;$(ProjectDir)..\..\oRTP\include;$(ProjectDir)..\..\mediastreamer2\include;$(ProjectDir)..\..\..\tunnel\include;$(ProjectDir)..\..\coreapi;$(ProjectDir)..\..\include;$(SolutionDir)$(Platform)\$(Configuration)\include;$(ProjectDir)..\..\..\zlib;$(ProjectDir)..\..\..\sqlite\;$(ProjectDir);%(AdditionalIncludeDirectories) + __STDC_CONSTANT_MACROS;_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;_USRDLL;WINDOW_NATIVE;_TRUE_TIME;IN_LINPHONE;USE_BELLESIP;VIDEO_ENABLED;LINPHONE_PACKAGE_NAME="linphone";LIBLINPHONE_EXPORTS;LINPHONE_PLUGINS_DIR=".";UNICODE;_XKEYCHECK_H;HAVE_ZLIB;HAVE_CONFIG_H;%(PreprocessorDefinitions) + Default + NotUsing + false + $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories) + + + Console + false + false + belle-sip.lib;mediastreamer2.lib;ws2_32.lib;ortp.lib;gsm.lib;speex.lib;speexdsp.lib;%(AdditionalDependencies) + $(SolutionDir)$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) + $(TargetDir)$(TargetName).lib + + + version.bat + + + Batch script to get the git version + + + + + _DEBUG;MSG_STORAGE_ENABLED;%(PreprocessorDefinitions) + + + true + + + + + NDEBUG;MSG_STORAGE_ENABLED;%(PreprocessorDefinitions) + MaxSpeed + true + true + true + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + true + false + + + + + {1db09afe-fc9b-472e-a746-0e33f8ef8883} + + + {4c225a82-800b-427b-ba7b-61686a9b347f} + + + {9924ac72-f96c-4e56-94d9-2b025da43c6b} + + + {072fad20-7007-4da2-b2e7-16ce2b219f67} + + + {36b528f9-fb79-4078-a16b-0a7442581bb7} + + + {d22bd217-d0f8-4274-9b3a-f3f35f46482c} + + + {b16b81a9-bef2-44c9-b603-1065183ae844} + + + {0565952a-ea62-46a2-8261-f5b4b490da42} + + + {a45d63b9-60de-476c-8836-f8eedbe139d0} + + + {027bad0e-9179-48c1-9733-7aa7e2c2ec70} + + + {ffc7b532-0502-4d88-ac98-9e89071cbc97} + + + {5dfa07b4-0be9-46a9-ba32-fdf5a55c580b} + + + {7afac3bb-d97b-4578-b9fe-5e1d2b94ea2f} + + + + + \ No newline at end of file From 7c1934783983dbdda2e5aee787dd15ea0ad59f30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Grisez?= Date: Tue, 17 Feb 2015 12:33:46 +0100 Subject: [PATCH 19/90] Update translations --- po/ar.po | 186 +++++++++++++++++++++++++++------------------------ po/cs.po | 186 +++++++++++++++++++++++++++------------------------ po/de.po | 186 +++++++++++++++++++++++++++------------------------ po/es.po | 186 +++++++++++++++++++++++++++------------------------ po/fr.po | 187 +++++++++++++++++++++++++++------------------------ po/he.po | 186 +++++++++++++++++++++++++++------------------------ po/hu.po | 186 +++++++++++++++++++++++++++------------------------ po/it.po | 186 +++++++++++++++++++++++++++------------------------ po/ja.po | 188 ++++++++++++++++++++++++++++------------------------ po/nb_NO.po | 186 +++++++++++++++++++++++++++------------------------ po/nl.po | 186 +++++++++++++++++++++++++++------------------------ po/pl.po | 186 +++++++++++++++++++++++++++------------------------ po/pt_BR.po | 186 +++++++++++++++++++++++++++------------------------ po/ru.po | 186 +++++++++++++++++++++++++++------------------------ po/sr.po | 186 +++++++++++++++++++++++++++------------------------ po/sv.po | 186 +++++++++++++++++++++++++++------------------------ po/zh_CN.po | 186 +++++++++++++++++++++++++++------------------------ po/zh_TW.po | 186 +++++++++++++++++++++++++++------------------------ 18 files changed, 1767 insertions(+), 1584 deletions(-) diff --git a/po/ar.po b/po/ar.po index c93c03c58..97b57e7b5 100644 --- a/po/ar.po +++ b/po/ar.po @@ -9,9 +9,10 @@ msgid "" msgstr "" "Project-Id-Version: linphone-gtk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-13 16:18+0100\n" -"PO-Revision-Date: 2015-01-13 16:34+0000\n" -"Last-Translator: محيي الدين \n" +"POT-Creation-Date: 2015-02-17 12:28+0100\n" +"PO-Revision-Date: 2015-02-17 11:28+0000\n" +"Last-Translator: Belledonne Communications \n" "Language-Team: Arabic (http://www.transifex.com/projects/p/linphone-gtk/" "language/ar/)\n" "Language: ar\n" @@ -148,7 +149,7 @@ msgstr "ابدأ مرشد الصوت" msgid "Run self test and exit 0 if succeed" msgstr "شغِّل الاختبار الذاتي ثم اخرِجْ 0 إذا نجح" -#: ../gtk/main.c:1083 +#: ../gtk/main.c:1088 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -160,7 +161,7 @@ msgstr "" "هل تريد السماح له برؤية معلومات حضورك وكذا إضافته إلى جهة اتصالك أيضا ؟ إذا " "أجبت ب لا، سيُحظَر هذا الشخص مؤقتا." -#: ../gtk/main.c:1160 +#: ../gtk/main.c:1165 #, c-format msgid "" "Please enter your password for username %s\n" @@ -169,59 +170,59 @@ msgstr "" "ادخل كلمة السر ل %s\n" " في نطاق %s:" -#: ../gtk/main.c:1281 +#: ../gtk/main.c:1286 msgid "Call error" msgstr "خطأ في المكالمة" -#: ../gtk/main.c:1284 ../coreapi/linphonecore.c:3767 +#: ../gtk/main.c:1289 ../coreapi/linphonecore.c:3787 msgid "Call ended" msgstr "إنتهت المكالمة" -#: ../gtk/main.c:1287 ../coreapi/call_log.c:221 +#: ../gtk/main.c:1292 ../coreapi/call_log.c:221 msgid "Incoming call" msgstr "مكالمة واردة" -#: ../gtk/main.c:1289 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 +#: ../gtk/main.c:1294 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 msgid "Answer" msgstr "أجِبْ" -#: ../gtk/main.c:1291 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1296 ../gtk/main.ui.h:6 msgid "Decline" msgstr "ارفضْ" -#: ../gtk/main.c:1297 +#: ../gtk/main.c:1302 msgid "Call paused" msgstr "المكالمة متوقفة" -#: ../gtk/main.c:1297 +#: ../gtk/main.c:1302 #, c-format msgid "by %s" msgstr "بواسطة %s" -#: ../gtk/main.c:1367 +#: ../gtk/main.c:1372 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "يود %s تشغيل الفيديو. هل تقبل ذلك ؟" -#: ../gtk/main.c:1529 +#: ../gtk/main.c:1534 msgid "Website link" msgstr "وصلة إلى الموقع وِبْ" -#: ../gtk/main.c:1578 +#: ../gtk/main.c:1583 msgid "Linphone - a video internet phone" msgstr "لِنْفُونْ - الهاتف المرئي عبر الإنترنت" -#: ../gtk/main.c:1670 +#: ../gtk/main.c:1675 #, c-format msgid "%s (Default)" msgstr "%s (افتراضي)" -#: ../gtk/main.c:2002 ../coreapi/callbacks.c:986 +#: ../gtk/main.c:2007 ../coreapi/callbacks.c:1027 #, c-format msgid "We are transferred to %s" msgstr "التحويل إلى %s" -#: ../gtk/main.c:2012 +#: ../gtk/main.c:2017 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." @@ -229,7 +230,7 @@ msgstr "" "لا وجود للوحة الصوت على هذا الحاسوب.\n" "لن تتمكن من تلقي أو إجراء أي مكالمة." -#: ../gtk/main.c:2156 +#: ../gtk/main.c:2161 msgid "A free SIP video-phone" msgstr "هاتف SIP المرئي الحر" @@ -383,15 +384,19 @@ msgid "" "You need to restart linphone for the new language selection to take effect." msgstr "يجب إعادة تشغيل لِنْفُونْ لكي تٌفعَّل اللغة المختارة." -#: ../gtk/propertybox.c:1234 +#: ../gtk/propertybox.c:1236 msgid "None" msgstr "بدون" -#: ../gtk/propertybox.c:1238 +#: ../gtk/propertybox.c:1240 msgid "SRTP" msgstr "SRTP" -#: ../gtk/propertybox.c:1244 +#: ../gtk/propertybox.c:1246 +msgid "DTLS" +msgstr "" + +#: ../gtk/propertybox.c:1253 msgid "ZRTP" msgstr "ZRTP" @@ -573,7 +578,7 @@ msgstr "تأكيد (المرحلة 2/2)" msgid "Error" msgstr "خطأ" -#: ../gtk/setupwizard.c:658 ../gtk/audio_assistant.c:527 +#: ../gtk/setupwizard.c:658 ../gtk/audio_assistant.c:534 msgid "Terminating" msgstr "في طور الإنهاء" @@ -666,7 +671,7 @@ msgstr "ضع السماعة" msgid "Calling..." msgstr "يجري الاتصال..." -#: ../gtk/incall_view.c:514 ../gtk/incall_view.c:727 +#: ../gtk/incall_view.c:514 ../gtk/incall_view.c:733 msgid "00::00::00" msgstr "00::00::00" @@ -703,55 +708,59 @@ msgid "Secured by SRTP" msgstr "آمن بواسطة SRTP" #: ../gtk/incall_view.c:685 +msgid "Secured by DTLS" +msgstr "" + +#: ../gtk/incall_view.c:691 #, c-format msgid "Secured by ZRTP - [auth token: %s]" msgstr "آمن بواسطة ZRTP - [شارة الهوية : %s]" -#: ../gtk/incall_view.c:691 +#: ../gtk/incall_view.c:697 msgid "Set unverified" msgstr "أكِّدْ عدم تحقُّقك" -#: ../gtk/incall_view.c:691 ../gtk/main.ui.h:4 +#: ../gtk/incall_view.c:697 ../gtk/main.ui.h:4 msgid "Set verified" msgstr "أكِّدْ تحقُّقَك" -#: ../gtk/incall_view.c:722 +#: ../gtk/incall_view.c:728 msgid "In conference" msgstr "في اجتماع" -#: ../gtk/incall_view.c:722 +#: ../gtk/incall_view.c:728 msgid "In call" msgstr "المكالمة جارية" -#: ../gtk/incall_view.c:758 +#: ../gtk/incall_view.c:764 msgid "Paused call" msgstr "المكالمة متوقفة مؤقتا" -#: ../gtk/incall_view.c:794 +#: ../gtk/incall_view.c:800 msgid "Call ended." msgstr "إنتهت المكالمة." -#: ../gtk/incall_view.c:825 +#: ../gtk/incall_view.c:831 msgid "Transfer in progress" msgstr "يجري الإرسال" -#: ../gtk/incall_view.c:828 +#: ../gtk/incall_view.c:834 msgid "Transfer done." msgstr "انتهى الإرسال." -#: ../gtk/incall_view.c:831 +#: ../gtk/incall_view.c:837 msgid "Transfer failed." msgstr "فَشِل الإرسال." -#: ../gtk/incall_view.c:875 +#: ../gtk/incall_view.c:881 msgid "Resume" msgstr "استأنِفْ" -#: ../gtk/incall_view.c:882 ../gtk/main.ui.h:9 +#: ../gtk/incall_view.c:888 ../gtk/main.ui.h:9 msgid "Pause" msgstr "إيقاف مؤقت" -#: ../gtk/incall_view.c:948 +#: ../gtk/incall_view.c:954 #, c-format msgid "" "Recording into\n" @@ -760,7 +769,7 @@ msgstr "" "يسجل في\n" "%s %s" -#: ../gtk/incall_view.c:948 +#: ../gtk/incall_view.c:954 msgid "(Paused)" msgstr "(متوقف)" @@ -859,23 +868,23 @@ msgstr "تشغيل" msgid "Let's start Linphone now" msgstr "لنُشغِّل لِنْفُونْ الآن" -#: ../gtk/audio_assistant.c:496 +#: ../gtk/audio_assistant.c:503 msgid "Audio Assistant" msgstr "مرشد الصوت" -#: ../gtk/audio_assistant.c:506 ../gtk/main.ui.h:31 +#: ../gtk/audio_assistant.c:513 ../gtk/main.ui.h:31 msgid "Audio assistant" msgstr "مرشد الصوت" -#: ../gtk/audio_assistant.c:511 +#: ../gtk/audio_assistant.c:518 msgid "Mic Gain calibration" msgstr "معايرة كسب الميكروفون" -#: ../gtk/audio_assistant.c:517 +#: ../gtk/audio_assistant.c:524 msgid "Speaker volume calibration" msgstr "معايرة شدة مكبر الصوت" -#: ../gtk/audio_assistant.c:522 +#: ../gtk/audio_assistant.c:529 msgid "Record and Play" msgstr "سَجِّل واقرأ " @@ -1742,68 +1751,68 @@ msgstr "تجري التهيئة..." msgid "Please wait while fetching configuration from server..." msgstr "رجاءً انتظر ريثما ينتهي من جلب الإعدادات من الخادم..." -#: ../coreapi/linphonecore.c:1510 +#: ../coreapi/linphonecore.c:1508 msgid "Ready" msgstr "جاهز" -#: ../coreapi/linphonecore.c:2489 +#: ../coreapi/linphonecore.c:2495 msgid "Configuring" msgstr "تجري التهيئة" -#: ../coreapi/linphonecore.c:2654 +#: ../coreapi/linphonecore.c:2669 msgid "Looking for telephone number destination..." msgstr "يجري البحث عن وجهة رقم الهاتف..." -#: ../coreapi/linphonecore.c:2656 +#: ../coreapi/linphonecore.c:2671 msgid "Could not resolve this number." msgstr "لم يتمكن من إيجاد هذا الرقم." #. must be known at that time -#: ../coreapi/linphonecore.c:2942 +#: ../coreapi/linphonecore.c:2957 msgid "Contacting" msgstr "يتصل ب" -#: ../coreapi/linphonecore.c:2947 +#: ../coreapi/linphonecore.c:2962 msgid "Could not call" msgstr "لم يتمكن من الاتصال" -#: ../coreapi/linphonecore.c:3097 +#: ../coreapi/linphonecore.c:3112 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "آسف، وصل عدد المكالمات الآنية إلى حده الأقصى" -#: ../coreapi/linphonecore.c:3256 +#: ../coreapi/linphonecore.c:3270 msgid "is contacting you" msgstr "يتصل بك" -#: ../coreapi/linphonecore.c:3257 +#: ../coreapi/linphonecore.c:3271 msgid " and asked autoanswer." msgstr "ويطلب ردا تلقائيا." -#: ../coreapi/linphonecore.c:3375 +#: ../coreapi/linphonecore.c:3395 msgid "Modifying call parameters..." msgstr "يجري تعديل إعدادات المكالمة..." -#: ../coreapi/linphonecore.c:3723 +#: ../coreapi/linphonecore.c:3743 msgid "Connected." msgstr "متصل." -#: ../coreapi/linphonecore.c:3748 +#: ../coreapi/linphonecore.c:3768 msgid "Call aborted" msgstr "أُلغيت المكالمة" -#: ../coreapi/linphonecore.c:3938 +#: ../coreapi/linphonecore.c:3958 msgid "Could not pause the call" msgstr "لم يتمكن من توقيف المكالمة مؤقتا" -#: ../coreapi/linphonecore.c:3941 +#: ../coreapi/linphonecore.c:3961 msgid "Pausing the current call..." msgstr "وضع المكالمة قيد الانتظار..." -#: ../coreapi/misc.c:438 +#: ../coreapi/misc.c:433 msgid "Stun lookup in progress..." msgstr "يجري بحث STUN..." -#: ../coreapi/misc.c:619 +#: ../coreapi/misc.c:614 msgid "ICE local candidates gathering in progress..." msgstr "يجري جلب مرشَّحي ICE المحلين..." @@ -1859,14 +1868,14 @@ msgstr "في عطلة" msgid "Unknown status" msgstr "حالة مجهولة" -#: ../coreapi/proxy.c:327 +#: ../coreapi/proxy.c:328 msgid "" "The sip proxy address you entered is invalid, it must start with \"sip:\" " "followed by a hostname." msgstr "" "عنوان SIP الذي أدخلت غير صالح، يجب أن يبدأ ب \"sip:\" متبوعا بإسم النطاق." -#: ../coreapi/proxy.c:333 +#: ../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" @@ -1874,126 +1883,127 @@ msgstr "" "هوية SIP التي أدخلت غير صحيحة.\n" "يجب أن تشبه هذا النمط sip:username@proxydomain، مثلا sip:alice@example.net" -#: ../coreapi/proxy.c:1391 +#: ../coreapi/proxy.c:1403 #, c-format msgid "Could not login as %s" msgstr "تعذر الولوج بالهوية %s" -#: ../coreapi/callbacks.c:383 +#: ../coreapi/callbacks.c:404 msgid "Remote ringing." msgstr "يرن الجرس عن بعد..." -#: ../coreapi/callbacks.c:404 +#: ../coreapi/callbacks.c:425 msgid "Remote ringing..." msgstr "يرن الجرس عن بعد..." -#: ../coreapi/callbacks.c:414 +#: ../coreapi/callbacks.c:442 msgid "Early media." msgstr "أخذ المكالمة مبكرا." -#: ../coreapi/callbacks.c:475 +#: ../coreapi/callbacks.c:503 #, c-format msgid "Call with %s is paused." msgstr "المكاملة مع %s متوقفة." -#: ../coreapi/callbacks.c:488 +#: ../coreapi/callbacks.c:516 #, c-format msgid "Call answered by %s - on hold." msgstr "يجيب %s عن المكالمة - في وضع الانتظار." -#: ../coreapi/callbacks.c:498 +#: ../coreapi/callbacks.c:526 msgid "Call resumed." msgstr "استُعيدت المكالمة." -#: ../coreapi/callbacks.c:502 +#: ../coreapi/callbacks.c:530 #, c-format msgid "Call answered by %s." msgstr "أجاب عن المكالمة %s." -#: ../coreapi/callbacks.c:525 +#: ../coreapi/callbacks.c:553 msgid "Incompatible, check codecs or security settings..." msgstr "غير موائم، تحقق من المراميز أو إعدادات الأمان..." -#: ../coreapi/callbacks.c:530 ../coreapi/callbacks.c:829 +#: ../coreapi/callbacks.c:558 ../coreapi/callbacks.c:870 msgid "Incompatible media parameters." msgstr "إعدادات الوسائط غير موائمة." -#: ../coreapi/callbacks.c:560 +#: ../coreapi/callbacks.c:588 msgid "We have been resumed." msgstr "استُأنِفت المكالمة." #. we are being paused -#: ../coreapi/callbacks.c:568 +#: ../coreapi/callbacks.c:596 msgid "We are paused by other party." msgstr "وُقِّفت المكالمة مؤقتا من طرف آخر." #. reINVITE and in-dialogs UPDATE go here -#: ../coreapi/callbacks.c:602 +#: ../coreapi/callbacks.c:630 msgid "Call is updated by remote." msgstr "حُدِّث الاتصال من البعيد." -#: ../coreapi/callbacks.c:705 +#: ../coreapi/callbacks.c:746 msgid "Call terminated." msgstr "أُنهيت المكالمة." -#: ../coreapi/callbacks.c:733 +#: ../coreapi/callbacks.c:774 msgid "User is busy." msgstr "المستخدم مشغول." -#: ../coreapi/callbacks.c:734 +#: ../coreapi/callbacks.c:775 msgid "User is temporarily unavailable." msgstr "المستخدم غير متاح مؤقتا." #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:736 +#: ../coreapi/callbacks.c:777 msgid "User does not want to be disturbed." msgstr "لا يريد المستخدم أي إزعاج." -#: ../coreapi/callbacks.c:737 +#: ../coreapi/callbacks.c:778 msgid "Call declined." msgstr "تم تجاهل المكالمة." -#: ../coreapi/callbacks.c:752 +#: ../coreapi/callbacks.c:793 msgid "Request timeout." msgstr "انتهت مهلة الطلب." -#: ../coreapi/callbacks.c:783 +#: ../coreapi/callbacks.c:824 msgid "Redirected" msgstr "مُوجَّه" -#: ../coreapi/callbacks.c:838 +#: ../coreapi/callbacks.c:879 msgid "Call failed." msgstr "فشل الاتصال." -#: ../coreapi/callbacks.c:916 +#: ../coreapi/callbacks.c:957 #, c-format msgid "Registration on %s successful." msgstr "تم التسجيل في %s بنجاح." -#: ../coreapi/callbacks.c:917 +#: ../coreapi/callbacks.c:958 #, c-format msgid "Unregistration on %s done." msgstr "أُلغي التسجيل في %s ." -#: ../coreapi/callbacks.c:935 +#: ../coreapi/callbacks.c:976 msgid "no response timeout" msgstr "لا إجابة قبل انتهاء المهلة" -#: ../coreapi/callbacks.c:938 +#: ../coreapi/callbacks.c:979 #, c-format msgid "Registration on %s failed: %s" msgstr "فَشِل التسجيل في %s: %s" -#: ../coreapi/callbacks.c:945 +#: ../coreapi/callbacks.c:986 msgid "Service unavailable, retrying" msgstr "خدمة غير متاحة، تجري الإعادة" -#: ../coreapi/linphonecall.c:175 +#. if encryption is DTLS, no status to be displayed +#: ../coreapi/linphonecall.c:180 #, c-format msgid "Authentication token is %s" msgstr "شارة التحقق من الهوية هي %s" -#: ../coreapi/linphonecall.c:3041 +#: ../coreapi/linphonecall.c:3492 #, 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 1df2c980c..79d5e0344 100644 --- a/po/cs.po +++ b/po/cs.po @@ -9,9 +9,10 @@ msgid "" msgstr "" "Project-Id-Version: linphone-gtk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-13 16:18+0100\n" -"PO-Revision-Date: 2015-01-06 11:29+0000\n" -"Last-Translator: Gautier Pelloux-Prayer \n" +"POT-Creation-Date: 2015-02-17 12:28+0100\n" +"PO-Revision-Date: 2015-02-17 11:28+0000\n" +"Last-Translator: Belledonne Communications \n" "Language-Team: Czech (http://www.transifex.com/projects/p/linphone-gtk/" "language/cs/)\n" "Language: cs\n" @@ -142,7 +143,7 @@ msgstr "" msgid "Run self test and exit 0 if succeed" msgstr "" -#: ../gtk/main.c:1083 +#: ../gtk/main.c:1088 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -155,66 +156,66 @@ msgstr "" "do svého adresáře?\n" "Odpovíte-li ne, tato osobo bude dočasně blokována." -#: ../gtk/main.c:1160 +#: ../gtk/main.c:1165 #, c-format msgid "" "Please enter your password for username %s\n" " at realm %s:" msgstr "" -#: ../gtk/main.c:1281 +#: ../gtk/main.c:1286 msgid "Call error" msgstr "Chyba hovoru" -#: ../gtk/main.c:1284 ../coreapi/linphonecore.c:3767 +#: ../gtk/main.c:1289 ../coreapi/linphonecore.c:3787 msgid "Call ended" msgstr "Hovor ukončen" -#: ../gtk/main.c:1287 ../coreapi/call_log.c:221 +#: ../gtk/main.c:1292 ../coreapi/call_log.c:221 msgid "Incoming call" msgstr "Příchozí hovor" -#: ../gtk/main.c:1289 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 +#: ../gtk/main.c:1294 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 msgid "Answer" msgstr "Odpovědět" -#: ../gtk/main.c:1291 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1296 ../gtk/main.ui.h:6 msgid "Decline" msgstr "Odmítnout" -#: ../gtk/main.c:1297 +#: ../gtk/main.c:1302 msgid "Call paused" msgstr "Hovor odložen" -#: ../gtk/main.c:1297 +#: ../gtk/main.c:1302 #, c-format msgid "by %s" msgstr "kým: %s" -#: ../gtk/main.c:1367 +#: ../gtk/main.c:1372 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "%s navrhuje začít videohovor. Přijímáte?" -#: ../gtk/main.c:1529 +#: ../gtk/main.c:1534 msgid "Website link" msgstr "Odkaz na webovou stránku" -#: ../gtk/main.c:1578 +#: ../gtk/main.c:1583 msgid "Linphone - a video internet phone" msgstr "Lipnhone – internetový videofon" -#: ../gtk/main.c:1670 +#: ../gtk/main.c:1675 #, c-format msgid "%s (Default)" msgstr "%s (Výchozí)" -#: ../gtk/main.c:2002 ../coreapi/callbacks.c:986 +#: ../gtk/main.c:2007 ../coreapi/callbacks.c:1027 #, c-format msgid "We are transferred to %s" msgstr "Byly jsme přepojeni na %s" -#: ../gtk/main.c:2012 +#: ../gtk/main.c:2017 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." @@ -222,7 +223,7 @@ msgstr "" "Na tomto počítači nebyla objevena žádná zvuková karta.\n" "Nebudete moci vytáčet a přijímat a zvukové hovory." -#: ../gtk/main.c:2156 +#: ../gtk/main.c:2161 msgid "A free SIP video-phone" msgstr "Volný SIP videofon" @@ -376,15 +377,19 @@ 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:1234 +#: ../gtk/propertybox.c:1236 msgid "None" msgstr "Žádné" -#: ../gtk/propertybox.c:1238 +#: ../gtk/propertybox.c:1240 msgid "SRTP" msgstr "SRTP" -#: ../gtk/propertybox.c:1244 +#: ../gtk/propertybox.c:1246 +msgid "DTLS" +msgstr "" + +#: ../gtk/propertybox.c:1253 msgid "ZRTP" msgstr "ZRTP" @@ -562,7 +567,7 @@ msgstr "Ověření (krok 2/2)" msgid "Error" msgstr "Chyba" -#: ../gtk/setupwizard.c:658 ../gtk/audio_assistant.c:527 +#: ../gtk/setupwizard.c:658 ../gtk/audio_assistant.c:534 msgid "Terminating" msgstr "Ukončuje se" @@ -655,7 +660,7 @@ msgstr "Zavěsit" msgid "Calling..." msgstr "Volá se…" -#: ../gtk/incall_view.c:514 ../gtk/incall_view.c:727 +#: ../gtk/incall_view.c:514 ../gtk/incall_view.c:733 msgid "00::00::00" msgstr "00:00:00" @@ -692,55 +697,59 @@ msgid "Secured by SRTP" msgstr "Zabezpečeno pomocí SRTP" #: ../gtk/incall_view.c:685 +msgid "Secured by DTLS" +msgstr "" + +#: ../gtk/incall_view.c:691 #, c-format msgid "Secured by ZRTP - [auth token: %s]" msgstr "Zabezpečeno pomocí ZRTP – [ověřovací klíč: %s]" -#: ../gtk/incall_view.c:691 +#: ../gtk/incall_view.c:697 msgid "Set unverified" msgstr "Nastavit na neověřeno" -#: ../gtk/incall_view.c:691 ../gtk/main.ui.h:4 +#: ../gtk/incall_view.c:697 ../gtk/main.ui.h:4 msgid "Set verified" msgstr "Nastavit na ověřeno" -#: ../gtk/incall_view.c:722 +#: ../gtk/incall_view.c:728 msgid "In conference" msgstr "Probíhá konference" -#: ../gtk/incall_view.c:722 +#: ../gtk/incall_view.c:728 msgid "In call" msgstr "Probíhá hovor" -#: ../gtk/incall_view.c:758 +#: ../gtk/incall_view.c:764 msgid "Paused call" msgstr "Odložený hovor" -#: ../gtk/incall_view.c:794 +#: ../gtk/incall_view.c:800 msgid "Call ended." msgstr "Hovor skončil." -#: ../gtk/incall_view.c:825 +#: ../gtk/incall_view.c:831 msgid "Transfer in progress" msgstr "Probíhá přepojení" -#: ../gtk/incall_view.c:828 +#: ../gtk/incall_view.c:834 msgid "Transfer done." msgstr "Přepojení dokončeno." -#: ../gtk/incall_view.c:831 +#: ../gtk/incall_view.c:837 msgid "Transfer failed." msgstr "Přepojení selhalo." -#: ../gtk/incall_view.c:875 +#: ../gtk/incall_view.c:881 msgid "Resume" msgstr "Obnovit" -#: ../gtk/incall_view.c:882 ../gtk/main.ui.h:9 +#: ../gtk/incall_view.c:888 ../gtk/main.ui.h:9 msgid "Pause" msgstr "Odložit" -#: ../gtk/incall_view.c:948 +#: ../gtk/incall_view.c:954 #, c-format msgid "" "Recording into\n" @@ -749,7 +758,7 @@ msgstr "" "Nahrává se do\n" "%s %s" -#: ../gtk/incall_view.c:948 +#: ../gtk/incall_view.c:954 msgid "(Paused)" msgstr "(Odloženo)" @@ -846,23 +855,23 @@ msgstr "" msgid "Let's start Linphone now" msgstr "" -#: ../gtk/audio_assistant.c:496 +#: ../gtk/audio_assistant.c:503 msgid "Audio Assistant" msgstr "" -#: ../gtk/audio_assistant.c:506 ../gtk/main.ui.h:31 +#: ../gtk/audio_assistant.c:513 ../gtk/main.ui.h:31 msgid "Audio assistant" msgstr "" -#: ../gtk/audio_assistant.c:511 +#: ../gtk/audio_assistant.c:518 msgid "Mic Gain calibration" msgstr "" -#: ../gtk/audio_assistant.c:517 +#: ../gtk/audio_assistant.c:524 msgid "Speaker volume calibration" msgstr "" -#: ../gtk/audio_assistant.c:522 +#: ../gtk/audio_assistant.c:529 msgid "Record and Play" msgstr "" @@ -1712,68 +1721,68 @@ msgstr "" msgid "Please wait while fetching configuration from server..." msgstr "" -#: ../coreapi/linphonecore.c:1510 +#: ../coreapi/linphonecore.c:1508 msgid "Ready" msgstr "Připraven." -#: ../coreapi/linphonecore.c:2489 +#: ../coreapi/linphonecore.c:2495 msgid "Configuring" msgstr "" -#: ../coreapi/linphonecore.c:2654 +#: ../coreapi/linphonecore.c:2669 msgid "Looking for telephone number destination..." msgstr "Vyhledává se umístění čísla…" -#: ../coreapi/linphonecore.c:2656 +#: ../coreapi/linphonecore.c:2671 msgid "Could not resolve this number." msgstr "Toto číslo nelze vyhledat." #. must be known at that time -#: ../coreapi/linphonecore.c:2942 +#: ../coreapi/linphonecore.c:2957 msgid "Contacting" msgstr "Navazuje se spojení" -#: ../coreapi/linphonecore.c:2947 +#: ../coreapi/linphonecore.c:2962 msgid "Could not call" msgstr "Nelze volat" -#: ../coreapi/linphonecore.c:3097 +#: ../coreapi/linphonecore.c:3112 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:3256 +#: ../coreapi/linphonecore.c:3270 msgid "is contacting you" msgstr "vás volá" -#: ../coreapi/linphonecore.c:3257 +#: ../coreapi/linphonecore.c:3271 msgid " and asked autoanswer." msgstr " a požaduje automatickou zvednutí." -#: ../coreapi/linphonecore.c:3375 +#: ../coreapi/linphonecore.c:3395 msgid "Modifying call parameters..." msgstr "Upravují se parametry hovoru…" -#: ../coreapi/linphonecore.c:3723 +#: ../coreapi/linphonecore.c:3743 msgid "Connected." msgstr "Připojeno." -#: ../coreapi/linphonecore.c:3748 +#: ../coreapi/linphonecore.c:3768 msgid "Call aborted" msgstr "Hovor přerušen" -#: ../coreapi/linphonecore.c:3938 +#: ../coreapi/linphonecore.c:3958 msgid "Could not pause the call" msgstr "Hovor nebylo možné odložit" -#: ../coreapi/linphonecore.c:3941 +#: ../coreapi/linphonecore.c:3961 msgid "Pausing the current call..." msgstr "Současný hovor se odkládá…" -#: ../coreapi/misc.c:438 +#: ../coreapi/misc.c:433 msgid "Stun lookup in progress..." msgstr "Hledá se adresa pomocí STUN…" -#: ../coreapi/misc.c:619 +#: ../coreapi/misc.c:614 msgid "ICE local candidates gathering in progress..." msgstr "Shromažďují se místní kandidáti ICE…" @@ -1829,7 +1838,7 @@ msgstr "" msgid "Unknown status" msgstr "" -#: ../coreapi/proxy.c:327 +#: ../coreapi/proxy.c:328 msgid "" "The sip proxy address you entered is invalid, it must start with \"sip:\" " "followed by a hostname." @@ -1837,7 +1846,7 @@ msgstr "" "Adresa SIP proxy, kterou jste zadali, není platná. Musí začínat na „sip:“ a " "pak musí následovat jméno stroje." -#: ../coreapi/proxy.c:333 +#: ../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" @@ -1845,126 +1854,127 @@ msgstr "" "SIP identita, kterou jste zadali, není platná.\n" "Měla by mít tvar sip:uživatel@proxydoména, například sip:alice@example.net" -#: ../coreapi/proxy.c:1391 +#: ../coreapi/proxy.c:1403 #, c-format msgid "Could not login as %s" msgstr "Nelze se přihlásit jako %s" -#: ../coreapi/callbacks.c:383 +#: ../coreapi/callbacks.c:404 msgid "Remote ringing." msgstr "Vyzvání na druhé straně." -#: ../coreapi/callbacks.c:404 +#: ../coreapi/callbacks.c:425 msgid "Remote ringing..." msgstr "Vyzvání na druhé straně…" -#: ../coreapi/callbacks.c:414 +#: ../coreapi/callbacks.c:442 msgid "Early media." msgstr "Časná média." -#: ../coreapi/callbacks.c:475 +#: ../coreapi/callbacks.c:503 #, c-format msgid "Call with %s is paused." msgstr "Hovor s %s je odložen." -#: ../coreapi/callbacks.c:488 +#: ../coreapi/callbacks.c:516 #, c-format msgid "Call answered by %s - on hold." msgstr "Hovor přijat kým: %s – odložen." -#: ../coreapi/callbacks.c:498 +#: ../coreapi/callbacks.c:526 msgid "Call resumed." msgstr "Hovor obnoven." -#: ../coreapi/callbacks.c:502 +#: ../coreapi/callbacks.c:530 #, c-format msgid "Call answered by %s." msgstr "Hovor přijat kým: %s." -#: ../coreapi/callbacks.c:525 +#: ../coreapi/callbacks.c:553 msgid "Incompatible, check codecs or security settings..." msgstr "Není slučitelné. Zkontrolujte nastavení kodeků a zabezpečení…" -#: ../coreapi/callbacks.c:530 ../coreapi/callbacks.c:829 +#: ../coreapi/callbacks.c:558 ../coreapi/callbacks.c:870 msgid "Incompatible media parameters." msgstr "Neslučitelné parametry médií." -#: ../coreapi/callbacks.c:560 +#: ../coreapi/callbacks.c:588 msgid "We have been resumed." msgstr "Byli jsme obnoveni." #. we are being paused -#: ../coreapi/callbacks.c:568 +#: ../coreapi/callbacks.c:596 msgid "We are paused by other party." msgstr "Byli jsme odloženi protistranou." #. reINVITE and in-dialogs UPDATE go here -#: ../coreapi/callbacks.c:602 +#: ../coreapi/callbacks.c:630 msgid "Call is updated by remote." msgstr "Hovor byl aktualizován protistranou." -#: ../coreapi/callbacks.c:705 +#: ../coreapi/callbacks.c:746 msgid "Call terminated." msgstr "Hovor ukončen." -#: ../coreapi/callbacks.c:733 +#: ../coreapi/callbacks.c:774 msgid "User is busy." msgstr "Uživatel je zaneprázdněn." -#: ../coreapi/callbacks.c:734 +#: ../coreapi/callbacks.c:775 msgid "User is temporarily unavailable." msgstr "Uživatel je dočasně nedostupný." #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:736 +#: ../coreapi/callbacks.c:777 msgid "User does not want to be disturbed." msgstr "Uživatel si nepřeje být rušen." -#: ../coreapi/callbacks.c:737 +#: ../coreapi/callbacks.c:778 msgid "Call declined." msgstr "Volání odmítnuto." -#: ../coreapi/callbacks.c:752 +#: ../coreapi/callbacks.c:793 msgid "Request timeout." msgstr "" -#: ../coreapi/callbacks.c:783 +#: ../coreapi/callbacks.c:824 msgid "Redirected" msgstr "Přesměrováno" -#: ../coreapi/callbacks.c:838 +#: ../coreapi/callbacks.c:879 msgid "Call failed." msgstr "Volání se nezdařilo." -#: ../coreapi/callbacks.c:916 +#: ../coreapi/callbacks.c:957 #, c-format msgid "Registration on %s successful." msgstr "Registrace na %s byla úspěšná." -#: ../coreapi/callbacks.c:917 +#: ../coreapi/callbacks.c:958 #, c-format msgid "Unregistration on %s done." msgstr "Odregistrování z %s hotovo." -#: ../coreapi/callbacks.c:935 +#: ../coreapi/callbacks.c:976 msgid "no response timeout" msgstr "odpověď nedorazila včas" -#: ../coreapi/callbacks.c:938 +#: ../coreapi/callbacks.c:979 #, c-format msgid "Registration on %s failed: %s" msgstr "Registrace na %s selhala: %s" -#: ../coreapi/callbacks.c:945 +#: ../coreapi/callbacks.c:986 msgid "Service unavailable, retrying" msgstr "" -#: ../coreapi/linphonecall.c:175 +#. if encryption is DTLS, no status to be displayed +#: ../coreapi/linphonecall.c:180 #, c-format msgid "Authentication token is %s" msgstr "Klíč k ověření totožnosti je %s" -#: ../coreapi/linphonecall.c:3041 +#: ../coreapi/linphonecall.c:3492 #, 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 229f60c71..204117b52 100644 --- a/po/de.po +++ b/po/de.po @@ -11,9 +11,10 @@ msgid "" msgstr "" "Project-Id-Version: linphone-gtk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-13 16:18+0100\n" -"PO-Revision-Date: 2015-01-13 16:34+0000\n" -"Last-Translator: Gautier Pelloux-Prayer \n" +"POT-Creation-Date: 2015-02-17 12:28+0100\n" +"PO-Revision-Date: 2015-02-17 11:28+0000\n" +"Last-Translator: Belledonne Communications \n" "Language-Team: German (http://www.transifex.com/projects/p/linphone-gtk/" "language/de/)\n" "Language: de\n" @@ -144,7 +145,7 @@ msgstr "Starte den Audio-Assistent" msgid "Run self test and exit 0 if succeed" msgstr "" -#: ../gtk/main.c:1083 +#: ../gtk/main.c:1088 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -157,7 +158,7 @@ msgstr "" "Ihrer Kontaktliste hinzufügen?\n" "Wenn Sie mit Nein antworten, wird diese Person vorläufig blockiert." -#: ../gtk/main.c:1160 +#: ../gtk/main.c:1165 #, c-format msgid "" "Please enter your password for username %s\n" @@ -166,59 +167,59 @@ msgstr "" "Bitte geben Sie Ihr Passwort für den Benutzernamen %s\n" " für Bereich %s ein:" -#: ../gtk/main.c:1281 +#: ../gtk/main.c:1286 msgid "Call error" msgstr "Anruf fehlgeschlagen" -#: ../gtk/main.c:1284 ../coreapi/linphonecore.c:3767 +#: ../gtk/main.c:1289 ../coreapi/linphonecore.c:3787 msgid "Call ended" msgstr "Anruf beendet" -#: ../gtk/main.c:1287 ../coreapi/call_log.c:221 +#: ../gtk/main.c:1292 ../coreapi/call_log.c:221 msgid "Incoming call" msgstr "Eingehender Anruf" -#: ../gtk/main.c:1289 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 +#: ../gtk/main.c:1294 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 msgid "Answer" msgstr "Annehmen" -#: ../gtk/main.c:1291 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1296 ../gtk/main.ui.h:6 msgid "Decline" msgstr "Abweisen" -#: ../gtk/main.c:1297 +#: ../gtk/main.c:1302 msgid "Call paused" msgstr "Anruf wird gehalten" -#: ../gtk/main.c:1297 +#: ../gtk/main.c:1302 #, c-format msgid "by %s" msgstr "von %s" -#: ../gtk/main.c:1367 +#: ../gtk/main.c:1372 #, 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:1529 +#: ../gtk/main.c:1534 msgid "Website link" msgstr "Website-Verknüpfung" -#: ../gtk/main.c:1578 +#: ../gtk/main.c:1583 msgid "Linphone - a video internet phone" msgstr "Linphone - ein Internet-Video-Telefon" -#: ../gtk/main.c:1670 +#: ../gtk/main.c:1675 #, c-format msgid "%s (Default)" msgstr "%s (Vorgabe)" -#: ../gtk/main.c:2002 ../coreapi/callbacks.c:986 +#: ../gtk/main.c:2007 ../coreapi/callbacks.c:1027 #, c-format msgid "We are transferred to %s" msgstr "Vermittlung nach %s" -#: ../gtk/main.c:2012 +#: ../gtk/main.c:2017 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." @@ -226,7 +227,7 @@ msgstr "" "Auf diesem Rechner können keine Soundkarten gefunden werden.\n" "Sie können keine Audio-Anrufe tätigen oder entgegennehmen." -#: ../gtk/main.c:2156 +#: ../gtk/main.c:2161 msgid "A free SIP video-phone" msgstr "Ein freies SIP-Video-Telefon" @@ -382,15 +383,19 @@ msgstr "" "Linphone muss neu gestartet werden, damit die neue Spracheinstellung wirksam " "wird." -#: ../gtk/propertybox.c:1234 +#: ../gtk/propertybox.c:1236 msgid "None" msgstr "Keinen" -#: ../gtk/propertybox.c:1238 +#: ../gtk/propertybox.c:1240 msgid "SRTP" msgstr "SRTP" -#: ../gtk/propertybox.c:1244 +#: ../gtk/propertybox.c:1246 +msgid "DTLS" +msgstr "" + +#: ../gtk/propertybox.c:1253 msgid "ZRTP" msgstr "ZRTP" @@ -571,7 +576,7 @@ msgstr "Bestätigung (Schritt 2/2)" msgid "Error" msgstr "Fehler" -#: ../gtk/setupwizard.c:658 ../gtk/audio_assistant.c:527 +#: ../gtk/setupwizard.c:658 ../gtk/audio_assistant.c:534 msgid "Terminating" msgstr "Fertigstellen" @@ -664,7 +669,7 @@ msgstr "Auflegen" msgid "Calling..." msgstr "Verbindungsaufbau..." -#: ../gtk/incall_view.c:514 ../gtk/incall_view.c:727 +#: ../gtk/incall_view.c:514 ../gtk/incall_view.c:733 msgid "00::00::00" msgstr "00::00::00" @@ -701,55 +706,59 @@ msgid "Secured by SRTP" msgstr "Gesichert durch SRTP" #: ../gtk/incall_view.c:685 +msgid "Secured by DTLS" +msgstr "" + +#: ../gtk/incall_view.c:691 #, c-format msgid "Secured by ZRTP - [auth token: %s]" msgstr "Gesichert durch ZRTP - [Auth.-Token: %s]" -#: ../gtk/incall_view.c:691 +#: ../gtk/incall_view.c:697 msgid "Set unverified" msgstr "Auf „Ungeprüft“ setzen" -#: ../gtk/incall_view.c:691 ../gtk/main.ui.h:4 +#: ../gtk/incall_view.c:697 ../gtk/main.ui.h:4 msgid "Set verified" msgstr "Auf „Geprüft“ setzen" -#: ../gtk/incall_view.c:722 +#: ../gtk/incall_view.c:728 msgid "In conference" msgstr "In Konferenz" -#: ../gtk/incall_view.c:722 +#: ../gtk/incall_view.c:728 msgid "In call" msgstr "Im Gespräch" -#: ../gtk/incall_view.c:758 +#: ../gtk/incall_view.c:764 msgid "Paused call" msgstr "Gehaltener Anruf" -#: ../gtk/incall_view.c:794 +#: ../gtk/incall_view.c:800 msgid "Call ended." msgstr "Anruf beendet." -#: ../gtk/incall_view.c:825 +#: ../gtk/incall_view.c:831 msgid "Transfer in progress" msgstr "Vermittlung läuft" -#: ../gtk/incall_view.c:828 +#: ../gtk/incall_view.c:834 msgid "Transfer done." msgstr "Vermittlung abgeschlossen." -#: ../gtk/incall_view.c:831 +#: ../gtk/incall_view.c:837 msgid "Transfer failed." msgstr "Vermittlung fehlgeschlagen." -#: ../gtk/incall_view.c:875 +#: ../gtk/incall_view.c:881 msgid "Resume" msgstr "Fortsetzen" -#: ../gtk/incall_view.c:882 ../gtk/main.ui.h:9 +#: ../gtk/incall_view.c:888 ../gtk/main.ui.h:9 msgid "Pause" msgstr "Halten" -#: ../gtk/incall_view.c:948 +#: ../gtk/incall_view.c:954 #, c-format msgid "" "Recording into\n" @@ -758,7 +767,7 @@ msgstr "" "Recording into\n" "%s %s" -#: ../gtk/incall_view.c:948 +#: ../gtk/incall_view.c:954 msgid "(Paused)" msgstr "(pausiert)" @@ -858,23 +867,23 @@ msgstr "" msgid "Let's start Linphone now" msgstr "Linphone jetzt starten" -#: ../gtk/audio_assistant.c:496 +#: ../gtk/audio_assistant.c:503 msgid "Audio Assistant" msgstr "Audio-Assistant" -#: ../gtk/audio_assistant.c:506 ../gtk/main.ui.h:31 +#: ../gtk/audio_assistant.c:513 ../gtk/main.ui.h:31 msgid "Audio assistant" msgstr "Audio-Assistant" -#: ../gtk/audio_assistant.c:511 +#: ../gtk/audio_assistant.c:518 msgid "Mic Gain calibration" msgstr "Einrichtung MIkrofonverstärker" -#: ../gtk/audio_assistant.c:517 +#: ../gtk/audio_assistant.c:524 msgid "Speaker volume calibration" msgstr "Einrichtung Lautstärke" -#: ../gtk/audio_assistant.c:522 +#: ../gtk/audio_assistant.c:529 msgid "Record and Play" msgstr "aufnehmen und abspielen" @@ -1746,68 +1755,68 @@ msgid "Please wait while fetching configuration from server..." msgstr "" "Bitte warten Sie während die Einstellungen vom Server abgerufen werden..." -#: ../coreapi/linphonecore.c:1510 +#: ../coreapi/linphonecore.c:1508 msgid "Ready" msgstr "Bereit" -#: ../coreapi/linphonecore.c:2489 +#: ../coreapi/linphonecore.c:2495 msgid "Configuring" msgstr "Einstellen" -#: ../coreapi/linphonecore.c:2654 +#: ../coreapi/linphonecore.c:2669 msgid "Looking for telephone number destination..." msgstr "Telefonnummernziel wird gesucht..." -#: ../coreapi/linphonecore.c:2656 +#: ../coreapi/linphonecore.c:2671 msgid "Could not resolve this number." msgstr "Diese Nummer kann nicht aufgelöst werden." #. must be known at that time -#: ../coreapi/linphonecore.c:2942 +#: ../coreapi/linphonecore.c:2957 msgid "Contacting" msgstr "Verbindungsaufbau" -#: ../coreapi/linphonecore.c:2947 +#: ../coreapi/linphonecore.c:2962 msgid "Could not call" msgstr "Anruf kann nicht getätigt werden." -#: ../coreapi/linphonecore.c:3097 +#: ../coreapi/linphonecore.c:3112 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "Die maximale Anzahl der gleichzeitigen Anrufe ist erreicht." -#: ../coreapi/linphonecore.c:3256 +#: ../coreapi/linphonecore.c:3270 msgid "is contacting you" msgstr "ruft Sie an" -#: ../coreapi/linphonecore.c:3257 +#: ../coreapi/linphonecore.c:3271 msgid " and asked autoanswer." msgstr " und fragt nach automatischer Antwort." -#: ../coreapi/linphonecore.c:3375 +#: ../coreapi/linphonecore.c:3395 msgid "Modifying call parameters..." msgstr "Die Anrufparameter werden verändert..." -#: ../coreapi/linphonecore.c:3723 +#: ../coreapi/linphonecore.c:3743 msgid "Connected." msgstr "Verbunden." -#: ../coreapi/linphonecore.c:3748 +#: ../coreapi/linphonecore.c:3768 msgid "Call aborted" msgstr "Anruf abgebrochen" -#: ../coreapi/linphonecore.c:3938 +#: ../coreapi/linphonecore.c:3958 msgid "Could not pause the call" msgstr "Anruf kann nicht gehalten werden" -#: ../coreapi/linphonecore.c:3941 +#: ../coreapi/linphonecore.c:3961 msgid "Pausing the current call..." msgstr "Aktueller Anruf wird gehalten..." -#: ../coreapi/misc.c:438 +#: ../coreapi/misc.c:433 msgid "Stun lookup in progress..." msgstr "STUN-Ermittlung läuft..." -#: ../coreapi/misc.c:619 +#: ../coreapi/misc.c:614 msgid "ICE local candidates gathering in progress..." msgstr "Lokale Kandidaten für ICE werden zusammengestellt..." @@ -1863,7 +1872,7 @@ msgstr "Urlaub" msgid "Unknown status" msgstr "Unbekannter Status" -#: ../coreapi/proxy.c:327 +#: ../coreapi/proxy.c:328 msgid "" "The sip proxy address you entered is invalid, it must start with \"sip:\" " "followed by a hostname." @@ -1871,7 +1880,7 @@ msgstr "" "Die von Ihnen eingegebene SIP-Proxy-Adresse ist ungültig, sie muss mit " "„sip:“ gefolgt vom Hostnamen beginnen." -#: ../coreapi/proxy.c:333 +#: ../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" @@ -1880,126 +1889,127 @@ msgstr "" "Sie sollte wie sip:benutzername@proxydomain aussehen, also z.B. sip:" "alice@beispiel.net" -#: ../coreapi/proxy.c:1391 +#: ../coreapi/proxy.c:1403 #, c-format msgid "Could not login as %s" msgstr "Anmeldung als %s fehlgeschlagen" -#: ../coreapi/callbacks.c:383 +#: ../coreapi/callbacks.c:404 msgid "Remote ringing." msgstr "Klingeln bei der Gegenseite." -#: ../coreapi/callbacks.c:404 +#: ../coreapi/callbacks.c:425 msgid "Remote ringing..." msgstr "Klingeln bei der Gegenseite..." -#: ../coreapi/callbacks.c:414 +#: ../coreapi/callbacks.c:442 msgid "Early media." msgstr "nicht kompatibel, prüfe Codecs oder Sicherheitseinstellungen..." -#: ../coreapi/callbacks.c:475 +#: ../coreapi/callbacks.c:503 #, c-format msgid "Call with %s is paused." msgstr "Anruf mit %s wird gehalten." -#: ../coreapi/callbacks.c:488 +#: ../coreapi/callbacks.c:516 #, c-format msgid "Call answered by %s - on hold." msgstr "Der von %s entgegengenommene Anruf wird gehalten." -#: ../coreapi/callbacks.c:498 +#: ../coreapi/callbacks.c:526 msgid "Call resumed." msgstr "Anruf fortgesetzt." -#: ../coreapi/callbacks.c:502 +#: ../coreapi/callbacks.c:530 #, c-format msgid "Call answered by %s." msgstr "Anruf wird von %s entgegengenommen." -#: ../coreapi/callbacks.c:525 +#: ../coreapi/callbacks.c:553 msgid "Incompatible, check codecs or security settings..." msgstr "Inkompatibel, prüfe Codecs oder Sicherheitseinstellungen..." -#: ../coreapi/callbacks.c:530 ../coreapi/callbacks.c:829 +#: ../coreapi/callbacks.c:558 ../coreapi/callbacks.c:870 msgid "Incompatible media parameters." msgstr "Inkompatible Medienparameter." -#: ../coreapi/callbacks.c:560 +#: ../coreapi/callbacks.c:588 msgid "We have been resumed." msgstr "Anruf wird fortgesetzt." #. we are being paused -#: ../coreapi/callbacks.c:568 +#: ../coreapi/callbacks.c:596 msgid "We are paused by other party." msgstr "Anruf wird von der Gegenseite gehalten." #. reINVITE and in-dialogs UPDATE go here -#: ../coreapi/callbacks.c:602 +#: ../coreapi/callbacks.c:630 msgid "Call is updated by remote." msgstr "Anruf ist von der Gegenseite aktualisiert worden." -#: ../coreapi/callbacks.c:705 +#: ../coreapi/callbacks.c:746 msgid "Call terminated." msgstr "Anruf beendet." -#: ../coreapi/callbacks.c:733 +#: ../coreapi/callbacks.c:774 msgid "User is busy." msgstr "Teilnehmer ist besetzt." -#: ../coreapi/callbacks.c:734 +#: ../coreapi/callbacks.c:775 msgid "User is temporarily unavailable." msgstr "Teilnehmer zur Zeit nicht verfügbar." #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:736 +#: ../coreapi/callbacks.c:777 msgid "User does not want to be disturbed." msgstr "Teilnehmer möchte nicht gestört werden." -#: ../coreapi/callbacks.c:737 +#: ../coreapi/callbacks.c:778 msgid "Call declined." msgstr "Anruf abgewiesen" -#: ../coreapi/callbacks.c:752 +#: ../coreapi/callbacks.c:793 msgid "Request timeout." msgstr "Zeitüberschreitung bei der Anfrage" -#: ../coreapi/callbacks.c:783 +#: ../coreapi/callbacks.c:824 msgid "Redirected" msgstr "Umgeleitet" -#: ../coreapi/callbacks.c:838 +#: ../coreapi/callbacks.c:879 msgid "Call failed." msgstr "Anruf fehlgeschlagen." -#: ../coreapi/callbacks.c:916 +#: ../coreapi/callbacks.c:957 #, c-format msgid "Registration on %s successful." msgstr "Registrierung auf %s erfolgreich." -#: ../coreapi/callbacks.c:917 +#: ../coreapi/callbacks.c:958 #, c-format msgid "Unregistration on %s done." msgstr "Abmeldung von %s ist erfolgt." -#: ../coreapi/callbacks.c:935 +#: ../coreapi/callbacks.c:976 msgid "no response timeout" msgstr "Zeitüberschreitung bei der Antwort" -#: ../coreapi/callbacks.c:938 +#: ../coreapi/callbacks.c:979 #, c-format msgid "Registration on %s failed: %s" msgstr "Registrierung auf %s fehlgeschlagen: %s" -#: ../coreapi/callbacks.c:945 +#: ../coreapi/callbacks.c:986 msgid "Service unavailable, retrying" msgstr "Service nicht verfügbar, versuche erneut" -#: ../coreapi/linphonecall.c:175 +#. if encryption is DTLS, no status to be displayed +#: ../coreapi/linphonecall.c:180 #, c-format msgid "Authentication token is %s" msgstr "Authentifizierungs-Token ist %s" -#: ../coreapi/linphonecall.c:3041 +#: ../coreapi/linphonecall.c:3492 #, 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 6a133760e..db3d1dd72 100644 --- a/po/es.po +++ b/po/es.po @@ -7,9 +7,10 @@ msgid "" msgstr "" "Project-Id-Version: linphone-gtk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-13 16:18+0100\n" -"PO-Revision-Date: 2015-01-06 11:29+0000\n" -"Last-Translator: Gautier Pelloux-Prayer \n" +"POT-Creation-Date: 2015-02-17 12:28+0100\n" +"PO-Revision-Date: 2015-02-17 11:28+0000\n" +"Last-Translator: Belledonne Communications \n" "Language-Team: Spanish (http://www.transifex.com/projects/p/linphone-gtk/" "language/es/)\n" "Language: es\n" @@ -137,7 +138,7 @@ msgstr "" msgid "Run self test and exit 0 if succeed" msgstr "" -#: ../gtk/main.c:1083 +#: ../gtk/main.c:1088 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -150,66 +151,66 @@ msgstr "" "contactos?\n" "Si responde no, esta persona será bloqueada temporalmente." -#: ../gtk/main.c:1160 +#: ../gtk/main.c:1165 #, c-format msgid "" "Please enter your password for username %s\n" " at realm %s:" msgstr "" -#: ../gtk/main.c:1281 +#: ../gtk/main.c:1286 msgid "Call error" msgstr "" -#: ../gtk/main.c:1284 ../coreapi/linphonecore.c:3767 +#: ../gtk/main.c:1289 ../coreapi/linphonecore.c:3787 msgid "Call ended" msgstr "" -#: ../gtk/main.c:1287 ../coreapi/call_log.c:221 +#: ../gtk/main.c:1292 ../coreapi/call_log.c:221 msgid "Incoming call" msgstr "Llamada entrante" -#: ../gtk/main.c:1289 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 +#: ../gtk/main.c:1294 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 msgid "Answer" msgstr "Contestar" -#: ../gtk/main.c:1291 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1296 ../gtk/main.ui.h:6 msgid "Decline" msgstr "" -#: ../gtk/main.c:1297 +#: ../gtk/main.c:1302 msgid "Call paused" msgstr "" -#: ../gtk/main.c:1297 +#: ../gtk/main.c:1302 #, c-format msgid "by %s" msgstr "" -#: ../gtk/main.c:1367 +#: ../gtk/main.c:1372 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1529 +#: ../gtk/main.c:1534 msgid "Website link" msgstr "Enlace a la Web" -#: ../gtk/main.c:1578 +#: ../gtk/main.c:1583 msgid "Linphone - a video internet phone" msgstr "Linphone - un video-teléfono a través de Internet" -#: ../gtk/main.c:1670 +#: ../gtk/main.c:1675 #, c-format msgid "%s (Default)" msgstr "%s (Opción predeterminada)" -#: ../gtk/main.c:2002 ../coreapi/callbacks.c:986 +#: ../gtk/main.c:2007 ../coreapi/callbacks.c:1027 #, c-format msgid "We are transferred to %s" msgstr "Somos transferidos a %s" -#: ../gtk/main.c:2012 +#: ../gtk/main.c:2017 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." @@ -217,7 +218,7 @@ msgstr "" "No se ha encontrado una tarjeta de sonido en este equipo.\n" "No será posible realizar o recibir llamadas de audio." -#: ../gtk/main.c:2156 +#: ../gtk/main.c:2161 msgid "A free SIP video-phone" msgstr "Un video-teléfono SIP gratuito" @@ -371,15 +372,19 @@ 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:1234 +#: ../gtk/propertybox.c:1236 msgid "None" msgstr "" -#: ../gtk/propertybox.c:1238 +#: ../gtk/propertybox.c:1240 msgid "SRTP" msgstr "SRTP" -#: ../gtk/propertybox.c:1244 +#: ../gtk/propertybox.c:1246 +msgid "DTLS" +msgstr "" + +#: ../gtk/propertybox.c:1253 msgid "ZRTP" msgstr "ZRTP" @@ -548,7 +553,7 @@ msgstr "" msgid "Error" msgstr "" -#: ../gtk/setupwizard.c:658 ../gtk/audio_assistant.c:527 +#: ../gtk/setupwizard.c:658 ../gtk/audio_assistant.c:534 msgid "Terminating" msgstr "" @@ -639,7 +644,7 @@ msgstr "" msgid "Calling..." msgstr "" -#: ../gtk/incall_view.c:514 ../gtk/incall_view.c:727 +#: ../gtk/incall_view.c:514 ../gtk/incall_view.c:733 msgid "00::00::00" msgstr "00::00::00" @@ -676,62 +681,66 @@ msgid "Secured by SRTP" msgstr "Cifrada con SRTP" #: ../gtk/incall_view.c:685 +msgid "Secured by DTLS" +msgstr "" + +#: ../gtk/incall_view.c:691 #, c-format msgid "Secured by ZRTP - [auth token: %s]" msgstr "Cifrada con ZRTP - [token de autenticación: %s]" -#: ../gtk/incall_view.c:691 +#: ../gtk/incall_view.c:697 msgid "Set unverified" msgstr "Set sin verificar" -#: ../gtk/incall_view.c:691 ../gtk/main.ui.h:4 +#: ../gtk/incall_view.c:697 ../gtk/main.ui.h:4 msgid "Set verified" msgstr "Set verificado" -#: ../gtk/incall_view.c:722 +#: ../gtk/incall_view.c:728 msgid "In conference" msgstr "En conferencia" -#: ../gtk/incall_view.c:722 +#: ../gtk/incall_view.c:728 msgid "In call" msgstr "" -#: ../gtk/incall_view.c:758 +#: ../gtk/incall_view.c:764 msgid "Paused call" msgstr "" -#: ../gtk/incall_view.c:794 +#: ../gtk/incall_view.c:800 msgid "Call ended." msgstr "" -#: ../gtk/incall_view.c:825 +#: ../gtk/incall_view.c:831 msgid "Transfer in progress" msgstr "" -#: ../gtk/incall_view.c:828 +#: ../gtk/incall_view.c:834 msgid "Transfer done." msgstr "" -#: ../gtk/incall_view.c:831 +#: ../gtk/incall_view.c:837 msgid "Transfer failed." msgstr "" -#: ../gtk/incall_view.c:875 +#: ../gtk/incall_view.c:881 msgid "Resume" msgstr "Reanudar" -#: ../gtk/incall_view.c:882 ../gtk/main.ui.h:9 +#: ../gtk/incall_view.c:888 ../gtk/main.ui.h:9 msgid "Pause" msgstr "Pausar" -#: ../gtk/incall_view.c:948 +#: ../gtk/incall_view.c:954 #, c-format msgid "" "Recording into\n" "%s %s" msgstr "" -#: ../gtk/incall_view.c:948 +#: ../gtk/incall_view.c:954 msgid "(Paused)" msgstr "" @@ -828,23 +837,23 @@ msgstr "" msgid "Let's start Linphone now" msgstr "" -#: ../gtk/audio_assistant.c:496 +#: ../gtk/audio_assistant.c:503 msgid "Audio Assistant" msgstr "" -#: ../gtk/audio_assistant.c:506 ../gtk/main.ui.h:31 +#: ../gtk/audio_assistant.c:513 ../gtk/main.ui.h:31 msgid "Audio assistant" msgstr "" -#: ../gtk/audio_assistant.c:511 +#: ../gtk/audio_assistant.c:518 msgid "Mic Gain calibration" msgstr "" -#: ../gtk/audio_assistant.c:517 +#: ../gtk/audio_assistant.c:524 msgid "Speaker volume calibration" msgstr "" -#: ../gtk/audio_assistant.c:522 +#: ../gtk/audio_assistant.c:529 msgid "Record and Play" msgstr "" @@ -1696,68 +1705,68 @@ msgstr "" msgid "Please wait while fetching configuration from server..." msgstr "" -#: ../coreapi/linphonecore.c:1510 +#: ../coreapi/linphonecore.c:1508 msgid "Ready" msgstr "" -#: ../coreapi/linphonecore.c:2489 +#: ../coreapi/linphonecore.c:2495 msgid "Configuring" msgstr "" -#: ../coreapi/linphonecore.c:2654 +#: ../coreapi/linphonecore.c:2669 msgid "Looking for telephone number destination..." msgstr "Buscando el número de teléfono del destinatario…" -#: ../coreapi/linphonecore.c:2656 +#: ../coreapi/linphonecore.c:2671 msgid "Could not resolve this number." msgstr "No se ha podido resolver este número." #. must be known at that time -#: ../coreapi/linphonecore.c:2942 +#: ../coreapi/linphonecore.c:2957 msgid "Contacting" msgstr "" -#: ../coreapi/linphonecore.c:2947 +#: ../coreapi/linphonecore.c:2962 msgid "Could not call" msgstr "" -#: ../coreapi/linphonecore.c:3097 +#: ../coreapi/linphonecore.c:3112 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:3256 +#: ../coreapi/linphonecore.c:3270 msgid "is contacting you" msgstr "" -#: ../coreapi/linphonecore.c:3257 +#: ../coreapi/linphonecore.c:3271 msgid " and asked autoanswer." msgstr "y ha solicitado auto respuesta." -#: ../coreapi/linphonecore.c:3375 +#: ../coreapi/linphonecore.c:3395 msgid "Modifying call parameters..." msgstr "Modificando parámetros de llamada…" -#: ../coreapi/linphonecore.c:3723 +#: ../coreapi/linphonecore.c:3743 msgid "Connected." msgstr "Conectado." -#: ../coreapi/linphonecore.c:3748 +#: ../coreapi/linphonecore.c:3768 msgid "Call aborted" msgstr "" -#: ../coreapi/linphonecore.c:3938 +#: ../coreapi/linphonecore.c:3958 msgid "Could not pause the call" msgstr "No se pudo pausar la llamada" -#: ../coreapi/linphonecore.c:3941 +#: ../coreapi/linphonecore.c:3961 msgid "Pausing the current call..." msgstr "Pausando la llamada actual..." -#: ../coreapi/misc.c:438 +#: ../coreapi/misc.c:433 msgid "Stun lookup in progress..." msgstr "Búsqueda STUN en proceso…" -#: ../coreapi/misc.c:619 +#: ../coreapi/misc.c:614 msgid "ICE local candidates gathering in progress..." msgstr "" @@ -1813,7 +1822,7 @@ msgstr "" msgid "Unknown status" msgstr "" -#: ../coreapi/proxy.c:327 +#: ../coreapi/proxy.c:328 msgid "" "The sip proxy address you entered is invalid, it must start with \"sip:\" " "followed by a hostname." @@ -1821,7 +1830,7 @@ msgstr "" "La dirección del Proxy SIP que ha introducido no es válida, debe empezar con " "\"sip:\" seguido del hostname." -#: ../coreapi/proxy.c:333 +#: ../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" @@ -1830,126 +1839,127 @@ msgstr "" "Debe ser del tipo sip:username@proxydomain, como por ejemplo sip:" "alice@example.net" -#: ../coreapi/proxy.c:1391 +#: ../coreapi/proxy.c:1403 #, c-format msgid "Could not login as %s" msgstr "" -#: ../coreapi/callbacks.c:383 +#: ../coreapi/callbacks.c:404 msgid "Remote ringing." msgstr "" -#: ../coreapi/callbacks.c:404 +#: ../coreapi/callbacks.c:425 msgid "Remote ringing..." msgstr "" -#: ../coreapi/callbacks.c:414 +#: ../coreapi/callbacks.c:442 msgid "Early media." msgstr "Medios iniciales." -#: ../coreapi/callbacks.c:475 +#: ../coreapi/callbacks.c:503 #, c-format msgid "Call with %s is paused." msgstr "La llamada con %s está puesta en pausa." -#: ../coreapi/callbacks.c:488 +#: ../coreapi/callbacks.c:516 #, c-format msgid "Call answered by %s - on hold." msgstr "Llamada respondida por %s - en espera." -#: ../coreapi/callbacks.c:498 +#: ../coreapi/callbacks.c:526 msgid "Call resumed." msgstr "" -#: ../coreapi/callbacks.c:502 +#: ../coreapi/callbacks.c:530 #, c-format msgid "Call answered by %s." msgstr "" -#: ../coreapi/callbacks.c:525 +#: ../coreapi/callbacks.c:553 msgid "Incompatible, check codecs or security settings..." msgstr "" -#: ../coreapi/callbacks.c:530 ../coreapi/callbacks.c:829 +#: ../coreapi/callbacks.c:558 ../coreapi/callbacks.c:870 msgid "Incompatible media parameters." msgstr "" -#: ../coreapi/callbacks.c:560 +#: ../coreapi/callbacks.c:588 msgid "We have been resumed." msgstr "" #. we are being paused -#: ../coreapi/callbacks.c:568 +#: ../coreapi/callbacks.c:596 msgid "We are paused by other party." msgstr "" #. reINVITE and in-dialogs UPDATE go here -#: ../coreapi/callbacks.c:602 +#: ../coreapi/callbacks.c:630 msgid "Call is updated by remote." msgstr "" -#: ../coreapi/callbacks.c:705 +#: ../coreapi/callbacks.c:746 msgid "Call terminated." msgstr "" -#: ../coreapi/callbacks.c:733 +#: ../coreapi/callbacks.c:774 msgid "User is busy." msgstr "El usuario está ocupado." -#: ../coreapi/callbacks.c:734 +#: ../coreapi/callbacks.c:775 msgid "User is temporarily unavailable." msgstr "El usuario no está disponible temporalmente." #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:736 +#: ../coreapi/callbacks.c:777 msgid "User does not want to be disturbed." msgstr "El usuario no quiere que le molesten." -#: ../coreapi/callbacks.c:737 +#: ../coreapi/callbacks.c:778 msgid "Call declined." msgstr "Llamada rechazada." -#: ../coreapi/callbacks.c:752 +#: ../coreapi/callbacks.c:793 msgid "Request timeout." msgstr "" -#: ../coreapi/callbacks.c:783 +#: ../coreapi/callbacks.c:824 msgid "Redirected" msgstr "Redigirida" -#: ../coreapi/callbacks.c:838 +#: ../coreapi/callbacks.c:879 msgid "Call failed." msgstr "" -#: ../coreapi/callbacks.c:916 +#: ../coreapi/callbacks.c:957 #, c-format msgid "Registration on %s successful." msgstr "" -#: ../coreapi/callbacks.c:917 +#: ../coreapi/callbacks.c:958 #, c-format msgid "Unregistration on %s done." msgstr "" -#: ../coreapi/callbacks.c:935 +#: ../coreapi/callbacks.c:976 msgid "no response timeout" msgstr "timeout sin respuesta" -#: ../coreapi/callbacks.c:938 +#: ../coreapi/callbacks.c:979 #, c-format msgid "Registration on %s failed: %s" msgstr "" -#: ../coreapi/callbacks.c:945 +#: ../coreapi/callbacks.c:986 msgid "Service unavailable, retrying" msgstr "" -#: ../coreapi/linphonecall.c:175 +#. if encryption is DTLS, no status to be displayed +#: ../coreapi/linphonecall.c:180 #, c-format msgid "Authentication token is %s" msgstr "" -#: ../coreapi/linphonecall.c:3041 +#: ../coreapi/linphonecall.c:3492 #, 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 aff7882d6..33fa26d57 100644 --- a/po/fr.po +++ b/po/fr.po @@ -3,6 +3,7 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Belledonne Communications , 2015 # Gautier Pelloux-Prayer , 2014 # Gautier Pelloux-Prayer , 2014 # Gautier Pelloux-Prayer , 2014-2015 @@ -11,9 +12,10 @@ msgid "" msgstr "" "Project-Id-Version: linphone-gtk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-13 16:18+0100\n" -"PO-Revision-Date: 2015-01-13 16:34+0000\n" -"Last-Translator: Gautier Pelloux-Prayer \n" +"POT-Creation-Date: 2015-02-17 12:28+0100\n" +"PO-Revision-Date: 2015-02-17 11:30+0000\n" +"Last-Translator: Belledonne Communications \n" "Language-Team: French (http://www.transifex.com/projects/p/linphone-gtk/" "language/fr/)\n" "Language: fr\n" @@ -142,7 +144,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:1083 +#: ../gtk/main.c:1088 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -156,7 +158,7 @@ msgstr "" "Si vous répondez non, cette personne sera mise temporairement sur liste " "noire." -#: ../gtk/main.c:1160 +#: ../gtk/main.c:1165 #, c-format msgid "" "Please enter your password for username %s\n" @@ -165,59 +167,59 @@ msgstr "" "Entrez le mot de passe pour %s\n" " sur le domaine %s:" -#: ../gtk/main.c:1281 +#: ../gtk/main.c:1286 msgid "Call error" msgstr "Erreur lors de l'appel" -#: ../gtk/main.c:1284 ../coreapi/linphonecore.c:3767 +#: ../gtk/main.c:1289 ../coreapi/linphonecore.c:3787 msgid "Call ended" msgstr "Appel terminé." -#: ../gtk/main.c:1287 ../coreapi/call_log.c:221 +#: ../gtk/main.c:1292 ../coreapi/call_log.c:221 msgid "Incoming call" msgstr "Appel entrant" -#: ../gtk/main.c:1289 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 +#: ../gtk/main.c:1294 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 msgid "Answer" msgstr "Répondre" -#: ../gtk/main.c:1291 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1296 ../gtk/main.ui.h:6 msgid "Decline" msgstr "Refuser" -#: ../gtk/main.c:1297 +#: ../gtk/main.c:1302 msgid "Call paused" msgstr "Appel en pause" -#: ../gtk/main.c:1297 +#: ../gtk/main.c:1302 #, c-format msgid "by %s" msgstr "b>par %s" -#: ../gtk/main.c:1367 +#: ../gtk/main.c:1372 #, 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:1529 +#: ../gtk/main.c:1534 msgid "Website link" msgstr "Lien site web" -#: ../gtk/main.c:1578 +#: ../gtk/main.c:1583 msgid "Linphone - a video internet phone" msgstr "Linphone - un téléphone video pour l'internet" -#: ../gtk/main.c:1670 +#: ../gtk/main.c:1675 #, c-format msgid "%s (Default)" msgstr "%s (par défaut)" -#: ../gtk/main.c:2002 ../coreapi/callbacks.c:986 +#: ../gtk/main.c:2007 ../coreapi/callbacks.c:1027 #, c-format msgid "We are transferred to %s" msgstr "Transfert vers %s" -#: ../gtk/main.c:2012 +#: ../gtk/main.c:2017 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." @@ -225,7 +227,7 @@ msgstr "" "Aucune carte son n'a été détectée sur cet ordinateur.\n" "Vous ne pourrez pas effectuer d'appels audio." -#: ../gtk/main.c:2156 +#: ../gtk/main.c:2161 msgid "A free SIP video-phone" msgstr "Un visiophone libre" @@ -381,15 +383,19 @@ msgstr "" "La nouvelle selection de langue prendra effet au prochain démarrage de " "linphone." -#: ../gtk/propertybox.c:1234 +#: ../gtk/propertybox.c:1236 msgid "None" msgstr "Aucun" -#: ../gtk/propertybox.c:1238 +#: ../gtk/propertybox.c:1240 msgid "SRTP" msgstr "SRTP" -#: ../gtk/propertybox.c:1244 +#: ../gtk/propertybox.c:1246 +msgid "DTLS" +msgstr "DTLS" + +#: ../gtk/propertybox.c:1253 msgid "ZRTP" msgstr "ZRTP" @@ -569,7 +575,7 @@ msgstr "Validation (étape 2/2)" msgid "Error" msgstr "Erreur" -#: ../gtk/setupwizard.c:658 ../gtk/audio_assistant.c:527 +#: ../gtk/setupwizard.c:658 ../gtk/audio_assistant.c:534 msgid "Terminating" msgstr "En cours d’arrêt." @@ -662,7 +668,7 @@ msgstr "Raccrocher" msgid "Calling..." msgstr "Tentative d'appel..." -#: ../gtk/incall_view.c:514 ../gtk/incall_view.c:727 +#: ../gtk/incall_view.c:514 ../gtk/incall_view.c:733 msgid "00::00::00" msgstr "00::00::00" @@ -699,55 +705,59 @@ msgid "Secured by SRTP" msgstr "Sécurisé par SRTP" #: ../gtk/incall_view.c:685 +msgid "Secured by DTLS" +msgstr "Sécurisé par DTLS" + +#: ../gtk/incall_view.c:691 #, c-format msgid "Secured by ZRTP - [auth token: %s]" msgstr "Sécurisé par ZRTP- [jeton: %s]" -#: ../gtk/incall_view.c:691 +#: ../gtk/incall_view.c:697 msgid "Set unverified" msgstr "Marquer comme non vérifié" -#: ../gtk/incall_view.c:691 ../gtk/main.ui.h:4 +#: ../gtk/incall_view.c:697 ../gtk/main.ui.h:4 msgid "Set verified" msgstr "Marquer comme vérifié" -#: ../gtk/incall_view.c:722 +#: ../gtk/incall_view.c:728 msgid "In conference" msgstr "En conférence" -#: ../gtk/incall_view.c:722 +#: ../gtk/incall_view.c:728 msgid "In call" msgstr "Appel en cours" -#: ../gtk/incall_view.c:758 +#: ../gtk/incall_view.c:764 msgid "Paused call" msgstr "Appel en attente" -#: ../gtk/incall_view.c:794 +#: ../gtk/incall_view.c:800 msgid "Call ended." msgstr "Appel terminé." -#: ../gtk/incall_view.c:825 +#: ../gtk/incall_view.c:831 msgid "Transfer in progress" msgstr "Transfert en cours" -#: ../gtk/incall_view.c:828 +#: ../gtk/incall_view.c:834 msgid "Transfer done." msgstr "Transfert terminé" -#: ../gtk/incall_view.c:831 +#: ../gtk/incall_view.c:837 msgid "Transfer failed." msgstr "Transfert échoué" -#: ../gtk/incall_view.c:875 +#: ../gtk/incall_view.c:881 msgid "Resume" msgstr "Reprendre" -#: ../gtk/incall_view.c:882 ../gtk/main.ui.h:9 +#: ../gtk/incall_view.c:888 ../gtk/main.ui.h:9 msgid "Pause" msgstr "Pause" -#: ../gtk/incall_view.c:948 +#: ../gtk/incall_view.c:954 #, c-format msgid "" "Recording into\n" @@ -756,7 +766,7 @@ msgstr "" "Enregistrement dans\n" "%s %s" -#: ../gtk/incall_view.c:948 +#: ../gtk/incall_view.c:954 msgid "(Paused)" msgstr "(en attente)" @@ -856,23 +866,23 @@ msgstr "Jouer" msgid "Let's start Linphone now" msgstr "Démarrons Linphone maintenant" -#: ../gtk/audio_assistant.c:496 +#: ../gtk/audio_assistant.c:503 msgid "Audio Assistant" msgstr "Assistant audio" -#: ../gtk/audio_assistant.c:506 ../gtk/main.ui.h:31 +#: ../gtk/audio_assistant.c:513 ../gtk/main.ui.h:31 msgid "Audio assistant" msgstr "Assistant audio" -#: ../gtk/audio_assistant.c:511 +#: ../gtk/audio_assistant.c:518 msgid "Mic Gain calibration" msgstr "Calibration du gain du microphone" -#: ../gtk/audio_assistant.c:517 +#: ../gtk/audio_assistant.c:524 msgid "Speaker volume calibration" msgstr "Calibration du volume du haut parleur" -#: ../gtk/audio_assistant.c:522 +#: ../gtk/audio_assistant.c:529 msgid "Record and Play" msgstr "Enregistrer et joue" @@ -1744,68 +1754,68 @@ msgstr "" "Veuillez patenter un instant pendant le chargement de la configuration " "distante..." -#: ../coreapi/linphonecore.c:1510 +#: ../coreapi/linphonecore.c:1508 msgid "Ready" msgstr "Prêt." -#: ../coreapi/linphonecore.c:2489 +#: ../coreapi/linphonecore.c:2495 msgid "Configuring" msgstr "Configuration en cours" -#: ../coreapi/linphonecore.c:2654 +#: ../coreapi/linphonecore.c:2669 msgid "Looking for telephone number destination..." msgstr "Recherche de la destination du numéro de téléphone..." -#: ../coreapi/linphonecore.c:2656 +#: ../coreapi/linphonecore.c:2671 msgid "Could not resolve this number." msgstr "La destination n'a pu être trouvée." #. must be known at that time -#: ../coreapi/linphonecore.c:2942 +#: ../coreapi/linphonecore.c:2957 msgid "Contacting" msgstr "Appel de" -#: ../coreapi/linphonecore.c:2947 +#: ../coreapi/linphonecore.c:2962 msgid "Could not call" msgstr "Echec de l'appel" -#: ../coreapi/linphonecore.c:3097 +#: ../coreapi/linphonecore.c:3112 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:3256 +#: ../coreapi/linphonecore.c:3270 msgid "is contacting you" msgstr "vous appelle" -#: ../coreapi/linphonecore.c:3257 +#: ../coreapi/linphonecore.c:3271 msgid " and asked autoanswer." msgstr "et sollicite un décrochage automatique." -#: ../coreapi/linphonecore.c:3375 +#: ../coreapi/linphonecore.c:3395 msgid "Modifying call parameters..." msgstr "Modifications des paramètres d'appels..." -#: ../coreapi/linphonecore.c:3723 +#: ../coreapi/linphonecore.c:3743 msgid "Connected." msgstr "En ligne." -#: ../coreapi/linphonecore.c:3748 +#: ../coreapi/linphonecore.c:3768 msgid "Call aborted" msgstr "Appel abandonné" -#: ../coreapi/linphonecore.c:3938 +#: ../coreapi/linphonecore.c:3958 msgid "Could not pause the call" msgstr "La mise en attente a échoué" -#: ../coreapi/linphonecore.c:3941 +#: ../coreapi/linphonecore.c:3961 msgid "Pausing the current call..." msgstr "Mise en attente de l'appel..." -#: ../coreapi/misc.c:438 +#: ../coreapi/misc.c:433 msgid "Stun lookup in progress..." msgstr "Découverte STUN en cours" -#: ../coreapi/misc.c:619 +#: ../coreapi/misc.c:614 msgid "ICE local candidates gathering in progress..." msgstr "Collection des candidats locaux ICE en cours..." @@ -1861,7 +1871,7 @@ msgstr "En congé" msgid "Unknown status" msgstr "Status inconnu" -#: ../coreapi/proxy.c:327 +#: ../coreapi/proxy.c:328 msgid "" "The sip proxy address you entered is invalid, it must start with \"sip:\" " "followed by a hostname." @@ -1869,7 +1879,7 @@ msgstr "" "L'adresse SIP du proxy est invalide. Elle doit commencer par \"sip:\" suivie " "par un nom de domaine." -#: ../coreapi/proxy.c:333 +#: ../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" @@ -1878,126 +1888,127 @@ msgstr "" "Elle doit être de la forme sip:username@domain, comme par example sip:" "alice@example.net" -#: ../coreapi/proxy.c:1391 +#: ../coreapi/proxy.c:1403 #, c-format msgid "Could not login as %s" msgstr "Echec de la connexion en tant que %s" -#: ../coreapi/callbacks.c:383 +#: ../coreapi/callbacks.c:404 msgid "Remote ringing." msgstr "Sonnerie distante." -#: ../coreapi/callbacks.c:404 +#: ../coreapi/callbacks.c:425 msgid "Remote ringing..." msgstr "Sonnerie distante..." -#: ../coreapi/callbacks.c:414 +#: ../coreapi/callbacks.c:442 msgid "Early media." msgstr "Prise d'appel anticipée." -#: ../coreapi/callbacks.c:475 +#: ../coreapi/callbacks.c:503 #, c-format msgid "Call with %s is paused." msgstr "%s est maintenant en attente." -#: ../coreapi/callbacks.c:488 +#: ../coreapi/callbacks.c:516 #, c-format msgid "Call answered by %s - on hold." msgstr "Appel répondu par %s - en attente" -#: ../coreapi/callbacks.c:498 +#: ../coreapi/callbacks.c:526 msgid "Call resumed." msgstr "Appel repris." -#: ../coreapi/callbacks.c:502 +#: ../coreapi/callbacks.c:530 #, c-format msgid "Call answered by %s." msgstr "Appel répondu par %s." -#: ../coreapi/callbacks.c:525 +#: ../coreapi/callbacks.c:553 msgid "Incompatible, check codecs or security settings..." msgstr "Incompatible, vérfiez les codecs ou les paramètres de sécurité..." -#: ../coreapi/callbacks.c:530 ../coreapi/callbacks.c:829 +#: ../coreapi/callbacks.c:558 ../coreapi/callbacks.c:870 msgid "Incompatible media parameters." msgstr "Paramètres media incompatibles." -#: ../coreapi/callbacks.c:560 +#: ../coreapi/callbacks.c:588 msgid "We have been resumed." msgstr "Appel repris." #. we are being paused -#: ../coreapi/callbacks.c:568 +#: ../coreapi/callbacks.c:596 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:602 +#: ../coreapi/callbacks.c:630 msgid "Call is updated by remote." msgstr "L'appel est modifié par la partie distante." -#: ../coreapi/callbacks.c:705 +#: ../coreapi/callbacks.c:746 msgid "Call terminated." msgstr "Appel terminé." -#: ../coreapi/callbacks.c:733 +#: ../coreapi/callbacks.c:774 msgid "User is busy." msgstr "Occupé..." -#: ../coreapi/callbacks.c:734 +#: ../coreapi/callbacks.c:775 msgid "User is temporarily unavailable." msgstr "L'usager est temporairement indisponible." #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:736 +#: ../coreapi/callbacks.c:777 msgid "User does not want to be disturbed." msgstr "L'usager ne souhaite pas être dérangé" -#: ../coreapi/callbacks.c:737 +#: ../coreapi/callbacks.c:778 msgid "Call declined." msgstr "Appel décliné." -#: ../coreapi/callbacks.c:752 +#: ../coreapi/callbacks.c:793 msgid "Request timeout." msgstr "Délai d'attente de la requête dépassé." -#: ../coreapi/callbacks.c:783 +#: ../coreapi/callbacks.c:824 msgid "Redirected" msgstr "Redirection" -#: ../coreapi/callbacks.c:838 +#: ../coreapi/callbacks.c:879 msgid "Call failed." msgstr "L'appel a échoué." -#: ../coreapi/callbacks.c:916 +#: ../coreapi/callbacks.c:957 #, c-format msgid "Registration on %s successful." msgstr "Enregistrement sur %s effectué." -#: ../coreapi/callbacks.c:917 +#: ../coreapi/callbacks.c:958 #, c-format msgid "Unregistration on %s done." msgstr "Désenregistrement sur %s effectué." -#: ../coreapi/callbacks.c:935 +#: ../coreapi/callbacks.c:976 msgid "no response timeout" msgstr "Pas de réponse" -#: ../coreapi/callbacks.c:938 +#: ../coreapi/callbacks.c:979 #, c-format msgid "Registration on %s failed: %s" msgstr "Echec de l'enregistrement sur %s: %s" -#: ../coreapi/callbacks.c:945 +#: ../coreapi/callbacks.c:986 msgid "Service unavailable, retrying" msgstr "Service indisponible, nouvelle tentative" -#: ../coreapi/linphonecall.c:175 +#. if encryption is DTLS, no status to be displayed +#: ../coreapi/linphonecall.c:180 #, c-format msgid "Authentication token is %s" msgstr "Le jeton d'authentification est %s" -#: ../coreapi/linphonecall.c:3041 +#: ../coreapi/linphonecall.c:3492 #, 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 4feae78d6..553b97f58 100644 --- a/po/he.po +++ b/po/he.po @@ -11,9 +11,10 @@ msgid "" msgstr "" "Project-Id-Version: linphone-gtk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-13 16:18+0100\n" -"PO-Revision-Date: 2015-01-06 11:29+0000\n" -"Last-Translator: Gautier Pelloux-Prayer \n" +"POT-Creation-Date: 2015-02-17 12:28+0100\n" +"PO-Revision-Date: 2015-02-17 11:28+0000\n" +"Last-Translator: Belledonne Communications \n" "Language-Team: Hebrew (http://www.transifex.com/projects/p/linphone-gtk/" "language/he/)\n" "Language: he\n" @@ -140,7 +141,7 @@ msgstr "" msgid "Run self test and exit 0 if succeed" msgstr "" -#: ../gtk/main.c:1083 +#: ../gtk/main.c:1088 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -153,7 +154,7 @@ msgstr "" "שלך ?\n" "היה ותשובתך תהיה לא, אדם זה יהיה מסומן באופן זמני ברשימה השחורה." -#: ../gtk/main.c:1160 +#: ../gtk/main.c:1165 #, c-format msgid "" "Please enter your password for username %s\n" @@ -162,59 +163,59 @@ msgstr "" "אנא הזן סיסמה עבור משתמש %s\n" "במתחם %s:" -#: ../gtk/main.c:1281 +#: ../gtk/main.c:1286 msgid "Call error" msgstr "שגיאת קריאה" -#: ../gtk/main.c:1284 ../coreapi/linphonecore.c:3767 +#: ../gtk/main.c:1289 ../coreapi/linphonecore.c:3787 msgid "Call ended" msgstr "שיחה הסתיימה" -#: ../gtk/main.c:1287 ../coreapi/call_log.c:221 +#: ../gtk/main.c:1292 ../coreapi/call_log.c:221 msgid "Incoming call" msgstr "קריאה נכנסת" -#: ../gtk/main.c:1289 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 +#: ../gtk/main.c:1294 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 msgid "Answer" msgstr "לענות" -#: ../gtk/main.c:1291 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1296 ../gtk/main.ui.h:6 msgid "Decline" msgstr "לדחות" -#: ../gtk/main.c:1297 +#: ../gtk/main.c:1302 msgid "Call paused" msgstr "שיחה הושהתה" -#: ../gtk/main.c:1297 +#: ../gtk/main.c:1302 #, c-format msgid "by %s" msgstr "על ידי %s" -#: ../gtk/main.c:1367 +#: ../gtk/main.c:1372 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "‏%s רוצה להתחיל וידאו. האם אתה מסכים ?" -#: ../gtk/main.c:1529 +#: ../gtk/main.c:1534 msgid "Website link" msgstr "קישור אתר רשת" -#: ../gtk/main.c:1578 +#: ../gtk/main.c:1583 msgid "Linphone - a video internet phone" msgstr "‫Linphone - וידאופון אינטרנטי" -#: ../gtk/main.c:1670 +#: ../gtk/main.c:1675 #, c-format msgid "%s (Default)" msgstr "‫%s (ברירת מחדל)" -#: ../gtk/main.c:2002 ../coreapi/callbacks.c:986 +#: ../gtk/main.c:2007 ../coreapi/callbacks.c:1027 #, c-format msgid "We are transferred to %s" msgstr "אנחנו מועברים אל %s" -#: ../gtk/main.c:2012 +#: ../gtk/main.c:2017 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." @@ -222,7 +223,7 @@ msgstr "" "לא אותרו כרטיסי קול במחשב זה.\n" "לא תהיה ביכולתך לשלוח או לקבל שיחות אודיו." -#: ../gtk/main.c:2156 +#: ../gtk/main.c:2161 msgid "A free SIP video-phone" msgstr "וידאופון SIP חופשי" @@ -376,15 +377,19 @@ msgid "" "You need to restart linphone for the new language selection to take effect." msgstr "עליך לאתחל את לינפון כדי שהשפה החדשה תיכנס לתוקף." -#: ../gtk/propertybox.c:1234 +#: ../gtk/propertybox.c:1236 msgid "None" msgstr "ללא" -#: ../gtk/propertybox.c:1238 +#: ../gtk/propertybox.c:1240 msgid "SRTP" msgstr "" -#: ../gtk/propertybox.c:1244 +#: ../gtk/propertybox.c:1246 +msgid "DTLS" +msgstr "" + +#: ../gtk/propertybox.c:1253 msgid "ZRTP" msgstr "" @@ -559,7 +564,7 @@ msgstr "אימות (צעד 2/2)" msgid "Error" msgstr "שגיאה" -#: ../gtk/setupwizard.c:658 ../gtk/audio_assistant.c:527 +#: ../gtk/setupwizard.c:658 ../gtk/audio_assistant.c:534 msgid "Terminating" msgstr "מסיים כעת" @@ -652,7 +657,7 @@ msgstr "נתק" msgid "Calling..." msgstr "מתקשר כעת..." -#: ../gtk/incall_view.c:514 ../gtk/incall_view.c:727 +#: ../gtk/incall_view.c:514 ../gtk/incall_view.c:733 msgid "00::00::00" msgstr "‭00::00::00" @@ -689,55 +694,59 @@ msgid "Secured by SRTP" msgstr "מאובטחת על ידי SRTP" #: ../gtk/incall_view.c:685 +msgid "Secured by DTLS" +msgstr "" + +#: ../gtk/incall_view.c:691 #, c-format msgid "Secured by ZRTP - [auth token: %s]" msgstr "מאובטחת על ידי ZRTP - [אות אימות: %s]" -#: ../gtk/incall_view.c:691 +#: ../gtk/incall_view.c:697 msgid "Set unverified" msgstr "הגדר כלא מאומתת" -#: ../gtk/incall_view.c:691 ../gtk/main.ui.h:4 +#: ../gtk/incall_view.c:697 ../gtk/main.ui.h:4 msgid "Set verified" msgstr "הגדר כמאומתת" -#: ../gtk/incall_view.c:722 +#: ../gtk/incall_view.c:728 msgid "In conference" msgstr "בשיחת ועידה" -#: ../gtk/incall_view.c:722 +#: ../gtk/incall_view.c:728 msgid "In call" msgstr "בשיחה כעת" -#: ../gtk/incall_view.c:758 +#: ../gtk/incall_view.c:764 msgid "Paused call" msgstr "שיחה מושהית" -#: ../gtk/incall_view.c:794 +#: ../gtk/incall_view.c:800 msgid "Call ended." msgstr "שיחה הסתיימה." -#: ../gtk/incall_view.c:825 +#: ../gtk/incall_view.c:831 msgid "Transfer in progress" msgstr "העברה מצויה כעת בעיצומה" -#: ../gtk/incall_view.c:828 +#: ../gtk/incall_view.c:834 msgid "Transfer done." msgstr "העברה הסתיימה." -#: ../gtk/incall_view.c:831 +#: ../gtk/incall_view.c:837 msgid "Transfer failed." msgstr "העברה נכשלה." -#: ../gtk/incall_view.c:875 +#: ../gtk/incall_view.c:881 msgid "Resume" msgstr "חזור" -#: ../gtk/incall_view.c:882 ../gtk/main.ui.h:9 +#: ../gtk/incall_view.c:888 ../gtk/main.ui.h:9 msgid "Pause" msgstr "השהה" -#: ../gtk/incall_view.c:948 +#: ../gtk/incall_view.c:954 #, c-format msgid "" "Recording into\n" @@ -746,7 +755,7 @@ msgstr "" "מקליט אל תוך\n" "%s %s" -#: ../gtk/incall_view.c:948 +#: ../gtk/incall_view.c:954 msgid "(Paused)" msgstr "(מושהה)" @@ -843,23 +852,23 @@ msgstr "" msgid "Let's start Linphone now" msgstr "הבא נתחיל את Linphone עכשיו" -#: ../gtk/audio_assistant.c:496 +#: ../gtk/audio_assistant.c:503 msgid "Audio Assistant" msgstr "" -#: ../gtk/audio_assistant.c:506 ../gtk/main.ui.h:31 +#: ../gtk/audio_assistant.c:513 ../gtk/main.ui.h:31 msgid "Audio assistant" msgstr "" -#: ../gtk/audio_assistant.c:511 +#: ../gtk/audio_assistant.c:518 msgid "Mic Gain calibration" msgstr "" -#: ../gtk/audio_assistant.c:517 +#: ../gtk/audio_assistant.c:524 msgid "Speaker volume calibration" msgstr "" -#: ../gtk/audio_assistant.c:522 +#: ../gtk/audio_assistant.c:529 msgid "Record and Play" msgstr "" @@ -1709,68 +1718,68 @@ msgstr "" msgid "Please wait while fetching configuration from server..." msgstr "" -#: ../coreapi/linphonecore.c:1510 +#: ../coreapi/linphonecore.c:1508 msgid "Ready" msgstr "מוכן" -#: ../coreapi/linphonecore.c:2489 +#: ../coreapi/linphonecore.c:2495 msgid "Configuring" msgstr "" -#: ../coreapi/linphonecore.c:2654 +#: ../coreapi/linphonecore.c:2669 msgid "Looking for telephone number destination..." msgstr "מחפש כעת עבור יעד מספר טלפון..." -#: ../coreapi/linphonecore.c:2656 +#: ../coreapi/linphonecore.c:2671 msgid "Could not resolve this number." msgstr "לא ניתן לפתור את מספר זה." #. must be known at that time -#: ../coreapi/linphonecore.c:2942 +#: ../coreapi/linphonecore.c:2957 msgid "Contacting" msgstr "מתקשר כעת" -#: ../coreapi/linphonecore.c:2947 +#: ../coreapi/linphonecore.c:2962 msgid "Could not call" msgstr "לא ניתן להתקשר" -#: ../coreapi/linphonecore.c:3097 +#: ../coreapi/linphonecore.c:3112 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "הגענו אל המספר המרבי של שיחות מקבילות, עמך הסליחה" -#: ../coreapi/linphonecore.c:3256 +#: ../coreapi/linphonecore.c:3270 msgid "is contacting you" msgstr "מתקשר/ת אליך" -#: ../coreapi/linphonecore.c:3257 +#: ../coreapi/linphonecore.c:3271 msgid " and asked autoanswer." msgstr " ומבקש/ת מענה אוטומטי." -#: ../coreapi/linphonecore.c:3375 +#: ../coreapi/linphonecore.c:3395 msgid "Modifying call parameters..." msgstr "מתאים כעת פרמטרים של שיחה..." -#: ../coreapi/linphonecore.c:3723 +#: ../coreapi/linphonecore.c:3743 msgid "Connected." msgstr "מקושר." -#: ../coreapi/linphonecore.c:3748 +#: ../coreapi/linphonecore.c:3768 msgid "Call aborted" msgstr "קריאה בוטלה" -#: ../coreapi/linphonecore.c:3938 +#: ../coreapi/linphonecore.c:3958 msgid "Could not pause the call" msgstr "לא ניתן להשהות את השיחה" -#: ../coreapi/linphonecore.c:3941 +#: ../coreapi/linphonecore.c:3961 msgid "Pausing the current call..." msgstr "משהה כעת שיחה נוכחית..." -#: ../coreapi/misc.c:438 +#: ../coreapi/misc.c:433 msgid "Stun lookup in progress..." msgstr "בדיקת STUN מצויה כעת בעיצומה..." -#: ../coreapi/misc.c:619 +#: ../coreapi/misc.c:614 msgid "ICE local candidates gathering in progress..." msgstr "צבירת מועמדים מקומיים של ICE מצויה כעת בעיצומה..." @@ -1826,14 +1835,14 @@ msgstr "" msgid "Unknown status" msgstr "" -#: ../coreapi/proxy.c:327 +#: ../coreapi/proxy.c:328 msgid "" "The sip proxy address you entered is invalid, it must start with \"sip:\" " "followed by a hostname." msgstr "" "כתובת sip proxy שהזנת הינה שגויה, זו צריכה להתחיל עם‭\"sip:\" ‬ לאחר שם מארח." -#: ../coreapi/proxy.c:333 +#: ../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" @@ -1841,126 +1850,127 @@ msgstr "" "זהות sip שהוזנה הינה שגויה.\n" "זו צריכה להיראות כמו sip:username@proxydomain, למשל sip:alice@example.net" -#: ../coreapi/proxy.c:1391 +#: ../coreapi/proxy.c:1403 #, c-format msgid "Could not login as %s" msgstr "לא ניתן להתחבר בזהות %s" -#: ../coreapi/callbacks.c:383 +#: ../coreapi/callbacks.c:404 msgid "Remote ringing." msgstr "צלצול מרוחק." -#: ../coreapi/callbacks.c:404 +#: ../coreapi/callbacks.c:425 msgid "Remote ringing..." msgstr "צלצול מרוחק..." -#: ../coreapi/callbacks.c:414 +#: ../coreapi/callbacks.c:442 msgid "Early media." msgstr "מדיה מוקדמת." -#: ../coreapi/callbacks.c:475 +#: ../coreapi/callbacks.c:503 #, c-format msgid "Call with %s is paused." msgstr "שיחה עם %s מושהית." -#: ../coreapi/callbacks.c:488 +#: ../coreapi/callbacks.c:516 #, c-format msgid "Call answered by %s - on hold." msgstr "קריאה נענתה על ידי %s - בהמתנה." -#: ../coreapi/callbacks.c:498 +#: ../coreapi/callbacks.c:526 msgid "Call resumed." msgstr "קריאה חודשה." -#: ../coreapi/callbacks.c:502 +#: ../coreapi/callbacks.c:530 #, c-format msgid "Call answered by %s." msgstr "קריאה נענתה על ידי %s." -#: ../coreapi/callbacks.c:525 +#: ../coreapi/callbacks.c:553 msgid "Incompatible, check codecs or security settings..." msgstr "חוסר תאימות, בדוק קודקים או הגדרות אבטחה..." -#: ../coreapi/callbacks.c:530 ../coreapi/callbacks.c:829 +#: ../coreapi/callbacks.c:558 ../coreapi/callbacks.c:870 msgid "Incompatible media parameters." msgstr "פרמטריי מדיה חסרי תואמים." -#: ../coreapi/callbacks.c:560 +#: ../coreapi/callbacks.c:588 msgid "We have been resumed." msgstr "חזרנו." #. we are being paused -#: ../coreapi/callbacks.c:568 +#: ../coreapi/callbacks.c:596 msgid "We are paused by other party." msgstr "אנו מושהים על ידי צד אחר." #. reINVITE and in-dialogs UPDATE go here -#: ../coreapi/callbacks.c:602 +#: ../coreapi/callbacks.c:630 msgid "Call is updated by remote." msgstr "שיחה עודכנה מרחוק." -#: ../coreapi/callbacks.c:705 +#: ../coreapi/callbacks.c:746 msgid "Call terminated." msgstr "קריאה הסתיימה." -#: ../coreapi/callbacks.c:733 +#: ../coreapi/callbacks.c:774 msgid "User is busy." msgstr "משתמש עסוק כעת." -#: ../coreapi/callbacks.c:734 +#: ../coreapi/callbacks.c:775 msgid "User is temporarily unavailable." msgstr "משתמש לא זמין זמנית." #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:736 +#: ../coreapi/callbacks.c:777 msgid "User does not want to be disturbed." msgstr "משתמש לא מעוניין שיפריעו לו." -#: ../coreapi/callbacks.c:737 +#: ../coreapi/callbacks.c:778 msgid "Call declined." msgstr "קריאה סורבה." -#: ../coreapi/callbacks.c:752 +#: ../coreapi/callbacks.c:793 msgid "Request timeout." msgstr "" -#: ../coreapi/callbacks.c:783 +#: ../coreapi/callbacks.c:824 msgid "Redirected" msgstr "מכוון מחדש" -#: ../coreapi/callbacks.c:838 +#: ../coreapi/callbacks.c:879 msgid "Call failed." msgstr "קריאה נכשלה." -#: ../coreapi/callbacks.c:916 +#: ../coreapi/callbacks.c:957 #, c-format msgid "Registration on %s successful." msgstr "רישום אצל %s הושלם בהצלחה." -#: ../coreapi/callbacks.c:917 +#: ../coreapi/callbacks.c:958 #, c-format msgid "Unregistration on %s done." msgstr "אי רישום אצל %s סוים." -#: ../coreapi/callbacks.c:935 +#: ../coreapi/callbacks.c:976 msgid "no response timeout" msgstr "אין היענות תוך זמן מוגדר" -#: ../coreapi/callbacks.c:938 +#: ../coreapi/callbacks.c:979 #, c-format msgid "Registration on %s failed: %s" msgstr "רישום אצל %s נכשל: %s" -#: ../coreapi/callbacks.c:945 +#: ../coreapi/callbacks.c:986 msgid "Service unavailable, retrying" msgstr "" -#: ../coreapi/linphonecall.c:175 +#. if encryption is DTLS, no status to be displayed +#: ../coreapi/linphonecall.c:180 #, c-format msgid "Authentication token is %s" msgstr "אות האימות הינה %s" -#: ../coreapi/linphonecall.c:3041 +#: ../coreapi/linphonecall.c:3492 #, 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 e9b61953f..1ff87b778 100644 --- a/po/hu.po +++ b/po/hu.po @@ -7,9 +7,10 @@ msgid "" msgstr "" "Project-Id-Version: linphone-gtk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-13 16:18+0100\n" -"PO-Revision-Date: 2015-01-06 11:29+0000\n" -"Last-Translator: Gautier Pelloux-Prayer \n" +"POT-Creation-Date: 2015-02-17 12:28+0100\n" +"PO-Revision-Date: 2015-02-17 11:28+0000\n" +"Last-Translator: Belledonne Communications \n" "Language-Team: Hungarian (http://www.transifex.com/projects/p/linphone-gtk/" "language/hu/)\n" "Language: hu\n" @@ -136,7 +137,7 @@ msgstr "" msgid "Run self test and exit 0 if succeed" msgstr "" -#: ../gtk/main.c:1083 +#: ../gtk/main.c:1088 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -149,66 +150,66 @@ msgstr "" "szeretné adni a partnerlistához?\n" "Ha nemmel válaszol, ez a személy átmenetileg tiltólistára kerül." -#: ../gtk/main.c:1160 +#: ../gtk/main.c:1165 #, c-format msgid "" "Please enter your password for username %s\n" " at realm %s:" msgstr "" -#: ../gtk/main.c:1281 +#: ../gtk/main.c:1286 msgid "Call error" msgstr "Hiba a hívás közben" -#: ../gtk/main.c:1284 ../coreapi/linphonecore.c:3767 +#: ../gtk/main.c:1289 ../coreapi/linphonecore.c:3787 msgid "Call ended" msgstr "Hívás vége" -#: ../gtk/main.c:1287 ../coreapi/call_log.c:221 +#: ../gtk/main.c:1292 ../coreapi/call_log.c:221 msgid "Incoming call" msgstr "Beérkező hívás" -#: ../gtk/main.c:1289 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 +#: ../gtk/main.c:1294 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 msgid "Answer" msgstr "Hívás fogadása" -#: ../gtk/main.c:1291 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1296 ../gtk/main.ui.h:6 msgid "Decline" msgstr "Elutasítás" -#: ../gtk/main.c:1297 +#: ../gtk/main.c:1302 msgid "Call paused" msgstr "Hívás várakoztatva" -#: ../gtk/main.c:1297 +#: ../gtk/main.c:1302 #, c-format msgid "by %s" msgstr "a következő által: %s" -#: ../gtk/main.c:1367 +#: ../gtk/main.c:1372 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "%s szerené elidítani a videót. Elfogadja?" -#: ../gtk/main.c:1529 +#: ../gtk/main.c:1534 msgid "Website link" msgstr "Internetes oldal" -#: ../gtk/main.c:1578 +#: ../gtk/main.c:1583 msgid "Linphone - a video internet phone" msgstr "Linphone - internetes videó telefon" -#: ../gtk/main.c:1670 +#: ../gtk/main.c:1675 #, c-format msgid "%s (Default)" msgstr "%s (Alapértelmezett)" -#: ../gtk/main.c:2002 ../coreapi/callbacks.c:986 +#: ../gtk/main.c:2007 ../coreapi/callbacks.c:1027 #, c-format msgid "We are transferred to %s" msgstr "Át vagyunk irányítva ide: %s" -#: ../gtk/main.c:2012 +#: ../gtk/main.c:2017 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." @@ -216,7 +217,7 @@ msgstr "" "Hangkártya nincs érzékelve ezen a számítógépen.\n" "Nem fog tudni hang hívásokat küldeni vagy fogadni." -#: ../gtk/main.c:2156 +#: ../gtk/main.c:2161 msgid "A free SIP video-phone" msgstr "Egy ingyenes SIP video-telefon" @@ -372,15 +373,19 @@ msgstr "" "Újra kell indítania a linphone-t, hogy az új nyelv kiválasztása érvényre " "jusson. " -#: ../gtk/propertybox.c:1234 +#: ../gtk/propertybox.c:1236 msgid "None" msgstr "Nincs" -#: ../gtk/propertybox.c:1238 +#: ../gtk/propertybox.c:1240 msgid "SRTP" msgstr "SRTP" -#: ../gtk/propertybox.c:1244 +#: ../gtk/propertybox.c:1246 +msgid "DTLS" +msgstr "" + +#: ../gtk/propertybox.c:1253 msgid "ZRTP" msgstr "ZRTP" @@ -557,7 +562,7 @@ msgstr "Érvényesítés (2/2 lépés)" msgid "Error" msgstr "Hiba" -#: ../gtk/setupwizard.c:658 ../gtk/audio_assistant.c:527 +#: ../gtk/setupwizard.c:658 ../gtk/audio_assistant.c:534 msgid "Terminating" msgstr "Befejezés" @@ -650,7 +655,7 @@ msgstr "Befejezés" msgid "Calling..." msgstr "Hívás folyamatban..." -#: ../gtk/incall_view.c:514 ../gtk/incall_view.c:727 +#: ../gtk/incall_view.c:514 ../gtk/incall_view.c:733 msgid "00::00::00" msgstr "00::00::00" @@ -687,55 +692,59 @@ msgid "Secured by SRTP" msgstr "SRTP-vel titkosítva" #: ../gtk/incall_view.c:685 +msgid "Secured by DTLS" +msgstr "" + +#: ../gtk/incall_view.c:691 #, c-format msgid "Secured by ZRTP - [auth token: %s]" msgstr "ZRTP-vel titkosítva - [hitelesítési jel: %s]" -#: ../gtk/incall_view.c:691 +#: ../gtk/incall_view.c:697 msgid "Set unverified" msgstr "Beállítás ellenőrizetlenként" -#: ../gtk/incall_view.c:691 ../gtk/main.ui.h:4 +#: ../gtk/incall_view.c:697 ../gtk/main.ui.h:4 msgid "Set verified" msgstr "Beállítás ellenőrzöttként" -#: ../gtk/incall_view.c:722 +#: ../gtk/incall_view.c:728 msgid "In conference" msgstr "Konferencián" -#: ../gtk/incall_view.c:722 +#: ../gtk/incall_view.c:728 msgid "In call" msgstr "vonalban" -#: ../gtk/incall_view.c:758 +#: ../gtk/incall_view.c:764 msgid "Paused call" msgstr "Várakoztatott hívás" -#: ../gtk/incall_view.c:794 +#: ../gtk/incall_view.c:800 msgid "Call ended." msgstr "Hívás vége." -#: ../gtk/incall_view.c:825 +#: ../gtk/incall_view.c:831 msgid "Transfer in progress" msgstr "Átvitel folyamatban" -#: ../gtk/incall_view.c:828 +#: ../gtk/incall_view.c:834 msgid "Transfer done." msgstr "Átvitel befejezve." -#: ../gtk/incall_view.c:831 +#: ../gtk/incall_view.c:837 msgid "Transfer failed." msgstr "Az átvitel sikertelen." -#: ../gtk/incall_view.c:875 +#: ../gtk/incall_view.c:881 msgid "Resume" msgstr "Visszatérés" -#: ../gtk/incall_view.c:882 ../gtk/main.ui.h:9 +#: ../gtk/incall_view.c:888 ../gtk/main.ui.h:9 msgid "Pause" msgstr "Várakoztatás" -#: ../gtk/incall_view.c:948 +#: ../gtk/incall_view.c:954 #, c-format msgid "" "Recording into\n" @@ -744,7 +753,7 @@ msgstr "" "Felvétel a következőbe\n" "%s %s" -#: ../gtk/incall_view.c:948 +#: ../gtk/incall_view.c:954 msgid "(Paused)" msgstr "(Várakoztatva)" @@ -841,23 +850,23 @@ msgstr "" msgid "Let's start Linphone now" msgstr "" -#: ../gtk/audio_assistant.c:496 +#: ../gtk/audio_assistant.c:503 msgid "Audio Assistant" msgstr "" -#: ../gtk/audio_assistant.c:506 ../gtk/main.ui.h:31 +#: ../gtk/audio_assistant.c:513 ../gtk/main.ui.h:31 msgid "Audio assistant" msgstr "" -#: ../gtk/audio_assistant.c:511 +#: ../gtk/audio_assistant.c:518 msgid "Mic Gain calibration" msgstr "" -#: ../gtk/audio_assistant.c:517 +#: ../gtk/audio_assistant.c:524 msgid "Speaker volume calibration" msgstr "" -#: ../gtk/audio_assistant.c:522 +#: ../gtk/audio_assistant.c:529 msgid "Record and Play" msgstr "" @@ -1709,68 +1718,68 @@ msgstr "" msgid "Please wait while fetching configuration from server..." msgstr "" -#: ../coreapi/linphonecore.c:1510 +#: ../coreapi/linphonecore.c:1508 msgid "Ready" msgstr "Kész" -#: ../coreapi/linphonecore.c:2489 +#: ../coreapi/linphonecore.c:2495 msgid "Configuring" msgstr "" -#: ../coreapi/linphonecore.c:2654 +#: ../coreapi/linphonecore.c:2669 msgid "Looking for telephone number destination..." msgstr "Telefonszám-cél keresése..." -#: ../coreapi/linphonecore.c:2656 +#: ../coreapi/linphonecore.c:2671 msgid "Could not resolve this number." msgstr "Nem sikkerült értelmezni a számot." #. must be known at that time -#: ../coreapi/linphonecore.c:2942 +#: ../coreapi/linphonecore.c:2957 msgid "Contacting" msgstr "Kapcsolódás" -#: ../coreapi/linphonecore.c:2947 +#: ../coreapi/linphonecore.c:2962 msgid "Could not call" msgstr "Nem sikerült hívni" -#: ../coreapi/linphonecore.c:3097 +#: ../coreapi/linphonecore.c:3112 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:3256 +#: ../coreapi/linphonecore.c:3270 msgid "is contacting you" msgstr "kapcsolatba lépett veled." -#: ../coreapi/linphonecore.c:3257 +#: ../coreapi/linphonecore.c:3271 msgid " and asked autoanswer." msgstr "és automatikus választ kért." -#: ../coreapi/linphonecore.c:3375 +#: ../coreapi/linphonecore.c:3395 msgid "Modifying call parameters..." msgstr "A hívási jellemzők módosítása..." -#: ../coreapi/linphonecore.c:3723 +#: ../coreapi/linphonecore.c:3743 msgid "Connected." msgstr "Kapcsolódva." -#: ../coreapi/linphonecore.c:3748 +#: ../coreapi/linphonecore.c:3768 msgid "Call aborted" msgstr "Hívás megszakítva" -#: ../coreapi/linphonecore.c:3938 +#: ../coreapi/linphonecore.c:3958 msgid "Could not pause the call" msgstr "Nem sikerült várakoztatni a hívást" -#: ../coreapi/linphonecore.c:3941 +#: ../coreapi/linphonecore.c:3961 msgid "Pausing the current call..." msgstr "Jelenlegi hívás várakoztatásának aktiválása..." -#: ../coreapi/misc.c:438 +#: ../coreapi/misc.c:433 msgid "Stun lookup in progress..." msgstr "Stun keresés folyamatban..." -#: ../coreapi/misc.c:619 +#: ../coreapi/misc.c:614 msgid "ICE local candidates gathering in progress..." msgstr "ICE helyi jelentkezők begyűjtése folyamatban..." @@ -1826,7 +1835,7 @@ msgstr "" msgid "Unknown status" msgstr "" -#: ../coreapi/proxy.c:327 +#: ../coreapi/proxy.c:328 msgid "" "The sip proxy address you entered is invalid, it must start with \"sip:\" " "followed by a hostname." @@ -1834,7 +1843,7 @@ msgstr "" "Az Ön által megadott SIP proxy cím érvénytelen. \"sip:\"-tal kell kezdődnie, " "ezt egy hosztnév követi." -#: ../coreapi/proxy.c:333 +#: ../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" @@ -1843,127 +1852,128 @@ msgstr "" "Így kéne kinéznie: sip:felhasznalonev@proxytartomany, például sip:" "aladar@pelda.hu" -#: ../coreapi/proxy.c:1391 +#: ../coreapi/proxy.c:1403 #, c-format msgid "Could not login as %s" msgstr "Nem sikerült belépni ezzel: %s" -#: ../coreapi/callbacks.c:383 +#: ../coreapi/callbacks.c:404 msgid "Remote ringing." msgstr "Távoli csengés." -#: ../coreapi/callbacks.c:404 +#: ../coreapi/callbacks.c:425 msgid "Remote ringing..." msgstr "Távoli csengés..." -#: ../coreapi/callbacks.c:414 +#: ../coreapi/callbacks.c:442 msgid "Early media." msgstr "Korai médiák." -#: ../coreapi/callbacks.c:475 +#: ../coreapi/callbacks.c:503 #, c-format msgid "Call with %s is paused." msgstr "A hívás a következővel: %s várakoztatva" -#: ../coreapi/callbacks.c:488 +#: ../coreapi/callbacks.c:516 #, c-format msgid "Call answered by %s - on hold." msgstr "%s fogadta a hívást - várakoztatva." -#: ../coreapi/callbacks.c:498 +#: ../coreapi/callbacks.c:526 msgid "Call resumed." msgstr "Hívás visszatért" -#: ../coreapi/callbacks.c:502 +#: ../coreapi/callbacks.c:530 #, c-format msgid "Call answered by %s." msgstr "%s válaszolt a hívásra." -#: ../coreapi/callbacks.c:525 +#: ../coreapi/callbacks.c:553 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:530 ../coreapi/callbacks.c:829 +#: ../coreapi/callbacks.c:558 ../coreapi/callbacks.c:870 msgid "Incompatible media parameters." msgstr "Nem kompatibilis médiajellemzők." -#: ../coreapi/callbacks.c:560 +#: ../coreapi/callbacks.c:588 msgid "We have been resumed." msgstr "Visszatértünk." #. we are being paused -#: ../coreapi/callbacks.c:568 +#: ../coreapi/callbacks.c:596 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:602 +#: ../coreapi/callbacks.c:630 msgid "Call is updated by remote." msgstr "A hívás távolról frissítve." -#: ../coreapi/callbacks.c:705 +#: ../coreapi/callbacks.c:746 msgid "Call terminated." msgstr "A hívás befejezve." -#: ../coreapi/callbacks.c:733 +#: ../coreapi/callbacks.c:774 msgid "User is busy." msgstr "A felhasználó foglalt." -#: ../coreapi/callbacks.c:734 +#: ../coreapi/callbacks.c:775 msgid "User is temporarily unavailable." msgstr "A felhasználó ideiglenesen nem elérhető" #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:736 +#: ../coreapi/callbacks.c:777 msgid "User does not want to be disturbed." msgstr "A felhasználó nem akarja, hogy zavarják." -#: ../coreapi/callbacks.c:737 +#: ../coreapi/callbacks.c:778 msgid "Call declined." msgstr "Hívás elutasítva" -#: ../coreapi/callbacks.c:752 +#: ../coreapi/callbacks.c:793 msgid "Request timeout." msgstr "" -#: ../coreapi/callbacks.c:783 +#: ../coreapi/callbacks.c:824 msgid "Redirected" msgstr "Átirányítva" -#: ../coreapi/callbacks.c:838 +#: ../coreapi/callbacks.c:879 msgid "Call failed." msgstr "Nem sikerült a hívás." -#: ../coreapi/callbacks.c:916 +#: ../coreapi/callbacks.c:957 #, c-format msgid "Registration on %s successful." msgstr "A regisztáció a %s -n sikerült." -#: ../coreapi/callbacks.c:917 +#: ../coreapi/callbacks.c:958 #, c-format msgid "Unregistration on %s done." msgstr "A kiregisztrálás kész a következőn: %s ." -#: ../coreapi/callbacks.c:935 +#: ../coreapi/callbacks.c:976 msgid "no response timeout" msgstr "időtúllépés után nincs válasz" -#: ../coreapi/callbacks.c:938 +#: ../coreapi/callbacks.c:979 #, c-format msgid "Registration on %s failed: %s" msgstr "A regisztáció a %s -n nem sikerült: %s" -#: ../coreapi/callbacks.c:945 +#: ../coreapi/callbacks.c:986 msgid "Service unavailable, retrying" msgstr "" -#: ../coreapi/linphonecall.c:175 +#. if encryption is DTLS, no status to be displayed +#: ../coreapi/linphonecall.c:180 #, c-format msgid "Authentication token is %s" msgstr "Hitelesítési jel: %s" -#: ../coreapi/linphonecall.c:3041 +#: ../coreapi/linphonecall.c:3492 #, 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 111737c48..7561f7f0d 100644 --- a/po/it.po +++ b/po/it.po @@ -7,9 +7,10 @@ msgid "" msgstr "" "Project-Id-Version: linphone-gtk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-13 16:18+0100\n" -"PO-Revision-Date: 2015-01-06 11:29+0000\n" -"Last-Translator: Gautier Pelloux-Prayer \n" +"POT-Creation-Date: 2015-02-17 12:28+0100\n" +"PO-Revision-Date: 2015-02-17 11:28+0000\n" +"Last-Translator: Belledonne Communications \n" "Language-Team: Italian (http://www.transifex.com/projects/p/linphone-gtk/" "language/it/)\n" "Language: it\n" @@ -134,7 +135,7 @@ msgstr "" msgid "Run self test and exit 0 if succeed" msgstr "" -#: ../gtk/main.c:1083 +#: ../gtk/main.c:1088 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -146,72 +147,72 @@ msgstr "" "veda il tuo stato o aggiungerlo alla tua lista dei contatti Se rispondi no " "questo utente sarà momentaneamente bloccato." -#: ../gtk/main.c:1160 +#: ../gtk/main.c:1165 #, c-format msgid "" "Please enter your password for username %s\n" " at realm %s:" msgstr "" -#: ../gtk/main.c:1281 +#: ../gtk/main.c:1286 msgid "Call error" msgstr "" -#: ../gtk/main.c:1284 ../coreapi/linphonecore.c:3767 +#: ../gtk/main.c:1289 ../coreapi/linphonecore.c:3787 msgid "Call ended" msgstr "Chiamata terminata" -#: ../gtk/main.c:1287 ../coreapi/call_log.c:221 +#: ../gtk/main.c:1292 ../coreapi/call_log.c:221 msgid "Incoming call" msgstr "Chimata in entrata" -#: ../gtk/main.c:1289 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 +#: ../gtk/main.c:1294 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 msgid "Answer" msgstr "" -#: ../gtk/main.c:1291 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1296 ../gtk/main.ui.h:6 msgid "Decline" msgstr "Rifiuta" -#: ../gtk/main.c:1297 +#: ../gtk/main.c:1302 msgid "Call paused" msgstr "" -#: ../gtk/main.c:1297 +#: ../gtk/main.c:1302 #, c-format msgid "by %s" msgstr "" -#: ../gtk/main.c:1367 +#: ../gtk/main.c:1372 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1529 +#: ../gtk/main.c:1534 msgid "Website link" msgstr "" -#: ../gtk/main.c:1578 +#: ../gtk/main.c:1583 msgid "Linphone - a video internet phone" msgstr "" -#: ../gtk/main.c:1670 +#: ../gtk/main.c:1675 #, c-format msgid "%s (Default)" msgstr "%s (Default)" -#: ../gtk/main.c:2002 ../coreapi/callbacks.c:986 +#: ../gtk/main.c:2007 ../coreapi/callbacks.c:1027 #, c-format msgid "We are transferred to %s" msgstr "" -#: ../gtk/main.c:2012 +#: ../gtk/main.c:2017 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:2156 +#: ../gtk/main.c:2161 msgid "A free SIP video-phone" msgstr "" @@ -365,15 +366,19 @@ 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:1234 +#: ../gtk/propertybox.c:1236 msgid "None" msgstr "" -#: ../gtk/propertybox.c:1238 +#: ../gtk/propertybox.c:1240 msgid "SRTP" msgstr "" -#: ../gtk/propertybox.c:1244 +#: ../gtk/propertybox.c:1246 +msgid "DTLS" +msgstr "" + +#: ../gtk/propertybox.c:1253 msgid "ZRTP" msgstr "" @@ -544,7 +549,7 @@ msgstr "" msgid "Error" msgstr "" -#: ../gtk/setupwizard.c:658 ../gtk/audio_assistant.c:527 +#: ../gtk/setupwizard.c:658 ../gtk/audio_assistant.c:534 msgid "Terminating" msgstr "" @@ -635,7 +640,7 @@ msgstr "" msgid "Calling..." msgstr "" -#: ../gtk/incall_view.c:514 ../gtk/incall_view.c:727 +#: ../gtk/incall_view.c:514 ../gtk/incall_view.c:733 msgid "00::00::00" msgstr "" @@ -672,62 +677,66 @@ msgid "Secured by SRTP" msgstr "" #: ../gtk/incall_view.c:685 +msgid "Secured by DTLS" +msgstr "" + +#: ../gtk/incall_view.c:691 #, c-format msgid "Secured by ZRTP - [auth token: %s]" msgstr "" -#: ../gtk/incall_view.c:691 +#: ../gtk/incall_view.c:697 msgid "Set unverified" msgstr "" -#: ../gtk/incall_view.c:691 ../gtk/main.ui.h:4 +#: ../gtk/incall_view.c:697 ../gtk/main.ui.h:4 msgid "Set verified" msgstr "" -#: ../gtk/incall_view.c:722 +#: ../gtk/incall_view.c:728 msgid "In conference" msgstr "" -#: ../gtk/incall_view.c:722 +#: ../gtk/incall_view.c:728 msgid "In call" msgstr "" -#: ../gtk/incall_view.c:758 +#: ../gtk/incall_view.c:764 msgid "Paused call" msgstr "" -#: ../gtk/incall_view.c:794 +#: ../gtk/incall_view.c:800 msgid "Call ended." msgstr "Chiamata terminata." -#: ../gtk/incall_view.c:825 +#: ../gtk/incall_view.c:831 msgid "Transfer in progress" msgstr "" -#: ../gtk/incall_view.c:828 +#: ../gtk/incall_view.c:834 msgid "Transfer done." msgstr "" -#: ../gtk/incall_view.c:831 +#: ../gtk/incall_view.c:837 msgid "Transfer failed." msgstr "" -#: ../gtk/incall_view.c:875 +#: ../gtk/incall_view.c:881 msgid "Resume" msgstr "" -#: ../gtk/incall_view.c:882 ../gtk/main.ui.h:9 +#: ../gtk/incall_view.c:888 ../gtk/main.ui.h:9 msgid "Pause" msgstr "" -#: ../gtk/incall_view.c:948 +#: ../gtk/incall_view.c:954 #, c-format msgid "" "Recording into\n" "%s %s" msgstr "" -#: ../gtk/incall_view.c:948 +#: ../gtk/incall_view.c:954 msgid "(Paused)" msgstr "" @@ -824,23 +833,23 @@ msgstr "" msgid "Let's start Linphone now" msgstr "" -#: ../gtk/audio_assistant.c:496 +#: ../gtk/audio_assistant.c:503 msgid "Audio Assistant" msgstr "" -#: ../gtk/audio_assistant.c:506 ../gtk/main.ui.h:31 +#: ../gtk/audio_assistant.c:513 ../gtk/main.ui.h:31 msgid "Audio assistant" msgstr "" -#: ../gtk/audio_assistant.c:511 +#: ../gtk/audio_assistant.c:518 msgid "Mic Gain calibration" msgstr "" -#: ../gtk/audio_assistant.c:517 +#: ../gtk/audio_assistant.c:524 msgid "Speaker volume calibration" msgstr "" -#: ../gtk/audio_assistant.c:522 +#: ../gtk/audio_assistant.c:529 msgid "Record and Play" msgstr "" @@ -1689,68 +1698,68 @@ msgstr "" msgid "Please wait while fetching configuration from server..." msgstr "" -#: ../coreapi/linphonecore.c:1510 +#: ../coreapi/linphonecore.c:1508 msgid "Ready" msgstr "Pronto" -#: ../coreapi/linphonecore.c:2489 +#: ../coreapi/linphonecore.c:2495 msgid "Configuring" msgstr "" -#: ../coreapi/linphonecore.c:2654 +#: ../coreapi/linphonecore.c:2669 msgid "Looking for telephone number destination..." msgstr "Ricerca numero destinazione..." -#: ../coreapi/linphonecore.c:2656 +#: ../coreapi/linphonecore.c:2671 msgid "Could not resolve this number." msgstr "Impossibile risolvere il numero." #. must be known at that time -#: ../coreapi/linphonecore.c:2942 +#: ../coreapi/linphonecore.c:2957 msgid "Contacting" msgstr "In connessione" -#: ../coreapi/linphonecore.c:2947 +#: ../coreapi/linphonecore.c:2962 msgid "Could not call" msgstr "" -#: ../coreapi/linphonecore.c:3097 +#: ../coreapi/linphonecore.c:3112 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "" -#: ../coreapi/linphonecore.c:3256 +#: ../coreapi/linphonecore.c:3270 msgid "is contacting you" msgstr "" -#: ../coreapi/linphonecore.c:3257 +#: ../coreapi/linphonecore.c:3271 msgid " and asked autoanswer." msgstr "" -#: ../coreapi/linphonecore.c:3375 +#: ../coreapi/linphonecore.c:3395 msgid "Modifying call parameters..." msgstr "" -#: ../coreapi/linphonecore.c:3723 +#: ../coreapi/linphonecore.c:3743 msgid "Connected." msgstr "Connessione" -#: ../coreapi/linphonecore.c:3748 +#: ../coreapi/linphonecore.c:3768 msgid "Call aborted" msgstr "" -#: ../coreapi/linphonecore.c:3938 +#: ../coreapi/linphonecore.c:3958 msgid "Could not pause the call" msgstr "" -#: ../coreapi/linphonecore.c:3941 +#: ../coreapi/linphonecore.c:3961 msgid "Pausing the current call..." msgstr "" -#: ../coreapi/misc.c:438 +#: ../coreapi/misc.c:433 msgid "Stun lookup in progress..." msgstr "Ricerca Stun in progresso ..." -#: ../coreapi/misc.c:619 +#: ../coreapi/misc.c:614 msgid "ICE local candidates gathering in progress..." msgstr "" @@ -1806,7 +1815,7 @@ msgstr "" msgid "Unknown status" msgstr "" -#: ../coreapi/proxy.c:327 +#: ../coreapi/proxy.c:328 msgid "" "The sip proxy address you entered is invalid, it must start with \"sip:\" " "followed by a hostname." @@ -1814,7 +1823,7 @@ msgstr "" "L'indirizzo sip proxy utilizzato è invalido, deve iniziare con \"sip:\" " "seguito dall' hostaname." -#: ../coreapi/proxy.c:333 +#: ../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" @@ -1822,126 +1831,127 @@ msgstr "" "L'identità sip utilizza è invalida.\n" "Dovrebbre essere sip:username@proxydomain, esempio: sip:alice@example.net" -#: ../coreapi/proxy.c:1391 +#: ../coreapi/proxy.c:1403 #, c-format msgid "Could not login as %s" msgstr "impossibile login come %s" -#: ../coreapi/callbacks.c:383 +#: ../coreapi/callbacks.c:404 msgid "Remote ringing." msgstr "" -#: ../coreapi/callbacks.c:404 +#: ../coreapi/callbacks.c:425 msgid "Remote ringing..." msgstr "" -#: ../coreapi/callbacks.c:414 +#: ../coreapi/callbacks.c:442 msgid "Early media." msgstr "" -#: ../coreapi/callbacks.c:475 +#: ../coreapi/callbacks.c:503 #, c-format msgid "Call with %s is paused." msgstr "" -#: ../coreapi/callbacks.c:488 +#: ../coreapi/callbacks.c:516 #, c-format msgid "Call answered by %s - on hold." msgstr "" -#: ../coreapi/callbacks.c:498 +#: ../coreapi/callbacks.c:526 msgid "Call resumed." msgstr "" -#: ../coreapi/callbacks.c:502 +#: ../coreapi/callbacks.c:530 #, c-format msgid "Call answered by %s." msgstr "" -#: ../coreapi/callbacks.c:525 +#: ../coreapi/callbacks.c:553 msgid "Incompatible, check codecs or security settings..." msgstr "" -#: ../coreapi/callbacks.c:530 ../coreapi/callbacks.c:829 +#: ../coreapi/callbacks.c:558 ../coreapi/callbacks.c:870 msgid "Incompatible media parameters." msgstr "" -#: ../coreapi/callbacks.c:560 +#: ../coreapi/callbacks.c:588 msgid "We have been resumed." msgstr "" #. we are being paused -#: ../coreapi/callbacks.c:568 +#: ../coreapi/callbacks.c:596 msgid "We are paused by other party." msgstr "" #. reINVITE and in-dialogs UPDATE go here -#: ../coreapi/callbacks.c:602 +#: ../coreapi/callbacks.c:630 msgid "Call is updated by remote." msgstr "" -#: ../coreapi/callbacks.c:705 +#: ../coreapi/callbacks.c:746 msgid "Call terminated." msgstr "Chiamata terminata." -#: ../coreapi/callbacks.c:733 +#: ../coreapi/callbacks.c:774 msgid "User is busy." msgstr "Utente occupato" -#: ../coreapi/callbacks.c:734 +#: ../coreapi/callbacks.c:775 msgid "User is temporarily unavailable." msgstr "Utente non disponibile" #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:736 +#: ../coreapi/callbacks.c:777 msgid "User does not want to be disturbed." msgstr "L'utente non vuole essere disturbato" -#: ../coreapi/callbacks.c:737 +#: ../coreapi/callbacks.c:778 msgid "Call declined." msgstr "Chiamata rifiutata" -#: ../coreapi/callbacks.c:752 +#: ../coreapi/callbacks.c:793 msgid "Request timeout." msgstr "" -#: ../coreapi/callbacks.c:783 +#: ../coreapi/callbacks.c:824 msgid "Redirected" msgstr "" -#: ../coreapi/callbacks.c:838 +#: ../coreapi/callbacks.c:879 msgid "Call failed." msgstr "" -#: ../coreapi/callbacks.c:916 +#: ../coreapi/callbacks.c:957 #, c-format msgid "Registration on %s successful." msgstr "Registrazione su %s attiva" -#: ../coreapi/callbacks.c:917 +#: ../coreapi/callbacks.c:958 #, c-format msgid "Unregistration on %s done." msgstr "Unregistrazione su %s" -#: ../coreapi/callbacks.c:935 +#: ../coreapi/callbacks.c:976 msgid "no response timeout" msgstr "timeout no risposta" -#: ../coreapi/callbacks.c:938 +#: ../coreapi/callbacks.c:979 #, c-format msgid "Registration on %s failed: %s" msgstr "Registrazione su %s fallita: %s" -#: ../coreapi/callbacks.c:945 +#: ../coreapi/callbacks.c:986 msgid "Service unavailable, retrying" msgstr "" -#: ../coreapi/linphonecall.c:175 +#. if encryption is DTLS, no status to be displayed +#: ../coreapi/linphonecall.c:180 #, c-format msgid "Authentication token is %s" msgstr "" -#: ../coreapi/linphonecall.c:3041 +#: ../coreapi/linphonecall.c:3492 #, 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 e998ee25c..e4420706b 100644 --- a/po/ja.po +++ b/po/ja.po @@ -9,9 +9,10 @@ msgid "" msgstr "" "Project-Id-Version: linphone-gtk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-13 16:18+0100\n" -"PO-Revision-Date: 2015-01-13 16:34+0000\n" -"Last-Translator: Alexander\n" +"POT-Creation-Date: 2015-02-17 12:28+0100\n" +"PO-Revision-Date: 2015-02-17 11:28+0000\n" +"Last-Translator: Belledonne Communications \n" "Language-Team: Japanese (http://www.transifex.com/projects/p/linphone-gtk/" "language/ja/)\n" "Language: ja\n" @@ -138,7 +139,7 @@ msgstr "オーディオアシスタントを実行" msgid "Run self test and exit 0 if succeed" msgstr "" -#: ../gtk/main.c:1083 +#: ../gtk/main.c:1088 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -151,72 +152,72 @@ msgstr "" "す。\n" "あなたが拒否すると、この人は一時的にブラックリストへ登録されます。" -#: ../gtk/main.c:1160 +#: ../gtk/main.c:1165 #, c-format msgid "" "Please enter your password for username %s\n" " at realm %s:" msgstr "" -#: ../gtk/main.c:1281 +#: ../gtk/main.c:1286 msgid "Call error" msgstr "呼出エラー" -#: ../gtk/main.c:1284 ../coreapi/linphonecore.c:3767 +#: ../gtk/main.c:1289 ../coreapi/linphonecore.c:3787 msgid "Call ended" msgstr "呼出終了" -#: ../gtk/main.c:1287 ../coreapi/call_log.c:221 +#: ../gtk/main.c:1292 ../coreapi/call_log.c:221 msgid "Incoming call" msgstr "着信" -#: ../gtk/main.c:1289 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 +#: ../gtk/main.c:1294 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 msgid "Answer" msgstr "応答" -#: ../gtk/main.c:1291 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1296 ../gtk/main.ui.h:6 msgid "Decline" msgstr "拒否" -#: ../gtk/main.c:1297 +#: ../gtk/main.c:1302 msgid "Call paused" msgstr "呼び出しの一時停止" -#: ../gtk/main.c:1297 +#: ../gtk/main.c:1302 #, c-format msgid "by %s" msgstr "%s" -#: ../gtk/main.c:1367 +#: ../gtk/main.c:1372 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1529 +#: ../gtk/main.c:1534 msgid "Website link" msgstr "ウェブサイトリンク" -#: ../gtk/main.c:1578 +#: ../gtk/main.c:1583 msgid "Linphone - a video internet phone" msgstr "Linphone - ビデオインターネット電話" -#: ../gtk/main.c:1670 +#: ../gtk/main.c:1675 #, c-format msgid "%s (Default)" msgstr "%s (デフォルト)" -#: ../gtk/main.c:2002 ../coreapi/callbacks.c:986 +#: ../gtk/main.c:2007 ../coreapi/callbacks.c:1027 #, c-format msgid "We are transferred to %s" msgstr "%s に転送しました" -#: ../gtk/main.c:2012 +#: ../gtk/main.c:2017 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:2156 +#: ../gtk/main.c:2161 msgid "A free SIP video-phone" msgstr "無料 SIP ビデオ-電話" @@ -370,15 +371,19 @@ msgid "" "You need to restart linphone for the new language selection to take effect." msgstr "言語の選択を有効にするには、 Linphoneを再起動する必要があります。" -#: ../gtk/propertybox.c:1234 +#: ../gtk/propertybox.c:1236 msgid "None" msgstr "なし" -#: ../gtk/propertybox.c:1238 +#: ../gtk/propertybox.c:1240 msgid "SRTP" msgstr "SRTP" -#: ../gtk/propertybox.c:1244 +#: ../gtk/propertybox.c:1246 +msgid "DTLS" +msgstr "" + +#: ../gtk/propertybox.c:1253 msgid "ZRTP" msgstr "ZRTP" @@ -426,6 +431,8 @@ msgid "" "Welcome!\n" "This assistant will help you to use a SIP account for your calls." msgstr "" +"ようこそ!\n" +"あなたの通話のためのSIPアカウント設定をお手伝いします。" #: ../gtk/setupwizard.c:43 msgid "Create an account on linphone.org" @@ -552,7 +559,7 @@ msgstr "検証します (2/2)" msgid "Error" msgstr "エラー" -#: ../gtk/setupwizard.c:658 ../gtk/audio_assistant.c:527 +#: ../gtk/setupwizard.c:658 ../gtk/audio_assistant.c:534 msgid "Terminating" msgstr "終了" @@ -645,7 +652,7 @@ msgstr "" msgid "Calling..." msgstr "かけています…" -#: ../gtk/incall_view.c:514 ../gtk/incall_view.c:727 +#: ../gtk/incall_view.c:514 ../gtk/incall_view.c:733 msgid "00::00::00" msgstr "00::00::00" @@ -682,62 +689,66 @@ msgid "Secured by SRTP" msgstr "SRTPのセキュリティ" #: ../gtk/incall_view.c:685 +msgid "Secured by DTLS" +msgstr "" + +#: ../gtk/incall_view.c:691 #, c-format msgid "Secured by ZRTP - [auth token: %s]" msgstr "ZRTP によるセキュリティ - [auth token: %s]" -#: ../gtk/incall_view.c:691 +#: ../gtk/incall_view.c:697 msgid "Set unverified" msgstr "セット未検証" -#: ../gtk/incall_view.c:691 ../gtk/main.ui.h:4 +#: ../gtk/incall_view.c:697 ../gtk/main.ui.h:4 msgid "Set verified" msgstr "セット検証済" -#: ../gtk/incall_view.c:722 +#: ../gtk/incall_view.c:728 msgid "In conference" msgstr "会議で" -#: ../gtk/incall_view.c:722 +#: ../gtk/incall_view.c:728 msgid "In call" msgstr "呼び出し中" -#: ../gtk/incall_view.c:758 +#: ../gtk/incall_view.c:764 msgid "Paused call" msgstr "呼び出し停止" -#: ../gtk/incall_view.c:794 +#: ../gtk/incall_view.c:800 msgid "Call ended." msgstr "呼び出し終了" -#: ../gtk/incall_view.c:825 +#: ../gtk/incall_view.c:831 msgid "Transfer in progress" msgstr "進行中の転送" -#: ../gtk/incall_view.c:828 +#: ../gtk/incall_view.c:834 msgid "Transfer done." msgstr "転送完了。" -#: ../gtk/incall_view.c:831 +#: ../gtk/incall_view.c:837 msgid "Transfer failed." msgstr "転送失敗。" -#: ../gtk/incall_view.c:875 +#: ../gtk/incall_view.c:881 msgid "Resume" msgstr "レジューム" -#: ../gtk/incall_view.c:882 ../gtk/main.ui.h:9 +#: ../gtk/incall_view.c:888 ../gtk/main.ui.h:9 msgid "Pause" msgstr "一時停止" -#: ../gtk/incall_view.c:948 +#: ../gtk/incall_view.c:954 #, c-format msgid "" "Recording into\n" "%s %s" msgstr "" -#: ../gtk/incall_view.c:948 +#: ../gtk/incall_view.c:954 msgid "(Paused)" msgstr "(停止中)" @@ -834,23 +845,23 @@ msgstr "再生" msgid "Let's start Linphone now" msgstr "Linphoneをはじめる" -#: ../gtk/audio_assistant.c:496 +#: ../gtk/audio_assistant.c:503 msgid "Audio Assistant" msgstr "音声アシスタント" -#: ../gtk/audio_assistant.c:506 ../gtk/main.ui.h:31 +#: ../gtk/audio_assistant.c:513 ../gtk/main.ui.h:31 msgid "Audio assistant" msgstr "音声アシスタント" -#: ../gtk/audio_assistant.c:511 +#: ../gtk/audio_assistant.c:518 msgid "Mic Gain calibration" msgstr "マイクのゲイン測定" -#: ../gtk/audio_assistant.c:517 +#: ../gtk/audio_assistant.c:524 msgid "Speaker volume calibration" msgstr "スピーカーの音量測定" -#: ../gtk/audio_assistant.c:522 +#: ../gtk/audio_assistant.c:529 msgid "Record and Play" msgstr "録音して再生" @@ -1712,68 +1723,68 @@ msgstr "" msgid "Please wait while fetching configuration from server..." msgstr "" -#: ../coreapi/linphonecore.c:1510 +#: ../coreapi/linphonecore.c:1508 msgid "Ready" msgstr "準備" -#: ../coreapi/linphonecore.c:2489 +#: ../coreapi/linphonecore.c:2495 msgid "Configuring" msgstr "" -#: ../coreapi/linphonecore.c:2654 +#: ../coreapi/linphonecore.c:2669 msgid "Looking for telephone number destination..." msgstr "" -#: ../coreapi/linphonecore.c:2656 +#: ../coreapi/linphonecore.c:2671 msgid "Could not resolve this number." msgstr "" #. must be known at that time -#: ../coreapi/linphonecore.c:2942 +#: ../coreapi/linphonecore.c:2957 msgid "Contacting" msgstr "" -#: ../coreapi/linphonecore.c:2947 +#: ../coreapi/linphonecore.c:2962 msgid "Could not call" msgstr "" -#: ../coreapi/linphonecore.c:3097 +#: ../coreapi/linphonecore.c:3112 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "" -#: ../coreapi/linphonecore.c:3256 +#: ../coreapi/linphonecore.c:3270 msgid "is contacting you" msgstr "" -#: ../coreapi/linphonecore.c:3257 +#: ../coreapi/linphonecore.c:3271 msgid " and asked autoanswer." msgstr "と自動応答を尋ねる" -#: ../coreapi/linphonecore.c:3375 +#: ../coreapi/linphonecore.c:3395 msgid "Modifying call parameters..." msgstr "コールパラメーターの変更..." -#: ../coreapi/linphonecore.c:3723 +#: ../coreapi/linphonecore.c:3743 msgid "Connected." msgstr "接続しました。" -#: ../coreapi/linphonecore.c:3748 +#: ../coreapi/linphonecore.c:3768 msgid "Call aborted" msgstr "呼び出しを打ち切る" -#: ../coreapi/linphonecore.c:3938 +#: ../coreapi/linphonecore.c:3958 msgid "Could not pause the call" msgstr "呼び出しを一時停止できませんでした" -#: ../coreapi/linphonecore.c:3941 +#: ../coreapi/linphonecore.c:3961 msgid "Pausing the current call..." msgstr "現在の通話を一時停止..." -#: ../coreapi/misc.c:438 +#: ../coreapi/misc.c:433 msgid "Stun lookup in progress..." msgstr "Stunによるルックアップの進行中…" -#: ../coreapi/misc.c:619 +#: ../coreapi/misc.c:614 msgid "ICE local candidates gathering in progress..." msgstr "" @@ -1829,138 +1840,139 @@ msgstr "休暇中" msgid "Unknown status" msgstr "不明なステータス" -#: ../coreapi/proxy.c:327 +#: ../coreapi/proxy.c:328 msgid "" "The sip proxy address you entered is invalid, it must start with \"sip:\" " "followed by a hostname." msgstr "" -#: ../coreapi/proxy.c:333 +#: ../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 "" -#: ../coreapi/proxy.c:1391 +#: ../coreapi/proxy.c:1403 #, c-format msgid "Could not login as %s" msgstr "" -#: ../coreapi/callbacks.c:383 +#: ../coreapi/callbacks.c:404 msgid "Remote ringing." msgstr "" -#: ../coreapi/callbacks.c:404 +#: ../coreapi/callbacks.c:425 msgid "Remote ringing..." msgstr "" -#: ../coreapi/callbacks.c:414 +#: ../coreapi/callbacks.c:442 msgid "Early media." msgstr "Early media." -#: ../coreapi/callbacks.c:475 +#: ../coreapi/callbacks.c:503 #, c-format msgid "Call with %s is paused." msgstr "" -#: ../coreapi/callbacks.c:488 +#: ../coreapi/callbacks.c:516 #, c-format msgid "Call answered by %s - on hold." msgstr "" -#: ../coreapi/callbacks.c:498 +#: ../coreapi/callbacks.c:526 msgid "Call resumed." msgstr "" -#: ../coreapi/callbacks.c:502 +#: ../coreapi/callbacks.c:530 #, c-format msgid "Call answered by %s." msgstr "" -#: ../coreapi/callbacks.c:525 +#: ../coreapi/callbacks.c:553 msgid "Incompatible, check codecs or security settings..." msgstr "" -#: ../coreapi/callbacks.c:530 ../coreapi/callbacks.c:829 +#: ../coreapi/callbacks.c:558 ../coreapi/callbacks.c:870 msgid "Incompatible media parameters." msgstr "" -#: ../coreapi/callbacks.c:560 +#: ../coreapi/callbacks.c:588 msgid "We have been resumed." msgstr "" #. we are being paused -#: ../coreapi/callbacks.c:568 +#: ../coreapi/callbacks.c:596 msgid "We are paused by other party." msgstr "" #. reINVITE and in-dialogs UPDATE go here -#: ../coreapi/callbacks.c:602 +#: ../coreapi/callbacks.c:630 msgid "Call is updated by remote." msgstr "" -#: ../coreapi/callbacks.c:705 +#: ../coreapi/callbacks.c:746 msgid "Call terminated." msgstr "呼び出し終了。" -#: ../coreapi/callbacks.c:733 +#: ../coreapi/callbacks.c:774 msgid "User is busy." msgstr "相手はビジーです。" -#: ../coreapi/callbacks.c:734 +#: ../coreapi/callbacks.c:775 msgid "User is temporarily unavailable." msgstr "相手は、今出られません。" #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:736 +#: ../coreapi/callbacks.c:777 msgid "User does not want to be disturbed." msgstr "相手は手が離せないようです。" -#: ../coreapi/callbacks.c:737 +#: ../coreapi/callbacks.c:778 msgid "Call declined." msgstr "通話は拒否されました。" -#: ../coreapi/callbacks.c:752 +#: ../coreapi/callbacks.c:793 msgid "Request timeout." msgstr "リクエストは時間切れです。" -#: ../coreapi/callbacks.c:783 +#: ../coreapi/callbacks.c:824 msgid "Redirected" msgstr "" -#: ../coreapi/callbacks.c:838 +#: ../coreapi/callbacks.c:879 msgid "Call failed." msgstr "" -#: ../coreapi/callbacks.c:916 +#: ../coreapi/callbacks.c:957 #, c-format msgid "Registration on %s successful." msgstr "" -#: ../coreapi/callbacks.c:917 +#: ../coreapi/callbacks.c:958 #, c-format msgid "Unregistration on %s done." msgstr "" -#: ../coreapi/callbacks.c:935 +#: ../coreapi/callbacks.c:976 msgid "no response timeout" msgstr "" -#: ../coreapi/callbacks.c:938 +#: ../coreapi/callbacks.c:979 #, c-format msgid "Registration on %s failed: %s" msgstr "" -#: ../coreapi/callbacks.c:945 +#: ../coreapi/callbacks.c:986 msgid "Service unavailable, retrying" msgstr "" -#: ../coreapi/linphonecall.c:175 +#. if encryption is DTLS, no status to be displayed +#: ../coreapi/linphonecall.c:180 #, c-format msgid "Authentication token is %s" msgstr "" -#: ../coreapi/linphonecall.c:3041 +#: ../coreapi/linphonecall.c:3492 #, 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 fb7035231..e6bb13dc7 100644 --- a/po/nb_NO.po +++ b/po/nb_NO.po @@ -8,9 +8,10 @@ msgid "" msgstr "" "Project-Id-Version: linphone-gtk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-13 16:18+0100\n" -"PO-Revision-Date: 2015-01-06 11:29+0000\n" -"Last-Translator: Gautier Pelloux-Prayer \n" +"POT-Creation-Date: 2015-02-17 12:28+0100\n" +"PO-Revision-Date: 2015-02-17 11:28+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" "Language: nb_NO\n" @@ -137,7 +138,7 @@ msgstr "" msgid "Run self test and exit 0 if succeed" msgstr "" -#: ../gtk/main.c:1083 +#: ../gtk/main.c:1088 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -150,66 +151,66 @@ msgstr "" "din kontaktliste?\n" "Hvis du svarer nei vil personen bli svartelyst midlertidig." -#: ../gtk/main.c:1160 +#: ../gtk/main.c:1165 #, c-format msgid "" "Please enter your password for username %s\n" " at realm %s:" msgstr "" -#: ../gtk/main.c:1281 +#: ../gtk/main.c:1286 msgid "Call error" msgstr "" -#: ../gtk/main.c:1284 ../coreapi/linphonecore.c:3767 +#: ../gtk/main.c:1289 ../coreapi/linphonecore.c:3787 msgid "Call ended" msgstr "Samtale avsluttet" -#: ../gtk/main.c:1287 ../coreapi/call_log.c:221 +#: ../gtk/main.c:1292 ../coreapi/call_log.c:221 msgid "Incoming call" msgstr "Innkommende samtale" -#: ../gtk/main.c:1289 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 +#: ../gtk/main.c:1294 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 msgid "Answer" msgstr "Svarer" -#: ../gtk/main.c:1291 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1296 ../gtk/main.ui.h:6 msgid "Decline" msgstr "Avvis" -#: ../gtk/main.c:1297 +#: ../gtk/main.c:1302 msgid "Call paused" msgstr "" -#: ../gtk/main.c:1297 +#: ../gtk/main.c:1302 #, c-format msgid "by %s" msgstr "" -#: ../gtk/main.c:1367 +#: ../gtk/main.c:1372 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1529 +#: ../gtk/main.c:1534 msgid "Website link" msgstr "Peker til nettsted" -#: ../gtk/main.c:1578 +#: ../gtk/main.c:1583 msgid "Linphone - a video internet phone" msgstr "Linphone - en video Internet telefon" -#: ../gtk/main.c:1670 +#: ../gtk/main.c:1675 #, c-format msgid "%s (Default)" msgstr "%s (Standard)" -#: ../gtk/main.c:2002 ../coreapi/callbacks.c:986 +#: ../gtk/main.c:2007 ../coreapi/callbacks.c:1027 #, c-format msgid "We are transferred to %s" msgstr "Vi er overført til %s" -#: ../gtk/main.c:2012 +#: ../gtk/main.c:2017 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." @@ -217,7 +218,7 @@ msgstr "" "Klarte ikke å finne noe lydkort på denne datamaskinen.\n" "Du vil ikke kunne sende eller motta lydsamtaler." -#: ../gtk/main.c:2156 +#: ../gtk/main.c:2161 msgid "A free SIP video-phone" msgstr "En gratis SIP video-telefon" @@ -371,15 +372,19 @@ 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:1234 +#: ../gtk/propertybox.c:1236 msgid "None" msgstr "" -#: ../gtk/propertybox.c:1238 +#: ../gtk/propertybox.c:1240 msgid "SRTP" msgstr "" -#: ../gtk/propertybox.c:1244 +#: ../gtk/propertybox.c:1246 +msgid "DTLS" +msgstr "" + +#: ../gtk/propertybox.c:1253 msgid "ZRTP" msgstr "" @@ -550,7 +555,7 @@ msgstr "" msgid "Error" msgstr "" -#: ../gtk/setupwizard.c:658 ../gtk/audio_assistant.c:527 +#: ../gtk/setupwizard.c:658 ../gtk/audio_assistant.c:534 msgid "Terminating" msgstr "" @@ -641,7 +646,7 @@ msgstr "" msgid "Calling..." msgstr "Ringer..." -#: ../gtk/incall_view.c:514 ../gtk/incall_view.c:727 +#: ../gtk/incall_view.c:514 ../gtk/incall_view.c:733 msgid "00::00::00" msgstr "00:00:00" @@ -678,62 +683,66 @@ msgid "Secured by SRTP" msgstr "" #: ../gtk/incall_view.c:685 +msgid "Secured by DTLS" +msgstr "" + +#: ../gtk/incall_view.c:691 #, c-format msgid "Secured by ZRTP - [auth token: %s]" msgstr "" -#: ../gtk/incall_view.c:691 +#: ../gtk/incall_view.c:697 msgid "Set unverified" msgstr "" -#: ../gtk/incall_view.c:691 ../gtk/main.ui.h:4 +#: ../gtk/incall_view.c:697 ../gtk/main.ui.h:4 msgid "Set verified" msgstr "" -#: ../gtk/incall_view.c:722 +#: ../gtk/incall_view.c:728 msgid "In conference" msgstr "" -#: ../gtk/incall_view.c:722 +#: ../gtk/incall_view.c:728 msgid "In call" msgstr "I samtale med" -#: ../gtk/incall_view.c:758 +#: ../gtk/incall_view.c:764 msgid "Paused call" msgstr "Pauset samtale" -#: ../gtk/incall_view.c:794 +#: ../gtk/incall_view.c:800 msgid "Call ended." msgstr "Samtale avsluttet." -#: ../gtk/incall_view.c:825 +#: ../gtk/incall_view.c:831 msgid "Transfer in progress" msgstr "" -#: ../gtk/incall_view.c:828 +#: ../gtk/incall_view.c:834 msgid "Transfer done." msgstr "" -#: ../gtk/incall_view.c:831 +#: ../gtk/incall_view.c:837 msgid "Transfer failed." msgstr "" -#: ../gtk/incall_view.c:875 +#: ../gtk/incall_view.c:881 msgid "Resume" msgstr "Fortsett" -#: ../gtk/incall_view.c:882 ../gtk/main.ui.h:9 +#: ../gtk/incall_view.c:888 ../gtk/main.ui.h:9 msgid "Pause" msgstr "Pause" -#: ../gtk/incall_view.c:948 +#: ../gtk/incall_view.c:954 #, c-format msgid "" "Recording into\n" "%s %s" msgstr "" -#: ../gtk/incall_view.c:948 +#: ../gtk/incall_view.c:954 msgid "(Paused)" msgstr "" @@ -830,23 +839,23 @@ msgstr "" msgid "Let's start Linphone now" msgstr "" -#: ../gtk/audio_assistant.c:496 +#: ../gtk/audio_assistant.c:503 msgid "Audio Assistant" msgstr "" -#: ../gtk/audio_assistant.c:506 ../gtk/main.ui.h:31 +#: ../gtk/audio_assistant.c:513 ../gtk/main.ui.h:31 msgid "Audio assistant" msgstr "" -#: ../gtk/audio_assistant.c:511 +#: ../gtk/audio_assistant.c:518 msgid "Mic Gain calibration" msgstr "" -#: ../gtk/audio_assistant.c:517 +#: ../gtk/audio_assistant.c:524 msgid "Speaker volume calibration" msgstr "" -#: ../gtk/audio_assistant.c:522 +#: ../gtk/audio_assistant.c:529 msgid "Record and Play" msgstr "" @@ -1696,68 +1705,68 @@ msgstr "" msgid "Please wait while fetching configuration from server..." msgstr "" -#: ../coreapi/linphonecore.c:1510 +#: ../coreapi/linphonecore.c:1508 msgid "Ready" msgstr "Klar" -#: ../coreapi/linphonecore.c:2489 +#: ../coreapi/linphonecore.c:2495 msgid "Configuring" msgstr "" -#: ../coreapi/linphonecore.c:2654 +#: ../coreapi/linphonecore.c:2669 msgid "Looking for telephone number destination..." msgstr "Ser etter telefonnummer for destinasjonen..." -#: ../coreapi/linphonecore.c:2656 +#: ../coreapi/linphonecore.c:2671 msgid "Could not resolve this number." msgstr "Kan ikke tilkoble dette nummeret." #. must be known at that time -#: ../coreapi/linphonecore.c:2942 +#: ../coreapi/linphonecore.c:2957 msgid "Contacting" msgstr "Tilknytter" -#: ../coreapi/linphonecore.c:2947 +#: ../coreapi/linphonecore.c:2962 msgid "Could not call" msgstr "Kunne ikke ringe" -#: ../coreapi/linphonecore.c:3097 +#: ../coreapi/linphonecore.c:3112 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "Beklager, du har nådd maksimalt antall samtidige samtaler" -#: ../coreapi/linphonecore.c:3256 +#: ../coreapi/linphonecore.c:3270 msgid "is contacting you" msgstr "Kontakter deg." -#: ../coreapi/linphonecore.c:3257 +#: ../coreapi/linphonecore.c:3271 msgid " and asked autoanswer." msgstr " og ba om autosvar." -#: ../coreapi/linphonecore.c:3375 +#: ../coreapi/linphonecore.c:3395 msgid "Modifying call parameters..." msgstr "Endrer ringeparametre..." -#: ../coreapi/linphonecore.c:3723 +#: ../coreapi/linphonecore.c:3743 msgid "Connected." msgstr "Tilkoblet" -#: ../coreapi/linphonecore.c:3748 +#: ../coreapi/linphonecore.c:3768 msgid "Call aborted" msgstr "Samtale avbrutt" -#: ../coreapi/linphonecore.c:3938 +#: ../coreapi/linphonecore.c:3958 msgid "Could not pause the call" msgstr "Kunne ikke pause samtalen" -#: ../coreapi/linphonecore.c:3941 +#: ../coreapi/linphonecore.c:3961 msgid "Pausing the current call..." msgstr "Pauser nåværende samtale" -#: ../coreapi/misc.c:438 +#: ../coreapi/misc.c:433 msgid "Stun lookup in progress..." msgstr "STUN oppslag pågår..." -#: ../coreapi/misc.c:619 +#: ../coreapi/misc.c:614 msgid "ICE local candidates gathering in progress..." msgstr "" @@ -1813,7 +1822,7 @@ msgstr "" msgid "Unknown status" msgstr "" -#: ../coreapi/proxy.c:327 +#: ../coreapi/proxy.c:328 msgid "" "The sip proxy address you entered is invalid, it must start with \"sip:\" " "followed by a hostname." @@ -1821,7 +1830,7 @@ msgstr "" "SIP proxy adressen du har angitt er ugyldig, den må begynne med \"sip:\" " "etterfult av vertsnavn." -#: ../coreapi/proxy.c:333 +#: ../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" @@ -1829,126 +1838,127 @@ msgstr "" "SIP adressen du har angitt er feil. Adressen bør se ut som sip: " "brukernavn@domenenavn, f.eks sip:ola@eksempel.no" -#: ../coreapi/proxy.c:1391 +#: ../coreapi/proxy.c:1403 #, c-format msgid "Could not login as %s" msgstr "Ikke ikke logge inn som %s" -#: ../coreapi/callbacks.c:383 +#: ../coreapi/callbacks.c:404 msgid "Remote ringing." msgstr "Ringer hos motparten." -#: ../coreapi/callbacks.c:404 +#: ../coreapi/callbacks.c:425 msgid "Remote ringing..." msgstr "" -#: ../coreapi/callbacks.c:414 +#: ../coreapi/callbacks.c:442 msgid "Early media." msgstr "Tidlig media" -#: ../coreapi/callbacks.c:475 +#: ../coreapi/callbacks.c:503 #, c-format msgid "Call with %s is paused." msgstr "Samtalen med %s er pauset." -#: ../coreapi/callbacks.c:488 +#: ../coreapi/callbacks.c:516 #, c-format msgid "Call answered by %s - on hold." msgstr "Samtale besvart av %s - på vent." -#: ../coreapi/callbacks.c:498 +#: ../coreapi/callbacks.c:526 msgid "Call resumed." msgstr "Samtale gjenopptatt." -#: ../coreapi/callbacks.c:502 +#: ../coreapi/callbacks.c:530 #, c-format msgid "Call answered by %s." msgstr "Samtale besvart av %s." -#: ../coreapi/callbacks.c:525 +#: ../coreapi/callbacks.c:553 msgid "Incompatible, check codecs or security settings..." msgstr "" -#: ../coreapi/callbacks.c:530 ../coreapi/callbacks.c:829 +#: ../coreapi/callbacks.c:558 ../coreapi/callbacks.c:870 msgid "Incompatible media parameters." msgstr "" -#: ../coreapi/callbacks.c:560 +#: ../coreapi/callbacks.c:588 msgid "We have been resumed." msgstr "" #. we are being paused -#: ../coreapi/callbacks.c:568 +#: ../coreapi/callbacks.c:596 msgid "We are paused by other party." msgstr "" #. reINVITE and in-dialogs UPDATE go here -#: ../coreapi/callbacks.c:602 +#: ../coreapi/callbacks.c:630 msgid "Call is updated by remote." msgstr "" -#: ../coreapi/callbacks.c:705 +#: ../coreapi/callbacks.c:746 msgid "Call terminated." msgstr "Samtale avsluttet." -#: ../coreapi/callbacks.c:733 +#: ../coreapi/callbacks.c:774 msgid "User is busy." msgstr "Brukeren er opptatt." -#: ../coreapi/callbacks.c:734 +#: ../coreapi/callbacks.c:775 msgid "User is temporarily unavailable." msgstr "Brukeren er midlertidig ikke tilgjengelig." #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:736 +#: ../coreapi/callbacks.c:777 msgid "User does not want to be disturbed." msgstr "Brukeren vil ikke bli forstyrret." -#: ../coreapi/callbacks.c:737 +#: ../coreapi/callbacks.c:778 msgid "Call declined." msgstr "Samtale avvist." -#: ../coreapi/callbacks.c:752 +#: ../coreapi/callbacks.c:793 msgid "Request timeout." msgstr "" -#: ../coreapi/callbacks.c:783 +#: ../coreapi/callbacks.c:824 msgid "Redirected" msgstr "Omdirigert" -#: ../coreapi/callbacks.c:838 +#: ../coreapi/callbacks.c:879 msgid "Call failed." msgstr "Samtale feilet." -#: ../coreapi/callbacks.c:916 +#: ../coreapi/callbacks.c:957 #, c-format msgid "Registration on %s successful." msgstr "Registrering hos %s lykkes." -#: ../coreapi/callbacks.c:917 +#: ../coreapi/callbacks.c:958 #, c-format msgid "Unregistration on %s done." msgstr "Avregistrering hos %s lykkes." -#: ../coreapi/callbacks.c:935 +#: ../coreapi/callbacks.c:976 msgid "no response timeout" msgstr "ingen svar innen angitt tid" -#: ../coreapi/callbacks.c:938 +#: ../coreapi/callbacks.c:979 #, c-format msgid "Registration on %s failed: %s" msgstr "Registrering hos %s mislykkes: %s" -#: ../coreapi/callbacks.c:945 +#: ../coreapi/callbacks.c:986 msgid "Service unavailable, retrying" msgstr "" -#: ../coreapi/linphonecall.c:175 +#. if encryption is DTLS, no status to be displayed +#: ../coreapi/linphonecall.c:180 #, c-format msgid "Authentication token is %s" msgstr "" -#: ../coreapi/linphonecall.c:3041 +#: ../coreapi/linphonecall.c:3492 #, 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 cfda5add0..9724098a7 100644 --- a/po/nl.po +++ b/po/nl.po @@ -7,9 +7,10 @@ msgid "" msgstr "" "Project-Id-Version: linphone-gtk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-13 16:18+0100\n" -"PO-Revision-Date: 2015-01-06 11:29+0000\n" -"Last-Translator: Gautier Pelloux-Prayer \n" +"POT-Creation-Date: 2015-02-17 12:28+0100\n" +"PO-Revision-Date: 2015-02-17 11:28+0000\n" +"Last-Translator: Belledonne Communications \n" "Language-Team: Dutch (http://www.transifex.com/projects/p/linphone-gtk/" "language/nl/)\n" "Language: nl\n" @@ -134,7 +135,7 @@ msgstr "" msgid "Run self test and exit 0 if succeed" msgstr "" -#: ../gtk/main.c:1083 +#: ../gtk/main.c:1088 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -143,72 +144,72 @@ msgid "" "If you answer no, this person will be temporarily blacklisted." msgstr "" -#: ../gtk/main.c:1160 +#: ../gtk/main.c:1165 #, c-format msgid "" "Please enter your password for username %s\n" " at realm %s:" msgstr "" -#: ../gtk/main.c:1281 +#: ../gtk/main.c:1286 msgid "Call error" msgstr "" -#: ../gtk/main.c:1284 ../coreapi/linphonecore.c:3767 +#: ../gtk/main.c:1289 ../coreapi/linphonecore.c:3787 msgid "Call ended" msgstr "Oproep beeindigd" -#: ../gtk/main.c:1287 ../coreapi/call_log.c:221 +#: ../gtk/main.c:1292 ../coreapi/call_log.c:221 msgid "Incoming call" msgstr "Inkomende oproep" -#: ../gtk/main.c:1289 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 +#: ../gtk/main.c:1294 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 msgid "Answer" msgstr "" -#: ../gtk/main.c:1291 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1296 ../gtk/main.ui.h:6 msgid "Decline" msgstr "" -#: ../gtk/main.c:1297 +#: ../gtk/main.c:1302 msgid "Call paused" msgstr "" -#: ../gtk/main.c:1297 +#: ../gtk/main.c:1302 #, c-format msgid "by %s" msgstr "" -#: ../gtk/main.c:1367 +#: ../gtk/main.c:1372 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1529 +#: ../gtk/main.c:1534 msgid "Website link" msgstr "" -#: ../gtk/main.c:1578 +#: ../gtk/main.c:1583 msgid "Linphone - a video internet phone" msgstr "" -#: ../gtk/main.c:1670 +#: ../gtk/main.c:1675 #, c-format msgid "%s (Default)" msgstr "" -#: ../gtk/main.c:2002 ../coreapi/callbacks.c:986 +#: ../gtk/main.c:2007 ../coreapi/callbacks.c:1027 #, c-format msgid "We are transferred to %s" msgstr "" -#: ../gtk/main.c:2012 +#: ../gtk/main.c:2017 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:2156 +#: ../gtk/main.c:2161 msgid "A free SIP video-phone" msgstr "Een Vrije SIP video-telefoon" @@ -362,15 +363,19 @@ msgid "" "You need to restart linphone for the new language selection to take effect." msgstr "" -#: ../gtk/propertybox.c:1234 +#: ../gtk/propertybox.c:1236 msgid "None" msgstr "Geen" -#: ../gtk/propertybox.c:1238 +#: ../gtk/propertybox.c:1240 msgid "SRTP" msgstr "" -#: ../gtk/propertybox.c:1244 +#: ../gtk/propertybox.c:1246 +msgid "DTLS" +msgstr "" + +#: ../gtk/propertybox.c:1253 msgid "ZRTP" msgstr "" @@ -539,7 +544,7 @@ msgstr "" msgid "Error" msgstr "" -#: ../gtk/setupwizard.c:658 ../gtk/audio_assistant.c:527 +#: ../gtk/setupwizard.c:658 ../gtk/audio_assistant.c:534 msgid "Terminating" msgstr "" @@ -630,7 +635,7 @@ msgstr "" msgid "Calling..." msgstr "" -#: ../gtk/incall_view.c:514 ../gtk/incall_view.c:727 +#: ../gtk/incall_view.c:514 ../gtk/incall_view.c:733 msgid "00::00::00" msgstr "" @@ -667,62 +672,66 @@ msgid "Secured by SRTP" msgstr "" #: ../gtk/incall_view.c:685 +msgid "Secured by DTLS" +msgstr "" + +#: ../gtk/incall_view.c:691 #, c-format msgid "Secured by ZRTP - [auth token: %s]" msgstr "" -#: ../gtk/incall_view.c:691 +#: ../gtk/incall_view.c:697 msgid "Set unverified" msgstr "" -#: ../gtk/incall_view.c:691 ../gtk/main.ui.h:4 +#: ../gtk/incall_view.c:697 ../gtk/main.ui.h:4 msgid "Set verified" msgstr "" -#: ../gtk/incall_view.c:722 +#: ../gtk/incall_view.c:728 msgid "In conference" msgstr "" -#: ../gtk/incall_view.c:722 +#: ../gtk/incall_view.c:728 msgid "In call" msgstr "" -#: ../gtk/incall_view.c:758 +#: ../gtk/incall_view.c:764 msgid "Paused call" msgstr "" -#: ../gtk/incall_view.c:794 +#: ../gtk/incall_view.c:800 msgid "Call ended." msgstr "" -#: ../gtk/incall_view.c:825 +#: ../gtk/incall_view.c:831 msgid "Transfer in progress" msgstr "" -#: ../gtk/incall_view.c:828 +#: ../gtk/incall_view.c:834 msgid "Transfer done." msgstr "" -#: ../gtk/incall_view.c:831 +#: ../gtk/incall_view.c:837 msgid "Transfer failed." msgstr "" -#: ../gtk/incall_view.c:875 +#: ../gtk/incall_view.c:881 msgid "Resume" msgstr "" -#: ../gtk/incall_view.c:882 ../gtk/main.ui.h:9 +#: ../gtk/incall_view.c:888 ../gtk/main.ui.h:9 msgid "Pause" msgstr "" -#: ../gtk/incall_view.c:948 +#: ../gtk/incall_view.c:954 #, c-format msgid "" "Recording into\n" "%s %s" msgstr "" -#: ../gtk/incall_view.c:948 +#: ../gtk/incall_view.c:954 msgid "(Paused)" msgstr "" @@ -819,23 +828,23 @@ msgstr "" msgid "Let's start Linphone now" msgstr "" -#: ../gtk/audio_assistant.c:496 +#: ../gtk/audio_assistant.c:503 msgid "Audio Assistant" msgstr "" -#: ../gtk/audio_assistant.c:506 ../gtk/main.ui.h:31 +#: ../gtk/audio_assistant.c:513 ../gtk/main.ui.h:31 msgid "Audio assistant" msgstr "" -#: ../gtk/audio_assistant.c:511 +#: ../gtk/audio_assistant.c:518 msgid "Mic Gain calibration" msgstr "" -#: ../gtk/audio_assistant.c:517 +#: ../gtk/audio_assistant.c:524 msgid "Speaker volume calibration" msgstr "" -#: ../gtk/audio_assistant.c:522 +#: ../gtk/audio_assistant.c:529 msgid "Record and Play" msgstr "" @@ -1683,68 +1692,68 @@ msgstr "" msgid "Please wait while fetching configuration from server..." msgstr "" -#: ../coreapi/linphonecore.c:1510 +#: ../coreapi/linphonecore.c:1508 msgid "Ready" msgstr "Gereed." -#: ../coreapi/linphonecore.c:2489 +#: ../coreapi/linphonecore.c:2495 msgid "Configuring" msgstr "" -#: ../coreapi/linphonecore.c:2654 +#: ../coreapi/linphonecore.c:2669 msgid "Looking for telephone number destination..." msgstr "Zoekt de lokatie van het telefoonnummer..." -#: ../coreapi/linphonecore.c:2656 +#: ../coreapi/linphonecore.c:2671 msgid "Could not resolve this number." msgstr "Kon dit nummer niet vinden." #. must be known at that time -#: ../coreapi/linphonecore.c:2942 +#: ../coreapi/linphonecore.c:2957 msgid "Contacting" msgstr "Verbinden" -#: ../coreapi/linphonecore.c:2947 +#: ../coreapi/linphonecore.c:2962 msgid "Could not call" msgstr "" -#: ../coreapi/linphonecore.c:3097 +#: ../coreapi/linphonecore.c:3112 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "" -#: ../coreapi/linphonecore.c:3256 +#: ../coreapi/linphonecore.c:3270 msgid "is contacting you" msgstr "" -#: ../coreapi/linphonecore.c:3257 +#: ../coreapi/linphonecore.c:3271 msgid " and asked autoanswer." msgstr "" -#: ../coreapi/linphonecore.c:3375 +#: ../coreapi/linphonecore.c:3395 msgid "Modifying call parameters..." msgstr "" -#: ../coreapi/linphonecore.c:3723 +#: ../coreapi/linphonecore.c:3743 msgid "Connected." msgstr "Verbonden." -#: ../coreapi/linphonecore.c:3748 +#: ../coreapi/linphonecore.c:3768 msgid "Call aborted" msgstr "" -#: ../coreapi/linphonecore.c:3938 +#: ../coreapi/linphonecore.c:3958 msgid "Could not pause the call" msgstr "" -#: ../coreapi/linphonecore.c:3941 +#: ../coreapi/linphonecore.c:3961 msgid "Pausing the current call..." msgstr "" -#: ../coreapi/misc.c:438 +#: ../coreapi/misc.c:433 msgid "Stun lookup in progress..." msgstr "STUN adres wordt opgezocht..." -#: ../coreapi/misc.c:619 +#: ../coreapi/misc.c:614 msgid "ICE local candidates gathering in progress..." msgstr "" @@ -1800,138 +1809,139 @@ msgstr "" msgid "Unknown status" msgstr "" -#: ../coreapi/proxy.c:327 +#: ../coreapi/proxy.c:328 msgid "" "The sip proxy address you entered is invalid, it must start with \"sip:\" " "followed by a hostname." msgstr "" -#: ../coreapi/proxy.c:333 +#: ../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 "" -#: ../coreapi/proxy.c:1391 +#: ../coreapi/proxy.c:1403 #, c-format msgid "Could not login as %s" msgstr "" -#: ../coreapi/callbacks.c:383 +#: ../coreapi/callbacks.c:404 msgid "Remote ringing." msgstr "" -#: ../coreapi/callbacks.c:404 +#: ../coreapi/callbacks.c:425 msgid "Remote ringing..." msgstr "" -#: ../coreapi/callbacks.c:414 +#: ../coreapi/callbacks.c:442 msgid "Early media." msgstr "" -#: ../coreapi/callbacks.c:475 +#: ../coreapi/callbacks.c:503 #, c-format msgid "Call with %s is paused." msgstr "" -#: ../coreapi/callbacks.c:488 +#: ../coreapi/callbacks.c:516 #, c-format msgid "Call answered by %s - on hold." msgstr "" -#: ../coreapi/callbacks.c:498 +#: ../coreapi/callbacks.c:526 msgid "Call resumed." msgstr "" -#: ../coreapi/callbacks.c:502 +#: ../coreapi/callbacks.c:530 #, c-format msgid "Call answered by %s." msgstr "" -#: ../coreapi/callbacks.c:525 +#: ../coreapi/callbacks.c:553 msgid "Incompatible, check codecs or security settings..." msgstr "" -#: ../coreapi/callbacks.c:530 ../coreapi/callbacks.c:829 +#: ../coreapi/callbacks.c:558 ../coreapi/callbacks.c:870 msgid "Incompatible media parameters." msgstr "" -#: ../coreapi/callbacks.c:560 +#: ../coreapi/callbacks.c:588 msgid "We have been resumed." msgstr "" #. we are being paused -#: ../coreapi/callbacks.c:568 +#: ../coreapi/callbacks.c:596 msgid "We are paused by other party." msgstr "" #. reINVITE and in-dialogs UPDATE go here -#: ../coreapi/callbacks.c:602 +#: ../coreapi/callbacks.c:630 msgid "Call is updated by remote." msgstr "" -#: ../coreapi/callbacks.c:705 +#: ../coreapi/callbacks.c:746 msgid "Call terminated." msgstr "Oproep beeindigd." -#: ../coreapi/callbacks.c:733 +#: ../coreapi/callbacks.c:774 msgid "User is busy." msgstr "Gebruiker is bezet." -#: ../coreapi/callbacks.c:734 +#: ../coreapi/callbacks.c:775 msgid "User is temporarily unavailable." msgstr "Gebruiker is tijdelijk niet beschikbaar." #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:736 +#: ../coreapi/callbacks.c:777 msgid "User does not want to be disturbed." msgstr "De gebruiker wenst niet gestoord te worden." -#: ../coreapi/callbacks.c:737 +#: ../coreapi/callbacks.c:778 msgid "Call declined." msgstr "Oproep geweigerd." -#: ../coreapi/callbacks.c:752 +#: ../coreapi/callbacks.c:793 msgid "Request timeout." msgstr "" -#: ../coreapi/callbacks.c:783 +#: ../coreapi/callbacks.c:824 msgid "Redirected" msgstr "" -#: ../coreapi/callbacks.c:838 +#: ../coreapi/callbacks.c:879 msgid "Call failed." msgstr "" -#: ../coreapi/callbacks.c:916 +#: ../coreapi/callbacks.c:957 #, c-format msgid "Registration on %s successful." msgstr "Registratie op %s gelukt." -#: ../coreapi/callbacks.c:917 +#: ../coreapi/callbacks.c:958 #, c-format msgid "Unregistration on %s done." msgstr "" -#: ../coreapi/callbacks.c:935 +#: ../coreapi/callbacks.c:976 msgid "no response timeout" msgstr "" -#: ../coreapi/callbacks.c:938 +#: ../coreapi/callbacks.c:979 #, c-format msgid "Registration on %s failed: %s" msgstr "" -#: ../coreapi/callbacks.c:945 +#: ../coreapi/callbacks.c:986 msgid "Service unavailable, retrying" msgstr "" -#: ../coreapi/linphonecall.c:175 +#. if encryption is DTLS, no status to be displayed +#: ../coreapi/linphonecall.c:180 #, c-format msgid "Authentication token is %s" msgstr "" -#: ../coreapi/linphonecall.c:3041 +#: ../coreapi/linphonecall.c:3492 #, 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 f83b391c4..595a29b8d 100644 --- a/po/pl.po +++ b/po/pl.po @@ -7,9 +7,10 @@ msgid "" msgstr "" "Project-Id-Version: linphone-gtk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-13 16:18+0100\n" -"PO-Revision-Date: 2015-01-06 11:29+0000\n" -"Last-Translator: Gautier Pelloux-Prayer \n" +"POT-Creation-Date: 2015-02-17 12:28+0100\n" +"PO-Revision-Date: 2015-02-17 11:28+0000\n" +"Last-Translator: Belledonne Communications \n" "Language-Team: Polish (http://www.transifex.com/projects/p/linphone-gtk/" "language/pl/)\n" "Language: pl\n" @@ -137,7 +138,7 @@ msgstr "" msgid "Run self test and exit 0 if succeed" msgstr "" -#: ../gtk/main.c:1083 +#: ../gtk/main.c:1088 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -146,72 +147,72 @@ msgid "" "If you answer no, this person will be temporarily blacklisted." msgstr "" -#: ../gtk/main.c:1160 +#: ../gtk/main.c:1165 #, c-format msgid "" "Please enter your password for username %s\n" " at realm %s:" msgstr "" -#: ../gtk/main.c:1281 +#: ../gtk/main.c:1286 msgid "Call error" msgstr "" -#: ../gtk/main.c:1284 ../coreapi/linphonecore.c:3767 +#: ../gtk/main.c:1289 ../coreapi/linphonecore.c:3787 msgid "Call ended" msgstr "" -#: ../gtk/main.c:1287 ../coreapi/call_log.c:221 +#: ../gtk/main.c:1292 ../coreapi/call_log.c:221 msgid "Incoming call" msgstr "" -#: ../gtk/main.c:1289 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 +#: ../gtk/main.c:1294 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 msgid "Answer" msgstr "" -#: ../gtk/main.c:1291 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1296 ../gtk/main.ui.h:6 msgid "Decline" msgstr "" -#: ../gtk/main.c:1297 +#: ../gtk/main.c:1302 msgid "Call paused" msgstr "" -#: ../gtk/main.c:1297 +#: ../gtk/main.c:1302 #, c-format msgid "by %s" msgstr "" -#: ../gtk/main.c:1367 +#: ../gtk/main.c:1372 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1529 +#: ../gtk/main.c:1534 msgid "Website link" msgstr "" -#: ../gtk/main.c:1578 +#: ../gtk/main.c:1583 msgid "Linphone - a video internet phone" msgstr "" -#: ../gtk/main.c:1670 +#: ../gtk/main.c:1675 #, c-format msgid "%s (Default)" msgstr "" -#: ../gtk/main.c:2002 ../coreapi/callbacks.c:986 +#: ../gtk/main.c:2007 ../coreapi/callbacks.c:1027 #, c-format msgid "We are transferred to %s" msgstr "" -#: ../gtk/main.c:2012 +#: ../gtk/main.c:2017 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:2156 +#: ../gtk/main.c:2161 msgid "A free SIP video-phone" msgstr "" @@ -365,15 +366,19 @@ msgid "" "You need to restart linphone for the new language selection to take effect." msgstr "" -#: ../gtk/propertybox.c:1234 +#: ../gtk/propertybox.c:1236 msgid "None" msgstr "" -#: ../gtk/propertybox.c:1238 +#: ../gtk/propertybox.c:1240 msgid "SRTP" msgstr "" -#: ../gtk/propertybox.c:1244 +#: ../gtk/propertybox.c:1246 +msgid "DTLS" +msgstr "" + +#: ../gtk/propertybox.c:1253 msgid "ZRTP" msgstr "" @@ -543,7 +548,7 @@ msgstr "" msgid "Error" msgstr "" -#: ../gtk/setupwizard.c:658 ../gtk/audio_assistant.c:527 +#: ../gtk/setupwizard.c:658 ../gtk/audio_assistant.c:534 msgid "Terminating" msgstr "" @@ -634,7 +639,7 @@ msgstr "" msgid "Calling..." msgstr "" -#: ../gtk/incall_view.c:514 ../gtk/incall_view.c:727 +#: ../gtk/incall_view.c:514 ../gtk/incall_view.c:733 msgid "00::00::00" msgstr "" @@ -671,62 +676,66 @@ msgid "Secured by SRTP" msgstr "" #: ../gtk/incall_view.c:685 +msgid "Secured by DTLS" +msgstr "" + +#: ../gtk/incall_view.c:691 #, c-format msgid "Secured by ZRTP - [auth token: %s]" msgstr "" -#: ../gtk/incall_view.c:691 +#: ../gtk/incall_view.c:697 msgid "Set unverified" msgstr "" -#: ../gtk/incall_view.c:691 ../gtk/main.ui.h:4 +#: ../gtk/incall_view.c:697 ../gtk/main.ui.h:4 msgid "Set verified" msgstr "" -#: ../gtk/incall_view.c:722 +#: ../gtk/incall_view.c:728 msgid "In conference" msgstr "" -#: ../gtk/incall_view.c:722 +#: ../gtk/incall_view.c:728 msgid "In call" msgstr "" -#: ../gtk/incall_view.c:758 +#: ../gtk/incall_view.c:764 msgid "Paused call" msgstr "" -#: ../gtk/incall_view.c:794 +#: ../gtk/incall_view.c:800 msgid "Call ended." msgstr "" -#: ../gtk/incall_view.c:825 +#: ../gtk/incall_view.c:831 msgid "Transfer in progress" msgstr "" -#: ../gtk/incall_view.c:828 +#: ../gtk/incall_view.c:834 msgid "Transfer done." msgstr "" -#: ../gtk/incall_view.c:831 +#: ../gtk/incall_view.c:837 msgid "Transfer failed." msgstr "" -#: ../gtk/incall_view.c:875 +#: ../gtk/incall_view.c:881 msgid "Resume" msgstr "" -#: ../gtk/incall_view.c:882 ../gtk/main.ui.h:9 +#: ../gtk/incall_view.c:888 ../gtk/main.ui.h:9 msgid "Pause" msgstr "" -#: ../gtk/incall_view.c:948 +#: ../gtk/incall_view.c:954 #, c-format msgid "" "Recording into\n" "%s %s" msgstr "" -#: ../gtk/incall_view.c:948 +#: ../gtk/incall_view.c:954 msgid "(Paused)" msgstr "" @@ -823,23 +832,23 @@ msgstr "" msgid "Let's start Linphone now" msgstr "" -#: ../gtk/audio_assistant.c:496 +#: ../gtk/audio_assistant.c:503 msgid "Audio Assistant" msgstr "" -#: ../gtk/audio_assistant.c:506 ../gtk/main.ui.h:31 +#: ../gtk/audio_assistant.c:513 ../gtk/main.ui.h:31 msgid "Audio assistant" msgstr "" -#: ../gtk/audio_assistant.c:511 +#: ../gtk/audio_assistant.c:518 msgid "Mic Gain calibration" msgstr "" -#: ../gtk/audio_assistant.c:517 +#: ../gtk/audio_assistant.c:524 msgid "Speaker volume calibration" msgstr "" -#: ../gtk/audio_assistant.c:522 +#: ../gtk/audio_assistant.c:529 msgid "Record and Play" msgstr "" @@ -1687,68 +1696,68 @@ msgstr "" msgid "Please wait while fetching configuration from server..." msgstr "" -#: ../coreapi/linphonecore.c:1510 +#: ../coreapi/linphonecore.c:1508 msgid "Ready" msgstr "" -#: ../coreapi/linphonecore.c:2489 +#: ../coreapi/linphonecore.c:2495 msgid "Configuring" msgstr "" -#: ../coreapi/linphonecore.c:2654 +#: ../coreapi/linphonecore.c:2669 msgid "Looking for telephone number destination..." msgstr "" -#: ../coreapi/linphonecore.c:2656 +#: ../coreapi/linphonecore.c:2671 msgid "Could not resolve this number." msgstr "" #. must be known at that time -#: ../coreapi/linphonecore.c:2942 +#: ../coreapi/linphonecore.c:2957 msgid "Contacting" msgstr "" -#: ../coreapi/linphonecore.c:2947 +#: ../coreapi/linphonecore.c:2962 msgid "Could not call" msgstr "" -#: ../coreapi/linphonecore.c:3097 +#: ../coreapi/linphonecore.c:3112 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "" -#: ../coreapi/linphonecore.c:3256 +#: ../coreapi/linphonecore.c:3270 msgid "is contacting you" msgstr "" -#: ../coreapi/linphonecore.c:3257 +#: ../coreapi/linphonecore.c:3271 msgid " and asked autoanswer." msgstr "" -#: ../coreapi/linphonecore.c:3375 +#: ../coreapi/linphonecore.c:3395 msgid "Modifying call parameters..." msgstr "" -#: ../coreapi/linphonecore.c:3723 +#: ../coreapi/linphonecore.c:3743 msgid "Connected." msgstr "Połączony" -#: ../coreapi/linphonecore.c:3748 +#: ../coreapi/linphonecore.c:3768 msgid "Call aborted" msgstr "" -#: ../coreapi/linphonecore.c:3938 +#: ../coreapi/linphonecore.c:3958 msgid "Could not pause the call" msgstr "" -#: ../coreapi/linphonecore.c:3941 +#: ../coreapi/linphonecore.c:3961 msgid "Pausing the current call..." msgstr "" -#: ../coreapi/misc.c:438 +#: ../coreapi/misc.c:433 msgid "Stun lookup in progress..." msgstr "" -#: ../coreapi/misc.c:619 +#: ../coreapi/misc.c:614 msgid "ICE local candidates gathering in progress..." msgstr "" @@ -1804,138 +1813,139 @@ msgstr "" msgid "Unknown status" msgstr "" -#: ../coreapi/proxy.c:327 +#: ../coreapi/proxy.c:328 msgid "" "The sip proxy address you entered is invalid, it must start with \"sip:\" " "followed by a hostname." msgstr "" -#: ../coreapi/proxy.c:333 +#: ../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 "" -#: ../coreapi/proxy.c:1391 +#: ../coreapi/proxy.c:1403 #, c-format msgid "Could not login as %s" msgstr "" -#: ../coreapi/callbacks.c:383 +#: ../coreapi/callbacks.c:404 msgid "Remote ringing." msgstr "" -#: ../coreapi/callbacks.c:404 +#: ../coreapi/callbacks.c:425 msgid "Remote ringing..." msgstr "" -#: ../coreapi/callbacks.c:414 +#: ../coreapi/callbacks.c:442 msgid "Early media." msgstr "" -#: ../coreapi/callbacks.c:475 +#: ../coreapi/callbacks.c:503 #, c-format msgid "Call with %s is paused." msgstr "" -#: ../coreapi/callbacks.c:488 +#: ../coreapi/callbacks.c:516 #, c-format msgid "Call answered by %s - on hold." msgstr "" -#: ../coreapi/callbacks.c:498 +#: ../coreapi/callbacks.c:526 msgid "Call resumed." msgstr "" -#: ../coreapi/callbacks.c:502 +#: ../coreapi/callbacks.c:530 #, c-format msgid "Call answered by %s." msgstr "" -#: ../coreapi/callbacks.c:525 +#: ../coreapi/callbacks.c:553 msgid "Incompatible, check codecs or security settings..." msgstr "" -#: ../coreapi/callbacks.c:530 ../coreapi/callbacks.c:829 +#: ../coreapi/callbacks.c:558 ../coreapi/callbacks.c:870 msgid "Incompatible media parameters." msgstr "" -#: ../coreapi/callbacks.c:560 +#: ../coreapi/callbacks.c:588 msgid "We have been resumed." msgstr "" #. we are being paused -#: ../coreapi/callbacks.c:568 +#: ../coreapi/callbacks.c:596 msgid "We are paused by other party." msgstr "" #. reINVITE and in-dialogs UPDATE go here -#: ../coreapi/callbacks.c:602 +#: ../coreapi/callbacks.c:630 msgid "Call is updated by remote." msgstr "" -#: ../coreapi/callbacks.c:705 +#: ../coreapi/callbacks.c:746 msgid "Call terminated." msgstr "" -#: ../coreapi/callbacks.c:733 +#: ../coreapi/callbacks.c:774 msgid "User is busy." msgstr "Osoba jest zajęta." -#: ../coreapi/callbacks.c:734 +#: ../coreapi/callbacks.c:775 msgid "User is temporarily unavailable." msgstr "Osoba jest tymczasowo niedostępna." #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:736 +#: ../coreapi/callbacks.c:777 msgid "User does not want to be disturbed." msgstr "Osoba nie chce, aby jej przeszkadzać." -#: ../coreapi/callbacks.c:737 +#: ../coreapi/callbacks.c:778 msgid "Call declined." msgstr "Rozmowa odrzucona." -#: ../coreapi/callbacks.c:752 +#: ../coreapi/callbacks.c:793 msgid "Request timeout." msgstr "" -#: ../coreapi/callbacks.c:783 +#: ../coreapi/callbacks.c:824 msgid "Redirected" msgstr "" -#: ../coreapi/callbacks.c:838 +#: ../coreapi/callbacks.c:879 msgid "Call failed." msgstr "" -#: ../coreapi/callbacks.c:916 +#: ../coreapi/callbacks.c:957 #, c-format msgid "Registration on %s successful." msgstr "" -#: ../coreapi/callbacks.c:917 +#: ../coreapi/callbacks.c:958 #, c-format msgid "Unregistration on %s done." msgstr "" -#: ../coreapi/callbacks.c:935 +#: ../coreapi/callbacks.c:976 msgid "no response timeout" msgstr "" -#: ../coreapi/callbacks.c:938 +#: ../coreapi/callbacks.c:979 #, c-format msgid "Registration on %s failed: %s" msgstr "" -#: ../coreapi/callbacks.c:945 +#: ../coreapi/callbacks.c:986 msgid "Service unavailable, retrying" msgstr "" -#: ../coreapi/linphonecall.c:175 +#. if encryption is DTLS, no status to be displayed +#: ../coreapi/linphonecall.c:180 #, c-format msgid "Authentication token is %s" msgstr "" -#: ../coreapi/linphonecall.c:3041 +#: ../coreapi/linphonecall.c:3492 #, 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 8f7a8c319..3c74b566d 100644 --- a/po/pt_BR.po +++ b/po/pt_BR.po @@ -7,9 +7,10 @@ msgid "" msgstr "" "Project-Id-Version: linphone-gtk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-13 16:18+0100\n" -"PO-Revision-Date: 2015-01-06 11:29+0000\n" -"Last-Translator: Gautier Pelloux-Prayer \n" +"POT-Creation-Date: 2015-02-17 12:28+0100\n" +"PO-Revision-Date: 2015-02-17 11:28+0000\n" +"Last-Translator: Belledonne Communications \n" "Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/" "linphone-gtk/language/pt_BR/)\n" "Language: pt_BR\n" @@ -134,7 +135,7 @@ msgstr "" msgid "Run self test and exit 0 if succeed" msgstr "" -#: ../gtk/main.c:1083 +#: ../gtk/main.c:1088 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -143,72 +144,72 @@ msgid "" "If you answer no, this person will be temporarily blacklisted." msgstr "" -#: ../gtk/main.c:1160 +#: ../gtk/main.c:1165 #, c-format msgid "" "Please enter your password for username %s\n" " at realm %s:" msgstr "" -#: ../gtk/main.c:1281 +#: ../gtk/main.c:1286 msgid "Call error" msgstr "" -#: ../gtk/main.c:1284 ../coreapi/linphonecore.c:3767 +#: ../gtk/main.c:1289 ../coreapi/linphonecore.c:3787 msgid "Call ended" msgstr "" -#: ../gtk/main.c:1287 ../coreapi/call_log.c:221 +#: ../gtk/main.c:1292 ../coreapi/call_log.c:221 msgid "Incoming call" msgstr "Camadas recebidas" -#: ../gtk/main.c:1289 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 +#: ../gtk/main.c:1294 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 msgid "Answer" msgstr "" -#: ../gtk/main.c:1291 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1296 ../gtk/main.ui.h:6 msgid "Decline" msgstr "" -#: ../gtk/main.c:1297 +#: ../gtk/main.c:1302 msgid "Call paused" msgstr "" -#: ../gtk/main.c:1297 +#: ../gtk/main.c:1302 #, c-format msgid "by %s" msgstr "" -#: ../gtk/main.c:1367 +#: ../gtk/main.c:1372 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1529 +#: ../gtk/main.c:1534 msgid "Website link" msgstr "" -#: ../gtk/main.c:1578 +#: ../gtk/main.c:1583 msgid "Linphone - a video internet phone" msgstr "" -#: ../gtk/main.c:1670 +#: ../gtk/main.c:1675 #, c-format msgid "%s (Default)" msgstr "" -#: ../gtk/main.c:2002 ../coreapi/callbacks.c:986 +#: ../gtk/main.c:2007 ../coreapi/callbacks.c:1027 #, c-format msgid "We are transferred to %s" msgstr "" -#: ../gtk/main.c:2012 +#: ../gtk/main.c:2017 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:2156 +#: ../gtk/main.c:2161 msgid "A free SIP video-phone" msgstr "" @@ -362,15 +363,19 @@ msgid "" "You need to restart linphone for the new language selection to take effect." msgstr "" -#: ../gtk/propertybox.c:1234 +#: ../gtk/propertybox.c:1236 msgid "None" msgstr "Nenhum" -#: ../gtk/propertybox.c:1238 +#: ../gtk/propertybox.c:1240 msgid "SRTP" msgstr "" -#: ../gtk/propertybox.c:1244 +#: ../gtk/propertybox.c:1246 +msgid "DTLS" +msgstr "" + +#: ../gtk/propertybox.c:1253 msgid "ZRTP" msgstr "" @@ -539,7 +544,7 @@ msgstr "" msgid "Error" msgstr "" -#: ../gtk/setupwizard.c:658 ../gtk/audio_assistant.c:527 +#: ../gtk/setupwizard.c:658 ../gtk/audio_assistant.c:534 msgid "Terminating" msgstr "" @@ -630,7 +635,7 @@ msgstr "" msgid "Calling..." msgstr "" -#: ../gtk/incall_view.c:514 ../gtk/incall_view.c:727 +#: ../gtk/incall_view.c:514 ../gtk/incall_view.c:733 msgid "00::00::00" msgstr "" @@ -667,62 +672,66 @@ msgid "Secured by SRTP" msgstr "" #: ../gtk/incall_view.c:685 +msgid "Secured by DTLS" +msgstr "" + +#: ../gtk/incall_view.c:691 #, c-format msgid "Secured by ZRTP - [auth token: %s]" msgstr "" -#: ../gtk/incall_view.c:691 +#: ../gtk/incall_view.c:697 msgid "Set unverified" msgstr "" -#: ../gtk/incall_view.c:691 ../gtk/main.ui.h:4 +#: ../gtk/incall_view.c:697 ../gtk/main.ui.h:4 msgid "Set verified" msgstr "" -#: ../gtk/incall_view.c:722 +#: ../gtk/incall_view.c:728 msgid "In conference" msgstr "" -#: ../gtk/incall_view.c:722 +#: ../gtk/incall_view.c:728 msgid "In call" msgstr "" -#: ../gtk/incall_view.c:758 +#: ../gtk/incall_view.c:764 msgid "Paused call" msgstr "" -#: ../gtk/incall_view.c:794 +#: ../gtk/incall_view.c:800 msgid "Call ended." msgstr "" -#: ../gtk/incall_view.c:825 +#: ../gtk/incall_view.c:831 msgid "Transfer in progress" msgstr "" -#: ../gtk/incall_view.c:828 +#: ../gtk/incall_view.c:834 msgid "Transfer done." msgstr "" -#: ../gtk/incall_view.c:831 +#: ../gtk/incall_view.c:837 msgid "Transfer failed." msgstr "" -#: ../gtk/incall_view.c:875 +#: ../gtk/incall_view.c:881 msgid "Resume" msgstr "" -#: ../gtk/incall_view.c:882 ../gtk/main.ui.h:9 +#: ../gtk/incall_view.c:888 ../gtk/main.ui.h:9 msgid "Pause" msgstr "" -#: ../gtk/incall_view.c:948 +#: ../gtk/incall_view.c:954 #, c-format msgid "" "Recording into\n" "%s %s" msgstr "" -#: ../gtk/incall_view.c:948 +#: ../gtk/incall_view.c:954 msgid "(Paused)" msgstr "" @@ -819,23 +828,23 @@ msgstr "" msgid "Let's start Linphone now" msgstr "" -#: ../gtk/audio_assistant.c:496 +#: ../gtk/audio_assistant.c:503 msgid "Audio Assistant" msgstr "" -#: ../gtk/audio_assistant.c:506 ../gtk/main.ui.h:31 +#: ../gtk/audio_assistant.c:513 ../gtk/main.ui.h:31 msgid "Audio assistant" msgstr "" -#: ../gtk/audio_assistant.c:511 +#: ../gtk/audio_assistant.c:518 msgid "Mic Gain calibration" msgstr "" -#: ../gtk/audio_assistant.c:517 +#: ../gtk/audio_assistant.c:524 msgid "Speaker volume calibration" msgstr "" -#: ../gtk/audio_assistant.c:522 +#: ../gtk/audio_assistant.c:529 msgid "Record and Play" msgstr "" @@ -1683,68 +1692,68 @@ msgstr "" msgid "Please wait while fetching configuration from server..." msgstr "" -#: ../coreapi/linphonecore.c:1510 +#: ../coreapi/linphonecore.c:1508 msgid "Ready" msgstr "" -#: ../coreapi/linphonecore.c:2489 +#: ../coreapi/linphonecore.c:2495 msgid "Configuring" msgstr "" -#: ../coreapi/linphonecore.c:2654 +#: ../coreapi/linphonecore.c:2669 msgid "Looking for telephone number destination..." msgstr "Procurando por telefone de destino..." -#: ../coreapi/linphonecore.c:2656 +#: ../coreapi/linphonecore.c:2671 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:2942 +#: ../coreapi/linphonecore.c:2957 msgid "Contacting" msgstr "" -#: ../coreapi/linphonecore.c:2947 +#: ../coreapi/linphonecore.c:2962 msgid "Could not call" msgstr "" -#: ../coreapi/linphonecore.c:3097 +#: ../coreapi/linphonecore.c:3112 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "" -#: ../coreapi/linphonecore.c:3256 +#: ../coreapi/linphonecore.c:3270 msgid "is contacting you" msgstr "" -#: ../coreapi/linphonecore.c:3257 +#: ../coreapi/linphonecore.c:3271 msgid " and asked autoanswer." msgstr "" -#: ../coreapi/linphonecore.c:3375 +#: ../coreapi/linphonecore.c:3395 msgid "Modifying call parameters..." msgstr "" -#: ../coreapi/linphonecore.c:3723 +#: ../coreapi/linphonecore.c:3743 msgid "Connected." msgstr "Conectado." -#: ../coreapi/linphonecore.c:3748 +#: ../coreapi/linphonecore.c:3768 msgid "Call aborted" msgstr "" -#: ../coreapi/linphonecore.c:3938 +#: ../coreapi/linphonecore.c:3958 msgid "Could not pause the call" msgstr "" -#: ../coreapi/linphonecore.c:3941 +#: ../coreapi/linphonecore.c:3961 msgid "Pausing the current call..." msgstr "" -#: ../coreapi/misc.c:438 +#: ../coreapi/misc.c:433 msgid "Stun lookup in progress..." msgstr "" -#: ../coreapi/misc.c:619 +#: ../coreapi/misc.c:614 msgid "ICE local candidates gathering in progress..." msgstr "" @@ -1800,138 +1809,139 @@ msgstr "" msgid "Unknown status" msgstr "" -#: ../coreapi/proxy.c:327 +#: ../coreapi/proxy.c:328 msgid "" "The sip proxy address you entered is invalid, it must start with \"sip:\" " "followed by a hostname." msgstr "" -#: ../coreapi/proxy.c:333 +#: ../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 "" -#: ../coreapi/proxy.c:1391 +#: ../coreapi/proxy.c:1403 #, c-format msgid "Could not login as %s" msgstr "" -#: ../coreapi/callbacks.c:383 +#: ../coreapi/callbacks.c:404 msgid "Remote ringing." msgstr "" -#: ../coreapi/callbacks.c:404 +#: ../coreapi/callbacks.c:425 msgid "Remote ringing..." msgstr "" -#: ../coreapi/callbacks.c:414 +#: ../coreapi/callbacks.c:442 msgid "Early media." msgstr "" -#: ../coreapi/callbacks.c:475 +#: ../coreapi/callbacks.c:503 #, c-format msgid "Call with %s is paused." msgstr "" -#: ../coreapi/callbacks.c:488 +#: ../coreapi/callbacks.c:516 #, c-format msgid "Call answered by %s - on hold." msgstr "" -#: ../coreapi/callbacks.c:498 +#: ../coreapi/callbacks.c:526 msgid "Call resumed." msgstr "" -#: ../coreapi/callbacks.c:502 +#: ../coreapi/callbacks.c:530 #, c-format msgid "Call answered by %s." msgstr "" -#: ../coreapi/callbacks.c:525 +#: ../coreapi/callbacks.c:553 msgid "Incompatible, check codecs or security settings..." msgstr "" -#: ../coreapi/callbacks.c:530 ../coreapi/callbacks.c:829 +#: ../coreapi/callbacks.c:558 ../coreapi/callbacks.c:870 msgid "Incompatible media parameters." msgstr "" -#: ../coreapi/callbacks.c:560 +#: ../coreapi/callbacks.c:588 msgid "We have been resumed." msgstr "" #. we are being paused -#: ../coreapi/callbacks.c:568 +#: ../coreapi/callbacks.c:596 msgid "We are paused by other party." msgstr "" #. reINVITE and in-dialogs UPDATE go here -#: ../coreapi/callbacks.c:602 +#: ../coreapi/callbacks.c:630 msgid "Call is updated by remote." msgstr "" -#: ../coreapi/callbacks.c:705 +#: ../coreapi/callbacks.c:746 msgid "Call terminated." msgstr "" -#: ../coreapi/callbacks.c:733 +#: ../coreapi/callbacks.c:774 msgid "User is busy." msgstr "Usuário está ocupado." -#: ../coreapi/callbacks.c:734 +#: ../coreapi/callbacks.c:775 msgid "User is temporarily unavailable." msgstr "Usuário está temporáriamente indisponível." #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:736 +#: ../coreapi/callbacks.c:777 msgid "User does not want to be disturbed." msgstr "" -#: ../coreapi/callbacks.c:737 +#: ../coreapi/callbacks.c:778 msgid "Call declined." msgstr "" -#: ../coreapi/callbacks.c:752 +#: ../coreapi/callbacks.c:793 msgid "Request timeout." msgstr "" -#: ../coreapi/callbacks.c:783 +#: ../coreapi/callbacks.c:824 msgid "Redirected" msgstr "" -#: ../coreapi/callbacks.c:838 +#: ../coreapi/callbacks.c:879 msgid "Call failed." msgstr "" -#: ../coreapi/callbacks.c:916 +#: ../coreapi/callbacks.c:957 #, c-format msgid "Registration on %s successful." msgstr "" -#: ../coreapi/callbacks.c:917 +#: ../coreapi/callbacks.c:958 #, c-format msgid "Unregistration on %s done." msgstr "" -#: ../coreapi/callbacks.c:935 +#: ../coreapi/callbacks.c:976 msgid "no response timeout" msgstr "" -#: ../coreapi/callbacks.c:938 +#: ../coreapi/callbacks.c:979 #, c-format msgid "Registration on %s failed: %s" msgstr "" -#: ../coreapi/callbacks.c:945 +#: ../coreapi/callbacks.c:986 msgid "Service unavailable, retrying" msgstr "" -#: ../coreapi/linphonecall.c:175 +#. if encryption is DTLS, no status to be displayed +#: ../coreapi/linphonecall.c:180 #, c-format msgid "Authentication token is %s" msgstr "" -#: ../coreapi/linphonecall.c:3041 +#: ../coreapi/linphonecall.c:3492 #, 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 b3e312070..aeb106fc5 100644 --- a/po/ru.po +++ b/po/ru.po @@ -12,9 +12,10 @@ msgid "" msgstr "" "Project-Id-Version: linphone-gtk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-13 16:18+0100\n" -"PO-Revision-Date: 2015-01-14 09:11+0000\n" -"Last-Translator: AlexL \n" +"POT-Creation-Date: 2015-02-17 12:28+0100\n" +"PO-Revision-Date: 2015-02-17 11:28+0000\n" +"Last-Translator: Belledonne Communications \n" "Language-Team: Russian (http://www.transifex.com/projects/p/linphone-gtk/" "language/ru/)\n" "Language: ru\n" @@ -148,7 +149,7 @@ msgstr "Запустить помощника аудио" msgid "Run self test and exit 0 if succeed" msgstr "Запустить самотест и выйти при успехе со статусом 0" -#: ../gtk/main.c:1083 +#: ../gtk/main.c:1088 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -161,7 +162,7 @@ msgstr "" "контактный лист?\n" "Если вы ответите Нет, эта персона будет временно в чёрном списке." -#: ../gtk/main.c:1160 +#: ../gtk/main.c:1165 #, c-format msgid "" "Please enter your password for username %s\n" @@ -170,59 +171,59 @@ msgstr "" "Пожалуйста, введите пароль для пользователя %s\n" " для реалм (рилм) %s:" -#: ../gtk/main.c:1281 +#: ../gtk/main.c:1286 msgid "Call error" msgstr "Ошибка звонка" -#: ../gtk/main.c:1284 ../coreapi/linphonecore.c:3767 +#: ../gtk/main.c:1289 ../coreapi/linphonecore.c:3787 msgid "Call ended" msgstr "Звонок окончен" -#: ../gtk/main.c:1287 ../coreapi/call_log.c:221 +#: ../gtk/main.c:1292 ../coreapi/call_log.c:221 msgid "Incoming call" msgstr "Входящий звонок" -#: ../gtk/main.c:1289 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 +#: ../gtk/main.c:1294 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 msgid "Answer" msgstr "Ответ" -#: ../gtk/main.c:1291 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1296 ../gtk/main.ui.h:6 msgid "Decline" msgstr "Отклонить" -#: ../gtk/main.c:1297 +#: ../gtk/main.c:1302 msgid "Call paused" msgstr "Звонок приостановлен" -#: ../gtk/main.c:1297 +#: ../gtk/main.c:1302 #, c-format msgid "by %s" msgstr "%s" -#: ../gtk/main.c:1367 +#: ../gtk/main.c:1372 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "%s предложил запустить видео. Вы принимаете?" -#: ../gtk/main.c:1529 +#: ../gtk/main.c:1534 msgid "Website link" msgstr "Домашняя страница" -#: ../gtk/main.c:1578 +#: ../gtk/main.c:1583 msgid "Linphone - a video internet phone" msgstr "Linphone - интернет видео телефон" -#: ../gtk/main.c:1670 +#: ../gtk/main.c:1675 #, c-format msgid "%s (Default)" msgstr "%s (по умолчанию)" -#: ../gtk/main.c:2002 ../coreapi/callbacks.c:986 +#: ../gtk/main.c:2007 ../coreapi/callbacks.c:1027 #, c-format msgid "We are transferred to %s" msgstr "Мы передали в %s" -#: ../gtk/main.c:2012 +#: ../gtk/main.c:2017 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." @@ -230,7 +231,7 @@ msgstr "" "Звуковые карты не были обнаружены на этом компьютере.\n" "Вы не сможете отправлять или получать аудио звонки." -#: ../gtk/main.c:2156 +#: ../gtk/main.c:2161 msgid "A free SIP video-phone" msgstr "Свободный SIP видео-телефон" @@ -386,15 +387,19 @@ msgstr "" "Вы должны перезагрузить linphone для того, чтобы языковые настройки вступили " "в силу." -#: ../gtk/propertybox.c:1234 +#: ../gtk/propertybox.c:1236 msgid "None" msgstr "Нет" -#: ../gtk/propertybox.c:1238 +#: ../gtk/propertybox.c:1240 msgid "SRTP" msgstr "SRTP" -#: ../gtk/propertybox.c:1244 +#: ../gtk/propertybox.c:1246 +msgid "DTLS" +msgstr "" + +#: ../gtk/propertybox.c:1253 msgid "ZRTP" msgstr "ZRTP" @@ -576,7 +581,7 @@ msgstr "Подтверждение (шаг 2/2)" msgid "Error" msgstr "Ошибка" -#: ../gtk/setupwizard.c:658 ../gtk/audio_assistant.c:527 +#: ../gtk/setupwizard.c:658 ../gtk/audio_assistant.c:534 msgid "Terminating" msgstr "Прерывание" @@ -669,7 +674,7 @@ msgstr "Повесить трубку" msgid "Calling..." msgstr "Звоним..." -#: ../gtk/incall_view.c:514 ../gtk/incall_view.c:727 +#: ../gtk/incall_view.c:514 ../gtk/incall_view.c:733 msgid "00::00::00" msgstr "00::00::00" @@ -706,55 +711,59 @@ msgid "Secured by SRTP" msgstr "Защищённые с помощью SRTP" #: ../gtk/incall_view.c:685 +msgid "Secured by DTLS" +msgstr "" + +#: ../gtk/incall_view.c:691 #, c-format msgid "Secured by ZRTP - [auth token: %s]" msgstr "Защищённые с помощью ZRTP - [знак аутентификации: %s]" -#: ../gtk/incall_view.c:691 +#: ../gtk/incall_view.c:697 msgid "Set unverified" msgstr "Установить непроверенный" -#: ../gtk/incall_view.c:691 ../gtk/main.ui.h:4 +#: ../gtk/incall_view.c:697 ../gtk/main.ui.h:4 msgid "Set verified" msgstr "Установить проверенный" -#: ../gtk/incall_view.c:722 +#: ../gtk/incall_view.c:728 msgid "In conference" msgstr "В конференции" -#: ../gtk/incall_view.c:722 +#: ../gtk/incall_view.c:728 msgid "In call" msgstr "Звоним" -#: ../gtk/incall_view.c:758 +#: ../gtk/incall_view.c:764 msgid "Paused call" msgstr "Звонок приостановлен" -#: ../gtk/incall_view.c:794 +#: ../gtk/incall_view.c:800 msgid "Call ended." msgstr "Звонок закончен." -#: ../gtk/incall_view.c:825 +#: ../gtk/incall_view.c:831 msgid "Transfer in progress" msgstr "Передача в прогрессе" -#: ../gtk/incall_view.c:828 +#: ../gtk/incall_view.c:834 msgid "Transfer done." msgstr "Передача завершена." -#: ../gtk/incall_view.c:831 +#: ../gtk/incall_view.c:837 msgid "Transfer failed." msgstr "Передача неудачна." -#: ../gtk/incall_view.c:875 +#: ../gtk/incall_view.c:881 msgid "Resume" msgstr "Продолжить" -#: ../gtk/incall_view.c:882 ../gtk/main.ui.h:9 +#: ../gtk/incall_view.c:888 ../gtk/main.ui.h:9 msgid "Pause" msgstr "Пауза" -#: ../gtk/incall_view.c:948 +#: ../gtk/incall_view.c:954 #, c-format msgid "" "Recording into\n" @@ -763,7 +772,7 @@ msgstr "" "Записывается в\n" "%s %s" -#: ../gtk/incall_view.c:948 +#: ../gtk/incall_view.c:954 msgid "(Paused)" msgstr "(Пауза)" @@ -862,23 +871,23 @@ msgstr "Воспроизведение" msgid "Let's start Linphone now" msgstr "Давайте сейчас запустим linphone" -#: ../gtk/audio_assistant.c:496 +#: ../gtk/audio_assistant.c:503 msgid "Audio Assistant" msgstr "Помощник аудио" -#: ../gtk/audio_assistant.c:506 ../gtk/main.ui.h:31 +#: ../gtk/audio_assistant.c:513 ../gtk/main.ui.h:31 msgid "Audio assistant" msgstr "Помощник аудио" -#: ../gtk/audio_assistant.c:511 +#: ../gtk/audio_assistant.c:518 msgid "Mic Gain calibration" msgstr "Калибровка усиления микрофона" -#: ../gtk/audio_assistant.c:517 +#: ../gtk/audio_assistant.c:524 msgid "Speaker volume calibration" msgstr "Калибровка громкости динамика" -#: ../gtk/audio_assistant.c:522 +#: ../gtk/audio_assistant.c:529 msgid "Record and Play" msgstr "Записать и проиграть" @@ -1747,69 +1756,69 @@ msgstr "Конфигурирование..." msgid "Please wait while fetching configuration from server..." msgstr "Пожалуйста, подождите пока получается конфигурация с сервера..." -#: ../coreapi/linphonecore.c:1510 +#: ../coreapi/linphonecore.c:1508 msgid "Ready" msgstr "Готов" -#: ../coreapi/linphonecore.c:2489 +#: ../coreapi/linphonecore.c:2495 msgid "Configuring" msgstr "Конфигурирование" -#: ../coreapi/linphonecore.c:2654 +#: ../coreapi/linphonecore.c:2669 msgid "Looking for telephone number destination..." msgstr "Поиск назначения для телефонного номера.." -#: ../coreapi/linphonecore.c:2656 +#: ../coreapi/linphonecore.c:2671 msgid "Could not resolve this number." msgstr "Не получилось принять решение по этому номеру." #. must be known at that time -#: ../coreapi/linphonecore.c:2942 +#: ../coreapi/linphonecore.c:2957 msgid "Contacting" msgstr "Соединение" -#: ../coreapi/linphonecore.c:2947 +#: ../coreapi/linphonecore.c:2962 msgid "Could not call" msgstr "Невозможно позвонить" -#: ../coreapi/linphonecore.c:3097 +#: ../coreapi/linphonecore.c:3112 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "" "К сожалению, мы достигли максимального количества одновременных звонков" -#: ../coreapi/linphonecore.c:3256 +#: ../coreapi/linphonecore.c:3270 msgid "is contacting you" msgstr "контактирует с вами" -#: ../coreapi/linphonecore.c:3257 +#: ../coreapi/linphonecore.c:3271 msgid " and asked autoanswer." msgstr "и спросил автоматический ответ." -#: ../coreapi/linphonecore.c:3375 +#: ../coreapi/linphonecore.c:3395 msgid "Modifying call parameters..." msgstr "Изменение параметров звонка..." -#: ../coreapi/linphonecore.c:3723 +#: ../coreapi/linphonecore.c:3743 msgid "Connected." msgstr "Соединён." -#: ../coreapi/linphonecore.c:3748 +#: ../coreapi/linphonecore.c:3768 msgid "Call aborted" msgstr "Звонок отменён" -#: ../coreapi/linphonecore.c:3938 +#: ../coreapi/linphonecore.c:3958 msgid "Could not pause the call" msgstr "Невозможно приостановить звонок" -#: ../coreapi/linphonecore.c:3941 +#: ../coreapi/linphonecore.c:3961 msgid "Pausing the current call..." msgstr "Приостановка текущего звонка..." -#: ../coreapi/misc.c:438 +#: ../coreapi/misc.c:433 msgid "Stun lookup in progress..." msgstr "Идет поиск STUN..." -#: ../coreapi/misc.c:619 +#: ../coreapi/misc.c:614 msgid "ICE local candidates gathering in progress..." msgstr "Сбор локальных кандидатов ICE в прогрессе..." @@ -1865,7 +1874,7 @@ msgstr "Отдых" msgid "Unknown status" msgstr "Неизвестный статус" -#: ../coreapi/proxy.c:327 +#: ../coreapi/proxy.c:328 msgid "" "The sip proxy address you entered is invalid, it must start with \"sip:\" " "followed by a hostname." @@ -1873,7 +1882,7 @@ msgstr "" "Введённый SIP-адрес прокси является недействительным, он должен начинаться с " "\"sip:имя_хоста\"" -#: ../coreapi/proxy.c:333 +#: ../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" @@ -1882,126 +1891,127 @@ msgstr "" "Должно выглядеть как sip:имя_пользователя@домен_прокси, как например, sip:" "alice@example.net" -#: ../coreapi/proxy.c:1391 +#: ../coreapi/proxy.c:1403 #, c-format msgid "Could not login as %s" msgstr "Невозможно зайти как: %s" -#: ../coreapi/callbacks.c:383 +#: ../coreapi/callbacks.c:404 msgid "Remote ringing." msgstr "Дистанционный звонок." -#: ../coreapi/callbacks.c:404 +#: ../coreapi/callbacks.c:425 msgid "Remote ringing..." msgstr "Дистанционный звонок..." -#: ../coreapi/callbacks.c:414 +#: ../coreapi/callbacks.c:442 msgid "Early media." msgstr "Предответное проключение." -#: ../coreapi/callbacks.c:475 +#: ../coreapi/callbacks.c:503 #, c-format msgid "Call with %s is paused." msgstr "Звонок с %s приостановлен." -#: ../coreapi/callbacks.c:488 +#: ../coreapi/callbacks.c:516 #, c-format msgid "Call answered by %s - on hold." msgstr "На звонок ответил %s - на удержании." -#: ../coreapi/callbacks.c:498 +#: ../coreapi/callbacks.c:526 msgid "Call resumed." msgstr "Звонок возобновлён." -#: ../coreapi/callbacks.c:502 +#: ../coreapi/callbacks.c:530 #, c-format msgid "Call answered by %s." msgstr "На звонок ответил %s." -#: ../coreapi/callbacks.c:525 +#: ../coreapi/callbacks.c:553 msgid "Incompatible, check codecs or security settings..." msgstr "Несовместимость, проверьте кодеки или параметры безопасности..." -#: ../coreapi/callbacks.c:530 ../coreapi/callbacks.c:829 +#: ../coreapi/callbacks.c:558 ../coreapi/callbacks.c:870 msgid "Incompatible media parameters." msgstr "Несовместимость медиа-параметров." -#: ../coreapi/callbacks.c:560 +#: ../coreapi/callbacks.c:588 msgid "We have been resumed." msgstr "Мы возобновили." #. we are being paused -#: ../coreapi/callbacks.c:568 +#: ../coreapi/callbacks.c:596 msgid "We are paused by other party." msgstr "Мы приостановлены другой стороной." #. reINVITE and in-dialogs UPDATE go here -#: ../coreapi/callbacks.c:602 +#: ../coreapi/callbacks.c:630 msgid "Call is updated by remote." msgstr "Звонок был дистанционно обновлён." -#: ../coreapi/callbacks.c:705 +#: ../coreapi/callbacks.c:746 msgid "Call terminated." msgstr "Звонок прерван." -#: ../coreapi/callbacks.c:733 +#: ../coreapi/callbacks.c:774 msgid "User is busy." msgstr "Пользователь занят." -#: ../coreapi/callbacks.c:734 +#: ../coreapi/callbacks.c:775 msgid "User is temporarily unavailable." msgstr "Пользователь временно недоступен." #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:736 +#: ../coreapi/callbacks.c:777 msgid "User does not want to be disturbed." msgstr "Пользователь не хочет чтобы его беспокоили." -#: ../coreapi/callbacks.c:737 +#: ../coreapi/callbacks.c:778 msgid "Call declined." msgstr "Звонок отклонён." -#: ../coreapi/callbacks.c:752 +#: ../coreapi/callbacks.c:793 msgid "Request timeout." msgstr "Таймаут запроса." -#: ../coreapi/callbacks.c:783 +#: ../coreapi/callbacks.c:824 msgid "Redirected" msgstr "Переадресован" -#: ../coreapi/callbacks.c:838 +#: ../coreapi/callbacks.c:879 msgid "Call failed." msgstr "Звонок не удался." -#: ../coreapi/callbacks.c:916 +#: ../coreapi/callbacks.c:957 #, c-format msgid "Registration on %s successful." msgstr "Регистрация на %s прошла успешно." -#: ../coreapi/callbacks.c:917 +#: ../coreapi/callbacks.c:958 #, c-format msgid "Unregistration on %s done." msgstr "Отмена регистрации на %s завершена." -#: ../coreapi/callbacks.c:935 +#: ../coreapi/callbacks.c:976 msgid "no response timeout" msgstr "время ожидания истекло" -#: ../coreapi/callbacks.c:938 +#: ../coreapi/callbacks.c:979 #, c-format msgid "Registration on %s failed: %s" msgstr "Регистрация на %s не удалась: %s" -#: ../coreapi/callbacks.c:945 +#: ../coreapi/callbacks.c:986 msgid "Service unavailable, retrying" msgstr "Сервис недоступен, повтор" -#: ../coreapi/linphonecall.c:175 +#. if encryption is DTLS, no status to be displayed +#: ../coreapi/linphonecall.c:180 #, c-format msgid "Authentication token is %s" msgstr "Маркер проверки подлинности: %s" -#: ../coreapi/linphonecall.c:3041 +#: ../coreapi/linphonecall.c:3492 #, 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 56f9e5f19..c27c803ee 100644 --- a/po/sr.po +++ b/po/sr.po @@ -8,9 +8,10 @@ msgid "" msgstr "" "Project-Id-Version: linphone-gtk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-13 16:18+0100\n" -"PO-Revision-Date: 2015-01-13 16:34+0000\n" -"Last-Translator: Мирослав Николић \n" +"POT-Creation-Date: 2015-02-17 12:28+0100\n" +"PO-Revision-Date: 2015-02-17 11:28+0000\n" +"Last-Translator: Belledonne Communications \n" "Language-Team: Serbian (http://www.transifex.com/projects/p/linphone-gtk/" "language/sr/)\n" "Language: sr\n" @@ -142,7 +143,7 @@ msgstr "Покреће помоћника звука" msgid "Run self test and exit 0 if succeed" msgstr "Покреће самоиспробавање и излази 0 ако је успешно" -#: ../gtk/main.c:1083 +#: ../gtk/main.c:1088 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -156,7 +157,7 @@ msgstr "" "Ако одговорите са не, ова особа ће привремено бити стављена на списак " "забрана." -#: ../gtk/main.c:1160 +#: ../gtk/main.c:1165 #, c-format msgid "" "Please enter your password for username %s\n" @@ -165,59 +166,59 @@ msgstr "" "Унесите вашу лозинку за корисничко име %s\n" " на подручју %s:" -#: ../gtk/main.c:1281 +#: ../gtk/main.c:1286 msgid "Call error" msgstr "Грешка позива" -#: ../gtk/main.c:1284 ../coreapi/linphonecore.c:3767 +#: ../gtk/main.c:1289 ../coreapi/linphonecore.c:3787 msgid "Call ended" msgstr "Позив је завршен" -#: ../gtk/main.c:1287 ../coreapi/call_log.c:221 +#: ../gtk/main.c:1292 ../coreapi/call_log.c:221 msgid "Incoming call" msgstr "Долазни позив" -#: ../gtk/main.c:1289 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 +#: ../gtk/main.c:1294 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 msgid "Answer" msgstr "Јави се" -#: ../gtk/main.c:1291 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1296 ../gtk/main.ui.h:6 msgid "Decline" msgstr "Одбиј" -#: ../gtk/main.c:1297 +#: ../gtk/main.c:1302 msgid "Call paused" msgstr "Позив је заустављен" -#: ../gtk/main.c:1297 +#: ../gtk/main.c:1302 #, c-format msgid "by %s" msgstr "од %s" -#: ../gtk/main.c:1367 +#: ../gtk/main.c:1372 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "%s предлаже да започнете видео. Да ли прихватате ?" -#: ../gtk/main.c:1529 +#: ../gtk/main.c:1534 msgid "Website link" msgstr "Веза веб сајта" -#: ../gtk/main.c:1578 +#: ../gtk/main.c:1583 msgid "Linphone - a video internet phone" msgstr "Линфон — интернет телефон са снимком" -#: ../gtk/main.c:1670 +#: ../gtk/main.c:1675 #, c-format msgid "%s (Default)" msgstr "%s (основно)" -#: ../gtk/main.c:2002 ../coreapi/callbacks.c:986 +#: ../gtk/main.c:2007 ../coreapi/callbacks.c:1027 #, c-format msgid "We are transferred to %s" msgstr "Преселили смо се на %s" -#: ../gtk/main.c:2012 +#: ../gtk/main.c:2017 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." @@ -225,7 +226,7 @@ msgstr "" "Ниједна звучна картица није откривена на овом рачунару.\n" "Нећете бити у могућности да шаљете или да примате звучне позиве." -#: ../gtk/main.c:2156 +#: ../gtk/main.c:2161 msgid "A free SIP video-phone" msgstr "Слободан СИП телефон са снимком" @@ -380,15 +381,19 @@ msgid "" msgstr "" "Треба поново да покренете линфон да би нови изабрани језик ступио у дејство." -#: ../gtk/propertybox.c:1234 +#: ../gtk/propertybox.c:1236 msgid "None" msgstr "Ништа" -#: ../gtk/propertybox.c:1238 +#: ../gtk/propertybox.c:1240 msgid "SRTP" msgstr "СРТП" -#: ../gtk/propertybox.c:1244 +#: ../gtk/propertybox.c:1246 +msgid "DTLS" +msgstr "" + +#: ../gtk/propertybox.c:1253 msgid "ZRTP" msgstr "ЗРТП" @@ -568,7 +573,7 @@ msgstr "Потврђивање (корак 2/2)" msgid "Error" msgstr "Грешка" -#: ../gtk/setupwizard.c:658 ../gtk/audio_assistant.c:527 +#: ../gtk/setupwizard.c:658 ../gtk/audio_assistant.c:534 msgid "Terminating" msgstr "Завршавам" @@ -661,7 +666,7 @@ msgstr "Прекини" msgid "Calling..." msgstr "Позивам..." -#: ../gtk/incall_view.c:514 ../gtk/incall_view.c:727 +#: ../gtk/incall_view.c:514 ../gtk/incall_view.c:733 msgid "00::00::00" msgstr "00::00::00" @@ -698,55 +703,59 @@ msgid "Secured by SRTP" msgstr "Осигурано СРТП-ом" #: ../gtk/incall_view.c:685 +msgid "Secured by DTLS" +msgstr "" + +#: ../gtk/incall_view.c:691 #, c-format msgid "Secured by ZRTP - [auth token: %s]" msgstr "Осигурано ЗРТП-ом [потврђивање идентитета: %s]" -#: ../gtk/incall_view.c:691 +#: ../gtk/incall_view.c:697 msgid "Set unverified" msgstr "Непроверено подешавање" -#: ../gtk/incall_view.c:691 ../gtk/main.ui.h:4 +#: ../gtk/incall_view.c:697 ../gtk/main.ui.h:4 msgid "Set verified" msgstr "Проверено подешавање" -#: ../gtk/incall_view.c:722 +#: ../gtk/incall_view.c:728 msgid "In conference" msgstr "На конференцији" -#: ../gtk/incall_view.c:722 +#: ../gtk/incall_view.c:728 msgid "In call" msgstr "У позиву" -#: ../gtk/incall_view.c:758 +#: ../gtk/incall_view.c:764 msgid "Paused call" msgstr "Заустављен позив" -#: ../gtk/incall_view.c:794 +#: ../gtk/incall_view.c:800 msgid "Call ended." msgstr "Позив је завршен." -#: ../gtk/incall_view.c:825 +#: ../gtk/incall_view.c:831 msgid "Transfer in progress" msgstr "Пренос је у току" -#: ../gtk/incall_view.c:828 +#: ../gtk/incall_view.c:834 msgid "Transfer done." msgstr "Пренос је обављен." -#: ../gtk/incall_view.c:831 +#: ../gtk/incall_view.c:837 msgid "Transfer failed." msgstr "Пренос није успео." -#: ../gtk/incall_view.c:875 +#: ../gtk/incall_view.c:881 msgid "Resume" msgstr "Настави" -#: ../gtk/incall_view.c:882 ../gtk/main.ui.h:9 +#: ../gtk/incall_view.c:888 ../gtk/main.ui.h:9 msgid "Pause" msgstr "Застани" -#: ../gtk/incall_view.c:948 +#: ../gtk/incall_view.c:954 #, c-format msgid "" "Recording into\n" @@ -755,7 +764,7 @@ msgstr "" "Снимам у\n" "%s %s" -#: ../gtk/incall_view.c:948 +#: ../gtk/incall_view.c:954 msgid "(Paused)" msgstr "(Паузирано)" @@ -854,23 +863,23 @@ msgstr "Пусти" msgid "Let's start Linphone now" msgstr "Хајде сада да покренемо Линфон" -#: ../gtk/audio_assistant.c:496 +#: ../gtk/audio_assistant.c:503 msgid "Audio Assistant" msgstr "Помоћник звука" -#: ../gtk/audio_assistant.c:506 ../gtk/main.ui.h:31 +#: ../gtk/audio_assistant.c:513 ../gtk/main.ui.h:31 msgid "Audio assistant" msgstr "Помоћник звука" -#: ../gtk/audio_assistant.c:511 +#: ../gtk/audio_assistant.c:518 msgid "Mic Gain calibration" msgstr "Дотеривање појачања микрофона" -#: ../gtk/audio_assistant.c:517 +#: ../gtk/audio_assistant.c:524 msgid "Speaker volume calibration" msgstr "Дотеривање јачине звука звучника" -#: ../gtk/audio_assistant.c:522 +#: ../gtk/audio_assistant.c:529 msgid "Record and Play" msgstr "Снимите и пустите" @@ -1739,68 +1748,68 @@ msgstr "Подешавам..." msgid "Please wait while fetching configuration from server..." msgstr "Сачекајте док довучем подешавања са сервера..." -#: ../coreapi/linphonecore.c:1510 +#: ../coreapi/linphonecore.c:1508 msgid "Ready" msgstr "Спреман" -#: ../coreapi/linphonecore.c:2489 +#: ../coreapi/linphonecore.c:2495 msgid "Configuring" msgstr "Подешавам" -#: ../coreapi/linphonecore.c:2654 +#: ../coreapi/linphonecore.c:2669 msgid "Looking for telephone number destination..." msgstr "Тражим одредиште телефонског броја..." -#: ../coreapi/linphonecore.c:2656 +#: ../coreapi/linphonecore.c:2671 msgid "Could not resolve this number." msgstr "Не могу да решим овај број." #. must be known at that time -#: ../coreapi/linphonecore.c:2942 +#: ../coreapi/linphonecore.c:2957 msgid "Contacting" msgstr "Ступам у везу" -#: ../coreapi/linphonecore.c:2947 +#: ../coreapi/linphonecore.c:2962 msgid "Could not call" msgstr "Не могу да позовем" -#: ../coreapi/linphonecore.c:3097 +#: ../coreapi/linphonecore.c:3112 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "Извините, достигли смо највећи број истовремених позива" -#: ../coreapi/linphonecore.c:3256 +#: ../coreapi/linphonecore.c:3270 msgid "is contacting you" msgstr "вам се обраћа" -#: ../coreapi/linphonecore.c:3257 +#: ../coreapi/linphonecore.c:3271 msgid " and asked autoanswer." msgstr " и затражени само-одговор." -#: ../coreapi/linphonecore.c:3375 +#: ../coreapi/linphonecore.c:3395 msgid "Modifying call parameters..." msgstr "Мењам параметре позива..." -#: ../coreapi/linphonecore.c:3723 +#: ../coreapi/linphonecore.c:3743 msgid "Connected." msgstr "Повезан сам." -#: ../coreapi/linphonecore.c:3748 +#: ../coreapi/linphonecore.c:3768 msgid "Call aborted" msgstr "Позив је прекинут" -#: ../coreapi/linphonecore.c:3938 +#: ../coreapi/linphonecore.c:3958 msgid "Could not pause the call" msgstr "Не могу да зауставим позив" -#: ../coreapi/linphonecore.c:3941 +#: ../coreapi/linphonecore.c:3961 msgid "Pausing the current call..." msgstr "Заустављам тренутни позив..." -#: ../coreapi/misc.c:438 +#: ../coreapi/misc.c:433 msgid "Stun lookup in progress..." msgstr "У току је тражење стуна..." -#: ../coreapi/misc.c:619 +#: ../coreapi/misc.c:614 msgid "ICE local candidates gathering in progress..." msgstr "Прикупљање месних ИЦЕ кандидата је у току..." @@ -1856,7 +1865,7 @@ msgstr "На одмору" msgid "Unknown status" msgstr "Непознато стање" -#: ../coreapi/proxy.c:327 +#: ../coreapi/proxy.c:328 msgid "" "The sip proxy address you entered is invalid, it must start with \"sip:\" " "followed by a hostname." @@ -1864,7 +1873,7 @@ msgstr "" "Адреса сип посредника коју сте унели је неисправна, мора почети на „sip:“ за " "којим следи назив домаћина." -#: ../coreapi/proxy.c:333 +#: ../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" @@ -1873,126 +1882,127 @@ msgstr "" "Треба да изгледа као „sip:корисник@домен-посредника, као што је „sip:" "alice@example.net“" -#: ../coreapi/proxy.c:1391 +#: ../coreapi/proxy.c:1403 #, c-format msgid "Could not login as %s" msgstr "Не могу да се пријавим као %s" -#: ../coreapi/callbacks.c:383 +#: ../coreapi/callbacks.c:404 msgid "Remote ringing." msgstr "Удаљено звоњење." -#: ../coreapi/callbacks.c:404 +#: ../coreapi/callbacks.c:425 msgid "Remote ringing..." msgstr "Удаљено звоњење..." -#: ../coreapi/callbacks.c:414 +#: ../coreapi/callbacks.c:442 msgid "Early media." msgstr "Ранији медиј." -#: ../coreapi/callbacks.c:475 +#: ../coreapi/callbacks.c:503 #, c-format msgid "Call with %s is paused." msgstr "Позив са „%s“ је заустављен." -#: ../coreapi/callbacks.c:488 +#: ../coreapi/callbacks.c:516 #, c-format msgid "Call answered by %s - on hold." msgstr "Позив на који је одговорио „%s“ — на чекању." -#: ../coreapi/callbacks.c:498 +#: ../coreapi/callbacks.c:526 msgid "Call resumed." msgstr "Позив је настављен." -#: ../coreapi/callbacks.c:502 +#: ../coreapi/callbacks.c:530 #, c-format msgid "Call answered by %s." msgstr "На позив је одговорио „%s“." -#: ../coreapi/callbacks.c:525 +#: ../coreapi/callbacks.c:553 msgid "Incompatible, check codecs or security settings..." msgstr "Несагласно, проверите кодеке или безбедносна подешавања..." -#: ../coreapi/callbacks.c:530 ../coreapi/callbacks.c:829 +#: ../coreapi/callbacks.c:558 ../coreapi/callbacks.c:870 msgid "Incompatible media parameters." msgstr "Медијски параметри су несагласни." -#: ../coreapi/callbacks.c:560 +#: ../coreapi/callbacks.c:588 msgid "We have been resumed." msgstr "Наставили смо." #. we are being paused -#: ../coreapi/callbacks.c:568 +#: ../coreapi/callbacks.c:596 msgid "We are paused by other party." msgstr "Друга страна нас је паузирала." #. reINVITE and in-dialogs UPDATE go here -#: ../coreapi/callbacks.c:602 +#: ../coreapi/callbacks.c:630 msgid "Call is updated by remote." msgstr "Позив је освежен удаљеним." -#: ../coreapi/callbacks.c:705 +#: ../coreapi/callbacks.c:746 msgid "Call terminated." msgstr "Позив је завршен." -#: ../coreapi/callbacks.c:733 +#: ../coreapi/callbacks.c:774 msgid "User is busy." msgstr "Корисник је заузет." -#: ../coreapi/callbacks.c:734 +#: ../coreapi/callbacks.c:775 msgid "User is temporarily unavailable." msgstr "Корисник је привремено недоступан." #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:736 +#: ../coreapi/callbacks.c:777 msgid "User does not want to be disturbed." msgstr "Корисник не жели да буде узнемираван." -#: ../coreapi/callbacks.c:737 +#: ../coreapi/callbacks.c:778 msgid "Call declined." msgstr "Позив је одбијен." -#: ../coreapi/callbacks.c:752 +#: ../coreapi/callbacks.c:793 msgid "Request timeout." msgstr "Истекло је време захтева." -#: ../coreapi/callbacks.c:783 +#: ../coreapi/callbacks.c:824 msgid "Redirected" msgstr "Преусмерен" -#: ../coreapi/callbacks.c:838 +#: ../coreapi/callbacks.c:879 msgid "Call failed." msgstr "Позив није успео." -#: ../coreapi/callbacks.c:916 +#: ../coreapi/callbacks.c:957 #, c-format msgid "Registration on %s successful." msgstr "Уписивање на „%s“ је успело." -#: ../coreapi/callbacks.c:917 +#: ../coreapi/callbacks.c:958 #, c-format msgid "Unregistration on %s done." msgstr "Исписивање са „%s“ је обављено." -#: ../coreapi/callbacks.c:935 +#: ../coreapi/callbacks.c:976 msgid "no response timeout" msgstr "нема ограничења одговора" -#: ../coreapi/callbacks.c:938 +#: ../coreapi/callbacks.c:979 #, c-format msgid "Registration on %s failed: %s" msgstr "Уписивање на „%s“ није успело: %s" -#: ../coreapi/callbacks.c:945 +#: ../coreapi/callbacks.c:986 msgid "Service unavailable, retrying" msgstr "Услуга није доступна, поново покушавам" -#: ../coreapi/linphonecall.c:175 +#. if encryption is DTLS, no status to be displayed +#: ../coreapi/linphonecall.c:180 #, c-format msgid "Authentication token is %s" msgstr "Симбол потврђивања идентитета је „%s“" -#: ../coreapi/linphonecall.c:3041 +#: ../coreapi/linphonecall.c:3492 #, 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 b43407cf6..ddee3cf70 100644 --- a/po/sv.po +++ b/po/sv.po @@ -7,9 +7,10 @@ msgid "" msgstr "" "Project-Id-Version: linphone-gtk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-13 16:18+0100\n" -"PO-Revision-Date: 2015-01-06 11:29+0000\n" -"Last-Translator: Gautier Pelloux-Prayer \n" +"POT-Creation-Date: 2015-02-17 12:28+0100\n" +"PO-Revision-Date: 2015-02-17 11:28+0000\n" +"Last-Translator: Belledonne Communications \n" "Language-Team: Swedish (http://www.transifex.com/projects/p/linphone-gtk/" "language/sv/)\n" "Language: sv\n" @@ -136,7 +137,7 @@ msgstr "" msgid "Run self test and exit 0 if succeed" msgstr "" -#: ../gtk/main.c:1083 +#: ../gtk/main.c:1088 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -149,72 +150,72 @@ msgstr "" "henne till din kontaktlista?\n" "Om du svarar nej, personen kommer att vara bannlyst." -#: ../gtk/main.c:1160 +#: ../gtk/main.c:1165 #, c-format msgid "" "Please enter your password for username %s\n" " at realm %s:" msgstr "" -#: ../gtk/main.c:1281 +#: ../gtk/main.c:1286 msgid "Call error" msgstr "" -#: ../gtk/main.c:1284 ../coreapi/linphonecore.c:3767 +#: ../gtk/main.c:1289 ../coreapi/linphonecore.c:3787 msgid "Call ended" msgstr "Samtalet slut" -#: ../gtk/main.c:1287 ../coreapi/call_log.c:221 +#: ../gtk/main.c:1292 ../coreapi/call_log.c:221 msgid "Incoming call" msgstr "Inkommande samtal" -#: ../gtk/main.c:1289 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 +#: ../gtk/main.c:1294 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 msgid "Answer" msgstr "" -#: ../gtk/main.c:1291 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1296 ../gtk/main.ui.h:6 msgid "Decline" msgstr "Avböj" -#: ../gtk/main.c:1297 +#: ../gtk/main.c:1302 msgid "Call paused" msgstr "" -#: ../gtk/main.c:1297 +#: ../gtk/main.c:1302 #, c-format msgid "by %s" msgstr "" -#: ../gtk/main.c:1367 +#: ../gtk/main.c:1372 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1529 +#: ../gtk/main.c:1534 msgid "Website link" msgstr "Webbsajt" -#: ../gtk/main.c:1578 +#: ../gtk/main.c:1583 msgid "Linphone - a video internet phone" msgstr "Linphone - en video Internet telefon" -#: ../gtk/main.c:1670 +#: ../gtk/main.c:1675 #, c-format msgid "%s (Default)" msgstr "%s (Default)" -#: ../gtk/main.c:2002 ../coreapi/callbacks.c:986 +#: ../gtk/main.c:2007 ../coreapi/callbacks.c:1027 #, c-format msgid "We are transferred to %s" msgstr "" -#: ../gtk/main.c:2012 +#: ../gtk/main.c:2017 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:2156 +#: ../gtk/main.c:2161 msgid "A free SIP video-phone" msgstr "En gratis SIP video-telefon" @@ -368,15 +369,19 @@ 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:1234 +#: ../gtk/propertybox.c:1236 msgid "None" msgstr "" -#: ../gtk/propertybox.c:1238 +#: ../gtk/propertybox.c:1240 msgid "SRTP" msgstr "" -#: ../gtk/propertybox.c:1244 +#: ../gtk/propertybox.c:1246 +msgid "DTLS" +msgstr "" + +#: ../gtk/propertybox.c:1253 msgid "ZRTP" msgstr "" @@ -547,7 +552,7 @@ msgstr "" msgid "Error" msgstr "" -#: ../gtk/setupwizard.c:658 ../gtk/audio_assistant.c:527 +#: ../gtk/setupwizard.c:658 ../gtk/audio_assistant.c:534 msgid "Terminating" msgstr "" @@ -638,7 +643,7 @@ msgstr "" msgid "Calling..." msgstr "Ringer..." -#: ../gtk/incall_view.c:514 ../gtk/incall_view.c:727 +#: ../gtk/incall_view.c:514 ../gtk/incall_view.c:733 msgid "00::00::00" msgstr "00:00:00" @@ -675,62 +680,66 @@ msgid "Secured by SRTP" msgstr "" #: ../gtk/incall_view.c:685 +msgid "Secured by DTLS" +msgstr "" + +#: ../gtk/incall_view.c:691 #, c-format msgid "Secured by ZRTP - [auth token: %s]" msgstr "" -#: ../gtk/incall_view.c:691 +#: ../gtk/incall_view.c:697 msgid "Set unverified" msgstr "" -#: ../gtk/incall_view.c:691 ../gtk/main.ui.h:4 +#: ../gtk/incall_view.c:697 ../gtk/main.ui.h:4 msgid "Set verified" msgstr "" -#: ../gtk/incall_view.c:722 +#: ../gtk/incall_view.c:728 msgid "In conference" msgstr "" -#: ../gtk/incall_view.c:722 +#: ../gtk/incall_view.c:728 msgid "In call" msgstr "" -#: ../gtk/incall_view.c:758 +#: ../gtk/incall_view.c:764 msgid "Paused call" msgstr "" -#: ../gtk/incall_view.c:794 +#: ../gtk/incall_view.c:800 msgid "Call ended." msgstr "Samtalet slut." -#: ../gtk/incall_view.c:825 +#: ../gtk/incall_view.c:831 msgid "Transfer in progress" msgstr "" -#: ../gtk/incall_view.c:828 +#: ../gtk/incall_view.c:834 msgid "Transfer done." msgstr "" -#: ../gtk/incall_view.c:831 +#: ../gtk/incall_view.c:837 msgid "Transfer failed." msgstr "" -#: ../gtk/incall_view.c:875 +#: ../gtk/incall_view.c:881 msgid "Resume" msgstr "" -#: ../gtk/incall_view.c:882 ../gtk/main.ui.h:9 +#: ../gtk/incall_view.c:888 ../gtk/main.ui.h:9 msgid "Pause" msgstr "" -#: ../gtk/incall_view.c:948 +#: ../gtk/incall_view.c:954 #, c-format msgid "" "Recording into\n" "%s %s" msgstr "" -#: ../gtk/incall_view.c:948 +#: ../gtk/incall_view.c:954 msgid "(Paused)" msgstr "" @@ -827,23 +836,23 @@ msgstr "" msgid "Let's start Linphone now" msgstr "" -#: ../gtk/audio_assistant.c:496 +#: ../gtk/audio_assistant.c:503 msgid "Audio Assistant" msgstr "" -#: ../gtk/audio_assistant.c:506 ../gtk/main.ui.h:31 +#: ../gtk/audio_assistant.c:513 ../gtk/main.ui.h:31 msgid "Audio assistant" msgstr "" -#: ../gtk/audio_assistant.c:511 +#: ../gtk/audio_assistant.c:518 msgid "Mic Gain calibration" msgstr "" -#: ../gtk/audio_assistant.c:517 +#: ../gtk/audio_assistant.c:524 msgid "Speaker volume calibration" msgstr "" -#: ../gtk/audio_assistant.c:522 +#: ../gtk/audio_assistant.c:529 msgid "Record and Play" msgstr "" @@ -1692,68 +1701,68 @@ msgstr "" msgid "Please wait while fetching configuration from server..." msgstr "" -#: ../coreapi/linphonecore.c:1510 +#: ../coreapi/linphonecore.c:1508 msgid "Ready" msgstr "Redo" -#: ../coreapi/linphonecore.c:2489 +#: ../coreapi/linphonecore.c:2495 msgid "Configuring" msgstr "" -#: ../coreapi/linphonecore.c:2654 +#: ../coreapi/linphonecore.c:2669 msgid "Looking for telephone number destination..." msgstr "Leta efter telefonnummer för destinationen..." -#: ../coreapi/linphonecore.c:2656 +#: ../coreapi/linphonecore.c:2671 msgid "Could not resolve this number." msgstr "Kan inte nå dett nummer." #. must be known at that time -#: ../coreapi/linphonecore.c:2942 +#: ../coreapi/linphonecore.c:2957 msgid "Contacting" msgstr "Kontaktar" -#: ../coreapi/linphonecore.c:2947 +#: ../coreapi/linphonecore.c:2962 msgid "Could not call" msgstr "" -#: ../coreapi/linphonecore.c:3097 +#: ../coreapi/linphonecore.c:3112 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "" -#: ../coreapi/linphonecore.c:3256 +#: ../coreapi/linphonecore.c:3270 msgid "is contacting you" msgstr "" -#: ../coreapi/linphonecore.c:3257 +#: ../coreapi/linphonecore.c:3271 msgid " and asked autoanswer." msgstr "" -#: ../coreapi/linphonecore.c:3375 +#: ../coreapi/linphonecore.c:3395 msgid "Modifying call parameters..." msgstr "" -#: ../coreapi/linphonecore.c:3723 +#: ../coreapi/linphonecore.c:3743 msgid "Connected." msgstr "Kopplad" -#: ../coreapi/linphonecore.c:3748 +#: ../coreapi/linphonecore.c:3768 msgid "Call aborted" msgstr "" -#: ../coreapi/linphonecore.c:3938 +#: ../coreapi/linphonecore.c:3958 msgid "Could not pause the call" msgstr "" -#: ../coreapi/linphonecore.c:3941 +#: ../coreapi/linphonecore.c:3961 msgid "Pausing the current call..." msgstr "" -#: ../coreapi/misc.c:438 +#: ../coreapi/misc.c:433 msgid "Stun lookup in progress..." msgstr "STUN uppslagning pågår..." -#: ../coreapi/misc.c:619 +#: ../coreapi/misc.c:614 msgid "ICE local candidates gathering in progress..." msgstr "" @@ -1809,7 +1818,7 @@ msgstr "" msgid "Unknown status" msgstr "" -#: ../coreapi/proxy.c:327 +#: ../coreapi/proxy.c:328 msgid "" "The sip proxy address you entered is invalid, it must start with \"sip:\" " "followed by a hostname." @@ -1817,7 +1826,7 @@ msgstr "" "SIP proxy adressen som du matade in är inte rätt, adressen måste starta med " "\"sip:\", följd av ett hostnamn" -#: ../coreapi/proxy.c:333 +#: ../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" @@ -1825,126 +1834,127 @@ msgstr "" "SIP adressen som du matade in är inte rätt. Adressen borde se ut som sip:" "namn@domän, såsom sip:peter@exempel.se" -#: ../coreapi/proxy.c:1391 +#: ../coreapi/proxy.c:1403 #, c-format msgid "Could not login as %s" msgstr "Kunde inte logga in som %s" -#: ../coreapi/callbacks.c:383 +#: ../coreapi/callbacks.c:404 msgid "Remote ringing." msgstr "Ringer hos motparten." -#: ../coreapi/callbacks.c:404 +#: ../coreapi/callbacks.c:425 msgid "Remote ringing..." msgstr "" -#: ../coreapi/callbacks.c:414 +#: ../coreapi/callbacks.c:442 msgid "Early media." msgstr "Tidig media" -#: ../coreapi/callbacks.c:475 +#: ../coreapi/callbacks.c:503 #, c-format msgid "Call with %s is paused." msgstr "" -#: ../coreapi/callbacks.c:488 +#: ../coreapi/callbacks.c:516 #, c-format msgid "Call answered by %s - on hold." msgstr "" -#: ../coreapi/callbacks.c:498 +#: ../coreapi/callbacks.c:526 msgid "Call resumed." msgstr "" -#: ../coreapi/callbacks.c:502 +#: ../coreapi/callbacks.c:530 #, c-format msgid "Call answered by %s." msgstr "" -#: ../coreapi/callbacks.c:525 +#: ../coreapi/callbacks.c:553 msgid "Incompatible, check codecs or security settings..." msgstr "" -#: ../coreapi/callbacks.c:530 ../coreapi/callbacks.c:829 +#: ../coreapi/callbacks.c:558 ../coreapi/callbacks.c:870 msgid "Incompatible media parameters." msgstr "" -#: ../coreapi/callbacks.c:560 +#: ../coreapi/callbacks.c:588 msgid "We have been resumed." msgstr "" #. we are being paused -#: ../coreapi/callbacks.c:568 +#: ../coreapi/callbacks.c:596 msgid "We are paused by other party." msgstr "" #. reINVITE and in-dialogs UPDATE go here -#: ../coreapi/callbacks.c:602 +#: ../coreapi/callbacks.c:630 msgid "Call is updated by remote." msgstr "" -#: ../coreapi/callbacks.c:705 +#: ../coreapi/callbacks.c:746 msgid "Call terminated." msgstr "Samtalet slut." -#: ../coreapi/callbacks.c:733 +#: ../coreapi/callbacks.c:774 msgid "User is busy." msgstr "Användare upptagen." -#: ../coreapi/callbacks.c:734 +#: ../coreapi/callbacks.c:775 msgid "User is temporarily unavailable." msgstr "Användaren temporärt inte tillgänglig." #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:736 +#: ../coreapi/callbacks.c:777 msgid "User does not want to be disturbed." msgstr "Användaren vill inte bli störd." -#: ../coreapi/callbacks.c:737 +#: ../coreapi/callbacks.c:778 msgid "Call declined." msgstr "Samtalet avböjdes." -#: ../coreapi/callbacks.c:752 +#: ../coreapi/callbacks.c:793 msgid "Request timeout." msgstr "" -#: ../coreapi/callbacks.c:783 +#: ../coreapi/callbacks.c:824 msgid "Redirected" msgstr "" -#: ../coreapi/callbacks.c:838 +#: ../coreapi/callbacks.c:879 msgid "Call failed." msgstr "" -#: ../coreapi/callbacks.c:916 +#: ../coreapi/callbacks.c:957 #, c-format msgid "Registration on %s successful." msgstr "Registrering hos %s lyckades." -#: ../coreapi/callbacks.c:917 +#: ../coreapi/callbacks.c:958 #, c-format msgid "Unregistration on %s done." msgstr "Avregistrering hos %s lyckades." -#: ../coreapi/callbacks.c:935 +#: ../coreapi/callbacks.c:976 msgid "no response timeout" msgstr "Inget svar inom angiven tid" -#: ../coreapi/callbacks.c:938 +#: ../coreapi/callbacks.c:979 #, c-format msgid "Registration on %s failed: %s" msgstr "Registrering hos %s mislyckades: %s" -#: ../coreapi/callbacks.c:945 +#: ../coreapi/callbacks.c:986 msgid "Service unavailable, retrying" msgstr "" -#: ../coreapi/linphonecall.c:175 +#. if encryption is DTLS, no status to be displayed +#: ../coreapi/linphonecall.c:180 #, c-format msgid "Authentication token is %s" msgstr "" -#: ../coreapi/linphonecall.c:3041 +#: ../coreapi/linphonecall.c:3492 #, 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 44b01c13b..30e05bb15 100644 --- a/po/zh_CN.po +++ b/po/zh_CN.po @@ -7,9 +7,10 @@ msgid "" msgstr "" "Project-Id-Version: linphone-gtk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-13 16:18+0100\n" -"PO-Revision-Date: 2015-01-06 11:29+0000\n" -"Last-Translator: Gautier Pelloux-Prayer \n" +"POT-Creation-Date: 2015-02-17 12:28+0100\n" +"PO-Revision-Date: 2015-02-17 11:28+0000\n" +"Last-Translator: Belledonne Communications \n" "Language-Team: Chinese (China) (http://www.transifex.com/projects/p/linphone-" "gtk/language/zh_CN/)\n" "Language: zh_CN\n" @@ -132,7 +133,7 @@ msgstr "" msgid "Run self test and exit 0 if succeed" msgstr "" -#: ../gtk/main.c:1083 +#: ../gtk/main.c:1088 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -144,66 +145,66 @@ msgstr "" "您是否允许他看到您的在线状态或者将它加为您的联系人允许?\n" "如果您回答否,则会将该人临时性的放入黑名单" -#: ../gtk/main.c:1160 +#: ../gtk/main.c:1165 #, c-format msgid "" "Please enter your password for username %s\n" " at realm %s:" msgstr "" -#: ../gtk/main.c:1281 +#: ../gtk/main.c:1286 msgid "Call error" msgstr "" -#: ../gtk/main.c:1284 ../coreapi/linphonecore.c:3767 +#: ../gtk/main.c:1289 ../coreapi/linphonecore.c:3787 msgid "Call ended" msgstr "呼叫结束" -#: ../gtk/main.c:1287 ../coreapi/call_log.c:221 +#: ../gtk/main.c:1292 ../coreapi/call_log.c:221 msgid "Incoming call" msgstr "呼入" -#: ../gtk/main.c:1289 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 +#: ../gtk/main.c:1294 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 msgid "Answer" msgstr "" -#: ../gtk/main.c:1291 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1296 ../gtk/main.ui.h:6 msgid "Decline" msgstr "拒绝" -#: ../gtk/main.c:1297 +#: ../gtk/main.c:1302 msgid "Call paused" msgstr "" -#: ../gtk/main.c:1297 +#: ../gtk/main.c:1302 #, c-format msgid "by %s" msgstr "" -#: ../gtk/main.c:1367 +#: ../gtk/main.c:1372 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1529 +#: ../gtk/main.c:1534 msgid "Website link" msgstr "网站" -#: ../gtk/main.c:1578 +#: ../gtk/main.c:1583 msgid "Linphone - a video internet phone" msgstr "Linphone - 互联网视频电话" -#: ../gtk/main.c:1670 +#: ../gtk/main.c:1675 #, c-format msgid "%s (Default)" msgstr "%s (默认)" -#: ../gtk/main.c:2002 ../coreapi/callbacks.c:986 +#: ../gtk/main.c:2007 ../coreapi/callbacks.c:1027 #, c-format msgid "We are transferred to %s" msgstr "" -#: ../gtk/main.c:2012 +#: ../gtk/main.c:2017 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." @@ -211,7 +212,7 @@ msgstr "" "未在此计算机上检测到声卡。\n" "您无法发送或接收音频呼叫。" -#: ../gtk/main.c:2156 +#: ../gtk/main.c:2161 msgid "A free SIP video-phone" msgstr "免费的 SIP 视频电话" @@ -365,15 +366,19 @@ msgid "" "You need to restart linphone for the new language selection to take effect." msgstr "您需要重启 linphone 以使语言选择生效。" -#: ../gtk/propertybox.c:1234 +#: ../gtk/propertybox.c:1236 msgid "None" msgstr "" -#: ../gtk/propertybox.c:1238 +#: ../gtk/propertybox.c:1240 msgid "SRTP" msgstr "" -#: ../gtk/propertybox.c:1244 +#: ../gtk/propertybox.c:1246 +msgid "DTLS" +msgstr "" + +#: ../gtk/propertybox.c:1253 msgid "ZRTP" msgstr "" @@ -543,7 +548,7 @@ msgstr "" msgid "Error" msgstr "" -#: ../gtk/setupwizard.c:658 ../gtk/audio_assistant.c:527 +#: ../gtk/setupwizard.c:658 ../gtk/audio_assistant.c:534 msgid "Terminating" msgstr "" @@ -634,7 +639,7 @@ msgstr "" msgid "Calling..." msgstr "正在呼叫..." -#: ../gtk/incall_view.c:514 ../gtk/incall_view.c:727 +#: ../gtk/incall_view.c:514 ../gtk/incall_view.c:733 msgid "00::00::00" msgstr "00::00::00" @@ -671,62 +676,66 @@ msgid "Secured by SRTP" msgstr "" #: ../gtk/incall_view.c:685 +msgid "Secured by DTLS" +msgstr "" + +#: ../gtk/incall_view.c:691 #, c-format msgid "Secured by ZRTP - [auth token: %s]" msgstr "" -#: ../gtk/incall_view.c:691 +#: ../gtk/incall_view.c:697 msgid "Set unverified" msgstr "" -#: ../gtk/incall_view.c:691 ../gtk/main.ui.h:4 +#: ../gtk/incall_view.c:697 ../gtk/main.ui.h:4 msgid "Set verified" msgstr "" -#: ../gtk/incall_view.c:722 +#: ../gtk/incall_view.c:728 msgid "In conference" msgstr "" -#: ../gtk/incall_view.c:722 +#: ../gtk/incall_view.c:728 msgid "In call" msgstr "" -#: ../gtk/incall_view.c:758 +#: ../gtk/incall_view.c:764 msgid "Paused call" msgstr "" -#: ../gtk/incall_view.c:794 +#: ../gtk/incall_view.c:800 msgid "Call ended." msgstr "通话结束。" -#: ../gtk/incall_view.c:825 +#: ../gtk/incall_view.c:831 msgid "Transfer in progress" msgstr "" -#: ../gtk/incall_view.c:828 +#: ../gtk/incall_view.c:834 msgid "Transfer done." msgstr "" -#: ../gtk/incall_view.c:831 +#: ../gtk/incall_view.c:837 msgid "Transfer failed." msgstr "" -#: ../gtk/incall_view.c:875 +#: ../gtk/incall_view.c:881 msgid "Resume" msgstr "" -#: ../gtk/incall_view.c:882 ../gtk/main.ui.h:9 +#: ../gtk/incall_view.c:888 ../gtk/main.ui.h:9 msgid "Pause" msgstr "" -#: ../gtk/incall_view.c:948 +#: ../gtk/incall_view.c:954 #, c-format msgid "" "Recording into\n" "%s %s" msgstr "" -#: ../gtk/incall_view.c:948 +#: ../gtk/incall_view.c:954 msgid "(Paused)" msgstr "" @@ -823,23 +832,23 @@ msgstr "" msgid "Let's start Linphone now" msgstr "" -#: ../gtk/audio_assistant.c:496 +#: ../gtk/audio_assistant.c:503 msgid "Audio Assistant" msgstr "" -#: ../gtk/audio_assistant.c:506 ../gtk/main.ui.h:31 +#: ../gtk/audio_assistant.c:513 ../gtk/main.ui.h:31 msgid "Audio assistant" msgstr "" -#: ../gtk/audio_assistant.c:511 +#: ../gtk/audio_assistant.c:518 msgid "Mic Gain calibration" msgstr "" -#: ../gtk/audio_assistant.c:517 +#: ../gtk/audio_assistant.c:524 msgid "Speaker volume calibration" msgstr "" -#: ../gtk/audio_assistant.c:522 +#: ../gtk/audio_assistant.c:529 msgid "Record and Play" msgstr "" @@ -1687,68 +1696,68 @@ msgstr "" msgid "Please wait while fetching configuration from server..." msgstr "" -#: ../coreapi/linphonecore.c:1510 +#: ../coreapi/linphonecore.c:1508 msgid "Ready" msgstr "就绪" -#: ../coreapi/linphonecore.c:2489 +#: ../coreapi/linphonecore.c:2495 msgid "Configuring" msgstr "" -#: ../coreapi/linphonecore.c:2654 +#: ../coreapi/linphonecore.c:2669 msgid "Looking for telephone number destination..." msgstr "查询电话号码目的地..." -#: ../coreapi/linphonecore.c:2656 +#: ../coreapi/linphonecore.c:2671 msgid "Could not resolve this number." msgstr "该号码无法解析。" #. must be known at that time -#: ../coreapi/linphonecore.c:2942 +#: ../coreapi/linphonecore.c:2957 msgid "Contacting" msgstr "联系中" -#: ../coreapi/linphonecore.c:2947 +#: ../coreapi/linphonecore.c:2962 msgid "Could not call" msgstr "" -#: ../coreapi/linphonecore.c:3097 +#: ../coreapi/linphonecore.c:3112 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "" -#: ../coreapi/linphonecore.c:3256 +#: ../coreapi/linphonecore.c:3270 msgid "is contacting you" msgstr "正在联系您" -#: ../coreapi/linphonecore.c:3257 +#: ../coreapi/linphonecore.c:3271 msgid " and asked autoanswer." msgstr " 并询问了自动回答。" -#: ../coreapi/linphonecore.c:3375 +#: ../coreapi/linphonecore.c:3395 msgid "Modifying call parameters..." msgstr "" -#: ../coreapi/linphonecore.c:3723 +#: ../coreapi/linphonecore.c:3743 msgid "Connected." msgstr "已连接。" -#: ../coreapi/linphonecore.c:3748 +#: ../coreapi/linphonecore.c:3768 msgid "Call aborted" msgstr "" -#: ../coreapi/linphonecore.c:3938 +#: ../coreapi/linphonecore.c:3958 msgid "Could not pause the call" msgstr "" -#: ../coreapi/linphonecore.c:3941 +#: ../coreapi/linphonecore.c:3961 msgid "Pausing the current call..." msgstr "" -#: ../coreapi/misc.c:438 +#: ../coreapi/misc.c:433 msgid "Stun lookup in progress..." msgstr "正在进行 Stun 查找..." -#: ../coreapi/misc.c:619 +#: ../coreapi/misc.c:614 msgid "ICE local candidates gathering in progress..." msgstr "" @@ -1804,13 +1813,13 @@ msgstr "" msgid "Unknown status" msgstr "" -#: ../coreapi/proxy.c:327 +#: ../coreapi/proxy.c:328 msgid "" "The sip proxy address you entered is invalid, it must start with \"sip:\" " "followed by a hostname." msgstr "您输入的 SIP 代理地址无效,它必须是以“sip:”开头,并紧随一个主机名。" -#: ../coreapi/proxy.c:333 +#: ../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" @@ -1818,126 +1827,127 @@ msgstr "" "您输入的地址无效。\n" "它应具有“sip:用户名@代理域”的形式,例如 sip:alice@example.net" -#: ../coreapi/proxy.c:1391 +#: ../coreapi/proxy.c:1403 #, c-format msgid "Could not login as %s" msgstr "无法登录为 %s" -#: ../coreapi/callbacks.c:383 +#: ../coreapi/callbacks.c:404 msgid "Remote ringing." msgstr "响铃。" -#: ../coreapi/callbacks.c:404 +#: ../coreapi/callbacks.c:425 msgid "Remote ringing..." msgstr "" -#: ../coreapi/callbacks.c:414 +#: ../coreapi/callbacks.c:442 msgid "Early media." msgstr "" -#: ../coreapi/callbacks.c:475 +#: ../coreapi/callbacks.c:503 #, c-format msgid "Call with %s is paused." msgstr "" -#: ../coreapi/callbacks.c:488 +#: ../coreapi/callbacks.c:516 #, c-format msgid "Call answered by %s - on hold." msgstr "" -#: ../coreapi/callbacks.c:498 +#: ../coreapi/callbacks.c:526 msgid "Call resumed." msgstr "" -#: ../coreapi/callbacks.c:502 +#: ../coreapi/callbacks.c:530 #, c-format msgid "Call answered by %s." msgstr "" -#: ../coreapi/callbacks.c:525 +#: ../coreapi/callbacks.c:553 msgid "Incompatible, check codecs or security settings..." msgstr "" -#: ../coreapi/callbacks.c:530 ../coreapi/callbacks.c:829 +#: ../coreapi/callbacks.c:558 ../coreapi/callbacks.c:870 msgid "Incompatible media parameters." msgstr "" -#: ../coreapi/callbacks.c:560 +#: ../coreapi/callbacks.c:588 msgid "We have been resumed." msgstr "" #. we are being paused -#: ../coreapi/callbacks.c:568 +#: ../coreapi/callbacks.c:596 msgid "We are paused by other party." msgstr "" #. reINVITE and in-dialogs UPDATE go here -#: ../coreapi/callbacks.c:602 +#: ../coreapi/callbacks.c:630 msgid "Call is updated by remote." msgstr "" -#: ../coreapi/callbacks.c:705 +#: ../coreapi/callbacks.c:746 msgid "Call terminated." msgstr "通话结束。" -#: ../coreapi/callbacks.c:733 +#: ../coreapi/callbacks.c:774 msgid "User is busy." msgstr "被叫正忙。" -#: ../coreapi/callbacks.c:734 +#: ../coreapi/callbacks.c:775 msgid "User is temporarily unavailable." msgstr "您呼叫的用户暂时无法接通。" #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:736 +#: ../coreapi/callbacks.c:777 msgid "User does not want to be disturbed." msgstr "用户已开启免打扰功能。" -#: ../coreapi/callbacks.c:737 +#: ../coreapi/callbacks.c:778 msgid "Call declined." msgstr "呼叫被拒绝。" -#: ../coreapi/callbacks.c:752 +#: ../coreapi/callbacks.c:793 msgid "Request timeout." msgstr "" -#: ../coreapi/callbacks.c:783 +#: ../coreapi/callbacks.c:824 msgid "Redirected" msgstr "已重定向" -#: ../coreapi/callbacks.c:838 +#: ../coreapi/callbacks.c:879 msgid "Call failed." msgstr "呼叫失败。" -#: ../coreapi/callbacks.c:916 +#: ../coreapi/callbacks.c:957 #, c-format msgid "Registration on %s successful." msgstr "成功注册到 %s" -#: ../coreapi/callbacks.c:917 +#: ../coreapi/callbacks.c:958 #, c-format msgid "Unregistration on %s done." msgstr "已在 %s 解除注册。" -#: ../coreapi/callbacks.c:935 +#: ../coreapi/callbacks.c:976 msgid "no response timeout" msgstr "没有响应,超时" -#: ../coreapi/callbacks.c:938 +#: ../coreapi/callbacks.c:979 #, c-format msgid "Registration on %s failed: %s" msgstr "注册到 %s 失败: %s" -#: ../coreapi/callbacks.c:945 +#: ../coreapi/callbacks.c:986 msgid "Service unavailable, retrying" msgstr "" -#: ../coreapi/linphonecall.c:175 +#. if encryption is DTLS, no status to be displayed +#: ../coreapi/linphonecall.c:180 #, c-format msgid "Authentication token is %s" msgstr "" -#: ../coreapi/linphonecall.c:3041 +#: ../coreapi/linphonecall.c:3492 #, 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 cf24e3fc7..598b7acf3 100644 --- a/po/zh_TW.po +++ b/po/zh_TW.po @@ -7,9 +7,10 @@ msgid "" msgstr "" "Project-Id-Version: linphone-gtk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-13 16:18+0100\n" -"PO-Revision-Date: 2015-01-06 11:29+0000\n" -"Last-Translator: Gautier Pelloux-Prayer \n" +"POT-Creation-Date: 2015-02-17 12:28+0100\n" +"PO-Revision-Date: 2015-02-17 11:28+0000\n" +"Last-Translator: Belledonne Communications \n" "Language-Team: Chinese (Taiwan) (http://www.transifex.com/projects/p/" "linphone-gtk/language/zh_TW/)\n" "Language: zh_TW\n" @@ -133,7 +134,7 @@ msgstr "" msgid "Run self test and exit 0 if succeed" msgstr "" -#: ../gtk/main.c:1083 +#: ../gtk/main.c:1088 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -145,66 +146,66 @@ msgstr "" "您是否要允許他看見您的上線狀態或將他加入您的連絡人清單?\n" "如果您回答否,這個人會被暫時列入黑名單。" -#: ../gtk/main.c:1160 +#: ../gtk/main.c:1165 #, c-format msgid "" "Please enter your password for username %s\n" " at realm %s:" msgstr "" -#: ../gtk/main.c:1281 +#: ../gtk/main.c:1286 msgid "Call error" msgstr "" -#: ../gtk/main.c:1284 ../coreapi/linphonecore.c:3767 +#: ../gtk/main.c:1289 ../coreapi/linphonecore.c:3787 msgid "Call ended" msgstr "通話已結束" -#: ../gtk/main.c:1287 ../coreapi/call_log.c:221 +#: ../gtk/main.c:1292 ../coreapi/call_log.c:221 msgid "Incoming call" msgstr "來電" -#: ../gtk/main.c:1289 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 +#: ../gtk/main.c:1294 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5 msgid "Answer" msgstr "接聽" -#: ../gtk/main.c:1291 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1296 ../gtk/main.ui.h:6 msgid "Decline" msgstr "拒接" -#: ../gtk/main.c:1297 +#: ../gtk/main.c:1302 msgid "Call paused" msgstr "" -#: ../gtk/main.c:1297 +#: ../gtk/main.c:1302 #, c-format msgid "by %s" msgstr "" -#: ../gtk/main.c:1367 +#: ../gtk/main.c:1372 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1529 +#: ../gtk/main.c:1534 msgid "Website link" msgstr "網站連結" -#: ../gtk/main.c:1578 +#: ../gtk/main.c:1583 msgid "Linphone - a video internet phone" msgstr "Linphone - 網路視訊電話" -#: ../gtk/main.c:1670 +#: ../gtk/main.c:1675 #, c-format msgid "%s (Default)" msgstr "%s (預設值)" -#: ../gtk/main.c:2002 ../coreapi/callbacks.c:986 +#: ../gtk/main.c:2007 ../coreapi/callbacks.c:1027 #, c-format msgid "We are transferred to %s" msgstr "我們被轉接到 %s" -#: ../gtk/main.c:2012 +#: ../gtk/main.c:2017 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." @@ -212,7 +213,7 @@ msgstr "" "在這臺電腦中偵測不到音效卡。\n" "您將無法傳送或接收語音電話。" -#: ../gtk/main.c:2156 +#: ../gtk/main.c:2161 msgid "A free SIP video-phone" msgstr "自由的 SIP 視訊電話" @@ -366,15 +367,19 @@ msgid "" "You need to restart linphone for the new language selection to take effect." msgstr "您需要重新啟動 linphone 才能讓新選擇的語言生效。" -#: ../gtk/propertybox.c:1234 +#: ../gtk/propertybox.c:1236 msgid "None" msgstr "" -#: ../gtk/propertybox.c:1238 +#: ../gtk/propertybox.c:1240 msgid "SRTP" msgstr "" -#: ../gtk/propertybox.c:1244 +#: ../gtk/propertybox.c:1246 +msgid "DTLS" +msgstr "" + +#: ../gtk/propertybox.c:1253 msgid "ZRTP" msgstr "" @@ -544,7 +549,7 @@ msgstr "" msgid "Error" msgstr "" -#: ../gtk/setupwizard.c:658 ../gtk/audio_assistant.c:527 +#: ../gtk/setupwizard.c:658 ../gtk/audio_assistant.c:534 msgid "Terminating" msgstr "" @@ -635,7 +640,7 @@ msgstr "" msgid "Calling..." msgstr "播打..." -#: ../gtk/incall_view.c:514 ../gtk/incall_view.c:727 +#: ../gtk/incall_view.c:514 ../gtk/incall_view.c:733 msgid "00::00::00" msgstr "00::00::00" @@ -672,62 +677,66 @@ msgid "Secured by SRTP" msgstr "" #: ../gtk/incall_view.c:685 +msgid "Secured by DTLS" +msgstr "" + +#: ../gtk/incall_view.c:691 #, c-format msgid "Secured by ZRTP - [auth token: %s]" msgstr "" -#: ../gtk/incall_view.c:691 +#: ../gtk/incall_view.c:697 msgid "Set unverified" msgstr "" -#: ../gtk/incall_view.c:691 ../gtk/main.ui.h:4 +#: ../gtk/incall_view.c:697 ../gtk/main.ui.h:4 msgid "Set verified" msgstr "" -#: ../gtk/incall_view.c:722 +#: ../gtk/incall_view.c:728 msgid "In conference" msgstr "" -#: ../gtk/incall_view.c:722 +#: ../gtk/incall_view.c:728 msgid "In call" msgstr "通話中" -#: ../gtk/incall_view.c:758 +#: ../gtk/incall_view.c:764 msgid "Paused call" msgstr "暫停通話" -#: ../gtk/incall_view.c:794 +#: ../gtk/incall_view.c:800 msgid "Call ended." msgstr "通話結束。" -#: ../gtk/incall_view.c:825 +#: ../gtk/incall_view.c:831 msgid "Transfer in progress" msgstr "" -#: ../gtk/incall_view.c:828 +#: ../gtk/incall_view.c:834 msgid "Transfer done." msgstr "" -#: ../gtk/incall_view.c:831 +#: ../gtk/incall_view.c:837 msgid "Transfer failed." msgstr "" -#: ../gtk/incall_view.c:875 +#: ../gtk/incall_view.c:881 msgid "Resume" msgstr "繼續" -#: ../gtk/incall_view.c:882 ../gtk/main.ui.h:9 +#: ../gtk/incall_view.c:888 ../gtk/main.ui.h:9 msgid "Pause" msgstr "暫停" -#: ../gtk/incall_view.c:948 +#: ../gtk/incall_view.c:954 #, c-format msgid "" "Recording into\n" "%s %s" msgstr "" -#: ../gtk/incall_view.c:948 +#: ../gtk/incall_view.c:954 msgid "(Paused)" msgstr "" @@ -824,23 +833,23 @@ msgstr "" msgid "Let's start Linphone now" msgstr "" -#: ../gtk/audio_assistant.c:496 +#: ../gtk/audio_assistant.c:503 msgid "Audio Assistant" msgstr "" -#: ../gtk/audio_assistant.c:506 ../gtk/main.ui.h:31 +#: ../gtk/audio_assistant.c:513 ../gtk/main.ui.h:31 msgid "Audio assistant" msgstr "" -#: ../gtk/audio_assistant.c:511 +#: ../gtk/audio_assistant.c:518 msgid "Mic Gain calibration" msgstr "" -#: ../gtk/audio_assistant.c:517 +#: ../gtk/audio_assistant.c:524 msgid "Speaker volume calibration" msgstr "" -#: ../gtk/audio_assistant.c:522 +#: ../gtk/audio_assistant.c:529 msgid "Record and Play" msgstr "" @@ -1688,68 +1697,68 @@ msgstr "" msgid "Please wait while fetching configuration from server..." msgstr "" -#: ../coreapi/linphonecore.c:1510 +#: ../coreapi/linphonecore.c:1508 msgid "Ready" msgstr "準備就緒" -#: ../coreapi/linphonecore.c:2489 +#: ../coreapi/linphonecore.c:2495 msgid "Configuring" msgstr "" -#: ../coreapi/linphonecore.c:2654 +#: ../coreapi/linphonecore.c:2669 msgid "Looking for telephone number destination..." msgstr "尋找電話號碼目的端..." -#: ../coreapi/linphonecore.c:2656 +#: ../coreapi/linphonecore.c:2671 msgid "Could not resolve this number." msgstr "無法解析這個號碼。" #. must be known at that time -#: ../coreapi/linphonecore.c:2942 +#: ../coreapi/linphonecore.c:2957 msgid "Contacting" msgstr "正在連絡" -#: ../coreapi/linphonecore.c:2947 +#: ../coreapi/linphonecore.c:2962 msgid "Could not call" msgstr "無法通話" -#: ../coreapi/linphonecore.c:3097 +#: ../coreapi/linphonecore.c:3112 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "抱歉,我們已達瀏同步通話的最大數目" -#: ../coreapi/linphonecore.c:3256 +#: ../coreapi/linphonecore.c:3270 msgid "is contacting you" msgstr "正在連絡您" -#: ../coreapi/linphonecore.c:3257 +#: ../coreapi/linphonecore.c:3271 msgid " and asked autoanswer." msgstr "並要求自動接聽。" -#: ../coreapi/linphonecore.c:3375 +#: ../coreapi/linphonecore.c:3395 msgid "Modifying call parameters..." msgstr "修改通話參數..." -#: ../coreapi/linphonecore.c:3723 +#: ../coreapi/linphonecore.c:3743 msgid "Connected." msgstr "已連線。" -#: ../coreapi/linphonecore.c:3748 +#: ../coreapi/linphonecore.c:3768 msgid "Call aborted" msgstr "通話已放棄" -#: ../coreapi/linphonecore.c:3938 +#: ../coreapi/linphonecore.c:3958 msgid "Could not pause the call" msgstr "無法暫停通話" -#: ../coreapi/linphonecore.c:3941 +#: ../coreapi/linphonecore.c:3961 msgid "Pausing the current call..." msgstr "暫停目前的通話..." -#: ../coreapi/misc.c:438 +#: ../coreapi/misc.c:433 msgid "Stun lookup in progress..." msgstr "正在進行 Stun 搜尋..." -#: ../coreapi/misc.c:619 +#: ../coreapi/misc.c:614 msgid "ICE local candidates gathering in progress..." msgstr "" @@ -1805,14 +1814,14 @@ msgstr "" msgid "Unknown status" msgstr "" -#: ../coreapi/proxy.c:327 +#: ../coreapi/proxy.c:328 msgid "" "The sip proxy address you entered is invalid, it must start with \"sip:\" " "followed by a hostname." msgstr "" "您輸入的 sip 代理位址是無效的,它必須要以「sip:」開頭,後面接主機名稱。" -#: ../coreapi/proxy.c:333 +#: ../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" @@ -1820,126 +1829,127 @@ msgstr "" "您輸入的 sip 身分是無效的。\n" "它應該看起來像 sip:使用者名稱@代理網域,像是 sip:alice@example.net" -#: ../coreapi/proxy.c:1391 +#: ../coreapi/proxy.c:1403 #, c-format msgid "Could not login as %s" msgstr "無法以 %s 登入" -#: ../coreapi/callbacks.c:383 +#: ../coreapi/callbacks.c:404 msgid "Remote ringing." msgstr "遠端響鈴。" -#: ../coreapi/callbacks.c:404 +#: ../coreapi/callbacks.c:425 msgid "Remote ringing..." msgstr "遠端響鈴..." -#: ../coreapi/callbacks.c:414 +#: ../coreapi/callbacks.c:442 msgid "Early media." msgstr "早期媒體。" -#: ../coreapi/callbacks.c:475 +#: ../coreapi/callbacks.c:503 #, c-format msgid "Call with %s is paused." msgstr "和 %s 的通話已暫停。" -#: ../coreapi/callbacks.c:488 +#: ../coreapi/callbacks.c:516 #, c-format msgid "Call answered by %s - on hold." msgstr "通話由 %s 接聽 - 保留中。" -#: ../coreapi/callbacks.c:498 +#: ../coreapi/callbacks.c:526 msgid "Call resumed." msgstr "通話已繼續。" -#: ../coreapi/callbacks.c:502 +#: ../coreapi/callbacks.c:530 #, c-format msgid "Call answered by %s." msgstr "通話由 %s 接聽。" -#: ../coreapi/callbacks.c:525 +#: ../coreapi/callbacks.c:553 msgid "Incompatible, check codecs or security settings..." msgstr "" -#: ../coreapi/callbacks.c:530 ../coreapi/callbacks.c:829 +#: ../coreapi/callbacks.c:558 ../coreapi/callbacks.c:870 msgid "Incompatible media parameters." msgstr "" -#: ../coreapi/callbacks.c:560 +#: ../coreapi/callbacks.c:588 msgid "We have been resumed." msgstr "" #. we are being paused -#: ../coreapi/callbacks.c:568 +#: ../coreapi/callbacks.c:596 msgid "We are paused by other party." msgstr "" #. reINVITE and in-dialogs UPDATE go here -#: ../coreapi/callbacks.c:602 +#: ../coreapi/callbacks.c:630 msgid "Call is updated by remote." msgstr "" -#: ../coreapi/callbacks.c:705 +#: ../coreapi/callbacks.c:746 msgid "Call terminated." msgstr "通話已終止。" -#: ../coreapi/callbacks.c:733 +#: ../coreapi/callbacks.c:774 msgid "User is busy." msgstr "使用者現正忙碌。" -#: ../coreapi/callbacks.c:734 +#: ../coreapi/callbacks.c:775 msgid "User is temporarily unavailable." msgstr "使用者暫時無法聯繫。" #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:736 +#: ../coreapi/callbacks.c:777 msgid "User does not want to be disturbed." msgstr "使用者不想要被打擾。" -#: ../coreapi/callbacks.c:737 +#: ../coreapi/callbacks.c:778 msgid "Call declined." msgstr "通話被拒接。" -#: ../coreapi/callbacks.c:752 +#: ../coreapi/callbacks.c:793 msgid "Request timeout." msgstr "" -#: ../coreapi/callbacks.c:783 +#: ../coreapi/callbacks.c:824 msgid "Redirected" msgstr "已重新導向" -#: ../coreapi/callbacks.c:838 +#: ../coreapi/callbacks.c:879 msgid "Call failed." msgstr "通話失敗。" -#: ../coreapi/callbacks.c:916 +#: ../coreapi/callbacks.c:957 #, c-format msgid "Registration on %s successful." msgstr "在 %s 註冊成功。" -#: ../coreapi/callbacks.c:917 +#: ../coreapi/callbacks.c:958 #, c-format msgid "Unregistration on %s done." msgstr "在 %s 取消註冊完成。" -#: ../coreapi/callbacks.c:935 +#: ../coreapi/callbacks.c:976 msgid "no response timeout" msgstr "沒有回應逾時" -#: ../coreapi/callbacks.c:938 +#: ../coreapi/callbacks.c:979 #, c-format msgid "Registration on %s failed: %s" msgstr "在 %s 註冊失敗:%s" -#: ../coreapi/callbacks.c:945 +#: ../coreapi/callbacks.c:986 msgid "Service unavailable, retrying" msgstr "" -#: ../coreapi/linphonecall.c:175 +#. if encryption is DTLS, no status to be displayed +#: ../coreapi/linphonecall.c:180 #, c-format msgid "Authentication token is %s" msgstr "" -#: ../coreapi/linphonecall.c:3041 +#: ../coreapi/linphonecall.c:3492 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." From dda9ac6827416fd6e25189db0027c10c24ec3425 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Tue, 17 Feb 2015 13:06:21 +0100 Subject: [PATCH 20/90] Updated oRTP and ms2 --- mediastreamer2 | 2 +- oRTP | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mediastreamer2 b/mediastreamer2 index b1acdb3a5..7c9ff4ca0 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit b1acdb3a58f34e1b333ed1dbfaa6ae0aab09861f +Subproject commit 7c9ff4ca0e597cc36e1ddf14dacfb4bf7a239d74 diff --git a/oRTP b/oRTP index 22b81144d..3413234be 160000 --- a/oRTP +++ b/oRTP @@ -1 +1 @@ -Subproject commit 22b81144d313b58cfe53c1c9aa71dcf22e1f43c2 +Subproject commit 3413234be817074e276eb9157b5e756f3e4d6fd0 From b4d95b057f0723c10b28ce4526d55fb6bbd4174d Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Tue, 17 Feb 2015 14:06:37 +0100 Subject: [PATCH 21/90] Add pull-transifex and push-transifex --- Makefile.am | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Makefile.am b/Makefile.am index 4f3f46860..b392c23e9 100644 --- a/Makefile.am +++ b/Makefile.am @@ -168,6 +168,15 @@ filelist: zip fi \ done +### LOCALIZATION + +pull-transifex: + tx pull -af + $(MAKE) -C po update-po + +push-transifex: + tx push -s -t -f + ### WINDOWS From 3d99556b61936acc56bb797c0d5bf964c2c00fd3 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Tue, 17 Feb 2015 14:16:38 +0100 Subject: [PATCH 22/90] Fix WP8 no tunnel project --- build/wp8/LibLinphone_no_tunnel.vcxproj | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/build/wp8/LibLinphone_no_tunnel.vcxproj b/build/wp8/LibLinphone_no_tunnel.vcxproj index 1bc745f52..f6e3ac7bd 100644 --- a/build/wp8/LibLinphone_no_tunnel.vcxproj +++ b/build/wp8/LibLinphone_no_tunnel.vcxproj @@ -1,3 +1,4 @@ +wbelle_sip  @@ -64,7 +65,7 @@ Console false false - belle-sip.lib;mediastreamer2.lib;ws2_32.lib;ortp.lib;gsm.lib;speex.lib;speexdsp.lib;%(AdditionalDependencies) + belle-sip_no_tunnel.lib;mediastreamer2.lib;ws2_32.lib;ortp.lib;gsm.lib;speex.lib;speexdsp.lib;%(AdditionalDependencies) $(SolutionDir)$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) $(TargetDir)$(TargetName).lib @@ -213,4 +214,4 @@ - \ No newline at end of file + From cae4fe4e069755a4d2ab708017f8e4bc99a8dbfb Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Tue, 17 Feb 2015 14:19:19 +0100 Subject: [PATCH 23/90] Fix typo in WP8 project --- build/wp8/LibLinphone_no_tunnel.vcxproj | 1 - 1 file changed, 1 deletion(-) diff --git a/build/wp8/LibLinphone_no_tunnel.vcxproj b/build/wp8/LibLinphone_no_tunnel.vcxproj index f6e3ac7bd..339b301f2 100644 --- a/build/wp8/LibLinphone_no_tunnel.vcxproj +++ b/build/wp8/LibLinphone_no_tunnel.vcxproj @@ -1,4 +1,3 @@ -wbelle_sip  From 62a2dd1e84ba7c922dbb29baecffec8e29172dda Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Tue, 17 Feb 2015 15:31:43 +0100 Subject: [PATCH 24/90] Fix issue using _no_tunnel prefix --- build/wp8/LibLinphone_no_tunnel.vcxproj | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/build/wp8/LibLinphone_no_tunnel.vcxproj b/build/wp8/LibLinphone_no_tunnel.vcxproj index 339b301f2..3c88f6b05 100644 --- a/build/wp8/LibLinphone_no_tunnel.vcxproj +++ b/build/wp8/LibLinphone_no_tunnel.vcxproj @@ -64,7 +64,7 @@ Console false false - belle-sip_no_tunnel.lib;mediastreamer2.lib;ws2_32.lib;ortp.lib;gsm.lib;speex.lib;speexdsp.lib;%(AdditionalDependencies) + belle-sip_no_tunnel.lib;mediastreamer2.lib;ws2_32.lib;ortp.lib;gsm.lib;speex.lib;speexdsp.lib;libxml2.lib;sqlite.lib;zlib.lib;%(AdditionalDependencies) $(SolutionDir)$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) $(TargetDir)$(TargetName).lib @@ -82,6 +82,9 @@ true + + false + @@ -213,4 +216,4 @@ - + \ No newline at end of file From a29ccb43e2b226fd53475957b3b09ebf8e2025e2 Mon Sep 17 00:00:00 2001 From: Margaux Clerc Date: Tue, 17 Feb 2015 15:44:18 +0100 Subject: [PATCH 25/90] Link android project with zlib --- build/android/Android.mk | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/build/android/Android.mk b/build/android/Android.mk index 9cf269871..fbdeff652 100755 --- a/build/android/Android.mk +++ b/build/android/Android.mk @@ -85,7 +85,8 @@ LOCAL_CFLAGS += \ -DHAVE_CONFIG_H \ -DLIBLINPHONE_VERSION=\"$(LIBLINPHONE_VERSION)\" \ -DLINPHONE_PLUGINS_DIR=\"\\tmp\" \ - -DUSE_BELLESIP + -DUSE_BELLESIP \ + -DHAVE_ZLIB LOCAL_CFLAGS += -DIN_LINPHONE @@ -118,7 +119,7 @@ LOCAL_C_INCLUDES += \ $(LOCAL_PATH)/../../externals/libxml2/include \ $(LOCAL_PATH)/../../externals/build/libxml2 -LOCAL_LDLIBS += -llog -ldl +LOCAL_LDLIBS += -llog -ldl -lz LOCAL_STATIC_LIBRARIES := \ cpufeatures \ From d4670976dfd6880949acfd8d03591fb722285831 Mon Sep 17 00:00:00 2001 From: Margaux Clerc Date: Tue, 17 Feb 2015 15:44:56 +0100 Subject: [PATCH 26/90] Add JNI function mediaInProgress --- coreapi/linphonecore_jni.cc | 6 ++++++ java/common/org/linphone/core/LinphoneCall.java | 11 +++++++++++ java/impl/org/linphone/core/LinphoneCallImpl.java | 4 ++++ 3 files changed, 21 insertions(+) diff --git a/coreapi/linphonecore_jni.cc b/coreapi/linphonecore_jni.cc index b562cf31a..3e895a6ce 100644 --- a/coreapi/linphonecore_jni.cc +++ b/coreapi/linphonecore_jni.cc @@ -2747,6 +2747,12 @@ extern "C" jlong Java_org_linphone_core_LinphoneCallImpl_getPlayer(JNIEnv *env, return (jlong)linphone_call_get_player((LinphoneCall *)callPtr); } +extern "C" jboolean Java_org_linphone_core_LinphoneCallImpl_mediaInProgress( JNIEnv* env + ,jobject thiz + ,jlong ptr) { + return (jboolean) linphone_call_media_in_progress((LinphoneCall*)ptr); +} + //LinphoneFriend extern "C" jlong Java_org_linphone_core_LinphoneFriendImpl_newLinphoneFriend(JNIEnv* env ,jobject thiz diff --git a/java/common/org/linphone/core/LinphoneCall.java b/java/common/org/linphone/core/LinphoneCall.java index 404fdbcf0..cd74b6d07 100644 --- a/java/common/org/linphone/core/LinphoneCall.java +++ b/java/common/org/linphone/core/LinphoneCall.java @@ -268,6 +268,16 @@ public interface LinphoneCall { void setAuthenticationTokenVerified(boolean verified); boolean isInConference(); + + /** + * Indicates whether an operation is in progress at the media side. + * It can a bad idea to initiate signaling operations (adding video, pausing the call, removing video, changing video parameters) while + * the media is busy in establishing the connection (typically ICE connectivity checks). It can result in failures generating loss of time + * in future operations in the call. + * Applications are invited to check this function after each call state change to decide whether certain operations are permitted or not. + * @return TRUE if media is busy in establishing the connection, FALSE otherwise. + **/ + boolean mediaInProgress(); float getPlayVolume(); @@ -349,4 +359,5 @@ public interface LinphoneCall { * @return A player */ public LinphonePlayer getPlayer(); + } diff --git a/java/impl/org/linphone/core/LinphoneCallImpl.java b/java/impl/org/linphone/core/LinphoneCallImpl.java index b2cad202c..de9e25364 100644 --- a/java/impl/org/linphone/core/LinphoneCallImpl.java +++ b/java/impl/org/linphone/core/LinphoneCallImpl.java @@ -43,6 +43,7 @@ class LinphoneCallImpl implements LinphoneCall { private native int getDuration(long nativePtr); private native float getCurrentQuality(long nativePtr); private native float getAverageQuality(long nativePtr); + private native boolean mediaInProgress(long nativePtr); /* * This method must always be called from JNI, nothing else. @@ -167,6 +168,8 @@ class LinphoneCallImpl implements LinphoneCall { return params.localConferenceMode(); } + public boolean mediaInProgress() { return mediaInProgress(nativePtr);} + @Override public String toString() { return "Call " + nativePtr; @@ -251,4 +254,5 @@ class LinphoneCallImpl implements LinphoneCall { public LinphonePlayer getPlayer() { return new LinphonePlayerImpl(getPlayer(nativePtr)); } + } From 835978a333b63f1e61c4b56fe495769e52095d27 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Tue, 17 Feb 2015 16:16:37 +0100 Subject: [PATCH 27/90] Removed yet another reference to belle_sip with tunnel in wp8 no tunnel project --- build/wp8/LibLinphone_no_tunnel.vcxproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/wp8/LibLinphone_no_tunnel.vcxproj b/build/wp8/LibLinphone_no_tunnel.vcxproj index 3c88f6b05..447253440 100644 --- a/build/wp8/LibLinphone_no_tunnel.vcxproj +++ b/build/wp8/LibLinphone_no_tunnel.vcxproj @@ -177,7 +177,7 @@ {1db09afe-fc9b-472e-a746-0e33f8ef8883} - + {4c225a82-800b-427b-ba7b-61686a9b347f} From db99a3b71cad85ff996cf642d959f083ff75a004 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Tue, 17 Feb 2015 16:48:15 +0100 Subject: [PATCH 28/90] update ortp --- oRTP | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/oRTP b/oRTP index 3413234be..cd468445a 160000 --- a/oRTP +++ b/oRTP @@ -1 +1 @@ -Subproject commit 3413234be817074e276eb9157b5e756f3e4d6fd0 +Subproject commit cd468445a4f276f54ee9f9948712855f3cd1a0dc From e1291ba3ea39d45ec565b3072242e4878ab441d8 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Tue, 17 Feb 2015 17:04:57 +0100 Subject: [PATCH 29/90] rework a bit dtls --- coreapi/linphonecall.c | 69 +++++++++++++++++++----------------------- coreapi/sal.c | 5 +++ 2 files changed, 36 insertions(+), 38 deletions(-) diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c index 8cd0c1352..afcd516e5 100644 --- a/coreapi/linphonecall.c +++ b/coreapi/linphonecall.c @@ -2313,7 +2313,20 @@ static void configure_rtp_session_for_rtcp_xr(LinphoneCore *lc, LinphoneCall *ca } rtp_session_configure_rtcp_xr(session, ¤tconfig); } - +void static start_dtls( MSMediaStreamSessions *sessions, const SalStreamDescription *sd,const SalStreamDescription *remote) { + if (sal_stream_description_has_dtls(sd) == TRUE) { + /*DTLS*/ + SalDtlsRole salRole = sd->dtls_role; + if (salRole!=SalDtlsRoleInvalid) { /* if DTLS is available at both end points */ + /* give the peer certificate fingerprint to dtls context */ + ms_dtls_srtp_set_peer_fingerprint(sessions->dtls_context, remote->dtls_fingerprint); + ms_dtls_srtp_set_role(sessions->dtls_context, (salRole == SalDtlsRoleIsClient)?MSDtlsSrtpRoleIsClient:MSDtlsSrtpRoleIsServer); /* set the role to client */ + ms_dtls_srtp_start(sessions->dtls_context); /* then start the engine, it will send the DTLS client Hello */ + } else { + ms_warning("unable to start DTLS engine on stream session [%p], Dtls role in resulting media description is invalid",sessions); + } + } +} static void linphone_call_start_audio_stream(LinphoneCall *call, bool_t muted, bool_t send_ringbacktone, bool_t use_arc){ LinphoneCore *lc=call->core; LpConfig* conf; @@ -2436,25 +2449,9 @@ static void linphone_call_start_audio_stream(LinphoneCall *call, bool_t muted, b if (send_ringbacktone){ setup_ring_player(lc,call); } - - if (sal_stream_description_has_dtls(stream) == TRUE) { - /* DTLS engine was already initialised during stream init. Before starting it we must be sure that the role(client or server) is set. - * Role may have already been set to server if we initiate the call and already received a packet from peer, in that case do nothing */ - SalDtlsRole salRole = stream->dtls_role; - if (salRole!=SalDtlsRoleInvalid) { /* if DTLS is available at both end points */ - /* give the peer certificate fingerprint to dtls context */ - SalMediaDescription *remote_desc = sal_call_get_remote_media_description(call->op); - ms_dtls_srtp_set_peer_fingerprint(call->audiostream->ms.sessions.dtls_context, remote_desc->streams[0].dtls_fingerprint); - } else { - ms_warning("unable to start DTLS engine on audiostream, Dtls role in resulting media description is invalid\n"); - } - if (salRole == SalDtlsRoleIsClient) { /* local endpoint is client */ - ms_dtls_srtp_set_role(call->audiostream->ms.sessions.dtls_context, MSDtlsSrtpRoleIsClient); /* set the role to client */ - ms_dtls_srtp_start(call->audiostream->ms.sessions.dtls_context); /* then start the engine, it will send the DTLS client Hello */ - } else if (salRole == SalDtlsRoleIsServer) { /* local endpoint is server */ - ms_dtls_srtp_set_role(call->audiostream->ms.sessions.dtls_context, MSDtlsSrtpRoleIsServer); /* this may complete the server setup */ - /* no need to start engine, we are waiting for DTLS Client Hello */ - } + { + SalMediaDescription *remote_desc = sal_call_get_remote_media_description(call->op); + start_dtls(&call->audiostream->ms.sessions,stream,&remote_desc->streams[0]); } if (call->params->in_conference){ @@ -2582,24 +2579,11 @@ static void linphone_call_start_video_stream(LinphoneCall *call, bool_t all_inpu used_pt, linphone_core_get_video_jittcomp(lc), cam); } } - if (sal_stream_description_has_dtls(vstream) == TRUE) { - /*DTLS*/ - SalDtlsRole salRole = vstream->dtls_role; - if (salRole!=SalDtlsRoleInvalid) { /* if DTLS is available at both end points */ - /* give the peer certificate fingerprint to dtls context */ - SalMediaDescription *remote_desc = sal_call_get_remote_media_description(call->op); - ms_dtls_srtp_set_peer_fingerprint(call->videostream->ms.sessions.dtls_context, remote_desc->streams[1].dtls_fingerprint); - } else { - ms_warning("unable to start DTLS engine on videostream, Dtls role in resulting media description is invalid\n"); - } - if (salRole == SalDtlsRoleIsClient) { /* local endpoint is client */ - ms_dtls_srtp_set_role(call->videostream->ms.sessions.dtls_context, MSDtlsSrtpRoleIsClient); /* set the role to client */ - ms_dtls_srtp_start(call->videostream->ms.sessions.dtls_context); /* then start the engine, it will send the DTLS client Hello */ - } else if (salRole == SalDtlsRoleIsServer) { /* local endpoint is server */ - ms_dtls_srtp_set_role(call->videostream->ms.sessions.dtls_context, MSDtlsSrtpRoleIsServer); /* this may complete the server setup */ - /* no need to start engine, we are waiting for DTLS Client Hello */ - } + { + SalMediaDescription *remote_desc = sal_call_get_remote_media_description(call->op); + start_dtls(&call->videostream->ms.sessions,vstream,&remote_desc->streams[1]); } + }else ms_warning("No video stream accepted."); }else{ ms_message("No valid video stream defined."); @@ -2710,6 +2694,10 @@ void linphone_call_update_crypto_parameters(LinphoneCall *call, SalMediaDescript if (call->audiostream && local_st_desc && old_stream && new_stream && update_stream_crypto_params(call,local_st_desc,old_stream,new_stream,&call->audiostream->ms)){ } + if (call->audiostream) { + SalMediaDescription *remote_desc = sal_call_get_remote_media_description(call->op); + start_dtls(&call->audiostream->ms.sessions,&new_md->streams[0],&remote_desc->streams[0]); + } #ifdef VIDEO_ENABLED local_st_desc = sal_media_description_find_secure_stream_of_type(call->localdesc, SalVideo); @@ -2718,6 +2706,10 @@ void linphone_call_update_crypto_parameters(LinphoneCall *call, SalMediaDescript if (call->videostream && local_st_desc && old_stream && new_stream && update_stream_crypto_params(call,local_st_desc,old_stream,new_stream,&call->videostream->ms)){ } + if (call->videostream) { + SalMediaDescription *remote_desc = sal_call_get_remote_media_description(call->op); + start_dtls(&call->videostream->ms.sessions,&new_md->streams[1],&remote_desc->streams[1]); + } #endif } @@ -3285,7 +3277,8 @@ static void handle_ice_events(LinphoneCall *call, OrtpEvent *ev){ switch (ice_session_state(call->ice_session)) { case IS_Completed: ice_session_select_candidates(call->ice_session); - if (ice_session_role(call->ice_session) == IR_Controlling) { + if (ice_session_role(call->ice_session) == IR_Controlling + && lp_config_get_int(call->core->config, "sip", "update_call_when_ice_completed", TRUE)) { linphone_core_update_call(call->core, call, params); } change_ice_media_destinations(call); diff --git a/coreapi/sal.c b/coreapi/sal.c index ea26b25d8..11934f572 100644 --- a/coreapi/sal.c +++ b/coreapi/sal.c @@ -318,6 +318,11 @@ int sal_stream_description_equals(const SalStreamDescription *sd1, const SalStre if (sd1->ptime != sd2->ptime) result |= SAL_MEDIA_DESCRIPTION_CODEC_CHANGED; if (sd1->dir != sd2->dir) result |= SAL_MEDIA_DESCRIPTION_CODEC_CHANGED; + /*DTLS*/ + if (sd1->dtls_role != sd2->dtls_role) result |= SAL_MEDIA_DESCRIPTION_CRYPTO_KEYS_CHANGED; + if (strcmp(sd1->dtls_fingerprint, sd2->dtls_fingerprint) != 0) result |= SAL_MEDIA_DESCRIPTION_CRYPTO_KEYS_CHANGED; + + return result; } From 097cae673a4a8abd554d6ad58aa89999689b57b4 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Tue, 17 Feb 2015 17:23:27 +0100 Subject: [PATCH 30/90] robustize tests for windows --- coreapi/remote_provisioning.c | 4 ++-- tester/call_tester.c | 10 +++++----- tester/flexisip_tester.c | 8 ++++++-- tester/setup_tester.c | 14 +++++++------- 4 files changed, 20 insertions(+), 16 deletions(-) diff --git a/coreapi/remote_provisioning.c b/coreapi/remote_provisioning.c index fd5d2eb92..901170eac 100644 --- a/coreapi/remote_provisioning.c +++ b/coreapi/remote_provisioning.c @@ -62,9 +62,9 @@ static void linphone_remote_provisioning_apply(LinphoneCore *lc, const char *xml int linphone_remote_provisioning_load_file( LinphoneCore* lc, const char* file_path){ int status = -1; - FILE* f = fopen(file_path, "r"); + FILE* f = fopen(file_path, "rb"); - if( f ){ + if ( f ){ long fsize; char* provisioning; diff --git a/tester/call_tester.c b/tester/call_tester.c index 9fe4c5913..237ec04ff 100644 --- a/tester/call_tester.c +++ b/tester/call_tester.c @@ -3072,7 +3072,7 @@ static void multiple_early_media(void) { marie2_call=linphone_core_get_current_call(marie2->lc); /*wait a bit that streams are established*/ - wait_for_list(lcs,&dummy,1,3000); + 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); @@ -3085,18 +3085,18 @@ static void multiple_early_media(void) { CU_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,1000); + 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); /*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,2000)); + CU_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,2000)); - CU_ASSERT_TRUE(wait_for_list(lcs,&marie1->stat.number_of_LinphoneCallEnd,1,2000)); + 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)); ms_list_free(lcs); linphone_core_manager_destroy(marie1); diff --git a/tester/flexisip_tester.c b/tester/flexisip_tester.c index 7f4680639..948df8fba 100644 --- a/tester/flexisip_tester.c +++ b/tester/flexisip_tester.c @@ -464,7 +464,7 @@ static void call_forking_with_push_notification_multiple(void){ linphone_core_manager_destroy(marie2); } -void call_forking_not_responded(void){ +static void call_forking_not_responded(void){ LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_tcp_rc"); LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); LinphoneCoreManager* marie2 = linphone_core_manager_new( "marie_rc"); @@ -551,7 +551,7 @@ static void early_media_call_forking(void) { marie2_call=linphone_core_get_current_call(marie2->lc); /*wait a bit that streams are established*/ - wait_for_list(lcs,&dummy,1,3000); + wait_for_list(lcs,&dummy,1,6000); CU_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 @@ -663,6 +663,9 @@ static void call_with_ipv6(void) { LinphoneCoreManager* pauline; LinphoneCall *pauline_call; + /*calling ortp_init() here is done to have WSAStartup() done, otherwise liblinphone_tester_ipv6_available() will not work.*/ + ortp_init(); + if (!liblinphone_tester_ipv6_available()){ ms_warning("Call with ipv6 not tested, no ipv6 connectivity"); return; @@ -708,6 +711,7 @@ static void call_with_ipv6(void) { if (leaked_objects>0){ belle_sip_object_dump_active_objects(); } + ortp_exit(); } test_t flexisip_tests[] = { diff --git a/tester/setup_tester.c b/tester/setup_tester.c index bab077623..06d734d6a 100644 --- a/tester/setup_tester.c +++ b/tester/setup_tester.c @@ -96,9 +96,8 @@ static void linphone_interpret_url_test() } static void linphone_lpconfig_from_buffer(){ - - static const char* buffer = "[buffer]\ntest=ok"; - static const char* buffer_linebreaks = "[buffer_linebreaks]\n\n\n\r\n\n\r\ntest=ok"; + const char* buffer = "[buffer]\ntest=ok"; + const char* buffer_linebreaks = "[buffer_linebreaks]\n\n\n\r\n\n\r\ntest=ok"; LpConfig* conf; conf = lp_config_new_from_buffer(buffer); @@ -112,7 +111,7 @@ static void linphone_lpconfig_from_buffer(){ static void linphone_lpconfig_from_buffer_zerolen_value(){ /* parameters that have no value should return NULL, not "". */ - static const char* zerolen = "[test]\nzero_len=\nnon_zero_len=test"; + const char* zerolen = "[test]\nzero_len=\nnon_zero_len=test"; LpConfig* conf; conf = lp_config_new_from_buffer(zerolen); @@ -128,7 +127,7 @@ static void linphone_lpconfig_from_buffer_zerolen_value(){ static void linphone_lpconfig_from_file_zerolen_value(){ /* parameters that have no value should return NULL, not "". */ - static const char* zero_rc_file = "zero_length_params_rc"; + const char* zero_rc_file = "zero_length_params_rc"; char* rc_path = ms_strdup_printf("%s/rcfiles/%s", liblinphone_tester_file_prefix, zero_rc_file); LpConfig* conf; @@ -144,11 +143,12 @@ static void linphone_lpconfig_from_file_zerolen_value(){ 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"); + ms_free(rc_path); lp_config_destroy(conf); } static void linphone_lpconfig_from_xml_zerolen_value(){ - static const char* zero_xml_file = "remote_zero_length_params_rc"; + const char* zero_xml_file = "remote_zero_length_params_rc"; char* xml_path = ms_strdup_printf("%s/rcfiles/%s", liblinphone_tester_file_prefix, zero_xml_file); LpConfig* conf; @@ -165,7 +165,7 @@ static void linphone_lpconfig_from_xml_zerolen_value(){ CU_ASSERT_STRING_EQUAL(lp_config_get_string(conf,"test","non_zero_len","LOL"), "LOL"); linphone_core_manager_destroy(mgr); - + ms_free(xml_path); } void linphone_proxy_config_address_equal_test() { From 006e1ead57498ef488b53eb0988fde8b8ef9dd3c Mon Sep 17 00:00:00 2001 From: Guillaume BIENKOWSKI Date: Tue, 17 Feb 2015 17:44:02 +0100 Subject: [PATCH 31/90] Update ms2 --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index 7c9ff4ca0..ef83b7a28 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 7c9ff4ca0e597cc36e1ddf14dacfb4bf7a239d74 +Subproject commit ef83b7a2899bc838fe9a490afbb31ae017c7d810 From 5c30b4d6c091ae044b1e3b1e0b2d6d3270e548d1 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Tue, 17 Feb 2015 18:21:52 +0100 Subject: [PATCH 32/90] skip call forking with multicast tests on windows, as it is not possible on this platform --- tester/multicast_call_tester.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tester/multicast_call_tester.c b/tester/multicast_call_tester.c index e5a05c11e..356cf3e74 100644 --- a/tester/multicast_call_tester.c +++ b/tester/multicast_call_tester.c @@ -96,6 +96,15 @@ static void early_media_with_multicast_base(bool_t video) { int begin; LinphoneVideoPolicy marie_policy, pauline_policy; LpConfig *marie_lp; + +#ifdef WIN32 + /* + * "Do not call IP_ADD_MEMBERSHIP with the same group more than once on the same network interface." + * https://msdn.microsoft.com/en-us/library/windows/desktop/ms739174%28v=vs.85%29.aspx + */ + ms_warning("Call forking with multicast can't be tested on windows, test skipped"); + return; +#endif belle_sip_object_enable_leak_detector(TRUE); begin=belle_sip_object_get_object_count(); From 41a3e1e06db3268eeee713fc4a06b57c1b2b2a38 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Tue, 17 Feb 2015 23:43:20 +0100 Subject: [PATCH 33/90] rework multicast. It is not necessary to bind to the multicast address. 0.0.0.0 just works while the binding to the multicast address is rejected on windows fixes reading provisionning config file from disk on windows. --- coreapi/linphonecall.c | 27 ++++++++++++------- coreapi/private.h | 2 ++ coreapi/remote_provisioning.c | 49 +++++++++++++++++++---------------- mediastreamer2 | 2 +- oRTP | 2 +- tester/call_tester.c | 2 +- 6 files changed, 49 insertions(+), 35 deletions(-) diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c index afcd516e5..cbf2d4362 100644 --- a/coreapi/linphonecall.c +++ b/coreapi/linphonecall.c @@ -555,14 +555,11 @@ 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=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*/ + /*as multicast sender, we must decide a local interface to use to send multicast, and bind to it*/ bind_ip=call->localip; - }else{ - /*as receiver, just bind to the multicast address*/ - bind_ip=call->media_ports[stream_index].multicast_ip; } } return bind_ip; @@ -1003,8 +1000,8 @@ void linphone_call_set_compatible_incoming_call_parameters(LinphoneCall *call, c 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].rtp_port=md->streams[i].rtp_port; - call->media_ports[i].rtcp_port=0; + call->media_ports[i].mcast_rtp_port=md->streams[i].rtp_port; + call->media_ports[i].mcast_rtcp_port=0; } } } @@ -1844,7 +1841,12 @@ int linphone_call_prepare_ice(LinphoneCall *call, bool_t incoming_offer){ return 0; } - +/*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){ + media_stream_join_multicast_group(ms, call->media_ports[stream_index].multicast_ip); + } +} void linphone_call_init_audio_stream(LinphoneCall *call){ LinphoneCore *lc=call->core; @@ -1859,7 +1861,10 @@ void linphone_call_init_audio_stream(LinphoneCall *call){ if (call->audiostream != NULL) return; if (call->sessions[0].rtp_session==NULL){ call->audiostream=audiostream=audio_stream_new2(linphone_call_get_bind_ip_for_stream(call,0), - call->media_ports[0].rtp_port, call->media_ports[0].rtcp_port); + 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); + cname = linphone_address_as_string_uri_only(call->me); audio_stream_set_rtcp_information(call->audiostream, cname, rtcp_tool); ms_free(cname); @@ -1965,7 +1970,9 @@ void linphone_call_init_video_stream(LinphoneCall *call){ if (call->sessions[1].rtp_session==NULL){ call->videostream=video_stream_new2(linphone_call_get_bind_ip_for_stream(call,1), - call->media_ports[1].rtp_port,call->media_ports[1].rtcp_port); + 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); cname = linphone_address_as_string_uri_only(call->me); video_stream_set_rtcp_information(call->videostream, cname, rtcp_tool); ms_free(cname); diff --git a/coreapi/private.h b/coreapi/private.h index 15083943e..d5a59d85f 100644 --- a/coreapi/private.h +++ b/coreapi/private.h @@ -203,6 +203,8 @@ 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; diff --git a/coreapi/remote_provisioning.c b/coreapi/remote_provisioning.c index fd5d2eb92..5562f65db 100644 --- a/coreapi/remote_provisioning.c +++ b/coreapi/remote_provisioning.c @@ -60,33 +60,38 @@ static void linphone_remote_provisioning_apply(LinphoneCore *lc, const char *xml , error_msg); } +static char *load_file_content(const char *path){ + FILE *f=fopen(path,"rb"); + size_t bufsize=2048; + size_t step=bufsize; + size_t pos=0; + size_t count; + char *buffer=ms_malloc(bufsize+1); + if (!f) { + ms_error("load_file_content(): could not open [%s]",path); + return NULL; + } + while((count=fread(buffer+pos, 1, step, f))>0){ + pos+=count; + if (pos+step>=bufsize){ + bufsize*=2; + buffer=ms_realloc(buffer, bufsize+1); + } + } + buffer[pos]='\0'; + fclose(f); + return buffer; +} + int linphone_remote_provisioning_load_file( LinphoneCore* lc, const char* file_path){ int status = -1; - FILE* f = fopen(file_path, "r"); + char* provisioning=load_file_content(file_path); - if( f ){ - long fsize; - char* provisioning; - - fseek(f, 0, SEEK_END); - fsize = ftell(f); - fseek(f, 0, SEEK_SET); - - provisioning = ms_malloc(fsize + 1); - provisioning[fsize]='\0'; - if (fread(provisioning, fsize, 1, f)==0){ - ms_error("Could not read xml provisioning file from %s",file_path); - status=-1; - }else{ - linphone_remote_provisioning_apply(lc, provisioning); - status = 0; - } + if (provisioning){ + linphone_remote_provisioning_apply(lc, provisioning); + status = 0; ms_free(provisioning); - fclose(f); - } else { - ms_error("Couldn't open file %s for provisioning", file_path); } - return status; } diff --git a/mediastreamer2 b/mediastreamer2 index ef83b7a28..acca89ed2 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit ef83b7a2899bc838fe9a490afbb31ae017c7d810 +Subproject commit acca89ed2e726ac53eddce9ffbfd378ea0c9bf9f diff --git a/oRTP b/oRTP index cd468445a..cd3f64ec0 160000 --- a/oRTP +++ b/oRTP @@ -1 +1 @@ -Subproject commit cd468445a4f276f54ee9f9948712855f3cd1a0dc +Subproject commit cd3f64ec021534413f247b2f0185d9e934348529 diff --git a/tester/call_tester.c b/tester/call_tester.c index 9fe4c5913..ced4de373 100644 --- a/tester/call_tester.c +++ b/tester/call_tester.c @@ -3272,7 +3272,7 @@ static void call_with_in_dialog_codec_change_base(bool_t no_sdp) { 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))))); - wait_for_until(marie->lc, pauline->lc, &dummy, 1, 3000); + 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); From 338f0339b7554bb3b2e8a85472ea94f50f89cbc4 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Tue, 17 Feb 2015 23:48:10 +0100 Subject: [PATCH 34/90] restore correct version of ms2 and ortp after git bug --- mediastreamer2 | 2 +- oRTP | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mediastreamer2 b/mediastreamer2 index 7c9ff4ca0..acca89ed2 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 7c9ff4ca0e597cc36e1ddf14dacfb4bf7a239d74 +Subproject commit acca89ed2e726ac53eddce9ffbfd378ea0c9bf9f diff --git a/oRTP b/oRTP index cd468445a..cd3f64ec0 160000 --- a/oRTP +++ b/oRTP @@ -1 +1 @@ -Subproject commit cd468445a4f276f54ee9f9948712855f3cd1a0dc +Subproject commit cd3f64ec021534413f247b2f0185d9e934348529 From 56f89bbbaa20d5f911c631a6151beb74ab670539 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Wed, 18 Feb 2015 00:16:46 +0100 Subject: [PATCH 35/90] update ms2 and ortp. All multicast tests are passed on windows --- mediastreamer2 | 2 +- oRTP | 2 +- tester/multicast_call_tester.c | 9 --------- 3 files changed, 2 insertions(+), 11 deletions(-) diff --git a/mediastreamer2 b/mediastreamer2 index acca89ed2..d1684034e 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit acca89ed2e726ac53eddce9ffbfd378ea0c9bf9f +Subproject commit d1684034e44781ca71a107d7d2b6db626a3ab993 diff --git a/oRTP b/oRTP index cd3f64ec0..908c31ca7 160000 --- a/oRTP +++ b/oRTP @@ -1 +1 @@ -Subproject commit cd3f64ec021534413f247b2f0185d9e934348529 +Subproject commit 908c31ca7f5f251e7d2d3db0318a41ef4d66e1fb diff --git a/tester/multicast_call_tester.c b/tester/multicast_call_tester.c index 356cf3e74..e5a05c11e 100644 --- a/tester/multicast_call_tester.c +++ b/tester/multicast_call_tester.c @@ -96,15 +96,6 @@ static void early_media_with_multicast_base(bool_t video) { int begin; LinphoneVideoPolicy marie_policy, pauline_policy; LpConfig *marie_lp; - -#ifdef WIN32 - /* - * "Do not call IP_ADD_MEMBERSHIP with the same group more than once on the same network interface." - * https://msdn.microsoft.com/en-us/library/windows/desktop/ms739174%28v=vs.85%29.aspx - */ - ms_warning("Call forking with multicast can't be tested on windows, test skipped"); - return; -#endif belle_sip_object_enable_leak_detector(TRUE); begin=belle_sip_object_get_object_count(); From d69838771a0396c3b390e4768c8e5a717b9952af Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Wed, 18 Feb 2015 00:20:01 +0100 Subject: [PATCH 36/90] avoid unnecessary computations in call with file player --- tester/call_tester.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tester/call_tester.c b/tester/call_tester.c index ce68337aa..42068f327 100644 --- a/tester/call_tester.c +++ b/tester/call_tester.c @@ -2182,7 +2182,7 @@ static void call_with_file_player(void) { } /* 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,30000)); + CU_ASSERT_TRUE(wait_for_until(pauline->lc,marie->lc,&marie->stat.number_of_player_eof,1,23000)); /*just to sleep*/ linphone_core_terminate_all_calls(marie->lc); From d80ed0f2a3f1dba5014f98a683e61a721424b50f Mon Sep 17 00:00:00 2001 From: Margaux Clerc Date: Wed, 18 Feb 2015 10:51:05 +0100 Subject: [PATCH 37/90] Fix liblinphone tester --- 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 9f1ab7408..d62f055d8 100644 --- a/build/android/liblinphone_tester.mk +++ b/build/android/liblinphone_tester.mk @@ -37,10 +37,10 @@ LOCAL_MODULE_FILENAME := liblinphone_tester-$(TARGET_ARCH_ABI) LOCAL_SRC_FILES += $(common_SRC_FILES) LOCAL_C_INCLUDES = $(common_C_INCLUDES) LOCAL_CFLAGS = -DIN_LINPHONE -LOCAL_LDLIBS := -llog +LOCAL_LDLIBS := -llog -lz ifeq ($(BUILD_MATROSKA), 1) -LOCAL_CFLAGS += -DHAVE_MATROSKA +LOCAL_CFLAGS += -DHAVE_MATROSKA -DHAVE_ZLIB endif LOCAL_SHARED_LIBRARIES := cunit liblinphone From 35d9b8086c7915afd9308d103761bbc36cf94a02 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Wed, 18 Feb 2015 10:59:23 +0100 Subject: [PATCH 38/90] Updated oRTP and ms2 wp8 projects --- mediastreamer2 | 2 +- oRTP | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mediastreamer2 b/mediastreamer2 index d1684034e..7b759e6fc 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit d1684034e44781ca71a107d7d2b6db626a3ab993 +Subproject commit 7b759e6fcb38edb60b10aad3640cd933a2b9680e diff --git a/oRTP b/oRTP index 908c31ca7..fa091e035 160000 --- a/oRTP +++ b/oRTP @@ -1 +1 @@ -Subproject commit 908c31ca7f5f251e7d2d3db0318a41ef4d66e1fb +Subproject commit fa091e0350afaa2a26348ed0ca678135184d628c From 8a4b7272db11cd8fd0511b0cf3454d8beceecb0e Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Wed, 18 Feb 2015 11:44:05 +0100 Subject: [PATCH 39/90] Updated ms2 to fix crash on wp8 --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index 7b759e6fc..f029557ca 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 7b759e6fcb38edb60b10aad3640cd933a2b9680e +Subproject commit f029557ca053bc3571131f9dd186d0f355d8f143 From b0ba3b1f1df06b817e182ea094c0c6eef044497d Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Wed, 18 Feb 2015 13:45:22 +0100 Subject: [PATCH 40/90] Updated ms2 with fix for loading wp8 plugins --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index f029557ca..6924f3396 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit f029557ca053bc3571131f9dd186d0f355d8f143 +Subproject commit 6924f33961f54aa8ddb58a5cc0a0c8aaa624cdce From ec3e9365dd431725f80e4549bfa54eb869a0aeab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Grisez?= Date: Wed, 18 Feb 2015 13:39:15 +0100 Subject: [PATCH 41/90] Update changelog for release 3.8.0 --- NEWS | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS index dce0e0824..acdbf2e45 100644 --- a/NEWS +++ b/NEWS @@ -2,12 +2,26 @@ linphone-3.8.0 -- Date to be defined Application level improvements: * The video window has now controls in order to switch fullscreen mode and terminate call. * The out of call video preview feature (to test camera) is moved into the settings and is no longer linked to the in-call video preview feature. - * Lots of updated translations. + * Add an assistant to help users to set audio/video parameters + * Some ergonomics improvments (checkbox to set random port for UDP and TCP, ...) + * Lots of updated translations. Arabic translation has been added + * Experimental feature: play an MKV file by drag-and-dropping it on the video call window Liblinphone level improvements: - * Support for RTP/AVPF (RFCxxxx) for video streams, allowing fast transmission error recovery with VP8 codec only. + * Support for RTP/AVPF (RFC4585) for video streams, allowing fast transmission error recovery with VP8 codec only. * API enhancements, most objects can be ref-counted. + * Add some getter funtctions to the call information API + * Add a function in the API to accept early-media calls + * Add a function to set the SIP transport timeout + * Add a function to change adaptive rate algorithm at runtime + * Add support of file transfer * Call video recording feature, in mkv format (H264 streams only for the moment) + * Call playing feature: play an MKV file and send the audio/video stream through a call + * Local player API. Play WAV and MKV file and display video on a specified window display + * A wrapper for Python has been made + * Support of Wake Locks on Android + * Support of multicast IP addresses + * Support of incoming UPDATEs within dialog (RFC3311) * Support of SRTP by using packages from GNU/Linux distributions linphone-3.7.0 -- February 20th, 2014 From 209219b8cf06d82f49d48e3bb5924243e92bd71f Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Wed, 18 Feb 2015 14:21:30 +0100 Subject: [PATCH 42/90] Use false linphone_plugins_dir in wp8 to not load plugins twice --- build/wp8/LibLinphone.vcxproj | 4 ++-- build/wp8/LibLinphone_no_tunnel.vcxproj | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/build/wp8/LibLinphone.vcxproj b/build/wp8/LibLinphone.vcxproj index 7e692e325..93900b840 100644 --- a/build/wp8/LibLinphone.vcxproj +++ b/build/wp8/LibLinphone.vcxproj @@ -54,7 +54,7 @@ Level4 $(ProjectDir)..\..\..\belle-sip\include;$(ProjectDir)..\..\oRTP\include;$(ProjectDir)..\..\mediastreamer2\include;$(ProjectDir)..\..\..\tunnel\include;$(ProjectDir)..\..\coreapi;$(ProjectDir)..\..\include;$(SolutionDir)$(Platform)\$(Configuration)\include;$(ProjectDir)..\..\..\zlib;$(ProjectDir)..\..\..\sqlite\;$(ProjectDir);%(AdditionalIncludeDirectories) - __STDC_CONSTANT_MACROS;_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;_USRDLL;WINDOW_NATIVE;_TRUE_TIME;IN_LINPHONE;USE_BELLESIP;TUNNEL_ENABLED;VIDEO_ENABLED;LINPHONE_PACKAGE_NAME="linphone";LIBLINPHONE_EXPORTS;LINPHONE_PLUGINS_DIR=".";UNICODE;_XKEYCHECK_H;HAVE_ZLIB;HAVE_CONFIG_H;%(PreprocessorDefinitions) + __STDC_CONSTANT_MACROS;_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;_USRDLL;WINDOW_NATIVE;_TRUE_TIME;IN_LINPHONE;USE_BELLESIP;TUNNEL_ENABLED;VIDEO_ENABLED;LINPHONE_PACKAGE_NAME="linphone";LIBLINPHONE_EXPORTS;LINPHONE_PLUGINS_DIR="\\linphone\\plugins";UNICODE;_XKEYCHECK_H;HAVE_ZLIB;HAVE_CONFIG_H;%(PreprocessorDefinitions) Default NotUsing false @@ -220,4 +220,4 @@ - \ No newline at end of file + diff --git a/build/wp8/LibLinphone_no_tunnel.vcxproj b/build/wp8/LibLinphone_no_tunnel.vcxproj index 447253440..6d8167046 100644 --- a/build/wp8/LibLinphone_no_tunnel.vcxproj +++ b/build/wp8/LibLinphone_no_tunnel.vcxproj @@ -54,7 +54,7 @@ Level4 $(ProjectDir)..\..\..\belle-sip\include;$(ProjectDir)..\..\oRTP\include;$(ProjectDir)..\..\mediastreamer2\include;$(ProjectDir)..\..\..\tunnel\include;$(ProjectDir)..\..\coreapi;$(ProjectDir)..\..\include;$(SolutionDir)$(Platform)\$(Configuration)\include;$(ProjectDir)..\..\..\zlib;$(ProjectDir)..\..\..\sqlite\;$(ProjectDir);%(AdditionalIncludeDirectories) - __STDC_CONSTANT_MACROS;_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;_USRDLL;WINDOW_NATIVE;_TRUE_TIME;IN_LINPHONE;USE_BELLESIP;VIDEO_ENABLED;LINPHONE_PACKAGE_NAME="linphone";LIBLINPHONE_EXPORTS;LINPHONE_PLUGINS_DIR=".";UNICODE;_XKEYCHECK_H;HAVE_ZLIB;HAVE_CONFIG_H;%(PreprocessorDefinitions) + __STDC_CONSTANT_MACROS;_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;_USRDLL;WINDOW_NATIVE;_TRUE_TIME;IN_LINPHONE;USE_BELLESIP;VIDEO_ENABLED;LINPHONE_PACKAGE_NAME="linphone";LIBLINPHONE_EXPORTS;LINPHONE_PLUGINS_DIR="\\linphone\\plugins";UNICODE;_XKEYCHECK_H;HAVE_ZLIB;HAVE_CONFIG_H;%(PreprocessorDefinitions) Default NotUsing false @@ -216,4 +216,4 @@ - \ No newline at end of file + From 56e58d0cee2e970822ba460dc6f8f8c3936f4552 Mon Sep 17 00:00:00 2001 From: Guillaume BIENKOWSKI Date: Wed, 18 Feb 2015 14:52:34 +0100 Subject: [PATCH 43/90] Change the SDP removal mechanism for something a bit more tunable. There is now an "SDP handling mode": you can choose between normal, simulate removal of SDP or simulate SDP error. This allows for simulating 200 OK without SDP, for instance (a unit test is coming for this). --- coreapi/bellesip_sal/sal_impl.c | 6 ++-- coreapi/bellesip_sal/sal_impl.h | 6 ++-- coreapi/bellesip_sal/sal_op_call.c | 22 ++++++++++---- coreapi/bellesip_sal/sal_op_impl.c | 8 ++--- include/sal/sal.h | 22 +++++++++++--- tester/call_tester.c | 48 +++++++++++++++++------------- tester/liblinphone_tester.h | 9 +++--- 7 files changed, 76 insertions(+), 45 deletions(-) diff --git a/coreapi/bellesip_sal/sal_impl.c b/coreapi/bellesip_sal/sal_impl.c index 3b3c24955..9829d22b3 100644 --- a/coreapi/bellesip_sal/sal_impl.c +++ b/coreapi/bellesip_sal/sal_impl.c @@ -1149,7 +1149,7 @@ void sal_enable_sip_update_method(Sal *ctx,bool_t value) { ctx->enable_sip_update=value; } -void sal_default_enable_sdp_removal(Sal *sal, bool_t enable) { - if (enable) ms_message("Enabling SDP removal feature by default for all new SalOp in Sal[%p]!", sal); - sal->default_sdp_removal = enable; +void sal_default_set_sdp_handling(Sal *sal, SalOpSDPHandling sdp_handling_method) { + if (sdp_handling_method != SalOpSDPNormal ) ms_message("Enabling special SDP handling for all new SalOp in Sal[%p]!", sal); + sal->default_sdp_handling = sdp_handling_method; } diff --git a/coreapi/bellesip_sal/sal_impl.h b/coreapi/bellesip_sal/sal_impl.h index 21aeadc74..a2ec659f7 100644 --- a/coreapi/bellesip_sal/sal_impl.h +++ b/coreapi/bellesip_sal/sal_impl.h @@ -24,8 +24,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "belle-sip/belle-sip.h" #include "belle-sip/belle-sdp.h" - - struct Sal{ SalCallbacks callbacks; MSList *pending_auths;/*MSList of SalOp */ @@ -52,7 +50,7 @@ struct Sal{ bool_t enable_test_features; bool_t no_initial_route; bool_t enable_sip_update; /*true by default*/ - bool_t default_sdp_removal; + SalOpSDPHandling default_sdp_handling; }; typedef enum SalOpState { @@ -107,7 +105,7 @@ struct SalOp{ bool_t call_released; bool_t manual_refresher; bool_t has_auth_pending; - bool_t sdp_removal; /* do not add SDP in outgoing INVITE and remove it from incoming INVITE */ + SalOpSDPHandling sdp_handling; int auth_requests; /*number of auth requested for this op*/ }; diff --git a/coreapi/bellesip_sal/sal_op_call.c b/coreapi/bellesip_sal/sal_op_call.c index 7cf64947e..9b1bfeb5a 100644 --- a/coreapi/bellesip_sal/sal_op_call.c +++ b/coreapi/bellesip_sal/sal_op_call.c @@ -392,19 +392,23 @@ static int extract_sdp(SalOp *op, belle_sip_message_t* message,belle_sdp_session const char *body; belle_sip_header_content_type_t* content_type; - if (op&&op->sdp_removal){ - ms_error("Removed willingly SDP because sal_call_enable_sdp_removal was set to TRUE."); + if (op&&op->sdp_handling == SalOpSDPSimulateError){ + ms_error("Simulating SDP parsing error for op %p", op); *session_desc=NULL; *error=SalReasonNotAcceptable; return -1; + } else if( op && op->sdp_handling == SalOpSDPSimulateRemove){ + ms_error("Simulating no SDP for op %p", op); + *session_desc = NULL; + return 0; } - + body = belle_sip_message_get_body(message); if(body == NULL) { *session_desc = NULL; return 0; } - + content_type = belle_sip_message_get_header_by_type(message,belle_sip_header_content_type_t); if (content_type){ if (strcmp("application",belle_sip_header_content_type_get_type(content_type))==0 @@ -735,8 +739,14 @@ static void handle_offer_answer_response(SalOp* op, belle_sip_response_t* respon set_sdp_from_desc(BELLE_SIP_MESSAGE(response),op->base.local_media); }else{ - if (op->sdp_answer==NULL) - sdp_process(op); + if ( op->sdp_answer==NULL ) + { + if( op->sdp_handling == SalOpSDPSimulateRemove ){ + ms_warning("Simulating SDP removal in answer for op %p", op); + } else { + sdp_process(op); + } + } if (op->sdp_answer){ set_sdp(BELLE_SIP_MESSAGE(response),op->sdp_answer); diff --git a/coreapi/bellesip_sal/sal_op_impl.c b/coreapi/bellesip_sal/sal_op_impl.c index 5c953ffc5..bdd120ae9 100644 --- a/coreapi/bellesip_sal/sal_op_impl.c +++ b/coreapi/bellesip_sal/sal_op_impl.c @@ -25,7 +25,7 @@ SalOp * sal_op_new(Sal *sal){ op->type=SalOpUnknown; op->privacy=SalPrivacyNone; op->manual_refresher=FALSE;/*tells that requests with expiry (SUBSCRIBE, PUBLISH) will be automatically refreshed*/ - op->sdp_removal=sal->default_sdp_removal; + op->sdp_handling=sal->default_sdp_handling; sal_op_ref(op); return op; } @@ -799,7 +799,7 @@ void sal_op_stop_refreshing(SalOp *op){ } } -void sal_call_enable_sdp_removal(SalOp *h, bool_t enable) { - if (enable) ms_message("Enabling SDP removal feature for SalOp[%p]!", h); - h->sdp_removal = enable; +void sal_call_set_sdp_handling(SalOp *h, SalOpSDPHandling handling) { + if (handling != SalOpSDPNormal) ms_message("Enabling special SDP handling for SalOp[%p]!", h); + h->sdp_handling = handling; } diff --git a/include/sal/sal.h b/include/sal/sal.h index 0b7775b9b..e1a0c3e66 100644 --- a/include/sal/sal.h +++ b/include/sal/sal.h @@ -203,6 +203,11 @@ typedef enum { SalMulticastSenderReceiver } SalMulticastRole; +typedef enum { + SalOpSDPNormal = 0, /** No special handling for SDP */ + SalOpSDPSimulateError, /** Will simulate an SDP parsing error */ + SalOpSDPSimulateRemove /** Will simulate no SDP in the op */ +} SalOpSDPHandling; typedef struct SalStreamDescription{ char name[16]; /*unique name of stream, in order to ease offer/answer model algorithm*/ @@ -682,11 +687,20 @@ void sal_call_send_vfu_request(SalOp *h); int sal_call_is_offerer(const SalOp *h); int sal_call_notify_refer_state(SalOp *h, SalOp *newcall); /* Call test API */ -/*willingly fails to parse SDP from received packets (INVITE and/or ACK) if value=true */ -/* First version: for all new SalOp created (eg. each incoming or outgoing call). Do not forget to reset previous value when you are done!*/ -void sal_default_enable_sdp_removal(Sal* h, bool_t enable) ; + + +/** + * @brief Invoking this on the SAL will modify every subsequent SalOp to have a special handling for SDP. + * @details This is especially useful while testing, to simulate some specific behaviors, like missing SDP or an error in parsing. + * + * @warning Don't forget to reset the handling method to SalOpSDPNormal afterwards. + * + * @param h the Sal instance + * @param handling_method Could be SalOpSDPNormal, SalOpSDPSimulateError, SalOpSDPSimulateRemoval (\ref SalOpSDPHandling) + */ +void sal_default_set_sdp_handling(Sal* h, SalOpSDPHandling handling_method) ; /* Second version: for a specific call*/ -void sal_call_enable_sdp_removal(SalOp *h, bool_t enable) ; +void sal_call_set_sdp_handling(SalOp *h, SalOpSDPHandling handling) ; /*Registration*/ int sal_register(SalOp *op, const char *proxy, const char *from, int expires); diff --git a/tester/call_tester.c b/tester/call_tester.c index 42068f327..2d1e93e1d 100644 --- a/tester/call_tester.c +++ b/tester/call_tester.c @@ -178,6 +178,14 @@ void liblinphone_tester_check_rtcp(LinphoneCoreManager* caller, LinphoneCoreMana linphone_call_unref(c2); } +static void setup_sdp_handling(const LinphoneCallTestParams* params, LinphoneCoreManager* mgr ){ + if( params->sdp_removal ){ + sal_default_set_sdp_handling(mgr->lc->sal, SalOpSDPSimulateRemove); + } else if( params->sdp_simulate_error ){ + sal_default_set_sdp_handling(mgr->lc->sal, SalOpSDPSimulateError); + } +} + bool_t call_with_params2(LinphoneCoreManager* caller_mgr ,LinphoneCoreManager* callee_mgr , const LinphoneCallTestParams *caller_test_params @@ -189,10 +197,10 @@ bool_t call_with_params2(LinphoneCoreManager* caller_mgr bool_t result=FALSE; LinphoneCallParams *caller_params = caller_test_params->base; LinphoneCallParams *callee_params = callee_test_params->base; - bool_t did_received_call; + bool_t did_receive_call; - sal_default_enable_sdp_removal(caller_mgr->lc->sal, caller_test_params->sdp_removal); - sal_default_enable_sdp_removal(callee_mgr->lc->sal, callee_test_params->sdp_removal); + setup_sdp_handling(caller_test_params, 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)); @@ -200,16 +208,16 @@ bool_t call_with_params2(LinphoneCoreManager* caller_mgr CU_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 + 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_received_call, !callee_test_params->sdp_removal); + CU_ASSERT_EQUAL(did_receive_call, !callee_test_params->sdp_simulate_error); - sal_default_enable_sdp_removal(caller_mgr->lc->sal, FALSE); - sal_default_enable_sdp_removal(callee_mgr->lc->sal, FALSE); + sal_default_set_sdp_handling(caller_mgr->lc->sal, SalOpSDPNormal); + sal_default_set_sdp_handling(callee_mgr->lc->sal, SalOpSDPNormal); - if (!did_received_call) return 0; + if (!did_receive_call) return 0; CU_ASSERT_TRUE(linphone_core_inc_invite_pending(callee_mgr->lc)); @@ -913,7 +921,7 @@ static void call_with_no_sdp_ack_without_sdp(void){ CU_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_enable_sdp_removal(call->op, TRUE); /*this will have the effect that the SDP received in the ACK will be ignored*/ + sal_call_set_sdp_handling(call->op, SalOpSDPSimulateRemove); /*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)); @@ -3371,7 +3379,7 @@ static void incoming_invite_without_sdp() { LinphoneCoreManager* callee = linphone_core_manager_new( "marie_rc"); LinphoneCallTestParams caller_test_params = {0}, callee_test_params = {0}; - callee_test_params.sdp_removal = TRUE; + callee_test_params.sdp_simulate_error = TRUE; CU_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)); @@ -3388,7 +3396,7 @@ static void outgoing_invite_without_sdp() { LinphoneCoreManager* callee = linphone_core_manager_new( "marie_rc"); LinphoneCallTestParams caller_test_params = {0}, callee_test_params = {0}; - caller_test_params.sdp_removal = TRUE; + caller_test_params.sdp_simulate_error = TRUE; CU_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)); @@ -3415,8 +3423,8 @@ static void incoming_reinvite_without_ack_sdp() { const LinphoneCallParams *caller_params; stats initial_caller_stat=caller->stat; stats initial_callee_stat=callee->stat; - sal_call_enable_sdp_removal(inc_call->op, TRUE); - CU_ASSERT_PTR_NOT_NULL(setup_video(caller, callee)); + sal_call_set_sdp_handling(inc_call->op, SalOpSDPSimulateRemove); /*this will have the effect that the SDP received in the ACK will be ignored*/ + CU_ASSERT_PTR_NOT_NULL(setup_video(caller, callee)); 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)); @@ -3431,7 +3439,7 @@ static void incoming_reinvite_without_ack_sdp() { 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)); - sal_call_enable_sdp_removal(inc_call->op, 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)); @@ -3456,8 +3464,8 @@ static void outgoing_reinvite_without_ack_sdp() { if (out_call) { stats initial_caller_stat=caller->stat; stats initial_callee_stat=callee->stat; - sal_call_enable_sdp_removal(out_call->op, TRUE); - CU_ASSERT_PTR_NOT_NULL(setup_video(caller, callee)); + sal_call_set_sdp_handling(out_call->op, SalOpSDPSimulateRemove); /*this will have the effect that the SDP received in the ACK will be ignored*/ + CU_ASSERT_PTR_NOT_NULL(setup_video(caller, callee)); 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)); @@ -3470,7 +3478,7 @@ static void outgoing_reinvite_without_ack_sdp() { 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)))); - sal_call_enable_sdp_removal(out_call->op, FALSE); + 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)); @@ -3576,18 +3584,18 @@ static void call_with_generic_cn(void) { CU_ASSERT_TRUE(rtps->packet_recv<=300 && rtps->packet_recv>=200); } end_call(marie,pauline); - + if (pauline_call){ struct stat stbuf; int err; - + err=stat(recorded_file,&stbuf); CU_ASSERT_EQUAL(err, 0); if (err==0){ CU_ASSERT_TRUE(stbuf.st_size>120000); } } - + linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); diff --git a/tester/liblinphone_tester.h b/tester/liblinphone_tester.h index 22dbcd6f6..c25f61d6c 100644 --- a/tester/liblinphone_tester.h +++ b/tester/liblinphone_tester.h @@ -93,12 +93,12 @@ extern const char* liblinphone_tester_get_xml_output(void); /** * @brief Tells the tester whether or not to clean the accounts it has created between runs. * @details Setting this to 1 will not clear the list of created accounts between successive - * calls to liblinphone_run_tests(). Some testing APIs call this function for *each* test, + * calls to liblinphone_run_tests(). Some testing APIs call this function for *each* test, * in which case we should keep the accounts that were created for further testing. - * - * You are supposed to manually call liblinphone_tester_clear_account when all the tests are + * + * You are supposed to manually call liblinphone_tester_clear_account when all the tests are * finished. - * + * * @param keep 1 to keep the accounts in-between runs, 0 to clear them after each run. */ extern void liblinphone_tester_keep_accounts( int keep ); @@ -255,6 +255,7 @@ typedef struct _LinphoneCoreManager { typedef struct _LinphoneCallTestParams { LinphoneCallParams *base; bool_t sdp_removal; + bool_t sdp_simulate_error; } LinphoneCallTestParams; LinphoneCoreManager* linphone_core_manager_new2(const char* rc_file, int check_for_proxies); From 93486c97e019fc79699cd158a03f2092d65b7dc5 Mon Sep 17 00:00:00 2001 From: Guillaume BIENKOWSKI Date: Wed, 18 Feb 2015 14:52:54 +0100 Subject: [PATCH 44/90] Cosmetics --- coreapi/bellesip_sal/sal_op_call.c | 2 +- include/sal/sal.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/coreapi/bellesip_sal/sal_op_call.c b/coreapi/bellesip_sal/sal_op_call.c index 9b1bfeb5a..428c27bff 100644 --- a/coreapi/bellesip_sal/sal_op_call.c +++ b/coreapi/bellesip_sal/sal_op_call.c @@ -94,7 +94,7 @@ static int set_sdp(belle_sip_message_t *msg,belle_sdp_session_description_t* ses /* try to marshal the description. This could go higher than 2k so we iterate */ while( error != BELLE_SIP_OK && bufLen <= hardlimit && buff != NULL){ - error = belle_sip_object_marshal(BELLE_SIP_OBJECT(session_desc),buff,bufLen,&length); + error = belle_sip_object_marshal(BELLE_SIP_OBJECT(session_desc),buff,bufLen,&length); if( error != BELLE_SIP_OK ){ bufLen *= 2; length = 0; diff --git a/include/sal/sal.h b/include/sal/sal.h index e1a0c3e66..7d0ae1eb7 100644 --- a/include/sal/sal.h +++ b/include/sal/sal.h @@ -556,7 +556,7 @@ void sal_signing_key_parse_file(SalAuthInfo* auth_info, const char* path, const * @param[in] generate_certificate if true, if matching certificate and key can't be found, generate it and store it into the given dir, filename will be subject.pem * @param[in] generate_dtls_fingerprint if true and we have a certificate, generate the dtls fingerprint as described in rfc4572 */ -void sal_certificates_chain_parse_directory(char **certificate_pem, char **key_pem, char **fingerprint, const char* path, const char *subject, SalCertificateRawFormat format, bool_t generate_certificate, bool_t generate_dtls_fingerprint); +void sal_certificates_chain_parse_directory(char **certificate_pem, char **key_pem, char **fingerprint, const char* path, const char *subject, SalCertificateRawFormat format, bool_t generate_certificate, bool_t generate_dtls_fingerprint); void sal_certificates_chain_delete(SalCertificatesChain *chain); void sal_signing_key_delete(SalSigningKey *key); @@ -824,7 +824,7 @@ int sal_lines_get_value(const char *data, const char *key, char *value, size_t v belle_sip_stack_t *sal_get_belle_sip_stack(Sal *sal); char* sal_op_get_public_uri(SalOp *sal); -unsigned long sal_begin_background_task(const char *name, void (*max_time_reached)(void *), void *data); +unsigned long sal_begin_background_task(const char *name, void (*max_time_reached)(void *), void *data); void sal_end_background_task(unsigned long id); #endif From a971445719530f649533c7091e62d0bdcf4b0c80 Mon Sep 17 00:00:00 2001 From: Guillaume BIENKOWSKI Date: Wed, 18 Feb 2015 14:53:48 +0100 Subject: [PATCH 45/90] Fix problem with missing SDP in 200 OK when the call is in early-media. We should recover correctly, we were not. Also introduced the corresponding unit test. --- coreapi/callbacks.c | 8 +++++ tester/call_tester.c | 72 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+) diff --git a/coreapi/callbacks.c b/coreapi/callbacks.c index 7e0254b99..7de84e19f 100644 --- a/coreapi/callbacks.c +++ b/coreapi/callbacks.c @@ -494,6 +494,14 @@ static void call_accepted(SalOp *op){ break; } + if( (call->prevstate == LinphoneCallOutgoingEarlyMedia) && (md == NULL || sal_media_description_empty(md)) ){ + /* media description is null or empty because no SDP was received in the 200 OK, we can possibly use the early-media SDP. */ + if( call->resultdesc != NULL){ + ms_message("Using early media SDP since none were received with the 200 OK"); + md = call->resultdesc; + } + } + if (md && !sal_media_description_empty(md) && !linphone_core_incompatible_security(lc,md)){ linphone_call_update_remote_session_id_and_ver(call); if (sal_media_description_has_dir(md,SalStreamSendOnly) || diff --git a/tester/call_tester.c b/tester/call_tester.c index 2d1e93e1d..3fcf3da1a 100644 --- a/tester/call_tester.c +++ b/tester/call_tester.c @@ -3549,6 +3549,77 @@ static void call_with_paused_no_sdp_on_resume() { } } + +static void call_with_183_and_no_sdp_in_200(){ +LinphoneCoreManager* marie = linphone_core_manager_new("marie_rc"); + LinphoneCoreManager* pauline = linphone_core_manager_new("pauline_rc"); + MSList* lcs = NULL; + LinphoneCall* marie_call; + LinphoneCallParams* params = NULL; + LinphoneCallLog *marie_call_log; + uint64_t connected_time=0; + uint64_t ended_time=0; + int dummy=0; + + lcs = ms_list_append(lcs,marie->lc); + lcs = ms_list_append(lcs,pauline->lc); + /* + Marie calls Pauline, and after the call has rung, transitions to an early_media session + */ + params = linphone_core_create_default_call_parameters(marie->lc); + linphone_call_params_enable_video(params, TRUE); + + 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, FALSE); + + 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)); + + if (linphone_core_inc_invite_pending(pauline->lc)) { + LinphoneCall* pauline_call = linphone_core_get_current_call(pauline->lc); + + /* 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) ); + + liblinphone_tester_check_rtcp(marie, pauline); + + // will send the 200OK _without_ SDP + 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)); + connected_time=ms_get_cur_time_ms(); + CU_ASSERT_TRUE(wait_for_list(lcs, &marie->stat.number_of_LinphoneCallStreamsRunning, 1,3000)); + + ms_error("Streams running= %d", marie->stat.number_of_LinphoneCallStreamsRunning); + + CU_ASSERT_EQUAL(marie_call, linphone_core_get_current_call(marie->lc)); + + liblinphone_tester_check_rtcp(marie, pauline); + /*just to have a call duration !=0*/ + wait_for_list(lcs,&dummy,1,2000); + + 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)); + 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 ); + ms_list_free(lcs); + } + + linphone_core_manager_destroy(marie); + linphone_core_manager_destroy(pauline); +} + static void call_with_generic_cn(void) { int begin; int leaked_objects; @@ -3704,6 +3775,7 @@ test_t call_tests[] = { { "Call with in-dialog codec change", call_with_in_dialog_codec_change }, { "Call with in-dialog codec change no sdp", call_with_in_dialog_codec_change_no_sdp }, { "Call with pause no SDP on resume", call_with_paused_no_sdp_on_resume }, + { "Call with 183 and no SDP on 200", call_with_183_and_no_sdp_in_200 }, { "Call with custom supported tags", call_with_custom_supported_tags }, { "Call log from taken from asserted id",call_log_from_taken_from_p_asserted_id}, { "Incoming INVITE without SDP",incoming_invite_without_sdp}, From 7fef3b08f75f132b0a9a225ca21b5944bd2106ce Mon Sep 17 00:00:00 2001 From: Guillaume BIENKOWSKI Date: Wed, 18 Feb 2015 15:10:24 +0100 Subject: [PATCH 46/90] Rename and fix "no SDP" tests --- tester/call_tester.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/tester/call_tester.c b/tester/call_tester.c index 3fcf3da1a..95aca9d45 100644 --- a/tester/call_tester.c +++ b/tester/call_tester.c @@ -921,7 +921,7 @@ static void call_with_no_sdp_ack_without_sdp(void){ CU_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, SalOpSDPSimulateRemove); /*this will have the effect that the SDP received in the ACK will be ignored*/ + 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)); @@ -3374,7 +3374,7 @@ static void call_log_from_taken_from_p_asserted_id(void) { linphone_core_manager_destroy(pauline); } -static void incoming_invite_without_sdp() { +static void incoming_invite_with_invalid_sdp() { LinphoneCoreManager* caller = linphone_core_manager_new( "pauline_rc"); LinphoneCoreManager* callee = linphone_core_manager_new( "marie_rc"); LinphoneCallTestParams caller_test_params = {0}, callee_test_params = {0}; @@ -3391,7 +3391,7 @@ static void incoming_invite_without_sdp() { linphone_core_manager_destroy(caller); } -static void outgoing_invite_without_sdp() { +static void outgoing_invite_with_invalid_sdp() { LinphoneCoreManager* caller = linphone_core_manager_new( "pauline_rc"); LinphoneCoreManager* callee = linphone_core_manager_new( "marie_rc"); LinphoneCallTestParams caller_test_params = {0}, callee_test_params = {0}; @@ -3410,7 +3410,7 @@ static void outgoing_invite_without_sdp() { linphone_core_manager_destroy(caller); } -static void incoming_reinvite_without_ack_sdp() { +static void incoming_reinvite_with_invalid_ack_sdp(){ #ifdef VIDEO_ENABLED LinphoneCoreManager* caller = linphone_core_manager_new( "pauline_rc"); LinphoneCoreManager* callee = linphone_core_manager_new( "marie_rc"); @@ -3423,7 +3423,7 @@ static void incoming_reinvite_without_ack_sdp() { const LinphoneCallParams *caller_params; stats initial_caller_stat=caller->stat; stats initial_callee_stat=callee->stat; - sal_call_set_sdp_handling(inc_call->op, SalOpSDPSimulateRemove); /*this will have the effect that the SDP received in the ACK will be ignored*/ + 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_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)); @@ -3452,7 +3452,7 @@ static void incoming_reinvite_without_ack_sdp() { #endif } -static void outgoing_reinvite_without_ack_sdp() { +static void outgoing_reinvite_with_invalid_ack_sdp() { #ifdef VIDEO_ENABLED LinphoneCoreManager* caller = linphone_core_manager_new( "pauline_rc"); LinphoneCoreManager* callee = linphone_core_manager_new( "marie_rc"); @@ -3464,7 +3464,7 @@ static void outgoing_reinvite_without_ack_sdp() { if (out_call) { stats initial_caller_stat=caller->stat; stats initial_callee_stat=callee->stat; - sal_call_set_sdp_handling(out_call->op, SalOpSDPSimulateRemove); /*this will have the effect that the SDP received in the ACK will be ignored*/ + 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_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)); @@ -3778,10 +3778,10 @@ test_t call_tests[] = { { "Call with 183 and no SDP on 200", call_with_183_and_no_sdp_in_200 }, { "Call with custom supported tags", call_with_custom_supported_tags }, { "Call log from taken from asserted id",call_log_from_taken_from_p_asserted_id}, - { "Incoming INVITE without SDP",incoming_invite_without_sdp}, - { "Outgoing INVITE without ACK SDP",outgoing_invite_without_sdp}, - { "Incoming REINVITE without SDP",incoming_reinvite_without_ack_sdp}, - { "Outgoing REINVITE without ACK SDP",outgoing_reinvite_without_ack_sdp}, + { "Incoming INVITE with invalid SDP",incoming_invite_with_invalid_sdp}, + { "Outgoing INVITE with invalid ACK SDP",outgoing_invite_with_invalid_sdp}, + { "Incoming REINVITE with invalid SDP in ACK",incoming_reinvite_with_invalid_ack_sdp}, + { "Outgoing REINVITE with invalid SDP in ACK",outgoing_reinvite_with_invalid_ack_sdp}, { "Call with generic CN", call_with_generic_cn } }; From 229f662b9f0404d2f5f6acf8fc572e9e4315cb08 Mon Sep 17 00:00:00 2001 From: Guillaume BIENKOWSKI Date: Wed, 18 Feb 2015 15:10:43 +0100 Subject: [PATCH 47/90] Rename test for early media without SDP in 200 Ok --- tester/call_tester.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tester/call_tester.c b/tester/call_tester.c index 95aca9d45..644727618 100644 --- a/tester/call_tester.c +++ b/tester/call_tester.c @@ -3550,7 +3550,7 @@ static void call_with_paused_no_sdp_on_resume() { } -static void call_with_183_and_no_sdp_in_200(){ +static void call_with_early_media_and_no_sdp_in_200(){ LinphoneCoreManager* marie = linphone_core_manager_new("marie_rc"); LinphoneCoreManager* pauline = linphone_core_manager_new("pauline_rc"); MSList* lcs = NULL; @@ -3591,7 +3591,7 @@ LinphoneCoreManager* marie = linphone_core_manager_new("marie_rc"); liblinphone_tester_check_rtcp(marie, pauline); - // will send the 200OK _without_ SDP + /* will send the 200OK _without_ SDP. We expect the early-media SDP to be used instead */ sal_call_set_sdp_handling(pauline_call->op, SalOpSDPSimulateRemove); linphone_core_accept_call(pauline->lc, pauline_call); @@ -3775,7 +3775,7 @@ test_t call_tests[] = { { "Call with in-dialog codec change", call_with_in_dialog_codec_change }, { "Call with in-dialog codec change no sdp", call_with_in_dialog_codec_change_no_sdp }, { "Call with pause no SDP on resume", call_with_paused_no_sdp_on_resume }, - { "Call with 183 and no SDP on 200", call_with_183_and_no_sdp_in_200 }, + { "Call with early media and no SDP on 200 Ok", call_with_early_media_and_no_sdp_in_200 }, { "Call with custom supported tags", call_with_custom_supported_tags }, { "Call log from taken from asserted id",call_log_from_taken_from_p_asserted_id}, { "Incoming INVITE with invalid SDP",incoming_invite_with_invalid_sdp}, From 5c8e2ad4ca4caa5d242c4bf61a859b857b6e0f92 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Wed, 18 Feb 2015 15:36:10 +0100 Subject: [PATCH 48/90] Document linphone_call_get_core() function. --- coreapi/linphonecore.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/coreapi/linphonecore.h b/coreapi/linphonecore.h index a909bb644..7e3994706 100644 --- a/coreapi/linphonecore.h +++ b/coreapi/linphonecore.h @@ -676,7 +676,14 @@ LINPHONE_PUBLIC void *linphone_call_get_user_data(const LinphoneCall *call); **/ LINPHONE_PUBLIC void linphone_call_set_user_data(LinphoneCall *call, void *ud); +/** + * Get the core that has created the specified call. + * @param[in] call LinphoneCall object + * @return The LinphoneCore object that has created the specified call. + * @ingroup call_control + */ LINPHONE_PUBLIC LinphoneCore *linphone_call_get_core(const LinphoneCall *call); + LINPHONE_PUBLIC LinphoneCallState linphone_call_get_state(const LinphoneCall *call); LINPHONE_PUBLIC bool_t linphone_call_asked_to_autoanswer(LinphoneCall *call); From dad967eac82a72c0b180f2b2e190add5af69faab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Grisez?= Date: Wed, 18 Feb 2015 15:47:19 +0100 Subject: [PATCH 49/90] Display the liblinphone core version instead of linphone version in the about dialog --- gtk/main.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/gtk/main.c b/gtk/main.c index 8162927fa..b59c3ea3b 100644 --- a/gtk/main.c +++ b/gtk/main.c @@ -49,6 +49,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #endif +#include "coreapi/liblinphone_gitversion.h" + const char *this_program_ident_string="linphone_ident_string=" LINPHONE_VERSION; @@ -561,7 +563,7 @@ void linphone_gtk_show_about(){ } g_free(license); } - gtk_about_dialog_set_version(GTK_ABOUT_DIALOG(about),LINPHONE_VERSION); + 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); From 55d666da49c65b7afdce2b1a4917a783c28edb30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Grisez?= Date: Wed, 18 Feb 2015 15:48:17 +0100 Subject: [PATCH 50/90] Transparent background for the linphone banner --- pixmaps/linphone-banner.png | Bin 9187 -> 8708 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/pixmaps/linphone-banner.png b/pixmaps/linphone-banner.png index 0abff3ebfed30f2189dc1459c62c0785f950e565..6fe99ab776cc3efb84701439fd675e049a376cfe 100644 GIT binary patch literal 8708 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 From 23ba230da6b2c84160b79aa3f4fc5e2dbdf2834e Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Wed, 18 Feb 2015 16:59:10 +0100 Subject: [PATCH 51/90] Implement cancellation of file transfer for chat messages. --- coreapi/chat.c | 62 ++++++++++++++++++++++---------------------------- 1 file changed, 27 insertions(+), 35 deletions(-) diff --git a/coreapi/chat.c b/coreapi/chat.c index 72660e011..8d987417c 100644 --- a/coreapi/chat.c +++ b/coreapi/chat.c @@ -281,7 +281,6 @@ static void linphone_chat_message_process_response_from_post_file(void *data, co belle_http_request_listener_callbacks_t cbs={0}; belle_http_request_listener_t *l; belle_generic_uri_t *uri; - belle_http_request_t *req; belle_sip_multipart_body_handler_t *bh; char* ua; char *first_part_header; @@ -311,26 +310,24 @@ static void linphone_chat_message_process_response_from_post_file(void *data, co /* create the http request: do not include the message header at this point, it is done by bellesip when setting the multipart body handler in the message */ ua = ms_strdup_printf("%s/%s", linphone_core_get_user_agent_name(), linphone_core_get_user_agent_version()); uri=belle_generic_uri_parse(linphone_core_get_file_transfer_server(msg->chat_room->lc)); - req=belle_http_request_create("POST", + if (msg->http_request) belle_sip_object_unref(msg->http_request); + msg->http_request=belle_http_request_create("POST", uri, belle_sip_header_create("User-Agent",ua), NULL); + belle_sip_object_ref(msg->http_request); /* keep a reference to the http request to be able to cancel it during upload */ ms_free(ua); - belle_sip_message_set_body_handler(BELLE_SIP_MESSAGE(req),BELLE_SIP_BODY_HANDLER(bh)); + belle_sip_message_set_body_handler(BELLE_SIP_MESSAGE(msg->http_request),BELLE_SIP_BODY_HANDLER(bh)); cbs.process_response=linphone_chat_message_process_response_from_post_file; cbs.process_io_error=process_io_error_upload; cbs.process_auth_requested=process_auth_requested_upload; l=belle_http_request_listener_create_from_callbacks(&cbs,msg); - msg->http_request=req; /* update the reference to the http request to be able to cancel it during upload */ - belle_http_provider_send_request(msg->chat_room->lc->http_provider,req,l); + belle_http_provider_send_request(msg->chat_room->lc->http_provider,msg->http_request,l); } if (code == 200 ) { /* file has been uploaded correctly, get server reply and send it */ - const char *body; - /* TODO Check that the transfer has not been cancelled, note this shall be removed once the belle sip API will provide a cancel request as we shall never reach this part if the transfer is actually cancelled */ - if (msg->http_request == NULL) { - return; - } - body = belle_sip_message_get_body((belle_sip_message_t *)event->response); + const char *body = belle_sip_message_get_body((belle_sip_message_t *)event->response); + belle_sip_object_unref(msg->http_request); + msg->http_request = NULL; msg->message = ms_strdup(body); msg->content_type = ms_strdup("application/vnd.gsma.rcs-ft-http+xml"); if (msg->cb) { @@ -588,7 +585,6 @@ static void _linphone_chat_room_send_message(LinphoneChatRoom *cr, LinphoneChatM belle_http_request_listener_callbacks_t cbs={0}; belle_http_request_listener_t *l; belle_generic_uri_t *uri; - belle_http_request_t *req; const char *transfer_server = linphone_core_get_file_transfer_server(cr->lc); if (transfer_server == NULL) { @@ -597,17 +593,17 @@ static void _linphone_chat_room_send_message(LinphoneChatRoom *cr, LinphoneChatM } uri=belle_generic_uri_parse(transfer_server); - req=belle_http_request_create("POST", + msg->http_request=belle_http_request_create("POST", uri, NULL, NULL, NULL); + belle_sip_object_ref(msg->http_request); /* keep a reference on the request to be able to cancel it */ cbs.process_response=linphone_chat_message_process_response_from_post_file; cbs.process_io_error=process_io_error_upload; cbs.process_auth_requested=process_auth_requested_upload; l=belle_http_request_listener_create_from_callbacks(&cbs,msg); /* give msg to listener to be able to start the actual file upload when server answer a 204 No content */ - msg->http_request = req; /* keep a reference on the request to be able to cancel it */ - belle_http_provider_send_request(cr->lc->http_provider,req,l); + belle_http_provider_send_request(cr->lc->http_provider,msg->http_request,l); linphone_chat_message_unref(msg); return; } @@ -1216,10 +1212,7 @@ const LinphoneContent *linphone_chat_message_get_file_transfer_information(const static void on_recv_body(belle_sip_user_body_handler_t *bh, belle_sip_message_t *msg, void *data, size_t offset, const uint8_t *buffer, size_t size){ LinphoneChatMessage* chatMsg=(LinphoneChatMessage *)data; LinphoneCore *lc = chatMsg->chat_room->lc; - /* TODO: while belle sip doesn't implement the cancel http request method, test if a request is still linked to the message before forwarding the data to callback */ - if (chatMsg->http_request == NULL) { - return; - } + if (linphone_chat_message_cbs_get_file_transfer_recv(chatMsg->callbacks)) { LinphoneBuffer *lb = linphone_buffer_new_from_data(buffer, size); linphone_chat_message_cbs_get_file_transfer_recv(chatMsg->callbacks)(chatMsg, chatMsg->file_transfer_information, lb); @@ -1228,7 +1221,6 @@ static void on_recv_body(belle_sip_user_body_handler_t *bh, belle_sip_message_t /* Legacy: call back given by application level */ linphone_core_notify_file_transfer_recv(lc, chatMsg, chatMsg->file_transfer_information, (char *)buffer, size); } - return; } @@ -1323,17 +1315,16 @@ void linphone_chat_message_download_file(LinphoneChatMessage *message) { belle_http_request_listener_callbacks_t cbs={0}; belle_http_request_listener_t *l; belle_generic_uri_t *uri; - belle_http_request_t *req; const char *url=message->external_body_url; char* ua = ms_strdup_printf("%s/%s", linphone_core_get_user_agent_name(), linphone_core_get_user_agent_version()); uri=belle_generic_uri_parse(url); - req=belle_http_request_create("GET", + message->http_request=belle_http_request_create("GET", uri, belle_sip_header_create("User-Agent",ua), NULL); - + belle_sip_object_ref(message->http_request); /* keep a reference on the request to be able to cancel the download */ ms_free(ua); cbs.process_response_headers=linphone_chat_process_response_headers_from_get_file; @@ -1341,10 +1332,9 @@ void linphone_chat_message_download_file(LinphoneChatMessage *message) { cbs.process_io_error=process_io_error_download; cbs.process_auth_requested=process_auth_requested_download; l=belle_http_request_listener_create_from_callbacks(&cbs, (void *)message); - belle_sip_object_data_set(BELLE_SIP_OBJECT(req),"message",(void *)message,NULL); - message->http_request = req; /* keep a reference on the request to be able to cancel the download */ + belle_sip_object_data_set(BELLE_SIP_OBJECT(message->http_request),"message",(void *)message,NULL); message->state = LinphoneChatMessageStateInProgress; /* start the download, status is In Progress */ - belle_http_provider_send_request(message->chat_room->lc->http_provider,req,l); + belle_http_provider_send_request(message->chat_room->lc->http_provider,message->http_request,l); } /** @@ -1365,15 +1355,17 @@ void linphone_chat_message_start_file_download(LinphoneChatMessage *message, Lin * @param msg #LinphoneChatMessage */ void linphone_chat_message_cancel_file_transfer(LinphoneChatMessage *msg) { - ms_message("Cancelled file transfer %s - msg [%p] chat room[%p]", (msg->external_body_url==NULL)?linphone_core_get_file_transfer_server(msg->chat_room->lc):msg->external_body_url, msg, msg->chat_room); - /* TODO: here we shall call the cancel http request from bellesip API when it is available passing msg->http_request */ - /* waiting for this API, just set to NULL the reference to the request in the message and any request */ - msg->http_request = NULL; - if (msg->cb) { - msg->cb(msg, LinphoneChatMessageStateNotDelivered, msg->cb_ud); - } - if (linphone_chat_message_cbs_get_msg_state_changed(msg->callbacks)) { - linphone_chat_message_cbs_get_msg_state_changed(msg->callbacks)(msg, LinphoneChatMessageStateNotDelivered); + if (!belle_http_request_is_cancelled(msg->http_request)) { + ms_message("Cancelled file transfer %s - msg [%p] chat room[%p]", (msg->external_body_url==NULL)?linphone_core_get_file_transfer_server(msg->chat_room->lc):msg->external_body_url, msg, msg->chat_room); + belle_http_provider_cancel_request(msg->chat_room->lc->http_provider, msg->http_request); + belle_sip_object_unref(msg->http_request); + msg->http_request = NULL; + if (msg->cb) { + msg->cb(msg, LinphoneChatMessageStateNotDelivered, msg->cb_ud); + } + if (linphone_chat_message_cbs_get_msg_state_changed(msg->callbacks)) { + linphone_chat_message_cbs_get_msg_state_changed(msg->callbacks)(msg, LinphoneChatMessageStateNotDelivered); + } } } From 20a5c21ee7649e5416fcb7a15cb2e9cc07ba5a3a Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Wed, 18 Feb 2015 17:49:33 +0100 Subject: [PATCH 52/90] Fix memory leak of some strings extracted from XML documents. --- coreapi/chat.c | 4 ++++ coreapi/presence.c | 14 +++++--------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/coreapi/chat.c b/coreapi/chat.c index 8d987417c..269af03e6 100644 --- a/coreapi/chat.c +++ b/coreapi/chat.c @@ -845,6 +845,10 @@ static void process_im_is_composing_notification(LinphoneChatRoom *cr, xmlparsin cr->remote_is_composing = state; linphone_core_notify_is_composing_received(cr->lc, cr); + linphone_free_xml_text_content(state_str); + } + if (refresh_str != NULL) { + linphone_free_xml_text_content(refresh_str); } } diff --git a/coreapi/presence.c b/coreapi/presence.c index 869f723ed..e944d3a45 100644 --- a/coreapi/presence.c +++ b/coreapi/presence.c @@ -1211,19 +1211,15 @@ static int process_pidf_xml_presence_services(xmlparsing_context_t *xml_ctx, Lin service_id_str = linphone_get_xml_text_content(xml_ctx, xpath_str); service = presence_service_new(service_id_str, basic_status); if (service != NULL) { - if (timestamp_str != NULL) { - presence_service_set_timestamp(service, parse_timestamp(timestamp_str)); - linphone_free_xml_text_content(timestamp_str); - } - if (contact_str != NULL) { - linphone_presence_service_set_contact(service, contact_str); - linphone_free_xml_text_content(contact_str); - } + if (timestamp_str != NULL) presence_service_set_timestamp(service, parse_timestamp(timestamp_str)); + if (contact_str != NULL) linphone_presence_service_set_contact(service, contact_str); process_pidf_xml_presence_service_notes(xml_ctx, service, i); linphone_presence_model_add_service(model, service); } - linphone_free_xml_text_content(basic_status_str); + if (timestamp_str != NULL) linphone_free_xml_text_content(timestamp_str); + if (contact_str != NULL) linphone_free_xml_text_content(contact_str); if (service_id_str != NULL) linphone_free_xml_text_content(service_id_str); + linphone_free_xml_text_content(basic_status_str); } } if (service_object != NULL) xmlXPathFreeObject(service_object); From 213206027f078d2e0640ac4a80528f6e8b82b2e5 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Wed, 18 Feb 2015 17:56:41 +0100 Subject: [PATCH 53/90] rework dtls start --- coreapi/linphonecall.c | 38 +++++++++++++++++++++----------------- coreapi/sal.c | 1 - mediastreamer2 | 2 +- oRTP | 2 +- tester/transport_tester.c | 9 +++++++++ 5 files changed, 32 insertions(+), 20 deletions(-) diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c index cbf2d4362..ecd68f76f 100644 --- a/coreapi/linphonecall.c +++ b/coreapi/linphonecall.c @@ -2334,6 +2334,21 @@ void static start_dtls( MSMediaStreamSessions *sessions, const SalStreamDescrip } } } +void static start_dtls_on_all_streams(LinphoneCall *call) { + SalMediaDescription *remote_desc = sal_call_get_remote_media_description(call->op); + SalMediaDescription *result_desc = sal_call_get_final_media_description(call->op); + if (call->audiostream && (media_stream_get_state((const MediaStream *)call->audiostream) == MSStreamStarted))/*dtls must start at the end of ice*/ + start_dtls(&call->audiostream->ms.sessions + ,sal_media_description_find_best_stream(result_desc,SalAudio) + ,sal_media_description_find_best_stream(remote_desc,SalAudio)); +#if VIDEO_ENABLED + if (call->videostream && (media_stream_get_state((const MediaStream *)call->videostream) == MSStreamStarted))/*dtls must start at the end of ice*/ + start_dtls(&call->videostream->ms.sessions + ,sal_media_description_find_best_stream(result_desc,SalVideo) + ,sal_media_description_find_best_stream(remote_desc,SalVideo)); +#endif + return; +} static void linphone_call_start_audio_stream(LinphoneCall *call, bool_t muted, bool_t send_ringbacktone, bool_t use_arc){ LinphoneCore *lc=call->core; LpConfig* conf; @@ -2456,10 +2471,6 @@ static void linphone_call_start_audio_stream(LinphoneCall *call, bool_t muted, b if (send_ringbacktone){ setup_ring_player(lc,call); } - { - SalMediaDescription *remote_desc = sal_call_get_remote_media_description(call->op); - start_dtls(&call->audiostream->ms.sessions,stream,&remote_desc->streams[0]); - } if (call->params->in_conference){ /*transform the graph to connect it to the conference filter */ @@ -2586,11 +2597,6 @@ static void linphone_call_start_video_stream(LinphoneCall *call, bool_t all_inpu used_pt, linphone_core_get_video_jittcomp(lc), cam); } } - { - SalMediaDescription *remote_desc = sal_call_get_remote_media_description(call->op); - start_dtls(&call->videostream->ms.sessions,vstream,&remote_desc->streams[1]); - } - }else ms_warning("No video stream accepted."); }else{ ms_message("No valid video stream defined."); @@ -2662,6 +2668,9 @@ void linphone_call_start_media_streams(LinphoneCall *call, bool_t all_inputs_mut if ((call->ice_session != NULL) && (ice_session_state(call->ice_session) != IS_Completed)) { ice_session_start_connectivity_checks(call->ice_session); + } else { + /*should not start dtls until ice is completed*/ + start_dtls_on_all_streams(call); } } @@ -2701,10 +2710,8 @@ void linphone_call_update_crypto_parameters(LinphoneCall *call, SalMediaDescript if (call->audiostream && local_st_desc && old_stream && new_stream && update_stream_crypto_params(call,local_st_desc,old_stream,new_stream,&call->audiostream->ms)){ } - if (call->audiostream) { - SalMediaDescription *remote_desc = sal_call_get_remote_media_description(call->op); - start_dtls(&call->audiostream->ms.sessions,&new_md->streams[0],&remote_desc->streams[0]); - } + + start_dtls_on_all_streams(call); #ifdef VIDEO_ENABLED local_st_desc = sal_media_description_find_secure_stream_of_type(call->localdesc, SalVideo); @@ -2713,10 +2720,6 @@ void linphone_call_update_crypto_parameters(LinphoneCall *call, SalMediaDescript if (call->videostream && local_st_desc && old_stream && new_stream && update_stream_crypto_params(call,local_st_desc,old_stream,new_stream,&call->videostream->ms)){ } - if (call->videostream) { - SalMediaDescription *remote_desc = sal_call_get_remote_media_description(call->op); - start_dtls(&call->videostream->ms.sessions,&new_md->streams[1],&remote_desc->streams[1]); - } #endif } @@ -3289,6 +3292,7 @@ static void handle_ice_events(LinphoneCall *call, OrtpEvent *ev){ linphone_core_update_call(call->core, call, params); } change_ice_media_destinations(call); + start_dtls_on_all_streams(call); break; case IS_Failed: if (ice_session_has_completed_check_list(call->ice_session) == TRUE) { diff --git a/coreapi/sal.c b/coreapi/sal.c index 11934f572..a5a0755d1 100644 --- a/coreapi/sal.c +++ b/coreapi/sal.c @@ -322,7 +322,6 @@ int sal_stream_description_equals(const SalStreamDescription *sd1, const SalStre if (sd1->dtls_role != sd2->dtls_role) result |= SAL_MEDIA_DESCRIPTION_CRYPTO_KEYS_CHANGED; if (strcmp(sd1->dtls_fingerprint, sd2->dtls_fingerprint) != 0) result |= SAL_MEDIA_DESCRIPTION_CRYPTO_KEYS_CHANGED; - return result; } diff --git a/mediastreamer2 b/mediastreamer2 index 6924f3396..4bb21da47 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 6924f33961f54aa8ddb58a5cc0a0c8aaa624cdce +Subproject commit 4bb21da476acd45b6f12ef3149d45fbdd49e71d2 diff --git a/oRTP b/oRTP index fa091e035..39a807584 160000 --- a/oRTP +++ b/oRTP @@ -1 +1 @@ -Subproject commit fa091e0350afaa2a26348ed0ca678135184d628c +Subproject commit 39a807584c9b176eb01c391aa43f6c49a8fe518c diff --git a/tester/transport_tester.c b/tester/transport_tester.c index a291ec0c0..e847e0fe8 100644 --- a/tester/transport_tester.c +++ b/tester/transport_tester.c @@ -167,6 +167,14 @@ static void tunnel_zrtp_video_ice_call(void) { else ms_warning("Could not test %s because tunnel functionality is not available",__FUNCTION__); } + +static void tunnel_dtls_video_ice_call(void) { + if (linphone_core_tunnel_available()) + call_base(LinphoneMediaEncryptionDTLS,TRUE,FALSE,LinphonePolicyUseIce,TRUE); + else + ms_warning("Could not test %s because tunnel functionality is not available",__FUNCTION__); +} + static void tunnel_video_ice_call(void) { if (linphone_core_tunnel_available()) call_base(LinphoneMediaEncryptionNone,TRUE,FALSE,LinphonePolicyUseIce,TRUE); @@ -207,6 +215,7 @@ test_t transport_tests[] = { #ifdef VIDEO_ENABLED { "Tunnel ice video call", 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 }, #endif }; From 8f3ff2dbd95873709c0a6024aca0805273c7465c Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Wed, 18 Feb 2015 17:59:57 +0100 Subject: [PATCH 54/90] fix bug about authentication When ha1 password storage is enabled (the default), the lookup of LinphoneAuthInfo must be done with realm, otherwise the password will not work. --- coreapi/authentication.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/coreapi/authentication.c b/coreapi/authentication.c index de7248316..0306803f8 100644 --- a/coreapi/authentication.c +++ b/coreapi/authentication.c @@ -200,7 +200,7 @@ static char * remove_quotes(char * input){ return input; } -static int realm_match(const char *realm1, const char *realm2){ +static bool_t realm_match(const char *realm1, const char *realm2){ if (realm1==NULL && realm2==NULL) return TRUE; if (realm1!=NULL && realm2!=NULL){ if (strcmp(realm1,realm2)==0) return TRUE; @@ -226,7 +226,7 @@ static const LinphoneAuthInfo *find_auth_info(LinphoneCore *lc, const char *user LinphoneAuthInfo *pinfo = (LinphoneAuthInfo*)elem->data; if (username && pinfo->username && strcmp(username,pinfo->username)==0) { if (realm && domain){ - if (pinfo->realm && strcmp(realm,pinfo->realm)==0 + if (pinfo->realm && realm_match(realm,pinfo->realm) && pinfo->domain && strcmp(domain,pinfo->domain)==0) { return pinfo; } @@ -238,9 +238,9 @@ static const LinphoneAuthInfo *find_auth_info(LinphoneCore *lc, const char *user } ret=pinfo; } - } else if (domain && pinfo->domain && strcmp(domain,pinfo->domain)==0) { + } else if (domain && pinfo->domain && strcmp(domain,pinfo->domain)==0 && pinfo->ha1==NULL) { return pinfo; - } else if (!domain) { + } else if (!domain && pinfo->ha1==NULL) { return pinfo; } } @@ -271,6 +271,7 @@ const LinphoneAuthInfo *linphone_core_find_auth_info(LinphoneCore *lc, const cha if (ai==NULL){ ai=find_auth_info(lc,username,NULL,NULL); } + /*if (ai) ms_message("linphone_core_find_auth_info(): returning auth info username=%s, realm=%s", ai->username, ai->realm);*/ return ai; } From 0b086009e947deb016ec9aca610c1e6031070af1 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Wed, 18 Feb 2015 18:14:54 +0100 Subject: [PATCH 55/90] Fix memory leak when cloning LinphoneContent objects. --- coreapi/content.c | 1 + 1 file changed, 1 insertion(+) diff --git a/coreapi/content.c b/coreapi/content.c index 332789d2a..36ebbb0a7 100644 --- a/coreapi/content.c +++ b/coreapi/content.c @@ -33,6 +33,7 @@ static void linphone_content_destroy(LinphoneContent *content) { } static void linphone_content_clone(LinphoneContent *obj, const LinphoneContent *ref) { + obj->owned_fields = TRUE; linphone_content_set_type(obj, linphone_content_get_type(ref)); linphone_content_set_subtype(obj, linphone_content_get_subtype(ref)); linphone_content_set_encoding(obj, linphone_content_get_encoding(ref)); From 40ffaa6c432e7cf514004cd5e1779cd0df4f6274 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Wed, 18 Feb 2015 18:35:42 +0100 Subject: [PATCH 56/90] disable tunnel_dtls_video_ice_call until feature is available --- tester/transport_tester.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tester/transport_tester.c b/tester/transport_tester.c index e847e0fe8..921e03467 100644 --- a/tester/transport_tester.c +++ b/tester/transport_tester.c @@ -169,9 +169,9 @@ static void tunnel_zrtp_video_ice_call(void) { } static void tunnel_dtls_video_ice_call(void) { - if (linphone_core_tunnel_available()) +/* if (linphone_core_tunnel_available()) call_base(LinphoneMediaEncryptionDTLS,TRUE,FALSE,LinphonePolicyUseIce,TRUE); - else + else*/ ms_warning("Could not test %s because tunnel functionality is not available",__FUNCTION__); } From 147d600cc824dd509becec454741d077614dc4a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Grisez?= Date: Thu, 19 Feb 2015 11:19:10 +0100 Subject: [PATCH 57/90] Prevent liblinphone_gitversion.h from cleaning when building the distribution archive --- coreapi/Makefile.am | 16 +++++++--------- gtk/main.c | 2 +- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/coreapi/Makefile.am b/coreapi/Makefile.am index 40a26ccab..116530afa 100644 --- a/coreapi/Makefile.am +++ b/coreapi/Makefile.am @@ -207,15 +207,13 @@ make_gitversion_h: else \ $(ECHO) -n "" > $(builddir)/$(GITVERSION_FILE_TMP) ; \ fi ; \ - else \ - $(ECHO) -n "" > $(builddir)/$(GITVERSION_FILE_TMP) ; \ + if ! test -f $(builddir)/$(GITVERSION_FILE) ; then \ + cp -f $(builddir)/$(GITVERSION_FILE_TMP) $(builddir)/$(GITVERSION_FILE) ; \ + fi ; \ + if test "`cat $(builddir)/$(GITVERSION_FILE_TMP)`" != "`cat $(builddir)/$(GITVERSION_FILE)`" ; then \ + cp -f $(builddir)/$(GITVERSION_FILE_TMP) $(builddir)/$(GITVERSION_FILE) ; \ + fi ; \ + rm -f $(builddir)/$(GITVERSION_FILE_TMP) ; \ fi - if ! test -f $(builddir)/$(GITVERSION_FILE) ; then \ - cp -f $(builddir)/$(GITVERSION_FILE_TMP) $(builddir)/$(GITVERSION_FILE) ; \ - fi - if test "`cat $(builddir)/$(GITVERSION_FILE_TMP)`" != "`cat $(builddir)/$(GITVERSION_FILE)`" ; then \ - cp -f $(builddir)/$(GITVERSION_FILE_TMP) $(builddir)/$(GITVERSION_FILE) ; \ - fi - rm -f $(builddir)/$(GITVERSION_FILE_TMP) ; $(GITVERSION_FILE): make_gitversion_h diff --git a/gtk/main.c b/gtk/main.c index b59c3ea3b..f840435cc 100644 --- a/gtk/main.c +++ b/gtk/main.c @@ -22,6 +22,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "linphone.h" #include "lpconfig.h" +#include "liblinphone_gitversion.h" #include @@ -49,7 +50,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #endif -#include "coreapi/liblinphone_gitversion.h" const char *this_program_ident_string="linphone_ident_string=" LINPHONE_VERSION; From 1066d925acf82ad56eed38cb15a3fc7a90917ecd Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Thu, 19 Feb 2015 11:44:38 +0100 Subject: [PATCH 58/90] update ortp, ms2 and set port ranges for all tester rc files to avoid port conflicts. --- mediastreamer2 | 2 +- oRTP | 2 +- tester/rcfiles/laure_rc | 6 +++--- tester/rcfiles/marie_h264_rc | 4 ++-- tester/rcfiles/marie_rc | 4 ++-- tester/rcfiles/marie_rc_rtcp_xr | 4 ++-- tester/rcfiles/marie_sips_rc | 4 ++-- tester/rcfiles/pauline_h264_rc | 4 ++-- tester/rcfiles/pauline_rc_rtcp_xr | 4 ++-- tester/rcfiles/pauline_sips_rc | 4 ++-- tester/rcfiles/pauline_tcp_rc | 4 ++-- 11 files changed, 21 insertions(+), 21 deletions(-) diff --git a/mediastreamer2 b/mediastreamer2 index 4bb21da47..2aef0fddf 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 4bb21da476acd45b6f12ef3149d45fbdd49e71d2 +Subproject commit 2aef0fddfbb3d39690d562f0d12138a843f21bae diff --git a/oRTP b/oRTP index 39a807584..f64cfa994 160000 --- a/oRTP +++ b/oRTP @@ -1 +1 @@ -Subproject commit 39a807584c9b176eb01c391aa43f6c49a8fe518c +Subproject commit f64cfa9944327ac707a1e9adade2a9c7d017e91e diff --git a/tester/rcfiles/laure_rc b/tester/rcfiles/laure_rc index 7f4d099f5..9156afc39 100644 --- a/tester/rcfiles/laure_rc +++ b/tester/rcfiles/laure_rc @@ -23,8 +23,8 @@ dial_escape_plus=0 [rtp] -audio_rtp_port=9010 -video_rtp_port=9012 +audio_rtp_port=9010-9390 +video_rtp_port=9410-9910 [video] display=0 @@ -41,4 +41,4 @@ 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 diff --git a/tester/rcfiles/marie_h264_rc b/tester/rcfiles/marie_h264_rc index f2ab26190..dc89fceb4 100644 --- a/tester/rcfiles/marie_h264_rc +++ b/tester/rcfiles/marie_h264_rc @@ -32,8 +32,8 @@ subscribe=0 [rtp] -audio_rtp_port=8070 -video_rtp_port=9072 +audio_rtp_port=18070-28000 +video_rtp_port=39072-49000 [video] display=1 diff --git a/tester/rcfiles/marie_rc b/tester/rcfiles/marie_rc index 367353d06..536725564 100644 --- a/tester/rcfiles/marie_rc +++ b/tester/rcfiles/marie_rc @@ -32,8 +32,8 @@ subscribe=0 [rtp] -audio_rtp_port=8070 -video_rtp_port=9072 +audio_rtp_port=18070-28000 +video_rtp_port=28070-38000 [video] display=0 diff --git a/tester/rcfiles/marie_rc_rtcp_xr b/tester/rcfiles/marie_rc_rtcp_xr index 93f8e5bd0..06f0b5b63 100644 --- a/tester/rcfiles/marie_rc_rtcp_xr +++ b/tester/rcfiles/marie_rc_rtcp_xr @@ -32,8 +32,8 @@ subscribe=0 [rtp] -audio_rtp_port=8070 -video_rtp_port=9072 +audio_rtp_port=20070-22070 +video_rtp_port=24000-25000 rtcp_xr_enabled=1 rtcp_xr_rcvr_rtt_mode=all rtcp_xr_rcvr_rtt_max_size=10000 diff --git a/tester/rcfiles/marie_sips_rc b/tester/rcfiles/marie_sips_rc index 0723c13a0..7a935d4cb 100644 --- a/tester/rcfiles/marie_sips_rc +++ b/tester/rcfiles/marie_sips_rc @@ -32,8 +32,8 @@ subscribe=0 [rtp] -audio_rtp_port=8070 -video_rtp_port=9072 +audio_rtp_port=18070-28000 +video_rtp_port=28070-38000 [video] display=0 diff --git a/tester/rcfiles/pauline_h264_rc b/tester/rcfiles/pauline_h264_rc index d11c7d071..8f30cf020 100644 --- a/tester/rcfiles/pauline_h264_rc +++ b/tester/rcfiles/pauline_h264_rc @@ -29,8 +29,8 @@ dial_escape_plus=0 #subscribe=0 [rtp] -audio_rtp_port=8090 -video_rtp_port=9092 +audio_rtp_port=18070-28000 +video_rtp_port=39072-49000 [video] display=0 diff --git a/tester/rcfiles/pauline_rc_rtcp_xr b/tester/rcfiles/pauline_rc_rtcp_xr index 331f942ef..94c0314ea 100644 --- a/tester/rcfiles/pauline_rc_rtcp_xr +++ b/tester/rcfiles/pauline_rc_rtcp_xr @@ -29,8 +29,8 @@ dial_escape_plus=0 #subscribe=0 [rtp] -audio_rtp_port=8090 -video_rtp_port=9092 +audio_rtp_port=18070-28000 +video_rtp_port=39072-49000 rtcp_xr_enabled=1 rtcp_xr_rcvr_rtt_mode=all rtcp_xr_rcvr_rtt_max_size=10000 diff --git a/tester/rcfiles/pauline_sips_rc b/tester/rcfiles/pauline_sips_rc index 5d9f3d5ed..f248cffc1 100644 --- a/tester/rcfiles/pauline_sips_rc +++ b/tester/rcfiles/pauline_sips_rc @@ -29,8 +29,8 @@ dial_escape_plus=0 #subscribe=0 [rtp] -audio_rtp_port=8090 -video_rtp_port=9092 +audio_rtp_port=18070-28000 +video_rtp_port=39072-49000 [video] display=0 diff --git a/tester/rcfiles/pauline_tcp_rc b/tester/rcfiles/pauline_tcp_rc index 809c1ace6..73fd469d7 100644 --- a/tester/rcfiles/pauline_tcp_rc +++ b/tester/rcfiles/pauline_tcp_rc @@ -29,8 +29,8 @@ dial_escape_plus=0 #subscribe=0 [rtp] -audio_rtp_port=8090 -video_rtp_port=9092 +audio_rtp_port=18070-28000 +video_rtp_port=39072-49000 [video] display=0 From 6cbac7f1c2ed9031a97d9e683ddc1bc99d585f8f Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Thu, 19 Feb 2015 13:54:22 +0100 Subject: [PATCH 59/90] update ms2 and ortp --- mediastreamer2 | 2 +- oRTP | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mediastreamer2 b/mediastreamer2 index 2aef0fddf..13476e604 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 2aef0fddfbb3d39690d562f0d12138a843f21bae +Subproject commit 13476e604ce3e40a0caa525babdc5dbb88683685 diff --git a/oRTP b/oRTP index f64cfa994..6cb41fa39 160000 --- a/oRTP +++ b/oRTP @@ -1 +1 @@ -Subproject commit f64cfa9944327ac707a1e9adade2a9c7d017e91e +Subproject commit 6cb41fa39470d23f8c028044e3a4ef2be28beae9 From 00ef85317014acd849fef65cf0b4cc9c1d406813 Mon Sep 17 00:00:00 2001 From: Johan Pascal Date: Thu, 19 Feb 2015 14:02:13 +0100 Subject: [PATCH 60/90] Give DTLS fingerprint to context as soon as possible(do not wait for ice) --- coreapi/linphonecall.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c index ecd68f76f..1b678fea3 100644 --- a/coreapi/linphonecall.c +++ b/coreapi/linphonecall.c @@ -2349,6 +2349,36 @@ void static start_dtls_on_all_streams(LinphoneCall *call) { #endif return; } + +void static set_dtls_fingerprint( MSMediaStreamSessions *sessions, const SalStreamDescription *sd,const SalStreamDescription *remote) { + if (sal_stream_description_has_dtls(sd) == TRUE) { + /*DTLS*/ + SalDtlsRole salRole = sd->dtls_role; + if (salRole!=SalDtlsRoleInvalid) { /* if DTLS is available at both end points */ + /* give the peer certificate fingerprint to dtls context */ + ms_dtls_srtp_set_peer_fingerprint(sessions->dtls_context, remote->dtls_fingerprint); + } else { + ms_warning("unable to start DTLS engine on stream session [%p], Dtls role in resulting media description is invalid",sessions); + } + } +} + +void static set_dtls_fingerprint_on_all_streams(LinphoneCall *call) { + SalMediaDescription *remote_desc = sal_call_get_remote_media_description(call->op); + SalMediaDescription *result_desc = sal_call_get_final_media_description(call->op); + if (call->audiostream && (media_stream_get_state((const MediaStream *)call->audiostream) == MSStreamStarted))/*dtls must start at the end of ice*/ + set_dtls_fingerprint(&call->audiostream->ms.sessions + ,sal_media_description_find_best_stream(result_desc,SalAudio) + ,sal_media_description_find_best_stream(remote_desc,SalAudio)); +#if VIDEO_ENABLED + if (call->videostream && (media_stream_get_state((const MediaStream *)call->videostream) == MSStreamStarted))/*dtls must start at the end of ice*/ + set_dtls_fingerprint(&call->videostream->ms.sessions + ,sal_media_description_find_best_stream(result_desc,SalVideo) + ,sal_media_description_find_best_stream(remote_desc,SalVideo)); +#endif + return; +} + static void linphone_call_start_audio_stream(LinphoneCall *call, bool_t muted, bool_t send_ringbacktone, bool_t use_arc){ LinphoneCore *lc=call->core; LpConfig* conf; @@ -2666,6 +2696,8 @@ void linphone_call_start_media_streams(LinphoneCall *call, bool_t all_inputs_mut LinphoneMediaEncryptionSRTP : LinphoneMediaEncryptionNone; } + set_dtls_fingerprint_on_all_streams(call); + if ((call->ice_session != NULL) && (ice_session_state(call->ice_session) != IS_Completed)) { ice_session_start_connectivity_checks(call->ice_session); } else { From b3734e28a0896f792f422ade9be88970a25a8c46 Mon Sep 17 00:00:00 2001 From: Margaux Clerc Date: Thu, 19 Feb 2015 15:58:48 +0100 Subject: [PATCH 61/90] JNI setPayloadTypeNumber and resetLogCollection --- coreapi/linphonecore_jni.cc | 20 +++++++++++++++ .../org/linphone/core/LinphoneCore.java | 25 +++++++++++++++++++ .../org/linphone/core/LinphoneCoreImpl.java | 15 +++++++++++ 3 files changed, 60 insertions(+) diff --git a/coreapi/linphonecore_jni.cc b/coreapi/linphonecore_jni.cc index 3e895a6ce..eb7c47f83 100644 --- a/coreapi/linphonecore_jni.cc +++ b/coreapi/linphonecore_jni.cc @@ -1200,6 +1200,10 @@ extern "C" void Java_org_linphone_core_LinphoneCoreImpl_uploadLogCollection(JNIE linphone_core_upload_log_collection(core); } +extern "C" void Java_org_linphone_core_LinphoneCoreImpl_resetLogCollection(JNIEnv* env, jobject thiz) { + linphone_core_reset_log_collection(); +} + extern "C" jint Java_org_linphone_core_LinphoneCoreImpl_migrateToMultiTransport(JNIEnv* env ,jobject thiz ,jlong lc) { @@ -1603,6 +1607,7 @@ extern "C" jlong Java_org_linphone_core_LinphoneCoreImpl_findPayloadType(JNIEnv* env->ReleaseStringUTFChars(jmime, mime); return result; } + extern "C" jlongArray Java_org_linphone_core_LinphoneCoreImpl_listVideoPayloadTypes(JNIEnv* env ,jobject thiz ,jlong lc) { @@ -1675,6 +1680,21 @@ extern "C" jint Java_org_linphone_core_LinphoneCoreImpl_getPayloadTypeBitrate(JN return (jint)linphone_core_get_payload_type_bitrate((LinphoneCore*)lc,(PayloadType*)pt); } +extern "C" void Java_org_linphone_core_LinphoneCoreImpl_setPayloadTypeNumber(JNIEnv* env + ,jobject thiz + ,jlong lc + ,jlong pt + ,jint number) { + linphone_core_set_payload_type_number((LinphoneCore*)lc,(PayloadType*)pt,number); +} + +extern "C" jint Java_org_linphone_core_LinphoneCoreImpl_getPayloadTypeNumber(JNIEnv* env + ,jobject thiz + ,jlong lc + ,jlong pt) { + return (jint)linphone_core_get_payload_type_number((LinphoneCore*)lc,(PayloadType*)pt); +} + extern "C" void Java_org_linphone_core_LinphoneCoreImpl_enableAdaptiveRateControl(JNIEnv* env ,jobject thiz ,jlong lc diff --git a/java/common/org/linphone/core/LinphoneCore.java b/java/common/org/linphone/core/LinphoneCore.java index 7c23cb9bb..2b7ce9cde 100644 --- a/java/common/org/linphone/core/LinphoneCore.java +++ b/java/common/org/linphone/core/LinphoneCore.java @@ -786,6 +786,26 @@ public interface LinphoneCore { */ int getPayloadTypeBitrate(PayloadType pt); + /** + * Set an explicit bitrate (IP bitrate, not codec bitrate) for a given codec, in kbit/s. + * @param pt the payload type + * @param number target IP bitrate in kbit/s + */ + + /** + * Force a number for a payload type. The LinphoneCore does payload type number assignment automatically. THis function is to be used mainly for tests, in order + * to override the automatic assignment mechanism. + * @param pt the payload type + * @param number + **/ + void setPayloadTypeNumber(PayloadType pt, int number); + + /** + * @param pt the payload type + * @return the payload type number assigned for this codec. + */ + int getPayloadTypeNumber(PayloadType pt); + /** * Enable adaptive rate control. * @param enable @@ -1889,6 +1909,11 @@ public interface LinphoneCore { * Upload the log collection to the configured server url. */ public void uploadLogCollection(); + + /** + * Reset the log collection by removing the log files. + */ + public void resetLogCollection(); /** diff --git a/java/impl/org/linphone/core/LinphoneCoreImpl.java b/java/impl/org/linphone/core/LinphoneCoreImpl.java index bd361daca..8595ff079 100644 --- a/java/impl/org/linphone/core/LinphoneCoreImpl.java +++ b/java/impl/org/linphone/core/LinphoneCoreImpl.java @@ -1274,6 +1274,18 @@ class LinphoneCoreImpl implements LinphoneCore { public synchronized int getPayloadTypeBitrate(PayloadType pt) { return getPayloadTypeBitrate(nativePtr, ((PayloadTypeImpl)pt).nativePtr); } + + private native void setPayloadTypeNumber(long coreptr, long payload_ptr, int number); + @Override + public synchronized void setPayloadTypeNumber(PayloadType pt, int number) { + setPayloadTypeNumber(nativePtr, ((PayloadTypeImpl)pt).nativePtr, number); + } + private native int getPayloadTypeNumber(long coreptr, long payload_ptr); + @Override + public synchronized int getPayloadTypeNumber(PayloadType pt) { + return getPayloadTypeNumber(nativePtr, ((PayloadTypeImpl)pt).nativePtr); + } + @Override public synchronized void enableAdaptiveRateControl(boolean enable) { enableAdaptiveRateControl(nativePtr,enable); @@ -1352,6 +1364,9 @@ class LinphoneCoreImpl implements LinphoneCore { public void uploadLogCollection() { uploadLogCollection(nativePtr); } + + @Override + public native void resetLogCollection(); private native void setPreferredFramerate(long nativePtr, float fps); @Override From e2d39cf097c2b14f4ee75f4a3df3ce49d1bbf462 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Thu, 19 Feb 2015 16:37:00 +0100 Subject: [PATCH 62/90] update ms2 and ortp --- mediastreamer2 | 2 +- oRTP | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mediastreamer2 b/mediastreamer2 index 13476e604..38f53aaa2 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 13476e604ce3e40a0caa525babdc5dbb88683685 +Subproject commit 38f53aaa2e721384c280cee216565e6befd4f854 diff --git a/oRTP b/oRTP index 6cb41fa39..60f6d0f90 160000 --- a/oRTP +++ b/oRTP @@ -1 +1 @@ -Subproject commit 6cb41fa39470d23f8c028044e3a4ef2be28beae9 +Subproject commit 60f6d0f909eddcefc83960f791ff30097c1e5c33 From 417a8f609672303a8a534ad4fb27c718fb8c3812 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Thu, 19 Feb 2015 18:10:30 +0100 Subject: [PATCH 63/90] Update ms2 submodule. --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index 38f53aaa2..23e101f98 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 38f53aaa2e721384c280cee216565e6befd4f854 +Subproject commit 23e101f981d24dc8b2acf0e771ca7a58b750be0c From cd73647339a8ea5f3f9f4d066260238d5f0f876c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Grisez?= Date: Thu, 19 Feb 2015 17:12:02 +0100 Subject: [PATCH 64/90] Fix build issue --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index 23e101f98..f735f9b81 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 23e101f981d24dc8b2acf0e771ca7a58b750be0c +Subproject commit f735f9b811942e528aefb98221ff3704e5559fe5 From 587299ce03366dc142d5fa36fc71e1da11d9fcfd Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Thu, 19 Feb 2015 17:13:35 +0100 Subject: [PATCH 65/90] fix crash in case of transport change when call is on error --- coreapi/bellesip_sal/sal_op_call.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/coreapi/bellesip_sal/sal_op_call.c b/coreapi/bellesip_sal/sal_op_call.c index 428c27bff..58b7e9290 100644 --- a/coreapi/bellesip_sal/sal_op_call.c +++ b/coreapi/bellesip_sal/sal_op_call.c @@ -217,7 +217,8 @@ static void call_process_response(void *op_base, const belle_sip_response_event_ dialog_state=dialog ? belle_sip_dialog_get_state(dialog) : BELLE_SIP_DIALOG_NULL; method=belle_sip_request_get_method(req); ms_message("Op [%p] receiving call response [%i], dialog is [%p] in state [%s]",op,code,dialog,belle_sip_dialog_state_to_string(dialog_state)); - + /*to make sure no cb will destroy op*/ + sal_op_ref(op); switch(dialog_state) { case BELLE_SIP_DIALOG_NULL: case BELLE_SIP_DIALOG_EARLY: { @@ -316,6 +317,7 @@ static void call_process_response(void *op_base, const belle_sip_response_event_ } break; } + sal_op_unref(op); } static void call_process_timeout(void *user_ctx, const belle_sip_timeout_event_t *event) { From 11ffe4f9436c1dac46a1bd05d9d6c300a913a852 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Thu, 19 Feb 2015 17:17:30 +0100 Subject: [PATCH 66/90] move rtp_session_set_symmetric_rtp for ice to the completion of ice --- coreapi/callbacks.c | 2 +- coreapi/linphonecall.c | 3 +- tester/call_tester.c | 66 ++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 67 insertions(+), 4 deletions(-) diff --git a/coreapi/callbacks.c b/coreapi/callbacks.c index 7de84e19f..fa29096b7 100644 --- a/coreapi/callbacks.c +++ b/coreapi/callbacks.c @@ -76,7 +76,7 @@ void linphone_core_update_streams_destinations(LinphoneCore *lc, LinphoneCall *c static void _clear_early_media_destinations(LinphoneCall *call, MediaStream *ms){ RtpSession *session=ms->sessions.rtp_session; rtp_session_clear_aux_remote_addr(session); - if (!call->ice_session) rtp_session_set_symmetric_rtp(session,TRUE);/*restore symmetric rtp if ICE is not used*/ + if (!call->ice_session) rtp_session_set_symmetric_rtp(session,linphone_core_symmetric_rtp_enabled(call->core));/*restore symmetric rtp if ICE is not used*/ } static void clear_early_media_destinations(LinphoneCall *call){ diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c index 1b678fea3..b118b163f 100644 --- a/coreapi/linphonecall.c +++ b/coreapi/linphonecall.c @@ -1792,7 +1792,6 @@ static void _linphone_call_prepare_ice_for_stream(LinphoneCall *call, int stream if ((linphone_core_get_firewall_policy(call->core) == LinphonePolicyUseIce) && (call->ice_session != NULL)){ IceCheckList *cl; rtp_session_set_pktinfo(ms->sessions.rtp_session, TRUE); - rtp_session_set_symmetric_rtp(ms->sessions.rtp_session, FALSE); cl=ice_session_check_list(call->ice_session, stream_index); if (cl == NULL && create_checklist) { cl=ice_check_list_new(); @@ -3283,6 +3282,7 @@ static void change_ice_media_destinations(LinphoneCall *call) { result = ice_check_list_selected_valid_remote_candidate(ice_session_check_list(call->ice_session, 0), &rtp_addr, &rtp_port, &rtcp_addr, &rtcp_port); if (result == TRUE) { ms_message("Change audio stream destination: RTP=%s:%d RTCP=%s:%d", rtp_addr, rtp_port, rtcp_addr, rtcp_port); + rtp_session_set_symmetric_rtp(call->audiostream->ms.sessions.rtp_session, FALSE); rtp_session_set_remote_addr_full(call->audiostream->ms.sessions.rtp_session, rtp_addr, rtp_port, rtcp_addr, rtcp_port); } } @@ -3291,6 +3291,7 @@ static void change_ice_media_destinations(LinphoneCall *call) { result = ice_check_list_selected_valid_remote_candidate(ice_session_check_list(call->ice_session, 1), &rtp_addr, &rtp_port, &rtcp_addr, &rtcp_port); if (result == TRUE) { ms_message("Change video stream destination: RTP=%s:%d RTCP=%s:%d", rtp_addr, rtp_port, rtcp_addr, rtcp_port); + rtp_session_set_symmetric_rtp(call->videostream->ms.sessions.rtp_session, FALSE); rtp_session_set_remote_addr_full(call->videostream->ms.sessions.rtp_session, rtp_addr, rtp_port, rtcp_addr, rtcp_port); } } diff --git a/tester/call_tester.c b/tester/call_tester.c index 644727618..5442364d7 100644 --- a/tester/call_tester.c +++ b/tester/call_tester.c @@ -240,7 +240,7 @@ bool_t call_with_params2(LinphoneCoreManager* caller_mgr CU_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; - } else { + } else if (caller_mgr->identity){ LinphoneAddress* callee_from=linphone_address_clone(caller_mgr->identity); linphone_address_set_port(callee_from,0); /*remove port because port is never present in from header*/ @@ -3678,7 +3678,67 @@ static void call_with_generic_cn(void) { ms_free(audio_file_with_silence); ms_free(recorded_file); } +void static call_state_changed_2(LinphoneCore *lc, LinphoneCall *call, LinphoneCallState cstate, const char *msg){ + LCSipTransports sip_tr; + if (cstate==LinphoneCallReleased) { + /*to make sure transport is changed*/ + sip_tr.udp_port = 0; + sip_tr.tcp_port = 45876; + sip_tr.tls_port = 0; + linphone_core_set_sip_transports(lc,&sip_tr); + } +} + +static void call_with_transport_change_base(bool_t succesfull_call) { + int begin; + int leaked_objects; + LCSipTransports sip_tr; + LinphoneCoreManager* marie; + LinphoneCoreManager* pauline; + LinphoneCoreVTable * v_table; + belle_sip_object_enable_leak_detector(TRUE); + begin=belle_sip_object_get_object_count(); + v_table = linphone_core_v_table_new(); + v_table->call_state_changed=call_state_changed_2; + marie = linphone_core_manager_new("marie_rc"); + pauline = linphone_core_manager_new( "pauline_rc"); + linphone_core_add_listener(marie->lc,v_table); + + sip_tr.udp_port = 0; + sip_tr.tcp_port = 45875; + sip_tr.tls_port = 0; + linphone_core_set_sip_transports(marie->lc,&sip_tr); + if (succesfull_call) { + CU_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)); + 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)); + } + 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); + if (leaked_objects>0){ + belle_sip_object_dump_active_objects(); + } + +} +static void call_with_transport_change_after_released(void) { + call_with_transport_change_base(TRUE); +} +static void unsucessfull_call_with_transport_change_after_released(void) { + call_with_transport_change_base(FALSE); +} test_t call_tests[] = { { "Early declined call", early_declined_call }, @@ -3782,7 +3842,9 @@ test_t call_tests[] = { { "Outgoing INVITE with invalid ACK SDP",outgoing_invite_with_invalid_sdp}, { "Incoming REINVITE with invalid SDP in ACK",incoming_reinvite_with_invalid_ack_sdp}, { "Outgoing REINVITE with invalid SDP in ACK",outgoing_reinvite_with_invalid_ack_sdp}, - { "Call with generic CN", call_with_generic_cn } + { "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} }; test_suite_t call_test_suite = { From 216d7afd41244534c820910cde31f21696db0481 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Thu, 19 Feb 2015 17:46:35 +0100 Subject: [PATCH 67/90] active DTLS + video + ice +tunnel test --- tester/transport_tester.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tester/transport_tester.c b/tester/transport_tester.c index 921e03467..e847e0fe8 100644 --- a/tester/transport_tester.c +++ b/tester/transport_tester.c @@ -169,9 +169,9 @@ static void tunnel_zrtp_video_ice_call(void) { } static void tunnel_dtls_video_ice_call(void) { -/* if (linphone_core_tunnel_available()) + if (linphone_core_tunnel_available()) call_base(LinphoneMediaEncryptionDTLS,TRUE,FALSE,LinphonePolicyUseIce,TRUE); - else*/ + else ms_warning("Could not test %s because tunnel functionality is not available",__FUNCTION__); } From c48b39467e5eed00bf9e5adebaeb4da487c38fa8 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Thu, 19 Feb 2015 19:09:36 +0100 Subject: [PATCH 68/90] update ms2 (build broken) --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index f735f9b81..ed0c1f307 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit f735f9b811942e528aefb98221ff3704e5559fe5 +Subproject commit ed0c1f30701c6a3bb0607243834f5b58a2720381 From 948ae319a4642eb7cdd26018dccca439a1fb2355 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Grisez?= Date: Thu, 19 Feb 2015 22:41:43 +0100 Subject: [PATCH 69/90] Fix color issues in the chat room when a dark GTK theme is used --- gtk/chat.c | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/gtk/chat.c b/gtk/chat.c index daa5fd95a..1f2234d72 100644 --- a/gtk/chat.c +++ b/gtk/chat.c @@ -161,16 +161,19 @@ void linphone_gtk_push_text(GtkWidget *w, const LinphoneAddress *from, if(g_strcmp0(from_message,from_str)!=0){ gtk_text_buffer_get_iter_at_offset(buffer,&iter,off); gtk_text_buffer_get_end_iter(buffer,&iter); - gtk_text_buffer_insert_with_tags_by_name(buffer,&iter,get_display_name(from),-1,"bold",me ? "bg":NULL,NULL); + gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, get_display_name(from), -1, + "bold", me ? "bg" : NULL, me ? "font_black" : NULL, NULL); gtk_text_buffer_get_end_iter(buffer,&iter); - gtk_text_buffer_insert_with_tags_by_name(buffer,&iter," : ",-1,"bold",me ? "bg":NULL,NULL); + gtk_text_buffer_insert_with_tags_by_name(buffer,&iter, " : ", -1, + "bold", me ? "bg" : NULL, me ? "font_black" : NULL, NULL); gtk_text_buffer_get_end_iter(buffer,&iter); gtk_text_buffer_insert(buffer,&iter,"\n",-1); g_free(from_message); g_object_set_data(G_OBJECT(w),"from_message",g_strdup(from_str)); } gtk_text_buffer_get_end_iter(buffer,&iter); - gtk_text_buffer_insert_with_tags_by_name(buffer,&iter,linphone_chat_message_get_text(msg),-1,"margin",me ? "bg":NULL,NULL); + gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, linphone_chat_message_get_text(msg), -1, + "margin", me ? "bg" : NULL, me ? "font_black" : NULL, NULL); gtk_text_buffer_get_end_iter(buffer,&iter); gtk_text_buffer_insert(buffer,&iter,"\n",-1); gtk_text_buffer_get_end_iter(buffer,&iter); @@ -378,8 +381,9 @@ GtkWidget* linphone_gtk_init_chatroom(LinphoneChatRoom *cr, const LinphoneAddres GtkWidget *main_window=linphone_gtk_get_main_window(); GtkNotebook *notebook=(GtkNotebook *)linphone_gtk_get_widget(main_window,"viewswitch"); GtkWidget *text=linphone_gtk_get_widget(chat_view,"textview"); - GdkColor color; - GdkColor colorb; + GdkColor color_grey = {0, 32512, 32512, 32512}; + GdkColor color_light_grey = {0, 56832, 60928, 61952}; + GdkColor color_black = {0}; int idx; GtkWidget *button; GtkWidget *entry = linphone_gtk_get_widget(chat_view,"text_entry"); @@ -387,13 +391,6 @@ GtkWidget* linphone_gtk_init_chatroom(LinphoneChatRoom *cr, const LinphoneAddres GHashTable *table; char *with_str; - color.red = 32512; - color.green = 32512; - color.blue = 32512; - colorb.red = 56832; - colorb.green = 60928; - colorb.blue = 61952; - with_str=linphone_address_as_string_uri_only(with); gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(text),GTK_WRAP_WORD_CHAR); gtk_text_view_set_editable(GTK_TEXT_VIEW(text),FALSE); @@ -417,11 +414,13 @@ GtkWidget* linphone_gtk_init_chatroom(LinphoneChatRoom *cr, const LinphoneAddres gtk_text_buffer_create_tag(gtk_text_view_get_buffer(GTK_TEXT_VIEW(text)), "small","size",9*PANGO_SCALE,NULL); gtk_text_buffer_create_tag(gtk_text_view_get_buffer(GTK_TEXT_VIEW(text)), - "font_grey","foreground-gdk",&color,NULL); + "font_grey","foreground-gdk",&color_grey,NULL); + gtk_text_buffer_create_tag(gtk_text_view_get_buffer(GTK_TEXT_VIEW(text)), + "font_black","foreground-gdk",&color_black,NULL); gtk_text_buffer_create_tag(gtk_text_view_get_buffer(GTK_TEXT_VIEW(text)), "margin","indent",10,NULL); gtk_text_buffer_create_tag(gtk_text_view_get_buffer(GTK_TEXT_VIEW(text)), - "bg","paragraph-background-gdk",&colorb,NULL); + "bg","paragraph-background-gdk",&color_light_grey,NULL); messages = linphone_chat_room_get_history(cr,NB_MSG_HIST); display_history_message(chat_view,messages,with); button = linphone_gtk_get_widget(chat_view,"send"); From 2e9036f3656d510c3283b74ec41a3e4494a71183 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Grisez?= Date: Fri, 20 Feb 2015 15:17:02 +0100 Subject: [PATCH 70/90] Fix crach on windows: avoid creating message storage database when the SQLite file cannot be opened --- coreapi/message_storage.c | 1 + 1 file changed, 1 insertion(+) diff --git a/coreapi/message_storage.c b/coreapi/message_storage.c index 2684ba0b5..91fd8e333 100644 --- a/coreapi/message_storage.c +++ b/coreapi/message_storage.c @@ -591,6 +591,7 @@ void linphone_core_message_storage_init(LinphoneCore *lc){ errmsg=sqlite3_errmsg(db); ms_error("Error in the opening: %s.\n", errmsg); sqlite3_close(db); + return; } linphone_message_storage_activate_debug(db, lc->debug_storage); From ea0aecc8a7cabf3bf7da1cd92039c4e8259bf02f Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Fri, 20 Feb 2015 16:14:09 +0100 Subject: [PATCH 71/90] keep tester recorded files in case of test failure --- tester/tester.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tester/tester.c b/tester/tester.c index b046c065e..382155656 100644 --- a/tester/tester.c +++ b/tester/tester.c @@ -296,10 +296,13 @@ LinphoneCoreManager* linphone_core_manager_new2(const char* rc_file, int check_f if( manager_count >= 2){ char hellopath[512]; + char *recordpath = ms_strdup_printf("%s/record_for_lc_%p.wav",liblinphone_tester_writable_dir_prefix,mgr->lc); ms_message("Manager for '%s' using files", rc_file ? rc_file : "--"); linphone_core_use_files(mgr->lc, TRUE); snprintf(hellopath,sizeof(hellopath), "%s/sounds/hello8000.wav", liblinphone_tester_file_prefix); linphone_core_set_play_file(mgr->lc,hellopath); + linphone_core_set_record_file(mgr->lc,recordpath); + ms_free(recordpath); } if (proxy_count){ @@ -334,10 +337,18 @@ void linphone_core_manager_stop(LinphoneCoreManager *mgr){ } void linphone_core_manager_destroy(LinphoneCoreManager* mgr) { + if (linphone_core_get_record_file(mgr->lc)){ + if (CU_get_number_of_failures()>0) { + ms_message ("Test has failed, keeping recorded file [%s]",linphone_core_get_record_file(mgr->lc)); + } else { + unlink(linphone_core_get_record_file(mgr->lc)); + } + } if (mgr->lc) linphone_core_destroy(mgr->lc); if (mgr->identity) linphone_address_destroy(mgr->identity); if (mgr->stat.last_received_chat_message) linphone_chat_message_unref(mgr->stat.last_received_chat_message); manager_count--; + ms_free(mgr); } From f98d1f4fca5ac0ca5dae23fd123549dec2baea75 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Fri, 20 Feb 2015 19:35:40 +0100 Subject: [PATCH 72/90] fix crash --- tester/tester.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/tester/tester.c b/tester/tester.c index 382155656..9fdedb0ec 100644 --- a/tester/tester.c +++ b/tester/tester.c @@ -337,14 +337,17 @@ void linphone_core_manager_stop(LinphoneCoreManager *mgr){ } void linphone_core_manager_destroy(LinphoneCoreManager* mgr) { - if (linphone_core_get_record_file(mgr->lc)){ - if (CU_get_number_of_failures()>0) { - ms_message ("Test has failed, keeping recorded file [%s]",linphone_core_get_record_file(mgr->lc)); - } else { - unlink(linphone_core_get_record_file(mgr->lc)); + if (mgr->lc){ + const char *record_file=linphone_core_get_record_file(mgr->lc); + if (record_file){ + if (CU_get_number_of_failures()>0) { + ms_message ("Test has failed, keeping recorded file [%s]",record_file); + } else { + unlink(record_file); + } } + linphone_core_destroy(mgr->lc); } - if (mgr->lc) linphone_core_destroy(mgr->lc); if (mgr->identity) linphone_address_destroy(mgr->identity); if (mgr->stat.last_received_chat_message) linphone_chat_message_unref(mgr->stat.last_received_chat_message); manager_count--; From 2d30e846d8c8f09f71794866cd8261b65aa8937c Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Mon, 23 Feb 2015 13:39:44 +0100 Subject: [PATCH 73/90] fix multicast lock crash + enable dtls for android --- coreapi/linphonecore_jni.cc | 45 ++++++++++++++++++++++++++++--------- coreapi/private.h | 2 ++ mediastreamer2 | 2 +- 3 files changed, 37 insertions(+), 12 deletions(-) diff --git a/coreapi/linphonecore_jni.cc b/coreapi/linphonecore_jni.cc index eb7c47f83..e9fc0b787 100644 --- a/coreapi/linphonecore_jni.cc +++ b/coreapi/linphonecore_jni.cc @@ -1160,10 +1160,23 @@ extern "C" jlong Java_org_linphone_core_LinphoneCoreImpl_newLinphoneCore(JNIEnv* if (factoryConfig) env->ReleaseStringUTFChars(jfactoryConfig, factoryConfig); return nativePtr; } -extern "C" void Java_org_linphone_core_LinphoneCoreImpl_delete(JNIEnv* env, jobject thiz, jlong lc) { - jobject core = (jobject)linphone_core_get_user_data((LinphoneCore*)lc); - linphone_core_destroy((LinphoneCore*)lc); +extern "C" void Java_org_linphone_core_LinphoneCoreImpl_delete(JNIEnv* env, jobject thiz, jlong native_ptr) { + LinphoneCore *lc=(LinphoneCore*)native_ptr; + jobject core = (jobject)linphone_core_get_user_data(lc); + + jobject multicast_lock = lc->multicast_lock; + jobject multicast_lock_class = lc->multicast_lock_class; + jobject wifi_lock = lc->wifi_lock; + jobject wifi_lock_class = lc->wifi_lock_class; + + linphone_core_destroy(lc); ms_exit(); + + if (wifi_lock) env->DeleteGlobalRef(wifi_lock); + if (wifi_lock_class) env->DeleteGlobalRef(wifi_lock_class); + if (multicast_lock) env->DeleteGlobalRef(multicast_lock); + if (multicast_lock_class) env->DeleteGlobalRef(multicast_lock_class); + if (core) { env->DeleteGlobalRef(core); } @@ -4082,33 +4095,43 @@ extern "C" void Java_org_linphone_core_LinphoneCoreImpl_setAndroidPowerManager(J #endif } +/*released in Java_org_linphone_core_LinphoneCoreImpl_delete*/ extern "C" void Java_org_linphone_core_LinphoneCoreImpl_setAndroidWifiLock(JNIEnv *env, jobject thiz, jlong ptr, jobject wifi_lock) { #ifdef ANDROID LinphoneCore *lc=(LinphoneCore*)ptr; - if (lc->wifi_lock) + if (lc->wifi_lock) { env->DeleteGlobalRef(lc->wifi_lock); + env->DeleteGlobalRef(lc->wifi_lock_class); + } if (wifi_lock != NULL) { lc->wifi_lock=env->NewGlobalRef(wifi_lock); - jclass wifiLockClass = env->FindClass("android/net/wifi/WifiManager$WifiLock"); - lc->wifi_lock_acquire_id = env->GetMethodID(wifiLockClass, "acquire", "()V"); - lc->wifi_lock_release_id = env->GetMethodID(wifiLockClass, "release", "()V"); + lc->wifi_lock_class = env->FindClass("android/net/wifi/WifiManager$WifiLock"); + lc->wifi_lock_class = (jclass)env->NewGlobalRef(lc->wifi_lock_class); /*to make sure methodid are preserved*/ + lc->wifi_lock_acquire_id = env->GetMethodID(lc->wifi_lock_class, "acquire", "()V"); + lc->wifi_lock_release_id = env->GetMethodID(lc->wifi_lock_class, "release", "()V"); } else { lc->wifi_lock=NULL; + lc->wifi_lock_class=NULL; } #endif } +/*released in Java_org_linphone_core_LinphoneCoreImpl_delete*/ extern "C" void Java_org_linphone_core_LinphoneCoreImpl_setAndroidMulticastLock(JNIEnv *env, jobject thiz, jlong ptr, jobject multicast_lock) { #ifdef ANDROID LinphoneCore *lc=(LinphoneCore*)ptr; - if (lc->multicast_lock) + if (lc->multicast_lock) { env->DeleteGlobalRef(lc->multicast_lock); + env->DeleteGlobalRef(lc->multicast_lock_class); + } if (multicast_lock != NULL) { lc->multicast_lock=env->NewGlobalRef(multicast_lock); - jclass multicastLockClass = env->FindClass("android/net/wifi/WifiManager$MulticastLock"); - lc->multicast_lock_acquire_id = env->GetMethodID(multicastLockClass, "acquire", "()V"); - lc->multicast_lock_release_id = env->GetMethodID(multicastLockClass, "release", "()V"); + lc->multicast_lock_class = env->FindClass("android/net/wifi/WifiManager$MulticastLock"); + lc->multicast_lock_class = (jclass)env->NewGlobalRef(lc->multicast_lock_class);/*to make sure methodid are preserved*/ + lc->multicast_lock_acquire_id = env->GetMethodID(lc->multicast_lock_class, "acquire", "()V"); + lc->multicast_lock_release_id = env->GetMethodID(lc->multicast_lock_class, "release", "()V"); } else { lc->multicast_lock=NULL; + lc->multicast_lock_class=NULL; } #endif } diff --git a/coreapi/private.h b/coreapi/private.h index d5a59d85f..4414f50ec 100644 --- a/coreapi/private.h +++ b/coreapi/private.h @@ -805,9 +805,11 @@ struct _LinphoneCore LinphoneCoreVTable *current_vtable; // the latest vtable to call a callback, see linphone_core_get_current_vtable #ifdef ANDROID jobject wifi_lock; + jclass wifi_lock_class; jmethodID wifi_lock_acquire_id; jmethodID wifi_lock_release_id; jobject multicast_lock; + jclass multicast_lock_class; jmethodID multicast_lock_acquire_id; jmethodID multicast_lock_release_id; #endif diff --git a/mediastreamer2 b/mediastreamer2 index ed0c1f307..ca8ad4af2 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit ed0c1f30701c6a3bb0607243834f5b58a2720381 +Subproject commit ca8ad4af235b8131d43687343577e98ba0142c72 From a03fd63d7bc025cd0f8b51b5f3b24d5fe4625874 Mon Sep 17 00:00:00 2001 From: Margaux Clerc Date: Mon, 23 Feb 2015 14:47:49 +0100 Subject: [PATCH 74/90] Add DTLS --- java/common/org/linphone/core/LinphoneCore.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/java/common/org/linphone/core/LinphoneCore.java b/java/common/org/linphone/core/LinphoneCore.java index 2b7ce9cde..495f6642a 100644 --- a/java/common/org/linphone/core/LinphoneCore.java +++ b/java/common/org/linphone/core/LinphoneCore.java @@ -269,6 +269,10 @@ public interface LinphoneCore { * ZRTP */ static public final MediaEncryption ZRTP = new MediaEncryption(2,"ZRTP"); + /** + * DTLS + */ + static public final MediaEncryption DTLS = new MediaEncryption(3,"DTLS"); protected final int mValue; private final String mStringValue; From 5253675b40d02ebd362dd6fa74040b1edea4c863 Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Tue, 24 Feb 2015 10:26:11 +0100 Subject: [PATCH 75/90] i18n: use --non-interactive mode in push_transifex, even if this is dangerous this is the best way to handle stdin within Makefile --- Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.am b/Makefile.am index b392c23e9..74467b7c9 100644 --- a/Makefile.am +++ b/Makefile.am @@ -175,7 +175,7 @@ pull-transifex: $(MAKE) -C po update-po push-transifex: - tx push -s -t -f + tx push -s -t -f --no-interactive ### WINDOWS From ccc31f0b50f2f4c3e1d52c2729507d97d1377b1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Grisez?= Date: Mon, 23 Feb 2015 14:52:03 +0100 Subject: [PATCH 76/90] Rewrite README.mingw to match with 80-columned terminals --- README.mingw | 81 +++++++++++++++++++++++++++++++++------------------- 1 file changed, 51 insertions(+), 30 deletions(-) diff --git a/README.mingw b/README.mingw index 5e859680b..6f5414753 100644 --- a/README.mingw +++ b/README.mingw @@ -29,7 +29,8 @@ Download lastest linphone-deps-win32 zip from http://download.savannah.gnu.org/releases-noredirect/linphone/misc using your browser. -Download gtk+-2.24.10 win32 _bundle_ from http://www.gtk.org, direct link: http://ftp.gnome.org/pub/gnome/binaries/win32/gtk+/2.24/gtk+-bundle_2.24.10-20120208_win32.zip +Download gtk+-2.24.10 win32 _bundle_ from http://www.gtk.org, direct link: +http://ftp.gnome.org/pub/gnome/binaries/win32/gtk+/2.24/gtk+-bundle_2.24.10-20120208_win32.zip Install all these three package in /: @@ -46,26 +47,35 @@ tar -xvzf GTK2-Outcrop.tar.gz #To get the translations working, remove from C:/MinGW/lib : libintl.a libintl.la libintl.dll.a -* Download and install Inno Setup Compiler (required only if you run 'make setup.exe'). Add it to your windows Path environment variable. +* Download and install Inno Setup Compiler (required only if you run +'make setup.exe'). Add it to your windows Path environment variable. -* Install msys-git from (http://msysgit.github.io/). During installation you are asked to make a choice about how line endings are treated by git. Choose "Checkout line endings as they are, commit as they are". THIS CHOICE IS VERY IMPORTANT. OTHERS BREAK AUTOMAKE. +* Install msys-git from (http://msysgit.github.io/). During installation you +are asked to make a choice about how line endings are treated by git. Choose +"Checkout line endings as they are, commit as they are". THIS CHOICE IS VERY +IMPORTANT. OTHERS BREAK AUTOMAKE. General rules for compilation ***************************** -- It is recommended that you create a directory somewhere with a path without any spaces or ~ characters, for example c:\sources\. - This is the place where source code must be compiled. -- git commands (to retrieve source code) must be performed within msys-git terminal. -- all other commands (configure, autogen.sh, make) must be done within the mingw shell (msys). -In both msys and msys-git windows, change into the directory you created for sources: -cd /c/sources -- make sure pkg-config works by adding this env variable to your terminal: - export PKG_CONFIG_PATH=/usr/lib/pkgconfig +* It is recommended that you create a directory somewhere with a path without + any spaces or ~ characters, for example c:\sources\. This is the place where + source code must be compiled. +* git commands (to retrieve source code) must be performed within msys-git + terminal. +* all other commands (configure, autogen.sh, make) must be done within the + mingw shell (msys). In both msys and msys-git windows, change into the + directory you created for sources: + cd /c/sources + +* make sure pkg-config works by adding this env variable to your terminal: + export PKG_CONFIG_PATH=/usr/lib/pkgconfig Building belle-sip ****************** - * make sure that java version 1.6 is available in the PATH. java-1.7 will not work with antlr generator. + * make sure that java version 1.6 is available in the PATH. java-1.7 will + not work with antlr generator. * download the sources with msys-git shell using the following command: $ git clone git://git.linphone.org/belle-sip.git * compile and install @@ -80,11 +90,12 @@ Building Linphone $ git clone git://git.linphone.org/linphone.git --recursive * compile - #always run autogen.sh after a git checkout or update + #always run autogen.sh after a git checkout or update $ ./autogen.sh $ ./configure --prefix=/usr --enable-shared --disable-static - #note: in order to use the tunnel (commercial extension), append --enable-tunnel to the configure line above. + #note: in order to use the tunnel (commercial extension), append + #--enable-tunnel to the configure line above. $ make $ make install @@ -92,15 +103,18 @@ Building Linphone #Option: make a portable binary zip of linphone $ make zip - #additionally you can make binary installer if you have Inno Setup 5 installed in its default path + #additionally you can make binary installer if you have Inno Setup 5 + installed in its default path $ make setup.exe - #now you're done, you have a fresh linphone windows installer in the current directory. + #now you're done, you have a fresh linphone windows installer in the + current directory. Building plugins (optional) *************************** - This the example for msx264 (H264 plugin), the same applies for other linphone plugins. + This the example for msx264 (H264 plugin), the same applies for other + linphone plugins. $ git clone git://git.linphone.org/msx264.git $ cd msx264 $ ./autogen.sh @@ -115,17 +129,17 @@ Building plugins (optional) * Notes about linphone-deps generation * ****************************************************** -Linphone-deps is a collection of linphone dependencies, that are for some of them difficult -to find as windows binaries. -These notes are useful if you want to upgrade part of the software that is included in the -linphone-deps packages. +Linphone-deps is a collection of linphone dependencies, that are for some of +them difficult to find as windows binaries. These notes are useful if you want +to upgrade part of the software that is included in the linphone-deps packages. List of software included in linphone-deps: antlr3c (compiled) bzrtp (compiled) polarssl (compiled libsrtp (compiled) -libavcodec, libavutil, libavformat, libavdevice, libswscale (compiled, all these from ffmpeg) +libavcodec, libavutil, libavformat, libavdevice, libswscale (compiled, all +these from ffmpeg) libtheora (from the web) libx264 (compiled from the version distributed from linphone's web site) libogg (from the web) @@ -137,8 +151,10 @@ libsoup (compiled) libsqlite3 (compiled) Remarks: -For every package compiled that goes into linphone-deps, .la files (libtool files) must be removed to avoid libtool errors. -When running "make install DESTDIR=", somepath must be absolute and should not contain any ~ or space. +For every package compiled that goes into linphone-deps, .la files (libtool +files) must be removed to avoid libtool errors. When running "make install +DESTDIR=", somepath must be absolute and should not contain any ~ or +space. - building antlr3c * download the sources with: @@ -192,9 +208,12 @@ When running "make install DESTDIR=", somepath must be absolute and sh ./configure --enable-shared --disable-static --enable-memalign-hack --extra-cflags="-fno-common" --enable-gpl && make make install DESTDIR=/home//ffmpeg-install Copy to ~/ffmpeg-install/usr/local/* to linphone-deps/. - Copy also all *.dll.a files from the build tree to lib/ directort of linphone-deps. These are the implibs necessary to link a program against the dlls. + Copy also all *.dll.a files from the build tree to lib/ directort of + linphone-deps. These are the implibs necessary to link a program against the + dlls. -- building libxml2: the binaries found on the internet are generated with MSVC++, and for obscure reason they are not suitable for building libsoup +- building libxml2: the binaries found on the internet are generated with + MSVC++, and for obscure reason they are not suitable for building libsoup (that requires libxml2). ./configure --enable-shared --disable-static && make && make install DESTDIR=/home//libxml2-install copy ~/libxml2-install/usr/local/* into linphone-deps/. @@ -217,12 +236,14 @@ When running "make install DESTDIR=", somepath must be absolute and sh - add to linphone-deps - building libsoup (only required for buddylookup plugin) - - download source from gnome ftp (warning: at the time of the writing only version 2.26.x can compile with the - glib version supplied in the gtk-bundle, 2.27 requires a new version of glib) + - download source from gnome ftp (warning: at the time of the writing + only version 2.26.x can compile with the glib version supplied in the + gtk-bundle, 2.27 requires a new version of glib) - uncompress libgnutls zip in / - make sure you have libxml2 installed in / - - apply a bugfix patch (fix gnutls support on windows, completely broken otherwise). The patch - is in linphone-deps/src, apply it this way: + - apply a bugfix patch (fix gnutls support on windows, completely + broken otherwise). The patch is in linphone-deps/src, apply it this + way: cd libsoup-2.26.* cd libsoup patch -p0 < libsoup-gnutls-bugfix.patch From 46b84df670b2ba12dffb11359077e08a74deda77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Grisez?= Date: Tue, 24 Feb 2015 10:27:13 +0100 Subject: [PATCH 77/90] Fix build issue on Windows --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index ca8ad4af2..3d23e9d8a 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit ca8ad4af235b8131d43687343577e98ba0142c72 +Subproject commit 3d23e9d8aee73fae6fc6bf68f432d43c00828c96 From 2c7b9f2cf256baaa7905eb2825c5db5fd19bb149 Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Tue, 24 Feb 2015 11:41:28 +0100 Subject: [PATCH 78/90] configure.ac: only set AC_CONFIG_MACOS_FLAGS when using MacPorts, not HomeBrew --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index dd0c323f5..bde0a2872 100644 --- a/configure.ac +++ b/configure.ac @@ -79,7 +79,7 @@ case $target in x86_64-apple-darwin*|i686-apple-darwin*) MSPLUGINS_CFLAGS="" dnl use macport installation - ACLOCAL_MACOS_FLAGS="-I /opt/local/share/aclocal" + AS_IF([test -d "/opt/local/share/aclocal"], [ACLOCAL_MACOS_FLAGS="-I /opt/local/share/aclocal"]) build_macos=yes ;; From 119c596b9e48b17c09ed6e3c6a43d483502f9799 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Tue, 24 Feb 2015 11:52:38 +0100 Subject: [PATCH 79/90] Added test for file transfer using old way: setting file's url in message's external body --- tester/message_tester.c | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/tester/message_tester.c b/tester/message_tester.c index dd6cf4700..e2491048f 100644 --- a/tester/message_tester.c +++ b/tester/message_tester.c @@ -827,6 +827,41 @@ static void file_transfer_message_download_cancelled(void) { ms_error("Test skipped"); } +static void file_transfer_using_external_body_url(void) { + char *to; + LinphoneChatMessageCbs *cbs; + LinphoneChatRoom *chat_room; + LinphoneChatMessage *message; + LinphoneCoreManager *marie = linphone_core_manager_new("marie_rc"); + LinphoneCoreManager *pauline = linphone_core_manager_new("pauline_rc"); + reset_counters(&marie->stat); + reset_counters(&pauline->stat); + + /* create a chatroom on pauline's side */ + to = linphone_address_as_string(marie->identity); + chat_room = linphone_core_create_chat_room(pauline->lc,to); + + message = linphone_chat_room_create_message(chat_room, NULL); + + cbs = linphone_chat_message_get_callbacks(message); + linphone_chat_message_cbs_set_msg_state_changed(cbs, liblinphone_tester_chat_message_msg_state_changed); + + 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)); + 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_EQUAL(pauline->stat.number_of_LinphoneMessageInProgress, 1); + CU_ASSERT_EQUAL(marie->stat.number_of_LinphoneMessageExtBodyReceived, 1); + + linphone_core_manager_destroy(marie); + linphone_core_manager_destroy(pauline); +} + static void text_message_with_send_error(void) { LinphoneCoreManager* marie = linphone_core_manager_new("marie_rc"); LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc"); @@ -1203,6 +1238,7 @@ test_t message_tests[] = { /* { "File transfer message with io error at download", file_transfer_message_io_error_download },*/ { "File transfer message upload cancelled", file_transfer_message_upload_cancelled }, { "File transfer message download cancelled", file_transfer_message_download_cancelled }, + { "File transfer message using external body url", file_transfer_using_external_body_url }, { "Text message denied", text_message_denied }, { "Info message", info_message }, { "Info message with body", info_message_with_body }, From 80fe123e62dad8317e724640e4ad81bd53beca66 Mon Sep 17 00:00:00 2001 From: Johan Pascal Date: Tue, 24 Feb 2015 12:58:19 +0100 Subject: [PATCH 80/90] Add configure switch to enable usage of g729 Annex B in RFC3389 Comfort Noise payload --- configure.ac | 10 ++++++++++ mediastreamer2 | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index bde0a2872..d696bf31b 100644 --- a/configure.ac +++ b/configure.ac @@ -638,6 +638,16 @@ AC_ARG_ENABLE(dtls, [dtls=false] ) +AC_ARG_ENABLE(g729bCN, + [AS_HELP_STRING([--enable-g729bCN], [Turn on or off usage of G729AnnexB in RFC3389 implementation of Comfort Noise Payload (default=no)])], + [case "${enableval}" in + yes) g729bCN=true ;; + no) g729bCN=false ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-g729bCN) ;; + esac], + [g729bCN=false] +) + dnl build console if required AM_CONDITIONAL(BUILD_CONSOLE, test x$console_ui = xtrue) diff --git a/mediastreamer2 b/mediastreamer2 index 3d23e9d8a..680421e38 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 3d23e9d8aee73fae6fc6bf68f432d43c00828c96 +Subproject commit 680421e382ac666d58866f00e1ac5693d939fc07 From 21f9d22b0a48171d09fe2980952b8981cc3c2274 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Tue, 24 Feb 2015 15:55:07 +0100 Subject: [PATCH 81/90] Added accept header in register --- coreapi/bellesip_sal/sal_op_registration.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/coreapi/bellesip_sal/sal_op_registration.c b/coreapi/bellesip_sal/sal_op_registration.c index f6b6547a3..d56587db2 100644 --- a/coreapi/bellesip_sal/sal_op_registration.c +++ b/coreapi/bellesip_sal/sal_op_registration.c @@ -74,6 +74,7 @@ static void register_refresher_listener (belle_sip_refresher_t* refresher int sal_register(SalOp *op, const char *proxy, const char *from, int expires){ belle_sip_request_t *req; belle_sip_uri_t* req_uri; + belle_sip_header_t* accept_header; if (op->refresher){ belle_sip_refresher_stop(op->refresher); @@ -92,6 +93,8 @@ int sal_register(SalOp *op, const char *proxy, const char *from, int expires){ time_t curtime=time(NULL); belle_sip_message_add_header(BELLE_SIP_MESSAGE(req),BELLE_SIP_HEADER(belle_sip_header_date_create_from_time(&curtime))); } + accept_header = belle_sip_header_create("Accept", "application/sdp, text/plain, application/vnd.gsma.rcs-ft-http+xml"); + belle_sip_message_add_header(BELLE_SIP_MESSAGE(req), accept_header); belle_sip_message_set_header(BELLE_SIP_MESSAGE(req),(belle_sip_header_t*)sal_op_create_contact(op)); return sal_op_send_and_create_refresher(op,req,expires,register_refresher_listener); } From 49a91becb72b3cc1e750e49773188a8f4e3c3016 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Tue, 24 Feb 2015 18:10:49 +0100 Subject: [PATCH 82/90] cleanups, add network simulation api to liblinphone --- coreapi/dict.c | 2 +- coreapi/event.h | 2 +- coreapi/help/doxygen.dox | 6 ++++++ coreapi/linphone_tunnel.cc | 24 ++--------------------- coreapi/linphone_tunnel.h | 4 ++-- coreapi/linphonecall.c | 3 ++- coreapi/linphonecore.h | 21 ++++++++++++++++++++ coreapi/misc.c | 40 ++++++++++++++++++++++++++++++++++++++ coreapi/private.h | 1 + mediastreamer2 | 2 +- oRTP | 2 +- tester/call_tester.c | 17 ++++++++-------- 12 files changed, 86 insertions(+), 38 deletions(-) diff --git a/coreapi/dict.c b/coreapi/dict.c index 4535e1a27..417bb33f0 100644 --- a/coreapi/dict.c +++ b/coreapi/dict.c @@ -27,7 +27,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. /** - * @addtogroup linphone_dict + * @addtogroup misc * @{ **/ diff --git a/coreapi/event.h b/coreapi/event.h index 894f3e32a..fe3f984de 100644 --- a/coreapi/event.h +++ b/coreapi/event.h @@ -20,7 +20,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #define LINPHONEEVENT_H /** - * @addtogroup subscriptions + * @addtogroup event_api * @{ **/ diff --git a/coreapi/help/doxygen.dox b/coreapi/help/doxygen.dox index 0f8e094f4..a8baa5138 100644 --- a/coreapi/help/doxygen.dox +++ b/coreapi/help/doxygen.dox @@ -221,6 +221,12 @@ void text_received(LinphoneCore *lc, LinphoneChatRoom *room, const LinphoneAddre * **/ + +/** + * @defgroup event_api Managing generic subscriptions and publishes + * The LinphoneEvent api allows application to control subscriptions, receive notifications and make publish to peers, in a generic manner. + */ + /** * @defgroup misc Miscenalleous: logs, version strings, config storage **/ diff --git a/coreapi/linphone_tunnel.cc b/coreapi/linphone_tunnel.cc index 9dd4e8adf..7dd27d890 100644 --- a/coreapi/linphone_tunnel.cc +++ b/coreapi/linphone_tunnel.cc @@ -29,8 +29,6 @@ #include "private.h" #include "lpconfig.h" -static const char *_tunnel_mode_str[3] = { "disable", "enable", "auto" }; - LinphoneTunnel* linphone_core_get_tunnel(const LinphoneCore *lc){ return lc->tunnel; } @@ -234,7 +232,7 @@ void linphone_tunnel_clean_servers(LinphoneTunnel *tunnel){ } void linphone_tunnel_set_mode(LinphoneTunnel *tunnel, LinphoneTunnelMode mode){ - lp_config_set_string(config(tunnel),"tunnel","mode", tunnel_mode_to_string(mode)); + lp_config_set_string(config(tunnel),"tunnel","mode", linphone_tunnel_mode_to_string(mode)); bcTunnel(tunnel)->setMode(mode); } @@ -336,31 +334,13 @@ static void my_ortp_logv(OrtpLogLevel level, const char *fmt, va_list args){ ortp_logv(level,fmt,args); } -LinphoneTunnelMode string_to_tunnel_mode(const char *string) { - if(string != NULL) { - int i; - for(i=0; i<3 && strcmp(string, _tunnel_mode_str[i]) != 0; i++); - if(i<3) { - return (LinphoneTunnelMode)i; - } else { - ms_error("Invalid tunnel mode '%s'", string); - return LinphoneTunnelModeDisable; - } - } else { - return LinphoneTunnelModeDisable; - } -} - -const char *tunnel_mode_to_string(LinphoneTunnelMode mode) { - return _tunnel_mode_str[mode]; -} /** * Startup tunnel using configuration. * Called internally from linphonecore at startup. */ void linphone_tunnel_configure(LinphoneTunnel *tunnel){ - LinphoneTunnelMode mode = string_to_tunnel_mode(lp_config_get_string(config(tunnel), "tunnel", "mode", NULL)); + LinphoneTunnelMode mode = linphone_tunnel_mode_from_string(lp_config_get_string(config(tunnel), "tunnel", "mode", NULL)); bool_t tunnelizeSIPPackets = (bool_t)lp_config_get_int(config(tunnel), "tunnel", "sip", TRUE); linphone_tunnel_enable_logs_with_handler(tunnel,TRUE,my_ortp_logv); linphone_tunnel_load_config(tunnel); diff --git a/coreapi/linphone_tunnel.h b/coreapi/linphone_tunnel.h index f071f3c37..c1c378ed3 100644 --- a/coreapi/linphone_tunnel.h +++ b/coreapi/linphone_tunnel.h @@ -65,14 +65,14 @@ typedef enum _LinphoneTunnelMode { * @return An LinphoneTunnelMode enum. If the passed string is NULL or * does not match with any mode, the LinphoneTunnelModeDisable is returned. */ -LINPHONE_PUBLIC LinphoneTunnelMode string_to_tunnel_mode(const char *string); +LINPHONE_PUBLIC LinphoneTunnelMode linphone_tunnel_mode_from_string(const char *string); /** * Convert a tunnel mode enum into string * @param mode Enum to convert * @return "disable", "enable" or "auto" */ -LINPHONE_PUBLIC const char *tunnel_mode_to_string(LinphoneTunnelMode mode); +LINPHONE_PUBLIC const char *linphone_tunnel_mode_to_string(LinphoneTunnelMode mode); /** * Create a new tunnel configuration diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c index b118b163f..94573cad1 100644 --- a/coreapi/linphonecall.c +++ b/coreapi/linphonecall.c @@ -1863,7 +1863,7 @@ void linphone_call_init_audio_stream(LinphoneCall *call){ 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); - + 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); ms_free(cname); @@ -1972,6 +1972,7 @@ void linphone_call_init_video_stream(LinphoneCall *call){ 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); + 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); ms_free(cname); diff --git a/coreapi/linphonecore.h b/coreapi/linphonecore.h index 7e3994706..5f1e4f5c2 100644 --- a/coreapi/linphonecore.h +++ b/coreapi/linphonecore.h @@ -3481,6 +3481,27 @@ LINPHONE_PUBLIC void linphone_core_enable_video_multicast(LinphoneCore *core, bo **/ LINPHONE_PUBLIC bool_t linphone_core_video_multicast_enabled(const LinphoneCore *core); +/** + * Set the network simulator parameters. + * Liblinphone has the capabability of simulating the effects of a network (latency, lost packets, jitter, max bandwidth). + * Please refer to the oRTP documentation for the meaning of the parameters of the OrtpNetworkSimulatorParams structure. + * This function has effect for future calls, but not for currently running calls, though this behavior may be changed in future versions. + * @warning Due to design of network simulation in oRTP, simulation is applied independently for audio and video stream. This means for example that a bandwidth + * limit of 250kbit/s will have no effect on an audio stream running at 40kbit/s while a videostream targetting 400kbit/s will be highly affected. + * @param lc the LinphoneCore + * @param params the parameters used for the network simulation. + * @return 0 if successful, -1 otherwise. +**/ +LINPHONE_PUBLIC int linphone_core_set_network_simulator_params(LinphoneCore *lc, const OrtpNetworkSimulatorParams *params); + + +/** + * Get the previously set network simulation parameters. + * @see linphone_core_set_network_simulator_params + * @return a OrtpNetworkSimulatorParams structure. +**/ +LINPHONE_PUBLIC const OrtpNetworkSimulatorParams *linphone_core_get_network_simulator_params(const LinphoneCore *lc); + #ifdef __cplusplus } #endif diff --git a/coreapi/misc.c b/coreapi/misc.c index 5912acc8f..666ac8919 100644 --- a/coreapi/misc.c +++ b/coreapi/misc.c @@ -1600,3 +1600,43 @@ bool_t linphone_core_symmetric_rtp_enabled(LinphoneCore*lc){ return lp_config_get_int(lc->config,"rtp","symmetric",1); } +int linphone_core_set_network_simulator_params(LinphoneCore *lc, const OrtpNetworkSimulatorParams *params){ + if (params!=&lc->net_conf.netsim_params) + lc->net_conf.netsim_params=*params; + /*TODO: should we make some sanity checks on the parameters here*/ + return 0; +} + +const OrtpNetworkSimulatorParams *linphone_core_get_network_simulator_params(const LinphoneCore *lc){ + return &lc->net_conf.netsim_params; +} + +static const char *_tunnel_mode_str[3] = { "disable", "enable", "auto" }; + +LinphoneTunnelMode linphone_tunnel_mode_from_string(const char *string) { + if(string != NULL) { + int i; + for(i=0; i<3 && strcmp(string, _tunnel_mode_str[i]) != 0; i++); + if(i<3) { + return (LinphoneTunnelMode)i; + } else { + ms_error("Invalid tunnel mode '%s'", string); + return LinphoneTunnelModeDisable; + } + } else { + return LinphoneTunnelModeDisable; + } +} + +const char *linphone_tunnel_mode_to_string(LinphoneTunnelMode mode) { + switch(mode){ + case LinphoneTunnelModeAuto: + return "auto"; + case LinphoneTunnelModeDisable: + return "disable"; + case LinphoneTunnelModeEnable: + return "enable"; + } + return "invalid"; +} + diff --git a/coreapi/private.h b/coreapi/private.h index 4414f50ec..d08c569ff 100644 --- a/coreapi/private.h +++ b/coreapi/private.h @@ -622,6 +622,7 @@ typedef struct net_config int download_bw; int upload_bw; int mtu; + OrtpNetworkSimulatorParams netsim_params; bool_t nat_sdp_only; }net_config_t; diff --git a/mediastreamer2 b/mediastreamer2 index 680421e38..0765d7dc4 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 680421e382ac666d58866f00e1ac5693d939fc07 +Subproject commit 0765d7dc442b85e3ecb27c7e1678dde2adecb3f1 diff --git a/oRTP b/oRTP index 60f6d0f90..d515df047 160000 --- a/oRTP +++ b/oRTP @@ -1 +1 @@ -Subproject commit 60f6d0f909eddcefc83960f791ff30097c1e5c33 +Subproject commit d515df047678da3777b5e4691dc069c6837f77bf diff --git a/tester/call_tester.c b/tester/call_tester.c index 5442364d7..326a2a29e 100644 --- a/tester/call_tester.c +++ b/tester/call_tester.c @@ -2354,18 +2354,18 @@ void call_base(LinphoneMediaEncryption mode, bool_t enable_video,bool_t enable_r } - if (policy == LinphonePolicyUseIce) + if (policy == LinphonePolicyUseIce){ + int i=0; CU_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); + linphone_core_iterate(pauline->lc); + } + } #ifdef VIDEO_ENABLED if (enable_video) { - int i=0; if (linphone_core_video_supported(marie->lc)) { - for (i=0;i<100;i++) { /*fixme to workaround a crash*/ - ms_usleep(20000); - linphone_core_iterate(marie->lc); - linphone_core_iterate(pauline->lc); - } - add_video(pauline,marie); if (policy == LinphonePolicyUseIce) CU_ASSERT_TRUE(check_ice(pauline,marie,enable_tunnel?LinphoneIceStateReflexiveConnection:LinphoneIceStateHostConnection)); @@ -2376,7 +2376,6 @@ void call_base(LinphoneMediaEncryption mode, bool_t enable_video,bool_t enable_r } else { ms_warning ("not tested because video not available"); } - } #endif From 2a2ef0f94d8afe8218605fc0a61bdc533b88f736 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Tue, 24 Feb 2015 18:22:41 +0100 Subject: [PATCH 83/90] fix compile issue --- coreapi/TunnelManager.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/coreapi/TunnelManager.cc b/coreapi/TunnelManager.cc index bbce579a3..128707a12 100644 --- a/coreapi/TunnelManager.cc +++ b/coreapi/TunnelManager.cc @@ -202,8 +202,8 @@ void TunnelManager::setMode(LinphoneTunnelMode mode) { return; } ms_message("TunnelManager: switching mode from %s to %s", - tunnel_mode_to_string(mMode), - tunnel_mode_to_string(mode)); + linphone_tunnel_mode_to_string(mMode), + linphone_tunnel_mode_to_string(mode)); switch(mode) { case LinphoneTunnelModeEnable: if(mState == disabled) { From 6057309befaf9fc60452483d41addd9411f752e4 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Tue, 24 Feb 2015 19:21:36 +0100 Subject: [PATCH 84/90] update ms2 --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index 0765d7dc4..785d2e628 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 0765d7dc442b85e3ecb27c7e1678dde2adecb3f1 +Subproject commit 785d2e6282b9f6fb6579ce221d6d8d67f58d5b43 From 32c226da910fbe6c202707ed25f41c90082d17a8 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Tue, 24 Feb 2015 21:31:35 +0100 Subject: [PATCH 85/90] avoid crash in a failed test --- tester/dtmf_tester.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tester/dtmf_tester.c b/tester/dtmf_tester.c index 1c80c21c6..c4c2e3bfe 100644 --- a/tester/dtmf_tester.c +++ b/tester/dtmf_tester.c @@ -46,6 +46,10 @@ void send_dtmf_base(bool_t use_rfc2833, bool_t use_sipinfo, char dtmf, char* dtm CU_ASSERT_TRUE(call(pauline,marie)); marie_call = linphone_core_get_current_call(marie->lc); + + CU_ASSERT_PTR_NOT_NULL(marie_call); + + if (!marie_call) return; if (dtmf != '\0') { dtmf_count_prev = pauline->stat.dtmf_count; From c7aa499ddb1ca9c0f330ba4c0e39eecdd11564bd Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Tue, 24 Feb 2015 22:12:15 +0100 Subject: [PATCH 86/90] telephone-event and confort noise are not so necessary in video streams, actually. --- coreapi/linphonecall.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c index 94573cad1..f877feae6 100644 --- a/coreapi/linphonecall.c +++ b/coreapi/linphonecall.c @@ -356,9 +356,8 @@ typedef struct _CodecConstraints{ MSList *previously_used; }CodecConstraints; -static MSList *make_codec_list(LinphoneCore *lc, CodecConstraints * hints, const MSList *codecs){ +static MSList *make_codec_list(LinphoneCore *lc, CodecConstraints * hints, SalStreamType stype, const MSList *codecs){ MSList *l=NULL; - MSList *specials=NULL; const MSList *it; int nb = 0; @@ -389,8 +388,10 @@ static MSList *make_codec_list(LinphoneCore *lc, CodecConstraints * hints, const nb++; if ((hints->max_codecs > 0) && (nb >= hints->max_codecs)) break; } - specials=create_special_payload_types(lc,l); - l=ms_list_concat(l,specials); + if (stype==SalAudio){ + MSList *specials=create_special_payload_types(lc,l); + l=ms_list_concat(l,specials); + } linphone_core_assign_payload_type_numbers(lc, l); return l; } @@ -633,7 +634,7 @@ void linphone_call_make_local_media_description(LinphoneCore *lc, LinphoneCall * codec_hints.bandwidth_limit=call->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, lc->codecs_conf.audio_codecs); + l=make_codec_list(lc, &codec_hints, SalAudio, lc->codecs_conf.audio_codecs); md->streams[0].max_rate=get_max_codec_sample_rate(l); md->streams[0].payloads=l; if (call->audiostream && call->audiostream->ms.sessions.rtp_session) { @@ -658,7 +659,7 @@ void linphone_call_make_local_media_description(LinphoneCore *lc, LinphoneCall * codec_hints.bandwidth_limit=0; codec_hints.max_codecs=-1; codec_hints.previously_used=old_md ? old_md->streams[1].already_assigned_payloads : NULL; - l=make_codec_list(lc, &codec_hints, lc->codecs_conf.video_codecs); + l=make_codec_list(lc, &codec_hints, SalVideo, lc->codecs_conf.video_codecs); md->streams[1].payloads=l; if (call->videostream && call->videostream->ms.sessions.rtp_session) { char* me = linphone_address_as_string_uri_only(call->me); @@ -684,7 +685,7 @@ void linphone_call_make_local_media_description(LinphoneCore *lc, LinphoneCall * codec_hints.bandwidth_limit=0; codec_hints.max_codecs=1; codec_hints.previously_used=NULL; - l = make_codec_list(lc, &codec_hints, lc->codecs_conf.video_codecs); + l = make_codec_list(lc, &codec_hints, SalVideo, lc->codecs_conf.video_codecs); md->streams[i].payloads = l; } setup_encryption_keys(call,md); From 8906700884487b91bfdc12c40abbc2f2dc9f0173 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Wed, 25 Feb 2015 09:05:08 +0100 Subject: [PATCH 87/90] robustize tests --- tester/call_tester.c | 43 +++++++++++++++++++++++++------------------ 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/tester/call_tester.c b/tester/call_tester.c index 326a2a29e..aa01fb48f 100644 --- a/tester/call_tester.c +++ b/tester/call_tester.c @@ -3078,28 +3078,35 @@ static void multiple_early_media(void) { marie1_call=linphone_core_get_current_call(marie1->lc); marie2_call=linphone_core_get_current_call(marie2->lc); - /*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); + CU_ASSERT_PTR_NOT_NULL(pauline_call); + CU_ASSERT_PTR_NOT_NULL(marie1_call); + CU_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); - 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)); + 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)); - /*marie2 should get her call terminated*/ - CU_ASSERT_TRUE(wait_for_list(lcs,&marie2->stat.number_of_LinphoneCallEnd,1,1000)); + /*marie2 should get her call terminated*/ + CU_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); + /*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); - /*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)); + /*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)); + } linphone_core_terminate_all_calls(pauline->lc); CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallEnd,1,3000)); From f940c5098bb72fddea574528ac1f560cc2756fb7 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Wed, 25 Feb 2015 09:12:34 +0100 Subject: [PATCH 88/90] update ms2 --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index 785d2e628..73cd58c02 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 785d2e6282b9f6fb6579ce221d6d8d67f58d5b43 +Subproject commit 73cd58c02e540ac0017c36729510cba97088c42f From 084e21cbde56fb71f1cf5de1b243c8f9c9016b05 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Tue, 24 Feb 2015 18:17:34 +0100 Subject: [PATCH 89/90] fix dtls sdp path when dtls attribute are in sdp session --- coreapi/bellesip_sal/sal_sdp.c | 33 ++++++++++++--------------------- 1 file changed, 12 insertions(+), 21 deletions(-) diff --git a/coreapi/bellesip_sal/sal_sdp.c b/coreapi/bellesip_sal/sal_sdp.c index 1504b25c6..806b50e10 100644 --- a/coreapi/bellesip_sal/sal_sdp.c +++ b/coreapi/bellesip_sal/sal_sdp.c @@ -674,8 +674,6 @@ static SalStreamDescription * sdp_to_stream_description(SalMediaDescription *md, stream=&md->streams[md->nb_streams]; media=belle_sdp_media_description_get_media ( media_desc ); - memset ( stream,0,sizeof ( *stream ) ); - proto = belle_sdp_media_get_protocol ( media ); stream->proto=SalProtoOther; if ( proto ) { @@ -748,8 +746,6 @@ static SalStreamDescription * sdp_to_stream_description(SalMediaDescription *md, } /* Read DTLS specific attributes : check is some are found in the stream description otherwise copy the session description one(which are at least set to Invalid) */ - stream->dtls_role = SalDtlsRoleInvalid; - stream->dtls_fingerprint[0] = '\0'; if (((stream->proto == SalProtoUdpTlsRtpSavpf) || (stream->proto == SalProtoUdpTlsRtpSavp))) { attribute=belle_sdp_media_description_get_attribute(media_desc,"setup"); if (attribute && (value=belle_sdp_attribute_get_value(attribute))!=NULL){ @@ -760,10 +756,9 @@ static SalStreamDescription * sdp_to_stream_description(SalMediaDescription *md, } else if (strncmp(value, "passive", 7) == 0) { stream->dtls_role = SalDtlsRoleIsServer; } - if (stream->dtls_role != SalDtlsRoleInvalid) { - attribute=belle_sdp_media_description_get_attribute(media_desc,"fingerprint"); - strncpy(stream->dtls_fingerprint, belle_sdp_attribute_get_value(attribute),sizeof(stream->dtls_fingerprint)); - } + } + if (stream->dtls_role != SalDtlsRoleInvalid && (attribute=belle_sdp_media_description_get_attribute(media_desc,"fingerprint"))) { + strncpy(stream->dtls_fingerprint, belle_sdp_attribute_get_value(attribute),sizeof(stream->dtls_fingerprint)); } } @@ -796,6 +791,8 @@ int sdp_to_media_description ( belle_sdp_session_description_t *session_desc, S belle_sdp_media_description_t* media_desc; belle_sdp_session_name_t *sname; const char* value; + SalDtlsRole session_role=SalDtlsRoleInvalid; + int i; desc->nb_streams = 0; desc->dir = SalStreamSendRecv; @@ -825,7 +822,6 @@ int sdp_to_media_description ( belle_sdp_session_description_t *session_desc, S /*DTLS attributes can be defined at session level.*/ value=belle_sdp_session_description_get_attribute_value(session_desc,"setup"); if (value){ - SalDtlsRole session_role=SalDtlsRoleInvalid; if (strncmp(value, "actpass", 7) == 0) { session_role = SalDtlsRoleUnset; } else if (strncmp(value, "active", 6) == 0) { @@ -833,19 +829,14 @@ int sdp_to_media_description ( belle_sdp_session_description_t *session_desc, S } else if (strncmp(value, "passive", 7) == 0) { session_role = SalDtlsRoleIsServer; } - value=belle_sdp_session_description_get_attribute_value(session_desc,"fingerprint"); - if (value){ - int i; - /*copy dtls attributes to every streams, might be overwritten stream by stream*/ - for (i=0;istreams[i].dtls_fingerprint, value, sizeof(desc->streams[i].dtls_fingerprint)); - desc->streams[i].dtls_role=session_role; - } - } - } - - + value=belle_sdp_session_description_get_attribute_value(session_desc,"fingerprint"); + /*copy dtls attributes to every streams, might be overwritten stream by stream*/ + for (i=0;istreams[i].dtls_fingerprint, value, sizeof(desc->streams[i].dtls_fingerprint)); + desc->streams[i].dtls_role=session_role; /*set or reset value*/ + } /* Get ICE remote ufrag and remote pwd, and ice_lite flag */ value=belle_sdp_session_description_get_attribute_value(session_desc,"ice-ufrag"); From ccf541c8e7fad78c6ffba1c206ed55012687aebf Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Wed, 25 Feb 2015 10:31:25 +0100 Subject: [PATCH 90/90] robustize tests --- mediastreamer2 | 2 +- tester/call_tester.c | 236 +++++++++++++++++++++++-------------------- 2 files changed, 126 insertions(+), 112 deletions(-) diff --git a/mediastreamer2 b/mediastreamer2 index 73cd58c02..938c6e4ca 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 73cd58c02e540ac0017c36729510cba97088c42f +Subproject commit 938c6e4cade5c09e6cfa5a5e9189007f8323f3d0 diff --git a/tester/call_tester.c b/tester/call_tester.c index aa01fb48f..7171e22b9 100644 --- a/tester/call_tester.c +++ b/tester/call_tester.c @@ -2684,32 +2684,35 @@ static void unattended_call_transfer_with_error(void) { LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc"); 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(marie,pauline)); - pauline_called_by_marie=linphone_core_get_current_call(marie->lc); + CU_ASSERT_TRUE((call_ok=call(marie,pauline))); + if (call_ok){ + pauline_called_by_marie=linphone_core_get_current_call(marie->lc); - reset_counters(&marie->stat); - reset_counters(&pauline->stat); + reset_counters(&marie->stat); + 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)); + 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)); - /*Pauline starts the transfer*/ - CU_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)); + /*Pauline starts the transfer*/ + CU_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)); - /*the error must be reported back to marie*/ - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneTransferCallError,1,2000)); + /*the error must be reported back to marie*/ + CU_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)); + /*and pauline should resume the call automatically*/ + CU_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)); + /*and call should be resumed*/ + CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallStreamsRunning,1,2000)); + } linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); @@ -2721,70 +2724,71 @@ static void call_transfer_existing_call_outgoing_call(void) { LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc"); LinphoneCoreManager* laure = linphone_core_manager_new( "laure_rc"); - LinphoneCall* marie_call_pauline; LinphoneCall* pauline_called_by_marie; LinphoneCall* marie_call_laure; LinphoneCall* laure_called_by_marie; LinphoneCall* lcall; - - MSList* lcs=ms_list_append(NULL,marie->lc); + 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(marie,pauline)); - 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)); + CU_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)); - /*marie call laure*/ - CU_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)); + /*marie call laure*/ + CU_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)); - reset_counters(&marie->stat); - reset_counters(&pauline->stat); - reset_counters(&laure->stat); + reset_counters(&marie->stat); + reset_counters(&pauline->stat); + reset_counters(&laure->stat); - 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)); + 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)); - /*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)); - /*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)); + /*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)); + /*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)); - /*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); - linphone_core_accept_call(laure->lc,lcall); - break; + /*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); + 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)); + 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)); - /*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)); + /*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)); + } linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); @@ -2797,31 +2801,35 @@ static void check_call_state(LinphoneCoreManager* mgr,LinphoneCallState state) { if (linphone_core_get_current_call(mgr->lc)) CU_ASSERT_EQUAL(linphone_call_get_state(linphone_core_get_current_call(mgr->lc)),state); } + static void call_established_with_rejected_info(void) { LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc"); int dummy=0; + bool_t call_ok=FALSE; - CU_ASSERT_TRUE(call(pauline,marie)); + CU_ASSERT_TRUE((call_ok=call(pauline,marie))); + if (call_ok){ - sal_enable_unconditional_answer(marie->lc->sal,TRUE); - linphone_call_send_info_message(linphone_core_get_current_call(pauline->lc),linphone_core_create_info_message(pauline->lc)); + sal_enable_unconditional_answer(marie->lc->sal,TRUE); + linphone_call_send_info_message(linphone_core_get_current_call(pauline->lc),linphone_core_create_info_message(pauline->lc)); - wait_for_until(marie->lc,pauline->lc,&dummy,1,1000); /*just to sleep while iterating 1s*/ + wait_for_until(marie->lc,pauline->lc,&dummy,1,1000); /*just to sleep while iterating 1s*/ - sal_enable_unconditional_answer(marie->lc->sal,FALSE); + 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); + 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); - check_call_state(pauline,LinphoneCallStreamsRunning); - check_call_state(marie,LinphoneCallStreamsRunning); + 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)); + /*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); @@ -2831,30 +2839,32 @@ static void call_established_with_rejected_info(void) { static void call_established_with_rejected_reinvite(void) { LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc"); + bool_t call_ok=FALSE; - CU_ASSERT_TRUE(call(pauline,marie)); - - 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*/ + CU_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*/ - 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))); + 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(marie->lc,pauline->lc,&pauline->stat.number_of_LinphoneCallStreamsRunning,2)); + CU_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); + CU_ASSERT_EQUAL(linphone_call_get_reason(linphone_core_get_current_call(pauline->lc)),LinphoneReasonNotAcceptable); - CU_ASSERT_EQUAL(marie->stat.number_of_LinphoneCallStreamsRunning,1); - check_call_state(pauline,LinphoneCallStreamsRunning); - check_call_state(marie,LinphoneCallStreamsRunning); + CU_ASSERT_EQUAL(marie->stat.number_of_LinphoneCallStreamsRunning,1); + 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)); + /*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); @@ -2863,33 +2873,37 @@ static void call_established_with_rejected_reinvite(void) { static void call_established_with_rejected_incoming_reinvite(void) { LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc"); + bool_t call_ok=FALSE; - CU_ASSERT_TRUE(call(pauline,marie)); + CU_ASSERT_TRUE((call_ok=call(pauline,marie))); + + if (call_ok){ - /*wait for ACK to be transmitted before going to reINVITE*/ - wait_for_until(marie->lc,pauline->lc,NULL,0,1000); + /*wait for ACK to be transmitted before going to reINVITE*/ + wait_for_until(marie->lc,pauline->lc,NULL,0,1000); - 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*/ + 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*/ - linphone_core_update_call(marie->lc - ,linphone_core_get_current_call(marie->lc) - ,linphone_call_get_current_params(linphone_core_get_current_call(marie->lc))); + linphone_core_update_call(marie->lc + ,linphone_core_get_current_call(marie->lc) + ,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)); + 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_EQUAL(linphone_call_get_reason(linphone_core_get_current_call(marie->lc)),LinphoneReasonNotAcceptable); + CU_ASSERT_EQUAL(linphone_call_get_reason(linphone_core_get_current_call(marie->lc)),LinphoneReasonNotAcceptable); - CU_ASSERT_EQUAL(pauline->stat.number_of_LinphoneCallStreamsRunning,1); - check_call_state(pauline,LinphoneCallStreamsRunning); - check_call_state(marie,LinphoneCallStreamsRunning); + CU_ASSERT_EQUAL(pauline->stat.number_of_LinphoneCallStreamsRunning,1); + 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)); + /*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);