diff --git a/backends/libircclient-qt/main.cpp b/backends/libircclient-qt/main.cpp index b021bf3c..be26ffcc 100644 --- a/backends/libircclient-qt/main.cpp +++ b/backends/libircclient-qt/main.cpp @@ -42,7 +42,7 @@ class IRCNetworkPlugin : public NetworkPlugin { m_sessions[user]->deleteLater(); } - void handleMessageSendRequest(const std::string &user, const std::string &legacyName, const std::string &message) { + void handleMessageSendRequest(const std::string &user, const std::string &legacyName, const std::string &message, const std::string &/*xhtml*/) { std::cout << "MESSAGE " << user << " " << legacyName << "\n"; if (m_sessions[user] == NULL) return; diff --git a/backends/libpurple/main.cpp b/backends/libpurple/main.cpp index 29f049dd..2c6c9964 100644 --- a/backends/libpurple/main.cpp +++ b/backends/libpurple/main.cpp @@ -259,16 +259,22 @@ class SpectrumNetworkPlugin : public NetworkPlugin { } } - void handleMessageSendRequest(const std::string &user, const std::string &legacyName, const std::string &message) { + void handleMessageSendRequest(const std::string &user, const std::string &legacyName, const std::string &message, const std::string &xhtml) { PurpleAccount *account = m_sessions[user]; 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); + if (xhtml.empty()) { + gchar *_markup = purple_markup_escape_text(message.c_str(), -1); + purple_conv_im_send(PURPLE_CONV_IM(conv), _markup); + g_free(_markup); + } + else { + std::cout << xhtml << "\n"; + purple_conv_im_send(PURPLE_CONV_IM(conv), xhtml.c_str()); + } } } diff --git a/include/Swiften/Parser/PayloadParsers/XHTMLIMParser.cpp b/include/Swiften/Parser/PayloadParsers/XHTMLIMParser.cpp index 32f90d29..53444af2 100644 --- a/include/Swiften/Parser/PayloadParsers/XHTMLIMParser.cpp +++ b/include/Swiften/Parser/PayloadParsers/XHTMLIMParser.cpp @@ -21,7 +21,7 @@ void XHTMLIMParser::handleStartElement(const std::string& element, const std::st } } else if (level_ >= InsideBodyLevel && bodyParser_) { - bodyParser_->handleStartElement(element, ns, attributes); + bodyParser_->handleStartElement(element, "", attributes); } } diff --git a/include/transport/networkplugin.h b/include/transport/networkplugin.h index b71ba677..80d6b80f 100644 --- a/include/transport/networkplugin.h +++ b/include/transport/networkplugin.h @@ -70,7 +70,7 @@ 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; + virtual void handleMessageSendRequest(const std::string &user, const std::string &legacyName, const std::string &message, const std::string &xhtml = "") = 0; virtual void handleVCardRequest(const std::string &/*user*/, const std::string &/*legacyName*/, unsigned int /*id*/) {} virtual void handleVCardUpdatedRequest(const std::string &/*user*/, const std::string &/*photo*/) {} virtual void handleJoinRoomRequest(const std::string &/*user*/, const std::string &/*room*/, const std::string &/*nickname*/, const std::string &/*pasword*/) {} diff --git a/src/networkplugin.cpp b/src/networkplugin.cpp index 06c3d269..21bbbae8 100644 --- a/src/networkplugin.cpp +++ b/src/networkplugin.cpp @@ -313,7 +313,7 @@ void NetworkPlugin::handleConvMessagePayload(const std::string &data) { return; } - handleMessageSendRequest(payload.username(), payload.buddyname(), payload.message()); + handleMessageSendRequest(payload.username(), payload.buddyname(), payload.message(), payload.xhtml()); } void NetworkPlugin::handleAttentionPayload(const std::string &data) { diff --git a/src/networkpluginserver.cpp b/src/networkpluginserver.cpp index 4e016af3..8538e661 100644 --- a/src/networkpluginserver.cpp +++ b/src/networkpluginserver.cpp @@ -35,6 +35,7 @@ #include "Swiften/Elements/StreamError.h" #include "Swiften/Network/BoostConnectionServer.h" #include "Swiften/Elements/AttentionPayload.h" +#include "Swiften/Elements/XHTMLIMPayload.h" #include "pbnetwork.pb.h" #include "sys/wait.h" #include "sys/signal.h" @@ -645,7 +646,7 @@ void NetworkPluginServer::handleUserDestroyed(User *user) { } void NetworkPluginServer::handleMessageReceived(NetworkConversation *conv, boost::shared_ptr &msg) { - + // handle ChatState boost::shared_ptr statePayload = msg->getPayload(); if (statePayload) { pbnetwork::WrapperMessage_Type type = pbnetwork::WrapperMessage_Type_TYPE_BUDDY_CHANGED; @@ -677,6 +678,7 @@ void NetworkPluginServer::handleMessageReceived(NetworkConversation *conv, boost } } + // Handle attention requests boost::shared_ptr attentionPayload = msg->getPayload(); if (attentionPayload) { pbnetwork::ConversationMessage m; @@ -693,13 +695,20 @@ void NetworkPluginServer::handleMessageReceived(NetworkConversation *conv, boost send(c->connection, message); return; } - - if (!msg->getBody().empty()) { + std::string xhtml; + boost::shared_ptr xhtmlPayload = msg->getPayload(); + if (xhtmlPayload) { + xhtml = xhtmlPayload->getBody(); + } + + // Send normal message + if (!msg->getBody().empty() || !xhtml.empty()) { pbnetwork::ConversationMessage m; m.set_username(conv->getConversationManager()->getUser()->getJID().toBare()); m.set_buddyname(conv->getLegacyName()); m.set_message(msg->getBody()); + m.set_xhtml(xhtml); std::string message; m.SerializeToString(&message); diff --git a/src/pbnetwork.proto b/src/pbnetwork.proto index 66878e46..83e0dcd8 100644 --- a/src/pbnetwork.proto +++ b/src/pbnetwork.proto @@ -37,6 +37,7 @@ message ConversationMessage { required string buddyName = 2; required string message = 3; optional string nickname = 4; + optional string xhtml = 5; } message Room {