/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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.