/soc/2015/igor.gajowiak/chatlog: 25e01227b21a: Add incoming mess...
Igor Gajowiak <[email protected]>
| Newsgroups | gmane.comp.gnome.gaim.cvs |
|---|---|
| Message-ID | <[email protected]> |
Changeset: 25e01227b21a6c4348d3e7f216dd1912bd674b91 Author: Igor Gajowiak <[email protected]> Date: 2015-06-15 10:49 +0200 Branch: default URL: https://hg.pidgin.im/soc/2015/igor.gajowiak/chatlog/rev/25e01227b21a Description: Add incoming message replacing. TODO: fix problems mentioned in comments diffstat: finch/gntconv.c | 3 + libpurple/conversation.c | 128 ++++++++++ libpurple/conversation.h | 15 + libpurple/conversationtypes.c | 19 + libpurple/internal.h | 4 + libpurple/message.c | 16 +- libpurple/message.h | 1 + libpurple/protocols/jabber/jabber.c | 5 + libpurple/protocols/jabber/message.c | 44 +++- libpurple/protocols/jabber/message.h | 4 + libpurple/protocols/jabber/namespaces.h | 3 + libpurple/server.c | 166 +++++++++++++- libpurple/server.h | 19 +- pidgin/gtkconv.c | 203 ++++++++++++++++- pidgin/themes/Contents/Resources/Incoming/Content.html | 2 +- pidgin/themes/Contents/Resources/Outgoing/Content.html | 13 + pidgin/themes/Makefile.am | 3 + pidgin/themes/Template.html | 47 +++ 18 files changed, 681 insertions(+), 14 deletions(-) diffs (truncated from 1059 to 300 lines): diff --git a/finch/gntconv.c b/finch/gntconv.c --- a/finch/gntconv.c +++ b/finch/gntconv.c @@ -1217,6 +1217,9 @@ static PurpleConversationUiOps conv_ui_o NULL, /* write_chat */ NULL, /* write_im */ finch_write_conv, + NULL, /* replace_chat */ + NULL, /* replace_im */ + NULL, /* replace_conv */ finch_chat_add_users, finch_chat_rename_user, finch_chat_remove_users, diff --git a/libpurple/conversation.c b/libpurple/conversation.c --- a/libpurple/conversation.c +++ b/libpurple/conversation.c @@ -639,6 +639,119 @@ void conv, pmsg); } +// TODO: Implemenatation copied from _purple_conversation_write_common, try to refactor +void +_purple_conversation_replace_common(PurpleConversation *conv, guint replaced_msg_id, + PurpleMessage *pmsg) +{ + PurpleProtocol *protocol = NULL; + PurpleConnection *gc = NULL; + PurpleAccount *account; + PurpleConversationUiOps *ops; + PurpleBuddy *b; + int plugin_return; + PurpleConversationPrivate *priv = PURPLE_CONVERSATION_GET_PRIVATE(conv); + /* int logging_font_options = 0; */ + + g_return_if_fail(priv != NULL); + g_return_if_fail(pmsg != NULL); + + ops = purple_conversation_get_ui_ops(conv); + + account = purple_conversation_get_account(conv); + + if (account != NULL) + gc = purple_account_get_connection(account); + + if (PURPLE_IS_CHAT_CONVERSATION(conv) && + (gc != NULL && !g_slist_find(purple_connection_get_active_chats(gc), conv))) + return; + + if (PURPLE_IS_IM_CONVERSATION(conv) && + !g_list_find(purple_conversations_get_all(), conv)) + return; + + plugin_return = GPOINTER_TO_INT(purple_signal_emit_return_1( + purple_conversations_get_handle(), + (PURPLE_IS_IM_CONVERSATION(conv) ? "writing-im-msg" : "writing-chat-msg"), + conv, pmsg)); + + if (purple_message_is_empty(pmsg)) + return; + + if (plugin_return) + return; + + if (account != NULL) { + protocol = purple_protocols_find(purple_account_get_protocol_id(account)); + + if (PURPLE_IS_IM_CONVERSATION(conv) || + !(purple_protocol_get_options(protocol) & OPT_PROTO_UNIQUE_CHATNAME)) { + + if (purple_message_get_flags(pmsg) & PURPLE_MESSAGE_SEND) { + const gchar *alias; + + b = purple_blist_find_buddy(account, + purple_account_get_username(account)); + + if (purple_account_get_private_alias(account) != NULL) + alias = purple_account_get_private_alias(account); + else if (b != NULL && !purple_strequal(purple_buddy_get_name(b), + purple_buddy_get_contact_alias(b))) + { + alias = purple_buddy_get_contact_alias(b); + } else if (purple_connection_get_display_name(gc) != NULL) + alias = purple_connection_get_display_name(gc); + else + alias = purple_account_get_username(account); + + purple_message_set_author_alias(pmsg, alias); + } + else if (purple_message_get_flags(pmsg) & PURPLE_MESSAGE_RECV) + { + /* TODO: PurpleDude - folks not on the buddy list */ + b = purple_blist_find_buddy(account, + purple_message_get_author(pmsg)); + + if (b != NULL) { + purple_message_set_author_alias(pmsg, + purple_buddy_get_contact_alias(b)); + } + } + } + } + + if (!(purple_message_get_flags(pmsg) & PURPLE_MESSAGE_NO_LOG) && purple_conversation_is_logging(conv)) { + GList *log; + + log = priv->logs; + while (log != NULL) { + purple_log_write((PurpleLog *)log->data, + purple_message_get_flags(pmsg), + purple_message_get_author_alias(pmsg), + purple_message_get_time(pmsg), + purple_message_get_contents(pmsg)); + log = log->next; + } + } + + if (ops) { + if (PURPLE_IS_CHAT_CONVERSATION(conv) && ops->replace_chat) + ops->replace_chat(PURPLE_CHAT_CONVERSATION(conv), replaced_msg_id, pmsg); + else if (PURPLE_IS_IM_CONVERSATION(conv) && ops->replace_im) + ops->replace_im(PURPLE_IM_CONVERSATION(conv), replaced_msg_id, pmsg); + else if (ops->replace_conv) + ops->replace_conv(conv, replaced_msg_id, pmsg); + } + + // TODO: replace instead of add? + add_message_to_history(conv, pmsg); + + purple_signal_emit(purple_conversations_get_handle(), + (PURPLE_IS_IM_CONVERSATION(conv) ? "wrote-im-msg" : "wrote-chat-msg"), + conv, pmsg); +} + void purple_conversation_write_message(PurpleConversation *conv, PurpleMessage *msg) { @@ -652,6 +765,21 @@ purple_conversation_write_message(Purple klass->write_message(conv, msg); } +void +purple_conversation_replace_message(PurpleConversation *conv, + guint replaced_msg_id, PurpleMessage *msg) +{ + PurpleConversationClass *klass = NULL; + + g_return_if_fail(PURPLE_IS_CONVERSATION(conv)); + g_return_if_fail(msg != NULL); + + klass = PURPLE_CONVERSATION_GET_CLASS(conv); + + if (klass && klass->replace_message) + klass->replace_message(conv, replaced_msg_id, msg); +} + void purple_conversation_write_system_message(PurpleConversation *conv, const gchar *message, PurpleMessageFlags flags) { diff --git a/libpurple/conversation.h b/libpurple/conversation.h --- a/libpurple/conversation.h +++ b/libpurple/conversation.h @@ -180,6 +180,8 @@ struct _PurpleConversationClass { void (*write_message)(PurpleConversation *conv, PurpleMessage *msg); + void (*replace_message)(PurpleConversation *conv, guint replaced_msg_id, PurpleMessage *msg); + /*< private >*/ void (*_purple_reserved1)(void); void (*_purple_reserved2)(void); @@ -252,6 +254,10 @@ struct _PurpleConversationUiOps void (*write_im)(PurpleIMConversation *im, PurpleMessage *msg); void (*write_conv)(PurpleConversation *conv, PurpleMessage *msg); + void (*replace_chat)(PurpleChatConversation *chat, guint replaced_msg_id, PurpleMessage *msg); + void (*replace_im)(PurpleIMConversation *im, guint replaced_msg_id, PurpleMessage *msg); + void (*replace_conv)(PurpleConversation *conv, guint replaced_msg_id, PurpleMessage *msg); + void (*chat_add_users)(PurpleChatConversation *chat, GList *cbuddies, gboolean new_arrivals); @@ -477,6 +483,15 @@ void purple_conversation_write_message(P PurpleMessage *msg); /** + * purple_conversation_replace_message: + * @conv: The conversation. + * @replaced_msg_id: The id of purple message to be replaced + * @msg: The new message + */ +void purple_conversation_replace_message(PurpleConversation *conv, + guint replaced_msg_id, PurpleMessage *msg); + +/** * purple_conversation_write_system_message: * @conv: The conversation. * @message: The message to write. diff --git a/libpurple/conversationtypes.c b/libpurple/conversationtypes.c --- a/libpurple/conversationtypes.c +++ b/libpurple/conversationtypes.c @@ -369,6 +369,23 @@ im_conversation_write_message(PurpleConv _purple_conversation_write_common(conv, msg); } +static void +im_conversation_replace_message(PurpleConversation *conv, guint replaced_msg_id, PurpleMessage *msg) +{ + PurpleIMConversation *im = PURPLE_IM_CONVERSATION(conv); + gboolean is_recv; + + g_return_if_fail(im != NULL); + g_return_if_fail(msg != NULL); + + is_recv = (purple_message_get_flags(msg) & PURPLE_MESSAGE_RECV); + + if (is_recv) + purple_im_conversation_set_typing_state(im, PURPLE_IM_NOT_TYPING); + + _purple_conversation_replace_common(conv, replaced_msg_id, msg); +} + /************************************************************************** * GObject code for IMs **************************************************************************/ @@ -509,6 +526,7 @@ static void purple_im_conversation_class obj_class->set_property = purple_im_conversation_set_property; conv_class->write_message = im_conversation_write_message; + conv_class->replace_message = im_conversation_replace_message; g_type_class_add_private(klass, sizeof(PurpleIMConversationPrivate)); @@ -1534,6 +1552,7 @@ static void purple_chat_conversation_cla obj_class->set_property = purple_chat_conversation_set_property; conv_class->write_message = chat_conversation_write_message; + // TODO: initialize replace_message here g_type_class_add_private(klass, sizeof(PurpleChatConversationPrivate)); diff --git a/libpurple/internal.h b/libpurple/internal.h --- a/libpurple/internal.h +++ b/libpurple/internal.h @@ -431,4 +431,8 @@ void void _purple_conversation_write_common(PurpleConversation *conv, PurpleMessage *msg); +void +_purple_conversation_replace_common(PurpleConversation *conv, guint replaced_msg_id, + PurpleMessage *pmsg); + #endif /* _PURPLE_INTERNAL_H_ */ diff --git a/libpurple/message.c b/libpurple/message.c --- a/libpurple/message.c +++ b/libpurple/message.c @@ -234,17 +234,25 @@ purple_message_get_flags(const PurpleMes * Object stuff ******************************************************************************/ +static guint +generate_next_id() +{ + static guint id = PURPLE_MESSAGE_ID_NONE; + + if(id == PURPLE_MESSAGE_ID_NONE) + ++id; + return id++; +} + static void purple_message_init(GTypeInstance *instance, gpointer klass) { - static guint max_id = 0; - PurpleMessage *msg = PURPLE_MESSAGE(instance); PurpleMessagePrivate *priv = PURPLE_MESSAGE_GET_PRIVATE(msg); PURPLE_DBUS_REGISTER_POINTER(msg, PurpleMessage); - priv->id = ++max_id; - g_hash_table_insert(messages, GINT_TO_POINTER(max_id), msg); + priv->id = generate_next_id(); + g_hash_table_insert(messages, GINT_TO_POINTER(priv->id), msg); } static void diff --git a/libpurple/message.h b/libpurple/message.h --- a/libpurple/message.h +++ b/libpurple/message.h @@ -45,6 +45,7 @@ typedef struct _PurpleMessageClass Purpl #define PURPLE_IS_MESSAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), PURPLE_TYPE_MESSAGE)) #define PURPLE_MESSAGE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), PURPLE_TYPE_MESSAGE, PurpleMessageClass)) +#define PURPLE_MESSAGE_ID_NONE 0 /** * PurpleMessage: * diff --git a/libpurple/protocols/jabber/jabber.c b/libpurple/protocols/jabber/jabber.c --- a/libpurple/protocols/jabber/jabber.c +++ b/libpurple/protocols/jabber/jabber.c @@ -3941,6 +3941,7 @@ jabber_do_init(void) _______________________________________________ Commits mailing list [email protected] https://pidgin.im/cgi-bin/mailman/listinfo/commits