X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fmodules%2Frssclient%2Frss_atom_parser.c;h=0c7290b5cc0857ce856d43a2ce614ca2eedb11aa;hb=00065577286d65a2ac21f4760190b963cde22a5e;hp=dd92e2d78b50ca0eb038a710c71549170e9eaa23;hpb=d2f099415dcc15ed038aa148701bcd05b8d2c965;p=citadel.git diff --git a/citadel/modules/rssclient/rss_atom_parser.c b/citadel/modules/rssclient/rss_atom_parser.c index dd92e2d78..0c7290b5c 100644 --- a/citadel/modules/rssclient/rss_atom_parser.c +++ b/citadel/modules/rssclient/rss_atom_parser.c @@ -1,21 +1,21 @@ /* * Bring external RSS feeds into rooms. * - * Copyright (c) 2007-2010 by the citadel.org team + * Copyright (c) 2007-2012 by the citadel.org team * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. + * This program is open source software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 3. + * + * * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * + * */ #include @@ -60,6 +60,29 @@ void rss_save_item(rss_item *ri, rss_aggregator *Cfg); +int RSSAtomParserDebugEnabled = 0; + +#define N ((rss_aggregator*)IO->Data)->QRnumber + +#define DBGLOG(LEVEL) if ((LEVEL != LOG_DEBUG) || (RSSAtomParserDebugEnabled != 0)) + +#define EVRSSATOM_syslog(LEVEL, FORMAT, ...) \ + DBGLOG(LEVEL) syslog(LEVEL, \ + "IO[%ld]CC[%d][%ld]RSSP" FORMAT, \ + IO->ID, CCID, N, __VA_ARGS__) + +#define EVRSSATOMM_syslog(LEVEL, FORMAT) \ + DBGLOG(LEVEL) syslog(LEVEL, \ + "IO[%ld]CC[%d][%ld]RSSP" FORMAT, \ + IO->ID, CCID, N) + +#define EVRSSATOMCS_syslog(LEVEL, FORMAT, ...) \ + DBGLOG(LEVEL) syslog(LEVEL, "IO[%ld][%ld]RSSP" FORMAT, \ + IO->ID, N, __VA_ARGS__) + +#define EVRSSATOMSM_syslog(LEVEL, FORMAT) \ + DBGLOG(LEVEL) syslog(LEVEL, "IO[%ld][%ld]RSSP" FORMAT, \ + IO->ID, N) /* * Convert an RDF/RSS datestamp into a time_t @@ -119,44 +142,65 @@ void flush_rss_item(rss_item *ri) } -/******************************************************************************* - * XML-Handler * - *******************************************************************************/ +/****************************************************************************** + * XML-Handler * + ******************************************************************************/ -void RSS_item_rss_start (StrBuf *CData, rss_item *ri, rss_aggregator *Cfg, const char** Attr) +void RSS_item_rss_start (StrBuf *CData, + rss_item *ri, + rss_aggregator *RSSAggr, + const char** Attr) { - syslog(LOG_DEBUG, "RSS: This is an RSS feed.\n"); - Cfg->ItemType = RSS_RSS; + AsyncIO *IO = &RSSAggr->IO; + EVRSSATOMM_syslog(LOG_DEBUG, "RSS: This is an RSS feed.\n"); + RSSAggr->ItemType = RSS_RSS; } -void RSS_item_rdf_start(StrBuf *CData, rss_item *ri, rss_aggregator *Cfg, const char** Attr) +void RSS_item_rdf_start(StrBuf *CData, + rss_item *ri, + rss_aggregator *RSSAggr, + const char** Attr) { - syslog(LOG_DEBUG, "RSS: This is an RDF feed.\n"); - Cfg->ItemType = RSS_RSS; + AsyncIO *IO = &RSSAggr->IO; + EVRSSATOMM_syslog(LOG_DEBUG, "RSS: This is an RDF feed.\n"); + RSSAggr->ItemType = RSS_RSS; } -void ATOM_item_feed_start(StrBuf *CData, rss_item *ri, rss_aggregator *Cfg, const char** Attr) +void ATOM_item_feed_start(StrBuf *CData, + rss_item *ri, + rss_aggregator *RSSAggr, + const char** Attr) { - syslog(LOG_DEBUG, "RSS: This is an ATOM feed.\n"); - Cfg->ItemType = RSS_ATOM; + AsyncIO *IO = &RSSAggr->IO; + EVRSSATOMM_syslog(LOG_DEBUG, "RSS: This is an ATOM feed.\n"); + RSSAggr->ItemType = RSS_ATOM; } -void RSS_item_item_start(StrBuf *CData, rss_item *ri, rss_aggregator *Cfg, const char** Attr) +void RSS_item_item_start(StrBuf *CData, + rss_item *ri, + rss_aggregator *RSSAggr, + const char** Attr) { ri->item_tag_nesting ++; flush_rss_item(ri); } -void ATOM_item_entry_start(StrBuf *CData, rss_item *ri, rss_aggregator *Cfg, const char** Attr) +void ATOM_item_entry_start(StrBuf *CData, + rss_item *ri, + rss_aggregator *RSSAggr, + const char** Attr) { /* Atom feed... */ ri->item_tag_nesting ++; flush_rss_item(ri); } -void ATOM_item_link_start (StrBuf *CData, rss_item *ri, rss_aggregator *Cfg, const char** Attr) +void ATOM_item_link_start (StrBuf *CData, + rss_item *ri, + rss_aggregator *RSSAggr, + const char** Attr) { int i; const char *pHref = NULL; @@ -186,20 +230,28 @@ void ATOM_item_link_start (StrBuf *CData, rss_item *ri, rss_aggregator *Cfg, con if (pHref == NULL) return; /* WHUT? Pointing... where? */ if ((pType != NULL) && !strcasecmp(pType, "application/atom+xml")) - return; /* these just point to other rss resources, we're not interested in them. */ + return; + /* these just point to other rss resources, + we're not interested in them. */ if (pRel != NULL) { if (!strcasecmp (pRel, "replies")) { NewStrBufDupAppendFlush(&ri->reLink, NULL, pHref, -1); StrBufTrim(ri->link); - NewStrBufDupAppendFlush(&ri->reLinkTitle, NULL, pTitle, -1); + NewStrBufDupAppendFlush(&ri->reLinkTitle, + NULL, + pTitle, + -1); } - else if (!strcasecmp(pRel, "alternate")) /* Alternative representation of this Item... */ - { + else if (!strcasecmp(pRel, "alternate")) + { /* Alternative representation of this Item... */ NewStrBufDupAppendFlush(&ri->link, NULL, pHref, -1); StrBufTrim(ri->link); - NewStrBufDupAppendFlush(&ri->linkTitle, NULL, pTitle, -1); + NewStrBufDupAppendFlush(&ri->linkTitle, + NULL, + pTitle, + -1); } #if 0 /* these are also defined, but dunno what to do with them.. */ @@ -210,7 +262,7 @@ void ATOM_item_link_start (StrBuf *CData, rss_item *ri, rss_aggregator *Cfg, con { } else if (!strcasecmp(pRel, "enclosure")) - {/* this reference can get big, and is probably the full article... */ + {/*...reference can get big, and is probably the full article*/ } else if (!strcasecmp(pRel, "via")) {/* this article was provided via... */ @@ -228,7 +280,10 @@ void ATOM_item_link_start (StrBuf *CData, rss_item *ri, rss_aggregator *Cfg, con -void ATOMRSS_item_title_end(StrBuf *CData, rss_item *ri, rss_aggregator *Cfg, const char** Attr) +void ATOMRSS_item_title_end(StrBuf *CData, + rss_item *ri, + rss_aggregator *RSSAggr, + const char** Attr) { if ((ri->item_tag_nesting == 0) && (StrLength(CData) > 0)) { NewStrBufDupAppendFlush(&ri->channel_title, CData, NULL, 0); @@ -236,14 +291,18 @@ void ATOMRSS_item_title_end(StrBuf *CData, rss_item *ri, rss_aggregator *Cfg, co } } -void RSS_item_guid_end(StrBuf *CData, rss_item *ri, rss_aggregator *Cfg, const char** Attr) +void RSS_item_guid_end(StrBuf *CData, + rss_item *ri, + rss_aggregator *RSSAggr, + const char** Attr) { if (StrLength(CData) > 0) { NewStrBufDupAppendFlush(&ri->guid, CData, NULL, 0); } } -void ATOM_item_id_end(StrBuf *CData, rss_item *ri, rss_aggregator *Cfg, const char** Attr) +void ATOM_item_id_end(StrBuf *CData, + rss_item *ri, rss_aggregator *RSSAggr, const char** Attr) { if (StrLength(CData) > 0) { NewStrBufDupAppendFlush(&ri->guid, CData, NULL, 0); @@ -251,14 +310,20 @@ void ATOM_item_id_end(StrBuf *CData, rss_item *ri, rss_aggregator *Cfg, const ch } -void RSS_item_link_end (StrBuf *CData, rss_item *ri, rss_aggregator *Cfg, const char** Attr) +void RSS_item_link_end (StrBuf *CData, + rss_item *ri, + rss_aggregator *RSSAggr, + const char** Attr) { if (StrLength(CData) > 0) { NewStrBufDupAppendFlush(&ri->link, CData, NULL, 0); StrBufTrim(ri->link); } } -void RSS_item_relink_end(StrBuf *CData, rss_item *ri, rss_aggregator *Cfg, const char** Attr) +void RSS_item_relink_end(StrBuf *CData, + rss_item *ri, + rss_aggregator *RSSAggr, + const char** Attr) { if (StrLength(CData) > 0) { NewStrBufDupAppendFlush(&ri->reLink, CData, NULL, 0); @@ -266,7 +331,10 @@ void RSS_item_relink_end(StrBuf *CData, rss_item *ri, rss_aggregator *Cfg, const } } -void RSSATOM_item_title_end (StrBuf *CData, rss_item *ri, rss_aggregator *Cfg, const char** Attr) +void RSSATOM_item_title_end (StrBuf *CData, + rss_item *ri, + rss_aggregator *RSSAggr, + const char** Attr) { if (StrLength(CData) > 0) { NewStrBufDupAppendFlush(&ri->title, CData, NULL, 0); @@ -274,26 +342,42 @@ void RSSATOM_item_title_end (StrBuf *CData, rss_item *ri, rss_aggregator *Cfg, c } } -void ATOM_item_content_end (StrBuf *CData, rss_item *ri, rss_aggregator *Cfg, const char** Attr) +void ATOM_item_content_end (StrBuf *CData, + rss_item *ri, + rss_aggregator *RSSAggr, + const char** Attr) { long olen = StrLength (ri->description); long clen = StrLength (CData); - if (clen > 0) + if (clen > 0) { if (olen == 0) { - NewStrBufDupAppendFlush(&ri->description, CData, NULL, 0); + NewStrBufDupAppendFlush(&ri->description, + CData, + NULL, + 0); StrBufTrim(ri->description); } else if (olen < clen) { FlushStrBuf(ri->description); - NewStrBufDupAppendFlush(&ri->description, CData, NULL, 0); + NewStrBufDupAppendFlush(&ri->description, + CData, + NULL, + 0); + StrBufTrim(ri->description); } } } -void ATOM_item_summary_end (StrBuf *CData, rss_item *ri, rss_aggregator *Cfg, const char** Attr) +void ATOM_item_summary_end (StrBuf *CData, + rss_item *ri, + rss_aggregator *RSSAggr, + const char** Attr) { - /* this can contain an abstract of the article. but we don't want to verwrite a full document if we already have it. */ + /* + * this can contain an abstract of the article. + * but we don't want to verwrite a full document if we already have it. + */ if ((StrLength(CData) > 0) && (StrLength(ri->description) == 0)) { NewStrBufDupAppendFlush(&ri->description, CData, NULL, 0); @@ -301,33 +385,48 @@ void ATOM_item_summary_end (StrBuf *CData, rss_item *ri, rss_aggregator *Cfg, co } } -void RSS_item_description_end (StrBuf *CData, rss_item *ri, rss_aggregator *Cfg, const char** Attr) +void RSS_item_description_end (StrBuf *CData, + rss_item *ri, + rss_aggregator *RSSAggr, + const char** Attr) { long olen = StrLength (ri->description); long clen = StrLength (CData); - if (clen > 0) + if (clen > 0) { if (olen == 0) { - NewStrBufDupAppendFlush(&ri->description, CData, NULL, 0); + NewStrBufDupAppendFlush(&ri->description, + CData, + NULL, + 0); StrBufTrim(ri->description); } else if (olen < clen) { FlushStrBuf(ri->description); - NewStrBufDupAppendFlush(&ri->description, CData, NULL, 0); + NewStrBufDupAppendFlush(&ri->description, + CData, + NULL, + 0); StrBufTrim(ri->description); } } } -void ATOM_item_published_end (StrBuf *CData, rss_item *ri, rss_aggregator *Cfg, const char** Attr) -{ +void ATOM_item_published_end (StrBuf *CData, + rss_item *ri, + rss_aggregator *RSSAggr, + const char** Attr) +{ if (StrLength(CData) > 0) { StrBufTrim(CData); ri->pubdate = rdf_parsedate(ChrPtr(CData)); } } -void ATOM_item_updated_end (StrBuf *CData, rss_item *ri, rss_aggregator *Cfg, const char** Attr) +void ATOM_item_updated_end (StrBuf *CData, + rss_item *ri, + rss_aggregator *RSSAggr, + const char** Attr) { if (StrLength(CData) > 0) { StrBufTrim(CData); @@ -335,7 +434,10 @@ void ATOM_item_updated_end (StrBuf *CData, rss_item *ri, rss_aggregator *Cfg, co } } -void RSS_item_pubdate_end (StrBuf *CData, rss_item *ri, rss_aggregator *Cfg, const char** Attr) +void RSS_item_pubdate_end (StrBuf *CData, + rss_item *ri, + rss_aggregator *RSSAggr, + const char** Attr) { if (StrLength(CData) > 0) { StrBufTrim(CData); @@ -344,7 +446,10 @@ void RSS_item_pubdate_end (StrBuf *CData, rss_item *ri, rss_aggregator *Cfg, con } -void RSS_item_date_end (StrBuf *CData, rss_item *ri, rss_aggregator *Cfg, const char** Attr) +void RSS_item_date_end (StrBuf *CData, + rss_item *ri, + rss_aggregator *RSSAggr, + const char** Attr) { if (StrLength(CData) > 0) { StrBufTrim(CData); @@ -354,7 +459,10 @@ void RSS_item_date_end (StrBuf *CData, rss_item *ri, rss_aggregator *Cfg, const -void RSS_item_author_end(StrBuf *CData, rss_item *ri, rss_aggregator *Cfg, const char** Attr) +void RSS_item_author_end(StrBuf *CData, + rss_item *ri, + rss_aggregator *RSSAggr, + const char** Attr) { if (StrLength(CData) > 0) { NewStrBufDupAppendFlush(&ri->author_or_creator, CData, NULL, 0); @@ -363,7 +471,10 @@ void RSS_item_author_end(StrBuf *CData, rss_item *ri, rss_aggregator *Cfg, const } -void ATOM_item_name_end(StrBuf *CData, rss_item *ri, rss_aggregator *Cfg, const char** Attr) +void ATOM_item_name_end(StrBuf *CData, + rss_item *ri, + rss_aggregator *RSSAggr, + const char** Attr) { if (StrLength(CData) > 0) { NewStrBufDupAppendFlush(&ri->author_or_creator, CData, NULL, 0); @@ -371,7 +482,10 @@ void ATOM_item_name_end(StrBuf *CData, rss_item *ri, rss_aggregator *Cfg, const } } -void ATOM_item_email_end(StrBuf *CData, rss_item *ri, rss_aggregator *Cfg, const char** Attr) +void ATOM_item_email_end(StrBuf *CData, + rss_item *ri, + rss_aggregator *RSSAggr, + const char** Attr) { if (StrLength(CData) > 0) { NewStrBufDupAppendFlush(&ri->author_email, CData, NULL, 0); @@ -379,9 +493,12 @@ void ATOM_item_email_end(StrBuf *CData, rss_item *ri, rss_aggregator *Cfg, const } } -void RSS_item_creator_end(StrBuf *CData, rss_item *ri, rss_aggregator *Cfg, const char** Attr) +void RSS_item_creator_end(StrBuf *CData, + rss_item *ri, + rss_aggregator *RSSAggr, + const char** Attr) { - if ((StrLength(CData) > 0) && + if ((StrLength(CData) > 0) && (StrLength(ri->author_or_creator) == 0)) { NewStrBufDupAppendFlush(&ri->author_or_creator, CData, NULL, 0); @@ -390,7 +507,10 @@ void RSS_item_creator_end(StrBuf *CData, rss_item *ri, rss_aggregator *Cfg, cons } -void ATOM_item_uri_end(StrBuf *CData, rss_item *ri, rss_aggregator *Cfg, const char** Attr) +void ATOM_item_uri_end(StrBuf *CData, + rss_item *ri, + rss_aggregator *RSSAggr, + const char** Attr) { if (StrLength(CData) > 0) { NewStrBufDupAppendFlush(&ri->author_url, CData, NULL, 0); @@ -398,33 +518,50 @@ void ATOM_item_uri_end(StrBuf *CData, rss_item *ri, rss_aggregator *Cfg, const c } } -void RSS_item_item_end(StrBuf *CData, rss_item *ri, rss_aggregator *Cfg, const char** Attr) +void RSS_item_item_end(StrBuf *CData, + rss_item *ri, + rss_aggregator *RSSAggr, + const char** Attr) { --ri->item_tag_nesting; - rss_save_item(ri, Cfg); + rss_save_item(ri, RSSAggr); } -void ATOM_item_entry_end(StrBuf *CData, rss_item *ri, rss_aggregator *Cfg, const char** Attr) +void ATOM_item_entry_end(StrBuf *CData, + rss_item *ri, + rss_aggregator *RSSAggr, + const char** Attr) { --ri->item_tag_nesting; - rss_save_item(ri, Cfg); + rss_save_item(ri, RSSAggr); } -void RSS_item_rss_end(StrBuf *CData, rss_item *ri, rss_aggregator *Cfg, const char** Attr) +void RSS_item_rss_end(StrBuf *CData, + rss_item *ri, + rss_aggregator *RSSAggr, + const char** Attr) { -// syslog(LOG_DEBUG, "End of feed detected. Closing parser.\n"); + AsyncIO *IO = &RSSAggr->IO; + EVRSSATOMM_syslog(LOG_DEBUG, "End of feed detected. Closing parser.\n"); ri->done_parsing = 1; - } -void RSS_item_rdf_end(StrBuf *CData, rss_item *ri, rss_aggregator *Cfg, const char** Attr) + +void RSS_item_rdf_end(StrBuf *CData, + rss_item *ri, + rss_aggregator *RSSAggr, + const char** Attr) { -// syslog(LOG_DEBUG, "End of feed detected. Closing parser.\n"); + AsyncIO *IO = &RSSAggr->IO; + EVRSSATOMM_syslog(LOG_DEBUG, "End of feed detected. Closing parser.\n"); ri->done_parsing = 1; } -void RSSATOM_item_ignore(StrBuf *CData, rss_item *ri, rss_aggregator *Cfg, const char** Attr) +void RSSATOM_item_ignore(StrBuf *CData, + rss_item *ri, + rss_aggregator *RSSAggr, + const char** Attr) { } @@ -433,17 +570,17 @@ void RSSATOM_item_ignore(StrBuf *CData, rss_item *ri, rss_aggregator *Cfg, const /* * This callback stores up the data which appears in between tags. */ -void rss_xml_cdata_start(void *data) +void rss_xml_cdata_start(void *data) { rss_aggregator *RSSAggr = (rss_aggregator*) data; FlushStrBuf(RSSAggr->CData); } -void rss_xml_cdata_end(void *data) +void rss_xml_cdata_end(void *data) { } -void rss_xml_chardata(void *data, const XML_Char *s, int len) +void rss_xml_chardata(void *data, const XML_Char *s, int len) { rss_aggregator *RSSAggr = (rss_aggregator*) data; @@ -451,9 +588,9 @@ void rss_xml_chardata(void *data, const XML_Char *s, int len) } -/******************************************************************************* - * RSS parser logic * - *******************************************************************************/ +/****************************************************************************** + * RSS parser logic * + ******************************************************************************/ extern pthread_mutex_t RSSQueueMutex; @@ -495,7 +632,7 @@ void AppendLink(StrBuf *Message, /* * Commit a fetched and parsed RSS item to disk */ -void rss_save_item(rss_item *ri, rss_aggregator *Cfg) +void rss_save_item(rss_item *ri, rss_aggregator *RSSAggr) { networker_save_message *SaveMsg; struct MD5Context md5context; @@ -503,7 +640,7 @@ void rss_save_item(rss_item *ri, rss_aggregator *Cfg) int msglen = 0; StrBuf *Message; StrBuf *guid; - AsyncIO *IO = &Cfg->IO; + AsyncIO *IO = &RSSAggr->IO; int n; @@ -538,7 +675,7 @@ void rss_save_item(rss_item *ri, rss_aggregator *Cfg) } /* translate Item into message. */ - EVM_syslog(LOG_DEBUG, "RSS: translating item...\n"); + EVRSSATOMM_syslog(LOG_DEBUG, "RSS: translating item...\n"); if (ri->description == NULL) ri->description = NewStrBufPlain(HKEY("")); StrBufSpaceToBlank(ri->description); SaveMsg->Msg.cm_magic = CTDLMESSAGE_MAGIC; @@ -658,8 +795,8 @@ void rss_save_item(rss_item *ri, rss_aggregator *Cfg) SaveMsg->MsgGUID = guid; SaveMsg->Message = Message; - n = GetCount(Cfg->Messages) + 1; - Put(Cfg->Messages, IKEY(n), SaveMsg, FreeNetworkSaveMessage); + n = GetCount(RSSAggr->Messages) + 1; + Put(RSSAggr->Messages, IKEY(n), SaveMsg, FreeNetworkSaveMessage); } @@ -667,13 +804,17 @@ void rss_xml_start(void *data, const char *supplied_el, const char **attr) { rss_xml_handler *h; rss_aggregator *RSSAggr = (rss_aggregator*) data; + AsyncIO *IO = &RSSAggr->IO; rss_item *ri = RSSAggr->Item; void *pv; const char *pel; char *sep = NULL; /* Axe the namespace, we don't care about it */ -/// syslog(LOG_DEBUG, "RSS: supplied el %d: %s...\n", RSSAggr->Cfg->ItemType, supplied_el); + /* + syslog(LOG_DEBUG, + "RSS: supplied el %d: %s\n", RSSAggr->RSSAggr->ItemType, supplied_el); + */ pel = supplied_el; while (sep = strchr(pel, ':'), sep) { pel = sep + 1; @@ -682,16 +823,16 @@ void rss_xml_start(void *data, const char *supplied_el, const char **attr) if (pel != supplied_el) { void *v; - - if (!GetHash(KnownNameSpaces, - supplied_el, + + if (!GetHash(KnownNameSpaces, + supplied_el, pel - supplied_el - 1, &v)) { -#ifdef DEBUG_RSS - syslog(LOG_DEBUG, "RSS: START ignoring because of wrong namespace [%s]\n", - supplied_el); -#endif + EVRSSATOM_syslog(LOG_DEBUG, + "RSS: START ignoring " + "because of wrong namespace [%s]\n", + supplied_el); return; } } @@ -702,7 +843,7 @@ void rss_xml_start(void *data, const char *supplied_el, const char **attr) { h = (rss_xml_handler*) pv; - if (((h->Flags & RSS_UNSET) != 0) && + if (((h->Flags & RSS_UNSET) != 0) && (RSSAggr->ItemType == RSS_UNSET)) { h->Handler(RSSAggr->CData, ri, RSSAggr, attr); @@ -715,23 +856,29 @@ void rss_xml_start(void *data, const char *supplied_el, const char **attr) else if (((h->Flags & RSS_ATOM) != 0) && (RSSAggr->ItemType == RSS_ATOM)) { - h->Handler(RSSAggr->CData, ri, RSSAggr, attr); + h->Handler(RSSAggr->CData, + ri, + RSSAggr, + attr); } -#ifdef DEBUG_RSS - else - syslog(LOG_DEBUG, "RSS: START unhandled: [%s] [%s]...\n", pel, supplied_el); -#endif + else + EVRSSATOM_syslog(LOG_DEBUG, + "RSS: START unhandled: [%s] [%s]...\n", + pel, + supplied_el); } -#ifdef DEBUG_RSS - else - syslog(LOG_DEBUG, "RSS: START unhandled: [%s] [%s]...\n", pel, supplied_el); -#endif + else + EVRSSATOM_syslog(LOG_DEBUG, + "RSS: START unhandled: [%s] [%s]...\n", + pel, + supplied_el); } void rss_xml_end(void *data, const char *supplied_el) { rss_xml_handler *h; rss_aggregator *RSSAggr = (rss_aggregator*) data; + AsyncIO *IO = &RSSAggr->IO; rss_item *ri = RSSAggr->Item; const char *pel; char *sep = NULL; @@ -742,20 +889,21 @@ void rss_xml_end(void *data, const char *supplied_el) while (sep = strchr(pel, ':'), sep) { pel = sep + 1; } -// syslog(LOG_DEBUG, "RSS: END %s...\n", el); + EVRSSATOM_syslog(LOG_DEBUG, "RSS: END %s...\n", supplied_el); if (pel != supplied_el) { void *v; - - if (!GetHash(KnownNameSpaces, - supplied_el, + + if (!GetHash(KnownNameSpaces, + supplied_el, pel - supplied_el - 1, &v)) { -#ifdef DEBUG_RSS - syslog(LOG_DEBUG, "RSS: END ignoring because of wrong namespace [%s] = [%s]\n", - supplied_el, ChrPtr(RSSAggr->CData)); -#endif + EVRSSATOM_syslog(LOG_DEBUG, + "RSS: END ignoring because of wrong namespace" + "[%s] = [%s]\n", + supplied_el, + ChrPtr(RSSAggr->CData)); FlushStrBuf(RSSAggr->CData); return; } @@ -767,7 +915,7 @@ void rss_xml_end(void *data, const char *supplied_el) { h = (rss_xml_handler*) pv; - if (((h->Flags & RSS_UNSET) != 0) && + if (((h->Flags & RSS_UNSET) != 0) && (RSSAggr->ItemType == RSS_UNSET)) { h->Handler(RSSAggr->CData, ri, RSSAggr, NULL); @@ -782,15 +930,19 @@ void rss_xml_end(void *data, const char *supplied_el) { h->Handler(RSSAggr->CData, ri, RSSAggr, NULL); } -#ifdef DEBUG_RSS - else - syslog(LOG_DEBUG, "RSS: END unhandled: [%s] [%s] = [%s]...\n", pel, supplied_el, ChrPtr(RSSAggr->CData)); -#endif + else + EVRSSATOM_syslog(LOG_DEBUG, + "RSS: END unhandled: [%s] [%s] = [%s]...\n", + pel, + supplied_el, + ChrPtr(RSSAggr->CData)); } -#ifdef DEBUG_RSS - else - syslog(LOG_DEBUG, "RSS: END unhandled: [%s] [%s] = [%s]...\n", pel, supplied_el, ChrPtr(RSSAggr->CData)); -#endif + else + EVRSSATOM_syslog(LOG_DEBUG, + "RSS: END unhandled: [%s] [%s] = [%s]...\n", + pel, + supplied_el, + ChrPtr(RSSAggr->CData)); FlushStrBuf(RSSAggr->CData); } @@ -818,8 +970,8 @@ eNextState RSSAggregator_ParseReply(AsyncIO *IO) if (IO->HttpReq.httpcode != 200) { - EV_syslog(LOG_DEBUG, "need a 200, got a %ld !\n", - IO->HttpReq.httpcode); + EVRSSATOM_syslog(LOG_ALERT, "need a 200, got a %ld !\n", + IO->HttpReq.httpcode); // TODO: aide error message with rate limit return eAbort; } @@ -842,17 +994,17 @@ eNextState RSSAggregator_ParseReply(AsyncIO *IO) pche = strchr(ptr, '"'); if (pche != NULL) StrBufCutAt(RSSAggr->Key, -1, pche); - else + else ptr = "UTF-8"; } else ptr = "UTF-8"; - syslog(LOG_DEBUG, "RSS: Now parsing [%s] \n", ChrPtr(RSSAggr->Url)); + EVRSSATOM_syslog(LOG_DEBUG, "RSS: Now parsing [%s] \n", ChrPtr(RSSAggr->Url)); RSSAggr->xp = XML_ParserCreateNS(ptr, ':'); if (!RSSAggr->xp) { - syslog(LOG_DEBUG, "Cannot create XML parser!\n"); + EVRSSATOMM_syslog(LOG_ALERT, "Cannot create XML parser!\n"); return eAbort; } FlushStrBuf(RSSAggr->Key); @@ -874,9 +1026,8 @@ eNextState RSSAggregator_ParseReply(AsyncIO *IO) XML_Parse(RSSAggr->xp, "", 0, 1); - syslog(LOG_DEBUG, "RSS: XML Status [%s] \n", - XML_ErrorString( - XML_GetErrorCode(RSSAggr->xp))); + EVRSSATOM_syslog(LOG_DEBUG, "RSS: XML Status [%s] \n", + XML_ErrorString(XML_GetErrorCode(RSSAggr->xp))); XML_ParserFree(RSSAggr->xp); flush_rss_item(ri); @@ -888,19 +1039,26 @@ eNextState RSSAggregator_ParseReply(AsyncIO *IO) RSSAggr->Pos = GetNewHashPos(RSSAggr->Messages, 1); - ///Cfg->next_poll = time(NULL) + config.c_net_freq; - if (GetNextHashPos(RSSAggr->Messages, RSSAggr->Pos, &len, &Key, (void**) &RSSAggr->ThisMsg)) +//RSSAggr->next_poll = time(NULL) + config.c_net_freq; + if (GetNextHashPos(RSSAggr->Messages, + RSSAggr->Pos, + &len, + &Key, + (void**) &RSSAggr->ThisMsg)) return QueueDBOperation(IO, RSS_FetchNetworkUsetableEntry); else return eAbort; } -/******************************************************************************* - * RSS handler registering logic * - *******************************************************************************/ +/****************************************************************************** + * RSS handler registering logic * + ******************************************************************************/ -void AddRSSStartHandler(rss_handler_func Handler, int Flags, const char *key, long len) +void AddRSSStartHandler(rss_handler_func Handler, + int Flags, + const char *key, + long len) { rss_xml_handler *h; h = (rss_xml_handler*) malloc(sizeof (rss_xml_handler)); @@ -908,7 +1066,11 @@ void AddRSSStartHandler(rss_handler_func Handler, int Flags, const char *key, lo h->Handler = Handler; Put(StartHandlers, key, len, h, NULL); } -void AddRSSEndHandler(rss_handler_func Handler, int Flags, const char *key, long len) + +void AddRSSEndHandler(rss_handler_func Handler, + int Flags, + const char *key, + long len) { rss_xml_handler *h; h = (rss_xml_handler*) malloc(sizeof (rss_xml_handler)); @@ -919,11 +1081,15 @@ void AddRSSEndHandler(rss_handler_func Handler, int Flags, const char *key, long void rss_parser_cleanup(void) { - DeleteHash(&StartHandlers); - DeleteHash(&EndHandlers); + DeleteHash(&StartHandlers); + DeleteHash(&EndHandlers); DeleteHash(&KnownNameSpaces); } +void LogDebugEnableRSSATOMParser(void) +{ + RSSAtomParserDebugEnabled = 1; +} CTDL_MODULE_INIT(rssparser) { @@ -943,8 +1109,8 @@ CTDL_MODULE_INIT(rssparser) AddRSSEndHandler(RSS_item_guid_end, RSS_RSS|RSS_REQUIRE_BUF, HKEY("guid")); AddRSSEndHandler(ATOM_item_id_end, RSS_ATOM|RSS_REQUIRE_BUF, HKEY("id")); AddRSSEndHandler(RSS_item_link_end, RSS_RSS|RSS_REQUIRE_BUF, HKEY("link")); -#if 0 -// hm, rss to the comments of that blog, might be interesting in future, but... +#if 0 +// hm, rss to the comments of that blog, might be interesting in future, but... AddRSSEndHandler(RSS_item_relink_end, RSS_RSS|RSS_REQUIRE_BUF, HKEY("commentrss")); // comment count... AddRSSEndHandler(RSS_item_relink_end, RSS_RSS|RSS_REQUIRE_BUF, HKEY("comments")); @@ -1011,7 +1177,8 @@ CTDL_MODULE_INIT(rssparser) /* we don't like these namespaces because of they shadow our usefull parameters. */ Put(KnownNameSpaces, HKEY("http://search.yahoo.com/mrss/"), NULL, reference_free_handler); #endif - CtdlRegisterCleanupHook(rss_parser_cleanup); + CtdlRegisterDebugFlagHook(HKEY("RSSAtomParser"), LogDebugEnableRSSATOMParser); + CtdlRegisterCleanupHook(rss_parser_cleanup); } return "rssparser"; }