changeset 18712:c65c4caa817a

When we get a presence of type="error" from the server that corresponds to a Jabber chat, only destroy/free/close/leave the chat room if the error happened while joining (and we were therefore never in the room). This fixes the following bug: 1. Join a room 2. Try to change your nickname to something that's being used by someone else 3. The server gives you an error message, but you're not actually kicked out of the room 4. Pidgin thinks you've been kicked out and won't let you send messages to the room, etc.
author Mark Doliner <mark@kingant.net>
date Sun, 29 Jul 2007 07:01:13 +0000
parents 259f8635eeff
children 8000beb73585 bf8b69cba9ae 3f965b7c7ffa
files libpurple/protocols/jabber/presence.c libpurple/protocols/oscar/family_chat.c libpurple/protocols/qq/qq.c
diffstat 3 files changed, 23 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/libpurple/protocols/jabber/presence.c	Sun Jul 29 06:10:24 2007 +0000
+++ b/libpurple/protocols/jabber/presence.c	Sun Jul 29 07:01:13 2007 +0000
@@ -413,7 +413,8 @@
 
 			if(chat->conv) {
 				title = g_strdup_printf(_("Error in chat %s"), from);
-				serv_got_chat_left(js->gc, chat->id);
+				if (g_hash_table_size(chat->members) == 0)
+					serv_got_chat_left(js->gc, chat->id);
 			} else {
 				title = g_strdup_printf(_("Error joining chat %s"), from);
 			}
@@ -421,7 +422,9 @@
 			g_free(title);
 			g_free(msg);
 
-			jabber_chat_destroy(chat);
+			if (g_hash_table_size(chat->members) == 0)
+				/* Only destroy the chat if the error happened while joining */
+				jabber_chat_destroy(chat);
 			jabber_id_free(jid);
 			g_free(status);
 			g_free(room_jid);
--- a/libpurple/protocols/oscar/family_chat.c	Sun Jul 29 06:10:24 2007 +0000
+++ b/libpurple/protocols/oscar/family_chat.c	Sun Jul 29 07:01:13 2007 +0000
@@ -140,6 +140,23 @@
 	return 0;
 }
 
+/**
+ * Subtype 0x0001
+ */
+static int
+error(OscarData *od, FlapConnection *conn, aim_module_t *mod, FlapFrame *frame, aim_modsnac_t *snac, ByteStream *bs)
+{
+	guint16 reason;
+
+	reason = byte_stream_get16(bs);
+
+	/* TODO: Reason 0x000e means invalid SNAC format?  Busted SNAC payload? */
+
+	/* TODO: Read in a TLV list.  TLV of type 0x0009 is the error code.  Error code 0x0033 means "invalid name." */
+
+	return 0;
+}
+
 /*
  * Subtype 0x0002 - General room information.  Lots of stuff.
  *
--- a/libpurple/protocols/qq/qq.c	Sun Jul 29 06:10:24 2007 +0000
+++ b/libpurple/protocols/qq/qq.c	Sun Jul 29 07:01:13 2007 +0000
@@ -747,10 +747,7 @@
 {
 	PurpleAccountOption *option;
 
-	option = purple_account_option_bool_new(_("Login in TCP"), "use_tcp", FALSE);
-	prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option);
-
-	option = purple_account_option_bool_new(_("Login Hidden"), "hidden", FALSE);
+	option = purple_account_option_bool_new(_("Connect using TCP"), "use_tcp", FALSE);
 	prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option);
 
 	option = purple_account_option_string_new(_("Server"), "server", NULL);