int main () { GError *error; GList *iter; GList *list; GrssFeedChannel *feed; GrssFeedItem *item; GrssFeedsPublisher *publisher; g_type_init (); list = NULL; feed = grss_feed_channel_new (); grss_feed_channel_set_title (feed, "Test Feed"); grss_feed_channel_set_homepage (feed, "http://example.com"); grss_feed_channel_set_description (feed, "A test feed"); grss_feed_channel_set_publish_time (feed, time (NULL)); item = grss_feed_item_new (feed); grss_feed_item_set_title (item, "A big news!"); grss_feed_item_set_description (item, "Something incredible happening!"); grss_feed_item_set_source (item, "http://slashdot.org"); list = g_list_prepend (list, item); item = grss_feed_item_new (feed); grss_feed_item_set_title (item, "libgrss released"); grss_feed_item_set_description (item, "A new version of the best Glib-based RSS management library has been released"); grss_feed_item_set_source (item, "http://live.gnome.org/Libgrss"); list = g_list_prepend (list, item); item = grss_feed_item_new (feed); grss_feed_item_set_title (item, "A new commit in libgrss"); grss_feed_item_set_description (item, "Some commit happens on libgrss git repository"); grss_feed_item_set_source (item, "http://git.gnome.org/browse/libgrss"); list = g_list_prepend (list, item); error = NULL; publisher = grss_feeds_publisher_new (); if (grss_feeds_publisher_publish_file (publisher, feed, list, "file:///tmp/test.xml", &error) == FALSE) { printf ("Unable to write file: %s\n", error->message); g_error_free (error); } for (iter = list; iter; iter = g_list_next (iter)) g_object_unref (iter->data); g_list_free (list); g_object_unref (feed); exit (0); }
static GrssFeedItem* parse_rss_item (FeedRssHandler *parser, GrssFeedChannel *feed, xmlDocPtr doc, xmlNodePtr cur) { gchar *tmp; gchar *tmp2; gchar *tmp3; time_t t; GrssFeedItem *item; g_assert (cur != NULL); item = grss_feed_item_new (feed); /* try to get an item about id */ tmp = (gchar*) xmlGetProp (cur, BAD_CAST"about"); if (tmp) { grss_feed_item_set_id (item, tmp); grss_feed_item_set_source (item, tmp); g_free (tmp); } cur = cur->xmlChildrenNode; while (cur) { if (cur->type != XML_ELEMENT_NODE || !cur->name) { cur = cur->next; continue; } /* check namespace of this tag */ if (cur->ns) { if (ns_handler_item (parser->priv->handler, item, cur)) { cur = cur->next; continue; } } if (!xmlStrcmp (cur->name, BAD_CAST"category")) { tmp = (gchar*) xmlNodeListGetString (doc, cur->xmlChildrenNode, 1); if (tmp) { grss_feed_item_add_category (item, tmp); g_free (tmp); } } else if (!xmlStrcmp (cur->name, BAD_CAST"author")) { tmp = (gchar*) xmlNodeListGetString (doc, cur->xmlChildrenNode, 1); if (tmp) { grss_feed_item_set_author (item, tmp); g_free (tmp); } } else if (!xmlStrcmp (cur->name, BAD_CAST"comments")) { tmp = (gchar*) xmlNodeListGetString (doc, cur->xmlChildrenNode, 1); if (tmp) { grss_feed_item_set_comments_url (item, tmp); g_free (tmp); } } else if (!xmlStrcmp (cur->name, BAD_CAST"pubDate")) { tmp = (gchar*) xmlNodeListGetString (doc, cur->xmlChildrenNode, 1); if (tmp) { t = date_parse_RFC822 (tmp); grss_feed_item_set_publish_time (item, t); g_free (tmp); } } else if (!xmlStrcmp (cur->name, BAD_CAST"enclosure")) { /* RSS 0.93 allows multiple enclosures */ tmp = (gchar*) xmlGetProp (cur, BAD_CAST"url"); if (tmp) { gchar *type = (gchar*) xmlGetProp (cur, BAD_CAST"type"); gssize length = 0; GrssFeedEnclosure *enclosure; tmp2 = (gchar*) xmlGetProp (cur, BAD_CAST"length"); if (tmp2) { length = atol (tmp2); xmlFree (tmp2); } tmp3 = (gchar*) grss_feed_channel_get_homepage (feed); if ((strstr (tmp, "://") == NULL) && (tmp3 != NULL) && (strstr (tmp3, "://") != NULL)) { /* add base URL if necessary and possible */ tmp2 = g_strdup_printf ("%s/%s", tmp3, tmp); xmlFree (tmp); tmp = tmp2; } enclosure = grss_feed_enclosure_new (tmp); grss_feed_enclosure_set_format (enclosure, type); grss_feed_enclosure_set_length (enclosure, length); grss_feed_item_add_enclosure (item, enclosure); xmlFree (tmp); xmlFree (type); } } else if (!xmlStrcmp (cur->name, BAD_CAST"guid")) { if (!grss_feed_item_get_id (item)) { tmp = (gchar*) xmlNodeListGetString (doc, cur->xmlChildrenNode, 1); if (tmp) { if (strlen (tmp) > 0) { grss_feed_item_set_id (item, tmp); tmp2 = (gchar*) xmlGetProp (cur, BAD_CAST"isPermaLink"); if (!grss_feed_item_get_source (item) && (tmp2 == NULL || g_str_equal (tmp2, "true"))) grss_feed_item_set_source (item, tmp); /* Per the RSS 2.0 spec. */ if (tmp2) xmlFree (tmp2); } xmlFree (tmp); } } } else if (!xmlStrcmp (cur->name, BAD_CAST"title")) { tmp = unhtmlize ((gchar*) xmlNodeListGetString (doc, cur->xmlChildrenNode, TRUE)); if (tmp) { grss_feed_item_set_title (item, tmp); g_free (tmp); } } else if (!xmlStrcmp (cur->name, BAD_CAST"link")) { tmp = unhtmlize ((gchar*) xmlNodeListGetString (doc, cur->xmlChildrenNode, TRUE)); if (tmp) { grss_feed_item_set_source (item, tmp); g_free (tmp); } } else if (!xmlStrcmp (cur->name, BAD_CAST"description")) { tmp = xhtml_extract (cur, 0, NULL); if (tmp) { /* don't overwrite content:encoded descriptions... */ if (!grss_feed_item_get_description (item)) grss_feed_item_set_description (item, tmp); g_free (tmp); } } else if (!xmlStrcmp (cur->name, BAD_CAST"source")) { tmp = (gchar*) xmlGetProp (cur, BAD_CAST"url"); tmp2 = unhtmlize ((gchar*) xmlNodeListGetString (doc, cur->xmlChildrenNode, 1)); if (tmp) { grss_feed_item_set_real_source (item, g_strchomp (tmp), tmp2 ? g_strchomp (tmp2) : NULL); g_free (tmp); } if (tmp2) g_free (tmp2); } cur = cur->next; } return item; }