From 70cf46773b855b44ec443a16a7cdc2b929feee04 Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Tue, 26 Feb 2013 15:31:21 +0100 Subject: [PATCH] Send code 210 when changing our nickname in room --- include/transport/conversation.h | 5 ++--- src/conversation.cpp | 13 +++++++++++++ src/tests/conversationmanager.cpp | 20 ++++++++++++++++++++ 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/include/transport/conversation.h b/include/transport/conversation.h index 268326b0..032ddef3 100644 --- a/include/transport/conversation.h +++ b/include/transport/conversation.h @@ -85,9 +85,7 @@ class Conversation { /// Sets XMPP user nickname in MUC rooms. /// \param nickname XMPP user nickname in MUC rooms. - void setNickname(const std::string &nickname) { - m_nickname = nickname; - } + void setNickname(const std::string &nickname); const std::string &getNickname() { return m_nickname; @@ -166,6 +164,7 @@ class Conversation { std::map m_participants; boost::shared_ptr m_subject; bool m_sentInitialPresence; + bool m_nicknameChanged; std::list > m_cachedMessages; }; diff --git a/src/conversation.cpp b/src/conversation.cpp index 5e8aa3d1..e8b77879 100644 --- a/src/conversation.cpp +++ b/src/conversation.cpp @@ -39,6 +39,7 @@ Conversation::Conversation(ConversationManager *conversationManager, const std:: m_muc = isMUC; m_jid = m_conversationManager->getUser()->getJID().toBare(); m_sentInitialPresence = false; + m_nicknameChanged = false; if (CONFIG_BOOL_DEFAULTED(conversationManager->getComponent()->getConfig(), "features.rawxml", false)) { m_sentInitialPresence = true; @@ -268,6 +269,11 @@ Swift::Presence::ref Conversation::generatePresence(const std::string &nick, int Swift::MUCUserPayload::StatusCode c; c.code = 110; p->addStatusCode(c); + if (m_nicknameChanged) { + Swift::MUCUserPayload::StatusCode c; + c.code = 210; + p->addStatusCode(c); + } m_sentInitialPresence = true; } } @@ -296,6 +302,13 @@ Swift::Presence::ref Conversation::generatePresence(const std::string &nick, int return presence; } +void Conversation::setNickname(const std::string &nickname) { + if (!nickname.empty() && m_nickname != nickname) { + m_nicknameChanged = true; + } + m_nickname = nickname; +} + void Conversation::handleParticipantChanged(const std::string &nick, Conversation::ParticipantFlag flag, int status, const std::string &statusMessage, const std::string &newname) { Swift::Presence::ref presence = generatePresence(nick, flag, status, statusMessage, newname); diff --git a/src/tests/conversationmanager.cpp b/src/tests/conversationmanager.cpp index b8f2eb4e..82f34cd3 100644 --- a/src/tests/conversationmanager.cpp +++ b/src/tests/conversationmanager.cpp @@ -37,6 +37,7 @@ class ConversationManagerTest : public CPPUNIT_NS :: TestFixture, public BasicTe CPPUNIT_TEST(handleGroupchatRemoved); CPPUNIT_TEST(handleNicknameConflict); CPPUNIT_TEST(handleNotAuthorized); + CPPUNIT_TEST(handleSetNickname); CPPUNIT_TEST_SUITE_END(); public: @@ -633,6 +634,25 @@ class ConversationManagerTest : public CPPUNIT_NS :: TestFixture, public BasicTe CPPUNIT_ASSERT_EQUAL(Swift::ErrorPayload::NotAuthorized, getStanza(received[0])->getPayload()->getCondition()); } + void handleSetNickname() { + User *user = userManager->getUser("user@localhost"); + TestingConversation *conv = new TestingConversation(user->getConversationManager(), "#room", true); + + conv->onMessageToSend.connect(boost::bind(&ConversationManagerTest::handleMessageReceived, this, _1, _2)); + conv->setNickname("nickname"); + conv->addJID("user@localhost/resource"); + loop->processEvents(); + + conv->setNickname("nickname2"); + conv->handleParticipantChanged("nickname2", Conversation::PARTICIPANT_FLAG_NONE, Swift::StatusShow::Away, "my status message"); + loop->processEvents(); + + CPPUNIT_ASSERT_EQUAL(1, (int) received.size()); + CPPUNIT_ASSERT(dynamic_cast(getStanza(received[0]))); + CPPUNIT_ASSERT_EQUAL(110, getStanza(received[0])->getPayload()->getStatusCodes()[0].code); + CPPUNIT_ASSERT_EQUAL(210, getStanza(received[0])->getPayload()->getStatusCodes()[1].code); + } + }; CPPUNIT_TEST_SUITE_REGISTRATION (ConversationManagerTest);