/soc/2015/igor.gajowiak/chatlog: 3efc9ae96ea1: Implemented loggi...
Igor Gajowiak <[email protected]>
| Newsgroups | gmane.comp.gnome.gaim.cvs |
|---|---|
| Message-ID | <[email protected]> |
Changeset: 3efc9ae96ea1aa17a51461345334ba90b80d98b3 Author: Igor Gajowiak <[email protected]> Date: 2015-08-10 23:46 +0200 Branch: default URL: https://hg.pidgin.im/soc/2015/igor.gajowiak/chatlog/rev/3efc9ae96ea1 Description: Implemented logging chat messages. Replaced PurpleBuddy with PurpleBListNode in the log's interface. diffstat: libpurple/conversation.c | 14 +- libpurple/genericlog.c | 66 ++++- libpurple/genericlog.h | 99 +++++---- libpurple/plugins/log/legacylog.c | 28 ++- libpurple/plugins/log/logsqlite.c | 377 ++++++++++++++++++++----------------- pidgin/gtkgenericlog.c | 165 ++++++++++------ pidgin/gtkgenericlog.h | 4 +- 7 files changed, 442 insertions(+), 311 deletions(-) diffs (truncated from 1774 to 300 lines): diff --git a/libpurple/conversation.c b/libpurple/conversation.c --- a/libpurple/conversation.c +++ b/libpurple/conversation.c @@ -623,8 +623,20 @@ void log = log->next; } + PurpleBlistNode *contact = NULL; + if (PURPLE_IS_CHAT_CONVERSATION(conv)) { + contact = PURPLE_BLIST_NODE(purple_blist_find_chat(account, + purple_conversation_get_name(conv))); + } + else { + contact = PURPLE_BLIST_NODE(purple_blist_find_buddy(account, + (purple_message_get_flags(pmsg) & PURPLE_MESSAGE_SEND) ? + purple_message_get_recipient(pmsg) : + purple_message_get_author(pmsg))); + } + GError *error; - if (!purple_genericlog_logim(account, pmsg, &error)) { + if (!purple_genericlog_log_msg(account, contact, pmsg, &error)) { purple_debug_error("conversation", "Logging failed: %s (code=%d)", error->message, error->code); g_error_free(error); diff --git a/libpurple/genericlog.c b/libpurple/genericlog.c --- a/libpurple/genericlog.c +++ b/libpurple/genericlog.c @@ -246,12 +246,28 @@ purple_genericlog_set_active_log(PurpleG \ return TRUE; +#ifdef GENERICLOG_CHECK_CONTACT +# error "GENERICLOG_CHECK_CONTACT is already defined" +#endif +#define GENERICLOG_CHECK_CONTACT(contact) \ + if (!PURPLE_IS_BUDDY(contact) && !PURPLE_IS_CHAT(contact)) { \ + if (error) { \ + *error = g_error_new(purple_genericlog_error_domain(), \ + PURPLE_GENERICLOG_ERROR_INTERNAL, \ + "The contact is neither PurpleBuddy nor PurpleChat"); \ + } \ + return FALSE; \ + } + gboolean -purple_genericlog_logim(PurpleAccount *account, PurpleMessage *msg, - GError **error) +purple_genericlog_log_msg(PurpleAccount *account, PurpleBlistNode *contact, + PurpleMessage *msg, GError **error) { - DEFINE_GENERICLOG_FUNC_WITH_RETURN(log_im, "%s does not support IM logging", - "Failed to log IM in %s", account, msg); + GENERICLOG_CHECK_CONTACT(contact); + + DEFINE_GENERICLOG_FUNC_WITH_RETURN(log_msg, + "%s does not support IM logging", + "Failed to log IM in %s", account, contact, msg); } gboolean @@ -272,22 +288,26 @@ purple_genericlog_get_unseen_msgs(Purple } gboolean -purple_genericlog_get_all_msgs(PurpleBuddy *buddy, guint64 day, GList **result, - GError **error) +purple_genericlog_get_all_msgs(PurpleBlistNode *contact, guint64 day, + GList **result, GError **error) { + GENERICLOG_CHECK_CONTACT(contact); + DEFINE_GENERICLOG_FUNC_WITH_RETURN(get_all_msgs, "%s does not support getting all messages", - "Getting all messages from %s failed", buddy, day, result); + "Getting all messages from %s failed", contact, day, result); } gboolean -purple_genericlog_get_older_msgs(PurpleBuddy *buddy, guint64 timestamp, +purple_genericlog_get_older_msgs(PurpleBlistNode *contact, guint64 timestamp, PurpleMessage *message, GList **result, GError **error) { + GENERICLOG_CHECK_CONTACT(contact); + DEFINE_GENERICLOG_FUNC_WITH_RETURN(get_older_msgs, "%s does not support getting older messages", "Getting older messages from %s failed", - buddy, timestamp, message, result); + contact, timestamp, message, result); } gboolean @@ -299,22 +319,27 @@ purple_genericlog_get_all_buddies(GList* } gboolean -purple_genericlog_get_all_days(PurpleBuddy *buddy, GArray **result, +purple_genericlog_get_all_days(PurpleBlistNode *contact, GArray **result, GError **error) { + GENERICLOG_CHECK_CONTACT(contact); + DEFINE_GENERICLOG_FUNC_WITH_RETURN(get_all_days, "%s does not support getting all days", - "Getting all days from %s failed", buddy, result); + "Getting all days from %s failed", contact, result); } gboolean -purple_genericlog_wipe_log_for_buddy(PurpleBuddy *buddy, GError **error) +purple_genericlog_wipe_log_for_contact(PurpleBlistNode *contact, GError **error) { - DEFINE_GENERICLOG_FUNC_WITH_RETURN(wipe_log_for_buddy, + GENERICLOG_CHECK_CONTACT(contact); + + DEFINE_GENERICLOG_FUNC_WITH_RETURN(wipe_log_for_contact, "%s does not support removing messages", - "Removing messages from %s failed", buddy); + "Removing messages from %s failed", contact); } +#undef GENERICLOG_CHECK_CONTACT #undef DEFINE_GENERICLOG_FUNC_WITH_RETURN static void @@ -345,11 +370,14 @@ run_import_iteration(gpointer unused) GArray *accounts = g_array_new(FALSE, FALSE, sizeof(PurpleAccount*)); g_array_set_clear_func(accounts, unref_g_object_pointee); + GArray *contacts = g_array_new(FALSE, FALSE, sizeof(PurpleBlistNode*)); + g_array_set_clear_func(contacts, unref_g_object_pointee); + GArray *messages = g_array_new(FALSE, FALSE, sizeof(PurpleMessage*)); g_array_set_clear_func(messages, unref_g_object_pointee); gboolean status = klass->read_chunk(import_state->export_state, - PURPLE_GENERICLOG_IMPORT_CHUNK_SIZE, accounts, messages); + PURPLE_GENERICLOG_IMPORT_CHUNK_SIZE, accounts, contacts, messages); if (!status || messages->len == 0) { g_array_unref(accounts); @@ -371,14 +399,16 @@ run_import_iteration(gpointer unused) for (guint i = 0; i < messages->len; ++i) { PurpleAccount *account = g_array_index(accounts, PurpleAccount*, i); + PurpleBlistNode *contact = g_array_index(contacts, PurpleBlistNode*, i); PurpleMessage *message = g_array_index(messages, PurpleMessage*, i); /* Should we stop if logging fails? */ - if (purple_genericlog_logim(account, message, NULL)) + if (purple_genericlog_log_msg(account, contact, message, NULL)) ++(import_state->imported_messages_count); } g_array_free(accounts, TRUE); + g_array_free(contacts, TRUE); g_array_free(messages, TRUE); return TRUE; @@ -528,14 +558,14 @@ purple_genericlog_class_init(PurpleGener */ klass->activate = NULL; klass->deactivate = NULL; - klass->log_im = NULL; + klass->log_msg = NULL; klass->mark_as_seen = NULL; klass->get_unseen_msgs = NULL; klass->get_all_msgs = NULL; klass->get_older_msgs = NULL; klass->get_all_buddies = NULL; klass->get_all_days = NULL; - klass->wipe_log_for_buddy = NULL; + klass->wipe_log_for_contact = NULL; klass->init_export = NULL; klass->read_chunk = NULL; klass->finalize_export = NULL; diff --git a/libpurple/genericlog.h b/libpurple/genericlog.h --- a/libpurple/genericlog.h +++ b/libpurple/genericlog.h @@ -52,7 +52,7 @@ struct _PurpleGenericLog * @activate: Activates this log. Returns %TRUE if activation * succeds, %FALSE otherwise. * @deactivate: Deactivates this log. This method never fails. - * @log_im: Logs a message. Returns %TRUE if logging succeeds, + * @log_msg Logs a message. Returns %TRUE if logging succeeds, * %FALSE otherwise. * @mark_as_seen: Marks a message as seen. Returns %TRUE if * operation succeeds, %FALSE otherwise. @@ -61,30 +61,34 @@ struct _PurpleGenericLog * In case of any error the result is not set. * The client is responsible for freeing the result with * g_list_free_full(result, g_object_unref). - * @get_all_msgs: Gets all messages sent to or received from a buddy on - * a given day. Messages are sorted by their timestamp - * in ascending order. Returns %TRUE if operation succeeds, - * %FALSE otherwise. In case of any error the result is not - * set. The client is responsible for freeing the result with + * @get_all_msgs: Gets all messages sent to or received from a + * contact (PurpleChat or PurpleBuddy) on a given day. + * Messages are sorted by their timestamp in ascending order. + * Returns %TRUE if operation succeeds, %FALSE otherwise. + * In case of any error the result is not set. The client is + * responsible for freeing the result using * g_list_free_full(result, g_object_unref). - * @get_older_msgs: Gets all messages sent to or received from a buddy, older - * than the message and not older than the timestamp. - * If message is %NULL then upper bound check is skipped. - * Messages are sorted by their timestamp in descending order. + * @get_older_msgs: Gets all messages sent to or received from a contact + * (PurpleChat or PurpleBuddy), older than the message + * and not older than the timestamp. If message is %NULL + * then upper bound check is skipped. Messages are sorted + * by their timestamp in descending order. * Returns %TRUE if operation succeeds, %FALSE otherwise. - * @get_all_buddies: Gets a list of all #PurpleBuddy objects with at least one - * message in the log. Returns %TRUE if operation succeeds, - * %FALSE otherwise. The client is responsible for freeing - * the result with g_list_free_full(result, g_object_unref). + * @get_all_buddies: Gets a list of all #PurpleBlistNode objects with at least + * one message in the log. Returns %TRUE if operation + * succeeds, %FALSE otherwise. The client is responsible for + * freeing the result using + * g_list_free_full(result, g_object_unref). * @get_all_days: Gets an array of all days with at least one message - * received from or sent to a given buddy. The days are sorted - * in ascending order. Day is represented as unix timestamp + * received from or sent to a given contact + * (PurpleChat or PurpleBuddy). The days are sorted + * in ascending order. Day is represented as an unix timestamp * (guint64) (at 00:00). Returns %TRUE if operation succeeds, * %FALSE otherwise. The client is responsible for freeing * the result with g_array_unref. * @wipe_log_for_buddy: Deletes all messages sent to or received from - * a given buddy. Returns %TRUE if operation succeeds, - * %FALSE otherwise. + * a given contact (PurpleChat or PurpleBuddy). + * Returns %TRUE if operation succeeds, %FALSE otherwise. * @init_export: Initializes an export procedure. Plugins should store their * export state in an output parameter. The state will be used * for future calls to export_chunk. Returns %TRUE if @@ -110,27 +114,29 @@ struct _PurpleGenericLogClass void (*deactivate)(void); - gboolean (*log_im) (PurpleAccount *account, PurpleMessage *message); + gboolean (*log_msg) (PurpleAccount *account, PurpleBlistNode* contact, + PurpleMessage *message); gboolean (*mark_as_seen)(PurpleMessage *message); gboolean (*get_unseen_msgs)(PurpleAccount *account, GList **result); - gboolean (*get_all_msgs)(PurpleBuddy *buddy, guint64 day, GList **result); + gboolean (*get_all_msgs)(PurpleBlistNode *contact, guint64 day, + GList **result); - gboolean (*get_older_msgs)(PurpleBuddy *buddy, guint64 timestamp, + gboolean (*get_older_msgs)(PurpleBlistNode *contact, guint64 timestamp, PurpleMessage *message, GList **result); gboolean (*get_all_buddies)(GList **result); - gboolean (*get_all_days)(PurpleBuddy *buddy, GArray **result); + gboolean (*get_all_days)(PurpleBlistNode *contact, GArray **result); - gboolean (*wipe_log_for_buddy)(PurpleBuddy *buddy); + gboolean (*wipe_log_for_contact)(PurpleBlistNode *contact); gboolean (*init_export) (void **export_state); gboolean (*read_chunk) (void *export_state, guint chunk_size, - GArray *accounts, GArray *messages); + GArray *accounts, GArray *contacts, GArray *messages); void (*finalize_export) (void *export_state); @@ -258,17 +264,18 @@ purple_genericlog_set_active_log(PurpleG /** * purple_genericlog_logim: * @account: The account. + * @contact The contact, must be PurpleChat or PurpleBuddy. * @msg: The message. * @error: Return location for a #GError or %NULL. If provided, this * will be set to the reason if logging fails. * - * Logs a message for a given account to the active log. + * Logs a message for a given account and a contact to the active log. * * Returns: %TRUE if succeeds, %FALSE otherwise. */ gboolean -purple_genericlog_logim(PurpleAccount *account, PurpleMessage *msg, - GError **error); +purple_genericlog_log_msg(PurpleAccount *account, PurpleBlistNode* contact, + PurpleMessage *msg, GError **error); /** * purple_genericlog_mark_as_seen: @@ -304,7 +311,7 @@ purple_genericlog_get_unseen_msgs(Purple _______________________________________________ Commits mailing list [email protected] https://pidgin.im/cgi-bin/mailman/listinfo/commits