libpurple/protocols/facebook/api.c

changeset 41839
143c68ca625d
parent 41728
e9b96ef5ea38
child 41880
4371fa2ce648
equal deleted inserted replaced
41838:54f5dccdd78c 41839:143c68ca625d
623 623
624 return TRUE; 624 return TRUE;
625 } 625 }
626 626
627 static gboolean 627 static gboolean
628 fb_api_http_chk(FbApi *api, SoupMessage *res, JsonNode **root) 628 fb_api_http_chk(FbApi *api, SoupSession *session, GAsyncResult *result,
629 { 629 SoupMessage *msg, JsonNode **root)
630 const gchar *data; 630 {
631 const gchar *msg; 631 GBytes *response_body = NULL;
632 const gchar *reason = NULL;
633 const gchar *data = NULL;
632 GError *err = NULL; 634 GError *err = NULL;
633 gint code; 635 gint code;
634 gsize size; 636 gsize size = 0;
635 637
636 msg = soup_message_get_reason_phrase(res); 638 reason = soup_message_get_reason_phrase(msg);
637 code = soup_message_get_status(res); 639 code = soup_message_get_status(msg);
638 data = res->response_body->data; 640
639 size = res->response_body->length; 641 fb_util_debug(FB_UTIL_DEBUG_INFO, "HTTP Response (%p):", msg);
640 642 if (reason != NULL) {
641 fb_util_debug(FB_UTIL_DEBUG_INFO, "HTTP Response (%p):", res); 643 fb_util_debug(FB_UTIL_DEBUG_INFO, " Response Error: %s (%d)", reason,
642 if (msg != NULL) {
643 fb_util_debug(FB_UTIL_DEBUG_INFO, " Response Error: %s (%d)", msg,
644 code); 644 code);
645 } else { 645 } else {
646 fb_util_debug(FB_UTIL_DEBUG_INFO, " Response Error: %d", code); 646 fb_util_debug(FB_UTIL_DEBUG_INFO, " Response Error: %d", code);
647 } 647 }
648 648
649 if (fb_http_error_chk(msg, &err) && (root == NULL)) {
650 return TRUE;
651 }
652
653 response_body = soup_session_send_and_read_finish(session, result, &err);
654 if(response_body != NULL) {
655 data = g_bytes_get_data(response_body, &size);
656 }
657
649 if (G_LIKELY(size > 0)) { 658 if (G_LIKELY(size > 0)) {
650 fb_util_debug(FB_UTIL_DEBUG_INFO, " Response Data: %.*s", 659 fb_util_debug(FB_UTIL_DEBUG_INFO, " Response Data: %.*s",
651 (gint) size, data); 660 (gint) size, data);
652 } 661 }
653 662
654 if (fb_http_error_chk(res, &err) && (root == NULL)) {
655 return TRUE;
656 }
657
658 /* Rudimentary check to prevent wrongful error parsing */ 663 /* Rudimentary check to prevent wrongful error parsing */
659 if ((size < 2) || (data[0] != '{') || (data[size - 1] != '}')) { 664 if ((size < 2) || (data[0] != '{') || (data[size - 1] != '}')) {
660 FB_API_ERROR_EMIT(api, err, return FALSE); 665 FB_API_ERROR_EMIT(api, err, return FALSE);
661 } 666 }
662 667
673 } 678 }
674 679
675 static SoupMessage * 680 static SoupMessage *
676 fb_api_http_req(FbApi *api, const gchar *url, const gchar *name, 681 fb_api_http_req(FbApi *api, const gchar *url, const gchar *name,
677 const gchar *method, FbHttpParams *params, 682 const gchar *method, FbHttpParams *params,
678 SoupSessionCallback callback) 683 GAsyncReadyCallback callback)
679 { 684 {
680 gchar *data; 685 gchar *data;
681 gchar *key; 686 gchar *key;
682 gchar *val; 687 gchar *val;
683 GList *keys; 688 GList *keys;
724 soup_message_headers_replace(soup_message_get_request_headers(msg), 729 soup_message_headers_replace(soup_message_get_request_headers(msg),
725 "Authorization", data); 730 "Authorization", data);
726 g_free(data); 731 g_free(data);
727 } 732 }
728 733
729 soup_session_queue_message(api->cons, msg, callback, api); 734 g_object_set_data(G_OBJECT(msg), "facebook-api", api);
735 soup_session_send_and_read_async(api->cons, msg, G_PRIORITY_DEFAULT, NULL,
736 callback, msg);
730 737
731 fb_util_debug(FB_UTIL_DEBUG_INFO, "HTTP Request (%p):", msg); 738 fb_util_debug(FB_UTIL_DEBUG_INFO, "HTTP Request (%p):", msg);
732 fb_util_debug(FB_UTIL_DEBUG_INFO, " Request URL: %s", url); 739 fb_util_debug(FB_UTIL_DEBUG_INFO, " Request URL: %s", url);
733 740
734 return msg; 741 return msg;
735 } 742 }
736 743
737 static SoupMessage * 744 static SoupMessage *
738 fb_api_http_query(FbApi *api, gint64 query, JsonBuilder *builder, 745 fb_api_http_query(FbApi *api, gint64 query, JsonBuilder *builder,
739 SoupSessionCallback hcb) 746 GAsyncReadyCallback hcb)
740 { 747 {
741 const gchar *name; 748 const gchar *name;
742 FbHttpParams *prms; 749 FbHttpParams *prms;
743 gchar *json; 750 gchar *json;
744 751
782 789
783 return fb_api_http_req(api, FB_API_URL_GQL, name, "get", prms, hcb); 790 return fb_api_http_req(api, FB_API_URL_GQL, name, "get", prms, hcb);
784 } 791 }
785 792
786 static void 793 static void
787 fb_api_cb_http_bool(G_GNUC_UNUSED SoupSession *session, SoupMessage *res, 794 fb_api_cb_http_bool(GObject *source, GAsyncResult *result, gpointer data) {
788 gpointer data) 795 SoupSession *session = SOUP_SESSION(source);
789 { 796 SoupMessage *soupmsg = data;
790 FbApi *api = data; 797 FbApi *api = g_object_get_data(G_OBJECT(soupmsg), "facebook-api");
791 798 JsonNode *root;
792 if (!fb_api_http_chk(api, res, NULL)) { 799
793 return; 800 if (!fb_api_http_chk(api, session, result, soupmsg, &root)) {
794 } 801 return;
795 802 }
796 if (!purple_strequal(res->response_body->data, "true")) { 803
804 if (!json_node_get_boolean(root)) {
797 fb_api_error_literal(api, FB_API_ERROR, 805 fb_api_error_literal(api, FB_API_ERROR,
798 _("Failed generic API operation")); 806 _("Failed generic API operation"));
799 } 807 }
808
809 json_node_free(root);
800 } 810 }
801 811
802 static void 812 static void
803 fb_api_cb_mqtt_error(FbMqtt *mqtt, GError *error, gpointer data) 813 fb_api_cb_mqtt_error(FbMqtt *mqtt, GError *error, gpointer data)
804 { 814 {
967 fb_util_debug_info("Reconnected the MQTT stream"); 977 fb_util_debug_info("Reconnected the MQTT stream");
968 } 978 }
969 } 979 }
970 980
971 static void 981 static void
972 fb_api_cb_seqid(G_GNUC_UNUSED SoupSession *session, SoupMessage *res, 982 fb_api_cb_seqid(GObject *source, GAsyncResult *result, gpointer data) {
973 gpointer data) 983 SoupSession *session = SOUP_SESSION(source);
974 { 984 SoupMessage *soupmsg = data;
985 FbApi *api = g_object_get_data(G_OBJECT(soupmsg), "facebook-api");
975 const gchar *str; 986 const gchar *str;
976 FbApi *api = data;
977 FbJsonValues *values; 987 FbJsonValues *values;
978 GError *err = NULL; 988 GError *err = NULL;
979 JsonNode *root; 989 JsonNode *root;
980 990
981 if (!fb_api_http_chk(api, res, &root)) { 991 if (!fb_api_http_chk(api, session, result, soupmsg, &root)) {
982 return; 992 return;
983 } 993 }
984 994
985 values = fb_json_values_new(root); 995 values = fb_json_values_new(root);
986 fb_json_values_add(values, FB_JSON_TYPE_STR, FALSE, 996 fb_json_values_add(values, FB_JSON_TYPE_STR, FALSE,
1994 g_signal_emit_by_name(api, "error", error); 2004 g_signal_emit_by_name(api, "error", error);
1995 g_error_free(error); 2005 g_error_free(error);
1996 } 2006 }
1997 2007
1998 static void 2008 static void
1999 fb_api_cb_attach(G_GNUC_UNUSED SoupSession *session, SoupMessage *res, 2009 fb_api_cb_attach(GObject *source, GAsyncResult *result, gpointer data) {
2000 gpointer data) 2010 SoupSession *session = SOUP_SESSION(source);
2001 { 2011 SoupMessage *soupmsg = data;
2012 FbApi *api = g_object_get_data(G_OBJECT(soupmsg), "facebook-api");
2002 const gchar *str; 2013 const gchar *str;
2003 FbApi *api = data;
2004 FbApiMessage *msg; 2014 FbApiMessage *msg;
2005 FbJsonValues *values; 2015 FbJsonValues *values;
2006 gchar *name; 2016 gchar *name;
2007 GError *err = NULL; 2017 GError *err = NULL;
2008 GSList *msgs = NULL; 2018 GSList *msgs = NULL;
2009 guint i; 2019 guint i;
2010 JsonNode *root; 2020 JsonNode *root;
2011 2021
2012 static const gchar *imgexts[] = {".jpg", ".png", ".gif"}; 2022 static const gchar *imgexts[] = {".jpg", ".png", ".gif"};
2013 2023
2014 if (!fb_api_http_chk(api, res, &root)) { 2024 if (!fb_api_http_chk(api, session, result, soupmsg, &root)) {
2015 return; 2025 return;
2016 } 2026 }
2017 2027
2018 values = fb_json_values_new(root); 2028 values = fb_json_values_new(root);
2019 fb_json_values_add(values, FB_JSON_TYPE_STR, TRUE, "$.filename"); 2029 fb_json_values_add(values, FB_JSON_TYPE_STR, TRUE, "$.filename");
2024 g_object_unref(values); 2034 g_object_unref(values);
2025 json_node_free(root); 2035 json_node_free(root);
2026 return; 2036 return;
2027 ); 2037 );
2028 2038
2029 msg = g_object_steal_data(G_OBJECT(res), "fb-api-msg"); 2039 msg = g_object_steal_data(G_OBJECT(soupmsg), "fb-api-msg");
2030 str = fb_json_values_next_str(values, NULL); 2040 str = fb_json_values_next_str(values, NULL);
2031 name = g_ascii_strdown(str, -1); 2041 name = g_ascii_strdown(str, -1);
2032 2042
2033 for (i = 0; i < G_N_ELEMENTS(imgexts); i++) { 2043 for (i = 0; i < G_N_ELEMENTS(imgexts); i++) {
2034 if (g_str_has_suffix(name, imgexts[i])) { 2044 if (g_str_has_suffix(name, imgexts[i])) {
2064 g_object_set_data_full(G_OBJECT(http), "fb-api-msg", msg, 2074 g_object_set_data_full(G_OBJECT(http), "fb-api-msg", msg,
2065 (GDestroyNotify)fb_api_message_free); 2075 (GDestroyNotify)fb_api_message_free);
2066 } 2076 }
2067 2077
2068 static void 2078 static void
2069 fb_api_cb_auth(G_GNUC_UNUSED SoupSession *session, SoupMessage *res, 2079 fb_api_cb_auth(GObject *source, GAsyncResult *result, gpointer data) {
2070 gpointer data) 2080 SoupSession *session = SOUP_SESSION(source);
2071 { 2081 SoupMessage *soupmsg = data;
2072 FbApi *api = data; 2082 FbApi *api = g_object_get_data(G_OBJECT(soupmsg), "facebook-api");
2073 FbJsonValues *values; 2083 FbJsonValues *values;
2074 GError *err = NULL; 2084 GError *err = NULL;
2075 JsonNode *root; 2085 JsonNode *root;
2076 2086
2077 if (!fb_api_http_chk(api, res, &root)) { 2087 if (!fb_api_http_chk(api, session, result, soupmsg, &root)) {
2078 return; 2088 return;
2079 } 2089 }
2080 2090
2081 values = fb_json_values_new(root); 2091 values = fb_json_values_new(root);
2082 fb_json_values_add(values, FB_JSON_TYPE_STR, TRUE, "$.access_token"); 2092 fb_json_values_add(values, FB_JSON_TYPE_STR, TRUE, "$.access_token");
2131 2141
2132 return csum; 2142 return csum;
2133 } 2143 }
2134 2144
2135 static void 2145 static void
2136 fb_api_cb_contact(G_GNUC_UNUSED SoupSession *session, SoupMessage *res, 2146 fb_api_cb_contact(GObject *source, GAsyncResult *result, gpointer data) {
2137 gpointer data) 2147 SoupSession *session = SOUP_SESSION(source);
2138 { 2148 SoupMessage *soupmsg = data;
2149 FbApi *api = g_object_get_data(G_OBJECT(soupmsg), "facebook-api");
2139 const gchar *str; 2150 const gchar *str;
2140 FbApi *api = data;
2141 FbApiUser user; 2151 FbApiUser user;
2142 FbJsonValues *values; 2152 FbJsonValues *values;
2143 GError *err = NULL; 2153 GError *err = NULL;
2144 JsonNode *node; 2154 JsonNode *node;
2145 JsonNode *root; 2155 JsonNode *root;
2146 2156
2147 if (!fb_api_http_chk(api, res, &root)) { 2157 if (!fb_api_http_chk(api, session, result, soupmsg, &root)) {
2148 return; 2158 return;
2149 } 2159 }
2150 2160
2151 node = fb_json_node_get_nth(root, 0); 2161 node = fb_json_node_get_nth(root, 0);
2152 2162
2283 2293
2284 return users; 2294 return users;
2285 } 2295 }
2286 2296
2287 static void 2297 static void
2288 fb_api_cb_contacts(G_GNUC_UNUSED SoupSession *session, SoupMessage *res, 2298 fb_api_cb_contacts(GObject *source, GAsyncResult *result, gpointer data) {
2289 gpointer data) 2299 SoupSession *session = SOUP_SESSION(source);
2290 { 2300 SoupMessage *soupmsg = data;
2301 FbApi *api = g_object_get_data(G_OBJECT(soupmsg), "facebook-api");
2291 const gchar *cursor; 2302 const gchar *cursor;
2292 const gchar *delta_cursor; 2303 const gchar *delta_cursor;
2293 FbApi *api = data;
2294 FbJsonValues *values; 2304 FbJsonValues *values;
2295 gboolean complete; 2305 gboolean complete;
2296 gboolean is_delta; 2306 gboolean is_delta;
2297 GError *err = NULL; 2307 GError *err = NULL;
2298 GList *l; 2308 GList *l;
2299 GSList *users = NULL; 2309 GSList *users = NULL;
2300 JsonNode *root; 2310 JsonNode *root;
2301 JsonNode *croot; 2311 JsonNode *croot;
2302 JsonNode *node; 2312 JsonNode *node;
2303 2313
2304 if (!fb_api_http_chk(api, res, &root)) { 2314 if (!fb_api_http_chk(api, session, result, soupmsg, &root)) {
2305 return; 2315 return;
2306 } 2316 }
2307 2317
2308 croot = fb_json_node_get(root, "$.viewer.messenger_contacts.deltas", NULL); 2318 croot = fb_json_node_get(root, "$.viewer.messenger_contacts.deltas", NULL);
2309 is_delta = (croot != NULL); 2319 is_delta = (croot != NULL);
2595 g_object_unref(values); 2605 g_object_unref(values);
2596 return msgs; 2606 return msgs;
2597 } 2607 }
2598 2608
2599 static void 2609 static void
2600 fb_api_cb_unread_msgs(G_GNUC_UNUSED SoupSession *session, SoupMessage *res, 2610 fb_api_cb_unread_msgs(GObject *source, GAsyncResult *result, gpointer data) {
2601 gpointer data) 2611 SoupSession *session = SOUP_SESSION(source);
2602 { 2612 SoupMessage *soupmsg = data;
2613 FbApi *api = g_object_get_data(G_OBJECT(soupmsg), "facebook-api");
2603 const gchar *body; 2614 const gchar *body;
2604 const gchar *str; 2615 const gchar *str;
2605 FbApi *api = data;
2606 FbApiMessage *dmsg; 2616 FbApiMessage *dmsg;
2607 FbApiMessage msg; 2617 FbApiMessage msg;
2608 FbId id; 2618 FbId id;
2609 FbId tid; 2619 FbId tid;
2610 FbJsonValues *values; 2620 FbJsonValues *values;
2613 GSList *msgs = NULL; 2623 GSList *msgs = NULL;
2614 JsonNode *node; 2624 JsonNode *node;
2615 JsonNode *root; 2625 JsonNode *root;
2616 JsonNode *xode; 2626 JsonNode *xode;
2617 2627
2618 if (!fb_api_http_chk(api, res, &root)) { 2628 if (!fb_api_http_chk(api, session, result, soupmsg, &root)) {
2619 return; 2629 return;
2620 } 2630 }
2621 2631
2622 node = fb_json_node_get_nth(root, 0); 2632 node = fb_json_node_get_nth(root, 0);
2623 2633
2727 g_object_unref(values); 2737 g_object_unref(values);
2728 json_node_free(root); 2738 json_node_free(root);
2729 } 2739 }
2730 2740
2731 static void 2741 static void
2732 fb_api_cb_unread(G_GNUC_UNUSED SoupSession *session, SoupMessage *res, 2742 fb_api_cb_unread(GObject *source, GAsyncResult *result, gpointer data) {
2733 gpointer data) 2743 SoupSession *session = SOUP_SESSION(source);
2734 { 2744 SoupMessage *soupmsg = data;
2745 FbApi *api = g_object_get_data(G_OBJECT(soupmsg), "facebook-api");
2735 const gchar *id; 2746 const gchar *id;
2736 FbApi *api = data;
2737 FbJsonValues *values; 2747 FbJsonValues *values;
2738 GError *err = NULL; 2748 GError *err = NULL;
2739 gint64 count; 2749 gint64 count;
2740 JsonBuilder *bldr; 2750 JsonBuilder *bldr;
2741 JsonNode *root; 2751 JsonNode *root;
2742 2752
2743 if (!fb_api_http_chk(api, res, &root)) { 2753 if (!fb_api_http_chk(api, session, result, soupmsg, &root)) {
2744 return; 2754 return;
2745 } 2755 }
2746 2756
2747 values = fb_json_values_new(root); 2757 values = fb_json_values_new(root);
2748 fb_json_values_add(values, FB_JSON_TYPE_INT, TRUE, "$.unread_count"); 2758 fb_json_values_add(values, FB_JSON_TYPE_INT, TRUE, "$.unread_count");
2806 fb_api_http_query(api, FB_API_QUERY_THREADS, bldr, 2816 fb_api_http_query(api, FB_API_QUERY_THREADS, bldr,
2807 fb_api_cb_unread); 2817 fb_api_cb_unread);
2808 } 2818 }
2809 2819
2810 static void 2820 static void
2811 fb_api_cb_sticker(G_GNUC_UNUSED SoupSession *session, SoupMessage *res, 2821 fb_api_cb_sticker(GObject *source, GAsyncResult *result, gpointer data) {
2812 gpointer data) 2822 SoupSession *session = SOUP_SESSION(source);
2813 { 2823 SoupMessage *soupmsg = data;
2814 FbApi *api = data; 2824 FbApi *api = g_object_get_data(G_OBJECT(soupmsg), "facebook-api");
2815 FbApiMessage *msg; 2825 FbApiMessage *msg;
2816 FbJsonValues *values; 2826 FbJsonValues *values;
2817 GError *err = NULL; 2827 GError *err = NULL;
2818 GSList *msgs = NULL; 2828 GSList *msgs = NULL;
2819 JsonNode *node; 2829 JsonNode *node;
2820 JsonNode *root; 2830 JsonNode *root;
2821 2831
2822 if (!fb_api_http_chk(api, res, &root)) { 2832 if (!fb_api_http_chk(api, session, result, soupmsg, &root)) {
2823 return; 2833 return;
2824 } 2834 }
2825 2835
2826 node = fb_json_node_get_nth(root, 0); 2836 node = fb_json_node_get_nth(root, 0);
2827 values = fb_json_values_new(node); 2837 values = fb_json_values_new(node);
2833 g_object_unref(values); 2843 g_object_unref(values);
2834 json_node_free(root); 2844 json_node_free(root);
2835 return; 2845 return;
2836 ); 2846 );
2837 2847
2838 msg = g_object_steal_data(G_OBJECT(res), "fb-api-msg"); 2848 msg = g_object_steal_data(G_OBJECT(soupmsg), "fb-api-msg");
2839 msg->flags |= FB_API_MESSAGE_FLAG_IMAGE; 2849 msg->flags |= FB_API_MESSAGE_FLAG_IMAGE;
2840 msg->text = fb_json_values_next_str_dup(values, NULL); 2850 msg->text = fb_json_values_next_str_dup(values, NULL);
2841 msgs = g_slist_prepend(msgs, msg); 2851 msgs = g_slist_prepend(msgs, msg);
2842 2852
2843 g_signal_emit_by_name(api, "messages", msgs); 2853 g_signal_emit_by_name(api, "messages", msgs);
2935 g_object_unref(values); 2945 g_object_unref(values);
2936 return TRUE; 2946 return TRUE;
2937 } 2947 }
2938 2948
2939 static void 2949 static void
2940 fb_api_cb_thread(G_GNUC_UNUSED SoupSession *session, SoupMessage *res, 2950 fb_api_cb_thread(GObject *source, GAsyncResult *result, gpointer data) {
2941 gpointer data) 2951 SoupSession *session = SOUP_SESSION(source);
2942 { 2952 SoupMessage *soupmsg = data;
2943 FbApi *api = data; 2953 FbApi *api = g_object_get_data(G_OBJECT(soupmsg), "facebook-api");
2944 FbApiThread thrd; 2954 FbApiThread thrd;
2945 GError *err = NULL; 2955 GError *err = NULL;
2946 JsonNode *node; 2956 JsonNode *node;
2947 JsonNode *root; 2957 JsonNode *root;
2948 2958
2949 if (!fb_api_http_chk(api, res, &root)) { 2959 if (!fb_api_http_chk(api, session, result, soupmsg, &root)) {
2950 return; 2960 return;
2951 } 2961 }
2952 2962
2953 node = fb_json_node_get_nth(root, 0); 2963 node = fb_json_node_get_nth(root, 0);
2954 2964
2995 fb_json_bldr_add_str(bldr, "13", "false"); 3005 fb_json_bldr_add_str(bldr, "13", "false");
2996 fb_api_http_query(api, FB_API_QUERY_THREAD, bldr, fb_api_cb_thread); 3006 fb_api_http_query(api, FB_API_QUERY_THREAD, bldr, fb_api_cb_thread);
2997 } 3007 }
2998 3008
2999 static void 3009 static void
3000 fb_api_cb_thread_create(G_GNUC_UNUSED SoupSession *session, SoupMessage *res, 3010 fb_api_cb_thread_create(GObject *source, GAsyncResult *result, gpointer data) {
3001 gpointer data) 3011 SoupSession *session = SOUP_SESSION(source);
3002 { 3012 SoupMessage *soupmsg = data;
3013 FbApi *api = g_object_get_data(G_OBJECT(soupmsg), "facebook-api");
3003 const gchar *str; 3014 const gchar *str;
3004 FbApi *api = data;
3005 FbId tid; 3015 FbId tid;
3006 FbJsonValues *values; 3016 FbJsonValues *values;
3007 GError *err = NULL; 3017 GError *err = NULL;
3008 JsonNode *root; 3018 JsonNode *root;
3009 3019
3010 if (!fb_api_http_chk(api, res, &root)) { 3020 if (!fb_api_http_chk(api, session, result, soupmsg, &root)) {
3011 return; 3021 return;
3012 } 3022 }
3013 3023
3014 values = fb_json_values_new(root); 3024 values = fb_json_values_new(root);
3015 fb_json_values_add(values, FB_JSON_TYPE_STR, TRUE, "$.id"); 3025 fb_json_values_add(values, FB_JSON_TYPE_STR, TRUE, "$.id");
3125 "messaging.setthreadname", prms, 3135 "messaging.setthreadname", prms,
3126 fb_api_cb_http_bool); 3136 fb_api_cb_http_bool);
3127 } 3137 }
3128 3138
3129 static void 3139 static void
3130 fb_api_cb_threads(G_GNUC_UNUSED SoupSession *session, SoupMessage *res, 3140 fb_api_cb_threads(GObject *source, GAsyncResult *result, gpointer data) {
3131 gpointer data) 3141 SoupSession *session = SOUP_SESSION(source);
3132 { 3142 SoupMessage *soupmsg = data;
3133 FbApi *api = data; 3143 FbApi *api = g_object_get_data(G_OBJECT(soupmsg), "facebook-api");
3134 FbApiThread *dthrd; 3144 FbApiThread *dthrd;
3135 FbApiThread thrd; 3145 FbApiThread thrd;
3136 GError *err = NULL; 3146 GError *err = NULL;
3137 GList *elms; 3147 GList *elms;
3138 GList *l; 3148 GList *l;
3139 GSList *thrds = NULL; 3149 GSList *thrds = NULL;
3140 JsonArray *arr; 3150 JsonArray *arr;
3141 JsonNode *root; 3151 JsonNode *root;
3142 3152
3143 if (!fb_api_http_chk(api, res, &root)) { 3153 if (!fb_api_http_chk(api, session, result, soupmsg, &root)) {
3144 return; 3154 return;
3145 } 3155 }
3146 3156
3147 arr = fb_json_node_get_arr(root, "$.viewer.message_threads.nodes", 3157 arr = fb_json_node_get_arr(root, "$.viewer.message_threads.nodes",
3148 &err); 3158 &err);

mercurial