diff --git a/coreapi/proxy.c b/coreapi/proxy.c index c93b02240..7077c9973 100644 --- a/coreapi/proxy.c +++ b/coreapi/proxy.c @@ -1430,21 +1430,19 @@ uint8_t linphone_proxy_config_get_avpf_rr_interval(const LinphoneProxyConfig *cf } const LinphoneAddress *linphone_proxy_config_get_contact (const LinphoneProxyConfig *cfg) { - // Workaround for wrapping. - if (cfg->contact_address) { - linphone_address_unref(cfg->contact_address); - const_cast(cfg)->contact_address = NULL; - } - // Warning : Do not remove, the op can change its contact_address if (!cfg->op) return NULL; const SalAddress *salAddr = cfg->op->get_contact_address(); if (!salAddr) return NULL; - char *buf = sal_address_as_string(salAddr); - const_cast(cfg)->contact_address = linphone_address_new(buf); - ms_free(buf); + if (cfg->contact_address) + L_GET_PRIVATE_FROM_C_OBJECT(cfg->contact_address)->setInternalAddress(const_cast(salAddr)); + else { + char *buf = sal_address_as_string(salAddr); + const_cast(cfg)->contact_address = linphone_address_new(buf); + ms_free(buf); + } return cfg->contact_address; } diff --git a/src/address/address-p.h b/src/address/address-p.h index ce7d273b5..0679ca67a 100644 --- a/src/address/address-p.h +++ b/src/address/address-p.h @@ -36,6 +36,7 @@ public: inline const SalAddress *getInternalAddress () const { return internalAddress; } + void setInternalAddress (const SalAddress *value); private: struct AddressCache { diff --git a/src/address/address.cpp b/src/address/address.cpp index eaaf13545..84bdd37b7 100644 --- a/src/address/address.cpp +++ b/src/address/address.cpp @@ -33,6 +33,12 @@ LINPHONE_BEGIN_NAMESPACE // ----------------------------------------------------------------------------- +void AddressPrivate::setInternalAddress (const SalAddress *addr) { + internalAddress = sal_address_clone(addr); +} + +// ----------------------------------------------------------------------------- + Address::Address (const string &address) : ClonableObject(*new AddressPrivate) { L_D(); if (!(d->internalAddress = sal_address_new(L_STRING_TO_C(address)))) { diff --git a/src/call/call-p.h b/src/call/call-p.h index 6a53434f9..f9d4bbe2c 100644 --- a/src/call/call-p.h +++ b/src/call/call-p.h @@ -78,6 +78,7 @@ private: bool onCallSessionAccepted (const std::shared_ptr &session) override; void onCallSessionConferenceStreamStarting (const std::shared_ptr &session, bool mute) override; void onCallSessionConferenceStreamStopping (const std::shared_ptr &session) override; + void onCallSessionEarlyFailed (const std::shared_ptr &session, LinphoneErrorInfo *ei) override; void onCallSessionSetReleased (const std::shared_ptr &session) override; void onCallSessionSetTerminated (const std::shared_ptr &session) override; void onCallSessionStartReferred (const std::shared_ptr &session) override; diff --git a/src/call/call.cpp b/src/call/call.cpp index f6f11c844..af0807777 100644 --- a/src/call/call.cpp +++ b/src/call/call.cpp @@ -223,6 +223,17 @@ void CallPrivate::onCallSessionConferenceStreamStopping (const shared_ptrconf_ctx, L_GET_C_BACK_PTR(q)); } +void CallPrivate::onCallSessionEarlyFailed (const shared_ptr &session, LinphoneErrorInfo *ei) { + L_Q(); + LinphoneCallLog *log = session->getLog(); + linphone_core_report_early_failed_call(q->getCore()->getCCore(), + linphone_call_log_get_dir(log), + linphone_address_clone(linphone_call_log_get_from(log)), + linphone_address_clone(linphone_call_log_get_to(log)), + ei); + linphone_call_unref(L_GET_C_BACK_PTR(q)); +} + void CallPrivate::onCallSessionSetReleased (const shared_ptr &session) { L_Q(); linphone_call_unref(L_GET_C_BACK_PTR(q)); diff --git a/src/conference/session/call-session-listener.h b/src/conference/session/call-session-listener.h index f97f36b21..e8c4e6528 100644 --- a/src/conference/session/call-session-listener.h +++ b/src/conference/session/call-session-listener.h @@ -37,6 +37,7 @@ public: virtual bool onCallSessionAccepted (const std::shared_ptr &session) { return false; } virtual void onCallSessionConferenceStreamStarting (const std::shared_ptr &session, bool mute) {} virtual void onCallSessionConferenceStreamStopping (const std::shared_ptr &session) {} + virtual void onCallSessionEarlyFailed (const std::shared_ptr &session, LinphoneErrorInfo *ei) {} virtual void onCallSessionSetReleased (const std::shared_ptr &session) {} virtual void onCallSessionSetTerminated (const std::shared_ptr &session) {} virtual void onCallSessionStartReferred (const std::shared_ptr &session) {} diff --git a/src/conference/session/media-session.cpp b/src/conference/session/media-session.cpp index caf1b395f..aab3420f4 100644 --- a/src/conference/session/media-session.cpp +++ b/src/conference/session/media-session.cpp @@ -4329,9 +4329,8 @@ void MediaSession::startIncomingNotification () { if (sal_media_description_empty(md) || linphone_core_incompatible_security(getCore()->getCCore(), md)) { LinphoneErrorInfo *ei = linphone_error_info_new(); linphone_error_info_set(ei, nullptr, LinphoneReasonNotAcceptable, 488, "Not acceptable here", nullptr); -#if 0 - linphone_core_report_early_failed_call(d->core, LinphoneCallIncoming, linphone_address_ref(from_addr), linphone_address_ref(to_addr), ei); -#endif + if (d->listener) + d->listener->onCallSessionEarlyFailed(getSharedFromThis(), ei); d->op->decline(SalReasonNotAcceptable, nullptr); return; } diff --git a/tester/call_single_tester.c b/tester/call_single_tester.c index dd3718347..b0ce5d7c8 100644 --- a/tester/call_single_tester.c +++ b/tester/call_single_tester.c @@ -5557,7 +5557,6 @@ static void call_logs_migrate(void) { call_logs_attr = linphone_core_get_call_logs_attribute(laure->lc); *call_logs_attr = bctbx_list_free_with_data(*call_logs_attr, (void (*)(void*))linphone_call_log_unref); *call_logs_attr = linphone_core_read_call_logs_from_config_file(laure->lc); - BC_ASSERT_TRUE(bctbx_list_size(linphone_core_get_call_logs(laure->lc)) == 0); unlink(logs_db); ms_free(logs_db);