changeset 27995:de7bbdcb695b

Stop attempting to fetch oscar buddy info automatically for people on our buddy list. tmm1 (Aman Gupta) correct pointed out that the only thing we need this for is to show users' status messages in the buddy list, and new AIM clients have been putting the status message in the userinfo block which is sent as part of the presence. So we can eliminate a lot of code. We now grab screen name formatting when we get the initial presence for buddies rather than when we get the auto-fetched info And the "message" stored in the buddy's PurpleStatus will now be plaintext even when the away message contains HTML. This is because the status message from the userinfo block is always plaintext. This doesn't cause problems for any UIs that I'm aware of, but let me know if it undesirable for you. Fixes #9843
author Mark Doliner <mark@kingant.net>
date Tue, 18 Aug 2009 22:35:34 +0000
parents 2ee64cfbbe2e
children 6b66226f6e03
files libpurple/protocols/oscar/family_buddy.c libpurple/protocols/oscar/family_locate.c libpurple/protocols/oscar/oscar.c libpurple/protocols/oscar/oscar.h libpurple/protocols/oscar/snactypes.h
diffstat 5 files changed, 37 insertions(+), 161 deletions(-) [+]
line wrap: on
line diff
--- a/libpurple/protocols/oscar/family_buddy.c	Tue Aug 18 22:31:39 2009 +0000
+++ b/libpurple/protocols/oscar/family_buddy.c	Tue Aug 18 22:35:34 2009 +0000
@@ -221,9 +221,6 @@
 	if ((userfunc = aim_callhandler(od, snac->family, snac->subtype)))
 		ret = userfunc(od, conn, frame, &userinfo);
 
-	if (snac->subtype == SNAC_SUBTYPE_BUDDY_ONCOMING && userinfo.flags & AIM_FLAG_AWAY)
-		aim_locate_autofetch_away_message(od, userinfo.bn);
-
 	aim_info_free(&userinfo);
 
 	return ret;
--- a/libpurple/protocols/oscar/family_locate.c	Tue Aug 18 22:31:39 2009 +0000
+++ b/libpurple/protocols/oscar/family_locate.c	Tue Aug 18 22:35:34 2009 +0000
@@ -250,8 +250,6 @@
 aim_locate_adduserinfo(OscarData *od, aim_userinfo_t *userinfo)
 {
 	aim_userinfo_t *cur;
-	FlapConnection *conn;
-	aim_rxcallback_t userfunc;
 
 	cur = aim_locate_finduserinfo(od, userinfo->bn);
 
@@ -353,73 +351,6 @@
 		}
 		cur->away_len = 0;
 	}
