+void DeleteRssCfg(void *vptr)
+{
+ rssnetcfg *rncptr = (rssnetcfg *)vptr;
+
+ FreeStrBuf(&rncptr->Url);
+ if (rncptr->rooms != NULL) free(rncptr->rooms);
+ free(rncptr);
+}
+
+
+/*
+ * Scan a room's netconfig to determine whether it is requesting any RSS feeds
+ */
+void rssclient_scan_room(struct ctdlroom *qrbuf, void *data)
+{
+ StrBuf *CfgData;
+ StrBuf *CfgType;
+ StrBuf *Line;
+ RoomCounter *Count = NULL;
+ struct stat statbuf;
+ char filename[PATH_MAX];
+ //char buf[1024];
+ //char instr[32];
+ int fd;
+ int Done;
+ //char feedurl[256];
+ rssnetcfg *rncptr = NULL;
+ rssnetcfg *use_this_rncptr = NULL;
+ //int len = 0;
+ //char *ptr = NULL;
+ void *vptr;
+ const char *CfgPtr, *lPtr;
+ const char *Err;
+
+ citthread_mutex_lock(&RSSQueueMutex);
+ if (GetHash(RSSQueueRooms, LKEY(qrbuf->QRnumber), &vptr))
+ {
+ //CtdlLogPrintf(CTDL_DEBUG, "rssclient: %s already in progress.\n", qrbuf->QRname);
+ citthread_mutex_unlock(&RSSQueueMutex);
+ return;
+ }
+ citthread_mutex_unlock(&RSSQueueMutex);
+
+ assoc_file_name(filename, sizeof filename, qrbuf, ctdl_netcfg_dir);
+
+ if (CtdlThreadCheckStop())
+ return;
+
+ /* Only do net processing for rooms that have netconfigs */
+ fd = open(filename, 0);
+ if (fd <= 0) {
+ //CtdlLogPrintf(CTDL_DEBUG, "rssclient: %s no config.\n", qrbuf->QRname);
+ return;
+ }
+ if (CtdlThreadCheckStop())
+ return;
+ if (fstat(fd, &statbuf) == -1) {
+ CtdlLogPrintf(CTDL_DEBUG, "ERROR: could not stat configfile '%s' - %s\n",
+ filename, strerror(errno));
+ return;
+ }
+ if (CtdlThreadCheckStop())
+ return;
+ CfgData = NewStrBufPlain(NULL, statbuf.st_size + 1);
+ if (StrBufReadBLOB(CfgData, &fd, 1, statbuf.st_size, &Err) < 0) {
+ close(fd);
+ FreeStrBuf(&CfgData);
+ CtdlLogPrintf(CTDL_DEBUG, "ERROR: reading config '%s' - %s<br>\n",
+ filename, strerror(errno));
+ return;
+ }
+ close(fd);
+ if (CtdlThreadCheckStop())
+ return;
+
+ CfgPtr = NULL;
+ CfgType = NewStrBuf();
+ Line = NewStrBufPlain(NULL, StrLength(CfgData));
+ Done = 0;
+ while (!Done)
+ {
+ Done = StrBufSipLine(Line, CfgData, &CfgPtr) == 0;
+ if (StrLength(Line) > 0)
+ {
+ lPtr = NULL;
+ StrBufExtract_NextToken(CfgType, Line, &lPtr, '|');
+ if (!strcmp("rssclient", ChrPtr(CfgType)))
+ {
+ if (Count == NULL)
+ {
+ Count = malloc(sizeof(RoomCounter));
+ Count->count = 0;
+ }
+ Count->count ++;
+ rncptr = (rssnetcfg *) malloc(sizeof(rssnetcfg));
+ memset (rncptr, 0, sizeof(rssnetcfg));
+ rncptr->Url = NewStrBuf();
+ StrBufExtract_NextToken(rncptr->Url, Line, &lPtr, '|');
+
+ citthread_mutex_lock(&RSSQueueMutex);
+ GetHash(RSSFetchUrls, SKEY(rncptr->Url), &vptr);
+ use_this_rncptr = (rssnetcfg *)vptr;
+ citthread_mutex_unlock(&RSSQueueMutex);
+
+ if (use_this_rncptr != NULL)
+ {
+ /* mustn't attach to an active session */
+ if (use_this_rncptr->Attached == 1)
+ {
+ DeleteRssCfg(rncptr);
+ }
+ else
+ {
+ /* TODO: hook us into the otherone here. */
+ }
+
+ continue;
+ }
+
+ rncptr->ItemType = RSS_UNSET;
+
+ rncptr->rooms = NULL;
+ rncptr->rooms = strdup(qrbuf->QRname);
+
+ citthread_mutex_lock(&RSSQueueMutex);
+ Put(RSSFetchUrls, SKEY(rncptr->Url), rncptr, DeleteRssCfg);
+ citthread_mutex_unlock(&RSSQueueMutex);
+ }
+ }
+ }
+ if (Count != NULL)
+ {
+ Count->QRnumber = qrbuf->QRnumber;
+ citthread_mutex_lock(&RSSQueueMutex);
+ Put(RSSQueueRooms, LKEY(qrbuf->QRnumber), Count, NULL);
+ citthread_mutex_unlock(&RSSQueueMutex);
+ }
+ FreeStrBuf(&CfgData);
+ FreeStrBuf(&CfgType);
+ FreeStrBuf(&Line);