From bc585576a9ab503c9b51567312d0c3579042c886 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Fri, 13 May 2011 23:37:48 +0200 Subject: [PATCH] ping/pong, message transfering --- backends/libpurple/main.cpp | 13 +++--- include/transport/conversationmanager.h | 4 ++ include/transport/networkplugin.h | 2 + include/transport/networkpluginserver.h | 4 ++ include/transport/transport.h | 1 + src/networkplugin.cpp | 14 ++++++ src/networkpluginserver.cpp | 59 +++++++++++++++++++++++++ src/pbnetwork.proto | 13 ++---- 8 files changed, 94 insertions(+), 16 deletions(-) diff --git a/backends/libpurple/main.cpp b/backends/libpurple/main.cpp index a8966e01..03b8fc8c 100644 --- a/backends/libpurple/main.cpp +++ b/backends/libpurple/main.cpp @@ -317,17 +317,18 @@ static void conv_write_im(PurpleConversation *conv, const char *who, const char // Don't forwards our own messages. if (flags & PURPLE_MESSAGE_SEND || flags & PURPLE_MESSAGE_SYSTEM) return; - SpectrumConversation *s_conv = (SpectrumConversation *) conv->ui_data; - if (!s_conv) - return; + PurpleAccount *account = purple_conversation_get_account(conv); +// SpectrumConversation *s_conv = (SpectrumConversation *) conv->ui_data; +// if (!s_conv) +// return; - boost::shared_ptr msg(new Swift::Message()); +// boost::shared_ptr msg(new Swift::Message()); char *striped = purple_markup_strip_html(message); - msg->setBody(message); + std::string msg = stripped; g_free(striped); - s_conv->handleMessage(msg); + np->handleMessage(np->m_accounts[account], who, msg); } static PurpleConversationUiOps conversation_ui_ops = diff --git a/include/transport/conversationmanager.h b/include/transport/conversationmanager.h index 47748eac..d7804b93 100644 --- a/include/transport/conversationmanager.h +++ b/include/transport/conversationmanager.h @@ -47,6 +47,10 @@ class ConversationManager { Component *getComponent() { return m_component; } + Conversation *getConversation(const std::string &name) { + return m_convs[name]; + } + void setConversation(Conversation *conv); void unsetConversation(Conversation *conv); diff --git a/include/transport/networkplugin.h b/include/transport/networkplugin.h index 646b500e..9d22a06c 100644 --- a/include/transport/networkplugin.h +++ b/include/transport/networkplugin.h @@ -46,6 +46,8 @@ class NetworkPlugin { void handleDisconnected(const std::string &user, const std::string &legacyName, int error, const std::string &message); + void handleMessage(const std::string &user, const std::string &legacyName, 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; diff --git a/include/transport/networkpluginserver.h b/include/transport/networkpluginserver.h index 9649289c..f5ddb2bd 100644 --- a/include/transport/networkpluginserver.h +++ b/include/transport/networkpluginserver.h @@ -36,6 +36,7 @@ class Component; class Buddy; class LocalBuddy; class Config; +class NetworkConversation; class NetworkPluginServer { public: @@ -43,6 +44,8 @@ class NetworkPluginServer { virtual ~NetworkPluginServer(); + void handleMessageReceived(NetworkConversation *conv, boost::shared_ptr &message); + private: void handleNewClientConnection(boost::shared_ptr c); void handleSessionFinished(boost::shared_ptr); @@ -51,6 +54,7 @@ class NetworkPluginServer { void handleConnectedPayload(const std::string &payload); void handleDisconnectedPayload(const std::string &payload); void handleBuddyChangedPayload(const std::string &payload); + void handleConvMessagePayload(const std::string &payload); void handleUserCreated(User *user); void handleUserReadyToConnect(User *user); diff --git a/include/transport/transport.h b/include/transport/transport.h index 46c37ab5..50478f87 100644 --- a/include/transport/transport.h +++ b/include/transport/transport.h @@ -164,5 +164,6 @@ namespace Transport { friend class User; friend class UserRegistration; + friend class NetworkPluginServer; }; } diff --git a/src/networkplugin.cpp b/src/networkplugin.cpp index f5b82b65..e600663c 100644 --- a/src/networkplugin.cpp +++ b/src/networkplugin.cpp @@ -55,6 +55,20 @@ NetworkPlugin::~NetworkPlugin() { delete m_factories; } +void NetworkPlugin::handleMessage(const std::string &user, const std::string &legacyName, const std::string &msg) { + pbnetwork::ConversationMessage m; + m.set_username(user); + m.set_buddyname(legacyName); + m.set_message(msg); + + std::string message; + m.SerializeToString(&message); + + WRAP(message, pbnetwork::WrapperMessage_Type_TYPE_CONV_MESSAGE); + + send(message); +} + void NetworkPlugin::handleBuddyChanged(const std::string &user, const std::string &buddyName, const std::string &alias, const std::string &groups, int status, const std::string &statusMessage, const std::string &iconHash) { pbnetwork::Buddy buddy; diff --git a/src/networkpluginserver.cpp b/src/networkpluginserver.cpp index 69d462ff..616c82ee 100644 --- a/src/networkpluginserver.cpp +++ b/src/networkpluginserver.cpp @@ -27,6 +27,7 @@ #include "transport/conversationmanager.h" #include "transport/localbuddy.h" #include "transport/config.h" +#include "transport/conversation.h" #include "Swiften/Swiften.h" #include "Swiften/Server/ServerStanzaChannel.h" #include "Swiften/Elements/StreamError.h" @@ -36,6 +37,37 @@ namespace Transport { +class NetworkConversation : public Conversation { + public: + NetworkConversation(ConversationManager *conversationManager, const std::string &legacyName) : Conversation(conversationManager, legacyName) { + } + + void sendMessage(boost::shared_ptr &message) { + onMessageToSend(this, message); + } + + boost::signal &)> onMessageToSend; +}; + +class NetworkFactory : public Factory { + public: + NetworkFactory(NetworkPluginServer *nps) { + m_nps = nps; + } + + Conversation *createConversation(ConversationManager *conversationManager, const std::string &legacyName) { + NetworkConversation *nc = new NetworkConversation(conversationManager, legacyName); + nc->onMessageToSend.connect(boost::bind(&NetworkPluginServer::handleMessageReceived, m_nps, _1, _2)); + return nc; + } + + Buddy *createBuddy(RosterManager *rosterManager, const BuddyInfo &buddyInfo) { + return new LocalBuddy(rosterManager, -1); + } + private: + NetworkPluginServer *m_nps; +}; + #define WRAP(MESSAGE, TYPE) pbnetwork::WrapperMessage wrap; \ wrap.set_type(TYPE); \ wrap.set_payload(MESSAGE); \ @@ -161,6 +193,26 @@ void NetworkPluginServer::handleBuddyChangedPayload(const std::string &data) { } } +void NetworkPluginServer::handleConvMessagePayload(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; + + NetworkConversation *conv = (NetworkConversation *) user->getConversationManager()->getConversation(payload.buddyname()); + if (!conv) { + conv = new NetworkConversation(user->getConversationManager(), payload.buddyname()); + } + boost::shared_ptr msg(new Swift::Message()); + msg->setBody(payload.message()); + conv->handleMessage(msg); +} + void NetworkPluginServer::handleDataRead(boost::shared_ptr c, const Swift::ByteArray &data) { long expected_size = 0; m_data += data.toString(); @@ -197,6 +249,9 @@ void NetworkPluginServer::handleDataRead(boost::shared_ptr c, case pbnetwork::WrapperMessage_Type_TYPE_BUDDY_CHANGED: handleBuddyChangedPayload(wrapper.payload()); break; + case pbnetwork::WrapperMessage_Type_TYPE_CONV_MESSAGE: + handleConvMessagePayload(wrapper.payload()); + break; case pbnetwork::WrapperMessage_Type_TYPE_PONG: m_pongReceived = true; break; @@ -261,6 +316,10 @@ void NetworkPluginServer::handleUserDestroyed(User *user) { send(m_client, message); } +void NetworkPluginServer::handleMessageReceived(NetworkConversation *conv, boost::shared_ptr &message) { + +} + void NetworkPluginServer::sendPing() { std::string message; diff --git a/src/pbnetwork.proto b/src/pbnetwork.proto index 47321f61..a1433050 100644 --- a/src/pbnetwork.proto +++ b/src/pbnetwork.proto @@ -33,11 +33,6 @@ message Buddy { optional string iconHash = 7; } -message Conversation { - required string userName = 1; - required string buddyName = 2; -} - message ConversationMessage { required string userName = 1; required string buddyName = 2; @@ -52,11 +47,9 @@ message WrapperMessage { TYPE_LOGOUT = 4; TYPE_BUDDY_CHANGED = 6; TYPE_BUDDY_REMOVED = 7; - TYPE_CONV_CREATED = 8; - TYPE_CONV_WRITE = 9; - TYPE_CONV_REMOVED = 10; - TYPE_PING = 11; - TYPE_PONG = 12; + TYPE_CONV_MESSAGE = 8; + TYPE_PING = 9; + TYPE_PONG = 10; } required Type type = 1; optional bytes payload = 2;