static void theoldreader_source_check_node_for_removal (nodePtr node, gpointer user_data) { JsonArray *array = (JsonArray *)user_data; GList *iter, *elements; gboolean found = FALSE; if (IS_FOLDER (node)) { /* Auto-remove folders if they do not have children */ if (!node->children) feedlist_node_removed (node); node_foreach_child_data (node, theoldreader_source_check_node_for_removal, user_data); } else { elements = iter = json_array_get_elements (array); while (iter) { JsonNode *json_node = (JsonNode *)iter->data; if (g_str_equal (node->subscription->source, json_get_string (json_node, "url"))) { debug1 (DEBUG_UPDATE, "node: %s", node->subscription->source); found = TRUE; break; } iter = g_list_next (iter); } g_list_free (elements); if (!found) feedlist_node_removed (node); } }
void feedlist_remove_node (nodePtr node) { if (node->source->root != node) node_source_remove_node (node->source->root, node); else feedlist_node_removed (node); }
static void google_source_check_for_removal (nodePtr node, gpointer user_data) { gchar *expr = NULL; if (g_str_equal (node->subscription->source, GOOGLE_READER_BROADCAST_FRIENDS_URL)) return ; if (IS_FEED (node)) { expr = g_strdup_printf ("/object/list[@name='subscriptions']/object/string[@name='id'][. = 'feed/%s']", node->subscription->source); } else { g_warning ("opml_source_check_for_removal(): This should never happen..."); return; } if (!xpath_find ((xmlNodePtr)user_data, expr)) { debug1 (DEBUG_UPDATE, "removing %s...", node_get_title (node)); feedlist_node_removed (node); } else { debug1 (DEBUG_UPDATE, "keeping %s...", node_get_title (node)); } g_free (expr); }
static void theoldreader_source_check_for_removal (nodePtr node, gpointer user_data) { gchar *expr = NULL; if (IS_FEED (node)) { expr = g_strdup_printf ("/object/list[@name='subscriptions']/object/string[@name='id'][. = 'feed/%s']", node->subscription->source); } else if (IS_FOLDER (node)) { node_foreach_child_data (node, theoldreader_source_check_for_removal, user_data); expr = g_strdup_printf ("/object/list[@name='subscriptions']/object/list[@name='categories']/object[string='%s']", node->title); } else { g_warning ("theoldreader_source_check_for_removal(): This should never happen..."); return; } if (!xpath_find ((xmlNodePtr)user_data, expr)) { debug1 (DEBUG_UPDATE, "removing %s...", node_get_title (node)); feedlist_node_removed (node); } else { debug1 (DEBUG_UPDATE, "keeping %s...", node_get_title (node)); } g_free (expr); }
static void google_subscription_opml_cb (subscriptionPtr subscription, const struct updateResult * const result, updateFlags flags) { InoreaderSourcePtr source = (InoreaderSourcePtr) subscription->node->data; subscription->updateJob = NULL; // FIXME: the following code is very similar to ttrss! if (result->data && result->httpstatus == 200) { JsonParser *parser = json_parser_new (); if (json_parser_load_from_data (parser, result->data, -1, NULL)) { JsonArray *array = json_node_get_array (json_get_node (json_parser_get_root (parser), "subscriptions")); GList *iter, *elements; GSList *siter; /* We expect something like this: [{"id":"feed\/http:\/\/rss.slashdot.org\/Slashdot\/slashdot", "title":"Slashdot", "categories":[], "firstitemmsec":"1368112925514", "htmlUrl":"null"}, ... Note that the data doesn't contain an URL. We recover it from the id field. */ elements = iter = json_array_get_elements (array); /* Add all new nodes we find */ while (iter) { JsonNode *node = (JsonNode *)iter->data; /* ignore everything without a feed url */ if (json_get_string (node, "id")) { inoreader_source_merge_feed (source, json_get_string (node, "id") + 5, // FIXME: Unescape string! json_get_string (node, "title"), json_get_string (node, "id")); } iter = g_list_next (iter); } g_list_free (elements); /* Remove old nodes we cannot find anymore */ siter = source->root->children; while (siter) { nodePtr node = (nodePtr)siter->data; gboolean found = FALSE; elements = iter = json_array_get_elements (array); while (iter) { JsonNode *json_node = (JsonNode *)iter->data; // FIXME: Compare with unescaped string if (g_str_equal (node->subscription->source, json_get_string (json_node, "id") + 5)) { debug1 (DEBUG_UPDATE, "node: %s", node->subscription->source); found = TRUE; break; } iter = g_list_next (iter); } g_list_free (elements); if (!found) feedlist_node_removed (node); siter = g_slist_next (siter); } opml_source_export (subscription->node); /* save new feeds to feed list */ subscription->node->available = TRUE; //return; } else { g_warning ("Invalid JSON returned on Inoreader feed list request! >>>%s<<<", result->data); } g_object_unref (parser); } else { subscription->node->available = FALSE; debug0 (DEBUG_UPDATE, "inoreader_subscription_cb(): ERROR: failed to get subscription list!"); } if (!(flags & INOREADER_SOURCE_UPDATE_ONLY_LIST)) node_foreach_child_data (subscription->node, node_update_subscription, GUINT_TO_POINTER (0)); }
static void theoldreader_subscription_cb (subscriptionPtr subscription, const struct updateResult * const result, updateFlags flags) { TheOldReaderSourcePtr source = (TheOldReaderSourcePtr) subscription->node->data; debug1 (DEBUG_UPDATE,"theoldreader_subscription_cb(): %s", result->data); // FIXME: the following code is very similar to ttrss! if (result->data && result->httpstatus == 200) { JsonParser *parser = json_parser_new (); if (json_parser_load_from_data (parser, result->data, -1, NULL)) { JsonArray *array = json_node_get_array (json_get_node (json_parser_get_root (parser), "subscriptions")); GList *iter, *elements; GSList *siter; /* We expect something like this: [{"id":"feed/51d49b79d1716c7b18000025", "title":"LZone", "categories":[], "sortid":"51d49b79d1716c7b18000025", "firstitemmsec":"1371403150181", "url":"http://lzone.de/rss.xml", "htmlUrl":"http://lzone.de", "iconUrl":"http://s.yeoldereader.com/system/uploads/feed/picture/5152/884a/4dce/57aa/7e00/icon_0a6a.ico"}, ... */ elements = iter = json_array_get_elements (array); /* Add all new nodes we find */ while (iter) { JsonNode *node = (JsonNode *)iter->data; /* ignore everything without a feed url */ if (json_get_string (node, "url")) { theoldreader_source_merge_feed (source, json_get_string (node, "url"), json_get_string (node, "title"), json_get_string (node, "id")); } iter = g_list_next (iter); } g_list_free (elements); /* Remove old nodes we cannot find anymore */ siter = source->root->children; while (siter) { nodePtr node = (nodePtr)siter->data; gboolean found = FALSE; elements = iter = json_array_get_elements (array); while (iter) { JsonNode *json_node = (JsonNode *)iter->data; if (g_str_equal (node->subscription->source, json_get_string (json_node, "url"))) { debug1 (DEBUG_UPDATE, "node: %s", node->subscription->source); found = TRUE; break; } iter = g_list_next (iter); } g_list_free (elements); if (!found) feedlist_node_removed (node); siter = g_slist_next (siter); } opml_source_export (subscription->node); /* save new feeds to feed list */ subscription->node->available = TRUE; //return; } else { g_warning ("Invalid JSON returned on TheOldReader request! >>>%s<<<", result->data); } g_object_unref (parser); } else { subscription->node->available = FALSE; debug0 (DEBUG_UPDATE, "theoldreader_subscription_cb(): ERROR: failed to get subscription list!"); } if (!(flags & THEOLDREADER_SOURCE_UPDATE_ONLY_LIST)) node_foreach_child_data (subscription->node, node_update_subscription, GUINT_TO_POINTER (0)); }
static void default_source_remove_node (nodePtr node, nodePtr child) { /* The default source can always immediately serve remove requests. */ feedlist_node_removed (child); }