diff --git a/backends/libpurple/main.cpp b/backends/libpurple/main.cpp index a1bcd78834a8529192f47c81fe8db24c45962348..f843edb6cefda9402a18eb45b411c2ab872d6eeb 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 c959589edd692a7da738d1c1cbcc4859c9f111fc..1c92fa6d40cf01d928b08d823a4960654d95e7cb 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 7d87124195ad711387236695d11aa6cbfae48a1e..aa605a421750867312e24288b93a7e0f2ee67887 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 aab71ae92126bec9104f91f4d389d340b4a7bc0a..6f76640f4e75084084cb32783b1856b8007e7611 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 0b237b41383276bc1284a6b51ee6bac48f463886..9165fe06676f510cb491996de25d1c8485ed4c99 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 0e73f41d0723e7bc13efe12211bf0a1593a24a06..7a19a5dc1a69751fbc198585f2214c61546767a5 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 92c2fdb14ef2eab3f882af2e8ca176cf5618d27e..ba715562d069e5bd17a6fd86004c6d4a48599a29 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 e06beda6775e892854be3019fc64724fae63e385..66878e4649520724b23b73818f6fdb9f7b673efe 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;