libpurple/protocols/gg/gg.c

branch
soc.2012.gg
changeset 33313
5a0c6582d5b1
parent 33311
3ba9260b0e74
child 33314
57013b9e1a8e
--- a/libpurple/protocols/gg/gg.c	Thu Jul 05 19:31:34 2012 +0200
+++ b/libpurple/protocols/gg/gg.c	Fri Jul 06 14:54:00 2012 +0200
@@ -48,6 +48,7 @@
 #include "account.h"
 #include "deprecated.h"
 #include "purplew.h"
+#include "libgadu-events.h"
 
 /* Prototypes */
 static void ggp_set_status(PurpleAccount *account, PurpleStatus *status);
@@ -481,164 +482,6 @@
 /* ----- INTERNAL CALLBACKS --------------------------------------------- */
 /* ---------------------------------------------------------------------- */
 
-struct gg_fetch_avatar_data
-{
-	PurpleConnection *gc;
-	gchar *uin;
-	gchar *avatar_url;
-};
-
-
-static void gg_fetch_avatar_cb(PurpleUtilFetchUrlData *url_data, gpointer user_data,
-               const gchar *data, size_t len, const gchar *error_message) {
-	struct gg_fetch_avatar_data *d = user_data;
-	PurpleAccount *account;
-	PurpleBuddy *buddy;
-	gpointer buddy_icon_data;
-
-	purple_debug_info("gg", "gg_fetch_avatar_cb: got avatar image for %s\n",
-		d->uin);
-
-	/* FIXME: This shouldn't be necessary */
-	if (!PURPLE_CONNECTION_IS_VALID(d->gc)) {
-		g_free(d->uin);
-		g_free(d->avatar_url);
-		g_free(d);
-		g_return_if_reached();
-	}
-
-	account = purple_connection_get_account(d->gc);
-	buddy = purple_find_buddy(account, d->uin);
-
-	if (buddy == NULL)
-		goto out;
-
-	buddy_icon_data = g_memdup(data, len);
-
-	purple_buddy_icons_set_for_user(account, purple_buddy_get_name(buddy),
-			buddy_icon_data, len, d->avatar_url);
-	purple_debug_info("gg", "gg_fetch_avatar_cb: UIN %s should have avatar "
-		"now\n", d->uin);
-
-out:
-	g_free(d->uin);
-	g_free(d->avatar_url);
-	g_free(d);
-}
-
-static void gg_get_avatar_url_cb(PurpleUtilFetchUrlData *url_data, gpointer user_data,
-               const gchar *url_text, size_t len, const gchar *error_message) {
-	struct gg_fetch_avatar_data *data;
-	PurpleConnection *gc = user_data;
-	PurpleAccount *account;
-	PurpleBuddy *buddy;
-	const char *uin;
-	const char *is_blank;
-	const char *checksum;
-
-	gchar *bigavatar = NULL;
-	xmlnode *xml = NULL;
-	xmlnode *xmlnode_users;
-	xmlnode *xmlnode_user;
-	xmlnode *xmlnode_avatars;
-	xmlnode *xmlnode_avatar;
-	xmlnode *xmlnode_bigavatar;
-
-	g_return_if_fail(PURPLE_CONNECTION_IS_VALID(gc));
-	account = purple_connection_get_account(gc);
-
-	if (error_message != NULL)
-		purple_debug_error("gg", "gg_get_avatars_cb error: %s\n", error_message);
-	else if (len > 0 && url_text && *url_text) {
-		xml = xmlnode_from_str(url_text, -1);
-		if (xml == NULL)
-			goto out;
-
-		xmlnode_users = xmlnode_get_child(xml, "users");
-		if (xmlnode_users == NULL)
-			goto out;
-
-		xmlnode_user = xmlnode_get_child(xmlnode_users, "user");
-		if (xmlnode_user == NULL)
-			goto out;
-
-		uin = xmlnode_get_attrib(xmlnode_user, "uin");
-
-		xmlnode_avatars = xmlnode_get_child(xmlnode_user, "avatars");
-		if (xmlnode_avatars == NULL)
-			goto out;
-
-		xmlnode_avatar = xmlnode_get_child(xmlnode_avatars, "avatar");
-		if (xmlnode_avatar == NULL)
-			goto out;
-
-		xmlnode_bigavatar = xmlnode_get_child(xmlnode_avatar, "originBigAvatar");
-		if (xmlnode_bigavatar == NULL)
-			goto out;
-
-		is_blank = xmlnode_get_attrib(xmlnode_avatar, "blank");
-		bigavatar = xmlnode_get_data(xmlnode_bigavatar);
-
-		purple_debug_info("gg", "gg_get_avatar_url_cb: UIN %s, IS_BLANK %s, "
-		                        "URL %s\n",
-		                  uin ? uin : "(null)", is_blank ? is_blank : "(null)",
-		                  bigavatar ? bigavatar : "(null)");
-
-		if (uin != NULL && bigavatar != NULL) {
-			buddy = purple_find_buddy(account, uin);
-			if (buddy == NULL)
-				goto out;
-
-			checksum = purple_buddy_icons_get_checksum_for_user(buddy);
-
-			if (purple_strequal(is_blank, "1")) {
-				purple_buddy_icons_set_for_user(account,
-						purple_buddy_get_name(buddy), NULL, 0, NULL);
-			} else if (!purple_strequal(checksum, bigavatar)) {
-				data = g_new0(struct gg_fetch_avatar_data, 1);
-				data->gc = gc;
-				data->uin = g_strdup(uin);
-				data->avatar_url = g_strdup(bigavatar);
-
-				purple_debug_info("gg", "gg_get_avatar_url_cb: "
-					"requesting avatar for %s\n", uin);
-				/* FIXME: This should be cancelled somewhere if not needed. */
-				url_data = purple_util_fetch_url_request(account,
-						bigavatar, TRUE, "Mozilla/4.0 (compatible; MSIE 5.0)",
-						FALSE, NULL, FALSE, -1, gg_fetch_avatar_cb, data);
-			}
-		}
-	}
-
-out:
-	if (xml)
-		xmlnode_free(xml);
-	g_free(bigavatar);
-}
-
-/**
- * Try to update avatar of the buddy.
- *
- * @param gc     PurpleConnection
- * @param uin    UIN of the buddy.
- */
-static void ggp_update_buddy_avatar(PurpleConnection *gc, uin_t uin)
-{
-	gchar *avatarurl;
-	PurpleUtilFetchUrlData *url_data;
-
-	purple_debug_info("gg", "ggp_update_buddy_avatar(gc, %u)\n", uin);
-
-	avatarurl = g_strdup_printf("http://api.gadu-gadu.pl/avatars/%u/0.xml", uin);
-
-	/* FIXME: This should be cancelled somewhere if not needed. */
-	url_data = purple_util_fetch_url_request(
-			purple_connection_get_account(gc), avatarurl, TRUE,
-			"Mozilla/4.0 (compatible; MSIE 5.5)", FALSE, NULL, FALSE, -1,
-			gg_get_avatar_url_cb, gc);
-
-	g_free(avatarurl);
-}
 
 /**
  * Handle change of the status of the buddy.
@@ -655,8 +498,6 @@
 	const char *st;
 	char *status_msg = NULL;
 
-	ggp_update_buddy_avatar(gc, uin);
-
 	from = g_strdup_printf("%u", uin);
 
 	switch (status) {
@@ -1170,6 +1011,7 @@
  * @param data Raw XML contents.
  *
  * @see http://toxygen.net/libgadu/protocol/#ch1.13
+ * @todo: this may not be necessary anymore
  */
 static void ggp_xml_event_handler(PurpleConnection *gc, char *data)
 {
@@ -1218,7 +1060,6 @@
 				purple_debug_info("gg",
 					"ggp_xml_event_handler: avatar updated (uid: %u)\n",
 					event_sender);
-				ggp_update_buddy_avatar(gc, event_sender);
 				break;
 			default:
 				purple_debug_error("gg",
@@ -1354,7 +1195,7 @@
 			ggp_xml_event_handler(gc, ev->event.xml_event.data);
 			break;
 		case GG_EVENT_USER_DATA:
-			purple_debug_misc("gg", "GG_EVENT_USER_DATA\n");
+			ggp_events_user_data(gc, &ev->event.user_data);
 			break;
 		default:
 			purple_debug_error("gg",
@@ -1726,6 +1567,7 @@
 	purple_connection_set_protocol_data(gc, info);
 
 	ggp_image_setup(gc);
+	ggp_avatar_setup(gc);
 	
 	glp->uin = ggp_str_to_uin(purple_account_get_username(account));
 	glp->password = ggp_convert_to_cp1250(purple_account_get_password(account));
@@ -1839,7 +1681,8 @@
 		purple_notify_close_with_handle(gc);
 
 		ggp_search_destroy(info->searches);
-		ggp_image_free(gc);
+		ggp_image_cleanup(gc);
+		ggp_avatar_cleanup(gc);
 
 		if (info->inpa > 0)
 			purple_input_remove(info->inpa);

mercurial