/* Start of author info for the feed found.
* Set correct location. */
ctx->location = FEED_LOC_ATOM10_AUTHOR;
+ } else if( !strcmp(el, "link") ) {
+ /* Link tag for the feed */
+ g_free(ctx->feed->link);
+ ctx->feed->link = g_strdup(feed_parser_get_attribute_value(attr, "href"));
} else ctx->location = FEED_LOC_ATOM10_NONE;
} else if( ctx->depth == 2 ) {
+ /* Make sure we are in one of known locations within the XML structure.
+ * This condition should never be true on a valid Atom feed. */
+ if (ctx->location != FEED_LOC_ATOM10_AUTHOR &&
+ ctx->location != FEED_LOC_ATOM10_ENTRY) {
+ ctx->depth++;
+ return;
+ }
+
if( !strcmp(el, "author") ) {
/* Start of author info for current feed item.
* Set correct location. */
{
FeedParserCtx *ctx = (FeedParserCtx *)data;
Feed *feed = ctx->feed;
- gchar *text = NULL;
+ gchar *text = NULL, *tmp;
if( ctx->str != NULL )
text = ctx->str->str;
else
text = "";
- ctx->depth--;
-
switch( ctx->depth ) {
case 0:
+ /* Just in case. */
+ break;
+
+ case 1:
if( !strcmp(el, "feed") ) {
/* We have finished parsing the feed, reverse the list
break;
- case 1:
+ case 2:
/* decide if we just received </entry>, so we can
* add a complete item to feed */
if( !strcmp(el, "entry") ) {
+ /* Fix up URL, if it is relative */
+ if (ctx->curitem->url != NULL &&
+ !strstr("://", ctx->curitem->url) &&
+ ctx->feed->link != NULL) {
+ tmp = g_strconcat(ctx->feed->link,
+ (ctx->curitem->url[0] == '/' ? "" : "/"),
+ ctx->curitem->url, NULL);
+ feed_item_set_url(ctx->curitem, tmp);
+ g_free(tmp);
+ }
+
/* append the complete feed item */
if( ctx->curitem->id && ctx->curitem->title
&& ctx->curitem->date_modified ) {
break;
- case 2:
+ case 3:
if( ctx->curitem == NULL )
break;
FILL(ctx->curitem->summary)
} else if( !strcmp(el, "content") ) {
if (!ctx->curitem->xhtml_content)
- FILL(ctx->curitem->text);
+ FILL(ctx->curitem->text)
} else if( !strcmp(el, "id") ) {
- FILL(ctx->curitem->id);
+ FILL(ctx->curitem->id)
feed_item_set_id_permalink(ctx->curitem, TRUE);
} else if( !strcmp(el, "published") ) {
ctx->curitem->date_published = parseISO8601Date(text);
!ctx->name && !ctx->mail ? "N/A" : "");
ctx->location = FEED_LOC_ATOM10_ENTRY;
} else if( !strcmp(el, "name") ) {
- FILL(feed->author);
+ FILL(feed->author)
}
break;
break;
- case 3:
+ case 4:
if( ctx->curitem == NULL )
break;
/* We're in feed/entry/author */
case FEED_LOC_ATOM10_AUTHOR:
if( !strcmp(el, "name") ) {
- FILL(ctx->name);
+ FILL(ctx->name)
} else if( !strcmp(el, "email") ) {
- FILL(ctx->mail);
+ FILL(ctx->mail)
}
break;
/* We're in feed/entry/source */
case FEED_LOC_ATOM10_SOURCE:
if( !strcmp(el, "title" ) ) {
- FILL(ctx->curitem->sourcetitle);
+ FILL(ctx->curitem->sourcetitle)
} else if( !strcmp(el, "id" ) ) {
- FILL(ctx->curitem->sourceid);
+ FILL(ctx->curitem->sourceid)
} else if( !strcmp(el, "updated" ) ) {
ctx->curitem->sourcedate = parseISO8601Date(text);
}
case FEED_LOC_ATOM10_CONTENT:
if (!strcmp(el, "div") && ctx->curitem->xhtml_content)
- FILL(ctx->curitem->text);
+ FILL(ctx->curitem->text)
break;
}
ctx->str = NULL;
}
ctx->str = NULL;
+
+ ctx->depth--;
}