view plugins/history.c @ 9763:b85df3f44350

[gaim-migrate @ 10631] "Can someone test this patch, diff'ed with 0.81 (anoncvs is down, as usual). http://javabsp.org/software/gaim/syslog_fd_leak.diff This keeps the double .system 0 length files from being created everytime you list the system log, which for some reason aren't closed (although reading from the code, they should be). Anyhow, since they are not created anymore, they won't waste any fd's. Another change that I've made, previously gaim is logging chats to logs/<prpl>/<my sn>.chat/<chatroom name>/<date-time>, now it's logging to logs/<prpl>/<my sn>/<chatroom name>.chat>/<date-time>. I think this makes more sense. Oh, and gaim_normalize is not meant to be called a second time while expecting the value of the first call to remain what it should be." --Ka-Hing Cheung committer: Tailor Script <tailor@pidgin.im>
author Luke Schierer <lschiere@pidgin.im>
date Mon, 16 Aug 2004 03:24:00 +0000
parents 294ae6548d4e
children 4a15962c344a
line wrap: on
line source

/* Puts last 4k of log in new conversations a la Everybuddy (and then
 * stolen by Trillian "Pro") */

#include "gtkinternal.h"

#include "conversation.h"
#include "debug.h"
#include "log.h"
#include "prefs.h"
#include "signals.h"
#include "util.h"

#include "gtkconv.h"
#include "gtkimhtml.h"
#include "gtkplugin.h"

#define HISTORY_PLUGIN_ID "gtk-history"

#define HISTORY_SIZE (4 * 1024)

static gboolean _scroll_imhtml_to_end(gpointer data)
{
	GtkIMHtml *imhtml = data;
	gtk_imhtml_scroll_to_end(GTK_IMHTML(imhtml));
	g_object_unref(G_OBJECT(imhtml));
	return FALSE;
}

static void historize(GaimConversation *c)
{
	GaimGtkConversation *gtkconv;
	GaimConversationType convtype;
	char *history = NULL;
	guint flags;
	GtkIMHtmlOptions options = GTK_IMHTML_NO_COLOURS;
	GList *logs = NULL;

	convtype = gaim_conversation_get_type(c);
	if (convtype == GAIM_CONV_IM)
		logs = gaim_log_get_logs(GAIM_LOG_IM,
				gaim_conversation_get_name(c), gaim_conversation_get_account(c));
	else if (convtype == GAIM_CONV_CHAT)
		logs = gaim_log_get_logs(GAIM_LOG_CHAT,
				gaim_conversation_get_name(c), gaim_conversation_get_account(c));

	if (!logs)
		return;

	history = gaim_log_read((GaimLog*)logs->data, &flags);
	gtkconv = GAIM_GTK_CONVERSATION(c);
	if (flags & GAIM_LOG_READ_NO_NEWLINE)
		options |= GTK_IMHTML_NO_NEWLINE;
	gtk_imhtml_append_text(GTK_IMHTML(gtkconv->imhtml), history, options);
	gtk_imhtml_append_text(GTK_IMHTML(gtkconv->imhtml), "<hr>", options);
	g_object_ref(G_OBJECT(gtkconv->imhtml));
	g_idle_add(_scroll_imhtml_to_end, gtkconv->imhtml);
	g_free(history);

	while (logs) {
		GaimLog *log = logs->data;
		GList *logs2;
	    gaim_log_free(log);
		logs2 = logs->next;
		g_list_free_1(logs);
		logs = logs2;
	}
}

static gboolean
plugin_load(GaimPlugin *plugin)
{
	gaim_signal_connect(gaim_conversations_get_handle(),
						"conversation-created",
						plugin, GAIM_CALLBACK(historize), NULL);

	return TRUE;
}

static GaimPluginInfo info =
{
	GAIM_PLUGIN_API_VERSION,
	GAIM_PLUGIN_STANDARD,
	GAIM_GTK_PLUGIN_TYPE,
	0,
	NULL,
	GAIM_PRIORITY_DEFAULT,
	HISTORY_PLUGIN_ID,
	N_("History"),
	VERSION,
	N_("Shows recently logged conversations in new conversations."),
	N_("When a new conversation is opened this plugin will insert the last conversation into the current conversation."),
	"Sean Egan <bj91704@binghamton.edu>",
	GAIM_WEBSITE,
	plugin_load,
	NULL,
	NULL,
	NULL,
	NULL,
	NULL
};

static void
init_plugin(GaimPlugin *plugin)
{
}

GAIM_INIT_PLUGIN(history, init_plugin, info)