-
-	/*
-	 * This callback can be used by a client if they want to know whenever
-	 * info for a buddy is updated.  For example, if a client shows away
-	 * messages in its buddy list, then it would need to know if a user's
-	 * away message changes.
-	 */
-	conn = flap_connection_findbygroup(od, SNAC_FAMILY_LOCATE);
-	if ((userfunc = aim_callhandler(od, SNAC_FAMILY_LOCATE, SNAC_SUBTYPE_LOCATE_GOTINFOBLOCK)))
-		userfunc(od, conn, NULL, cur);
-}
-
-/**
- * Remove this buddy name from our queue.  If this info was requested
- * by our info request queue, then pop the next element off of the queue.
- *
- * @param od The aim session.
- * @param bn Buddy name of the info we just received.
- * @return True if the request was explicit (client requested the info),
- *         false if the request was implicit (libfaim request the info).
- */
-static int
-aim_locate_gotuserinfo(OscarData *od, FlapConnection *conn, const char *bn)
-{
-	struct userinfo_node *cur, *del;
-	int was_explicit = TRUE;
-
-	while ((od->locate.requested != NULL) && (oscar_util_name_compare(bn, od->locate.requested->bn) == 0)) {
-		del = od->locate.requested;
-		od->locate.requested = del->next;
-		was_explicit = FALSE;
-		g_free(del->bn);
-		g_free(del);
-	}
-
-	cur = od->locate.requested;
-	while ((cur != NULL) && (cur->next != NULL)) {
-		if (oscar_util_name_compare(bn, cur->next->bn) == 0) {
-			del = cur->next;
-			cur->next = del->next;
-			was_explicit = FALSE;
-			g_free(del->bn);
-			g_free(del);
-		} else
-			cur = cur->next;
-	}
-
-	return was_explicit;
-}
-
-void
-aim_locate_autofetch_away_message(OscarData *od, const char *bn)
-{
-	struct userinfo_node *cur;
-
-	/* Make sure we haven't already made an info request for this buddy */
-	for (cur = od->locate.requested; cur != NULL; cur = cur->next)
-		if (oscar_util_name_compare(bn, cur->bn) == 0)
-			return;
-
-	/* Add a new node to our request queue */
-	cur = (struct userinfo_node *)g_malloc(sizeof(struct userinfo_node));
-	cur->bn = g_strdup(bn);
-	cur->next = od->locate.requested;
-	od->locate.requested = cur;
-
-	aim_locate_getinfoshort(od, cur->bn, 0x00000002);
 }
 
 aim_userinfo_t *aim_locate_finduserinfo(OscarData *od, const char *bn) {
@@ -956,7 +887,6 @@
 	aim_snac_t *snac2;
 	guint16 reason;
 	char *bn;
-	int was_explicit;
 
 	if (!(snac2 = aim_remsnac(od, snac->id))) {
 		purple_debug_misc("oscar", "locate error: received response from unknown request!\n");
@@ -978,15 +908,9 @@
 
 	reason = byte_stream_get16(bs);
 
-	/*
-	 * Remove this buddy name from our queue.  If the client requested
-	 * this buddy's info explicitly, then notify them that we do not have
-	 * info for this buddy.
-	 */
-	was_explicit = aim_locate_gotuserinfo(od, conn, bn);
-	if (was_explicit == TRUE)
-		if ((userfunc = aim_callhandler(od, snac->family, snac->subtype)))
-			ret = userfunc(od, conn, frame, reason, bn);
+	/* Notify the user that we do not have info for this buddy */
+	if ((userfunc = aim_callhandler(od, snac->family, snac->subtype)))
+		ret = userfunc(od, conn, frame, reason, bn);
 
 	if (snac2)
 		g_free(snac2->data);
@@ -1202,7 +1126,6 @@
 	aim_userinfo_t *userinfo, *userinfo2;
 	GSList *tlvlist;
 	aim_tlv_t *tlv = NULL;
-	int was_explicit;
 
 	userinfo = (aim_userinfo_t *)g_malloc(sizeof(aim_userinfo_t));
 	aim_info_extract(od, bs, userinfo);
@@ -1238,18 +1161,9 @@
 	aim_info_free(userinfo);
 	g_free(userinfo);
 
-	/*
-	 * Remove this buddy name from our queue.  If the client requested
-	 * this buddy's info explicitly, then notify them that we have info
-	 * for this buddy.
-	 */
-	if (userinfo2 != NULL)
-	{
-		was_explicit = aim_locate_gotuserinfo(od, conn, userinfo2->bn);
-		if (was_explicit == TRUE)
-			if ((userfunc = aim_callhandler(od, snac->family, snac->subtype)))
-				ret = userfunc(od, conn, frame, userinfo2);
-	}
+	/* Show the info to the user */
+	if (userinfo2 != NULL && ((userfunc = aim_callhandler(od, snac->family, snac->subtype))))
+		ret = userfunc(od, conn, frame, userinfo2);
 
 	return ret;
 }
--- a/libpurple/protocols/oscar/oscar.c	Tue Aug 18 22:31:39 2009 +0000
+++ b/libpurple/protocols/oscar/oscar.c	Tue Aug 18 22:35:34 2009 +0000
@@ -160,7 +160,6 @@
 static int purple_parse_misses     (OscarData *, FlapConnection *, FlapFrame *, ...);
 static int purple_parse_clientauto (OscarData *, FlapConnection *, FlapFrame *, ...);
 static int purple_parse_userinfo   (OscarData *, FlapConnection *, FlapFrame *, ...);
-static int purple_got_infoblock    (OscarData *, FlapConnection *, FlapFrame *, ...);
 static int purple_parse_motd       (OscarData *, FlapConnection *, FlapFrame *, ...);
 static int purple_chatnav_info     (OscarData *, FlapConnection *, FlapFrame *, ...);
 static int purple_conv_chat_join        (OscarData *, FlapConnection *, FlapFrame *, ...);
@@ -812,24 +811,24 @@
 
 	od = purple_connection_get_protocol_data(gc);
 
-	if (userinfo == NULL)
-		userinfo = aim_locate_finduserinfo(od, purple_buddy_get_name(b));
-
-	if ((user_info == NULL) || ((b == NULL) && (userinfo == NULL)))
+	if (b == NULL && userinfo == NULL)
 		return;
 
 	if (b == NULL)
 		b = purple_find_buddy(purple_connection_get_account(gc), userinfo->bn);
+	else
+		userinfo = aim_locate_finduserinfo(od, purple_buddy_get_name(b));
 
 	if (b) {
 		presence = purple_buddy_get_presence(b);
 		status = purple_presence_get_active_status(presence);
-
-		message = g_strdup(purple_status_get_attr_string(status, "message"));
-		itmsurl = g_strdup(purple_status_get_attr_string(status, "itmsurl"));
-
-	} else {
-		/* This is an OSCAR contact for whom we don't have a PurpleBuddy but do have information. */
+	}
+
+	/* If we have both b and userinfo we favor userinfo, because if we're
+	   viewing someone's profile then we want the HTML away message, and
+	   the "message" attribute of the status contains only the plaintext
+	   message. */
+	if (userinfo) {
 		if ((userinfo->flags & AIM_FLAG_AWAY)) {
 			/* Away message? */
 			if ((userinfo->flags & AIM_FLAG_AWAY) && (userinfo->away_len > 0) && (userinfo->away != NULL) && (userinfo->away_encoding != NULL)) {
@@ -850,6 +849,9 @@
 												 userinfo->itmsurl, userinfo->itmsurl_len);
 #endif
 		}
+	} else {
+		message = g_strdup(purple_status_get_attr_string(status, "message"));
+		itmsurl = g_strdup(purple_status_get_attr_string(status, "itmsurl"));
 	}
 
 	is_away = ((status && !purple_status_is_available(status)) ||
@@ -916,7 +918,6 @@
 			g_free(message);
 			message = g_strdup(_("Offline"));
 		}
-
 	}
 
 	purple_notify_user_info_add_pair(user_info, _("Status"), message);
