Do not join rooms before we're connected to legacy network. Otherwise join requests are lost

This commit is contained in:
HanzZ 2012-10-08 10:51:27 +02:00
parent 379074e87b
commit e33358e61f
6 changed files with 66 additions and 11 deletions

View file

@ -40,7 +40,7 @@ class RosterManager;
class Factory {
public:
virtual Conversation *createConversation(ConversationManager *conversationManager, const std::string &legacyName) = 0;
virtual Conversation *createConversation(ConversationManager *conversationManager, const std::string &legacyName, bool isMuc = false) = 0;
virtual Buddy *createBuddy(RosterManager *rosterManager, const BuddyInfo &buddyInfo) = 0;
};

View file

@ -142,6 +142,7 @@ class User : public Swift::EntityCapsProvider {
std::vector<boost::shared_ptr<Swift::OutgoingFileTransfer> > m_filetransfers;
int m_resources;
int m_reconnectCounter;
std::vector<Swift::Presence::ref> m_joinedRooms;
};
}

View file

@ -92,8 +92,8 @@ class NetworkFactory : public Factory {
virtual ~NetworkFactory() {}
// Creates new conversation (NetworkConversation in this case)
Conversation *createConversation(ConversationManager *conversationManager, const std::string &legacyName) {
NetworkConversation *nc = new NetworkConversation(conversationManager, legacyName);
Conversation *createConversation(ConversationManager *conversationManager, const std::string &legacyName, bool isMuc) {
NetworkConversation *nc = new NetworkConversation(conversationManager, legacyName, isMuc);
nc->onMessageToSend.connect(boost::bind(&NetworkPluginServer::handleMessageReceived, m_nps, _1, _2));
return nc;
}
@ -1191,12 +1191,6 @@ void NetworkPluginServer::handleRoomJoined(User *user, const Swift::JID &who, co
return;
}
send(c->connection, message);
NetworkConversation *conv = new NetworkConversation(user->getConversationManager(), r, true);
user->getConversationManager()->addConversation(conv);
conv->onMessageToSend.connect(boost::bind(&NetworkPluginServer::handleMessageReceived, this, _1, _2));
conv->setNickname(nickname);
conv->addJID(who);
}
void NetworkPluginServer::handleRoomLeft(User *user, const std::string &r) {

View file

@ -67,8 +67,8 @@ class TestingFactory : public Factory {
}
// Creates new conversation (NetworkConversation in this case)
Conversation *createConversation(ConversationManager *conversationManager, const std::string &legacyName) {
TestingConversation *nc = new TestingConversation(conversationManager, legacyName);
Conversation *createConversation(ConversationManager *conversationManager, const std::string &legacyName, bool isMuc = false) {
TestingConversation *nc = new TestingConversation(conversationManager, legacyName, isMuc);
nc->onMessageToSend.connect(boost::bind(&TestingFactory::handleMessageToSend, this, _1, _2));
return nc;
}

View file

@ -30,6 +30,7 @@ class UserTest : public CPPUNIT_NS :: TestFixture, public BasicTest {
CPPUNIT_TEST(handlePresenceLeaveRoomTwoResources);
CPPUNIT_TEST(handlePresenceLeaveRoomTwoResourcesOneDisconnects);
CPPUNIT_TEST(leaveJoinedRoom);
CPPUNIT_TEST(joinRoomBeforeConnected);
CPPUNIT_TEST(handleDisconnected);
CPPUNIT_TEST(handleDisconnectedReconnect);
CPPUNIT_TEST_SUITE_END();
@ -320,6 +321,43 @@ class UserTest : public CPPUNIT_NS :: TestFixture, public BasicTest {
CPPUNIT_ASSERT(readyToConnect);
}
void joinRoomBeforeConnected() {
User *user = userManager->getUser("user@localhost");
user->setConnected(false);
Swift::Presence::ref response = Swift::Presence::create();
response->setTo("#room@localhost/hanzz");
response->setFrom("user@localhost/resource");
Swift::MUCPayload *payload = new Swift::MUCPayload();
payload->setPassword("password");
response->addPayload(boost::shared_ptr<Swift::Payload>(payload));
injectPresence(response);
loop->processEvents();
// no presence received in server mode, just disco#info
CPPUNIT_ASSERT_EQUAL(1, (int) received.size());
CPPUNIT_ASSERT(getStanza(received[0])->getPayload<Swift::DiscoInfo>());
CPPUNIT_ASSERT_EQUAL(std::string(""), room);
CPPUNIT_ASSERT_EQUAL(std::string(""), roomNickname);
CPPUNIT_ASSERT_EQUAL(std::string(""), roomPassword);
user->setConnected(true);
CPPUNIT_ASSERT_EQUAL(std::string("#room"), room);
CPPUNIT_ASSERT_EQUAL(std::string("hanzz"), roomNickname);
CPPUNIT_ASSERT_EQUAL(std::string("password"), roomPassword);
room = "";
roomNickname = "";
roomPassword = "";
user->setConnected(true);
CPPUNIT_ASSERT_EQUAL(std::string(""), room);
CPPUNIT_ASSERT_EQUAL(std::string(""), roomNickname);
CPPUNIT_ASSERT_EQUAL(std::string(""), roomPassword);
}
};
CPPUNIT_TEST_SUITE_REGISTRATION (UserTest);

View file

@ -176,6 +176,13 @@ void User::setConnected(bool connected) {
updateLastActivity();
sendCurrentPresence();
if (m_connected) {
BOOST_FOREACH(Swift::Presence::ref &presence, m_joinedRooms) {
handlePresence(presence);
}
m_joinedRooms.clear();
}
}
void User::handlePresence(Swift::Presence::ref presence) {
@ -241,7 +248,16 @@ void User::handlePresence(Swift::Presence::ref presence) {
m_readyForConnect = true;
onReadyToConnect();
}
std::string room = Buddy::JIDToLegacyName(presence->getTo());
if (!m_connected) {
LOG4CXX_INFO(logger, m_jid.toString() << ": Joining room " << room << " postponed, because use is not connected to legacy network yet.");
m_joinedRooms.push_back(presence);
return;
}
Conversation *conv = m_conversationManager->getConversation(room);
if (conv != NULL) {
if (std::find(conv->getJIDs().begin(), conv->getJIDs().end(), presence->getFrom()) != conv->getJIDs().end()) {
@ -259,6 +275,12 @@ void User::handlePresence(Swift::Presence::ref presence) {
if (presence->getPayload<Swift::MUCPayload>() != NULL) {
password = presence->getPayload<Swift::MUCPayload>()->getPassword() ? *presence->getPayload<Swift::MUCPayload>()->getPassword() : "";
}
conv = m_component->getFactory()->createConversation(m_conversationManager, room, true);
m_conversationManager->addConversation(conv);
conv->setNickname(presence->getTo().getResource());
conv->addJID(presence->getFrom());
onRoomJoined(presence->getFrom(), room, presence->getTo().getResource(), password);
}
return;