X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fmodules%2Frssclient%2Fserv_rssclient.c;h=e0fba5fdcd4237da1a7057717ae6f3f03d91c470;hb=3334c6073b74551d18176701092179deb5b9ef06;hp=11ffb905f138de66eb3b8525ab89b543155867a6;hpb=c71df26b9d35c07eb9c1322a7e83caa86337ad82;p=citadel.git diff --git a/citadel/modules/rssclient/serv_rssclient.c b/citadel/modules/rssclient/serv_rssclient.c index 11ffb905f..e0fba5fdc 100644 --- a/citadel/modules/rssclient/serv_rssclient.c +++ b/citadel/modules/rssclient/serv_rssclient.c @@ -3,32 +3,21 @@ * very loose parser that scrapes both kinds of feeds and is not picky about * the standards compliance of the source data. * - * Copyright (c) 2007-2018 by the citadel.org team + * Copyright (c) 2007-2021 by the citadel.org team * - * This program is open source software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 3. + * This program is open source software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License version 3. * * 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 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ #include #include #include - -#if TIME_WITH_SYS_TIME -# include -# include -#else -# if HAVE_SYS_TIME_H -#include -# else #include -# endif -#endif - #include #include #include @@ -48,7 +37,6 @@ #include "parsedate.h" #include "database.h" #include "citadel_dirs.h" -#include "md5.h" #include "context.h" #include "internet_addressing.h" @@ -78,11 +66,12 @@ struct rssurl *rsstodo = NULL; // This handler is called whenever an XML tag opens. // -void rss_start_element(void *data, const char *el, const char **attribute) -{ +void rss_start_element(void *data, const char *el, const char **attribute) { struct rssparser *r = (struct rssparser *)data; int i; + if (server_shutting_down) return; // shunt the whole operation if we're exiting + if ( (!strcasecmp(el, "entry")) || (!strcasecmp(el, "item")) @@ -116,15 +105,20 @@ void rss_start_element(void *data, const char *el, const char **attribute) // This handler is called whenever an XML tag closes. // -void rss_end_element(void *data, const char *el) -{ +void rss_end_element(void *data, const char *el) { struct rssparser *r = (struct rssparser *)data; + StrBuf *encoded_field; + + if (server_shutting_down) return; // shunt the whole operation if we're exiting + + if (StrLength(r->CData) > 0) { // strip leading/trailing whitespace from field + StrBufTrim(r->CData); + } if ( // end of a new item(rss) or entry(atom) (!strcasecmp(el, "entry")) || (!strcasecmp(el, "item")) ) { - if (r->msg != NULL) { // Save the message to the rooms // use the link as an item id if nothing else is available @@ -177,10 +171,10 @@ void rss_end_element(void *data, const char *el) long msgnum = (-1); for (rr=r->rooms; rr!=NULL; rr=rr->next) { if (rr == r->rooms) { - msgnum = CtdlSubmitMsg(r->msg, NULL, rr->room, 0); + msgnum = CtdlSubmitMsg(r->msg, NULL, rr->room); // in first room, save msg } else { - CtdlSaveMsgPointerInRoom(rr->room, msgnum, 0, NULL); + CtdlSaveMsgPointerInRoom(rr->room, msgnum, 0, NULL); // elsewhere, save a pointer } syslog(LOG_DEBUG, "rssclient: saved message %ld to %s", msgnum, rr->room); } @@ -201,22 +195,25 @@ void rss_end_element(void *data, const char *el) else if (!strcasecmp(el, "title")) { // item subject (rss and atom) if ((r->msg != NULL) && (CM_IsEmpty(r->msg, eMsgSubject))) { - CM_SetField(r->msg, eMsgSubject, ChrPtr(r->CData), StrLength(r->CData)); - striplt(r->msg->cm_fields[eMsgSubject]); + encoded_field = NewStrBuf(); + StrBufRFC2047encode(&encoded_field, r->CData); + CM_SetAsFieldSB(r->msg, eMsgSubject, &encoded_field); } } else if (!strcasecmp(el, "creator")) { // can be used if is not present if ((r->msg != NULL) && (CM_IsEmpty(r->msg, eAuthor))) { - CM_SetField(r->msg, eAuthor, ChrPtr(r->CData), StrLength(r->CData)); - striplt(r->msg->cm_fields[eAuthor]); + encoded_field = NewStrBuf(); + StrBufRFC2047encode(&encoded_field, r->CData); + CM_SetAsFieldSB(r->msg, eAuthor, &encoded_field); } } else if (!strcasecmp(el, "author")) { // supercedes if both are present if (r->msg != NULL) { - CM_SetField(r->msg, eAuthor, ChrPtr(r->CData), StrLength(r->CData)); // CM_SetField will free() the previous value - striplt(r->msg->cm_fields[eAuthor]); + encoded_field = NewStrBuf(); + StrBufRFC2047encode(&encoded_field, r->CData); + CM_SetAsFieldSB(r->msg, eAuthor, &encoded_field); } } @@ -244,7 +241,6 @@ void rss_end_element(void *data, const char *el) r->link = NULL; } r->link = strdup(ChrPtr(r->CData)); - striplt(r->link); } else if ( @@ -256,7 +252,6 @@ void rss_end_element(void *data, const char *el) r->item_id = NULL; } r->item_id = strdup(ChrPtr(r->CData)); - striplt(r->item_id); } else if ( @@ -269,7 +264,6 @@ void rss_end_element(void *data, const char *el) r->description = NULL; } r->description = strdup(ChrPtr(r->CData)); - striplt(r->description); } if (r->CData != NULL) { @@ -325,6 +319,7 @@ void rssclient_push_todo(char *rssurl, char *roomname) thisone = r; } } + if (thisone == NULL) { thisone = malloc(sizeof(struct rssurl)); thisone->url = strdup(rssurl); @@ -382,7 +377,7 @@ void rss_pull_feeds(void) struct rssurl *r; struct rssroom *rr; - while (rsstodo != NULL) { + while ((rsstodo != NULL) && (!server_shutting_down)) { rss_pull_one_feed(rsstodo); r = rsstodo; rsstodo = rsstodo->next; @@ -407,6 +402,8 @@ void rssclient_scan_room(struct ctdlroom *qrbuf, void *data) char cfgline[SIZ]; int i = 0; + if (server_shutting_down) return; + serialized_config = LoadRoomNetConfigFile(qrbuf->QRnumber); if (!serialized_config) { return; @@ -463,4 +460,3 @@ CTDL_MODULE_INIT(rssclient) } return "rssclient"; } -