int msglen = 0;
rss_item *ri = rssc->Item;
- CtdlLogPrintf(0, "RSS: saving item...\n");
recp = (struct recptypes *) malloc(sizeof(struct recptypes));
if (recp == NULL) return;
memset(recp, 0, sizeof(struct recptypes));
+ memset(&ut, 0, sizeof(struct UseTable));
recp->recp_room = strdup(ri->roomlist);
recp->num_room = num_tokens(ri->roomlist, '|');
recp->recptypes_magic = RECPTYPES_MAGIC;
}
else {
/* Item has not been seen, so save it. */
-
+ CtdlLogPrintf(CTDL_DEBUG, "RSS: saving item...\n");
if (ri->description == NULL) ri->description = strdup("");
for (i=strlen(ri->description); i>=0; --i) {
if (isspace(ri->description[i])) {
msg->cm_anon_type = MES_NORMAL;
msg->cm_format_type = FMT_RFC822;
+ if (ri->guid != NULL) {
+ msg->cm_fields['E'] = strdup(ri->guid);
+ }
+
if (ri->author_or_creator != NULL) {
- msg->cm_fields['A'] = html_to_ascii(ri->author_or_creator,
- strlen(ri->author_or_creator), 512, 0);
- striplt(msg->cm_fields['A']);
+ char *From;
+ StrBuf *Encoded, *QPEncoded;
+ StrBuf *UserName;
+ StrBuf *EmailAddress;
+ StrBuf *EncBuf;
+
+ UserName = NewStrBuf();
+ EmailAddress = NewStrBuf();
+ EncBuf = NewStrBuf();
+
+ From = html_to_ascii(ri->author_or_creator,
+ strlen(ri->author_or_creator),
+ 512, 0);
+
+ Encoded = NewStrBufPlain(From, -1);
+ free(From);
+ QPEncoded = StrBufSanitizeEmailRecipientVector(Encoded, UserName, EmailAddress, EncBuf);
+ msg->cm_fields['A'] = SmashStrBuf(&QPEncoded);
+
+ FreeStrBuf(&Encoded);
+ FreeStrBuf(&UserName);
+ FreeStrBuf(&EmailAddress);
+ FreeStrBuf(&EncBuf);
+
}
else {
msg->cm_fields['A'] = strdup("rss");
msg->cm_fields['N'] = strdup(NODENAME);
if (ri->title != NULL) {
- msg->cm_fields['U'] = html_to_ascii(ri->title, strlen(ri->title), 512, 0);
- striplt(msg->cm_fields['U']);
+ long len;
+ char *Sbj;
+ StrBuf *Encoded, *QPEncoded;
+
+ QPEncoded = NULL;
+ len = strlen(ri->title);
+ Sbj = html_to_ascii(ri->title, len, 512, 0);
+ Encoded = NewStrBufPlain(Sbj, -1);
+ free(Sbj);
+
+ StrBufTrim(Encoded);
+ StrBufRFC2047encode(&QPEncoded, Encoded);
+
+ msg->cm_fields['U'] = SmashStrBuf(&QPEncoded);
+ FreeStrBuf(&Encoded);
}
msg->cm_fields['T'] = malloc(64);
snprintf(msg->cm_fields['T'], 64, "%ld", ri->pubdate);
ri->link = NULL;
if (ri->author_or_creator != NULL) free(ri->author_or_creator);
ri->author_or_creator = NULL;
+ if (ri->author_url != NULL) free(ri->author_url);
+ ri->author_url = NULL;
if (ri->description != NULL) free(ri->description);
ri->description = NULL;
/* Throw away any existing character data */
strcpy(el, ++sep);
}
- if ((rssc->Cfg->ItemType == RSS_UNSET) &&
- !strcasecmp(el, "rss"))
+ if ((rssc->Cfg->ItemType == RSS_UNSET) && !strcasecmp(el, "rss"))
{
+ CtdlLogPrintf(9, "RSS: This is an RSS feed.\n");
rssc->Cfg->ItemType = RSS_RSS;
}
- else if ((rssc->Cfg->ItemType == RSS_UNSET) &&
- !strcasecmp(el, "feed"))
+ if ((rssc->Cfg->ItemType == RSS_UNSET) && !strcasecmp(el, "rdf"))
{
+ CtdlLogPrintf(9, "RSS: This is an RDF feed.\n");
+ rssc->Cfg->ItemType = RSS_RSS;
+ }
+ else if ((rssc->Cfg->ItemType == RSS_UNSET) && !strcasecmp(el, "feed"))
+ {
+ CtdlLogPrintf(9, "RSS: This is an ATOM feed.\n");
rssc->Cfg->ItemType = RSS_ATOM;
}
else if ((rssc->Cfg->ItemType == RSS_RSS) &&
else if ( (rssc->Cfg->ItemType == RSS_ATOM) &&
!strcasecmp(el, "entry"))
{ /* Atom feed... */
- CtdlLogPrintf(0, "RSS: found atom...\n");
++ri->item_tag_nesting;
flush_rss_ite(ri);
}
CtdlFillSystemContext(&rssclientCC, "rssclient");
citthread_setspecific(MyConKey, (void *)&rssclientCC );
- CtdlThreadAllocTSD();
-
/*
* This is a simple concurrency check to make sure only one rssclient run
* is done at a time. We could do this with a mutex, but since we
CtdlThreadSchedule ("RSS Client", CTDLTHREAD_BIGSTACK, rssclient_scan, NULL, last_run + config.c_net_freq);
else
CtdlLogPrintf(CTDL_DEBUG, "rssclient: Task STOPPED.\n");
+ CtdlClearSystemContext();
return NULL;
}