X-Git-Url: https://code.citadel.org/?p=citadel.git;a=blobdiff_plain;f=citadel%2Fmodules%2Frssclient%2Frss_atom_parser.c;h=d60d35ae2b0c1644ea51b4a77aa00a5afb5ab120;hp=7f1d612d624dbac9ff667d7ce454fd7d2a113fec;hb=5ec1b7756ba201839aac2dfbf9165a1888f93a0d;hpb=77f0e26bd2a38c223a0694f1b90c8500f43f6d47 diff --git a/citadel/modules/rssclient/rss_atom_parser.c b/citadel/modules/rssclient/rss_atom_parser.c index 7f1d612d6..d60d35ae2 100644 --- a/citadel/modules/rssclient/rss_atom_parser.c +++ b/citadel/modules/rssclient/rss_atom_parser.c @@ -609,11 +609,13 @@ 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); @@ -647,10 +649,14 @@ eNextState ParseRSSReply(AsyncIO *IO) rssc->xp = XML_ParserCreateNS(ptr, ':'); if (!rssc->xp) { syslog(LOG_DEBUG, "Cannot create XML parser!\n"); - goto shutdown; + 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); @@ -671,19 +677,23 @@ eNextState ParseRSSReply(AsyncIO *IO) 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; - pthread_mutex_lock(&RSSQueueMutex); - rssc->RefCount --; - pthread_mutex_unlock(&RSSQueueMutex); - 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; }