changeset 15456:79f25bbe69bf

This makes IRC /names handling generally more robust, as well as properly dealing with the case where the user runs /quote names #chan and we don't know about it. I thought things were already handled in this fashion, but obviously they were not.
author Ethan Blanton <elb@pidgin.im>
date Sun, 28 Jan 2007 21:48:58 +0000
parents c68f2808f703
children f217a2d656c8
files libpurple/protocols/irc/cmds.c libpurple/protocols/irc/irc.h libpurple/protocols/irc/msgs.c
diffstat 3 files changed, 10 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/libpurple/protocols/irc/cmds.c	Sun Jan 28 21:40:32 2007 +0000
+++ b/libpurple/protocols/irc/cmds.c	Sun Jan 28 21:48:58 2007 +0000
@@ -245,8 +245,6 @@
 	irc_send(irc, buf);
 	g_free(buf);
 
-	irc->nameconv = g_strdup(target);
-
 	return 0;
 }
 
--- a/libpurple/protocols/irc/irc.h	Sun Jan 28 21:40:32 2007 +0000
+++ b/libpurple/protocols/irc/irc.h	Sun Jan 28 21:48:58 2007 +0000
@@ -41,6 +41,8 @@
 
 #define IRC_INITIAL_BUFSIZE 1024
 
+#define IRC_NAMES_FLAG "irc-namelist"
+
 
 enum { IRC_USEROPT_SERVER, IRC_USEROPT_PORT, IRC_USEROPT_CHARSET };
 enum irc_state { IRC_STATE_NEW, IRC_STATE_ESTABLISHED };
@@ -60,7 +62,6 @@
 
 	GString *motd;
 	GString *names;
-	char *nameconv;
 	struct _whois {
 		char *nick;
 		char *away;
--- a/libpurple/protocols/irc/msgs.c	Sun Jan 28 21:40:32 2007 +0000
+++ b/libpurple/protocols/irc/msgs.c	Sun Jan 28 21:48:58 2007 +0000
@@ -442,27 +442,23 @@
 	GaimConversation *convo;
 
 	if (!strcmp(name, "366")) {
-		convo = gaim_find_conversation_with_account(GAIM_CONV_TYPE_ANY, irc->nameconv ? irc->nameconv : args[1], irc->account);
+		convo = gaim_find_conversation_with_account(GAIM_CONV_TYPE_ANY, args[1], irc->account);
 		if (!convo) {
 			gaim_debug(GAIM_DEBUG_ERROR, "irc", "Got a NAMES list for %s, which doesn't exist\n", args[1]);
 			g_string_free(irc->names, TRUE);
 			irc->names = NULL;
-			g_free(irc->nameconv);
-			irc->nameconv = NULL;
 			return;
 		}
 
 		names = cur = g_string_free(irc->names, FALSE);
 		irc->names = NULL;
-		if (irc->nameconv) {
+		if (gaim_conversation_get_data(convo, IRC_NAMES_FLAG)) {
 			msg = g_strdup_printf(_("Users on %s: %s"), args[1], names ? names : "");
 			if (gaim_conversation_get_type(convo) == GAIM_CONV_TYPE_CHAT)
 				gaim_conv_chat_write(GAIM_CONV_CHAT(convo), "", msg, GAIM_MESSAGE_SYSTEM|GAIM_MESSAGE_NO_LOG, time(NULL));
 			else
 				gaim_conv_im_write(GAIM_CONV_IM(convo), "", msg, GAIM_MESSAGE_SYSTEM|GAIM_MESSAGE_NO_LOG, time(NULL));
 			g_free(msg);
-			g_free(irc->nameconv);
-			irc->nameconv = NULL;
 		} else {
 			GList *users = NULL;
 			GList *flags = NULL;
@@ -504,6 +500,9 @@
 				g_list_free(users);
 				g_list_free(flags);
 			}
+
+			gaim_conversation_set_data(convo, IRC_NAMES_FLAG,
+						   GINT_TO_POINTER(TRUE));
 		}
 		g_free(names);
 	} else {
@@ -723,10 +722,13 @@
 		convo = gaim_find_conversation_with_account(GAIM_CONV_TYPE_CHAT,
 							    args[0],
 							    irc->account);
+
 		if (convo == NULL) {
 			gaim_debug_error("irc", "tried to join %s but couldn't\n", args[0]);
 			return;
 		}
+		gaim_conversation_set_data(convo, IRC_NAMES_FLAG,
+					   GINT_TO_POINTER(FALSE));
 		gaim_conversation_present(convo);
 		return;
 	}