RSSClient: make debug log runtime configurable
[citadel.git] / citadel / modules / rssclient / rss_atom_parser.c
index dd92e2d78b50ca0eb038a710c71549170e9eaa23..0c7290b5cc0857ce856d43a2ce614ca2eedb11aa 100644 (file)
@@ -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 <stdlib.h>
 
 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";
 }