X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fmodules%2Frssclient%2Fserv_rssclient.c;h=e0fba5fdcd4237da1a7057717ae6f3f03d91c470;hb=3334c6073b74551d18176701092179deb5b9ef06;hp=85d7f0c1b2675c8e068520790e610e13b7fc4d36;hpb=f3d67d7b31c63a0830c714420f6c3af0fdbbb13b;p=citadel.git diff --git a/citadel/modules/rssclient/serv_rssclient.c b/citadel/modules/rssclient/serv_rssclient.c index 85d7f0c1b..e0fba5fdc 100644 --- a/citadel/modules/rssclient/serv_rssclient.c +++ b/citadel/modules/rssclient/serv_rssclient.c @@ -3,7 +3,7 @@ * very loose parser that scrapes both kinds of feeds and is not picky about * the standards compliance of the source data. * - * Copyright (c) 2007-2020 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. @@ -17,18 +17,7 @@ #include #include #include - -#if TIME_WITH_SYS_TIME -# include -# include -#else -# if HAVE_SYS_TIME_H -#include -# else #include -# endif -#endif - #include #include #include @@ -77,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")) @@ -115,9 +105,15 @@ 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")) @@ -175,7 +171,7 @@ 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); // in first room, save msg + msgnum = CtdlSubmitMsg(r->msg, NULL, rr->room); // in first room, save msg } else { CtdlSaveMsgPointerInRoom(rr->room, msgnum, 0, NULL); // elsewhere, save a pointer @@ -199,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); } } @@ -242,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 ( @@ -254,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 ( @@ -267,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) { @@ -381,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; @@ -406,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; @@ -462,4 +460,3 @@ CTDL_MODULE_INIT(rssclient) } return "rssclient"; } -