diff --git a/backends/libpurple/main.cpp b/backends/libpurple/main.cpp index 1619710f..1808444a 100644 --- a/backends/libpurple/main.cpp +++ b/backends/libpurple/main.cpp @@ -107,6 +107,21 @@ class SpectrumNetworkPlugin : public NetworkPlugin { } } + void handleMessageSendRequest(const std::string &user, const std::string &legacyName, const std::string &message) { + const char *protocol = CONFIG_STRING(config, "service.protocol").c_str(); + PurpleAccount *account = purple_accounts_find(user.c_str(), protocol); + std::cout << user << "\n"; + if (account) { + PurpleConversation *conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, legacyName.c_str(), account); + if (!conv) { + conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, account, legacyName.c_str()); + } + gchar *_markup = purple_markup_escape_text(message.c_str(), -1); + purple_conv_im_send(PURPLE_CONV_IM(conv), _markup); + g_free(_markup); + } + } + std::map m_accounts; private: Config *config; @@ -318,11 +333,6 @@ static void conv_write_im(PurpleConversation *conv, const char *who, const char if (flags & PURPLE_MESSAGE_SEND || flags & PURPLE_MESSAGE_SYSTEM) 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()); char *striped = purple_markup_strip_html(message); std::string msg = striped; diff --git a/include/transport/conversation.h b/include/transport/conversation.h index 349fbb67..2ccd52cb 100644 --- a/include/transport/conversation.h +++ b/include/transport/conversation.h @@ -45,6 +45,10 @@ class Conversation { virtual void sendMessage(boost::shared_ptr &message) = 0; + ConversationManager *getConversationManager() { + return m_conversationManager; + } + private: ConversationManager *m_conversationManager; std::string m_legacyName; diff --git a/include/transport/networkplugin.h b/include/transport/networkplugin.h index 9d22a06c..db462f7f 100644 --- a/include/transport/networkplugin.h +++ b/include/transport/networkplugin.h @@ -50,11 +50,14 @@ class NetworkPlugin { 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; + private: void connect(); void handleLoginPayload(const std::string &payload); void handleLogoutPayload(const std::string &payload); + void handleConvMessagePayload(const std::string &payload); void handleDataRead(const Swift::ByteArray&); void handleConnected(bool error); void handleDisconnected(); diff --git a/src/networkplugin.cpp b/src/networkplugin.cpp index f3cd149b..df01f55e 100644 --- a/src/networkplugin.cpp +++ b/src/networkplugin.cpp @@ -146,6 +146,16 @@ void NetworkPlugin::handleLogoutPayload(const std::string &data) { handleLogoutRequest(payload.user(), payload.legacyname()); } +void NetworkPlugin::handleConvMessagePayload(const std::string &data) { + pbnetwork::ConversationMessage payload; + if (payload.ParseFromString(data) == false) { + // TODO: ERROR + return; + } + + handleMessageSendRequest(payload.username(), payload.buddyname(), payload.message()); +} + void NetworkPlugin::handleDataRead(const Swift::ByteArray &data) { long expected_size = 0; m_data += data.toString(); @@ -180,6 +190,9 @@ void NetworkPlugin::handleDataRead(const Swift::ByteArray &data) { case pbnetwork::WrapperMessage_Type_TYPE_PING: sendPong(); break; + case pbnetwork::WrapperMessage_Type_TYPE_CONV_MESSAGE: + handleConvMessagePayload(wrapper.payload()); + break; default: return; } diff --git a/src/networkpluginserver.cpp b/src/networkpluginserver.cpp index 94658cf9..f134988f 100644 --- a/src/networkpluginserver.cpp +++ b/src/networkpluginserver.cpp @@ -105,6 +105,7 @@ static void handleBuddyPayload(LocalBuddy *buddy, const pbnetwork::Buddy &payloa NetworkPluginServer::NetworkPluginServer(Component *component, Config *config, UserManager *userManager) { m_userManager = userManager; m_config = config; + component->m_factory = new NetworkFactory(this); m_pongReceived = false; m_userManager->onUserCreated.connect(boost::bind(&NetworkPluginServer::handleUserCreated, this, _1)); m_userManager->onUserDestroyed.connect(boost::bind(&NetworkPluginServer::handleUserDestroyed, this, _1)); @@ -208,6 +209,7 @@ void NetworkPluginServer::handleConvMessagePayload(const std::string &data) { 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)); } boost::shared_ptr msg(new Swift::Message()); msg->setBody(payload.message()); @@ -317,8 +319,18 @@ void NetworkPluginServer::handleUserDestroyed(User *user) { send(m_client, message); } -void NetworkPluginServer::handleMessageReceived(NetworkConversation *conv, boost::shared_ptr &message) { - +void NetworkPluginServer::handleMessageReceived(NetworkConversation *conv, boost::shared_ptr &msg) { + pbnetwork::ConversationMessage m; + m.set_username(conv->getConversationManager()->getUser()->getUserInfo().uin); + m.set_buddyname(conv->getLegacyName()); + m.set_message(msg->getBody()); + + std::string message; + m.SerializeToString(&message); + + WRAP(message, pbnetwork::WrapperMessage_Type_TYPE_CONV_MESSAGE); + + send(m_client, message); } void NetworkPluginServer::sendPing() {