/soc/2015/igor.gajowiak/chatlog: ad0758165399: Implemented showi...

Igor Gajowiak <[email protected]>
Newsgroups gmane.comp.gnome.gaim.cvs
Message-ID <[email protected]>
Changeset: ad07581653998b3cd64ebd893ce1e63efd5cbca0
Author:	 Igor Gajowiak <[email protected]>
Date:	 2015-07-31 21:59 +0200
Branch:	 default
URL: https://hg.pidgin.im/soc/2015/igor.gajowiak/chatlog/rev/ad0758165399

Description:

Implemented showing messages in log.

diffstat:

 pidgin/gtkgenericlog.c      |  316 ++++++++++++++++++++++++++++++++++++++++---
 pidgin/gtkgenericlog.h      |    3 +
 pidgin/themes/Template.html |    5 +
 3 files changed, 301 insertions(+), 23 deletions(-)

diffs (truncated from 441 to 300 lines):

diff --git a/pidgin/gtkgenericlog.c b/pidgin/gtkgenericlog.c
--- a/pidgin/gtkgenericlog.c
+++ b/pidgin/gtkgenericlog.c
@@ -19,6 +19,8 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  */
 
+#include <string.h>
+
 #include <sys/time.h>
 
 #include "buddylist.h"
@@ -243,25 +245,24 @@ on_buddylist_row_changed(GtkTreeSelectio
 	GtkTreeModel *model;
 	GtkTreeIter row;
 
-	/* No buddy selected */
-	if (!gtk_tree_selection_get_selected(sel, &model, &row)) {
-		gtk_tree_store_clear(viewer->calendar_tree_store);
-		return;
+	PurpleBuddy *buddy = NULL;
+
+	if (gtk_tree_selection_get_selected(sel, &model, &row)) {
+		gtk_tree_model_get(model, &row, BLIST_TREE_STORE_COL_BUDDY, &buddy, -1);
+
+		if (buddy) {
+			g_object_ref(G_OBJECT(buddy));
+			viewer->current_buddy = buddy;
+		}
 	}
 
-	gpointer buddy = NULL;
-	gtk_tree_model_get(model, &row, BLIST_TREE_STORE_COL_BUDDY, &buddy, -1);
+	/* Unhook calendar model during updating to get better performance */
+	gtk_tree_view_set_model(viewer->calendar_tree_view, NULL);
 
-	/* Group row activated */
-	if (!buddy) {
-		gtk_tree_store_clear(viewer->calendar_tree_store);
-		return;
-	}
+	populate_calendar_store(buddy, viewer->calendar_tree_store);
 
-	g_object_ref(buddy);
-	viewer->current_buddy = buddy;
-
-	populate_calendar_store((PurpleBuddy*) buddy, viewer->calendar_tree_store);
+	gtk_tree_view_set_model(viewer->calendar_tree_view,
+		viewer->calendar_tree_store);
 }
 
 static void
@@ -365,13 +366,202 @@ static void
 on_calendar_row_activated(GtkTreeView *tv, GtkTreePath *path,
 	GtkTreeViewColumn *col, gpointer data)
 {
-	printf("on_calendar_row_activated\n");
+	toggle_row_expansion(tv, path);
 }
 
+/* TODO: Copied from gtkconv.c, try to refactor */
+static char *
+replace_message_tokens(
+	const char *text,
+	const char *messageId,
+	const char *name, /* author */
+	const char *alias, /* author's alias */
+	const char *message,
+	PurpleMessageFlags flags,
+	time_t mtime)
+{
+	GString *str;
+	const char *cur = text;
+	const char *prev = cur;
+	struct tm *tm = NULL;
+
+	if (text == NULL || *text == '\0')
+		return NULL;
+
+	str = g_string_new(NULL);
+	while ((cur = strchr(cur, '%'))) {
+		const char *replace = NULL;
+		const char *fin = NULL;
+		gpointer freeval = NULL;
+
+		if (g_str_has_prefix(cur, "%message%")) {
+			replace = message;
+
+		} else if (g_str_has_prefix(cur, "%messageClasses%")) {
+			char *user;
+			GString *classes = g_string_new(NULL);
+#define ADD_CLASS(f, class) \
+			if (flags & f) \
+				g_string_append(classes, class);
+			ADD_CLASS(PURPLE_MESSAGE_SEND, "outgoing ");
+			ADD_CLASS(PURPLE_MESSAGE_RECV, "incoming ");
+#undef ADD_CLASS
+			user = g_strconcat("-pidgin-user:", name, NULL);
+			g_string_append(classes, user);
+			g_free(user);
+
+			replace = freeval = g_string_free(classes, FALSE);
+
+		} else if (g_str_has_prefix(cur, "%time")) {
+			const char *tmp = cur + strlen("%time");
+
+			if (*tmp == '{') {
+				char *end;
+				tmp++;
+				end = strstr(tmp, "}%");
+				if (!end) /* Invalid string */
+					continue;
+				if (!tm)
+					tm = localtime(&mtime);
+				replace = freeval = purple_uts35_to_str(tmp, end - tmp, tm);
+				fin = end + 1;
+			} else {
+				if (!tm)
+					tm = localtime(&mtime);
+
+				replace = purple_utf8_strftime("%X", tm);
+			}
+
+		} else if (g_str_has_prefix(cur, "%shortTime%")) {
+			if (!tm)
+				tm = localtime(&mtime);
+
+			replace = purple_utf8_strftime("%H:%M", tm);
+		} else if (g_str_has_prefix(cur, "%senderScreenName%")) {
+			replace = name;
+
+		} else if (g_str_has_prefix(cur, "%sender%")) {
+			replace = alias;
+
+		} else if (g_str_has_prefix(cur, "%senderColor%")) {
+			replace = freeval = flags & PURPLE_MESSAGE_RECV ?
+				g_strdup("#000000") : g_strdup("#ed3240");
+		} else if (g_str_has_prefix(cur, "%messageDirection%")) {
+			replace = purple_markup_is_rtl(message) ? "rtl" : "ltr";
+
+		} else if (g_str_has_prefix(cur, "%status%")) {
+			GString *classes = g_string_new(NULL);
+
+			if (flags & PURPLE_MESSAGE_ERROR)
+				g_string_append(classes, "error ");
+
+			replace = freeval = g_string_free(classes, FALSE);
+		} else if (g_str_has_prefix(cur, "%messageId%")) {
+			replace = messageId;
+		} else {
+			cur++;
+			continue;
+		}
+
+		/* Here we have a replacement to make */
+		g_string_append_len(str, prev, cur - prev);
+		if (replace)
+			g_string_append(str, replace);
+		g_free(freeval);
+		replace = freeval = NULL;
+
+		/* And update the pointers */
+		if (fin) {
+			prev = cur = fin + 1;
+		} else {
+			prev = cur = strchr(cur + 1, '%') + 1;
+		}
+
+	}
+
+	/* And wrap it up */
+	g_string_append(str, prev);
+
+	return g_string_free(str, FALSE);
+}
+
+static gchar *
+prepare_script(PurpleMessage *msg, PidginConvTheme *theme)
+{
+	PurpleMessageFlags flags = purple_message_get_flags(msg);
+
+	const char *message_html = flags & PURPLE_MESSAGE_SEND ?
+		pidgin_conversation_theme_get_template(theme,
+			PIDGIN_CONVERSATION_THEME_TEMPLATE_OUTGOING_CONTENT) :
+		pidgin_conversation_theme_get_template(theme,
+			PIDGIN_CONVERSATION_THEME_TEMPLATE_INCOMING_CONTENT);
+
+	char *message_id = g_strdup_printf("%u", purple_message_get_id(msg));
+	char *msg_tokenized = replace_message_tokens(message_html,
+		message_id,
+		purple_message_get_author(msg),
+		purple_message_get_author_alias(msg),
+		purple_message_get_contents(msg),
+		flags,
+		purple_message_get_time(msg));
+	char *escape = pidgin_webview_quote_js_string(msg_tokenized ?
+		msg_tokenized : "");
+
+	char *script = g_strdup_printf("appendMessage(%s)", escape);
+
+	g_free(message_id);
+	g_free(msg_tokenized);
+	g_free(escape);
+
+	return script;
+}
+
+static void
+clear_webview(PidginWebView *webview);
+
 static void
 on_calendar_row_changed(GtkTreeSelection *sel, gpointer data)
 {
-	printf("on_calendar_row_changed\n");
+	PidginGenericLogViewer *viewer = (PidginGenericLogViewer*) data;
+
+	clear_webview(PIDGIN_WEBVIEW(viewer->webview));
+
+	/* No buddy selected */
+	if (!viewer->current_buddy)
+		return;
+
+	GtkTreeModel *model;
+	GtkTreeIter row;
+
+	/* No row selected */
+	if (!gtk_tree_selection_get_selected(sel, &model, &row))
+		return;
+
+	/* Row with year selected */
+	if (gtk_tree_path_get_depth(gtk_tree_model_get_path(model, &row)) == 1)
+		return;
+
+	guint64 day;
+	gtk_tree_model_get(model, &row, CALENDAR_TREE_STORE_COL_DATE, &day, -1);
+
+	GList *messages = NULL;
+	if (!purple_genericlog_get_all_msgs(viewer->current_buddy,
+		day, &messages, NULL)) {
+		purple_debug_error(GTKGENERICLOG_DEBUG_CATEGORY,
+			"Getting all messages failed");
+		return;
+	}
+
+	/* Fill webview */
+	for (GList *it = messages; it != NULL; it = it->next) {
+		gchar *script = prepare_script(PURPLE_MESSAGE(it->data), viewer->theme);
+
+		pidgin_webview_safe_execute_script(PIDGIN_WEBVIEW(viewer->webview),
+			script);
+
+		g_free(script);
+	}
+	g_list_free_full(messages, g_object_unref);
 }
 
 static gboolean
@@ -410,11 +600,13 @@ append_new_calendar_group(GtkTreeStore *
 static void
 populate_calendar_store(PurpleBuddy *buddy, GtkTreeStore *store)
 {
-	g_assert(buddy);
 	g_assert(store);
 
 	gtk_tree_store_clear(store);
 
+	if (!buddy)
+		return;
+
 	GArray *days;
 	if (!purple_genericlog_get_all_days(buddy, &days, NULL)) {
 		purple_debug_error(GTKGENERICLOG_DEBUG_CATEGORY,
@@ -488,12 +680,86 @@ create_calendar_view(GtkTreeStore *store
 /* Webview                                                                    */
 /******************************************************************************/
 
-static GtkWidget *
-create_webview(GtkWidget **webview, PidginGenericLogViewer *viewer)
+/* TODO: Copied from gtkconv.c, try to refactor */
+static char *
+replace_template_tokens(PidginConvTheme *theme, const char *header,
+	const char *footer)
+{
+	GString *str;
+	const char *text;
+	char **ms;
+	char *path;
+
+	text = pidgin_conversation_theme_get_template(theme,
+		PIDGIN_CONVERSATION_THEME_TEMPLATE_MAIN);
+	if (text == NULL)
+		return NULL;
+
+	ms = g_strsplit(text, "%@", 6);
+	if (ms[0] == NULL || ms[1] == NULL || ms[2] == NULL || ms[3] == NULL ||
+		ms[4] == NULL || ms[5] == NULL) {
+		g_strfreev(ms);
+		return NULL;
+	}
+

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