]> code.citadel.org Git - citadel.git/blobdiff - citadel/modules/rssclient/rss_atom_parser.c
Work on RSS Feed
[citadel.git] / citadel / modules / rssclient / rss_atom_parser.c
index e86d30b84f778bb14fd7203d24c54324ee332c62..d60d35ae2b0c1644ea51b4a77aa00a5afb5ab120 100644 (file)
@@ -58,6 +58,8 @@
 #include "event_client.h"
 #include "rss_atom_parser.h"
 
+extern pthread_mutex_t RSSQueueMutex;
+
 HashList *StartHandlers = NULL;
 HashList *EndHandlers = NULL;
 HashList *KnownNameSpaces = NULL;
@@ -270,19 +272,19 @@ void rss_xml_end(void *data, const char *supplied_el)
 
 void RSS_item_rss_start (StrBuf *CData, rss_item *ri, rss_aggregator *Cfg, const char** Attr)
 {
-       CtdlLogPrintf(CTDL_DEBUG, "RSS: This is an RSS feed.\n");
+       syslog(LOG_DEBUG, "RSS: This is an RSS feed.\n");
        Cfg->ItemType = RSS_RSS;
 }
 
 void RSS_item_rdf_start(StrBuf *CData, rss_item *ri, rss_aggregator *Cfg, const char** Attr)
 {
-       CtdlLogPrintf(CTDL_DEBUG, "RSS: This is an RDF feed.\n");
+       syslog(LOG_DEBUG, "RSS: This is an RDF feed.\n");
        Cfg->ItemType = RSS_RSS;
 }
 
 void ATOM_item_feed_start(StrBuf *CData, rss_item *ri, rss_aggregator *Cfg, const char** Attr)
 {
-       CtdlLogPrintf(CTDL_DEBUG, "RSS: This is an ATOM feed.\n");
+       syslog(LOG_DEBUG, "RSS: This is an ATOM feed.\n");
        Cfg->ItemType = RSS_ATOM;
 }
 
@@ -557,13 +559,13 @@ void ATOM_item_entry_end(StrBuf *CData, rss_item *ri, rss_aggregator *Cfg, const
 
 void RSS_item_rss_end(StrBuf *CData, rss_item *ri, rss_aggregator *Cfg, const char** Attr)
 {
-//             CtdlLogPrintf(CTDL_DEBUG, "End of feed detected.  Closing parser.\n");
+//             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)
 {
-//             CtdlLogPrintf(CTDL_DEBUG, "End of feed detected.  Closing parser.\n");
+//             syslog(LOG_DEBUG, "End of feed detected.  Closing parser.\n");
        ri->done_parsing = 1;
 }
 
@@ -607,13 +609,18 @@ size_t rss_libcurl_callback(void *ptr, size_t size, size_t nmemb, void *stream)
 
 eNextState ParseRSSReply(AsyncIO *IO)
 {
+       StrBuf *Buf;
        rss_aggregator *rssc;
        rss_item *ri;
        const char *at;
        char *ptr;
        long len;
+       const char *Key;
 
        rssc = IO->Data;
+       pthread_mutex_lock(&RSSQueueMutex);
+       rssc->RefCount ++;
+       pthread_mutex_unlock(&RSSQueueMutex);
        ri = rssc->Item;
        rssc->CData = NewStrBufPlain(NULL, SIZ);
        rssc->Key = NewStrBuf();
@@ -637,15 +644,19 @@ eNextState ParseRSSReply(AsyncIO *IO)
        else
                ptr = "UTF-8";
 
-       CtdlLogPrintf(CTDL_ALERT, "RSS: Now parsing [%s] \n", ChrPtr(rssc->Url));
+       syslog(LOG_DEBUG, "RSS: Now parsing [%s] \n", ChrPtr(rssc->Url));
 
        rssc->xp = XML_ParserCreateNS(ptr, ':');
        if (!rssc->xp) {
-               CtdlLogPrintf(CTDL_ALERT, "Cannot create XML parser!\n");
-               goto shutdown;
+               syslog(LOG_DEBUG, "Cannot create XML parser!\n");
+               pthread_mutex_lock(&RSSQueueMutex);
+               rssc->RefCount --;
+               pthread_mutex_unlock(&RSSQueueMutex);
+               return eTerminateConnection;
        }
        FlushStrBuf(rssc->Key);
 
+       rssc->Messages = NewHash(1, Flathash);
        XML_SetElementHandler(rssc->xp, rss_xml_start, rss_xml_end);
        XML_SetCharacterDataHandler(rssc->xp, rss_xml_chardata);
        XML_SetUserData(rssc->xp, rssc);
@@ -662,24 +673,31 @@ eNextState ParseRSSReply(AsyncIO *IO)
                XML_Parse(rssc->xp, "", 0, 1);
 
 
-       CtdlLogPrintf(CTDL_ALERT, "RSS: XML Status [%s] \n", 
+       syslog(LOG_DEBUG, "RSS: XML Status [%s] \n", 
                      XML_ErrorString(
                              XML_GetErrorCode(rssc->xp)));
 
-shutdown:
        XML_ParserFree(rssc->xp);
-
        flush_rss_item(ri);
        FreeStrBuf(&rssc->CData);
        FreeStrBuf(&rssc->Key);
 
-        ///Cfg->next_poll = time(NULL) + config.c_net_freq; 
+       Buf = NewStrBufDup(rssc->rooms);
+       rssc->recp.recp_room = SmashStrBuf(&Buf);
+       rssc->recp.num_room = rssc->roomlist_parts;
+       rssc->recp.recptypes_magic = RECPTYPES_MAGIC;
 
-       return eTerminateConnection;
+       rssc->Pos = GetNewHashPos(rssc->Messages, 1);
+
+        ///Cfg->next_poll = time(NULL) + config.c_net_freq; 
+       if (GetNextHashPos(rssc->Messages, rssc->Pos, &len, &Key, (void**) &rssc->ThisMsg))
+               return QueueDBOperation(IO, RSS_FetchNetworkUsetableEntry);
+       else
+               return eAbort;
 }
 
 
-void rss_cleanup(void)
+void rss_parser_cleanup(void)
 {
         DeleteHash(&StartHandlers);
         DeleteHash(&EndHandlers);
@@ -773,7 +791,7 @@ 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_cleanup);
+                CtdlRegisterCleanupHook(rss_parser_cleanup);
        }
        return "rssparser";
 }