From 67c1817031d31a02ca7002343ff0a6b1dc6f0e9a Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Wed, 22 Jun 2011 14:25:05 +0200 Subject: [PATCH] Untested Attenion from legacy network -> XMPP --- backends/libpurple/main.cpp | 9 +++++++++ include/transport/networkplugin.h | 2 ++ include/transport/networkpluginserver.h | 1 + src/networkplugin.cpp | 15 +++++++++++++- src/networkpluginserver.cpp | 27 +++++++++++++++++++++++++ 5 files changed, 53 insertions(+), 1 deletion(-) diff --git a/backends/libpurple/main.cpp b/backends/libpurple/main.cpp index f843edb6..29f049dd 100644 --- a/backends/libpurple/main.cpp +++ b/backends/libpurple/main.cpp @@ -913,6 +913,14 @@ static void buddyTypingStopped(PurpleAccount *account, const char *who, gpointer np->handleBuddyStoppedTyping(np->m_accounts[account], w); } +static void gotAttention(PurpleAccount *account, const char *who, PurpleConversation *conv, guint type) { + std::string w = who; + size_t pos = w.find("/"); + if (pos != std::string::npos) + w.erase((int) pos, w.length() - (int) pos); + np->handleAttention(np->m_accounts[account], w, ""); +} + static bool initPurple(Config &cfg) { bool ret; @@ -958,6 +966,7 @@ static bool initPurple(Config &cfg) { purple_signal_connect(purple_conversations_get_handle(), "buddy-typing", &conversation_handle, PURPLE_CALLBACK(buddyTyping), NULL); purple_signal_connect(purple_conversations_get_handle(), "buddy-typed", &conversation_handle, PURPLE_CALLBACK(buddyTyped), NULL); purple_signal_connect(purple_conversations_get_handle(), "buddy-typing-stopped", &conversation_handle, PURPLE_CALLBACK(buddyTypingStopped), NULL); + purple_signal_connect(purple_conversations_get_handle(), "got-attention", &conversation_handle, PURPLE_CALLBACK(gotAttention), NULL); purple_signal_connect(purple_connections_get_handle(), "signed-on", &blist_handle,PURPLE_CALLBACK(signed_on), NULL); // purple_signal_connect(purple_blist_get_handle(), "buddy-removed", &blist_handle,PURPLE_CALLBACK(buddyRemoved), NULL); // purple_signal_connect(purple_blist_get_handle(), "buddy-signed-on", &blist_handle,PURPLE_CALLBACK(buddySignedOn), NULL); diff --git a/include/transport/networkplugin.h b/include/transport/networkplugin.h index 6f76640f..b71ba677 100644 --- a/include/transport/networkplugin.h +++ b/include/transport/networkplugin.h @@ -66,6 +66,8 @@ class NetworkPlugin { void handleAuthorization(const std::string &user, const std::string &buddyName); + void handleAttention(const std::string &user, const std::string &buddyName, const std::string &message); + virtual void handleLoginRequest(const std::string &user, const std::string &legacyName, const std::string &password) = 0; virtual void handleLogoutRequest(const std::string &user, const std::string &legacyName) = 0; virtual void handleMessageSendRequest(const std::string &user, const std::string &legacyName, const std::string &message) = 0; diff --git a/include/transport/networkpluginserver.h b/include/transport/networkpluginserver.h index d7345e73..4048efdd 100644 --- a/include/transport/networkpluginserver.h +++ b/include/transport/networkpluginserver.h @@ -69,6 +69,7 @@ class NetworkPluginServer { void handleVCardPayload(const std::string &payload); void handleChatStatePayload(const std::string &payload, Swift::ChatState::ChatStateType type); void handleAuthorizationPayload(const std::string &payload); + void handleAttentionPayload(const std::string &payload); void handleUserCreated(User *user); void handleRoomJoined(User *user, const std::string &room, const std::string &nickname, const std::string &password); diff --git a/src/networkplugin.cpp b/src/networkplugin.cpp index 7a19a5dc..06c3d269 100644 --- a/src/networkplugin.cpp +++ b/src/networkplugin.cpp @@ -73,7 +73,20 @@ void NetworkPlugin::handleMessage(const std::string &user, const std::string &le m.SerializeToString(&message); WRAP(message, pbnetwork::WrapperMessage_Type_TYPE_CONV_MESSAGE); -// std::cout << "SENDING MESSAGE\n"; + + send(message); +} + +void NetworkPlugin::handleAttention(const std::string &user, const std::string &buddyName, const std::string &msg) { + pbnetwork::ConversationMessage m; + m.set_username(user); + m.set_buddyname(buddyName); + m.set_message(msg); + + std::string message; + m.SerializeToString(&message); + + WRAP(message, pbnetwork::WrapperMessage_Type_TYPE_ATTENTION); send(message); } diff --git a/src/networkpluginserver.cpp b/src/networkpluginserver.cpp index ba715562..4e016af3 100644 --- a/src/networkpluginserver.cpp +++ b/src/networkpluginserver.cpp @@ -400,6 +400,30 @@ void NetworkPluginServer::handleConvMessagePayload(const std::string &data, bool conv->handleMessage(msg, payload.nickname()); } +void NetworkPluginServer::handleAttentionPayload(const std::string &data) { + pbnetwork::ConversationMessage payload; + if (payload.ParseFromString(data) == false) { + // TODO: ERROR + return; + } + + User *user = m_userManager->getUser(payload.username()); + if (!user) + return; + + boost::shared_ptr msg(new Swift::Message()); + msg->setBody(payload.message()); + msg->addPayload(boost::make_shared()); + + NetworkConversation *conv = (NetworkConversation *) user->getConversationManager()->getConversation(payload.buddyname()); + if (!conv) { + conv = new NetworkConversation(user->getConversationManager(), payload.buddyname()); + conv->onMessageToSend.connect(boost::bind(&NetworkPluginServer::handleMessageReceived, this, _1, _2)); + } + + conv->handleMessage(msg); +} + void NetworkPluginServer::handleDataRead(Client *c, const Swift::SafeByteArray &data) { c->data.insert(c->data.end(), data.begin(), data.end()); while (c->data.size() != 0) { @@ -463,6 +487,9 @@ void NetworkPluginServer::handleDataRead(Client *c, const Swift::SafeByteArray & case pbnetwork::WrapperMessage_Type_TYPE_AUTH_REQUEST: handleAuthorizationPayload(wrapper.payload()); break; + case pbnetwork::WrapperMessage_Type_TYPE_ATTENTION: + handleAttentionPayload(wrapper.payload()); + break; default: return; }