Don't call aim_src_clientready() until we have activated our feedbag

Thu, 15 Oct 2009 23:42:27 +0000

author
Mark Doliner <markdoliner@pidgin.im>
date
Thu, 15 Oct 2009 23:42:27 +0000
changeset 28685
1430f0acaa90
parent 28681
033aa23c457f
child 28686
c35baf57e786

Don't call aim_src_clientready() until we have activated our feedbag
(and also until after we have our bos rights, but I'm not sure if that
matters). This fixes the bug where AIM block lists recently stopped
working. I imagine AIM permit lists were also broken, as well as the
three ICQ privacy lists.

It's conceivable that this will also fix the bug where your contact
list is sometimes empty, but I have no evidence to support that either
way.

This change will be in the next release of Pidgin, 2.6.3, which will
probably be released within the next week.

Thanks to AOL for telling me what we were doing wrong.

Fixes #10489
Fixes #10499
Fixes #10509
Refs #10411

libpurple/protocols/oscar/oscar.c file | annotate | diff | comparison | revisions
libpurple/protocols/oscar/oscar.h file | annotate | diff | comparison | revisions
--- a/libpurple/protocols/oscar/oscar.c	Thu Oct 15 16:13:57 2009 +0000
+++ b/libpurple/protocols/oscar/oscar.c	Thu Oct 15 23:42:27 2009 +0000
@@ -3909,12 +3909,8 @@
 	od->rights.maxpermits = (guint)maxpermits;
 	od->rights.maxdenies = (guint)maxdenies;
 
-	purple_connection_set_state(gc, PURPLE_CONNECTED);
-
 	purple_debug_info("oscar", "buddy list loaded\n");
 
-	aim_srv_clientready(od, conn);
-
 	if (purple_account_get_user_info(account) != NULL)
 		serv_set_info(gc, purple_account_get_user_info(account));
 
@@ -3957,6 +3953,22 @@
 	aim_srv_requestnew(od, SNAC_FAMILY_ALERT);
 	aim_srv_requestnew(od, SNAC_FAMILY_CHATNAV);
 
+	od->bos.have_rights = TRUE;
+
+	/*
+	 * If we've already received our feedbag data then we're not waiting on
+	 * anything else, so send the server clientready.
+	 *
+	 * Normally we get bos rights before we get our feedbag data, so this
+	 * rarely (never?) happens.  And I'm not sure it actually matters if we
+	 * wait for bos rights before calling clientready.  But it seems safer
+	 * to do it this way.
+	 */
+	if (od->ssi.received_data) {
+		aim_srv_clientready(od, conn);
+		purple_connection_set_state(gc, PURPLE_CONNECTED);
+	}
+
 	return 1;
 }
 
@@ -5396,6 +5408,15 @@
 	oscar_set_icon(gc, img);
 	purple_imgstore_unref(img);
 
+	/*
+	 * If we've already received our bos rights then we're not waiting on
+	 * anything else, so send the server clientready.
+	 */
+	if (od->bos.have_rights) {
+		aim_srv_clientready(od, conn);
+		purple_connection_set_state(gc, PURPLE_CONNECTED);
+	}
+
 	return 1;
 }
 
--- a/libpurple/protocols/oscar/oscar.h	Thu Oct 15 16:13:57 2009 +0000
+++ b/libpurple/protocols/oscar/oscar.h	Thu Oct 15 23:42:27 2009 +0000
@@ -535,6 +535,10 @@
 		struct aim_userinfo_s *userinfo;
 	} locate;
 
+	struct {
+		gboolean have_rights;
+	} bos;
+
 	/* Server-stored information (ssi) */
 	struct {
 		gboolean received_data;

mercurial