]> code.citadel.org Git - citadel.git/blobdiff - citadel/modules/rssclient/serv_rssclient.c
parse uidl list
[citadel.git] / citadel / modules / rssclient / serv_rssclient.c
index 2b1baa5d9b14f014a6677f3d8e355729bcea1fe0..79b1fc3054ba20f1e4f61db19fb0b9aee8611fcb 100644 (file)
@@ -134,7 +134,7 @@ void rss_end_element(void *data, const char *el)
                        // check the use table
                        StrBuf *u = NewStrBuf();
                        StrBufAppendPrintf(u, "rss/%s", r->item_id);
-                       time_t already_seen = CheckIfAlreadySeen("rss", u, time(NULL), 604800, eUpdate, 0, 0);
+                       time_t already_seen = CheckIfAlreadySeen(u, time(NULL), 604800, eUpdate);
                        FreeStrBuf(&u);
 
                        if (already_seen == 0) {
@@ -213,13 +213,21 @@ void rss_end_element(void *data, const char *el)
        }
 
        else if (!strcasecmp(el, "pubdate")) {                  // date/time stamp (rss) Sat, 25 Feb 2017 14:28:01 EST
-               if (CM_IsEmpty(r->msg, eTimestamp)) {
+               if ((r->msg)&&(r->msg->cm_fields[eTimestamp]==NULL)) {
                        CM_SetFieldLONG(r->msg, eTimestamp, parsedate(ChrPtr(r->CData)));
                }
        }
 
        else if (!strcasecmp(el, "updated")) {                  // date/time stamp (atom) 2003-12-13T18:30:02Z
-               // FIXME parse it
+               if ((r->msg)&&(r->msg->cm_fields[eTimestamp]==NULL)) {
+                       struct tm t;
+                       char zulu;
+                       memset(&t, 0, sizeof t);
+                       sscanf(ChrPtr(r->CData), "%d-%d-%dT%d:%d:%d%c", &t.tm_year, &t.tm_mon, &t.tm_mday, &t.tm_hour, &t.tm_min, &t.tm_sec, &zulu);
+                       t.tm_year -= 1900;
+                       t.tm_mon -= 1;
+                       CM_SetFieldLONG(r->msg, eTimestamp, mktime(&t));
+               }
        }
 
        else if (!strcasecmp(el, "link")) {                     // link to story (rss)
@@ -246,6 +254,7 @@ void rss_end_element(void *data, const char *el)
        else if (
                (!strcasecmp(el, "description"))                // message text (rss)
                || (!strcasecmp(el, "summary"))                 // message text (atom)
+               || (!strcasecmp(el, "content"))                 // message text (atom)
        ) {
                if (r->description != NULL) {
                        free(r->description);
@@ -284,7 +293,7 @@ void rss_parse_feed(StrBuf *Feed, struct rssroom *rooms)
 
        memset(&r, 0, sizeof r);
        r.rooms = rooms;
-       XML_Parser p = XML_ParserCreateNS("UTF-8", ':');
+       XML_Parser p = XML_ParserCreate("UTF-8");
        XML_SetElementHandler(p, rss_start_element, rss_end_element);
        XML_SetCharacterDataHandler(p, rss_handle_data);
        XML_SetUserData(p, (void *)&r);
@@ -323,17 +332,6 @@ void rssclient_push_todo(char *rssurl, char *roomname)
 }
 
 
-// Callback function for curl
-//
-size_t rss_pof_write_data(void *buffer, size_t size, size_t nmemb, void *userp)
-{
-       StrBuf *Downloaded = (StrBuf *)userp;
-       size_t bytes = size * nmemb;
-       StrBufAppendBufPlain(Downloaded, buffer, bytes, 0);
-       return(bytes);
-}
-
-
 // pull one feed (possibly multiple rooms)
 //
 void rss_pull_one_feed(struct rssurl *url)
@@ -353,7 +351,7 @@ void rss_pull_one_feed(struct rssurl *url)
 
        curl_easy_setopt(curl, CURLOPT_URL, url->url);
        curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);                     // Follow redirects
-       curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, rss_pof_write_data);      // What to do with downloaded data
+       curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, CurlFillStrBuf_callback); // What to do with downloaded data
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, Downloaded);                  // Give it our StrBuf to work with
        curl_easy_setopt(curl, CURLOPT_TIMEOUT, 20L);                           // Time out after 20 seconds
        res = curl_easy_perform(curl);                                          // Perform the request