From 44c5b5cb18a4c425fd5aad3484d4ac9ee8a3cf43 Mon Sep 17 00:00:00 2001 From: Wilfried Goesgens Date: Tue, 7 Sep 2010 22:59:33 +0200 Subject: [PATCH] * if we have a CDATA section assume its the message body. --- citadel/modules/rssclient/serv_rssclient.c | 40 ++++++++++++++++------ 1 file changed, 30 insertions(+), 10 deletions(-) diff --git a/citadel/modules/rssclient/serv_rssclient.c b/citadel/modules/rssclient/serv_rssclient.c index 404d879e7..50ab007f2 100644 --- a/citadel/modules/rssclient/serv_rssclient.c +++ b/citadel/modules/rssclient/serv_rssclient.c @@ -84,6 +84,7 @@ typedef struct _rss_item { int item_tag_nesting; char *author_or_creator; char *author_url; + StrBuf *CData; }rss_item; @@ -500,6 +501,7 @@ void flush_rss_ite(rss_item *ri) ri->chardata = 0; ri->chardata_len = 0; } + FreeStrBuf(&ri->CData); } void rss_xml_start(void *data, const char *supplied_el, const char **attr) { @@ -690,6 +692,19 @@ void rss_xml_end(void *data, const char *supplied_el) { /* * This callback stores up the data which appears in between tags. */ +void rss_xml_cdata_start(void *data) { + rsscollection *rssc = (rsscollection*) data; + rss_item *ri = rssc->Item; + + ri->CData = NewStrBuf(); +} + +void rss_xml_cdata_end(void *data) { + rsscollection *rssc = (rsscollection*) data; + rss_item *ri = rssc->Item; + + ri->description = SmashStrBuf(&ri->CData); +} void rss_xml_chardata(void *data, const XML_Char *s, int len) { rsscollection *rssc = (rsscollection*) data; rss_item *ri = rssc->Item; @@ -697,19 +712,21 @@ void rss_xml_chardata(void *data, const XML_Char *s, int len) { int new_len; char *new_buffer; - old_len = ri->chardata_len; - new_len = old_len + len; - new_buffer = realloc(ri->chardata, new_len + 1); - if (new_buffer != NULL) { - memcpy(&new_buffer[old_len], s, len); - new_buffer[new_len] = 0; - ri->chardata = new_buffer; - ri->chardata_len = new_len; + if (ri->CData != NULL) { + StrBufAppendBufPlain (ri->CData, s, len, 0); + } else { + old_len = ri->chardata_len; + new_len = old_len + len; + new_buffer = realloc(ri->chardata, new_len + 1); + if (new_buffer != NULL) { + memcpy(&new_buffer[old_len], s, len); + new_buffer[new_len] = 0; + ri->chardata = new_buffer; + ri->chardata_len = new_len; + } } } - - /* * Callback function for passing libcurl's output to expat for parsing */ @@ -785,6 +802,9 @@ void rss_do_fetching(rssnetcfg *Cfg) { XML_SetElementHandler(xp, rss_xml_start, rss_xml_end); XML_SetCharacterDataHandler(xp, rss_xml_chardata); XML_SetUserData(xp, &rssc); + XML_SetCdataSectionHandler(xp, + rss_xml_cdata_start, + rss_xml_cdata_end); if (CtdlThreadCheckStop()) { XML_ParserFree(xp); -- 2.39.2