/soc/2015/jgeboski/facebook: 8e23ae2d2ef6: facebook: fixed the c...

James Geboski <[email protected]>
Newsgroups gmane.comp.gnome.gaim.cvs
Message-ID <[email protected]>
Changeset: 8e23ae2d2ef6225727b580bf1bcaa7a9bc18d7ea
Author:	 James Geboski <[email protected]>
Date:	 2015-08-25 20:02 -0400
Branch:	 facebook
URL: https://hg.pidgin.im/soc/2015/jgeboski/facebook/rev/8e23ae2d2ef6

Description:

facebook: fixed the contact query not fetching non-users

diffstat:

 libpurple/protocols/facebook/api.c |  160 ++++++++++++++----------------------
 libpurple/protocols/facebook/api.h |    4 +-
 2 files changed, 63 insertions(+), 101 deletions(-)

diffs (247 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
@@ -775,7 +775,7 @@ fb_api_http_query(FbApi *api, gint64 que
 
 	switch (query) {
 	case FB_API_QUERY_CONTACT:
-		name = "FetchContactQuery";
+		name = "UsersQuery";
 		break;
 	case FB_API_QUERY_CONTACTS:
 		name = "FetchContactsFullQuery";
@@ -1845,71 +1845,15 @@ fb_api_auth(FbApi *api, const gchar *use
 	                prms, fb_api_cb_auth);
 }
 
-static gboolean
-fb_api_contact_parse(FbApi *api, FbApiUser *user, JsonNode *root,
-                     GError **error)
-{
-	const gchar *str;
-	FbApiPrivate *priv = api->priv;
-	FbHttpParams *params;
-	FbJsonValues *values;
-	GError *err = NULL;
-
-	values = fb_json_values_new(root);
-	fb_json_values_add(values, FB_JSON_TYPE_STR, FALSE,
-	                   "$.represented_profile.id");
-	fb_json_values_add(values, FB_JSON_TYPE_STR, FALSE,
-	                   "$.id");
-	fb_json_values_add(values, FB_JSON_TYPE_STR, FALSE,
-	                   "$.represented_profile.friendship_status");
-	fb_json_values_add(values, FB_JSON_TYPE_STR, TRUE,
-	                   "$.structured_name.text");
-	fb_json_values_add(values, FB_JSON_TYPE_STR, TRUE,
-	                   "$.hugePictureUrl.uri");
-	fb_json_values_update(values, &err);
-
-	if (G_UNLIKELY(err != NULL)) {
-		g_propagate_error(error, err);
-		g_object_unref(values);
-		return FALSE;
-	}
-
-	str = fb_json_values_next_str(values, NULL);
-
-	if (str == NULL) {
-		str = fb_json_values_next_str(values, "0");
-	} else {
-		fb_json_values_next_str(values, NULL);
-	}
-
-	user->uid = FB_ID_FROM_STR(str);
-	str = fb_json_values_next_str(values, NULL);
-
-	if ((str != NULL) &&
-	    !purple_strequal(str, "ARE_FRIENDS") &&
-	    (user->uid != priv->uid))
-	{
-		g_object_unref(values);
-		return FALSE;
-	}
-
-	user->name = fb_json_values_next_str_dup(values, NULL);
-	user->icon = fb_json_values_next_str_dup(values, NULL);
-
-	params = fb_http_params_new_parse(user->icon, TRUE);
-	user->csum = fb_http_params_dup_str(params, "oh", &err);
-	fb_http_params_free(params);
-
-	g_object_unref(values);
-	return TRUE;
-}
-
 static void
 fb_api_cb_contact(PurpleHttpConnection *con, PurpleHttpResponse *res,
                   gpointer data)
 {
+	const gchar *str;
 	FbApi *api = data;
 	FbApiUser user;
+	FbHttpParams *prms;
+	FbJsonValues *values;
 	GError *err = NULL;
 	JsonNode *node;
 	JsonNode *root;
@@ -1927,20 +1871,32 @@ fb_api_cb_contact(PurpleHttpConnection *
 		return;
 	}
 
+	values = fb_json_values_new(node);
+	fb_json_values_add(values, FB_JSON_TYPE_STR, TRUE, "$.id");
+	fb_json_values_add(values, FB_JSON_TYPE_STR, TRUE, "$.name");
+	fb_json_values_add(values, FB_JSON_TYPE_STR, TRUE,
+	                   "$.profile_pic_large.uri");
+	fb_json_values_update(values, &err);
+
+	FB_API_ERROR_EMIT(api, err,
+		g_object_unref(values);
+		json_node_free(root);
+		return;
+	);
+
 	fb_api_user_reset(&user, FALSE);
-
-	if (!fb_api_contact_parse(api, &user, node, &err)) {
-		if (G_LIKELY(err == NULL)) {
-			fb_api_error(api, FB_API_ERROR_GENERAL,
-			             _("Failed to parse contact information"));
-		} else {
-			fb_api_error_emit(api, err);
-		}
-	} else {
-		g_signal_emit_by_name(api, "contact", &user);
-	}
-
+	str = fb_json_values_next_str(values, "0");
+	user.uid = FB_ID_FROM_STR(str);
+	user.name = fb_json_values_next_str_dup(values, NULL);
+	user.icon = fb_json_values_next_str_dup(values, NULL);
+
+	prms = fb_http_params_new_parse(user.icon, TRUE);
+	user.csum = fb_http_params_dup_str(prms, "oh", &err);
+	fb_http_params_free(prms);
+
+	g_signal_emit_by_name(api, "contact", &user);
 	fb_api_user_reset(&user, TRUE);
+	g_object_unref(values);
 	json_node_free(root);
 }
 
@@ -1950,16 +1906,19 @@ fb_api_contact(FbApi *api, FbId uid)
 	JsonBuilder *bldr;
 
 	/* Object key mapping:
-	 *   0: contact_id
-	 *   1: big_img_size
-	 *   2: huge_img_size
-	 *   3: small_img_size
-	 *   4: low_res_cover_size
-	 *   6: media_type
+	 *   0: user_fbids
+	 *   1: include_full_user_info
+	 *   2: profile_pic_large_size
+	 *   3: profile_pic_medium_size
+	 *   4: profile_pic_small_size
 	 */
 
 	bldr = fb_json_bldr_new(JSON_NODE_OBJECT);
-	fb_json_bldr_add_strf(bldr, "0", "%" FB_ID_FORMAT, uid);
+	fb_json_bldr_arr_begin(bldr, "0");
+	fb_json_bldr_add_strf(bldr, NULL, "%" FB_ID_FORMAT, uid);
+	fb_json_bldr_arr_end(bldr);
+
+	fb_json_bldr_add_str(bldr, "1", "true");
 	fb_api_http_query(api, FB_API_QUERY_CONTACT, bldr, fb_api_cb_contact);
 }
 
@@ -1967,16 +1926,16 @@ static void
 fb_api_cb_contacts(PurpleHttpConnection *con, PurpleHttpResponse *res,
                    gpointer data)
 {
+	const gchar *str;
 	FbApi *api = data;
-	FbApiUser *duser;
-	FbApiUser user;
+	FbApiUser *user;
+	FbHttpParams *prms;
 	FbJsonValues *values;
 	gboolean complete;
 	gchar *writeid = NULL;
 	GError *err = NULL;
 	GSList *users = NULL;
 	guint count = 0;
-	JsonNode *node;
 	JsonNode *root;
 
 	if (!fb_api_http_chk(api, con, res, &root)) {
@@ -1986,32 +1945,35 @@ fb_api_cb_contacts(PurpleHttpConnection 
 	values = fb_json_values_new(root);
 	fb_json_values_add(values, FB_JSON_TYPE_STR, TRUE,
 	                   "$.graph_api_write_id");
+	fb_json_values_add(values, FB_JSON_TYPE_STR, TRUE,
+	                   "$.represented_profile.id");
+	fb_json_values_add(values, FB_JSON_TYPE_STR, TRUE,
+	                   "$.structured_name.text");
+	fb_json_values_add(values, FB_JSON_TYPE_STR, TRUE,
+	                   "$.hugePictureUrl.uri");
 	fb_json_values_set_array(values, FALSE, "$.viewer.messenger_contacts"
 	                                         ".nodes");
 
 	while (fb_json_values_update(values, &err)) {
 		g_free(writeid);
+		writeid = fb_json_values_next_str_dup(values, NULL);
+		user = fb_api_user_dup(NULL, FALSE);
+		str = fb_json_values_next_str(values, "0");
+
+		user->uid = FB_ID_FROM_STR(str);
+		user->name = fb_json_values_next_str_dup(values, NULL);
+		user->icon = fb_json_values_next_str_dup(values, NULL);
+
+		prms = fb_http_params_new_parse(user->icon, TRUE);
+		user->csum = fb_http_params_dup_str(prms, "oh", &err);
+		fb_http_params_free(prms);
+
 		count++;
-
-		writeid = fb_json_values_next_str_dup(values, NULL);
-		node = fb_json_values_get_root(values);
-		fb_api_user_reset(&user, FALSE);
-
-		if (fb_api_contact_parse(api, &user, node, &err)) {
-			duser = fb_api_user_dup(&user, FALSE);
-			users = g_slist_prepend(users, duser);
-		} else {
-			fb_api_user_reset(&user, TRUE);
-		}
-
-		if (G_UNLIKELY(err != NULL)) {
-			break;
-		}
+		users = g_slist_prepend(users, user);
 	}
 
-	complete = (writeid == NULL) || (count < FB_API_CONTACTS_COUNT);
-
 	if (G_UNLIKELY(err == NULL)) {
+		complete = (writeid == NULL) || (count < FB_API_CONTACTS_COUNT);
 		g_signal_emit_by_name(api, "contacts", users, complete);
 
 		if (!complete) {
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
@@ -143,9 +143,9 @@
 /**
  * FB_API_QUERY_CONTACT:
  *
- * The query hash for the `FetchContactQuery`.
+ * The query hash for the `UsersQuery`.
  */
-#define FB_API_QUERY_CONTACT  10153746900701729
+#define FB_API_QUERY_CONTACT  10153915107411729
 
 /**
  * FB_API_QUERY_CONTACTS:

_______________________________________________
Commits mailing list
[email protected]
https://pidgin.im/cgi-bin/mailman/listinfo/commits
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.