X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fmodules%2Frssclient%2Frss_atom_parser.c;h=e7065bde39c6ac2fe54e8d407b189203d1898a5e;hb=c855d497545dad80942a194624c111a54cd1fdc7;hp=e86d30b84f778bb14fd7203d24c54324ee332c62;hpb=e839bbab093a1a73198b3be9ad72f18cecb20f65;p=citadel.git diff --git a/citadel/modules/rssclient/rss_atom_parser.c b/citadel/modules/rssclient/rss_atom_parser.c index e86d30b84..e7065bde3 100644 --- a/citadel/modules/rssclient/rss_atom_parser.c +++ b/citadel/modules/rssclient/rss_atom_parser.c @@ -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; @@ -142,7 +144,7 @@ void rss_xml_start(void *data, const char *supplied_el, const char **attr) char *sep = NULL; /* Axe the namespace, we don't care about it */ -/// CtdlLogPrintf(0, "RSS: supplied el %d: %s...\n", rssc->Cfg->ItemType, supplied_el); +/// syslog(LOG_DEBUG, "RSS: supplied el %d: %s...\n", rssc->Cfg->ItemType, supplied_el); pel = supplied_el; while (sep = strchr(pel, ':'), sep) { pel = sep + 1; @@ -158,7 +160,7 @@ void rss_xml_start(void *data, const char *supplied_el, const char **attr) &v)) { #ifdef DEBUG_RSS - CtdlLogPrintf(0, "RSS: START ignoring because of wrong namespace [%s] = [%s]\n", + syslog(LOG_DEBUG, "RSS: START ignoring because of wrong namespace [%s]\n", supplied_el); #endif return; @@ -188,12 +190,12 @@ void rss_xml_start(void *data, const char *supplied_el, const char **attr) } #ifdef DEBUG_RSS else - CtdlLogPrintf(0, "RSS: START unhandled: [%s] [%s]...\n", pel, supplied_el); + syslog(LOG_DEBUG, "RSS: START unhandled: [%s] [%s]...\n", pel, supplied_el); #endif } #ifdef DEBUG_RSS else - CtdlLogPrintf(0, "RSS: START unhandled: [%s] [%s]...\n", pel, supplied_el); + syslog(LOG_DEBUG, "RSS: START unhandled: [%s] [%s]...\n", pel, supplied_el); #endif } @@ -211,7 +213,7 @@ void rss_xml_end(void *data, const char *supplied_el) while (sep = strchr(pel, ':'), sep) { pel = sep + 1; } -// CtdlLogPrintf(0, "RSS: END %s...\n", el); +// syslog(LOG_DEBUG, "RSS: END %s...\n", el); if (pel != supplied_el) { void *v; @@ -222,7 +224,7 @@ void rss_xml_end(void *data, const char *supplied_el) &v)) { #ifdef DEBUG_RSS - CtdlLogPrintf(0, "RSS: END ignoring because of wrong namespace [%s] = [%s]\n", + syslog(LOG_DEBUG, "RSS: END ignoring because of wrong namespace [%s] = [%s]\n", supplied_el, ChrPtr(rssc->CData)); #endif FlushStrBuf(rssc->CData); @@ -253,12 +255,12 @@ void rss_xml_end(void *data, const char *supplied_el) } #ifdef DEBUG_RSS else - CtdlLogPrintf(0, "RSS: END unhandled: [%s] [%s] = [%s]...\n", pel, supplied_el, ChrPtr(rssc->CData)); + syslog(LOG_DEBUG, "RSS: END unhandled: [%s] [%s] = [%s]...\n", pel, supplied_el, ChrPtr(rssc->CData)); #endif } #ifdef DEBUG_RSS else - CtdlLogPrintf(0, "RSS: END unhandled: [%s] [%s] = [%s]...\n", pel, supplied_el, ChrPtr(rssc->CData)); + syslog(LOG_DEBUG, "RSS: END unhandled: [%s] [%s] = [%s]...\n", pel, supplied_el, ChrPtr(rssc->CData)); #endif FlushStrBuf(rssc->CData); rssc->Current = 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; } @@ -605,13 +607,25 @@ size_t rss_libcurl_callback(void *ptr, size_t size, size_t nmemb, void *stream) -eNextState ParseRSSReply(AsyncIO *IO) +eNextState RSSAggregator_ParseReply(AsyncIO *IO) { + StrBuf *Buf; rss_aggregator *rssc; rss_item *ri; const char *at; char *ptr; long len; + const char *Key; + + + if (IO->HttpReq.httpcode != 200) + { + + EV_syslog(LOG_DEBUG, "need a 200, got a %ld !\n", + IO->HttpReq.httpcode); +// TODO: aide error message with rate limit + return eAbort; + } rssc = IO->Data; ri = rssc->Item; @@ -637,15 +651,16 @@ 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"); + return eAbort; } 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 +677,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; + + rssc->Pos = GetNewHashPos(rssc->Messages, 1); - return eTerminateConnection; + ///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 +795,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"; }