diff --git a/coreapi/chat.c b/coreapi/chat.c index b453892eb..daf9b7bb6 100644 --- a/coreapi/chat.c +++ b/coreapi/chat.c @@ -138,7 +138,6 @@ LinphoneChatRoom * linphone_core_create_client_group_chat_room(LinphoneCore *lc, LinphoneChatRoom *_linphone_core_join_client_group_chat_room (LinphoneCore *lc, const LinphonePrivate::Address &addr) { LinphoneChatRoom *cr = _linphone_client_group_chat_room_new(lc, addr.asString().c_str(), nullptr); L_GET_CPP_PTR_FROM_C_OBJECT(cr)->join(); - _linphone_core_add_group_chat_room(lc, L_GET_CPP_PTR_FROM_C_OBJECT(cr)->getConferenceAddress()->asStringUriOnly().c_str(), linphone_chat_room_ref(cr)); lc->chatrooms = bctbx_list_append(lc->chatrooms, cr); return cr; } diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index 3401c9bec..d9b99e31d 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -7106,14 +7106,18 @@ bool_t _linphone_core_has_group_chat_room(const LinphoneCore *lc, const char *id return result; } -void _linphone_core_add_group_chat_room(LinphoneCore *lc, const char *id, LinphoneChatRoom *cr) { - bctbx_pair_t *pair = reinterpret_cast(bctbx_pair_cchar_new(id, linphone_chat_room_ref(cr))); +void _linphone_core_add_group_chat_room(LinphoneCore *lc, const LinphonePrivate::Address &addr, LinphoneChatRoom *cr) { + Address cleanedAddr = addr; + cleanedAddr.setPort(0); + bctbx_pair_t *pair = reinterpret_cast(bctbx_pair_cchar_new(cleanedAddr.asStringUriOnly().c_str(), linphone_chat_room_ref(cr))); bctbx_map_cchar_insert_and_delete(lc->group_chat_rooms, pair); } LinphoneChatRoom *_linphone_core_find_group_chat_room(const LinphoneCore *lc, const char *id) { LinphoneChatRoom *result = nullptr; - bctbx_iterator_t *it = bctbx_map_cchar_find_key(lc->group_chat_rooms, id); + Address cleanedAddr(id); + cleanedAddr.setPort(0); + bctbx_iterator_t *it = bctbx_map_cchar_find_key(lc->group_chat_rooms, cleanedAddr.asStringUriOnly().c_str()); bctbx_iterator_t *endit = bctbx_map_cchar_end(lc->group_chat_rooms); if (!bctbx_iterator_cchar_equals(it, endit)) result = reinterpret_cast(bctbx_pair_cchar_get_second(bctbx_iterator_cchar_get_pair(it))); diff --git a/coreapi/private.h b/coreapi/private.h index 74a551576..ca1d8cf20 100644 --- a/coreapi/private.h +++ b/coreapi/private.h @@ -450,7 +450,7 @@ extern LinphonePrivate::Sal::Callbacks linphone_sal_callbacks; LINPHONE_PUBLIC bool_t linphone_core_rtcp_enabled(const LinphoneCore *lc); LINPHONE_PUBLIC bool_t linphone_core_symmetric_rtp_enabled(LinphoneCore*lc); bool_t _linphone_core_has_group_chat_room(const LinphoneCore *lc, const char *id); -void _linphone_core_add_group_chat_room(LinphoneCore *lc, const char *id, LinphoneChatRoom *cr); +void _linphone_core_add_group_chat_room(LinphoneCore *lc, const LinphonePrivate::Address &addr, LinphoneChatRoom *cr); void linphone_core_queue_task(LinphoneCore *lc, belle_sip_source_func_t task_fun, void *data, const char *task_description); diff --git a/src/chat/client-group-chat-room.cpp b/src/chat/client-group-chat-room.cpp index b5637602b..f261659bd 100644 --- a/src/chat/client-group-chat-room.cpp +++ b/src/chat/client-group-chat-room.cpp @@ -20,6 +20,7 @@ #include "address/address-p.h" #include "client-group-chat-room-p.h" #include "c-wrapper/c-wrapper.h" +#include "conference/params/call-session-params-p.h" #include "conference/session/call-session-p.h" #include "conference/participant-p.h" #include "content/content.h" @@ -174,7 +175,7 @@ void ClientGroupChatRoom::onConferenceCreated (const Address &addr) { L_D(); conferenceAddress = addr; d->setState(ChatRoom::State::Created); - _linphone_core_add_group_chat_room(d->core, addr.asStringUriOnly().c_str(), L_GET_C_BACK_PTR(this)); + _linphone_core_add_group_chat_room(d->core, addr, L_GET_C_BACK_PTR(this)); } void ClientGroupChatRoom::onConferenceTerminated (const Address &addr) { diff --git a/src/conference/conference.cpp b/src/conference/conference.cpp index 2b271e2d1..9673f2658 100644 --- a/src/conference/conference.cpp +++ b/src/conference/conference.cpp @@ -174,7 +174,7 @@ shared_ptr Conference::findParticipant (const Address &addr) const for (const auto &participant : participants) { Address participantAddr = participant->getAddress(); participantAddr.setPort(0); - if (testedAddr.equal(participantAddr)) + if (testedAddr.weakEqual(participantAddr)) return participant; } return nullptr; diff --git a/src/conference/local-conference-event-handler.cpp b/src/conference/local-conference-event-handler.cpp index 22b532b75..1476728ab 100644 --- a/src/conference/local-conference-event-handler.cpp +++ b/src/conference/local-conference-event-handler.cpp @@ -59,9 +59,13 @@ void LocalConferenceEventHandlerPrivate::notifyFullState (const string ¬ify, } void LocalConferenceEventHandlerPrivate::notifyAllExcept (const string ¬ify, const Address &addr) { + Address cleanedAddr(addr); + cleanedAddr.setPort(0); for (const auto &participant : conf->getParticipants()) { - if (participant->getPrivate()->isSubscribedToConferenceEventPackage() && (addr != participant->getAddress())) - sendNotify(notify, addr); + Address cleanedParticipantAddr(participant->getAddress()); + cleanedParticipantAddr.setPort(0); + if (participant->getPrivate()->isSubscribedToConferenceEventPackage() && !(cleanedAddr.weakEqual(cleanedParticipantAddr))) + sendNotify(notify, participant->getAddress()); } } @@ -157,6 +161,8 @@ string LocalConferenceEventHandlerPrivate::createNotifySubjectChanged () { void LocalConferenceEventHandlerPrivate::sendNotify (const string ¬ify, const Address &addr) { LinphoneAddress *cAddr = linphone_address_new(addr.asString().c_str()); LinphoneEvent *lev = linphone_core_create_notify(core, cAddr, "conference"); + // Fix the From header to put the chat room URI + lev->op->set_from(this->conf->getConferenceAddress()->asString().c_str()); linphone_address_unref(cAddr); doNotify(notify, lev); } diff --git a/src/conference/params/call-session-params.h b/src/conference/params/call-session-params.h index 5f9c8a7fc..70ed155aa 100644 --- a/src/conference/params/call-session-params.h +++ b/src/conference/params/call-session-params.h @@ -30,13 +30,12 @@ LINPHONE_BEGIN_NAMESPACE -class CallSession; class CallSessionParamsPrivate; -class CallSessionPrivate; class CallSessionParams : public ClonableObject { friend class CallSession; friend class CallSessionPrivate; + friend class ClientGroupChatRoom; public: CallSessionParams (); diff --git a/src/conference/session/call-session-listener.h b/src/conference/session/call-session-listener.h index 8b6d72edf..a0d7e9520 100644 --- a/src/conference/session/call-session-listener.h +++ b/src/conference/session/call-session-listener.h @@ -24,6 +24,8 @@ LINPHONE_BEGIN_NAMESPACE +class CallSession; + class LINPHONE_PUBLIC CallSessionListener { public: virtual ~CallSessionListener() = default; diff --git a/src/conference/session/call-session.cpp b/src/conference/session/call-session.cpp index 2b806c894..f56b7d84b 100644 --- a/src/conference/session/call-session.cpp +++ b/src/conference/session/call-session.cpp @@ -492,6 +492,7 @@ bool CallSessionPrivate::isUpdateAllowed (LinphoneCallState &nextState) const { case LinphoneCallOutgoingEarlyMedia: nextState = LinphoneCallEarlyUpdating; break; + case LinphoneCallConnected: case LinphoneCallStreamsRunning: case LinphoneCallPausedByRemote: case LinphoneCallUpdatedByRemote: @@ -943,8 +944,9 @@ LinphoneStatus CallSession::update (const CallSessionParams *csp, const string & return -1; if (d->currentParams == csp) lWarning() << "CallSession::update() is given the current params, this is probably not what you intend to do!"; - if (content) - d->op->set_local_body(*content); + if (csp) + d->params = new CallSessionParams(*csp); + d->op->set_local_body(content ? *content : Content()); LinphoneStatus result = d->startUpdate(subject); if (result && (d->state != initialState)) { /* Restore initial state */