@@ -1478,7 +1479,6 @@
 	oscar_data_addhandler(od, SNAC_FAMILY_LOCATE, SNAC_SUBTYPE_LOCATE_RIGHTSINFO, purple_parse_locaterights, 0);
 	oscar_data_addhandler(od, SNAC_FAMILY_LOCATE, SNAC_SUBTYPE_LOCATE_USERINFO, purple_parse_userinfo, 0);
 	oscar_data_addhandler(od, SNAC_FAMILY_LOCATE, SNAC_SUBTYPE_LOCATE_ERROR, purple_parse_locerr, 0);
-	oscar_data_addhandler(od, SNAC_FAMILY_LOCATE, SNAC_SUBTYPE_LOCATE_GOTINFOBLOCK, purple_got_infoblock, 0);
 	oscar_data_addhandler(od, SNAC_FAMILY_OSERVICE, 0x0001, purple_parse_genericerr, 0);
 	oscar_data_addhandler(od, SNAC_FAMILY_OSERVICE, 0x000f, purple_selfinfo, 0);
 	oscar_data_addhandler(od, SNAC_FAMILY_OSERVICE, 0x001f, purple_memrequest, 0);
@@ -2139,6 +2139,23 @@
 	g_return_val_if_fail(info != NULL, 1);
 	g_return_val_if_fail(info->bn != NULL, 1);
 
+	/*
+	 * If this is an AIM buddy and their name has formatting, set their
+	 * server alias.
+	 */
+	if (!oscar_util_valid_name_icq(info->bn)) {
+		gboolean bn_has_formatting = FALSE;
+		char *c;
+		for (c = info->bn; *c != '\0'; c++) {
+			if (!islower(*c)) {
+				bn_has_formatting = TRUE;
+				break;
+			}
+		}
+		serv_got_alias(gc, info->bn,
+				bn_has_formatting ? info->bn : NULL);
+	}
+
 	if (info->present & AIM_USERINFO_PRESENT_FLAGS) {
 		if (info->flags & AIM_FLAG_AWAY)
 			buddy_is_away = TRUE;
@@ -3287,7 +3304,7 @@
 	oscar_user_info_append_extra_info(gc, user_info, NULL, userinfo);
 
 	if ((userinfo->present & AIM_USERINFO_PRESENT_ONLINESINCE) && !oscar_util_valid_name_sms(userinfo->bn)) {
-		/* An SMS contact is always online; its Online Since valid is not useful */
+		/* An SMS contact is always online; its Online Since value is not useful */
 		time_t t = userinfo->onlinesince;
 		oscar_user_info_add_pair(user_info, _("Online Since"), purple_date_format_full(localtime(&t)));
 	}
@@ -3330,55 +3347,6 @@
 	return 1;
 }
 
