Set subject on IRC

This commit is contained in:
HanzZ 2012-09-24 15:40:41 +02:00
parent af6b013748
commit eb1df41b3e
7 changed files with 78 additions and 1 deletions

View file

@ -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) { 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 session = getSessionName(user, room);
std::string target = getTargetName(room); std::string target = getTargetName(room);

View file

@ -26,6 +26,8 @@ class IRCNetworkPlugin : public QObject, public NetworkPlugin {
void handleLeaveRoomRequest(const std::string &user, const std::string &room); 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: public slots:
void readData(); void readData();
void sendData(const std::string &string); void sendData(const std::string &string);

View file

@ -218,6 +218,7 @@ class NetworkPlugin {
/// \param photo Raw photo data. /// \param photo Raw photo data.
virtual void handleVCardUpdatedRequest(const std::string &/*user*/, const std::string &/*photo*/, const std::string &nickname) {} 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 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*/) {} virtual void handleLeaveRoomRequest(const std::string &/*user*/, const std::string &/*room*/) {}
@ -260,6 +261,7 @@ class NetworkPlugin {
void handleFTFinishPayload(const std::string &payload); void handleFTFinishPayload(const std::string &payload);
void handleFTPausePayload(const std::string &payload); void handleFTPausePayload(const std::string &payload);
void handleFTContinuePayload(const std::string &payload); void handleFTContinuePayload(const std::string &payload);
void handleRoomSubjectChangedPayload(const std::string &payload);
void send(const std::string &data); void send(const std::string &data);
void sendPong(); void sendPong();

View file

@ -374,6 +374,16 @@ void NetworkPlugin::handleConvMessagePayload(const std::string &data) {
handleMessageSendRequest(payload.username(), payload.buddyname(), payload.message(), payload.xhtml()); 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) { void NetworkPlugin::handleAttentionPayload(const std::string &data) {
pbnetwork::ConversationMessage payload; pbnetwork::ConversationMessage payload;
if (payload.ParseFromString(data) == false) { if (payload.ParseFromString(data) == false) {
@ -550,6 +560,9 @@ void NetworkPlugin::handleDataRead(std::string &data) {
case pbnetwork::WrapperMessage_Type_TYPE_CONV_MESSAGE: case pbnetwork::WrapperMessage_Type_TYPE_CONV_MESSAGE:
handleConvMessagePayload(wrapper.payload()); handleConvMessagePayload(wrapper.payload());
break; break;
case pbnetwork::WrapperMessage_Type_TYPE_ROOM_SUBJECT_CHANGED:
handleRoomSubjectChangedPayload(wrapper.payload());
break;
case pbnetwork::WrapperMessage_Type_TYPE_JOIN_ROOM: case pbnetwork::WrapperMessage_Type_TYPE_JOIN_ROOM:
handleJoinRoomPayload(wrapper.payload()); handleJoinRoomPayload(wrapper.payload());
break; break;

View file

@ -1302,6 +1302,22 @@ void NetworkPluginServer::handleMessageReceived(NetworkConversation *conv, boost
return; 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; std::string xhtml;
boost::shared_ptr<Swift::XHTMLIMPayload> xhtmlPayload = msg->getPayload<Swift::XHTMLIMPayload>(); boost::shared_ptr<Swift::XHTMLIMPayload> xhtmlPayload = msg->getPayload<Swift::XHTMLIMPayload>();

View file

@ -27,6 +27,7 @@ class ConversationManagerTest : public CPPUNIT_NS :: TestFixture, public BasicTe
CPPUNIT_TEST(handleGroupchatMessages); CPPUNIT_TEST(handleGroupchatMessages);
CPPUNIT_TEST(handleGroupchatMessagesTwoResources); CPPUNIT_TEST(handleGroupchatMessagesTwoResources);
CPPUNIT_TEST(handleChatstateMessages); CPPUNIT_TEST(handleChatstateMessages);
CPPUNIT_TEST(handleSubjectMessages);
CPPUNIT_TEST(handleParticipantChanged); CPPUNIT_TEST(handleParticipantChanged);
CPPUNIT_TEST(handleParticipantChangedTwoResources); CPPUNIT_TEST(handleParticipantChangedTwoResources);
CPPUNIT_TEST(handlePMFromXMPP); CPPUNIT_TEST(handlePMFromXMPP);
@ -91,6 +92,38 @@ class ConversationManagerTest : public CPPUNIT_NS :: TestFixture, public BasicTe
received.clear(); 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<Swift::Message> 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<Swift::Message *>(getStanza(received[0])));
CPPUNIT_ASSERT_EQUAL(std::string("subject"), dynamic_cast<Swift::Message *>(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() { void handleNormalMessages() {
User *user = userManager->getUser("user@localhost"); User *user = userManager->getUser("user@localhost");

View file

@ -340,7 +340,7 @@ void UserManager::handleMessageReceived(Swift::Message::ref message) {
messageToBackendSent(); messageToBackendSent();
} }
if (message->getBody().empty() && !statePayload) { if (message->getBody().empty() && !statePayload && message->getSubject().empty()) {
return; return;
} }