From: Sean E. <sea...@us...> - 2002-09-30 01:05:48
|
Update of /cvsroot/gaim/gaim/src In directory usw-pr-cvs1:/tmp/cvs-serv18273/src Modified Files: away.c buddy_chat.c conversation.c dialogs.c module.c multi.c perl.c prpl.c prpl.h server.c util.c Log Message: Phase II. No longer do you have to worry about protocol plugins. When Gaim probes plugins on load, it will detect protocol plugins and add them to the list of available protocols. When you try to log an account on with one of them, Gaim will automatically load the plugin--when no more accounts need the protocol--Gaim will automatically unload it. Protocol plugins are no longer available in the plugins ui, and no protocols are compiled statically by default. Index: away.c =================================================================== RCS file: /cvsroot/gaim/gaim/src/away.c,v retrieving revision 1.74 retrieving revision 1.75 diff -u -d -r1.74 -r1.75 --- away.c 16 Sep 2002 08:35:17 -0000 1.74 +++ away.c 30 Sep 2002 01:05:14 -0000 1.75 @@ -464,7 +464,7 @@ } g_snprintf(buf, sizeof(buf), "%s (%s)", - gc->username, gc->prpl->name()); + gc->username, gc->prpl->name); menuitem = gtk_menu_item_new_with_label(buf); gtk_menu_append(GTK_MENU(awaymenu), menuitem); gtk_widget_show(menuitem); Index: buddy_chat.c =================================================================== RCS file: /cvsroot/gaim/gaim/src/buddy_chat.c,v retrieving revision 1.159 retrieving revision 1.160 diff -u -d -r1.159 -r1.160 --- buddy_chat.c 16 Sep 2002 08:35:20 -0000 1.159 +++ buddy_chat.c 30 Sep 2002 01:05:14 -0000 1.160 @@ -217,7 +217,7 @@ continue; if (!joinchatgc) joinchatgc = g; - g_snprintf(buf, sizeof buf, "%s (%s)", g->username, g->prpl->name()); + g_snprintf(buf, sizeof buf, "%s (%s)", g->username, g->prpl->name); opt = gtk_menu_item_new_with_label(buf); gtk_object_set_user_data(GTK_OBJECT(opt), g); gtk_signal_connect(GTK_OBJECT(opt), "activate", GTK_SIGNAL_FUNC(joinchat_choose), g); Index: conversation.c =================================================================== RCS file: /cvsroot/gaim/gaim/src/conversation.c,v retrieving revision 1.382 retrieving revision 1.383 diff -u -d -r1.382 -r1.383 --- conversation.c 26 Sep 2002 15:23:33 -0000 1.382 +++ conversation.c 30 Sep 2002 01:05:14 -0000 1.383 @@ -2480,7 +2480,7 @@ while (g) { c = (struct gaim_connection *)g->data; - g_snprintf(buf, sizeof buf, "%s (%s)", c->username, c->prpl->name()); + g_snprintf(buf, sizeof buf, "%s (%s)", c->username, c->prpl->name); opt = gtk_menu_item_new_with_label(buf); gtk_object_set_user_data(GTK_OBJECT(opt), cnv); gtk_signal_connect(GTK_OBJECT(opt), "activate", Index: dialogs.c =================================================================== RCS file: /cvsroot/gaim/gaim/src/dialogs.c,v retrieving revision 1.343 retrieving revision 1.344 diff -u -d -r1.343 -r1.344 --- dialogs.c 26 Sep 2002 21:03:06 -0000 1.343 +++ dialogs.c 30 Sep 2002 01:05:14 -0000 1.344 @@ -834,7 +834,7 @@ while (g) { c = (struct gaim_connection *)g->data; - g_snprintf(buf, sizeof(buf), "%s (%s)", c->username, c->prpl->name()); + g_snprintf(buf, sizeof(buf), "%s (%s)", c->username, c->prpl->name); opt = gtk_menu_item_new_with_label(buf); gtk_object_set_user_data(GTK_OBJECT(opt), info); @@ -1045,7 +1045,7 @@ while (g) { c = (struct gaim_connection *)g->data; g_snprintf(buf, sizeof(buf), "%s (%s)", - c->username, c->prpl->name()); + c->username, c->prpl->name); opt = gtk_menu_item_new_with_label(buf); gtk_object_set_user_data(GTK_OBJECT(opt), b); gtk_signal_connect(GTK_OBJECT(opt), "activate", @@ -1321,7 +1321,7 @@ c = c->next; if (!gc->prpl->set_permit_deny) continue; - g_snprintf(buf, sizeof buf, "%s (%s)", gc->username, gc->prpl->name()); + g_snprintf(buf, sizeof buf, "%s (%s)", gc->username, gc->prpl->name); opt = gtk_menu_item_new_with_label(buf); gtk_signal_connect(GTK_OBJECT(opt), "activate", GTK_SIGNAL_FUNC(deny_gc_opt), gc); gtk_widget_show(opt); @@ -1649,7 +1649,7 @@ while (u) { a = (struct aim_user *)u->data; p = (struct prpl *)find_prpl(a->protocol); - g_snprintf(buf, sizeof buf, "%s (%s)", a->username, (p && p->name)?p->name():"Unknown"); + g_snprintf(buf, sizeof buf, "%s (%s)", a->username, (p && p->name)?p->name:"Unknown"); opt = gtk_menu_item_new_with_label(buf); gtk_object_set_user_data(GTK_OBJECT(opt), a); gtk_signal_connect(GTK_OBJECT(opt), "activate", GTK_SIGNAL_FUNC(pounce_choose), b); @@ -3345,7 +3345,7 @@ while (g) { c = (struct gaim_connection *)g->data; - g_snprintf(buf, sizeof buf, "%s (%s)", c->username, c->prpl->name()); + g_snprintf(buf, sizeof buf, "%s (%s)", c->username, c->prpl->name); opt = gtk_menu_item_new_with_label(buf); gtk_signal_connect(GTK_OBJECT(opt), "activate", GTK_SIGNAL_FUNC(set_import_gc), c); gtk_widget_show(opt); Index: module.c =================================================================== RCS file: /cvsroot/gaim/gaim/src/module.c,v retrieving revision 1.24 retrieving revision 1.25 diff -u -d -r1.24 -r1.25 --- module.c 28 Sep 2002 21:39:45 -0000 1.24 +++ module.c 30 Sep 2002 01:05:14 -0000 1.25 @@ -35,6 +35,7 @@ #endif #include "gaim.h" +#include "prpl.h" #include <string.h> #include <sys/time.h> @@ -92,7 +93,9 @@ int l; #if GAIM_PLUGINS char *(*gaim_plugin_init)(GModule *); + char *(*gaim_prpl_init)(struct prpl *); char *(*cfunc)(); + struct prpl * new_prpl; struct gaim_plugin_description *(*desc)(); GModule *handle; #endif @@ -111,6 +114,25 @@ debug_printf("%s is unloadable: %s\n", file, g_module_error()); continue; } + if (g_module_symbol(handle, "gaim_prpl_init", (gpointer *)&gaim_prpl_init)) { + plug = g_new0(struct gaim_plugin, 1); + g_snprintf(plug->path, sizeof(plug->path), path); + plug->type = plugin; + + new_prpl = g_new0(struct prpl, 1); + new_prpl->plug = plug; + gaim_prpl_init(new_prpl); + if (new_prpl->protocol == PROTO_ICQ || + find_prpl(new_prpl->protocol)) { + /* Nothing to see here--move along, move along */ + unload_protocol(new_prpl); + continue; + } + protocols = g_slist_insert_sorted(protocols, new_prpl, (GCompareFunc)proto_compare); + g_module_close(handle); + continue; + } + if (!g_module_symbol(handle, "gaim_plugin_init", (gpointer *)&gaim_plugin_init)) { debug_printf("%s is unloadable %s\n", file, g_module_error()); g_module_close(handle); Index: multi.c =================================================================== RCS file: /cvsroot/gaim/gaim/src/multi.c,v retrieving revision 1.131 retrieving revision 1.132 diff -u -d -r1.131 -r1.132 --- multi.c 29 Sep 2002 04:48:40 -0000 1.131 +++ multi.c 30 Sep 2002 01:05:14 -0000 1.132 @@ -155,7 +155,7 @@ { struct prpl *p = find_prpl(proto); if (p && p->name) - return p->name(); + return p->name; else return "Unknown"; } @@ -396,7 +396,7 @@ if (!found) count++; if (e->name) - opt = gtk_menu_item_new_with_label(e->name()); + opt = gtk_menu_item_new_with_label(e->name); else opt = gtk_menu_item_new_with_label("Unknown"); gtk_object_set_user_data(GTK_OBJECT(opt), u); @@ -655,12 +655,12 @@ if (!p->user_opts) return; - tmp = op = p->user_opts(); + tmp = op = p->user_opts; if (!op) return; - g_snprintf(buf, sizeof(buf), "%s Options", p->name()); + g_snprintf(buf, sizeof(buf), "%s Options", p->name); u->proto_frame = gtk_frame_new(buf); gtk_box_pack_start(GTK_BOX(box), u->proto_frame, FALSE, FALSE, 0); gtk_widget_show(u->proto_frame); @@ -693,8 +693,7 @@ gtk_widget_show(entry); u->opt_entries = g_list_append(u->opt_entries, entry); - - g_free(puo); + op = op->next; } @@ -705,7 +704,6 @@ gtk_widget_show(u->register_user); } - g_list_free(tmp); } static void show_acct_mod(struct aim_user *a) @@ -1166,7 +1164,7 @@ return; i = gtk_clist_find_row_from_data(GTK_CLIST(list), gc->user); gtk_clist_set_text(GTK_CLIST(list), i, 1, "Yes"); - gtk_clist_set_text(GTK_CLIST(list), i, 3, gc->prpl->name()); + gtk_clist_set_text(GTK_CLIST(list), i, 3, gc->prpl->name); return; } @@ -1324,7 +1322,7 @@ meter->gc = gc; meters = g_slist_append(meters, meter); - g_snprintf(buf, sizeof(buf), "%s Signing On (using %s)", gc->username, gc->prpl->name()); + g_snprintf(buf, sizeof(buf), "%s Signing On (using %s)", gc->username, gc->prpl->name); } gtk_progress_bar_update(GTK_PROGRESS_BAR(meter->progress), howfar / LOGIN_STEPS); Index: perl.c =================================================================== RCS file: /cvsroot/gaim/gaim/src/perl.c,v retrieving revision 1.80 retrieving revision 1.81 diff -u -d -r1.80 -r1.81 --- perl.c 28 Sep 2002 08:08:14 -0000 1.80 +++ perl.c 30 Sep 2002 01:05:15 -0000 1.81 @@ -550,7 +550,7 @@ { struct gaim_connection *gc = (struct gaim_connection *)SvIV(ST(1)); if (g_slist_find(connections, gc)) - XST_mPV(i++, gc->prpl->name()); + XST_mPV(i++, gc->prpl->name); else XST_mPV(i++, "Unknown"); } Index: prpl.c =================================================================== RCS file: /cvsroot/gaim/gaim/src/prpl.c,v retrieving revision 1.60 retrieving revision 1.61 diff -u -d -r1.60 -r1.61 --- prpl.c 10 Sep 2002 15:31:34 -0000 1.60 +++ prpl.c 30 Sep 2002 01:05:15 -0000 1.61 @@ -32,6 +32,7 @@ GSList *protocols = NULL; GtkWidget *protomenu = NULL; +int prpl_accounts[PROTO_UNTAKEN]; struct _prompt { GtkWidget *window; @@ -56,30 +57,39 @@ return NULL; } -static gint proto_compare(struct prpl *a, struct prpl *b) +gint proto_compare(struct prpl *a, struct prpl *b) { /* neg if a before b, 0 if equal, pos if a after b */ return a->protocol - b->protocol; } -void load_protocol(proto_init pi, int size) +#ifdef GAIM_PLUGINS +gboolean load_prpl(struct prpl *p) { - struct prpl *p; - struct prpl *old; - if (size != sizeof(struct prpl)) { - do_error_dialog(_("Incompatible protocol detected."), - _("You have attempted to load a protocol which was not compiled" - " from the same version of the source as this application was." - " Unfortunately, because it is not the same version I cannot" - " safely tell you which one it was. Needless to say, it was not" - " successfully loaded."), GAIM_ERROR); - return; - } + char *(*gaim_prpl_init)(struct prpl *); + debug_printf("Loading protocol %d\n", p->protocol); + + if (!p->plug) + return TRUE; - p = g_new0(struct prpl, 1); - pi(p); - if ((old = find_prpl(p->protocol)) != NULL) - unload_protocol(old); + p->plug->handle = g_module_open(p->plug->path, 0); + if (!p->plug->handle) { + debug_printf("%s is unloadable: %s\n", p->plug->path, g_module_error()); + return TRUE; + } + + if (!g_module_symbol(p->plug->handle, "gaim_prpl_init", (gpointer *)&gaim_prpl_init)) { + return TRUE; + } + + gaim_prpl_init(p); + return FALSE; +} +#endif + +void load_protocol(proto_init pi) +{ + struct prpl *p; if (p->protocol == PROTO_ICQ) do_error_dialog(_("Libicq.so detected."), @@ -89,31 +99,26 @@ "It is reccomended that you use the AIM/ICQ protocol to connect to ICQ"), GAIM_WARNING); - protocols = g_slist_insert_sorted(protocols, p, (GCompareFunc)proto_compare); regenerate_user_list(); } void unload_protocol(struct prpl *p) { - GSList *c = connections; - struct gaim_connection *g; + GList *c; + struct proto_user_opt *puo; + if (p->name) + g_free(p->name); + c = p->user_opts; while (c) { - g = (struct gaim_connection *)c->data; - if (g->prpl == p) { - char buf[256]; - g_snprintf(buf, sizeof buf, _("%s was using %s, which got removed." - " %s is now offline."), g->username, - p->name(), g->username); - do_error_dialog(buf, NULL, GAIM_ERROR); - signoff(g); - c = connections; - } else - c = c->next; + puo = c->data; + g_free(puo->label); + g_free(puo->def); + g_free(puo); + c = c->next; } - protocols = g_slist_remove(protocols, p); - g_free(p); - regenerate_user_list(); + g_list_free(p->user_opts); + p->user_opts = NULL; } STATIC_PROTO_INIT @@ -321,7 +326,7 @@ continue; } - g_snprintf(buf, sizeof(buf), "%s (%s)", gc->username, gc->prpl->name()); + g_snprintf(buf, sizeof(buf), "%s (%s)", gc->username, gc->prpl->name); menuitem = gtk_menu_item_new_with_label(buf); gtk_menu_append(GTK_MENU(protomenu), menuitem); gtk_widget_show(menuitem); Index: prpl.h =================================================================== RCS file: /cvsroot/gaim/gaim/src/prpl.h,v retrieving revision 1.68 retrieving revision 1.69 diff -u -d -r1.68 -r1.69 --- prpl.h 29 Aug 2002 01:47:14 -0000 1.68 +++ prpl.h 30 Sep 2002 01:05:15 -0000 1.69 @@ -41,6 +41,8 @@ #define PROTO_NAPSTER 9 #define PROTO_ZEPHYR 10 #define PROTO_GADUGADU 11 +#define PROTO_UNTAKEN 17 + /* DON'T TAKE AN UNASSIGNED NUMBER! Talk to Rob or Sean if you'd like * to create a new PRPL. */ @@ -86,7 +88,8 @@ struct prpl { int protocol; int options; - char *(* name)(); + struct gaim_plugin *plug; + char *name; /* for ICQ and Yahoo, who have off/on per-conversation options */ /* char *checkbox; this should be per-connection */ @@ -96,8 +99,8 @@ GList *(* away_states)(struct gaim_connection *gc); GList *(* actions)(); void (* do_action)(struct gaim_connection *, char *); - /* user_opts returns a GList* of g_malloc'd struct proto_user_opts */ - GList *(* user_opts)(); + /* user_opts is a GList* of g_malloc'd struct proto_user_opts */ + GList *user_opts; GList *(* buddy_menu)(struct gaim_connection *, char *); GList *(* edit_buddy_menu)(struct gaim_connection *, char *); GList *(* chat_info)(struct gaim_connection *); @@ -180,13 +183,16 @@ }; extern GSList *protocols; +extern prpl_accounts[]; /* this is mostly just for aim.c, when it initializes the protocols */ extern void static_proto_init(); /* this is what should actually load the protocol. pass it the protocol's initializer */ -extern void load_protocol(proto_init, int); +extern gboolean load_prpl(struct prpl *); +extern void load_protocol(proto_init); extern void unload_protocol(struct prpl *); +extern gint proto_compare(struct prpl *, struct prpl *); extern struct prpl *find_prpl(int); extern void do_proto_menu(); Index: server.c =================================================================== RCS file: /cvsroot/gaim/gaim/src/server.c,v retrieving revision 1.240 retrieving revision 1.241 diff -u -d -r1.240 -r1.241 --- server.c 29 Sep 2002 04:48:40 -0000 1.240 +++ server.c 30 Sep 2002 01:05:15 -0000 1.241 @@ -47,13 +47,25 @@ if (user->gc != NULL) return; +#ifdef GAIM_PLUGINS + if (p->plug) { /* This protocol is a plugin */ + prpl_accounts[p->protocol]++; + debug_printf("Protocol %s is now being used by %d connections.\n", p->name, prpl_accounts[p->protocol]); + if (!p->plug->handle) { /* But the protocol isn't yet loaded. */ + unload_protocol(p); /* Unload it to free the old name and options */ + if (load_prpl(p)) /* And load the plugin */ + return; + } + } +#endif + if (p && p->login) { if (!strlen(user->password) && !(p->options & OPT_PROTO_NO_PASSWORD)) { do_error_dialog(_("Please enter your password"), NULL, GAIM_ERROR); return; } - debug_printf(PACKAGE " " VERSION " logging in %s using %s\n", user->username, p->name()); + debug_printf(PACKAGE " " VERSION " logging in %s using %s\n", user->username, p->name); user->connecting = TRUE; connecting_count++; debug_printf("connecting_count: %d\n", connecting_count); @@ -84,6 +96,7 @@ void serv_close(struct gaim_connection *gc) { + struct prpl *prpl; while (gc->buddy_chats) { struct conversation *b = gc->buddy_chats->data; gc->buddy_chats = g_slist_remove(gc->buddy_chats, b); @@ -99,9 +112,23 @@ if (gc->prpl && gc->prpl->close) gc->prpl->close(gc); - + + prpl = gc->prpl; account_offline(gc); destroy_gaim_conn(gc); + +#ifdef GAIM_PLUGINS + if (prpl->plug) { /* This is a plugin */ + prpl_accounts[prpl->protocol]--; + debug_printf("Prpl %s is now being used by %d accounts\n", prpl->name, prpl_accounts[prpl->protocol]); + if (prpl_accounts[prpl->protocol] == 0) { /* We don't need this protocol anymore */ + debug_printf("Throwing out prpl %s\n", prpl->name); + g_module_close(prpl->plug->handle); + prpl->plug->handle = NULL; + } + } +#endif + } void serv_touch_idle(struct gaim_connection *gc) Index: util.c =================================================================== RCS file: /cvsroot/gaim/gaim/src/util.c,v retrieving revision 1.134 retrieving revision 1.135 diff -u -d -r1.134 -r1.135 --- util.c 17 Sep 2002 15:40:28 -0000 1.134 +++ util.c 30 Sep 2002 01:05:16 -0000 1.135 @@ -1002,32 +1002,32 @@ switch (what) { case log_signon: g_snprintf(text, sizeof(text), "+++ %s (%s) signed on @ %s", - gc->username, gc->prpl->name(), full_date()); + gc->username, gc->prpl->name, full_date()); g_snprintf(html, sizeof(html), "<B>%s</B>", text); break; case log_signoff: g_snprintf(text, sizeof(text), "+++ %s (%s) signed off @ %s", - gc->username, gc->prpl->name(), full_date()); + gc->username, gc->prpl->name, full_date()); g_snprintf(html, sizeof(html), "<I><FONT COLOR=GRAY>%s</FONT></I>", text); break; case log_away: g_snprintf(text, sizeof(text), "+++ %s (%s) changed away state @ %s", - gc->username, gc->prpl->name(), full_date()); + gc->username, gc->prpl->name, full_date()); g_snprintf(html, sizeof(html), "<FONT COLOR=OLIVE>%s</FONT>", text); break; case log_back: g_snprintf(text, sizeof(text), "+++ %s (%s) came back @ %s", - gc->username, gc->prpl->name(), full_date()); + gc->username, gc->prpl->name, full_date()); g_snprintf(html, sizeof(html), "%s", text); break; case log_idle: g_snprintf(text, sizeof(text), "+++ %s (%s) became idle @ %s", - gc->username, gc->prpl->name(), full_date()); + gc->username, gc->prpl->name, full_date()); g_snprintf(html, sizeof(html), "<FONT COLOR=GRAY>%s</FONT>", text); break; case log_unidle: g_snprintf(text, sizeof(text), "+++ %s (%s) returned from idle @ %s", - gc->username, gc->prpl->name(), full_date()); + gc->username, gc->prpl->name, full_date()); g_snprintf(html, sizeof(html), "%s", text); break; case log_quit: @@ -1039,33 +1039,33 @@ switch (what) { case log_signon: g_snprintf(text, sizeof(text), "%s (%s) reported that %s (%s) signed on @ %s", - gc->username, gc->prpl->name(), who->show, who->name, full_date()); + gc->username, gc->prpl->name, who->show, who->name, full_date()); g_snprintf(html, sizeof(html), "<B>%s</B>", text); break; case log_signoff: g_snprintf(text, sizeof(text), "%s (%s) reported that %s (%s) signed off @ %s", - gc->username, gc->prpl->name(), who->show, who->name, full_date()); + gc->username, gc->prpl->name, who->show, who->name, full_date()); g_snprintf(html, sizeof(html), "<I><FONT COLOR=GRAY>%s</FONT></I>", text); break; case log_away: g_snprintf(text, sizeof(text), "%s (%s) reported that %s (%s) went away @ %s", - gc->username, gc->prpl->name(), who->show, who->name, full_date()); + gc->username, gc->prpl->name, who->show, who->name, full_date()); g_snprintf(html, sizeof(html), "<FONT COLOR=OLIVE>%s</FONT>", text); break; case log_back: g_snprintf(text, sizeof(text), "%s (%s) reported that %s (%s) came back @ %s", - gc->username, gc->prpl->name(), who->show, who->name, full_date()); + gc->username, gc->prpl->name, who->show, who->name, full_date()); g_snprintf(html, sizeof(html), "%s", text); break; case log_idle: g_snprintf(text, sizeof(text), "%s (%s) reported that %s (%s) became idle @ %s", - gc->username, gc->prpl->name(), who->show, who->name, full_date()); + gc->username, gc->prpl->name, who->show, who->name, full_date()); g_snprintf(html, sizeof(html), "<FONT COLOR=GRAY>%s</FONT>", text); break; case log_unidle: g_snprintf(text, sizeof(text), "%s (%s) reported that %s (%s) returned from idle @ %s", gc->username, - gc->prpl->name(), who->show, who->name, full_date()); + gc->prpl->name, who->show, who->name, full_date()); g_snprintf(html, sizeof(html), "%s", text); break; default: @@ -1077,33 +1077,33 @@ switch (what) { case log_signon: g_snprintf(text, sizeof(text), "%s (%s) reported that %s signed on @ %s", - gc->username, gc->prpl->name(), who->name, full_date()); + gc->username, gc->prpl->name, who->name, full_date()); g_snprintf(html, sizeof(html), "<B>%s</B>", text); break; case log_signoff: g_snprintf(text, sizeof(text), "%s (%s) reported that %s signed off @ %s", - gc->username, gc->prpl->name(), who->name, full_date()); + gc->username, gc->prpl->name, who->name, full_date()); g_snprintf(html, sizeof(html), "<I><FONT COLOR=GRAY>%s</FONT></I>", text); break; case log_away: g_snprintf(text, sizeof(text), "%s (%s) reported that %s went away @ %s", - gc->username, gc->prpl->name(), who->name, full_date()); + gc->username, gc->prpl->name, who->name, full_date()); g_snprintf(html, sizeof(html), "<FONT COLOR=OLIVE>%s</FONT>", text); break; case log_back: g_snprintf(text, sizeof(text), "%s (%s) reported that %s came back @ %s", - gc->username, gc->prpl->name(), who->name, full_date()); + gc->username, gc->prpl->name, who->name, full_date()); g_snprintf(html, sizeof(html), "%s", text); break; case log_idle: g_snprintf(text, sizeof(text), "%s (%s) reported that %s became idle @ %s", - gc->username, gc->prpl->name(), who->name, full_date()); + gc->username, gc->prpl->name, who->name, full_date()); g_snprintf(html, sizeof(html), "<FONT COLOR=GRAY>%s</FONT>", text); break; case log_unidle: g_snprintf(text, sizeof(text), "%s (%s) reported that %s returned from idle @ %s", gc->username, - gc->prpl->name(), who->name, full_date()); + gc->prpl->name, who->name, full_date()); g_snprintf(html, sizeof(html), "%s", text); break; default: |