add whether we're in which eventloop / a worker thread to the log output.
[citadel.git] / citadel / modules / rssclient / serv_rssclient.c
index b2a069fd6a2ecabe0ccc172e84a9dcc86d0145f8..743948b090e5b757c575f4cdb0b1df55185e5826 100644 (file)
@@ -75,13 +75,13 @@ int RSSClientDebugEnabled = 0;
 
 #define EVRSSC_syslog(LEVEL, FORMAT, ...)                              \
        DBGLOG(LEVEL) syslog(LEVEL,                                     \
-                            "IO[%ld]CC[%d][%ld]RSS" FORMAT,            \
-                            IO->ID, CCID, N, __VA_ARGS__)
+                            "%s[%ld]CC[%d][%ld]RSS" FORMAT,            \
+                            IOSTR, IO->ID, CCID, N, __VA_ARGS__)
 
 #define EVRSSCM_syslog(LEVEL, FORMAT)                                  \
        DBGLOG(LEVEL) syslog(LEVEL,                                     \
-                            "IO[%ld]CC[%d][%ld]RSS" FORMAT,            \
-                            IO->ID, CCID, N)
+                            "%s[%ld]CC[%d][%ld]RSS" FORMAT,            \
+                            IOSTR, IO->ID, CCID, N)
 
 #define EVRSSQ_syslog(LEVEL, FORMAT, ...)                              \
        DBGLOG(LEVEL) syslog(LEVEL, "RSS" FORMAT,                       \
@@ -90,8 +90,8 @@ int RSSClientDebugEnabled = 0;
        DBGLOG(LEVEL) syslog(LEVEL, "RSS" FORMAT)
 
 #define EVRSSCSM_syslog(LEVEL, FORMAT)                                 \
-       DBGLOG(LEVEL) syslog(LEVEL, "IO[%ld][%ld]RSS" FORMAT,           \
-                            IO->ID, N)
+       DBGLOG(LEVEL) syslog(LEVEL, "%s[%ld][%ld]RSS" FORMAT,           \
+                            IOSTR, IO->ID, N)
 
 typedef enum _RSSState {
        eRSSCreated,
@@ -274,11 +274,24 @@ void AppendLink(StrBuf *Message,
 }
 
 
-void rss_format_item(networker_save_message *SaveMsg)
+int rss_format_item(AsyncIO *IO, networker_save_message *SaveMsg)
 {
        StrBuf *Message;
        int msglen = 0;
 
+       if (StrLength(SaveMsg->description) + 
+           StrLength(SaveMsg->link) + 
+           StrLength(SaveMsg->linkTitle) + 
+           StrLength(SaveMsg->reLink) +
+           StrLength(SaveMsg->reLinkTitle) +
+           StrLength(SaveMsg->title) == 0)
+       {
+               EVRSSCM_syslog(LOG_INFO, "Refusing to save empty message.");
+               return 0;
+       }
+
+       CM_Flush(&SaveMsg->Msg);
+
        if (SaveMsg->author_or_creator != NULL) {
 
                char *From;
@@ -296,36 +309,31 @@ void rss_format_item(networker_save_message *SaveMsg)
                if (!FromAt && StrLength (SaveMsg->author_email) > 0)
                {
                        StrBufRFC2047encode(&Encoded, SaveMsg->author_or_creator);
-                       SaveMsg->Msg.cm_fields['A'] = SmashStrBuf(&Encoded);
-                       SaveMsg->Msg.cm_fields['P'] =
-                               SmashStrBuf(&SaveMsg->author_email);
+                       CM_SetAsFieldSB(&SaveMsg->Msg, eAuthor, &Encoded);
+                       CM_SetAsFieldSB(&SaveMsg->Msg, eMessagePath, &SaveMsg->author_email);
                }
                else
                {
                        if (FromAt)
                        {
-                               SaveMsg->Msg.cm_fields['A'] =
-                                       SmashStrBuf(&SaveMsg->author_or_creator);
-                               SaveMsg->Msg.cm_fields['P'] =
-                                       strdup(SaveMsg->Msg.cm_fields['A']);
+                               CM_SetAsFieldSB(&SaveMsg->Msg, eAuthor, &SaveMsg->author_or_creator);
+                               CM_CopyField(&SaveMsg->Msg, eMessagePath, eAuthor);
                        }
                        else
                        {
                                StrBufRFC2047encode(&Encoded,
                                                    SaveMsg->author_or_creator);
-                               SaveMsg->Msg.cm_fields['A'] =
-                                       SmashStrBuf(&Encoded);
-                               SaveMsg->Msg.cm_fields['P'] =
-                                       strdup("rss@localhost");
+                               CM_SetAsFieldSB(&SaveMsg->Msg, eAuthor, &Encoded);
+                               CM_SetField(&SaveMsg->Msg, eMessagePath, HKEY("rss@localhost"));
 
                        }
                }
        }
        else {
-               SaveMsg->Msg.cm_fields['A'] = strdup("rss");
+               CM_SetField(&SaveMsg->Msg, eAuthor, HKEY("rss"));
        }
 
-       SaveMsg->Msg.cm_fields['N'] = strdup(NODENAME);
+       CM_SetField(&SaveMsg->Msg, eNodeName, CFG_KEY(c_nodename));
        if (SaveMsg->title != NULL) {
                long len;
                char *Sbj;
@@ -347,7 +355,7 @@ void rss_format_item(networker_save_message *SaveMsg)
                StrBufTrim(Encoded);
                StrBufRFC2047encode(&QPEncoded, Encoded);
 
-               SaveMsg->Msg.cm_fields['U'] = SmashStrBuf(&QPEncoded);
+               CM_SetAsFieldSB(&SaveMsg->Msg, eMsgSubject, &QPEncoded);
                FreeStrBuf(&Encoded);
        }
        if (SaveMsg->link == NULL)
@@ -375,8 +383,8 @@ void rss_format_item(networker_save_message *SaveMsg)
        AppendLink(Message, SaveMsg->reLink, SaveMsg->reLinkTitle, "Reply to this");
        StrBufAppendBufPlain(Message, HKEY("</body></html>\n"), 0);
 
-
        SaveMsg->Message = Message;
+       return 1;
 }
 
 eNextState RSSSaveMessage(AsyncIO *IO)
@@ -385,16 +393,17 @@ eNextState RSSSaveMessage(AsyncIO *IO)
        const char *Key;
        rss_aggregator *RSSAggr = (rss_aggregator *) IO->Data;
 
-       rss_format_item(RSSAggr->ThisMsg);
-
-       RSSAggr->ThisMsg->Msg.cm_fields['M'] =
-               SmashStrBuf(&RSSAggr->ThisMsg->Message);
-
-       CtdlSubmitMsg(&RSSAggr->ThisMsg->Msg, &RSSAggr->recp, NULL, 0);
-
-       /* write the uidl to the use table so we don't store this item again */
+       if (rss_format_item(IO, RSSAggr->ThisMsg))
+       {
+               CM_SetAsFieldSB(&RSSAggr->ThisMsg->Msg, eMesageText,
+                                      &RSSAggr->ThisMsg->Message);
 
-       CheckIfAlreadySeen("RSS Item Insert", RSSAggr->ThisMsg->MsgGUID, IO->Now, 0, eWrite, IO->ID, CCID);
+               CtdlSubmitMsg(&RSSAggr->ThisMsg->Msg, &RSSAggr->recp, NULL, 0);
+               
+               /* write the uidl to the use table so we don't store this item again */
+               
+               CheckIfAlreadySeen("RSS Item Insert", RSSAggr->ThisMsg->MsgGUID, IO->Now, 0, eWrite, CCID, IO->ID);
+       }
 
        if (GetNextHashPos(RSSAggr->Messages,
                           RSSAggr->Pos,
@@ -407,20 +416,20 @@ eNextState RSSSaveMessage(AsyncIO *IO)
 
 eNextState RSS_FetchNetworkUsetableEntry(AsyncIO *IO)
 {
+#ifndef DEBUG_RSS
        const char *Key;
        long len;
        rss_aggregator *Ctx = (rss_aggregator *) IO->Data;
 
        /* Find out if we've already seen this item */
 // todo: expiry?
-#ifndef DEBUG_RSS
        SetRSSState(IO, eRSSUT);
        if (CheckIfAlreadySeen("RSS Item Seen",
                               Ctx->ThisMsg->MsgGUID,
                               IO->Now,
-                              IO->Now - USETABLE_ANTIEXPIRE,
+                              IO->Now - USETABLE_ANTIEXPIRE_HIRES,
                               eCheckUpdate,
-                              IO->ID, CCID)
+                              CCID, IO->ID)
            != 0)
        {
                /* Item has already been seen */
@@ -464,7 +473,7 @@ void UpdateLastKnownGood(pRSSConfig *pCfg, time_t now)
                        if (RSSCfg == pCfg->pCfg)
                                break;
 
-                       RSSCfg = RSSCfg->Next;
+                       RSSCfg = RSSCfg->next;
                }
                if (RSSCfg != NULL)
                {
@@ -503,14 +512,23 @@ eNextState RSSAggregator_AnalyseReply(AsyncIO *IO)
 
                strs[1] = ChrPtr(Ctx->rooms);
                lens[1] = StrLength(Ctx->rooms);
+
+               if (IO->HttpReq.CurlError == NULL)
+                       IO->HttpReq.CurlError = "";
+
                StrBufPrintf(ErrMsg,
                             "Error while RSS-Aggregation Run of %s\n"
                             " need a 200, got a %ld !\n"
+                            " Curl Error message: \n%s / %s\n"
                             " Response text was: \n"
                             " \n %s\n",
                             ChrPtr(Ctx->Url),
                             IO->HttpReq.httpcode,
-                            ChrPtr(IO->HttpReq.ReplyData));
+                            IO->HttpReq.errdesc,
+                            IO->HttpReq.CurlError,
+                            ChrPtr(IO->HttpReq.ReplyData)
+                       );
+
                CtdlAideFPMessage(
                        ChrPtr(ErrMsg),
                        "RSS Aggregation run failure",
@@ -539,8 +557,10 @@ eNextState RSSAggregator_AnalyseReply(AsyncIO *IO)
                if (it != NULL)
                {
                        void *vptr;
-                       GetNextHashPos(Ctx->OtherQRnumbers, it, &len, &Key, &vptr);
-                       pCfg = vptr;
+                       if (GetNextHashPos(Ctx->OtherQRnumbers, it, &len, &Key, &vptr))
+                               pCfg = vptr;
+                       else
+                               pCfg = NULL;
                }
                else 
                        pCfg = NULL;
@@ -573,7 +593,7 @@ eNextState RSSAggregator_AnalyseReply(AsyncIO *IO)
                               IO->Now,
                               IO->Now - USETABLE_ANTIEXPIRE,
                               eCheckUpdate,
-                              IO->ID, CCID)
+                              CCID, IO->ID)
            != 0)
        {
                FreeStrBuf(&guid);
@@ -589,7 +609,7 @@ eNextState RSSAggregator_AnalyseReply(AsyncIO *IO)
 
 eNextState RSSAggregator_FinishHttp(AsyncIO *IO)
 {
-       return QueueDBOperation(IO, RSSAggregator_AnalyseReply);
+       return CurlQueueDBOperation(IO, RSSAggregator_AnalyseReply);
 }
 
 /*
@@ -695,7 +715,7 @@ void rssclient_scan_room(struct ctdlroom *qrbuf, void *data, OneRoomNetCfg *OneR
 
                        pthread_mutex_unlock(&RSSQueueMutex);
 
-                       RSSCfg = RSSCfg->Next;
+                       RSSCfg = RSSCfg->next;
                        continue;
                }
                pthread_mutex_unlock(&RSSQueueMutex);
@@ -722,7 +742,7 @@ void rssclient_scan_room(struct ctdlroom *qrbuf, void *data, OneRoomNetCfg *OneR
                    DeleteRssCfg);
 
                pthread_mutex_unlock(&RSSQueueMutex);
-               RSSCfg = RSSCfg->Next;
+               RSSCfg = RSSCfg->next;
        }
 }
 
@@ -830,7 +850,7 @@ void rssclient_veto_scan_room(struct ctdlroom *qrbuf, void *data, OneRoomNetCfg
                        StrBufAppendBuf(Info->ErrMsg, RSSCfg->Url, 0);
                        StrBufAppendBufPlain(Info->ErrMsg, HKEY(">\n"), 0);
                }
-               RSSCfg = RSSCfg->Next;
+               RSSCfg = RSSCfg->next;
        }
 }
 
@@ -862,7 +882,7 @@ void ParseRSSClientCfgLine(const CfgLineType *ThisOne, StrBuf *Line, const char
        RSSCfg->last_known_good = StrBufExtractNext_long(Line, &LinePos, '|');
 
 
-       RSSCfg->Next = (RSSCfgLine *)OneRNCFG->NetConfigs[ThisOne->C];
+       RSSCfg->next = (RSSCfgLine *)OneRNCFG->NetConfigs[ThisOne->C];
        OneRNCFG->NetConfigs[ThisOne->C] = (RoomNetCfgLine*) RSSCfg;
 }
 
@@ -878,7 +898,7 @@ void SerializeRSSClientCfgLine(const CfgLineType *ThisOne, StrBuf *OutputBuffer,
 
 void DeleteRSSClientCfgLine(const CfgLineType *ThisOne, RoomNetCfgLine **data)
 {
-       RSSCfgLine *RSSCfg = (RSSCfgLine*) data;
+       RSSCfgLine *RSSCfg = (RSSCfgLine*) *data;
 
        FreeStrBuf(&RSSCfg->Url);
        free(*data);