FreeStrBuf(&IO->HttpReq.ReplyData);
FreeURL(&IO->ConnectMe);
RemoveContext(IO->CitContext);
- free(IO);
+ IO->Terminate(IO);
}
}
}
int evcurl_init(AsyncIO *IO,
void *CustomData,
const char* Desc,
- IO_CallBack CallBack)
+ IO_CallBack CallBack,
+ IO_CallBack Terminate)
{
CURLcode sta;
CURL *chnd;
CtdlLogPrintf(CTDL_DEBUG,"EVCURL: evcurl_init called ms\n");
IO->HttpReq.attached = 0;
IO->SendDone = CallBack;
+ IO->Terminate = Terminate;
chnd = IO->HttpReq.chnd = curl_easy_init();
if (!chnd)
{
ev_run (event_base, 0);
- CtdlClearSystemContext();
+///what todo here? CtdlClearSystemContext();
ev_loop_destroy (EV_DEFAULT_UC);
DeleteHash(&QueueEvents);
ev_async DBAddJob;
ev_async DBExitEventLoop;
+extern void ShutDownDBCLient(AsyncIO *IO);
+
static void DBQueueEventAddCallback(EV_P_ ev_async *w, int revents)
{
HashList *q;
while (GetNextHashPos(q, It, &len, &Key, &v))
{
IOAddHandler *h = v;
- h->EvAttch(h->IO);
+ eNextState rc;
+ rc = h->EvAttch(h->IO);
+ switch (rc)
+ {
+ case eAbort:
+ ShutDownDBCLient(h->IO);
+ default:
+ break;
+ }
}
DeleteHashPos(&It);
DeleteHashContent(&q);
static void DBEventExitCallback(EV_P_ ev_async *w, int revents)
{
- ev_break(event_db, EVBREAK_ALL);
-
CtdlLogPrintf(CTDL_DEBUG, "EVENT Q exiting.\n");
+ ev_break(event_db, EVBREAK_ALL);
}
ev_run (event_db, 0);
- CtdlClearSystemContext();
+//// what to do here? CtdlClearSystemContext();
ev_loop_destroy (event_db);
DeleteHash(&DBQueueEvents);
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";
}