From 4d17bb5f54b1ff09f71fb8cfc42280b5231b00a7 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Fri, 6 Apr 2018 15:25:28 +0200 Subject: [PATCH] Allow addition of participant to a server group chat room using a REFER. --- coreapi/callbacks.c | 65 ++++++++++++------- .../chat-room/server-group-chat-room-stub.cpp | 2 + 2 files changed, 43 insertions(+), 24 deletions(-) diff --git a/coreapi/callbacks.c b/coreapi/callbacks.c index 4a835b704..dd85c26a0 100644 --- a/coreapi/callbacks.c +++ b/coreapi/callbacks.c @@ -783,34 +783,51 @@ static void refer_received(SalOp *op, const SalAddress *refer_to){ } static_cast(op)->reply(SalReasonDeclined); } - } else if (addr.hasParam("admin")) { - LinphoneChatRoom *cr = L_GET_C_BACK_PTR(L_GET_CPP_PTR_FROM_C_OBJECT(lc)->findChatRoom( - ChatRoomId(IdentityAddress(op->get_to()), IdentityAddress(op->get_to())) - )); - if (cr) { - Address fromAddr(op->get_from()); - std::shared_ptr participant = L_GET_CPP_PTR_FROM_C_OBJECT(cr)->findParticipant(fromAddr); - if (!participant || !participant->isAdmin()) { - static_cast(op)->reply(SalReasonDeclined); - return; - } - participant = L_GET_CPP_PTR_FROM_C_OBJECT(cr)->findParticipant(addr); - if (participant) { - bool value = Utils::stob(addr.getParamValue("admin")); - L_GET_CPP_PTR_FROM_C_OBJECT(cr)->setParticipantAdminStatus(participant, value); + } else { + if (linphone_core_conference_server_enabled(lc)) { + shared_ptr chatRoom = L_GET_CPP_PTR_FROM_C_OBJECT(lc)->findChatRoom( + ChatRoomId(IdentityAddress(op->get_to()), IdentityAddress(op->get_to())) + ); + LinphoneChatRoom *cr = L_GET_C_BACK_PTR(chatRoom); + if (cr) { + Address fromAddr(op->get_from()); + shared_ptr participant = chatRoom->findParticipant(fromAddr); + if (!participant || !participant->isAdmin()) { + static_cast(op)->reply(SalReasonDeclined); + return; + } + if (addr.hasParam("admin")) { + participant = chatRoom->findParticipant(addr); + if (participant) { + bool value = Utils::stob(addr.getParamValue("admin")); + chatRoom->setParticipantAdminStatus(participant, value); + static_cast(op)->reply(SalReasonNone); + return; + } + } else { + participant = L_GET_PRIVATE(static_pointer_cast(chatRoom))->findFilteredParticipant(addr); + if (!participant) { + list identAddresses; + identAddresses.push_back(addr); + L_GET_PRIVATE(static_pointer_cast(chatRoom))->checkCompatibleParticipants( + IdentityAddress(op->get_remote_contact()), + identAddresses + ); + static_cast(op)->reply(SalReasonNone); + return; + } + } } + } else { + shared_ptr chatRoom = L_GET_CPP_PTR_FROM_C_OBJECT(lc)->findChatRoom( + ChatRoomId(addr, IdentityAddress(op->get_to())) + ); + if (!chatRoom) + chatRoom = L_GET_PRIVATE_FROM_C_OBJECT(lc)->createClientGroupChatRoom("", addr.asString(), Content(), false); + chatRoom->join(); static_cast(op)->reply(SalReasonNone); return; } - } else { - shared_ptr chatRoom = L_GET_CPP_PTR_FROM_C_OBJECT(lc)->findChatRoom( - ChatRoomId(addr, IdentityAddress(op->get_to())) - ); - if (!chatRoom) - chatRoom = L_GET_PRIVATE_FROM_C_OBJECT(lc)->createClientGroupChatRoom("", addr.asString(), Content(), false); - chatRoom->join(); - static_cast(op)->reply(SalReasonNone); - return; } } } diff --git a/src/chat/chat-room/server-group-chat-room-stub.cpp b/src/chat/chat-room/server-group-chat-room-stub.cpp index bf29ca554..5630256b3 100644 --- a/src/chat/chat-room/server-group-chat-room-stub.cpp +++ b/src/chat/chat-room/server-group-chat-room-stub.cpp @@ -84,6 +84,8 @@ void ServerGroupChatRoomPrivate::addParticipantDevice (const IdentityAddress &pa void ServerGroupChatRoomPrivate::addCompatibleParticipants (const IdentityAddress &deviceAddr, const list &participantCompatible) {} +void ServerGroupChatRoomPrivate::checkCompatibleParticipants (const IdentityAddress &deviceAddr, const list &addressesToCheck) {} + // ----------------------------------------------------------------------------- LinphoneReason ServerGroupChatRoomPrivate::onSipMessageReceived (SalOp *, const SalMessage *) {