static void run_scheduler (GrssFeedsPool *pool) { int interval; int min_interval; GList *iter; GrssFeedChannelWrap *feed; if (pool->priv->feeds_list == NULL) return; min_interval = G_MAXINT; for (iter = pool->priv->feeds_list; iter; iter = g_list_next (iter)) { feed = (GrssFeedChannelWrap*) iter->data; interval = grss_feed_channel_get_update_interval (feed->channel); if (interval == 0) { interval = 30; grss_feed_channel_set_update_interval (feed->channel, interval); } if (min_interval > interval) min_interval = interval; feed->next_fetch = 0; } pool->priv->scheduler = g_timeout_add_seconds (min_interval * 60, fetch_feeds, pool); fetch_feeds (pool); }
int main () { register int i; gchar *example_feeds [] = { "http://rss.slashdot.org/Slashdot/slashdot", "http://planet.gnome.org/atom.xml", "http://news.gnome.org/atom.xml", "http://lwn.net/headlines/rss", NULL }; GList *iter; GList *list; GrssFeedChannel *feed; GrssFeedsPool *pool; list = NULL; for (i = 0; example_feeds [i] != NULL; i++) { feed = grss_feed_channel_new (); grss_feed_channel_set_source (feed, example_feeds [i]); grss_feed_channel_set_update_interval (feed, i + 1); list = g_list_prepend (list, feed); } list = g_list_reverse (list); pool = grss_feeds_pool_new (); grss_feeds_pool_listen (pool, list); grss_feeds_pool_switch (pool, TRUE); g_signal_connect (pool, "feed-ready", G_CALLBACK (feed_fetched), NULL); g_main_run (g_main_loop_new (NULL, FALSE)); for (iter = list; iter; iter = g_list_next (iter)) g_object_unref (iter->data); g_object_unref (pool); exit (0); }
static void parse_channel (FeedRssHandler *parser, GrssFeedChannel *feed, xmlDocPtr doc, xmlNodePtr cur) { gchar *tmp; time_t t; g_assert (NULL != cur); cur = cur->xmlChildrenNode; while (cur) { if (cur->type != XML_ELEMENT_NODE || cur->name == NULL) { cur = cur->next; continue; } /* check namespace of this tag */ if (cur->ns) { if (ns_handler_channel (parser->priv->handler, feed, cur)) { cur = cur->next; continue; } } if (!xmlStrcmp (cur->name, BAD_CAST"copyright")) { tmp = (gchar*) xmlNodeListGetString (doc, cur->xmlChildrenNode, 1); if (tmp) { grss_feed_channel_set_copyright (feed, tmp); g_free (tmp); } } else if (!xmlStrcmp (cur->name, BAD_CAST"webMaster") || !xmlStrcmp (cur->name, BAD_CAST"publisher")) { tmp = (gchar*) xmlNodeListGetString (doc, cur->xmlChildrenNode, 1); if (tmp) { grss_feed_channel_set_webmaster (feed, tmp); g_free (tmp); } } else if (!xmlStrcmp (cur->name, BAD_CAST"language")) { tmp = (gchar*) xmlNodeListGetString (doc, cur->xmlChildrenNode, 1); if (tmp) { grss_feed_channel_set_language (feed, tmp); g_free (tmp); } } else if (!xmlStrcmp (cur->name, BAD_CAST"managingEditor")) { tmp = (gchar*) xmlNodeListGetString (doc, cur->xmlChildrenNode, 1); if (tmp) { grss_feed_channel_set_editor (feed, tmp); g_free (tmp); } } else if (!xmlStrcmp (cur->name, BAD_CAST"lastBuildDate")) { tmp = (gchar*) xmlNodeListGetString (doc, cur->xmlChildrenNode, 1); if (tmp) { t = date_parse_RFC822 (tmp); grss_feed_channel_set_update_time (feed, t); g_free (tmp); } } else if (!xmlStrcmp (cur->name, BAD_CAST"generator")) { tmp = (gchar*) xmlNodeListGetString (doc, cur->xmlChildrenNode, 1); if (tmp) { grss_feed_channel_set_generator (feed, tmp); g_free (tmp); } } else if (!xmlStrcmp (cur->name, BAD_CAST"pubDate")) { if (NULL != (tmp = (gchar*) xmlNodeListGetString (doc, cur->xmlChildrenNode, 1))) { t = date_parse_RFC822 (tmp); grss_feed_channel_set_publish_time (feed, t); g_free (tmp); } } else if (!xmlStrcmp (cur->name, BAD_CAST"ttl")) { if (NULL != (tmp = (gchar*) xmlNodeListGetString (doc, cur->xmlChildrenNode, TRUE))) { grss_feed_channel_set_update_interval (feed, atoi (tmp)); g_free (tmp); } } else if (!xmlStrcmp (cur->name, BAD_CAST"title")) { if (NULL != (tmp = unhtmlize ((gchar*) xmlNodeListGetString (doc, cur->xmlChildrenNode, TRUE)))) { grss_feed_channel_set_title (feed, tmp); g_free (tmp); } } /* <alink> has been found at least in Xinhua News Agency RSS feeds */ else if (!xmlStrcmp (cur->name, BAD_CAST"link") || !xmlStrcmp (cur->name, BAD_CAST"alink")) { if (NULL != (tmp = unhtmlize ((gchar*) xmlNodeListGetString (doc, cur->xmlChildrenNode, TRUE)))) { grss_feed_channel_set_homepage (feed, tmp); g_free (tmp); } } else if (!xmlStrcmp (cur->name, BAD_CAST"description")) { tmp = (gchar*) xmlNodeListGetString (doc, cur->xmlChildrenNode, TRUE); if (tmp) { grss_feed_channel_set_description (feed, tmp); g_free (tmp); } } else if (!xmlStrcmp (cur->name, BAD_CAST"cloud")) { parse_rss_cloud (feed, cur); } cur = cur->next; } }