From f92da345a45e63b726300358852f1f4b46e17126 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Wed, 6 Dec 2017 11:30:03 +0100 Subject: [PATCH] Keep the gruu address of the client group chat room focus participant. --- src/chat/chat-room/client-group-chat-room.cpp | 10 ++++++--- src/conference/participant-p.h | 4 +++- src/conference/participant.cpp | 22 +++++++++++-------- 3 files changed, 23 insertions(+), 13 deletions(-) diff --git a/src/chat/chat-room/client-group-chat-room.cpp b/src/chat/chat-room/client-group-chat-room.cpp index c34281ad4..e176ac8f4 100644 --- a/src/chat/chat-room/client-group-chat-room.cpp +++ b/src/chat/chat-room/client-group-chat-room.cpp @@ -66,7 +66,7 @@ shared_ptr ClientGroupChatRoomPrivate::createSession () { const Address &myAddress = q->getMe()->getAddress(); Address myCleanedAddress(myAddress); myCleanedAddress.setUriParam("gr"); // Remove gr parameter for INVITE - session->configure(LinphoneCallOutgoing, nullptr, nullptr, myCleanedAddress, focus->getAddress()); + session->configure(LinphoneCallOutgoing, nullptr, nullptr, myCleanedAddress, focus->getPrivate()->getDevices().front()->getAddress()); session->initiateOutgoing(); return session; } @@ -87,13 +87,15 @@ void ClientGroupChatRoomPrivate::onChatMessageReceived (const shared_ptr &core, - const string &factoryUri, + const string &uri, const IdentityAddress &me, const string &subject ) : ChatRoom(*new ClientGroupChatRoomPrivate, core, ChatRoomId(IdentityAddress(), me)), RemoteConference(core, me, nullptr) { L_D_T(RemoteConference, dConference); - dConference->focus = make_shared(Address(factoryUri)); + IdentityAddress focusAddr(uri); + dConference->focus = make_shared(focusAddr); + dConference->focus->getPrivate()->addDevice(focusAddr); RemoteConference::setSubject(subject); } @@ -298,6 +300,8 @@ void ClientGroupChatRoom::onConferenceCreated (const IdentityAddress &addr) { L_D_T(RemoteConference, dConference); dConference->conferenceAddress = addr; dConference->focus->getPrivate()->setAddress(addr); + dConference->focus->getPrivate()->clearDevices(); + dConference->focus->getPrivate()->addDevice(addr); d->chatRoomId = ChatRoomId(addr, d->chatRoomId.getLocalAddress()); getCore()->getPrivate()->insertChatRoom(getSharedFromThis()); } diff --git a/src/conference/participant-p.h b/src/conference/participant-p.h index 1f5af8552..afc8e66b0 100644 --- a/src/conference/participant-p.h +++ b/src/conference/participant-p.h @@ -40,10 +40,12 @@ public: inline void removeSession () { session.reset(); } inline void setAddress (const IdentityAddress &newAddr) { addr = newAddr; } inline void setAdmin (bool isAdmin) { this->isAdmin = isAdmin; } + + std::shared_ptr addDevice (const IdentityAddress &gruu); + void clearDevices (); std::shared_ptr findDevice (const IdentityAddress &gruu) const; std::shared_ptr findDevice (const std::shared_ptr &session); const std::list> &getDevices () const; - std::shared_ptr addDevice (const IdentityAddress &gruu); void removeDevice (const IdentityAddress &gruu); private: diff --git a/src/conference/participant.cpp b/src/conference/participant.cpp index aa4b475f4..c3011ca03 100644 --- a/src/conference/participant.cpp +++ b/src/conference/participant.cpp @@ -46,6 +46,19 @@ shared_ptr ParticipantPrivate::createSession ( // ----------------------------------------------------------------------------- +shared_ptr ParticipantPrivate::addDevice (const IdentityAddress &gruu) { + shared_ptr device = findDevice(gruu); + if (device) + return device; + device = make_shared(gruu); + devices.push_back(device); + return device; +} + +void ParticipantPrivate::clearDevices () { + devices.clear(); +} + shared_ptr ParticipantPrivate::findDevice (const IdentityAddress &gruu) const { for (const auto &device : devices) { if (device->getAddress() == gruu) @@ -66,15 +79,6 @@ const list> &ParticipantPrivate::getDevices () con return devices; } -shared_ptr ParticipantPrivate::addDevice (const IdentityAddress &gruu) { - shared_ptr device = findDevice(gruu); - if (device) - return device; - device = make_shared(gruu); - devices.push_back(device); - return device; -} - void ParticipantPrivate::removeDevice (const IdentityAddress &gruu) { for (auto it = devices.begin(); it != devices.end(); it++) { if ((*it)->getAddress() == gruu) {