X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fmodules%2Frssclient%2Fserv_rssclient.c;h=b1610d67b0d0eb6b969a6525309408d2ab3dd22f;hb=1421d26887f154439d2cd27075c7e85dc22f644f;hp=f176ae7c5846036da958f4ad97c2bca4da6e2316;hpb=582470a6adda00d5fd5ec218ea28ad44c66ce508;p=citadel.git diff --git a/citadel/modules/rssclient/serv_rssclient.c b/citadel/modules/rssclient/serv_rssclient.c index f176ae7c5..b1610d67b 100644 --- a/citadel/modules/rssclient/serv_rssclient.c +++ b/citadel/modules/rssclient/serv_rssclient.c @@ -1,8 +1,23 @@ /* - * $Id: serv_rssclient.c 5652 2007-10-29 20:14:48Z ajc $ + * $Id$ * * Bring external RSS feeds into rooms. * + * Copyright (c) 2007-2009 by the citadel.org team + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include @@ -34,7 +49,6 @@ #include "support.h" #include "config.h" #include "threads.h" -#include "room_ops.h" #include "ctdl_module.h" #include "clientsocket.h" #include "msgbase.h" @@ -42,6 +56,7 @@ #include "database.h" #include "citadel_dirs.h" #include "md5.h" +#include "context.h" struct rssnetcfg { @@ -62,6 +77,7 @@ struct rss_item { time_t pubdate; char channel_title[256]; int item_tag_nesting; + char *author_or_creator; }; struct rssnetcfg *rnclist = NULL; @@ -139,19 +155,34 @@ void rss_save_item(struct rss_item *ri) { msg->cm_magic = CTDLMESSAGE_MAGIC; msg->cm_anon_type = MES_NORMAL; msg->cm_format_type = FMT_RFC822; - msg->cm_fields['A'] = strdup("rss"); + + 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']); + } + else { + msg->cm_fields['A'] = strdup("rss"); + } + msg->cm_fields['N'] = strdup(NODENAME); - msg->cm_fields['U'] = strdup(ri->title); + if (ri->title != NULL) { + msg->cm_fields['U'] = html_to_ascii(ri->title, strlen(ri->title), 512, 0); + striplt(msg->cm_fields['U']); + } msg->cm_fields['T'] = malloc(64); snprintf(msg->cm_fields['T'], 64, "%ld", ri->pubdate); - if (!IsEmptyStr(ri->channel_title)) { - msg->cm_fields['O'] = strdup(ri->channel_title); + if (ri->channel_title != NULL) { + if (!IsEmptyStr(ri->channel_title)) { + msg->cm_fields['O'] = strdup(ri->channel_title); + } } - - msglen = 1024 + strlen(ri->link) + strlen(ri->description) ; + if (ri->link == NULL) + ri->link = strdup(""); + msglen += 1024 + strlen(ri->link) + strlen(ri->description) ; msg->cm_fields['M'] = malloc(msglen); snprintf(msg->cm_fields['M'], msglen, - "Content-type: text/html\r\n\r\n" + "Content-type: text/html; charset=\"UTF-8\"\r\n\r\n" "\n" "%s

\n" "%s\n" @@ -161,7 +192,7 @@ void rss_save_item(struct rss_item *ri) { ri->link, ri->link ); - CtdlSubmitMsg(msg, recp, NULL); + CtdlSubmitMsg(msg, recp, NULL, 0); CtdlFreeMessage(msg); /* write the uidl to the use table so we don't store this item again */ @@ -232,6 +263,8 @@ void rss_xml_start(void *data, const char *supplied_el, const char **attr) { ri->title = NULL; if (ri->link != NULL) free(ri->link); ri->link = NULL; + if (ri->author_or_creator != NULL) free(ri->author_or_creator); + ri->author_or_creator = NULL; if (ri->description != NULL) free(ri->description); ri->description = NULL; @@ -291,6 +324,12 @@ void rss_xml_end(void *data, const char *supplied_el) { ri->pubdate = rdf_parsedate(ri->chardata); } + if ( ((!strcasecmp(el, "author")) || (!strcasecmp(el, "creator"))) && (ri->chardata != NULL) ) { + if (ri->author_or_creator != NULL) free(ri->author_or_creator); + striplt(ri->chardata); + ri->author_or_creator = strdup(ri->chardata); + } + if (!strcasecmp(el, "item")) { --ri->item_tag_nesting; rss_save_item(ri); @@ -376,6 +415,15 @@ void rss_do_fetching(char *url, char *rooms) { curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, rss_libcurl_callback); curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errmsg); curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); +#ifdef CURLOPT_HTTP_CONTENT_DECODING + curl_easy_setopt(curl, CURLOPT_HTTP_CONTENT_DECODING, 1); + curl_easy_setopt(curl, CURLOPT_ENCODING, ""); +#endif + curl_easy_setopt(curl, CURLOPT_USERAGENT, CITADEL); + curl_easy_setopt(curl, CURLOPT_TIMEOUT, 180); /* die after 180 seconds */ + if (!IsEmptyStr(config.c_ip_addr)) { + curl_easy_setopt(curl, CURLOPT_INTERFACE, config.c_ip_addr); + } memset(&ri, 0, sizeof(struct rss_item)); ri.roomlist = rooms; @@ -415,6 +463,8 @@ shutdown: ri.title = NULL; if (ri.link != NULL) free(ri.link); ri.link = NULL; + if (ri.author_or_creator != NULL) free(ri.author_or_creator); + ri.author_or_creator = NULL; if (ri.description != NULL) free(ri.description); ri.description = NULL; if (ri.chardata_len > 0) { @@ -515,10 +565,8 @@ void *rssclient_scan(void *args) { struct CitContext rssclientCC; /* Give this thread its own private CitContext */ - memset(&rssclientCC, 0, sizeof(struct CitContext)); - rssclientCC.internal_pgm = 1; - rssclientCC.cs_pid = 0; - pthread_setspecific(MyConKey, (void *)&rssclientCC ); + CtdlFillSystemContext(&rssclientCC, "rssclient"); + citthread_setspecific(MyConKey, (void *)&rssclientCC ); CtdlThreadAllocTSD(); @@ -532,7 +580,7 @@ void *rssclient_scan(void *args) { doing_rssclient = 1; CtdlLogPrintf(CTDL_DEBUG, "rssclient started\n"); - ForEachRoom(rssclient_scan_room, NULL); + CtdlForEachRoom(rssclient_scan_room, NULL); while (rnclist != NULL && !CtdlThreadCheckStop()) { rss_do_fetching(rnclist->url, rnclist->rooms); @@ -557,8 +605,9 @@ CTDL_MODULE_INIT(rssclient) { if (threading) { + CtdlLogPrintf(CTDL_INFO, "%s\n", curl_version()); CtdlThreadSchedule ("RSS Client", CTDLTHREAD_BIGSTACK, rssclient_scan, NULL, 0); } /* return our Subversion id for the Log */ - return "$Id: serv_rssclient.c 5652 2007-10-29 20:14:48Z ajc $"; + return "$Id$"; }