[evolution-rss] use xml:base when resolving links if feed provides it
- From: Lucian Langa <lucilanga src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-rss] use xml:base when resolving links if feed provides it
- Date: Thu, 1 Jul 2010 18:46:17 +0000 (UTC)
commit 705efd3a70cc871c9302ecd9b5d2be3bcd88d3b5
Author: Lucian Langa <lucilanga gnome org>
Date: Thu Jul 1 21:45:02 2010 +0300
use xml:base when resolving links if feed provides it
src/parser.c | 44 +++++++++++++++++++++-----------------------
src/parser.h | 2 +-
src/rss.h | 1 +
3 files changed, 23 insertions(+), 24 deletions(-)
---
diff --git a/src/parser.c b/src/parser.c
index f27f10c..9368c74 100644
--- a/src/parser.c
+++ b/src/parser.c
@@ -710,20 +710,22 @@ tree_walk (xmlNodePtr root, RDF *r)
{
xmlNodePtr walk;
xmlNodePtr rewalk = root;
- xmlNodePtr channel = NULL;
- xmlNodePtr image = NULL;
+ xmlNodePtr channel = NULL, image = NULL, link = NULL;
GArray *item = g_array_new (TRUE, TRUE, sizeof (xmlNodePtr));
gchar *t;
gchar *charset;
gchar *md2, *tmp, *ver;
- /* check in-memory encoding first, fallback to transport encoding, which may or may not be correct */
+ /* check in-memory encoding first,
+ * fallback to transport encoding, which may or may not be correct
+ */
if (r->cache->charset == XML_CHAR_ENCODING_UTF8
|| r->cache->charset == XML_CHAR_ENCODING_ASCII) {
charset = NULL;
} else {
/* bad/missing encoding, fallback to latin1 (locale?) */
- charset = r->cache->encoding ? (gchar *)r->cache->encoding : (gchar *)"iso-8859-1";
+ charset = r->cache->encoding ?
+ (gchar *)r->cache->encoding : (gchar *)"iso-8859-1";
}
do {
@@ -735,18 +737,15 @@ tree_walk (xmlNodePtr root, RDF *r)
printf ("%p, %s\n", walk, walk->name);
#endif
if (strcasecmp ((char *)walk->name, "rdf") == 0) {
-// xmlNode *node = walk;
rewalk = walk->children;
walk = walk->next;
if (!r->type)
r->type = g_strdup("RDF");
r->type_id = RDF_FEED;
-// gchar *ver = xmlGetProp(node, "version");
if (r->version)
g_free(r->version);
r->version = g_strdup("(RSS 1.0)");
-// if (ver)
-// xmlFree(ver);
+ r->base = (gchar *)xmlGetProp(walk, (xmlChar *)"base");
continue;
}
if (strcasecmp ((char *)walk->name, "rss") == 0){
@@ -762,6 +761,7 @@ tree_walk (xmlNodePtr root, RDF *r)
r->version = g_strdup(ver);
if (ver)
xmlFree(ver);
+ r->base = (gchar *)xmlGetProp(node, (xmlChar *)"base");
continue;
}
if (strcasecmp ((char *)walk->name, "feed") == 0) {
@@ -780,6 +780,7 @@ tree_walk (xmlNodePtr root, RDF *r)
g_free(r->version);
r->version = g_strdup("1.0");
}
+ r->base = (gchar *)xmlGetProp(walk, (xmlChar *)"base");
}
/* This is the channel top level */
@@ -809,19 +810,10 @@ tree_walk (xmlNodePtr root, RDF *r)
fprintf(stderr, "ERROR:No channel definition.\n");
return NULL;
}
-// gchar *server = get_server_from_uri(r->uri);
-// gchar *fav = g_strconcat(server, "/favicon.ico", NULL);
-// g_free(server);
if (image != NULL)
r->image = (gchar *)layer_find(image->children, "url", NULL);
-// g_print("status image:%d\n", net_get_status(r->image, NULL));
-// if (404 == net_get_status(r->image, NULL))
-// r->image = NULL;
-
-// g_free(fav);
-
t = g_strdup(get_real_channel_name(r->uri, NULL));
//feed might be added with no validation
//so it could be named Untitled channel
@@ -897,7 +889,7 @@ process_images(gchar *text, gchar *link, gboolean decode, EMFormatHTML *format)
}
create_feed *
-parse_channel_line(xmlNode *top, gchar *feed_name, char *main_date, gchar **article_uid)
+parse_channel_line(xmlNode *top, gchar *feed_name, RDF *r, gchar **article_uid)
{
char *q = NULL;
char *b = NULL;
@@ -912,6 +904,12 @@ parse_channel_line(xmlNode *top, gchar *feed_name, char *main_date, gchar **arti
GList *category = NULL;
create_feed *CF;
GList *attachments = NULL;
+ gchar *base = NULL, *main_date = NULL;
+
+ if (r) {
+ base = r->base;
+ main_date = r->maindate;
+ }
//we have to free this somehow
//<link></link>
@@ -1059,7 +1057,7 @@ parse_channel_line(xmlNode *top, gchar *feed_name, char *main_date, gchar **arti
g_free(b);
if (feed_name) {
- gchar *buff = process_images(tmp, link, FALSE, NULL);
+ gchar *buff = process_images(tmp, base ? base : link, FALSE, NULL);
g_free(tmp);
b = buff;
} else
@@ -1113,7 +1111,6 @@ update_channel(RDF *r)
create_feed *CF;
gchar *chn_name = r->title;
gchar *url = r->uri;
- gchar *main_date = r->maindate;
GArray *item = r->item;
GtkWidget *progress = r->progress;
gchar *buf, *safes, *feed_dir, *feed_name;
@@ -1159,8 +1156,8 @@ update_channel(RDF *r)
r->uids = g_array_new(TRUE, TRUE, sizeof(gpointer));
}
- CF = parse_channel_line(el->children,
- feed_name, main_date, &article_uid);
+ CF = parse_channel_line(el->children, feed_name,
+ r, &article_uid);
g_array_append_val(r->uids, article_uid);
if (!CF) continue;
CF->feedid = g_strdup(buf);
@@ -1206,7 +1203,8 @@ update_channel(RDF *r)
if (mail_folder) {
if ((rf->import || feed_new)
&& (!rf->cancel && !rf->cancel_all && !rf->display_cancel)) {
- rss_select_folder((gchar *)camel_folder_get_full_name(mail_folder));
+ rss_select_folder(
+ (gchar *)camel_folder_get_full_name(mail_folder));
if (feed_new) feed_new = FALSE;
}
#if (DATASERVER_VERSION >= 2031001)
diff --git a/src/parser.h b/src/parser.h
index 10401ff..d81414f 100644
--- a/src/parser.h
+++ b/src/parser.h
@@ -47,7 +47,7 @@ xmlDoc *parse_html_sux (const char *buf, guint len);
xmlDoc *xml_parse_sux (const char *buf, int len);
create_feed *parse_channel_line(xmlNode *top,
gchar *feed_name,
- char *main_date,
+ RDF *r,
gchar **article_uid);
gchar *tree_walk (xmlNodePtr root, RDF *r);
xmlNode *html_find (xmlNode *node, gchar *match);
diff --git a/src/rss.h b/src/rss.h
index 7ea5d20..854efbd 100644
--- a/src/rss.h
+++ b/src/rss.h
@@ -68,6 +68,7 @@
#define NETWORK_TIMEOUT (180000)
typedef struct _RDF {
+ gchar *base;
char *uri;
char *html;
xmlDocPtr cache;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]