/soc/2015/jgeboski/facebook: bc1889935d07: facebok: implemented ...

James Geboski <[email protected]>
Newsgroups gmane.comp.gnome.gaim.cvs
Message-ID <[email protected]>
Changeset: bc1889935d07a538a20abda9cdf00768a2140dc3
Author:	 James Geboski <[email protected]>
Date:	 2015-06-05 21:26 -0400
Branch:	 facebook
URL: https://hg.pidgin.im/soc/2015/jgeboski/facebook/rev/bc1889935d07

Description:

facebok: implemented user icons

diffstat:

 libpurple/protocols/facebook/api.c      |  16 +++++---
 libpurple/protocols/facebook/api.h      |   1 +
 libpurple/protocols/facebook/facebook.c |  63 +++++++++++++++++++++++++++++---
 3 files changed, 67 insertions(+), 13 deletions(-)

diffs (141 lines):

diff --git a/libpurple/protocols/facebook/api.c b/libpurple/protocols/facebook/api.c
--- a/libpurple/protocols/facebook/api.c
+++ b/libpurple/protocols/facebook/api.c
@@ -968,8 +968,7 @@ static void
 fb_api_cb_contacts(PurpleHttpConnection *con, PurpleHttpResponse *res,
                    gpointer data)
 {
-	const gchar *name;
-	const gchar *uid;
+	const gchar *str;
 	FbApi *api = data;
 	FbApiUser user;
 	GError *err = NULL;
@@ -994,15 +993,20 @@ fb_api_cb_contacts(PurpleHttpConnection 
 
 	for (l = elms; l != NULL; l = l->next) {
 		node = l->data;
-		uid = fb_json_node_get_str(node, "$.represented_profile.id",
+		str = fb_json_node_get_str(node, "$.represented_profile.id",
 		                           &err);
 		FB_API_ERROR_CHK(api, err, goto finish);
-		user.uid = FB_ID_FROM_STR(uid);
+		user.uid = FB_ID_FROM_STR(str);
 
-		name = fb_json_node_get_str(node, "$.structured_name.text",
+		str = fb_json_node_get_str(node, "$.structured_name.text",
+		                           &err);
+		FB_API_ERROR_CHK(api, err, goto finish);
+		user.name = str;
+
+		str = fb_json_node_get_str(node, "$.huge_picture_url.uri",
 		                            &err);
 		FB_API_ERROR_CHK(api, err, goto finish);
-		user.name = name;
+		user.icon = str;
 
 		mptr = g_memdup(&user, sizeof user);
 		users = g_slist_prepend(users, mptr);
diff --git a/libpurple/protocols/facebook/api.h b/libpurple/protocols/facebook/api.h
--- a/libpurple/protocols/facebook/api.h
+++ b/libpurple/protocols/facebook/api.h
@@ -128,6 +128,7 @@ struct _FbApiUser
 {
 	FbId uid;
 	const gchar *name;
+	const gchar *icon;
 };
 
 struct _FbApiHttpInfo
diff --git a/libpurple/protocols/facebook/facebook.c b/libpurple/protocols/facebook/facebook.c
--- a/libpurple/protocols/facebook/facebook.c
+++ b/libpurple/protocols/facebook/facebook.c
@@ -41,6 +41,9 @@ static const gchar *fb_props_strs[] = {
 
 static PurpleProtocol *my_protocol = NULL;
 
+static void
+fb_cb_api_error(FbApi *api, GError *error, gpointer data);
+
 static gboolean
 fb_props_load(PurpleConnection *gc)
 {
@@ -160,9 +163,44 @@ fb_cb_api_connect(FbApi *api, gpointer d
 }
 
 static void
+fb_cb_icon_fetch(PurpleHttpConnection *con, PurpleHttpResponse *res,
+                 gpointer data)
+{
+	const gchar *str;
+	const gchar *name = data;
+	FbApi *api;
+	GError *err;
+	gsize size;
+	guchar *idata;
+	PurpleAccount *acct;
+	PurpleConnection *gc;
+
+	gc = purple_http_conn_get_purple_connection(con);
+	acct = purple_connection_get_account(gc);
+	api = purple_connection_get_protocol_data(gc);
+
+	if (!fb_http_error_chk(res, &err)) {
+		fb_cb_api_error(api, err, gc);
+		g_error_free(err);
+		return;
+	}
+
+	str = purple_http_response_get_data(res, &size);
+	idata = g_memdup(str, size);
+
+	if (G_UNLIKELY(name == NULL)) {
+		purple_buddy_icons_set_account_icon(acct, idata, size);
+		return;
+	}
+
+	purple_buddy_icons_set_for_user(acct, name, idata, size, NULL);
+}
+
+static void
 fb_cb_api_contacts(FbApi *api, GSList *users, gpointer data)
 {
 	const gchar *alias;
+	const gchar *name;
 	FbApiUser *user;
 	FbId muid;
 	gchar uid[FB_ID_STRMAX];
@@ -186,15 +224,26 @@ fb_cb_api_contacts(FbApi *api, GSList *u
 		user = l->data;
 		FB_ID_TO_STR(user->uid, uid);
 
-		if (G_UNLIKELY((user->uid == muid) && (alias == NULL))) {
-			purple_account_set_private_alias(acct, user->name);
-			continue;
+		if (G_UNLIKELY(user->uid == muid)) {
+			if (G_UNLIKELY(alias == NULL)) {
+				purple_account_set_private_alias(acct,
+				                                 user->name);
+			}
+
+			name = NULL;
+		} else {
+			bdy = purple_blist_find_buddy(acct, uid);
+
+			if (bdy == NULL) {
+				bdy = purple_buddy_new(acct, uid, user->name);
+				purple_blist_add_buddy(bdy, NULL, grp, NULL);
+			}
+
+			name = purple_buddy_get_name(bdy);
 		}
 
-		if (purple_blist_find_buddy(acct, uid) == NULL) {
-			bdy = purple_buddy_new(acct, uid, user->name);
-			purple_blist_add_buddy(bdy, NULL, grp, NULL);
-		}
+		purple_http_get(gc, fb_cb_icon_fetch, (gchar *) name,
+		                user->icon);
 	}
 
 	purple_connection_update_progress(gc, _("Connecting"), 3, 4);
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.