libpurple/protocols/facebook/api.c

branch
facebook
changeset 37338
e4d77bc25235
parent 37337
aecff282de76
child 37339
61105b311c1f
equal deleted inserted replaced
37337:aecff282de76 37338:e4d77bc25235
222 0, 222 0,
223 NULL, NULL, 223 NULL, NULL,
224 fb_marshal_VOID__VOID, 224 fb_marshal_VOID__VOID,
225 G_TYPE_NONE, 225 G_TYPE_NONE,
226 0); 226 0);
227 g_signal_new("contact",
228 G_TYPE_FROM_CLASS(klass),
229 G_SIGNAL_ACTION,
230 0,
231 NULL, NULL,
232 fb_marshal_VOID__POINTER,
233 G_TYPE_NONE,
234 1, G_TYPE_POINTER);
227 g_signal_new("contacts", 235 g_signal_new("contacts",
228 G_TYPE_FROM_CLASS(klass), 236 G_TYPE_FROM_CLASS(klass),
229 G_SIGNAL_ACTION, 237 G_SIGNAL_ACTION,
230 0, 238 0,
231 NULL, NULL, 239 NULL, NULL,
350 if (G_UNLIKELY(size == 0)) { 358 if (G_UNLIKELY(size == 0)) {
351 fb_api_error(api, FB_API_ERROR_GENERAL, _("Empty JSON data")); 359 fb_api_error(api, FB_API_ERROR_GENERAL, _("Empty JSON data"));
352 return FALSE; 360 return FALSE;
353 } 361 }
354 362
363 g_print("JSON: %.*s\n", (gint) size, (gchar*) data);
364
355 root = fb_json_node_new(data, size, &err); 365 root = fb_json_node_new(data, size, &err);
356 FB_API_ERROR_EMIT(api, err, return FALSE); 366 FB_API_ERROR_EMIT(api, err, return FALSE);
357 367
358 values = fb_json_values_new(root); 368 values = fb_json_values_new(root);
359 fb_json_values_add(values, FB_JSON_TYPE_INT, FALSE, "$.error_code"); 369 fb_json_values_add(values, FB_JSON_TYPE_INT, FALSE, "$.error_code");
547 const gchar *name; 557 const gchar *name;
548 FbHttpParams *prms; 558 FbHttpParams *prms;
549 gchar *json; 559 gchar *json;
550 560
551 switch (query) { 561 switch (query) {
562 case FB_API_QUERY_CONTACT:
563 name = "FetchContactQuery";
564 break;
552 case FB_API_QUERY_CONTACTS: 565 case FB_API_QUERY_CONTACTS:
553 name = "FetchContactsFullQuery"; 566 name = "FetchContactsFullQuery";
554 break; 567 break;
555 case FB_API_QUERY_CONTACTS_AFTER: 568 case FB_API_QUERY_CONTACTS_AFTER:
556 name = "FetchContactsFullWithAfterQuery"; 569 name = "FetchContactsFullWithAfterQuery";
1547 fb_http_params_set_str(prms, "password", pass); 1560 fb_http_params_set_str(prms, "password", pass);
1548 fb_api_http_req(api, FB_API_URL_AUTH, "authenticate", "auth.login", 1561 fb_api_http_req(api, FB_API_URL_AUTH, "authenticate", "auth.login",
1549 prms, fb_api_cb_auth); 1562 prms, fb_api_cb_auth);
1550 } 1563 }
1551 1564
1565 static gboolean
1566 fb_api_contact_parse(FbApi *api, FbApiUser *user, JsonNode *root,
1567 GError **error)
1568 {
1569 const gchar *str;
1570 FbApiPrivate *priv = api->priv;
1571 FbHttpParams *params;
1572 FbJsonValues *values;
1573 GError *err = NULL;
1574
1575 values = fb_json_values_new(root);
1576 fb_json_values_add(values, FB_JSON_TYPE_STR, FALSE,
1577 "$.represented_profile.id");
1578 fb_json_values_add(values, FB_JSON_TYPE_STR, FALSE,
1579 "$.id");
1580 fb_json_values_add(values, FB_JSON_TYPE_STR, FALSE,
1581 "$.represented_profile.friendship_status");
1582 fb_json_values_add(values, FB_JSON_TYPE_STR, TRUE,
1583 "$.structured_name.text");
1584 fb_json_values_add(values, FB_JSON_TYPE_STR, TRUE,
1585 "$.hugePictureUrl.uri");
1586 fb_json_values_update(values, &err);
1587
1588 if (G_UNLIKELY(err != NULL)) {
1589 g_propagate_error(error, err);
1590 fb_json_values_free(values);
1591 return FALSE;
1592 }
1593
1594 str = fb_json_values_next_str(values, NULL);
1595
1596 if (str == NULL) {
1597 str = fb_json_values_next_str(values, "0");
1598 } else {
1599 fb_json_values_next_str(values, NULL);
1600 }
1601
1602 user->uid = FB_ID_FROM_STR(str);
1603 str = fb_json_values_next_str(values, NULL);
1604
1605 if ((str != NULL) &&
1606 !purple_strequal(str, "ARE_FRIENDS") &&
1607 (user->uid != priv->uid))
1608 {
1609 return FALSE;
1610 }
1611
1612 user->name = fb_json_values_next_str_dup(values, NULL);
1613 user->icon = fb_json_values_next_str_dup(values, NULL);
1614
1615 params = fb_http_params_new_parse(user->icon, TRUE);
1616 user->csum = fb_http_params_dup_str(params, "oh", &err);
1617 fb_http_params_free(params);
1618
1619 fb_json_values_free(values);
1620 return TRUE;
1621 }
1622
1623 static void
1624 fb_api_cb_contact(PurpleHttpConnection *con, PurpleHttpResponse *res,
1625 gpointer data)
1626 {
1627 FbApi *api = data;
1628 FbApiUser user;
1629 GError *err = NULL;
1630 JsonNode *node;
1631 JsonNode *root;
1632
1633 if (!fb_api_http_chk(api, con, res, &root)) {
1634 return;
1635 }
1636
1637 node = fb_json_node_get_nth(root, 0);
1638
1639 if (node == NULL) {
1640 fb_api_error(api, FB_API_ERROR_GENERAL,
1641 _("Failed to obtain contact information"));
1642 json_node_free(root);
1643 return;
1644 }
1645
1646 fb_api_user_reset(&user, FALSE);
1647
1648 if (!fb_api_contact_parse(api, &user, node, &err)) {
1649 if (G_LIKELY(err == NULL)) {
1650 fb_api_error(api, FB_API_ERROR_GENERAL,
1651 _("Failed to parse contact information"));
1652 } else {
1653 fb_api_error_emit(api, err);
1654 }
1655 } else {
1656 g_signal_emit_by_name(api, "contact", &user);
1657 }
1658
1659 fb_api_user_reset(&user, TRUE);
1660 json_node_free(root);
1661 }
1662
1663 void
1664 fb_api_contact(FbApi *api, FbId uid)
1665 {
1666 JsonBuilder *bldr;
1667
1668 /* Object key mapping:
1669 * 0: contact_id
1670 * 1: big_img_size
1671 * 2: huge_img_size
1672 * 3: small_img_size
1673 * 4: low_res_cover_size
1674 * 6: media_type
1675 */
1676
1677 bldr = fb_json_bldr_new(JSON_NODE_OBJECT);
1678 fb_json_bldr_add_strf(bldr, "0", "%" FB_ID_FORMAT, uid);
1679 fb_api_http_query(api, FB_API_QUERY_CONTACT, bldr, fb_api_cb_contact);
1680 }
1681
1552 static void 1682 static void
1553 fb_api_cb_contacts(PurpleHttpConnection *con, PurpleHttpResponse *res, 1683 fb_api_cb_contacts(PurpleHttpConnection *con, PurpleHttpResponse *res,
1554 gpointer data) 1684 gpointer data)
1555 { 1685 {
1556 const gchar *str;
1557 FbApi *api = data; 1686 FbApi *api = data;
1558 FbApiPrivate *priv = api->priv;
1559 FbApiUser user; 1687 FbApiUser user;
1560 FbHttpParams *params;
1561 FbJsonValues *values; 1688 FbJsonValues *values;
1562 gboolean complete; 1689 gboolean complete;
1563 gchar *writeid = NULL; 1690 gchar *writeid = NULL;
1564 GError *err = NULL; 1691 GError *err = NULL;
1565 gpointer mptr; 1692 gpointer mptr;
1566 GSList *users = NULL; 1693 GSList *users = NULL;
1567 guint count = 0; 1694 guint count = 0;
1695 JsonNode *node;
1568 JsonNode *root; 1696 JsonNode *root;
1569 1697
1570 if (!fb_api_http_chk(api, con, res, &root)) { 1698 if (!fb_api_http_chk(api, con, res, &root)) {
1571 return; 1699 return;
1572 } 1700 }
1573 1701
1574 values = fb_json_values_new(root); 1702 values = fb_json_values_new(root);
1575 fb_json_values_add(values, FB_JSON_TYPE_STR, TRUE, 1703 fb_json_values_add(values, FB_JSON_TYPE_STR, TRUE,
1576 "$.represented_profile.id");
1577 fb_json_values_add(values, FB_JSON_TYPE_STR, TRUE,
1578 "$.graph_api_write_id"); 1704 "$.graph_api_write_id");
1579 fb_json_values_add(values, FB_JSON_TYPE_STR, TRUE,
1580 "$.represented_profile.friendship_status");
1581 fb_json_values_add(values, FB_JSON_TYPE_STR, TRUE,
1582 "$.structured_name.text");
1583 fb_json_values_add(values, FB_JSON_TYPE_STR, TRUE,
1584 "$.hugePictureUrl.uri");
1585 fb_json_values_set_array(values, FALSE, "$.viewer.messenger_contacts" 1705 fb_json_values_set_array(values, FALSE, "$.viewer.messenger_contacts"
1586 ".nodes"); 1706 ".nodes");
1587 1707
1588 while (fb_json_values_update(values, &err)) { 1708 while (fb_json_values_update(values, &err)) {
1709 g_free(writeid);
1710 count++;
1711
1712 writeid = fb_json_values_next_str_dup(values, NULL);
1713 node = fb_json_values_get_root(values);
1589 fb_api_user_reset(&user, FALSE); 1714 fb_api_user_reset(&user, FALSE);
1590 str = fb_json_values_next_str(values, NULL); 1715
1591 user.uid = FB_ID_FROM_STR(str); 1716 if (fb_api_contact_parse(api, &user, node, &err)) {
1592 count++; 1717 mptr = fb_api_user_dup(&user, FALSE);
1593 1718 users = g_slist_prepend(users, mptr);
1594 g_free(writeid); 1719 }
1595 writeid = fb_json_values_next_str_dup(values, NULL); 1720
1596 str = fb_json_values_next_str(values, NULL); 1721 if (G_UNLIKELY(err != NULL)) {
1597 1722 break;
1598 if (!purple_strequal(str, "ARE_FRIENDS") && 1723 }
1599 (user.uid != priv->uid))
1600 {
1601 continue;
1602 }
1603
1604 user.name = fb_json_values_next_str_dup(values, NULL);
1605 user.icon = fb_json_values_next_str_dup(values, NULL);
1606
1607 params = fb_http_params_new_parse(user.icon, TRUE);
1608 str = fb_http_params_get_str(params, "oh", &err);
1609 user.csum = g_strdup(str);
1610 fb_http_params_free(params);
1611
1612 mptr = fb_api_user_dup(&user, FALSE);
1613 users = g_slist_prepend(users, mptr);
1614 } 1724 }
1615 1725
1616 complete = (writeid == NULL) || (count < FB_API_CONTACTS_COUNT); 1726 complete = (writeid == NULL) || (count < FB_API_CONTACTS_COUNT);
1617 1727
1618 if (G_UNLIKELY(err == NULL)) { 1728 if (G_UNLIKELY(err == NULL)) {

mercurial