diff --git a/src/networkpluginserver.cpp b/src/networkpluginserver.cpp index 69d462ffbec7007cae36e47c075997d5748e4be8..616c82ee3851ee908084c437d806f7f128a1dd17 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;