diff --git a/backends/libpurple/main.cpp b/backends/libpurple/main.cpp index 2c6c9964..a9699450 100644 --- a/backends/libpurple/main.cpp +++ b/backends/libpurple/main.cpp @@ -616,22 +616,39 @@ static PurpleBlistUiOps blistUiOps = NULL }; -static void conv_write_im(PurpleConversation *conv, const char *who, const char *message, PurpleMessageFlags flags, time_t mtime) { +static void conv_write_im(PurpleConversation *conv, const char *who, const char *msg, PurpleMessageFlags flags, time_t mtime) { // Don't forwards our own messages. if (flags & PURPLE_MESSAGE_SEND || flags & PURPLE_MESSAGE_SYSTEM) return; PurpleAccount *account = purple_conversation_get_account(conv); - char *striped = purple_markup_strip_html(message); - std::string msg = striped; - g_free(striped); +// char *striped = purple_markup_strip_html(message); +// std::string msg = striped; +// g_free(striped); std::string w = who; size_t pos = w.find("/"); if (pos != std::string::npos) w.erase((int) pos, w.length() - (int) pos); - np->handleMessage(np->m_accounts[account], w, msg); + // Escape HTML characters. + char *newline = purple_strdup_withhtml(msg); + char *strip, *xhtml, *xhtml_linkified; + purple_markup_html_to_xhtml(newline, &xhtml, &strip); + xhtml_linkified = purple_markup_linkify(xhtml); + std::string message_(strip); + + std::string xhtml_(xhtml_linkified); + g_free(newline); + g_free(xhtml); + g_free(xhtml_linkified); + g_free(strip); + + if (xhtml_ == message_) { + xhtml_ = ""; + } + + np->handleMessage(np->m_accounts[account], w, message_, "", xhtml_); } static PurpleConversationUiOps conversation_ui_ops = diff --git a/include/transport/networkplugin.h b/include/transport/networkplugin.h index 80d6b80f..a27a20c3 100644 --- a/include/transport/networkplugin.h +++ b/include/transport/networkplugin.h @@ -50,7 +50,7 @@ class NetworkPlugin { void handleConnected(const std::string &user); - void handleMessage(const std::string &user, const std::string &legacyName, const std::string &message, const std::string &nickname = ""); + void handleMessage(const std::string &user, const std::string &legacyName, const std::string &message, const std::string &nickname = "", const std::string &xhtml = ""); void handleSubject(const std::string &user, const std::string &legacyName, const std::string &message, const std::string &nickname = ""); diff --git a/src/networkplugin.cpp b/src/networkplugin.cpp index 21bbbae8..e1bb0155 100644 --- a/src/networkplugin.cpp +++ b/src/networkplugin.cpp @@ -62,12 +62,13 @@ NetworkPlugin::~NetworkPlugin() { delete m_factories; } -void NetworkPlugin::handleMessage(const std::string &user, const std::string &legacyName, const std::string &msg, const std::string &nickname) { +void NetworkPlugin::handleMessage(const std::string &user, const std::string &legacyName, const std::string &msg, const std::string &nickname, const std::string &xhtml) { pbnetwork::ConversationMessage m; m.set_username(user); m.set_buddyname(legacyName); m.set_message(msg); m.set_nickname(nickname); + m.set_xhtml(xhtml); std::string message; m.SerializeToString(&message); diff --git a/src/networkpluginserver.cpp b/src/networkpluginserver.cpp index 8538e661..1cd00922 100644 --- a/src/networkpluginserver.cpp +++ b/src/networkpluginserver.cpp @@ -392,6 +392,10 @@ void NetworkPluginServer::handleConvMessagePayload(const std::string &data, bool msg->setBody(payload.message()); } + if (!payload.xhtml().empty()) { + msg->addPayload(boost::make_shared(payload.xhtml())); + } + NetworkConversation *conv = (NetworkConversation *) user->getConversationManager()->getConversation(payload.buddyname()); if (!conv) { conv = new NetworkConversation(user->getConversationManager(), payload.buddyname());