diff --git a/coreapi/chat.c b/coreapi/chat.c index 7617f0e55..e445d2bfa 100644 --- a/coreapi/chat.c +++ b/coreapi/chat.c @@ -132,7 +132,9 @@ static void linphone_chat_message_process_response_from_post_file(void *data, co char *content_type=belle_sip_strdup_printf("%s/%s", msg->file_transfer_information->type, msg->file_transfer_information->subtype); /* create a user body handler to take care of the file */ - belle_sip_user_body_handler_t *first_part_bh=belle_sip_user_body_handler_new(msg->file_transfer_information->size+linphone_chat_message_compute_filepart_header_size(msg->file_transfer_information->name, content_type), NULL, NULL, linphone_chat_message_file_transfer_on_send_body, msg); + size_t body_size = msg->file_transfer_information->size+linphone_chat_message_compute_filepart_header_size(msg->file_transfer_information->name, content_type); + + belle_sip_user_body_handler_t *first_part_bh=belle_sip_user_body_handler_new(body_size,NULL,NULL,linphone_chat_message_file_transfer_on_send_body,msg); /* insert it in a multipart body handler which will manage the boundaries of multipart message */ belle_sip_multipart_body_handler_t *bh=belle_sip_multipart_body_handler_new(linphone_chat_message_file_transfer_on_progress, msg, (belle_sip_body_handler_t *)first_part_bh); @@ -959,10 +961,33 @@ static void on_recv_body(belle_sip_user_body_handler_t *bh, belle_sip_message_t lc->vtable.file_transfer_received(lc, chatMsg, chatMsg->file_transfer_information, (char *)buffer, size); } return; - - /* feed the callback with the received data */ +} +static LinphoneContent* linphone_chat_create_file_transfer_information_from_headers(const belle_sip_message_t* message ){ + LinphoneContent *content = ms_malloc0(sizeof(LinphoneContent)); + + belle_sip_header_content_length_t* content_length_hdr = BELLE_SIP_HEADER_CONTENT_LENGTH(belle_sip_message_get_header(message, "Content-Length")); + belle_sip_header_content_type_t* content_type_hdr = BELLE_SIP_HEADER_CONTENT_TYPE(belle_sip_message_get_header(message, "Content-Type")); + const char* type = NULL,*subtype = NULL; + + content->name = ms_strdup(""); + + if( content_type_hdr ){ + type = belle_sip_header_content_type_get_type(content_type_hdr); + subtype = belle_sip_header_content_type_get_subtype(content_type_hdr); + ms_message("Extracted content type %s / %s from header", type?type:"", subtype?subtype:""); + if( type ) content->type = ms_strdup(type); + if( subtype ) content->type = ms_strdup(subtype); + } + + if( content_length_hdr ){ + content->size = belle_sip_header_content_length_get_content_length(content_length_hdr); + ms_message("Extracted content length %i from header", (int)content->size); + } + + + return content; } static void linphone_chat_process_response_headers_from_get_file(void *data, const belle_http_response_event_t *event){ @@ -970,9 +995,21 @@ static void linphone_chat_process_response_headers_from_get_file(void *data, con /*we are receiving a response, set a specific body handler to acquire the response. * if not done, belle-sip will create a memory body handler, the default*/ LinphoneChatMessage *message=(LinphoneChatMessage *)belle_sip_object_data_get(BELLE_SIP_OBJECT(event->request),"message"); + belle_sip_message_t* response = BELLE_SIP_MESSAGE(event->response); + size_t body_size = 0; + + if( message->file_transfer_information == NULL ){ + ms_warning("No file transfer information for message %p: creating...", message); + message->file_transfer_information = linphone_chat_create_file_transfer_information_from_headers(response); + } + + if( message->file_transfer_information ){ + body_size = message->file_transfer_information->size; + } + belle_sip_message_set_body_handler( (belle_sip_message_t*)event->response, - (belle_sip_body_handler_t*)belle_sip_user_body_handler_new(message->file_transfer_information->size, linphone_chat_message_file_transfer_on_progress,on_recv_body,NULL,message) + (belle_sip_body_handler_t*)belle_sip_user_body_handler_new(body_size, linphone_chat_message_file_transfer_on_progress,on_recv_body,NULL,message) ); } } diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index 276dd82f7..d12a92bdf 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -756,6 +756,7 @@ static void sip_config_read(LinphoneCore *lc) sal_use_dates(lc->sal,lp_config_get_int(lc->config,"sip","put_date",0)); sal_enable_sip_update_method(lc->sal,lp_config_get_int(lc->config,"sip","sip_update",1)); lc->sip_conf.vfu_with_info=lp_config_get_int(lc->config,"sip","vfu_with_info",1); + linphone_core_set_sip_transport_timeout(lc, lp_config_get_int(lc->config, "sip", "transport_timeout", 63000)); } static void rtp_config_read(LinphoneCore *lc) @@ -1115,6 +1116,16 @@ void linphone_core_set_upload_bandwidth(LinphoneCore *lc, int bw){ if (linphone_core_ready(lc)) lp_config_set_int(lc->config,"net","upload_bw",bw); } +void linphone_core_set_sip_transport_timeout(LinphoneCore *lc, int timeout_ms) { + sal_set_transport_timeout(lc->sal, timeout_ms); + if (linphone_core_ready(lc)) + lp_config_set_int(lc->config, "sip", "transport_timeout", timeout_ms); +} + +int linphone_core_get_sip_transport_timeout(LinphoneCore *lc) { + return sal_get_transport_timeout(lc->sal); +} + void linphone_core_enable_dns_srv(LinphoneCore *lc, bool_t enable) { sal_enable_dns_srv(lc->sal, enable); if (linphone_core_ready(lc)) diff --git a/coreapi/linphonecore.h b/coreapi/linphonecore.h index fda0ccc7c..6e0d88807 100644 --- a/coreapi/linphonecore.h +++ b/coreapi/linphonecore.h @@ -1811,6 +1811,22 @@ LINPHONE_PUBLIC void linphone_core_set_upload_ptime(LinphoneCore *lc, int ptime) LINPHONE_PUBLIC int linphone_core_get_upload_ptime(LinphoneCore *lc); +/** + * Set the SIP transport timeout. + * @param[in] lc #LinphoneCore object. + * @param[in] timeout_ms The SIP transport timeout in milliseconds. + * @ingroup media_parameters + */ +void linphone_core_set_sip_transport_timeout(LinphoneCore *lc, int timeout_ms); + +/** + * Get the SIP transport timeout. + * @param[in] lc #LinphoneCore object. + * @return The SIP transport timeout in milliseconds. + * @ingroup media_parameters + */ +int linphone_core_get_sip_transport_timeout(LinphoneCore *lc); + /** * Enable or disable DNS SRV resolution. * @param[in] lc #LinphoneCore object. diff --git a/coreapi/linphonecore_jni.cc b/coreapi/linphonecore_jni.cc index 78eb797c3..c43b6e3c3 100644 --- a/coreapi/linphonecore_jni.cc +++ b/coreapi/linphonecore_jni.cc @@ -1482,12 +1482,11 @@ extern "C" jboolean Java_org_linphone_core_LinphoneCoreImpl_needsEchoCalibration const char *card=linphone_core_get_capture_device((LinphoneCore*)lc); sndcard=ms_snd_card_manager_get_card(m,card); if (sndcard == NULL){ - ms_error("Could not get soundcard."); + ms_error("Could not get soundcard %s", card); return TRUE; } if (ms_snd_card_get_capabilities(sndcard) & MS_SND_CARD_CAP_BUILTIN_ECHO_CANCELLER) return FALSE; - if (ms_snd_card_get_minimal_latency(sndcard)==0) return TRUE; - return FALSE; + return TRUE; } extern "C" jint Java_org_linphone_core_LinphoneCoreImpl_getMediaEncryption(JNIEnv* env @@ -2994,6 +2993,37 @@ JNIEXPORT jint JNICALL Java_org_linphone_core_LinphoneProxyConfigImpl_getAvpfRRI return (jint)linphone_proxy_config_get_avpf_rr_interval((LinphoneProxyConfig *)ptr); } + + +JNIEXPORT void JNICALL Java_org_linphone_core_LinphoneProxyConfigImpl_enableQualityReporting(JNIEnv *env, jobject thiz, jlong ptr, jboolean enable) { + linphone_proxy_config_enable_quality_reporting((LinphoneProxyConfig *)ptr, (bool)enable); +} + +JNIEXPORT jboolean JNICALL Java_org_linphone_core_LinphoneProxyConfigImpl_quality_reportingEnabled(JNIEnv *env, jobject thiz, jlong ptr) { + return linphone_proxy_config_quality_reporting_enabled((LinphoneProxyConfig *)ptr); +} + +JNIEXPORT void JNICALL Java_org_linphone_core_LinphoneProxyConfigImpl_setQualityReportingInterval(JNIEnv *env, jobject thiz, jlong ptr, jint interval) { + linphone_proxy_config_set_quality_reporting_interval((LinphoneProxyConfig *)ptr, (uint8_t)interval); +} + +JNIEXPORT jint JNICALL Java_org_linphone_core_LinphoneProxyConfigImpl_getQualityReportingInterval(JNIEnv *env, jobject thiz, jlong ptr) { + return (jint)linphone_proxy_config_get_quality_reporting_interval((LinphoneProxyConfig *)ptr); +} + +JNIEXPORT void JNICALL Java_org_linphone_core_LinphoneProxyConfigImpl_setQualityReportingCollector(JNIEnv *env, jobject thiz, jlong ptr, jstring jcollector) { + if (jcollector){ + const char *collector=env->GetStringUTFChars(jcollector, NULL); + linphone_proxy_config_set_quality_reporting_collector((LinphoneProxyConfig *)ptr, collector); + env->ReleaseStringUTFChars(jcollector,collector); + } +} + +JNIEXPORT jstring JNICALL Java_org_linphone_core_LinphoneProxyConfigImpl_getQualityReportingCollector(JNIEnv *env, jobject thiz, jlong ptr) { + jstring jvalue = env->NewStringUTF(linphone_proxy_config_get_quality_reporting_collector((LinphoneProxyConfig *)ptr)); + return jvalue; +} + extern "C" jint Java_org_linphone_core_LinphoneCallImpl_getDuration(JNIEnv* env,jobject thiz,jlong ptr) { return (jint)linphone_call_get_duration((LinphoneCall *) ptr); } diff --git a/coreapi/linphonepresence.h b/coreapi/linphonepresence.h index 780ae22b6..014821328 100644 --- a/coreapi/linphonepresence.h +++ b/coreapi/linphonepresence.h @@ -752,7 +752,7 @@ LINPHONE_PUBLIC void linphone_presence_model_set_user_data(LinphonePresenceModel * @param[in] model The #LinphonePresenceModel object for which to get the user data. * @return A pointer to the user data. */ -LINPHONE_PUBLIC void * linphone_presence_model_get_user_data(LinphonePresenceModel *model); +LINPHONE_PUBLIC void * linphone_presence_model_get_user_data(const LinphonePresenceModel *model); /** * Increase the reference count of the #LinphonePresenceService object. @@ -780,7 +780,7 @@ LINPHONE_PUBLIC void linphone_presence_service_set_user_data(LinphonePresenceSer * @param[in] service The #LinphonePresenceService object for which to get the user data. * @return A pointer to the user data. */ -LINPHONE_PUBLIC void * linphone_presence_service_get_user_data(LinphonePresenceService *service); +LINPHONE_PUBLIC void * linphone_presence_service_get_user_data(const LinphonePresenceService *service); /** * Increase the reference count of the #LinphonePresencePerson object. @@ -808,7 +808,7 @@ LINPHONE_PUBLIC void linphone_presence_person_set_user_data(LinphonePresencePers * @param[in] person The #LinphonePresencePerson object for which to get the user data. * @return A pointer to the user data. */ -LINPHONE_PUBLIC void * linphone_presence_person_get_user_data(LinphonePresencePerson *person); +LINPHONE_PUBLIC void * linphone_presence_person_get_user_data(const LinphonePresencePerson *person); /** * Increase the reference count of the #LinphonePresenceActivity object. @@ -836,7 +836,7 @@ LINPHONE_PUBLIC void linphone_presence_activity_set_user_data(LinphonePresenceAc * @param[in] activity The #LinphonePresenceActivity object for which to get the user data. * @return A pointer to the user data. */ -LINPHONE_PUBLIC void * linphone_presence_activity_get_user_data(LinphonePresenceActivity *activity); +LINPHONE_PUBLIC void * linphone_presence_activity_get_user_data(const LinphonePresenceActivity *activity); /** * Increase the reference count of the #LinphonePresenceNote object. @@ -864,7 +864,7 @@ LINPHONE_PUBLIC void linphone_presence_note_set_user_data(LinphonePresenceNote * * @param[in] note The #LinphonePresenceNote object for which to get the user data. * @return A pointer to the user data. */ -LINPHONE_PUBLIC void * linphone_presence_note_get_user_data(LinphonePresenceNote *note); +LINPHONE_PUBLIC void * linphone_presence_note_get_user_data(const LinphonePresenceNote *note); /***************************************************************************** diff --git a/coreapi/presence.c b/coreapi/presence.c index 183002b86..97aca82b4 100644 --- a/coreapi/presence.c +++ b/coreapi/presence.c @@ -1043,7 +1043,7 @@ void linphone_presence_model_set_user_data(LinphonePresenceModel *model, void *u model->user_data = user_data; } -void * linphone_presence_model_get_user_data(LinphonePresenceModel *model) { +void * linphone_presence_model_get_user_data(const LinphonePresenceModel *model) { return model->user_data; } @@ -1065,7 +1065,7 @@ void linphone_presence_service_set_user_data(LinphonePresenceService *service, v service->user_data = user_data; } -void * linphone_presence_service_get_user_data(LinphonePresenceService *service) { +void * linphone_presence_service_get_user_data(const LinphonePresenceService *service) { return service->user_data; } @@ -1087,7 +1087,7 @@ void linphone_presence_person_set_user_data(LinphonePresencePerson *person, void person->user_data = user_data; } -void * linphone_presence_person_get_user_data(LinphonePresencePerson *person) { +void * linphone_presence_person_get_user_data(const LinphonePresencePerson *person) { return person->user_data; } @@ -1109,7 +1109,7 @@ void linphone_presence_activity_set_user_data(LinphonePresenceActivity *activity activity->user_data = user_data; } -void * linphone_presence_activity_get_user_data(LinphonePresenceActivity *activity) { +void * linphone_presence_activity_get_user_data(const LinphonePresenceActivity *activity) { return activity->user_data; } @@ -1131,7 +1131,7 @@ void linphone_presence_note_set_user_data(LinphonePresenceNote *note, void *user note->user_data = user_data; } -void * linphone_presence_note_get_user_data(LinphonePresenceNote *note) { +void * linphone_presence_note_get_user_data(const LinphonePresenceNote *note) { return note->user_data; } diff --git a/coreapi/proxy.c b/coreapi/proxy.c index fb8519c32..409ddb4a3 100644 --- a/coreapi/proxy.c +++ b/coreapi/proxy.c @@ -275,13 +275,13 @@ int linphone_proxy_config_set_route(LinphoneProxyConfig *obj, const char *route) bool_t linphone_proxy_config_check(LinphoneCore *lc, LinphoneProxyConfig *obj){ if (obj->reg_proxy==NULL){ - if (lc->vtable.display_warning) + if (lc && lc->vtable.display_warning) lc->vtable.display_warning(lc,_("The sip proxy address you entered is invalid, it must start with \"sip:\"" " followed by a hostname.")); return FALSE; } if (obj->reg_identity==NULL){ - if (lc->vtable.display_warning) + if (lc && lc->vtable.display_warning) lc->vtable.display_warning(lc,_("The sip identity you entered is invalid.\nIt should look like " "sip:username@proxydomain, such as sip:alice@example.net")); return FALSE; diff --git a/java/common/org/linphone/core/LinphoneProxyConfig.java b/java/common/org/linphone/core/LinphoneProxyConfig.java index b34363e5f..c2c742bd4 100644 --- a/java/common/org/linphone/core/LinphoneProxyConfig.java +++ b/java/common/org/linphone/core/LinphoneProxyConfig.java @@ -172,6 +172,12 @@ public interface LinphoneProxyConfig { */ void enableAvpf(boolean enable); + /** + * Whether AVPF is used for calls through this proxy. + * @return + */ + boolean avpfEnabled(); + /** * Set the interval between regular RTCP reports when using AVPF/SAVPF. * @param interval The interval in seconds (between 0 and 5 seconds). @@ -185,14 +191,45 @@ public interface LinphoneProxyConfig { int getAvpfRRInterval(); /** - * Whether AVPF is used for calls through this proxy. + * Indicates whether quality reporting must be used for calls using this proxy config. + * @param enable True to enable quality reporting, false to disable it. + */ + void enableQualityReporting(boolean enable); + + + /** + * Whether quality reporting is used for calls through this proxy. * @return */ - boolean avpfEnabled(); + boolean qualityReportingEnabled(); + + /** + * Set the interval between quality interval reports during a call when using quality reporting. + * @param interval The interval in seconds (should be greater than 120 seconds to avoid too much). + */ + void setQualityReportingInterval(int interval); + + /** + * Get the interval between quality interval reports during a call when using quality reporting. + * @return The interval in seconds. + */ + int getQualityReportingInterval(); + + /** + * Set the collector SIP URI to collect reports when using quality reporting. + * @param collector The collector SIP URI which should be configured server side too. + */ + void setQualityReportingCollector(String collector); + + /** + * Get the collector SIP URI collecting reports when using quality reporting. + * @return The SIP URI collector address. + */ + String getQualityReportingCollector(); /** * Set optional contact parameters that will be added to the contact information sent in the registration. - * @param contact_params a string contaning the additional parameters in text form, like "myparam=something;myparam2=something_else" + * @param contact_params a string containing the additional parameters in text form, like "myparam=something;myparam2=something_else" * * The main use case for this function is provide the proxy additional information regarding the user agent, like for example unique identifier or android push id. * As an example, the contact address in the SIP register sent will look like ;android-push-id=43143-DFE23F-2323-FA2232. @@ -207,7 +244,7 @@ public interface LinphoneProxyConfig { /** * Set optional contact parameters that will be added to the contact information sent in the registration, inside the URI. - * @param params a string contaning the additional parameters in text form, like "myparam=something;myparam2=something_else" + * @param params a string containing the additional parameters in text form, like "myparam=something;myparam2=something_else" * * The main use case for this function is provide the proxy additional information regarding the user agent, like for example unique identifier or apple push id. * As an example, the contact address in the SIP register sent will look like . @@ -215,7 +252,7 @@ public interface LinphoneProxyConfig { public void setContactUriParameters(String params); /** - * Get the contact's uri parameters. + * Get the contact's URI parameters. * @return */ public String getContactUriParameters(); diff --git a/java/impl/org/linphone/core/LinphoneProxyConfigImpl.java b/java/impl/org/linphone/core/LinphoneProxyConfigImpl.java index 1288ac39f..475fe352d 100644 --- a/java/impl/org/linphone/core/LinphoneProxyConfigImpl.java +++ b/java/impl/org/linphone/core/LinphoneProxyConfigImpl.java @@ -304,4 +304,44 @@ class LinphoneProxyConfigImpl implements LinphoneProxyConfig { public ErrorInfo getErrorInfo() { return new ErrorInfoImpl(getErrorInfo(nativePtr)); } + + private native void enableQualityReporting(long nativePtr, boolean enable); + @Override + public void enableQualityReporting(boolean enable) { + isValid(); + enableQualityReporting(nativePtr, enable); + } + + private native boolean qualityReportingEnabled(long nativePtr); + @Override + public boolean qualityReportingEnabled() { + isValid(); + return avpfEnabled(nativePtr); + } + + private native void setQualityReportingInterval(long nativePtr, int interval); + @Override + public void setQualityReportingInterval(int interval) { + isValid(); + setQualityReportingInterval(nativePtr, interval); + } + private native int getQualityReportingInterval(long nativePtr); + @Override + public int getQualityReportingInterval() { + isValid(); + return getQualityReportingInterval(nativePtr); + } + private native void setQualityReportingCollector(long nativePtr, String collector); + @Override + public void setQualityReportingCollector(String collector) { + isValid(); + setQualityReportingCollector(nativePtr, collector); + } + private native String getQualityReportingCollector(long nativePtr); + @Override + public String getQualityReportingCollector() { + + isValid(); + return getQualityReportingCollector(nativePtr); + } } diff --git a/mediastreamer2 b/mediastreamer2 index 6155d6437..b40af312e 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 6155d6437712ac049be34b73ddc51a85d62c9f9b +Subproject commit b40af312e90b6c91bbee360f430ed87fa26119e9 diff --git a/tester/setup_tester.c b/tester/setup_tester.c index 760cdf6bd..546042714 100644 --- a/tester/setup_tester.c +++ b/tester/setup_tester.c @@ -127,6 +127,8 @@ void linphone_proxy_config_address_equal_test() { void linphone_proxy_config_is_server_config_changed_test() { LinphoneProxyConfig* proxy_config = linphone_proxy_config_new(); + linphone_proxy_config_done(proxy_config); /*test done without edit*/ + linphone_proxy_config_set_identity(proxy_config,"sip:toto@titi"); linphone_proxy_config_edit(proxy_config); linphone_proxy_config_set_identity(proxy_config,"sips:toto@titi");