| 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)) { |