Commit 7b59cd6e authored by Ghislain MARY's avatar Ghislain MARY
Browse files

Add API to leave a chat room.

parent d60b5fab
......@@ -289,6 +289,12 @@ LINPHONE_PUBLIC bctbx_list_t * linphone_chat_room_get_participants (const Linpho
*/
LINPHONE_PUBLIC const char * linphone_chat_room_get_subject (const LinphoneChatRoom *cr);
/**
* Leave a chat room.
* @param[in] cr A LinphoneChatRoom object
*/
LINPHONE_PUBLIC void linphone_chat_room_leave (LinphoneChatRoom *cr);
/**
* Remove a participant of a chat room.
* @param[in] cr A LinphoneChatRoom object
......
......@@ -27,6 +27,7 @@
F(Instantiated) \
F(CreationPending) \
F(Created) \
F(TerminationPending) \
F(Terminated) \
F(CreationFailed)
......
......@@ -248,6 +248,10 @@ const char * linphone_chat_room_get_subject (const LinphoneChatRoom *cr) {
return L_STRING_TO_C(L_GET_CPP_PTR_FROM_C_OBJECT(cr)->getSubject());
}
void linphone_chat_room_leave (LinphoneChatRoom *cr) {
L_GET_CPP_PTR_FROM_C_OBJECT(cr)->leave();
}
void linphone_chat_room_remove_participant (LinphoneChatRoom *cr, LinphoneParticipant *participant) {
L_GET_CPP_PTR_FROM_C_OBJECT(cr)->removeParticipant(L_GET_CPP_PTR_FROM_C_OBJECT(participant));
}
......
......@@ -69,6 +69,8 @@ const string &BasicChatRoom::getSubject () const {
return d->subject;
}
void BasicChatRoom::leave () {}
void BasicChatRoom::removeParticipant (const shared_ptr<const Participant> &participant) {
lError() << "removeParticipant() is not allowed on a BasicChatRoom";
}
......
......@@ -41,6 +41,7 @@ public:
int getNbParticipants () const override;
std::list<std::shared_ptr<Participant>> getParticipants () const override;
const std::string &getSubject () const override;
void leave () override;
void removeParticipant (const std::shared_ptr<const Participant> &participant) override;
void removeParticipants (const std::list<std::shared_ptr<Participant>> &participants) override;
void setSubject (const std::string &subject) override;
......
......@@ -59,11 +59,6 @@ ClientGroupChatRoom::ClientGroupChatRoom (LinphoneCore *core, const Address &me,
this->subject = subject;
}
ClientGroupChatRoom::~ClientGroupChatRoom () {
shared_ptr<CallSession> session = focus->getPrivate()->getSession();
session->terminate();
}
// -----------------------------------------------------------------------------
void ClientGroupChatRoom::addParticipant (const Address &addr, const CallSessionParams *params, bool hasMedia) {
......@@ -119,6 +114,19 @@ const string &ClientGroupChatRoom::getSubject () const {
return RemoteConference::getSubject();
}
void ClientGroupChatRoom::leave () {
L_D();
eventHandler->unsubscribe();
shared_ptr<CallSession> session = focus->getPrivate()->getSession();
if (session)
session->terminate();
else {
session = d->createSession();
session->startInvite(nullptr, "", nullptr);
}
d->setState(ChatRoom::State::TerminationPending);
}
void ClientGroupChatRoom::removeParticipant (const shared_ptr<const Participant> &participant) {
// TODO
}
......@@ -219,18 +227,27 @@ void ClientGroupChatRoom::onSubjectChanged (const std::string &subject) {
// -----------------------------------------------------------------------------
void ClientGroupChatRoom::onCallSessionSetTerminated (const std::shared_ptr<const CallSession> session) {
void ClientGroupChatRoom::onCallSessionSetReleased (const std::shared_ptr<const CallSession> session) {
if (session == focus->getPrivate()->getSession())
focus->getPrivate()->removeSession();
}
void ClientGroupChatRoom::onCallSessionStateChanged (const std::shared_ptr<const CallSession> session, LinphoneCallState state, const string &message) {
L_D();
if (state == LinphoneCallConnected) {
Address addr(session->getRemoteContact());
addr.clean();
onConferenceCreated(addr);
if (session->getRemoteContactAddress()->hasParam("isfocus"))
eventHandler->subscribe(conferenceAddress);
if (d->state == ChatRoom::State::CreationPending) {
Address addr(session->getRemoteContact());
addr.clean();
onConferenceCreated(addr);
if (session->getRemoteContactAddress()->hasParam("isfocus"))
eventHandler->subscribe(conferenceAddress);
} else if (d->state == ChatRoom::State::TerminationPending) {
focus->getPrivate()->getSession()->terminate();
}
} else {
if ((state == LinphoneCallReleased) && (d->state == ChatRoom::State::TerminationPending)) {
onConferenceTerminated(conferenceAddress);
}
}
}
......
......@@ -38,7 +38,7 @@ class ClientGroupChatRoomPrivate;
class LINPHONE_PUBLIC ClientGroupChatRoom : public ChatRoom, public RemoteConference {
public:
ClientGroupChatRoom (LinphoneCore *core, const Address &me, const std::string &subject);
virtual ~ClientGroupChatRoom ();
virtual ~ClientGroupChatRoom () = default;
public:
/* ConferenceInterface */
......@@ -49,6 +49,7 @@ public:
int getNbParticipants () const override;
std::list<std::shared_ptr<Participant>> getParticipants () const override;
const std::string &getSubject () const override;
void leave () override;
void removeParticipant (const std::shared_ptr<const Participant> &participant) override;
void removeParticipants (const std::list<std::shared_ptr<Participant>> &participants) override;
void setSubject (const std::string &subject) override;
......@@ -64,7 +65,7 @@ private:
private:
/* CallSessionListener */
void onCallSessionSetTerminated (const std::shared_ptr<const CallSession> session) override;
void onCallSessionSetReleased (const std::shared_ptr<const CallSession> session) override;
void onCallSessionStateChanged (const std::shared_ptr<const CallSession> session, LinphoneCallState state, const std::string &message) override;
private:
......
......@@ -165,6 +165,8 @@ const string &RealTimeTextChatRoom::getSubject () const {
return d->subject;
}
void RealTimeTextChatRoom::leave () {}
void RealTimeTextChatRoom::removeParticipant (const shared_ptr<const Participant> &participant) {
lError() << "removeParticipant() is not allowed on a RealTimeTextChatRoom";
}
......
......@@ -51,6 +51,7 @@ public:
int getNbParticipants () const override;
std::list<std::shared_ptr<Participant>> getParticipants () const override;
const std::string &getSubject () const override;
void leave () override;
void removeParticipant (const std::shared_ptr<const Participant> &participant) override;
void removeParticipants (const std::list<std::shared_ptr<Participant>> &participants) override;
void setSubject (const std::string &subject) override;
......
......@@ -42,6 +42,7 @@ public:
virtual int getNbParticipants () const = 0;
virtual std::list<std::shared_ptr<Participant>> getParticipants () const = 0;
virtual const std::string &getSubject () const = 0;
virtual void leave () = 0;
virtual void removeParticipant (const std::shared_ptr<const Participant> &participant) = 0;
virtual void removeParticipants (const std::list<std::shared_ptr<Participant>> &participants) = 0;
virtual void setSubject (const std::string &subject) = 0;
......
......@@ -76,6 +76,8 @@ const string &Conference::getSubject () const {
return subject;
}
void Conference::leave () {}
void Conference::removeParticipant (const shared_ptr<const Participant> &participant) {
lError() << "Conference class does not handle removeParticipant() generically";
}
......@@ -171,6 +173,14 @@ shared_ptr<Participant> Conference::findParticipant (const Address &addr) const
return nullptr;
}
shared_ptr<Participant> Conference::findParticipant (const shared_ptr<const CallSession> session) {
for (const auto &participant : participants) {
if (participant->getPrivate()->getSession() == session)
return participant;
}
return nullptr;
}
bool Conference::isMe (const Address &addr) const {
Address cleanedAddress = me->getAddress();
cleanedAddress.setPort(0);
......
......@@ -55,6 +55,7 @@ public:
int getNbParticipants () const override;
std::list<std::shared_ptr<Participant>> getParticipants () const override;
const std::string &getSubject () const override;
void leave () override;
void removeParticipant (const std::shared_ptr<const Participant> &participant) override;
void removeParticipants (const std::list<std::shared_ptr<Participant>> &participants) override;
void setSubject (const std::string &subject) override;
......@@ -80,6 +81,7 @@ protected:
explicit Conference (LinphoneCore *core, const Address &myAddress, CallListener *listener = nullptr);
std::shared_ptr<Participant> findParticipant (const Address &addr) const;
std::shared_ptr<Participant> findParticipant (const std::shared_ptr<const CallSession> session);
bool isMe (const Address &addr) const ;
protected:
......
......@@ -37,6 +37,7 @@ class Participant : public Object {
friend class CallPrivate;
friend class ClientGroupChatRoom;
friend class ClientGroupChatRoomPrivate;
friend class Conference;
friend class LocalConference;
friend class MediaSessionPrivate;
friend class RemoteConference;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment