static void atom10_parse_feed_generator (xmlNodePtr cur, feedParserCtxtPtr ctxt, itemPtr ip, struct atom10ParserState *state) { gchar *ret, *version, *tmp = NULL, *uri; ret = unhtmlize ((gchar *)xmlNodeListGetString (cur->doc, cur->xmlChildrenNode, 1)); if (ret && ret[0] != '\0') { version = xml_get_ns_attribute (cur, "version", NULL); if (version) { tmp = g_strdup_printf ("%s %s", ret, version); g_free (ret); g_free (version); ret = tmp; } uri = xml_get_ns_attribute (cur, "uri", NULL); if (uri) { tmp = g_markup_printf_escaped ("<a href=\"%s\">%s</a>", uri, ret); g_free (uri); g_free (ret); ret = tmp; } ctxt->subscription->metadata = metadata_list_append (ctxt->subscription->metadata, "feedgenerator", tmp); } g_free (ret); }
/** * Parse Atom 1.0 text tags of all sorts. * * @param htmlified If set to 1, then HTML is returned. * When set to 0, All HTML tags are removed * * @returns an escaped version of a text construct. */ static gchar * atom10_parse_text_construct (xmlNodePtr cur, gboolean htmlified) { gchar *type, *tmp, *ret = NULL; /* determine encoding mode */ type = xml_get_ns_attribute (cur, "type", NULL); /* not sure what MIME types are necessary... */ /* This that need to be de-encoded and should not contain sub-tags.*/ if (!type || !strcmp(type, "text")) { ret = (gchar *)xmlNodeListGetString (cur->doc, cur->xmlChildrenNode, 1); if (ret) { g_strchug (g_strchomp (ret)); if (htmlified) { tmp = atom10_mark_up_text_content (ret); g_free (ret); ret = tmp; } } } else if (!strcmp(type, "html")) { ret = xhtml_extract (cur, 0, NULL); if (!htmlified) ret = unhtmlize (unxmlize (ret)); } else if (!strcmp (type, "xhtml")) { /* The spec says to show the contents of the div tag that MUST be present */ ret = xhtml_extract (cur, 2, NULL); if (!htmlified) ret = unhtmlize (ret); } else { /* Invalid Atom feed */ ret = g_strdup ("This attribute was invalidly specified in this Atom feed."); } g_free (type); return ret; }
static gchar * search_links (const gchar* data, gint linkType) { gchar *ptr; const gchar *tmp = data; gchar *result = NULL; gchar *res; gchar *tstr; gchar *endptr; while (1) { ptr = common_strcasestr (tmp, "<link"); if (!ptr) return NULL; endptr = strchr (ptr, '>'); if (!endptr) return NULL; *endptr = '\0'; tstr = g_strdup (ptr); *endptr = '>'; res = checkLinkRef (tstr, linkType); g_free (tstr); if (res) { result = res; break; /* deactivated as long as we support only subscribing to the first found link (BTW this code crashes on sites like Groklaw!) gchar* t; if(result == NULL) result = res; else { t = g_strdup_printf("%s\n%s", result, res); g_free(res); g_free(result); result = t; }*/ } tmp = endptr; } result = unhtmlize (result); /* URIs can contain escaped things.... All ampersands must be escaped, for example */ return result; }
static xmlEntityPtr xml_process_entities (void *ctxt, const xmlChar *name) { gchar *path; xmlEntityPtr entity; xmlEntityPtr found; xmlChar *tmp; static xmlDocPtr entities = NULL; entity = xmlGetPredefinedEntity (name); if (!entity) { if (!entities) { /* loading HTML entities from external DTD file */ entities = xmlNewDoc (BAD_CAST "1.0"); path = g_build_filename (g_get_user_data_dir (), PACKAGE, "/dtd/html.ent", NULL); xmlCreateIntSubset (entities, BAD_CAST "HTML entities", NULL, BAD_CAST path); g_free (path); entities->extSubset = xmlParseDTD (entities->intSubset->ExternalID, entities->intSubset->SystemID); } if (NULL != (found = xmlGetDocEntity (entities, name))) { /* returning as faked predefined entity... */ tmp = xmlStrdup (found->content); tmp = BAD_CAST unhtmlize ((gchar*) tmp); /* arghh ... slow... */ entity = (xmlEntityPtr) g_new0 (xmlEntity, 1); entity->type = XML_ENTITY_DECL; entity->name = name; entity->orig = NULL; entity->content = tmp; entity->length = g_utf8_strlen ((gchar*) tmp, -1); entity->etype = XML_INTERNAL_PREDEFINED_ENTITY; } } return entity; }
/* reads a PIE feed URL and returns a new channel structure (even if the feed could not be read) */ static void pie_parse(feedParserCtxtPtr ctxt, xmlNodePtr cur) { gchar *tmp2, *tmp = NULL, *tmp3; NsHandler *nsh; parseChannelTagFunc pf; while(TRUE) { if(xmlStrcmp(cur->name, BAD_CAST"feed")) { g_string_append(ctxt->feed->parseErrors, "<p>Could not find Atom/Echo/PIE header!</p>"); break; } /* parse feed contents */ cur = cur->xmlChildrenNode; while(cur) { if(!cur->name || cur->type != XML_ELEMENT_NODE) { cur = cur->next; continue; } /* check namespace of this tag */ if(cur->ns) { if((cur->ns->href && (nsh = (NsHandler *)g_hash_table_lookup(ns_pie_ns_uri_table, (gpointer)cur->ns->href))) || (cur->ns->prefix && (nsh = (NsHandler *)g_hash_table_lookup(pie_nstable, (gpointer)cur->ns->prefix)))) { pf = nsh->parseChannelTag; if(pf) (*pf)(ctxt, cur); cur = cur->next; continue; } else { /*g_print("unsupported namespace \"%s\"\n", cur->ns->prefix);*/ } } /* explicitly no following else !!! */ if(!xmlStrcmp(cur->name, BAD_CAST"title")) { tmp = unhtmlize(pie_parse_content_construct(cur)); if(tmp) { if(ctxt->title) g_free(ctxt->title); ctxt->title = tmp; } } else if(!xmlStrcmp(cur->name, BAD_CAST"link")) { tmp = xml_get_attribute (cur, "href"); if(tmp) { /* 0.3 link : rel, type and href attribute */ tmp2 = xml_get_attribute (cur, "rel"); if(tmp2 && g_str_equal(tmp2, "alternate")) subscription_set_homepage (ctxt->subscription, tmp); /* else FIXME: Maybe do something with other links? */ g_free(tmp2); g_free(tmp); } else { /* 0.2 link : element content is the link, or non-alternate link in 0.3 */ tmp = (gchar *)xmlNodeListGetString(ctxt->doc, cur->xmlChildrenNode, 1); if(tmp) { subscription_set_homepage (ctxt->subscription, tmp); g_free(tmp); } } /* parse feed author */ } else if(!xmlStrcmp(cur->name, BAD_CAST"author")) { /* parse feed author */ tmp = parseAuthor(cur); if(tmp) { ctxt->subscription->metadata = metadata_list_append(ctxt->subscription->metadata, "author", tmp); g_free(tmp); } } else if (!xmlStrcmp (cur->name, BAD_CAST"tagline")) { tmp = pie_parse_content_construct (cur); if (tmp) { metadata_list_set (&ctxt->subscription->metadata, "description", tmp); g_free (tmp); } } else if(!xmlStrcmp(cur->name, BAD_CAST"generator")) { tmp = unhtmlize((gchar *)xmlNodeListGetString(ctxt->doc, cur->xmlChildrenNode, 1)); if(tmp && tmp[0] != '\0') { tmp2 = xml_get_attribute (cur, "version"); if(tmp2) { tmp3 = g_strdup_printf("%s %s", tmp, tmp2); g_free(tmp); g_free(tmp2); tmp = tmp3; } tmp2 = xml_get_attribute (cur, "url"); if(tmp2) { tmp3 = g_strdup_printf("<a href=\"%s\">%s</a>", tmp2, tmp); g_free(tmp2); g_free(tmp); tmp = tmp3; } ctxt->subscription->metadata = metadata_list_append(ctxt->subscription->metadata, "feedgenerator", tmp); } g_free(tmp); } else if(!xmlStrcmp(cur->name, BAD_CAST"copyright")) { tmp = pie_parse_content_construct(cur); if(tmp) { ctxt->subscription->metadata = metadata_list_append(ctxt->subscription->metadata, "copyright", tmp); g_free(tmp); } } else if(!xmlStrcmp(cur->name, BAD_CAST"modified")) { /* Modified was last used in IETF draft 02) */ tmp = (gchar *)xmlNodeListGetString(ctxt->doc, cur->xmlChildrenNode, 1); if(tmp) { ctxt->subscription->metadata = metadata_list_append(ctxt->subscription->metadata, "pubDate", tmp); ctxt->feed->time = date_parse_ISO8601 (tmp); g_free(tmp); } } else if(!xmlStrcmp(cur->name, BAD_CAST"updated")) { /* Updated was added in IETF draft 03 */ tmp = (gchar *)xmlNodeListGetString(ctxt->doc, cur->xmlChildrenNode, 1); if(tmp) { ctxt->subscription->metadata = metadata_list_append(ctxt->subscription->metadata, "pubDate", tmp); ctxt->feed->time = date_parse_ISO8601 (tmp); g_free(tmp); } } else if(!xmlStrcmp(cur->name, BAD_CAST"contributor")) { tmp = parseAuthor(cur); if(tmp) { ctxt->subscription->metadata = metadata_list_append(ctxt->subscription->metadata, "contributor", tmp); g_free(tmp); } } else if((!xmlStrcmp(cur->name, BAD_CAST"entry"))) { ctxt->item = parseEntry(ctxt, cur); if(ctxt->item) { if(0 == ctxt->item->time) ctxt->item->time = ctxt->feed->time; ctxt->items = g_list_append(ctxt->items, ctxt->item); } } cur = cur->next; } break; } }
/* method to parse standard tags for each item element */ itemPtr parseEntry(feedParserCtxtPtr ctxt, xmlNodePtr cur) { xmlChar *xtmp; gchar *tmp2, *tmp; NsHandler *nsh; parseItemTagFunc pf; g_assert(NULL != cur); ctxt->item = item_new(); cur = cur->xmlChildrenNode; while(cur) { if(!cur->name) { g_warning("invalid XML: parser returns NULL value -> tag ignored!"); cur = cur->next; continue; } /* check namespace of this tag */ if(cur->ns) { if((cur->ns->href && (nsh = (NsHandler *)g_hash_table_lookup(ns_pie_ns_uri_table, (gpointer)cur->ns->href))) || (cur->ns->prefix && (nsh = (NsHandler *)g_hash_table_lookup(pie_nstable, (gpointer)cur->ns->prefix)))) { if(NULL != (pf = nsh->parseItemTag)) (*pf)(ctxt, cur); cur = cur->next; continue; } else { /*g_print("unsupported namespace \"%s\"\n", cur->ns->prefix);*/ } } /* explicitly no following else !!! */ if(!xmlStrcmp(cur->name, BAD_CAST"title")) { if(NULL != (tmp = unhtmlize(pie_parse_content_construct(cur)))) { item_set_title(ctxt->item, tmp); g_free(tmp); } } else if(!xmlStrcmp(cur->name, BAD_CAST"link")) { if(NULL != (tmp2 = xml_get_attribute(cur, "href"))) { /* 0.3 link : rel, type and href attribute */ xtmp = xmlGetProp(cur, BAD_CAST"rel"); if(xtmp != NULL && !xmlStrcmp(xtmp, BAD_CAST"alternate")) item_set_source(ctxt->item, tmp2); /* else FIXME: Maybe do something with other links? */ xmlFree(xtmp); g_free(tmp2); } else { /* 0.2 link : element content is the link, or non-alternate link in 0.3 */ if(NULL != (tmp = (gchar *)xmlNodeListGetString(ctxt->doc, cur->xmlChildrenNode, 1))) { item_set_source(ctxt->item, tmp); g_free(tmp); } } } else if(!xmlStrcmp(cur->name, BAD_CAST"author")) { /* parse feed author */ tmp = parseAuthor(cur); ctxt->item->metadata = metadata_list_append(ctxt->item->metadata, "author", tmp); g_free(tmp); } else if(!xmlStrcmp(cur->name, BAD_CAST"contributor")) { /* parse feed contributors */ tmp = parseAuthor(cur); ctxt->item->metadata = metadata_list_append(ctxt->item->metadata, "contributor", tmp); g_free(tmp); } else if(!xmlStrcmp(cur->name, BAD_CAST"id")) { if(NULL != (tmp = (gchar *)xmlNodeListGetString(ctxt->doc, cur->xmlChildrenNode, 1))) { item_set_id(ctxt->item, tmp); g_free(tmp); } } else if(!xmlStrcmp(cur->name, BAD_CAST"issued")) { /* FIXME: is <modified> or <issued> or <created> the time tag we want to display? */ if(NULL != (tmp = (gchar *)xmlNodeListGetString(ctxt->doc, cur->xmlChildrenNode, 1))) { ctxt->item->time = date_parse_ISO8601 (tmp); g_free(tmp); } } else if(!xmlStrcmp(cur->name, BAD_CAST"content")) { /* <content> support */ if(NULL != (tmp = pie_parse_content_construct(cur))) { item_set_description(ctxt->item, tmp); g_free(tmp); } } else if(!xmlStrcmp(cur->name, BAD_CAST"summary")) { /* <summary> can be used for short text descriptions, if there is no <content> description we show the <summary> content */ if(!item_get_description(ctxt->item)) { if(NULL != (tmp = pie_parse_content_construct(cur))) { item_set_description(ctxt->item, tmp); g_free(tmp); } } } else if(!xmlStrcmp(cur->name, BAD_CAST"copyright")) { if(NULL != (tmp = (gchar *)xmlNodeListGetString(ctxt->doc, cur->xmlChildrenNode, 1))) { ctxt->item->metadata = metadata_list_append(ctxt->item->metadata, "copyright", tmp); g_free(tmp); } } cur = cur->next; } /* after parsing we fill the infos into the itemPtr structure */ ctxt->item->readStatus = FALSE; return ctxt->item; }
/* method to parse standard tags for each item element */ itemPtr parseCDFItem(feedParserCtxtPtr ctxt, xmlNodePtr cur, CDFChannelPtr cp) { gchar *tmp = NULL, *tmp2, *tmp3; if(CDFToMetadataMapping == NULL) { CDFToMetadataMapping = g_hash_table_new(g_str_hash, g_str_equal); g_hash_table_insert(CDFToMetadataMapping, "author", "author"); g_hash_table_insert(CDFToMetadataMapping, "category", "category"); } ctxt->item = item_new(); /* save the item link */ if(!(tmp = (gchar *)xmlGetProp(cur, BAD_CAST"href"))) tmp = (gchar *)xmlGetProp(cur, BAD_CAST"HREF"); if(tmp) { item_set_source(ctxt->item, tmp); g_free(tmp); } cur = cur->xmlChildrenNode; while(cur) { if(!cur->name || cur->type != XML_ELEMENT_NODE) { cur = cur->next; continue; } /* save first link to a channel image */ if(NULL != (tmp = g_ascii_strdown((gchar *)cur->name, -1))) { if(NULL != (tmp2 = g_hash_table_lookup(CDFToMetadataMapping, tmp))) { if(NULL != (tmp3 = (gchar *)xmlNodeListGetString(cur->doc, cur->xmlChildrenNode, TRUE))) { ctxt->item->metadata = metadata_list_append(ctxt->item->metadata, tmp2, tmp3); g_free(tmp3); } } g_free(tmp); } if((!xmlStrcasecmp(cur->name, BAD_CAST"logo"))) { if(!(tmp = (gchar *)xmlGetProp(cur, BAD_CAST"href"))) tmp = (gchar *)xmlGetProp(cur, BAD_CAST"HREF"); if(tmp) { ctxt->item->metadata = metadata_list_append(ctxt->item->metadata, "imageUrl", tmp); g_free(tmp); } } else if((!xmlStrcasecmp(cur->name, BAD_CAST"title"))) { if(NULL != (tmp = unhtmlize((gchar *)xmlNodeListGetString(cur->doc, cur->xmlChildrenNode, 1)))) { item_set_title(ctxt->item, tmp); g_free(tmp); } } else if((!xmlStrcasecmp(cur->name, BAD_CAST"abstract"))) { if(NULL != (tmp = (gchar *)xmlNodeListGetString(cur->doc, cur->xmlChildrenNode, 1))) { item_set_description(ctxt->item, tmp); g_free(tmp); } } else if((!xmlStrcasecmp(cur->name, BAD_CAST"a"))) { if(!(tmp = (gchar *)xmlGetProp(cur, BAD_CAST"href"))) tmp = (gchar *)xmlGetProp(cur, BAD_CAST"HREF"); if(tmp) { item_set_source(ctxt->item, tmp); g_free(tmp); } } cur = cur->next; } ctxt->item->readStatus = FALSE; return ctxt->item; }
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; }
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; } }
/* method to parse standard tags for the channel element */ static void parseCDFChannel(feedParserCtxtPtr ctxt, xmlNodePtr cur, CDFChannelPtr cp) { gchar *tmp, *tmp2, *tmp3; cur = cur->xmlChildrenNode; while(cur) { if(!cur->name || cur->type != XML_ELEMENT_NODE) { cur = cur->next; continue; } if((!xmlStrcasecmp(cur->name, BAD_CAST"logo"))) { tmp = (gchar *)xmlGetProp(cur, BAD_CAST"HREF"); if(tmp) { tmp = (gchar *)xmlGetProp(cur, BAD_CAST"href"); metadata_list_set (&ctxt->subscription->metadata, "imageUrl", tmp); g_free(tmp); } } else if((!xmlStrcasecmp(cur->name, BAD_CAST"a"))) { xmlChar *value = xmlGetProp(cur, BAD_CAST"HREF"); if(value) { subscription_set_homepage (ctxt->subscription, (gchar *)value); xmlFree(value); } } else if((!xmlStrcasecmp(cur->name, BAD_CAST"item"))) { ctxt->item = parseCDFItem(ctxt, cur, cp); if(ctxt->item) { if(0 == ctxt->item->time) ctxt->item->time = cp->time; ctxt->items = g_list_append(ctxt->items, ctxt->item); } } else if(!xmlStrcasecmp(cur->name, BAD_CAST "title")) { tmp = (gchar *)xmlNodeListGetString(cur->doc, cur->xmlChildrenNode, TRUE); if(tmp) { tmp = unhtmlize(tmp); if(ctxt->title) g_free(ctxt->title); ctxt->title = tmp; } } else if (!xmlStrcasecmp(cur->name, BAD_CAST "abstract")) { tmp = (gchar *)xmlNodeListGetString (cur->doc, cur->xmlChildrenNode, TRUE); if (tmp) { metadata_list_set (&ctxt->subscription->metadata, "description", tmp); xmlFree (tmp); } } else { tmp = g_ascii_strdown((gchar *)cur->name, -1); tmp2 = g_hash_table_lookup(channelHash, tmp); if(tmp2) { tmp3 = (gchar *)xmlNodeListGetString(cur->doc, cur->xmlChildrenNode, TRUE); if(tmp3) { ctxt->subscription->metadata = metadata_list_append(ctxt->subscription->metadata, tmp2, tmp3); g_free(tmp3); } } g_free(tmp); } cur = cur->next; } }