diff --git a/include/transport/conversation.h b/include/transport/conversation.h index 8af86993..89f3a4ea 100644 --- a/include/transport/conversation.h +++ b/include/transport/conversation.h @@ -74,6 +74,10 @@ class Conversation { m_nickname = nickname; } + void setJID(const Swift::JID &jid) { + m_jid = jid; + } + /// Sends message to Legacy network. /// \param message Message. @@ -112,6 +116,7 @@ class Conversation { std::string m_nickname; std::string m_room; bool m_muc; + Swift::JID m_jid; }; } diff --git a/include/transport/conversationmanager.h b/include/transport/conversationmanager.h index 487e000a..17ca1467 100644 --- a/include/transport/conversationmanager.h +++ b/include/transport/conversationmanager.h @@ -73,6 +73,8 @@ class ConversationManager { /// \param conv Conversation. void removeConversation(Conversation *conv); + void resetResources(); + private: void handleMessageReceived(Swift::Message::ref message); diff --git a/src/conversation.cpp b/src/conversation.cpp index 81b1654d..96ae8144 100644 --- a/src/conversation.cpp +++ b/src/conversation.cpp @@ -37,6 +37,7 @@ Conversation::Conversation(ConversationManager *conversationManager, const std:: m_legacyName = legacyName; m_conversationManager->addConversation(this); m_muc = isMUC; + m_jid = m_conversationManager->getUser()->getJID().toBare(); } Conversation::~Conversation() { @@ -54,9 +55,9 @@ void Conversation::handleMessage(boost::shared_ptr &message, con else { message->setType(Swift::Message::Chat); } + if (message->getType() != Swift::Message::Groupchat) { - - message->setTo(m_conversationManager->getUser()->getJID().toBare()); + message->setTo(m_jid); // normal message if (nickname.empty()) { Buddy *buddy = m_conversationManager->getUser()->getRosterManager()->getBuddy(m_legacyName); @@ -83,7 +84,7 @@ void Conversation::handleMessage(boost::shared_ptr &message, con if (legacyName.find_last_of("@") != std::string::npos) { legacyName.replace(legacyName.find_last_of("@"), 1, "%"); // OK } - message->setTo(m_conversationManager->getUser()->getJID().toString()); + message->setTo(m_jid); message->setFrom(Swift::JID(legacyName, m_conversationManager->getComponent()->getJID().toBare(), nickname)); m_conversationManager->getComponent()->getStanzaChannel()->sendMessage(message); } @@ -99,7 +100,7 @@ void Conversation::handleParticipantChanged(const std::string &nick, int flag, i } } presence->setFrom(Swift::JID(legacyName, m_conversationManager->getComponent()->getJID().toBare(), nickname)); - presence->setTo(m_conversationManager->getUser()->getJID().toString()); + presence->setTo(m_jid); presence->setType(Swift::Presence::Available); if (!statusMessage.empty()) diff --git a/src/conversationmanager.cpp b/src/conversationmanager.cpp index 2f422ff3..a83803be 100644 --- a/src/conversationmanager.cpp +++ b/src/conversationmanager.cpp @@ -62,6 +62,12 @@ void ConversationManager::removeConversation(Conversation *conv) { m_convs.erase(conv->getLegacyName()); } +void ConversationManager::resetResources() { + for (std::map::const_iterator it = m_convs.begin(); it != m_convs.end(); it++) { + (*it).second->setJID(m_user->getJID().toBare()); + } +} + void ConversationManager::handleMessageReceived(Swift::Message::ref message) { // std::string name = message->getTo().getUnescapedNode(); // if (name.find_last_of("%") != std::string::npos) { // OK when commented @@ -87,7 +93,9 @@ void ConversationManager::handleMessageReceived(Swift::Message::ref message) { } } + // update resource and send the message + m_convs[name]->setJID(message->getFrom()); m_convs[name]->sendMessage(message); } -} \ No newline at end of file +} diff --git a/src/user.cpp b/src/user.cpp index aca25bae..7049dc33 100644 --- a/src/user.cpp +++ b/src/user.cpp @@ -174,6 +174,8 @@ void User::setConnected(bool connected) { void User::handlePresence(Swift::Presence::ref presence) { int currentResourcesCount = m_presenceOracle->getAllPresence(m_jid).size(); + m_conversationManager->resetResources(); + if (!m_connected) { // we are not connected to legacy network, so we should do it when disco#info arrive :) if (m_readyForConnect == false) {