From cb2dbb39379f5196ba499b87d637c407032184b6 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Sat, 12 Jan 2013 13:31:28 +0100 Subject: [PATCH] Send unavailable presences only from buddies which were available when disconnecting --- src/rostermanager.cpp | 2 +- src/tests/rostermanager.cpp | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/rostermanager.cpp b/src/rostermanager.cpp index a12b8d9e..9b3b2b08 100644 --- a/src/rostermanager.cpp +++ b/src/rostermanager.cpp @@ -609,7 +609,7 @@ void RosterManager::sendUnavailablePresences(const Swift::JID &to) { continue; } Swift::Presence::ref presence = buddy->generatePresenceStanza(255); - if (presence) { + if (presence && presence->getType() == Swift::Presence::Available) { presence->setTo(to); presence->setType(Swift::Presence::Unavailable); m_component->getStanzaChannel()->sendPresence(presence); diff --git a/src/tests/rostermanager.cpp b/src/tests/rostermanager.cpp index dfef8755..35d2d444 100644 --- a/src/tests/rostermanager.cpp +++ b/src/tests/rostermanager.cpp @@ -24,6 +24,7 @@ class RosterManagerTest : public CPPUNIT_NS :: TestFixture, public BasicTest { CPPUNIT_TEST_SUITE(RosterManagerTest); CPPUNIT_TEST(setBuddy); CPPUNIT_TEST(sendCurrentPresences); + CPPUNIT_TEST(sendUnavailablePresences); CPPUNIT_TEST(sendCurrentPresence); CPPUNIT_TEST(sendBuddySubscribePresence); CPPUNIT_TEST(removeBuddy); @@ -120,6 +121,22 @@ class RosterManagerTest : public CPPUNIT_NS :: TestFixture, public BasicTest { } } + void sendUnavailablePresences() { + setBuddy(); + received.clear(); + + User *user = userManager->getUser("user@localhost"); + user->getRosterManager()->sendUnavailablePresences("user@localhost/resource"); + + CPPUNIT_ASSERT_EQUAL(3, (int) received.size()); + + for (int i = 0; i < 3; i++) { + CPPUNIT_ASSERT(dynamic_cast(getStanza(received[i]))); + CPPUNIT_ASSERT_EQUAL(Swift::Presence::Unavailable, dynamic_cast(getStanza(received[i]))->getType()); + CPPUNIT_ASSERT_EQUAL(std::string("user@localhost/resource"), dynamic_cast(getStanza(received[i]))->getTo().toString()); + } + } + void sendCurrentPresence() { setBuddy(); received.clear();