From a8955e1647ebe21a9902e91b3a5a7c01e03451c2 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Thu, 25 Jan 2018 14:19:39 +0100 Subject: [PATCH] Prevent application from being notified of error in creation of ClientGroupChatRoom in case of fallback to BasicChatRoom. --- .../client-group-to-basic-chat-room.cpp | 2 ++ src/chat/chat-room/proxy-chat-room-p.h | 1 + src/chat/chat-room/proxy-chat-room.cpp | 20 +++++++++++++++++++ tester/group_chat_tester.c | 1 - 4 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/chat/chat-room/client-group-to-basic-chat-room.cpp b/src/chat/chat-room/client-group-to-basic-chat-room.cpp index 85557f206..5890f8252 100644 --- a/src/chat/chat-room/client-group-to-basic-chat-room.cpp +++ b/src/chat/chat-room/client-group-to-basic-chat-room.cpp @@ -69,10 +69,12 @@ public: return; if ((newState == CallSession::State::Error) && (cgcr->getState() == ChatRoom::State::CreationPending) && (session->getReason() == LinphoneReasonNotAcceptable) && (invitedAddresses.size() == 1)) { + teardownCallbacks(); cgcr->getPrivate()->onCallSessionStateChanged(session, newState, message); cgcr->getPrivate()->setCallSessionListener(nullptr); cgcr->getPrivate()->setChatRoomListener(nullptr); Core::deleteChatRoom(q->getSharedFromThis()); + setupCallbacks(); LinphoneChatRoom *lcr = L_GET_C_BACK_PTR(q); shared_ptr bcr = cgcr->getCore()->onlyGetOrCreateBasicChatRoom(invitedAddresses.front()); L_SET_CPP_PTR_FROM_C_OBJECT(lcr, bcr); diff --git a/src/chat/chat-room/proxy-chat-room-p.h b/src/chat/chat-room/proxy-chat-room-p.h index b7746419d..0675ffa2b 100644 --- a/src/chat/chat-room/proxy-chat-room-p.h +++ b/src/chat/chat-room/proxy-chat-room-p.h @@ -65,6 +65,7 @@ public: } void setupCallbacks (); + void teardownCallbacks (); std::shared_ptr chatRoom; diff --git a/src/chat/chat-room/proxy-chat-room.cpp b/src/chat/chat-room/proxy-chat-room.cpp index dcec5d7cb..9f4f3aa94 100644 --- a/src/chat/chat-room/proxy-chat-room.cpp +++ b/src/chat/chat-room/proxy-chat-room.cpp @@ -118,6 +118,26 @@ void ProxyChatRoomPrivate::setupCallbacks () { linphone_chat_room_cbs_set_undecryptable_message_received(cbs, undecryptableMessageReceived); } +void ProxyChatRoomPrivate::teardownCallbacks () { + LinphoneChatRoom *lcr = L_GET_C_BACK_PTR(chatRoom); + LinphoneChatRoomCbs *cbs = linphone_chat_room_get_callbacks(lcr); + linphone_chat_room_cbs_set_chat_message_received(cbs, nullptr); + linphone_chat_room_cbs_set_chat_message_sent(cbs, nullptr); + linphone_chat_room_cbs_set_conference_address_generation(cbs, nullptr); + linphone_chat_room_cbs_set_is_composing_received(cbs, nullptr); + linphone_chat_room_cbs_set_message_received(cbs, nullptr); + linphone_chat_room_cbs_set_participant_added(cbs, nullptr); + linphone_chat_room_cbs_set_participant_admin_status_changed(cbs, nullptr); + linphone_chat_room_cbs_set_participant_device_added(cbs, nullptr); + linphone_chat_room_cbs_set_participant_device_fetched(cbs, nullptr); + linphone_chat_room_cbs_set_participant_device_removed(cbs, nullptr); + linphone_chat_room_cbs_set_participant_removed(cbs, nullptr); + linphone_chat_room_cbs_set_participants_capabilities_checked(cbs, nullptr); + linphone_chat_room_cbs_set_state_changed(cbs, nullptr); + linphone_chat_room_cbs_set_subject_changed(cbs, nullptr); + linphone_chat_room_cbs_set_undecryptable_message_received(cbs, nullptr); +} + // ----------------------------------------------------------------------------- ProxyChatRoom::ProxyChatRoom (ProxyChatRoomPrivate &p, const shared_ptr &chatRoom) : diff --git a/tester/group_chat_tester.c b/tester/group_chat_tester.c index 1b7b1d98f..4cd9b3a8f 100644 --- a/tester/group_chat_tester.c +++ b/tester/group_chat_tester.c @@ -1557,7 +1557,6 @@ static void group_chat_room_fallback_to_basic_chat_room (void) { // Check that the group chat room creation fails and that a fallback to a basic chat room is done BC_ASSERT_TRUE(wait_for_list(coresList, &marie->stat.number_of_LinphoneChatRoomStateCreationPending, initialMarieStats.number_of_LinphoneChatRoomStateCreationPending + 1, 10000)); - BC_ASSERT_TRUE(wait_for_list(coresList, &marie->stat.number_of_LinphoneChatRoomStateCreationFailed, initialMarieStats.number_of_LinphoneChatRoomStateCreationFailed + 1, 10000)); BC_ASSERT_TRUE(wait_for_list(coresList, &marie->stat.number_of_LinphoneChatRoomStateCreated, initialMarieStats.number_of_LinphoneChatRoomStateCreated + 1, 10000)); BC_ASSERT_EQUAL(linphone_chat_room_get_nb_participants(marieCr), 1, int, "%d"); BC_ASSERT_TRUE(linphone_chat_room_get_capabilities(marieCr) & LinphoneChatRoomCapabilitiesBasic);