diff --git a/libtransport/ConversationManager.cpp b/libtransport/ConversationManager.cpp index 24678466da54d431fbbbb26dbafd43ad951c1dfb..021a9fc0760ae7526bfd3040295b34fa61c215d8 100644 --- a/libtransport/ConversationManager.cpp +++ b/libtransport/ConversationManager.cpp @@ -105,8 +105,12 @@ void ConversationManager::resetResources() { void ConversationManager::removeJID(const Swift::JID &jid) { std::vector toRemove; for (std::map::const_iterator it = m_convs.begin(); it != m_convs.end(); it++) { + if (it->first.empty() || !it->second) { + continue; + } + (*it).second->removeJID(jid); - if (it->second->getJIDs().empty()) { + if (it->second->getJIDs().empty() && (*it).second->isMUC()) { toRemove.push_back(it->first); } } diff --git a/tests/libtransport/user.cpp b/tests/libtransport/user.cpp index cec16d9520005ff11678058fd52e149b9823b05f..e049a355697c21b3e19d010c16664ac537221005 100644 --- a/tests/libtransport/user.cpp +++ b/tests/libtransport/user.cpp @@ -30,6 +30,7 @@ class UserTest : public CPPUNIT_NS :: TestFixture, public BasicTest { CPPUNIT_TEST(handlePresenceLeaveRoomTwoResourcesOneDisconnectsBouncer); CPPUNIT_TEST(handlePresenceLeaveRoomTwoResourcesAnotherOneDisconnects); CPPUNIT_TEST(leaveJoinedRoom); + CPPUNIT_TEST(doNotLeaveNormalChat); CPPUNIT_TEST(joinRoomBeforeConnected); CPPUNIT_TEST(handleDisconnected); CPPUNIT_TEST(handleDisconnectedReconnect); @@ -420,6 +421,24 @@ class UserTest : public CPPUNIT_NS :: TestFixture, public BasicTest { CPPUNIT_ASSERT(!user->getConversationManager()->getConversation("room")); } + void doNotLeaveNormalChat() { + User *user = userManager->getUser("user@localhost"); + + TestingConversation *conv = new TestingConversation(user->getConversationManager(), "buddy1@test"); + user->getConversationManager()->addConversation(conv); + + CPPUNIT_ASSERT_EQUAL(std::string(""), room); + CPPUNIT_ASSERT_EQUAL(std::string(""), roomNickname); + CPPUNIT_ASSERT_EQUAL(std::string(""), roomPassword); + + user->getConversationManager()->removeJID("user@localhost/resource"); + CPPUNIT_ASSERT_EQUAL(std::string(""), room); + CPPUNIT_ASSERT_EQUAL(std::string(""), roomNickname); + CPPUNIT_ASSERT_EQUAL(std::string(""), roomPassword); + Conversation *cv = user->getConversationManager()->getConversation("buddy1@test"); + CPPUNIT_ASSERT(cv); + } + void handleDisconnected() { User *user = userManager->getUser("user@localhost"); user->handleDisconnected("Connection error", Swift::SpectrumErrorPayload::CONNECTION_ERROR_AUTHENTICATION_FAILED);