From fb420ef1254efb5700659bc32463c04f023d02fc Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Wed, 22 Jun 2011 12:11:24 +0200 Subject: [PATCH] Working attention from XMPP -> legacy network --- backends/libpurple/main.cpp | 7 +++++++ include/Swiften/Server/Server.cpp | 2 +- include/Swiften/Server/Server.h | 2 -- include/transport/networkplugin.h | 2 ++ src/conversationmanager.cpp | 2 ++ src/networkplugin.cpp | 13 +++++++++++++ src/networkpluginserver.cpp | 19 +++++++++++++++++++ src/pbnetwork.proto | 1 + 8 files changed, 45 insertions(+), 3 deletions(-) diff --git a/backends/libpurple/main.cpp b/backends/libpurple/main.cpp index a1bcd788..f843edb6 100644 --- a/backends/libpurple/main.cpp +++ b/backends/libpurple/main.cpp @@ -433,6 +433,13 @@ class SpectrumNetworkPlugin : public NetworkPlugin { } } + void handleAttentionRequest(const std::string &user, const std::string &buddyName, const std::string &message) { + PurpleAccount *account = m_sessions[user]; + if (account) { + purple_prpl_send_attention(purple_account_get_connection(account), buddyName.c_str(), 0); + } + } + std::map m_sessions; std::map m_accounts; std::map m_vcards; diff --git a/include/Swiften/Server/Server.cpp b/include/Swiften/Server/Server.cpp index c959589e..1c92fa6d 100644 --- a/include/Swiften/Server/Server.cpp +++ b/include/Swiften/Server/Server.cpp @@ -100,7 +100,7 @@ void Server::handleNewClientConnection(boost::shared_ptr connection) boost::shared_ptr serverFromClientSession = boost::shared_ptr( new ServerFromClientSession(idGenerator.generateID(), connection, - &payloadParserFactories, &payloadSerializers, userRegistry_)); + getPayloadParserFactories(), getPayloadSerializers(), userRegistry_)); //serverFromClientSession->setAllowSASLEXTERNAL(); serverFromClientSession->onSessionStarted.connect( diff --git a/include/Swiften/Server/Server.h b/include/Swiften/Server/Server.h index 7d871241..aa605a42 100644 --- a/include/Swiften/Server/Server.h +++ b/include/Swiften/Server/Server.h @@ -67,8 +67,6 @@ namespace Swift { private: IDGenerator idGenerator; - FullPayloadParserFactoryCollection payloadParserFactories; - FullPayloadSerializerCollection payloadSerializers; UserRegistry *userRegistry_; int port_; EventLoop* eventLoop; diff --git a/include/transport/networkplugin.h b/include/transport/networkplugin.h index aab71ae9..6f76640f 100644 --- a/include/transport/networkplugin.h +++ b/include/transport/networkplugin.h @@ -80,6 +80,7 @@ class NetworkPlugin { virtual void handleTypingRequest(const std::string &/*user*/, const std::string &/*buddyName*/) {} virtual void handleTypedRequest(const std::string &/*user*/, const std::string &/*buddyName*/) {} virtual void handleStoppedTypingRequest(const std::string &/*user*/, const std::string &/*buddyName*/) {} + virtual void handleAttentionRequest(const std::string &/*user*/, const std::string &/*buddyName*/, const std::string &/*message*/) {} private: @@ -94,6 +95,7 @@ class NetworkPlugin { void handleBuddyChangedPayload(const std::string &payload); void handleBuddyRemovedPayload(const std::string &payload); void handleChatStatePayload(const std::string &payload, Swift::ChatState::ChatStateType type); + void handleAttentionPayload(const std::string &payload); void handleDataRead(const Swift::SafeByteArray&); void _handleConnected(bool error); void handleDisconnected(); diff --git a/src/conversationmanager.cpp b/src/conversationmanager.cpp index 0b237b41..9165fe06 100644 --- a/src/conversationmanager.cpp +++ b/src/conversationmanager.cpp @@ -61,9 +61,11 @@ void ConversationManager::handleMessageReceived(Swift::Message::ref message) { name.replace(name.find_last_of("%"), 1, "@"); } + // create conversation if it does not exist. if (!m_convs[name]) { m_convs[name] = m_component->getFactory()->createConversation(this, name); } + // if it exists and it's MUC, but this message is PM, get PM conversation or create new one. else if (m_convs[name]->isMUC() && message->getType() != Swift::Message::Groupchat) { std::string room_name = name; name = message->getTo().getResource(); diff --git a/src/networkplugin.cpp b/src/networkplugin.cpp index 0e73f41d..7a19a5dc 100644 --- a/src/networkplugin.cpp +++ b/src/networkplugin.cpp @@ -303,6 +303,16 @@ void NetworkPlugin::handleConvMessagePayload(const std::string &data) { handleMessageSendRequest(payload.username(), payload.buddyname(), payload.message()); } +void NetworkPlugin::handleAttentionPayload(const std::string &data) { + pbnetwork::ConversationMessage payload; + if (payload.ParseFromString(data) == false) { + // TODO: ERROR + return; + } + + handleAttentionRequest(payload.username(), payload.buddyname(), payload.message()); +} + void NetworkPlugin::handleJoinRoomPayload(const std::string &data) { pbnetwork::Room payload; if (payload.ParseFromString(data) == false) { @@ -443,6 +453,9 @@ void NetworkPlugin::handleDataRead(const Swift::SafeByteArray &data) { case pbnetwork::WrapperMessage_Type_TYPE_BUDDY_STOPPED_TYPING: handleChatStatePayload(wrapper.payload(), Swift::ChatState::Active); break; + case pbnetwork::WrapperMessage_Type_TYPE_ATTENTION: + handleAttentionPayload(wrapper.payload()); + break; default: return; } diff --git a/src/networkpluginserver.cpp b/src/networkpluginserver.cpp index 92c2fdb1..ba715562 100644 --- a/src/networkpluginserver.cpp +++ b/src/networkpluginserver.cpp @@ -34,6 +34,7 @@ #include "Swiften/Server/ServerStanzaChannel.h" #include "Swiften/Elements/StreamError.h" #include "Swiften/Network/BoostConnectionServer.h" +#include "Swiften/Elements/AttentionPayload.h" #include "pbnetwork.pb.h" #include "sys/wait.h" #include "sys/signal.h" @@ -649,6 +650,24 @@ void NetworkPluginServer::handleMessageReceived(NetworkConversation *conv, boost } } + boost::shared_ptr attentionPayload = msg->getPayload(); + if (attentionPayload) { + pbnetwork::ConversationMessage m; + m.set_username(conv->getConversationManager()->getUser()->getJID().toBare()); + m.set_buddyname(conv->getLegacyName()); + m.set_message(msg->getBody()); + + std::string message; + m.SerializeToString(&message); + + WRAP(message, pbnetwork::WrapperMessage_Type_TYPE_ATTENTION); + + Client *c = (Client *) conv->getConversationManager()->getUser()->getData(); + send(c->connection, message); + return; + } + + if (!msg->getBody().empty()) { pbnetwork::ConversationMessage m; m.set_username(conv->getConversationManager()->getUser()->getJID().toBare()); diff --git a/src/pbnetwork.proto b/src/pbnetwork.proto index e06beda6..66878e46 100644 --- a/src/pbnetwork.proto +++ b/src/pbnetwork.proto @@ -93,6 +93,7 @@ message WrapperMessage { TYPE_BUDDY_STOPPED_TYPING = 19; TYPE_BUDDY_TYPED = 20; TYPE_AUTH_REQUEST = 21; + TYPE_ATTENTION = 22; } required Type type = 1; optional bytes payload = 2;