From eb1df41b3ea2729151376acff6ef723e434dc1c8 2012-09-24 15:40:41 From: HanzZ Date: 2012-09-24 15:40:41 Subject: [PATCH] Set subject on IRC --- diff --git a/backends/libcommuni/ircnetworkplugin.cpp b/backends/libcommuni/ircnetworkplugin.cpp index 42b4a47de0e7f7db65ebca974c5411142799c486..57e7d289aa320921fb76e02a4c27b1e3b5ebe9b2 100644 --- a/backends/libcommuni/ircnetworkplugin.cpp +++ b/backends/libcommuni/ircnetworkplugin.cpp @@ -129,6 +129,17 @@ void IRCNetworkPlugin::handleMessageSendRequest(const std::string &user, const s } } +void IRCNetworkPlugin::handleRoomSubjectChangedRequest(const std::string &user, const std::string &room, const std::string &message) { + std::string session = getSessionName(user, room); + if (m_sessions[session] == NULL) { + LOG4CXX_WARN(logger, user << ": Session name: " << session << ", No session for user"); + return; + } + + std::string target = getTargetName(room); + m_sessions[session]->sendCommand(IrcCommand::createTopic(FROM_UTF8(target), FROM_UTF8(message))); +} + void IRCNetworkPlugin::handleJoinRoomRequest(const std::string &user, const std::string &room, const std::string &nickname, const std::string &password) { std::string session = getSessionName(user, room); std::string target = getTargetName(room); diff --git a/backends/libcommuni/ircnetworkplugin.h b/backends/libcommuni/ircnetworkplugin.h index 09534425b74d3d7c4758b8a28f17d0b746ef0f27..c2925b77c4eaa73200206e0615d185cbab150098 100644 --- a/backends/libcommuni/ircnetworkplugin.h +++ b/backends/libcommuni/ircnetworkplugin.h @@ -26,6 +26,8 @@ class IRCNetworkPlugin : public QObject, public NetworkPlugin { void handleLeaveRoomRequest(const std::string &user, const std::string &room); + void handleRoomSubjectChangedRequest(const std::string &user, const std::string &room, const std::string &message); + public slots: void readData(); void sendData(const std::string &string); diff --git a/include/transport/networkplugin.h b/include/transport/networkplugin.h index b565f43a837cc65f4aaf6e90af9a6a52da2ab976..ea59422541bfa2f968cce3820bbde1709c3aee1d 100644 --- a/include/transport/networkplugin.h +++ b/include/transport/networkplugin.h @@ -218,6 +218,7 @@ class NetworkPlugin { /// \param photo Raw photo data. virtual void handleVCardUpdatedRequest(const std::string &/*user*/, const std::string &/*photo*/, const std::string &nickname) {} + virtual void handleRoomSubjectChangedRequest(const std::string &/*user*/, const std::string &/*room*/, const std::string &/*message*/) {} virtual void handleJoinRoomRequest(const std::string &/*user*/, const std::string &/*room*/, const std::string &/*nickname*/, const std::string &/*pasword*/) {} virtual void handleLeaveRoomRequest(const std::string &/*user*/, const std::string &/*room*/) {} @@ -260,6 +261,7 @@ class NetworkPlugin { void handleFTFinishPayload(const std::string &payload); void handleFTPausePayload(const std::string &payload); void handleFTContinuePayload(const std::string &payload); + void handleRoomSubjectChangedPayload(const std::string &payload); void send(const std::string &data); void sendPong(); diff --git a/plugin/cpp/networkplugin.cpp b/plugin/cpp/networkplugin.cpp index 6b289cd5f70fbb74b35043c4fd44a75de7a53f38..eba6dcffab6f5a23a305614f5f9e2d88643c1690 100644 --- a/plugin/cpp/networkplugin.cpp +++ b/plugin/cpp/networkplugin.cpp @@ -374,6 +374,16 @@ void NetworkPlugin::handleConvMessagePayload(const std::string &data) { handleMessageSendRequest(payload.username(), payload.buddyname(), payload.message(), payload.xhtml()); } +void NetworkPlugin::handleRoomSubjectChangedPayload(const std::string &data) { + pbnetwork::ConversationMessage payload; + if (payload.ParseFromString(data) == false) { + // TODO: ERROR + return; + } + + handleRoomSubjectChangedRequest(payload.username(), payload.buddyname(), payload.message()); +} + void NetworkPlugin::handleAttentionPayload(const std::string &data) { pbnetwork::ConversationMessage payload; if (payload.ParseFromString(data) == false) { @@ -550,6 +560,9 @@ void NetworkPlugin::handleDataRead(std::string &data) { case pbnetwork::WrapperMessage_Type_TYPE_CONV_MESSAGE: handleConvMessagePayload(wrapper.payload()); break; + case pbnetwork::WrapperMessage_Type_TYPE_ROOM_SUBJECT_CHANGED: + handleRoomSubjectChangedPayload(wrapper.payload()); + break; case pbnetwork::WrapperMessage_Type_TYPE_JOIN_ROOM: handleJoinRoomPayload(wrapper.payload()); break; diff --git a/src/networkpluginserver.cpp b/src/networkpluginserver.cpp index 04b7ff2a60cf866661179f1c871159534a2c4c76..72179d98e5ab8b98354fb1f420a17bcf21650f2a 100644 --- a/src/networkpluginserver.cpp +++ b/src/networkpluginserver.cpp @@ -1301,6 +1301,22 @@ void NetworkPluginServer::handleMessageReceived(NetworkConversation *conv, boost send(c->connection, message); return; } + + if (!msg->getSubject().empty()) { + pbnetwork::ConversationMessage m; + m.set_username(conv->getConversationManager()->getUser()->getJID().toBare()); + m.set_buddyname(conv->getLegacyName()); + m.set_message(msg->getSubject()); + + std::string message; + m.SerializeToString(&message); + + WRAP(message, pbnetwork::WrapperMessage_Type_TYPE_ROOM_SUBJECT_CHANGED); + + Backend *c = (Backend *) conv->getConversationManager()->getUser()->getData(); + send(c->connection, message); + return; + } std::string xhtml; diff --git a/src/tests/conversationmanager.cpp b/src/tests/conversationmanager.cpp index a997f6d5a1283a4e624c3ab27f6c7075f51d17ef..9aa739fa2151e56612750680589009fc8286937e 100644 --- a/src/tests/conversationmanager.cpp +++ b/src/tests/conversationmanager.cpp @@ -27,6 +27,7 @@ class ConversationManagerTest : public CPPUNIT_NS :: TestFixture, public BasicTe CPPUNIT_TEST(handleGroupchatMessages); CPPUNIT_TEST(handleGroupchatMessagesTwoResources); CPPUNIT_TEST(handleChatstateMessages); + CPPUNIT_TEST(handleSubjectMessages); CPPUNIT_TEST(handleParticipantChanged); CPPUNIT_TEST(handleParticipantChangedTwoResources); CPPUNIT_TEST(handlePMFromXMPP); @@ -91,6 +92,38 @@ class ConversationManagerTest : public CPPUNIT_NS :: TestFixture, public BasicTe received.clear(); } + void handleSubjectMessages() { + 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->setSubject("subject"); + + // Forward it + conv->handleMessage(msg); + loop->processEvents(); + + CPPUNIT_ASSERT_EQUAL(1, (int) received.size()); + CPPUNIT_ASSERT(dynamic_cast(getStanza(received[0]))); + CPPUNIT_ASSERT_EQUAL(std::string("subject"), dynamic_cast(getStanza(received[0]))->getSubject()); + 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_EQUAL(std::string("subject"), m_msg->getSubject()); + + received.clear(); + } + void handleNormalMessages() { User *user = userManager->getUser("user@localhost"); diff --git a/src/usermanager.cpp b/src/usermanager.cpp index ebbfb2d1fdbe30382e9361c79cff0cf91b6cd73f..4342a214e2d5585cc73505368654a6f8081275f0 100644 --- a/src/usermanager.cpp +++ b/src/usermanager.cpp @@ -340,7 +340,7 @@ void UserManager::handleMessageReceived(Swift::Message::ref message) { messageToBackendSent(); } - if (message->getBody().empty() && !statePayload) { + if (message->getBody().empty() && !statePayload && message->getSubject().empty()) { return; }