-static int purple_got_infoblock(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...)
-{
-	PurpleConnection *gc = od->gc;
-	PurpleAccount *account = purple_connection_get_account(gc);
-	PurpleBuddy *b;
-	PurplePresence *presence;
-	PurpleStatus *status;
-	gchar *message = NULL;
-
-	va_list ap;
-	aim_userinfo_t *userinfo;
-
-	va_start(ap, fr);
-	userinfo = va_arg(ap, aim_userinfo_t *);
-	va_end(ap);
-
-	b = purple_find_buddy(account, userinfo->bn);
-	if (b == NULL)
-		return 1;
-
-	if (!oscar_util_valid_name_icq(userinfo->bn))
-	{
-		if (strcmp(purple_buddy_get_name(b), userinfo->bn) != 0)
-			serv_got_alias(gc, purple_buddy_get_name(b), userinfo->bn);
-		else
-			serv_got_alias(gc, purple_buddy_get_name(b), NULL);
-	}
-
-	presence = purple_buddy_get_presence(b);
-	status = purple_presence_get_active_status(presence);
-
-	if (purple_status_is_online(status) && !purple_status_is_available(status) &&
-			userinfo->flags & AIM_FLAG_AWAY && userinfo->away_len > 0 &&
-			userinfo->away != NULL && userinfo->away_encoding != NULL)
-	{
-		gchar *charset = oscar_encoding_extract(userinfo->away_encoding);
-		message = oscar_encoding_to_utf8(account, charset,
-		                                 userinfo->away,
-		                                 userinfo->away_len);
-		g_free(charset);
-		purple_prpl_got_user_status(account, userinfo->bn,
-				purple_status_get_id(status),
-				"message", message, NULL);
-		g_free(message);
-	}
-
-	return 1;
-}
-
 static int purple_parse_motd(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...)
 {
 	char *msg;
--- a/libpurple/protocols/oscar/oscar.h	Tue Aug 18 22:31:39 2009 +0000
+++ b/libpurple/protocols/oscar/oscar.h	Tue Aug 18 22:35:34 2009 +0000
@@ -533,7 +533,6 @@
 
 	struct {
 		struct aim_userinfo_s *userinfo;
-		struct userinfo_node *requested;
 	} locate;
 
 	/* Server-stored information (ssi) */
@@ -1133,7 +1132,6 @@
 /* 0x000f */ int aim_locate_setinterests(OscarData *od, const char *interest1, const char *interest2, const char *interest3, const char *interest4, const char *interest5, guint16 privacy);
 /* 0x0015 */ int aim_locate_getinfoshort(OscarData *od, const char *bn, guint32 flags);
 
-void aim_locate_autofetch_away_message(OscarData *od, const char *bn);
 guint32 aim_locate_getcaps(OscarData *od, ByteStream *bs, int len);
 guint32 aim_locate_getcaps_short(OscarData *od, ByteStream *bs, int len);
 void aim_info_free(aim_userinfo_t *);
--- a/libpurple/protocols/oscar/snactypes.h	Tue Aug 18 22:31:39 2009 +0000
+++ b/libpurple/protocols/oscar/snactypes.h	Tue Aug 18 22:35:34 2009 +0000
@@ -96,7 +96,6 @@
 #define SNAC_SUBTYPE_LOCATE_USERINFO 0x0006
 #define SNAC_SUBTYPE_LOCATE_WATCHERSUBREQ 0x0007
 #define SNAC_SUBTYPE_LOCATE_WATCHERNOT 0x0008
-#define SNAC_SUBTYPE_LOCATE_GOTINFOBLOCK 0xfffd
 #define SNAC_SUBTYPE_LOCATE_DEFAULT 0xffff
 
 /*