HashList *RSSQueueRooms = NULL; /* rss_room_counter */
HashList *RSSFetchUrls = NULL; /* -> rss_aggregator; ->RefCount access to be locked too. */
+eNextState RSSAggregatorTerminate(AsyncIO *IO);
struct rssnetcfg *rnclist = NULL;
HashPos *At;
long HKLen;
const char *HK;
- void *vData;
+ void *vData = NULL;
rss_room_counter *pRoomC;
At = GetNewHashPos(RSSQueueRooms, 0);
GetHashPosFromKey(RSSQueueRooms, LKEY(QRnumber), At);
GetHashPos(RSSQueueRooms, At, &HKLen, &HK, &vData);
- pRoomC = (rss_room_counter *) vData;
- pRoomC->count --;
- if (pRoomC->count == 0)
- DeleteEntryFromHash(RSSQueueRooms, At);
+ if (vData != NULL)
+ {
+ pRoomC = (rss_room_counter *) vData;
+ pRoomC->count --;
+ if (pRoomC->count == 0)
+ DeleteEntryFromHash(RSSQueueRooms, At);
+ }
DeleteHashPos(&At);
}
CtdlFreeMessage(Ctx->Msg);
free_recipients(Ctx->recp);
+ FreeStrBuf(&Ctx->Message);
FreeStrBuf(&Ctx->MsgGUID);
free(Ctx);
return eAbort;
eNextState AbortNetworkSaveMessage (AsyncIO *IO)
{
- return eAbort; ///TODO
+ return eAbort; ///TODO
}
eNextState RSSSaveMessage(AsyncIO *IO)
cdb_store(CDB_USETABLE,
SKEY(Ctx->MsgGUID),
&Ctx->ut, sizeof(struct UseTable) );
- return eTerminateConnection;
+ return eAbort;
}
else
#endif
// Ctx,
NULL,
"Citadel RSS Client",
- ParseRSSReply))
+ ParseRSSReply,
+ RSSAggregatorTerminate))
{
CtdlLogPrintf(CTDL_ALERT, "Unable to initialize libcurl.\n");
return 0;
FreeStrBuf(&rncptr->Url);
FreeStrBuf(&rncptr->rooms);
+ FreeStrBuf(&rncptr->CData);
+ FreeStrBuf(&rncptr->Key);
+
+ DeleteHash(&rncptr->OtherQRnumbers);
+
+ if (rncptr->Item != NULL)
+ {
+ FreeStrBuf(&rncptr->Item->guid);
+ FreeStrBuf(&rncptr->Item->title);
+ FreeStrBuf(&rncptr->Item->link);
+ FreeStrBuf(&rncptr->Item->linkTitle);
+ FreeStrBuf(&rncptr->Item->reLink);
+ FreeStrBuf(&rncptr->Item->reLinkTitle);
+ FreeStrBuf(&rncptr->Item->description);
+ FreeStrBuf(&rncptr->Item->channel_title);
+ FreeStrBuf(&rncptr->Item->author_or_creator);
+ FreeStrBuf(&rncptr->Item->author_url);
+ FreeStrBuf(&rncptr->Item->author_email);
+
+ free(rncptr->Item);
+ }
free(rncptr);
}
+eNextState RSSAggregatorTerminate(AsyncIO *IO)
+{
+ rss_aggregator *rncptr = (rss_aggregator *)IO->Data;
+ HashPos *At;
+ long HKLen;
+ const char *HK;
+ void *vData;
+
+ citthread_mutex_lock(&RSSQueueMutex);
+ rncptr->RefCount --;
+ if (rncptr->RefCount == 0)
+ {
+ UnlinkAggregator(rncptr);
+
+ }
+ citthread_mutex_unlock(&RSSQueueMutex);
+/*
+ At = GetNewHashPos(RSSFetchUrls, 0);
+
+ citthread_mutex_lock(&RSSQueueMutex);
+ GetHashPosFromKey(RSSFetchUrls, SKEY(rncptr->Url), At);
+ GetHashPos(RSSFetchUrls, At, &HKLen, &HK, &vData);
+ DeleteEntryFromHash(RSSFetchUrls, At);
+ citthread_mutex_unlock(&RSSQueueMutex);
+
+ DeleteHashPos(&At);
+*/
+ return eAbort;
+}
/*
* Scan a room's netconfig to determine whether it is requesting any RSS feeds
citthread_mutex_lock(&RSSQueueMutex);
if (GetHash(RSSQueueRooms, LKEY(qrbuf->QRnumber), &vptr))
{
- //CtdlLogPrintf(CTDL_DEBUG, "rssclient: %s already in progress.\n", qrbuf->QRname);
+ CtdlLogPrintf(CTDL_DEBUG,
+ "rssclient: [%ld] %s already in progress.\n",
+ qrbuf->QRnumber,
+ qrbuf->QRname);
citthread_mutex_unlock(&RSSQueueMutex);
return;
}
if (use_this_rncptr->roomlist_parts == 1)
{
use_this_rncptr->OtherQRnumbers = NewHash(1, lFlathash);
-
-//// TODO add reference here!
}
QRnumber = (long*)malloc(sizeof(long));
*QRnumber = qrbuf->QRnumber;
{
Count->QRnumber = qrbuf->QRnumber;
citthread_mutex_lock(&RSSQueueMutex);
+ CtdlLogPrintf(CTDL_DEBUG, "rssclient: [%ld] %s now starting.\n",
+ qrbuf->QRnumber, qrbuf->QRname);
Put(RSSQueueRooms, LKEY(qrbuf->QRnumber), Count, NULL);
citthread_mutex_unlock(&RSSQueueMutex);
}
rptr = (rss_aggregator *)vrptr;
if (rptr->RefCount == 0)
if (!rss_do_fetching(rptr))
- {
- /// TODO: flush me.
- }
+ UnlinkAggregator(rptr);
}
DeleteHashPos(&it);
citthread_mutex_unlock(&RSSQueueMutex);
return;
}
-void RSSCleanup(void)
+void rss_cleanup(void)
{
citthread_mutex_destroy(&RSSQueueMutex);
DeleteHash(&RSSFetchUrls);
if (threading)
{
citthread_mutex_init(&RSSQueueMutex, NULL);
- RSSQueueRooms = NewHash(1, Flathash);
+ RSSQueueRooms = NewHash(1, lFlathash);
RSSFetchUrls = NewHash(1, NULL);
CtdlLogPrintf(CTDL_INFO, "%s\n", curl_version());
CtdlRegisterSessionHook(rssclient_scan, EVT_TIMER);
+ CtdlRegisterCleanupHook(rss_cleanup);
}
return "rssclient";
}