/soc/2015/igor.gajowiak/chatlog: 40d552c5ab9b: Add generic log d...

Igor Gajowiak <[email protected]>
Newsgroups gmane.comp.gnome.gaim.cvs
Message-ID <[email protected]>
Changeset: 40d552c5ab9bed9ae6a3c38b41a66b832d79134f
Author:	 Igor Gajowiak <[email protected]>
Date:	 2015-07-16 07:37 +0200
Branch:	 default
URL: https://hg.pidgin.im/soc/2015/igor.gajowiak/chatlog/rev/40d552c5ab9b

Description:

Add generic log documentation comments and fix the generic log interface.

diffstat:

 libpurple/accounts.c              |   14 +-
 libpurple/conversation.c          |    3 +-
 libpurple/genericlog.c            |  328 ++++++++++++++++++++++++-------------
 libpurple/genericlog.h            |  218 +++++++++++++++++++++---
 libpurple/plugins/log/logsqlite.c |   74 ++-----
 5 files changed, 430 insertions(+), 207 deletions(-)

diffs (truncated from 957 to 300 lines):

diff --git a/libpurple/accounts.c b/libpurple/accounts.c
--- a/libpurple/accounts.c
+++ b/libpurple/accounts.c
@@ -930,17 +930,11 @@ show_unread_im_msgs(PurpleConnection *gc
 
 	g_return_if_fail(account != NULL);
 
-	GList *unread_msgs = NULL;
-	GError *error = purple_genericlog_get_unread_msgs(account, &unread_msgs);
-	if(error){
-		g_error_free(error);
+	GList *unseen_msgs = NULL;
+	if (!purple_genericlog_get_unseen_msgs(account, &unseen_msgs, NULL))
 		return;
-	}
 
-	g_return_if_fail(unread_msgs != NULL);
-
-	GList *it = NULL;
-	for(it = unread_msgs; it != NULL; it = it->next) {
+	for(GList *it = unseen_msgs; it != NULL; it = it->next) {
 		PurpleMessage *msg = it->data;
 
 		// Create or get a conversation
@@ -949,7 +943,7 @@ show_unread_im_msgs(PurpleConnection *gc
 
 		purple_conversation_write_message(PURPLE_CONVERSATION(conv), msg);
 	}
-	g_list_free_full(unread_msgs, (GDestroyNotify) g_object_unref);
+	g_list_free_full(unseen_msgs, (GDestroyNotify) g_object_unref);
 }
 
 void
diff --git a/libpurple/conversation.c b/libpurple/conversation.c
--- a/libpurple/conversation.c
+++ b/libpurple/conversation.c
@@ -633,7 +633,8 @@ void
 			ops->write_conv(conv, pmsg);
 	}
 
-	purple_genericlog_logim(account, pmsg);
+	// TODO: add error handling?
+	purple_genericlog_logim(account, pmsg, NULL);
 	add_message_to_history(conv, pmsg);
 
 	purple_signal_emit(purple_conversations_get_handle(),
diff --git a/libpurple/genericlog.c b/libpurple/genericlog.c
--- a/libpurple/genericlog.c
+++ b/libpurple/genericlog.c
@@ -48,53 +48,62 @@ static PurpleGenericLog *purple_genericl
 static GList *purple_genericlog_loaded_plugins = NULL;
 
 /**************************************************************************/
-/* API implementation                                                     */
+/* PurpleGenericLog intance methods                                       */
 /**************************************************************************/
 
-PurpleGenericLog*
-purple_genericlog_find_by_id(const gchar* id)
+const gchar *
+purple_genericlog_get_id(const PurpleGenericLog *log)
 {
-	GList *it;
-	for (it = purple_genericlogs; it != NULL; it = it->next) {
-		PurpleGenericLog *log = it->data;
-		const gchar *curr_id = purple_genericlog_get_id(log);
-
-		if (g_strcmp0(id, curr_id) == 0)
-			return log;
-	}
-	return NULL;
+	g_return_val_if_fail(log != NULL, NULL);
+	PurpleGenericLogPrivate *p_log = PURPLE_GENERICLOG_GET_PRIVATE(log);
+	return p_log->id;
 }
 
-PurpleGenericLog*
+const gchar *
+purple_genericlog_get_name(const PurpleGenericLog *log)
+{
+	g_return_val_if_fail(log != NULL, NULL);
+	PurpleGenericLogPrivate *log_priv = PURPLE_GENERICLOG_GET_PRIVATE(log);
+	return log_priv->name;
+}
+
+/**************************************************************************/
+/* Log subsystem API                                                      */
+/**************************************************************************/
+
+static gint
+id_compare(gconstpointer log, gconstpointer id)
+{
+	return g_strcmp0(purple_genericlog_get_id(log), id);
+}
+
+PurpleGenericLog *
+purple_genericlog_find_by_id(const gchar *id)
+{
+	g_return_val_if_fail(id != NULL, NULL);
+
+	GList *element = g_list_find_custom(purple_genericlogs,
+		id, id_compare);
+	return element ? element->data : NULL;
+}
+
+PurpleGenericLog *
 purple_genericlog_get_inuse()
 {
 	return purple_genericlog_inuse;
 }
 
-const gchar*
-purple_genericlog_get_name(const PurpleGenericLog* log)
+void
+purple_genericlog_register(PurpleGenericLog *log)
 {
-	PurpleGenericLogPrivate *log_priv = PURPLE_GENERICLOG_GET_PRIVATE(log);
-	return log_priv->name;
-}
+	g_return_if_fail(log != NULL);
 
-const gchar*
-purple_genericlog_get_id(const PurpleGenericLog* log)
-{
-	PurpleGenericLogPrivate *p_log = PURPLE_GENERICLOG_GET_PRIVATE(log);
-	return p_log->id;
-}
-
-void
-purple_genericlog_register(PurpleGenericLog* log)
-{
-	const gchar *id = NULL;
-	id = purple_genericlog_get_id(log);
-
+	const gchar *id = purple_genericlog_get_id(log);
 	g_return_if_fail(id != NULL);
 
 	if(purple_genericlog_find_by_id(id) != NULL) {
-		purple_debug_info("genericlog", "logger is already registered");
+		purple_debug_info("genericlog",
+			"Log with id='%s' is already registered", id);
 		return;
 	}
 
@@ -103,24 +112,23 @@ purple_genericlog_register(PurpleGeneric
 }
 
 void
-purple_genericlog_unregister(PurpleGenericLog* log)
+purple_genericlog_unregister(PurpleGenericLog *log)
 {
-	PurpleGenericLog *fallback;
-
 	g_return_if_fail(log != NULL);
 
 	GList* log_node = g_list_find(purple_genericlogs, log);
-
 	g_return_if_fail(log_node != NULL);
 
-	fallback = purple_genericlog_find_by_id(PURPLE_GENERICLOG_DEFAULT);
+	if (purple_genericlog_inuse == log) {
+		PurpleGenericLog *fallback = purple_genericlog_find_by_id(
+			PURPLE_GENERICLOG_DEFAULT);
 
-	if (purple_genericlog_inuse == log) {
-		if (purple_genericlog_inuse != fallback) {
-			purple_genericlog_set_active_log(PURPLE_GENERICLOG_DEFAULT);
-		} else {
-			purple_debug_error("genericlog", "unable to unregister the default log");
-			return;
+		if (purple_genericlog_inuse == fallback)
+			fallback = NULL;
+
+		if (!purple_genericlog_set_active_log(fallback, NULL)) {
+			purple_debug_error("genericlog", "Setting active log to %p failed",
+				fallback);
 		}
 	}
 
@@ -128,69 +136,165 @@ purple_genericlog_unregister(PurpleGener
 	purple_genericlogs = g_list_delete_link(purple_genericlogs, log_node);
 }
 
-GError*
-purple_genericlog_set_active_log(const gchar* id)
+gboolean
+purple_genericlog_set_active_log(PurpleGenericLog *log, GError **error)
 {
-	GError *error = NULL;
-	PurpleGenericLog *log = purple_genericlog_find_by_id(id);
+	if (log == purple_genericlog_inuse)
+		return TRUE;
 
-	if(!log) {
-		return g_error_new(purple_genericlog_error_domain(),
-			PURPLE_GENERICLOG_ERROR_NOLOG, "log does not exist");
+	if (log && !g_list_find(purple_genericlogs, log)) {
+		if (!error) return FALSE;
+
+		*error = g_error_new(purple_genericlog_error_domain(),
+			PURPLE_GENERICLOG_ERROR_NOLOG, "No log registered with id='%s'",
+			purple_genericlog_get_id(log));
+		return FALSE;
 	}
 
-	if(purple_genericlog_inuse) {
-		if(strcmp(id, purple_genericlog_get_id(purple_genericlog_inuse)) == 0) {
-			purple_debug_info("genericlog", "log is already active");
-			return NULL;
+	// First try to activate the new log
+	if (log) {
+		PurpleGenericLogClass *klass = PURPLE_GENERICLOG_GET_CLASS(log);
+
+		// Roll back if activation fails
+		if (!klass->activate()) {
+			if (!error) return FALSE;
+
+			*error = g_error_new(purple_genericlog_error_domain(),
+				PURPLE_GENERICLOG_ERROR_BACKENDFAIL, "Failed to activate %s",
+				purple_genericlog_get_id(log));
+			return FALSE;
 		}
-		else {
-			PurpleGenericLogClass *klass = PURPLE_GENERICLOG_GET_CLASS(purple_genericlog_inuse);
-			error = klass->deactivate();
-			if(error)
-				return error;
 
-			g_object_unref(purple_genericlog_inuse);
-			purple_genericlog_inuse = NULL;
-		}
+		g_object_ref(log);
 	}
 
-	g_assert(purple_genericlog_inuse == NULL);
+	// Now we can safely deactivate the previous log
+	if (purple_genericlog_inuse) {
+		PurpleGenericLogClass *klass = PURPLE_GENERICLOG_GET_CLASS(
+			purple_genericlog_inuse);
 
-	PurpleGenericLogClass *klass = PURPLE_GENERICLOG_GET_CLASS(log);
-	error = klass->activate();
-	// TODO: should we activate previous log if this fails?
-	if (error)
-		return error;
+		// This never fails
+		klass->deactivate();
+
+		g_object_unref(purple_genericlog_inuse);
+	}
 
 	purple_genericlog_inuse = log;
-	g_object_ref(purple_genericlog_inuse);
 
-	return NULL;
+	return TRUE;
 }
 
-GError*
-purple_genericlog_logim(PurpleAccount *account, PurpleMessage *msg)
+gboolean
+purple_genericlog_logim(PurpleAccount *account, PurpleMessage *msg,
+	GError **error)
 {
+	if (!purple_genericlog_inuse) {
+		if (!error) return FALSE;
+
+		*error = g_error_new(purple_genericlog_error_domain(),
+			PURPLE_GENERICLOG_ERROR_NOLOG, "No active log");
+		return FALSE;
+	}
+
 	PurpleGenericLogClass *klass =
 		PURPLE_GENERICLOG_GET_CLASS(purple_genericlog_inuse);
-	return klass->log_im(account, msg);
+
+	if (!klass->log_im) {
+		if (!error) return FALSE;
+
+		*error = g_error_new(purple_genericlog_error_domain(),
+			PURPLE_GENERICLOG_ERROR_OPERATIONNOTSUPPORTED,
+			"%s does not support IM logging",
+			purple_genericlog_get_id(purple_genericlog_inuse));
+		return FALSE;
+	}
+
+	if (!klass->log_im(account, msg)) {
+		if (!error) return FALSE;
+
+		*error = g_error_new(purple_genericlog_error_domain(),
+			PURPLE_GENERICLOG_ERROR_BACKENDFAIL,
+			"Failed to log IM in %s",
+			purple_genericlog_get_id(purple_genericlog_inuse));
+		return FALSE;
+	}
+
+	return TRUE;
 }
 
-GError*

_______________________________________________
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.