Allow addition of participant to a server group chat room using a REFER.

This commit is contained in:
Ghislain MARY 2018-04-06 15:25:28 +02:00
parent 8b5c4e0305
commit 4d17bb5f54
2 changed files with 43 additions and 24 deletions

View file

@ -783,25 +783,41 @@ static void refer_received(SalOp *op, const SalAddress *refer_to){
} }
static_cast<SalReferOp *>(op)->reply(SalReasonDeclined); static_cast<SalReferOp *>(op)->reply(SalReasonDeclined);
} }
} else if (addr.hasParam("admin")) { } else {
LinphoneChatRoom *cr = L_GET_C_BACK_PTR(L_GET_CPP_PTR_FROM_C_OBJECT(lc)->findChatRoom( if (linphone_core_conference_server_enabled(lc)) {
shared_ptr<AbstractChatRoom> chatRoom = L_GET_CPP_PTR_FROM_C_OBJECT(lc)->findChatRoom(
ChatRoomId(IdentityAddress(op->get_to()), IdentityAddress(op->get_to())) ChatRoomId(IdentityAddress(op->get_to()), IdentityAddress(op->get_to()))
)); );
LinphoneChatRoom *cr = L_GET_C_BACK_PTR(chatRoom);
if (cr) { if (cr) {
Address fromAddr(op->get_from()); Address fromAddr(op->get_from());
std::shared_ptr<Participant> participant = L_GET_CPP_PTR_FROM_C_OBJECT(cr)->findParticipant(fromAddr); shared_ptr<Participant> participant = chatRoom->findParticipant(fromAddr);
if (!participant || !participant->isAdmin()) { if (!participant || !participant->isAdmin()) {
static_cast<SalReferOp *>(op)->reply(SalReasonDeclined); static_cast<SalReferOp *>(op)->reply(SalReasonDeclined);
return; return;
} }
participant = L_GET_CPP_PTR_FROM_C_OBJECT(cr)->findParticipant(addr); if (addr.hasParam("admin")) {
participant = chatRoom->findParticipant(addr);
if (participant) { if (participant) {
bool value = Utils::stob(addr.getParamValue("admin")); bool value = Utils::stob(addr.getParamValue("admin"));
L_GET_CPP_PTR_FROM_C_OBJECT(cr)->setParticipantAdminStatus(participant, value); chatRoom->setParticipantAdminStatus(participant, value);
}
static_cast<SalReferOp *>(op)->reply(SalReasonNone); static_cast<SalReferOp *>(op)->reply(SalReasonNone);
return; return;
} }
} else {
participant = L_GET_PRIVATE(static_pointer_cast<ServerGroupChatRoom>(chatRoom))->findFilteredParticipant(addr);
if (!participant) {
list<IdentityAddress> identAddresses;
identAddresses.push_back(addr);
L_GET_PRIVATE(static_pointer_cast<ServerGroupChatRoom>(chatRoom))->checkCompatibleParticipants(
IdentityAddress(op->get_remote_contact()),
identAddresses
);
static_cast<SalReferOp *>(op)->reply(SalReasonNone);
return;
}
}
}
} else { } else {
shared_ptr<AbstractChatRoom> chatRoom = L_GET_CPP_PTR_FROM_C_OBJECT(lc)->findChatRoom( shared_ptr<AbstractChatRoom> chatRoom = L_GET_CPP_PTR_FROM_C_OBJECT(lc)->findChatRoom(
ChatRoomId(addr, IdentityAddress(op->get_to())) ChatRoomId(addr, IdentityAddress(op->get_to()))
@ -814,6 +830,7 @@ static void refer_received(SalOp *op, const SalAddress *refer_to){
} }
} }
} }
}
static_cast<SalReferOp *>(op)->reply(SalReasonDeclined); static_cast<SalReferOp *>(op)->reply(SalReasonDeclined);
} }

View file

@ -84,6 +84,8 @@ void ServerGroupChatRoomPrivate::addParticipantDevice (const IdentityAddress &pa
void ServerGroupChatRoomPrivate::addCompatibleParticipants (const IdentityAddress &deviceAddr, const list<IdentityAddress> &participantCompatible) {} void ServerGroupChatRoomPrivate::addCompatibleParticipants (const IdentityAddress &deviceAddr, const list<IdentityAddress> &participantCompatible) {}
void ServerGroupChatRoomPrivate::checkCompatibleParticipants (const IdentityAddress &deviceAddr, const list<IdentityAddress> &addressesToCheck) {}
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
LinphoneReason ServerGroupChatRoomPrivate::onSipMessageReceived (SalOp *, const SalMessage *) { LinphoneReason ServerGroupChatRoomPrivate::onSipMessageReceived (SalOp *, const SalMessage *) {