From f55f18b57986c64aef4abe293c5c109b9cce5423 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Sat, 15 Sep 2012 16:32:36 +0200 Subject: [PATCH 1/4] If swiften-config does not return multithreaded boost libraries, we have to use non-multithreaded boost too --- CMakeLists.txt | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 07aaf651..a69a1d3c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -15,6 +15,15 @@ message(STATUS "|- log4cxx : -DLOG4CXX_INCLUDE_DIR, -DLOG4CXX_LIBRARY") message(STATUS "|- purple : -DPURPLE_INCLUDE_DIR, -DPURPLE_LIBRARY") message(STATUS " : -DPURPLE_NOT_RUNTIME - enables compilation with libpurple.lib") +MACRO(LIST_CONTAINS var value) + SET(${var}) + FOREACH (value2 ${ARGN}) + IF (${value} STREQUAL ${value2}) + SET(${var} TRUE) + ENDIF (${value} STREQUAL ${value2}) + ENDFOREACH (value2) +ENDMACRO(LIST_CONTAINS) + if(NOT LIB_INSTALL_DIR) set(LIB_INSTALL_DIR "lib") endif() @@ -131,7 +140,12 @@ if (WIN32) set(Boost_USE_STATIC_RUNTIME OFF) find_package(Boost COMPONENTS program_options date_time system filesystem regex thread signals REQUIRED) else(WIN32) - find_package(Boost COMPONENTS program_options date_time system filesystem regex thread signals REQUIRED) + LIST_CONTAINS(contains -lboost_program_options ${SWIFTEN_LIBRARY}) + if(contains) + message(STATUS "Using non-multithreaded boost") + set(Boost_USE_MULTITHREADED 0) + endif(contains) + find_package(Boost COMPONENTS program_options date_time system filesystem regex thread-mt signals REQUIRED) endif(WIN32) message( STATUS "Found Boost: ${Boost_LIBRARIES}, ${Boost_INCLUDE_DIR}") From 2fcf167a4e3821fb6c850e207cfdc2b213ba7447 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Sat, 15 Sep 2012 22:17:20 +0200 Subject: [PATCH 2/4] Forward ChatState messages to backends --- backends/libpurple/main.cpp | 1 + spectrum/src/sample.cfg | 6 +++--- src/usermanager.cpp | 14 +++++++------- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/backends/libpurple/main.cpp b/backends/libpurple/main.cpp index ca06b68b..0a487ea3 100644 --- a/backends/libpurple/main.cpp +++ b/backends/libpurple/main.cpp @@ -561,6 +561,7 @@ class SpectrumNetworkPlugin : public NetworkPlugin { void handleTypingRequest(const std::string &user, const std::string &buddyName) { PurpleAccount *account = m_sessions[user]; if (account) { + LOG4CXX_INFO(logger, user << ": sending typing notify to " << buddyName); serv_send_typing_wrapped(purple_account_get_connection_wrapped(account), buddyName.c_str(), PURPLE_TYPING); } } diff --git a/spectrum/src/sample.cfg b/spectrum/src/sample.cfg index 2cebc3d2..389c4872 100644 --- a/spectrum/src/sample.cfg +++ b/spectrum/src/sample.cfg @@ -13,10 +13,10 @@ admin_password=test #cert=server.pfx #patch to PKCS#12 certificate #cert_password=test #password to that certificate if any users_per_backend=10 -#backend=../..//backends/swiften/spectrum2_swiften_backend +backend=../..//backends/libpurple/spectrum2_libpurple_backend #backend=../../backends/twitter/spectrum2_twitter_backend -backend=/home/hanzz/code/libtransport/backends/libpurple/spectrum2_libpurple_backend -protocol=prpl-jabber +#backend=/home/hanzz/code/libtransport/backends/libpurple/spectrum2_communi_backend +protocol=prpl-icq #protocol=prpl-msn #protocol=any #protocol=prpl-icq diff --git a/src/usermanager.cpp b/src/usermanager.cpp index 9fb0db6d..ebbfb2d1 100644 --- a/src/usermanager.cpp +++ b/src/usermanager.cpp @@ -334,7 +334,13 @@ void UserManager::handleMessageReceived(Swift::Message::ref message) { return; } - if (message->getBody().empty()) { + // Do not count chatstate notification... + boost::shared_ptr statePayload = message->getPayload(); + if (!statePayload) { + messageToBackendSent(); + } + + if (message->getBody().empty() && !statePayload) { return; } @@ -344,12 +350,6 @@ void UserManager::handleMessageReceived(Swift::Message::ref message) { } user->getConversationManager()->handleMessageReceived(message); - - // Do not count chatstate notification... - boost::shared_ptr statePayload = message->getPayload(); - if (!statePayload) { - messageToBackendSent(); - } } void UserManager::handleGeneralPresenceReceived(Swift::Presence::ref presence) { From 9f1a88bec8efe64f4689498047170c1f8ef9f455 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Sun, 16 Sep 2012 14:56:07 +0200 Subject: [PATCH 3/4] Working reconnection --- src/tests/user.cpp | 2 ++ src/user.cpp | 1 + 2 files changed, 3 insertions(+) diff --git a/src/tests/user.cpp b/src/tests/user.cpp index fcf348c8..114da87b 100644 --- a/src/tests/user.cpp +++ b/src/tests/user.cpp @@ -205,6 +205,7 @@ class UserTest : public CPPUNIT_NS :: TestFixture, public BasicTest { } void handleDisconnectedReconnect() { + readyToConnect = false; User *user = userManager->getUser("user@localhost"); user->handleDisconnected("Connection error"); loop->processEvents(); @@ -212,6 +213,7 @@ class UserTest : public CPPUNIT_NS :: TestFixture, public BasicTest { CPPUNIT_ASSERT(!streamEnded); user = userManager->getUser("user@localhost"); CPPUNIT_ASSERT(user); + CPPUNIT_ASSERT(readyToConnect); } }; diff --git a/src/user.cpp b/src/user.cpp index 3d3cb06d..56f53f72 100644 --- a/src/user.cpp +++ b/src/user.cpp @@ -348,6 +348,7 @@ void User::handleDisconnected(const std::string &error, Swift::SpectrumErrorPayl // TODO: If this stops working, create onReconnect signal m_userManager->onUserDestroyed(this); m_userManager->onUserCreated(this); + onReadyToConnect(); return; } } From c1e478774f7a3ed94c28b57a4669736b3180a6bc Mon Sep 17 00:00:00 2001 From: HanzZ Date: Sun, 16 Sep 2012 15:13:11 +0200 Subject: [PATCH 4/4] Test for chatstates --- src/tests/conversationmanager.cpp | 33 +++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/tests/conversationmanager.cpp b/src/tests/conversationmanager.cpp index 47d421f0..4319177b 100644 --- a/src/tests/conversationmanager.cpp +++ b/src/tests/conversationmanager.cpp @@ -25,6 +25,7 @@ class ConversationManagerTest : public CPPUNIT_NS :: TestFixture, public BasicTe CPPUNIT_TEST_SUITE(ConversationManagerTest); CPPUNIT_TEST(handleNormalMessages); CPPUNIT_TEST(handleGroupchatMessages); + CPPUNIT_TEST(handleChatstateMessages); CPPUNIT_TEST(handleParticipantChanged); CPPUNIT_TEST(handlePMFromXMPP); CPPUNIT_TEST_SUITE_END(); @@ -55,6 +56,38 @@ class ConversationManagerTest : public CPPUNIT_NS :: TestFixture, public BasicTe m_msg = _msg; } + void handleChatstateMessages() { + User *user = userManager->getUser("user@localhost"); + + TestingConversation *conv = new TestingConversation(user->getConversationManager(), "buddy1"); + user->getConversationManager()->addConversation(conv); + conv->onMessageToSend.connect(boost::bind(&ConversationManagerTest::handleMessageReceived, this, _1, _2)); + + boost::shared_ptr msg(new Swift::Message()); + msg->addPayload(boost::make_shared(Swift::ChatState::Composing)); + + // Forward it + conv->handleMessage(msg); + loop->processEvents(); + + CPPUNIT_ASSERT_EQUAL(1, (int) received.size()); + CPPUNIT_ASSERT(dynamic_cast(getStanza(received[0]))); + CPPUNIT_ASSERT(dynamic_cast(getStanza(received[0]))->getPayload()); + received.clear(); + + // send response + msg->setFrom("user@localhost/resource"); + msg->setTo("buddy1@localhost/bot"); + injectMessage(msg); + loop->processEvents(); + + CPPUNIT_ASSERT_EQUAL(0, (int) received.size()); + CPPUNIT_ASSERT(m_msg); + CPPUNIT_ASSERT(m_msg->getPayload()); + + received.clear(); + } + void handleNormalMessages() { User *user = userManager->getUser("user@localhost");