Move the thread matching from the blog to a more generic place.
authorWilfried Goesgens <dothebart@citadel.org>
Tue, 6 Jan 2015 21:00:46 +0000 (22:00 +0100)
committerWilfried Goesgens <dothebart@citadel.org>
Tue, 6 Jan 2015 21:00:46 +0000 (22:00 +0100)
webcit/blogview_renderer.c
webcit/messages.h
webcit/msg_renderers.c
webcit/sitemap.c
webcit/webcit.h

index 2e9d35e32a6280877567429711d02b25ed430ef6..b57d9d963c6629e4790587128c1c625d166737e4 100644 (file)
@@ -21,6 +21,8 @@ typedef struct __BLOG {
        HashList *BLOG;
        long p;
        int gotonext;
+       StrBuf *Charset;
+       StrBuf *Buf;
 } BLOG;
 
 
@@ -110,11 +112,13 @@ int blogview_GetParamsGetServerCall(SharedMessageStatus *Stat,
                                    long flen)
 {
        BLOG *BL = (BLOG*) malloc(sizeof(BLOG)); 
-       BL->BLOG = NewHash(1, NULL);
+       BL->BLOG = NewHash(1, lFlathash);
        
        /* are we looking for a specific post? */
        BL->p = lbstr("p");
        BL->gotonext = havebstr("gotonext");
+       BL->Charset = NewStrBuf();
+       BL->Buf = NewStrBuf();
        *ViewSpecific = BL;
 
        Stat->startmsg = (-1);                                  /* not used here */
@@ -130,42 +134,6 @@ int blogview_GetParamsGetServerCall(SharedMessageStatus *Stat,
 }
 
 
-/*
- * Given a msgnum, populate the id and refs fields of
- * a "struct bltr" by fetching them from the Citadel server
- */
-struct bltr blogview_learn_thread_references(long msgnum)
-{
-       StrBuf *Buf;
-       StrBuf *r;
-       int len;
-       struct bltr bltr = { 0, 0 } ;
-       Buf = NewStrBuf();
-       r = NewStrBuf();
-       serv_printf("MSG0 %ld|1", msgnum);              /* top level citadel headers only */
-       StrBuf_ServGetln(Buf);
-       if (GetServerStatus(Buf, NULL) == 1) {
-               while (len = StrBuf_ServGetln(Buf), 
-                      ((len >= 0) && 
-                       ((len != 3) || strcmp(ChrPtr(Buf), "000") )))
-               {
-                       if (!strncasecmp(ChrPtr(Buf), "msgn=", 5)) {
-                               StrBufCutLeft(Buf, 5);
-                               bltr.id = ThreadIdHash(Buf);
-                       }
-                       else if (!strncasecmp(ChrPtr(Buf), "wefw=", 5)) {
-                               StrBufCutLeft(Buf, 5);          /* trim the field name */
-                               StrBufExtract_token(r, Buf, 0, '|');
-                               bltr.refs = ThreadIdHash(r);
-                       }
-               }
-       }
-       FreeStrBuf(&Buf);
-       FreeStrBuf(&r);
-       return(bltr);
-}
-
-
 /*
  * This function is called for every message in the list.
  */
@@ -176,30 +144,38 @@ int blogview_LoadMsgFromServer(SharedMessageStatus *Stat,
                              int i)
 {
        BLOG *BL = (BLOG*) *ViewSpecific;
-       struct bltr b;
        struct blogpost *bp = NULL;
 
-       b = blogview_learn_thread_references(Msg->msgnum);
+       ReadOneMessageSummary(Msg, BL->Charset, BL->Buf);
 
        /* Stop processing if the viewer is only interested in a single post and
         * that message ID is neither the id nor the refs.
         */
-       if ((BL->p != 0) && (BL->p != b.id) && (BL->p != b.refs)) {
+       if ((BL->p != 0) &&
+           (BL->p != Msg->reply_inreplyto_hash) &&
+           (BL->p != Msg->reply_references_hash)) {
                return 200;
        }
 
        /*
         * Add our little bundle of blogworthy wonderfulness to the hash table
         */
-       if (b.refs == 0) {
+       if (Msg->reply_references_hash == 0) {
                bp = malloc(sizeof(struct blogpost));
                if (!bp) return(200);
                memset(bp, 0, sizeof (struct blogpost));
-               bp->top_level_id = b.id;
-               Put(BL->BLOG, (const char *)&b.id, sizeof(b.id), bp, (DeleteHashDataFunc)blogpost_destroy);
+               bp->top_level_id = Msg->reply_inreplyto_hash;
+               Put(BL->BLOG,
+                   (const char *)&Msg->reply_inreplyto_hash,
+                   sizeof(Msg->reply_inreplyto_hash),
+                   bp,
+                   (DeleteHashDataFunc)blogpost_destroy);
        }
        else {
-               GetHash(BL->BLOG, (const char *)&b.refs , sizeof(b.refs), (void *)&bp);
+               GetHash(BL->BLOG,
+                       (const char *)&Msg->reply_references_hash,
+                       sizeof(Msg->reply_references_hash),
+                       (void *)&bp);
        }
 
        /*
@@ -220,6 +196,11 @@ int blogview_LoadMsgFromServer(SharedMessageStatus *Stat,
                                ((bp->alloc_msgs - bp->num_msgs) * sizeof(long)) );
                }
                bp->msgs[bp->num_msgs++] = Msg->msgnum;
+               if ((Msg->Flags & MSGFLAG_READ) != 0) {
+                       syslog(LOG_DEBUG, "****************** unread %ld", Msg->msgnum);
+                       
+                       bp->unread_oments++;
+               }
        }
        else {
                syslog(LOG_DEBUG, "** comment %ld is unparented", Msg->msgnum);
@@ -263,12 +244,15 @@ int blogview_render(SharedMessageStatus *Stat, void **ViewSpecific, long oper)
        int maxp = 0;
 
        /* Comments are shown if we are only viewing a single blog post */
-       if (atoi(BSTR("p"))) with_comments = 1;
+       with_comments = (BL->p != 0);
 
        firstp = atoi(BSTR("firstp"));  /* start reading at... */
        maxp = atoi(BSTR("maxp"));      /* max posts to show... */
        if (maxp < 1) maxp = 5;         /* default; move somewhere else? */
 
+
+       //// bp->unread_oments++;
+
        /* Iterate through the hash list and copy the data pointers into an array */
        it = GetNewHashPos(BL->BLOG, 0);
        while (GetNextHashPos(BL->BLOG, it, &len, &Key, &Data)) {
@@ -337,6 +321,8 @@ int blogview_Cleanup(void **ViewSpecific)
 {
        BLOG *BL = (BLOG*) *ViewSpecific;
 
+       FreeStrBuf(&BL->Buf);
+       FreeStrBuf(&BL->Charset);
        DeleteHash(&BL->BLOG);
        free(BL);
        wDumpContent(1);
index 3c0145b9a42213c8fdda6fd029c5e23d82c2103c..eb014f43852f55452d9afab34c491feccb266abf 100644 (file)
@@ -52,7 +52,9 @@ typedef struct _message_summary {
        StrBuf *to;             /* the recipient */
        StrBuf *subj;           /* the title / subject */
        StrBuf *reply_inreplyto;
+       long    reply_inreplyto_hash;
        StrBuf *reply_references;
+       long    reply_references_hash;
        StrBuf *ReplyTo;
        StrBuf *cccc;
        StrBuf *hnod;
@@ -282,3 +284,12 @@ void RegisterMimeRenderer(const char *HeaderName, long HdrNLen,
                          RenderMimeFunc MimeRenderer,
                          int InlineRenderable,
                          int Priority);
+
+
+/**
+ * @brief fill the header parts of Msg with the headers loaded by MSG0
+ * @param Msg empty message struct, only preinitialized with the msgid
+ * @param FoundCharset buffer with the prefered charset of the headers
+ * @param buf linebuffer used to buffer citserver replies
+ */
+int ReadOneMessageSummary(message_summary *Msg, StrBuf *FoundCharset, StrBuf *Buf);
index 9c63236903813da9046d502827dc2c5930e4a8a4..408bc97d44f7a88bb9eaa2bb76e9af3ce2e40dd8 100644 (file)
@@ -329,6 +329,7 @@ void examine_msgn(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset)
        CheckConvertBufs(WCC);
        FreeStrBuf(&Msg->reply_inreplyto);
        Msg->reply_inreplyto = NewStrBufPlain(NULL, StrLength(HdrLine));
+       Msg->reply_inreplyto_hash = ThreadIdHash(HdrLine);
        StrBuf_RFC822_2_Utf8(Msg->reply_inreplyto, 
                             HdrLine, 
                             WCC->DefaultCharset,
@@ -355,6 +356,7 @@ void examine_wefw(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCharset)
        CheckConvertBufs(WCC);
        FreeStrBuf(&Msg->reply_references);
        Msg->reply_references = NewStrBufPlain(NULL, StrLength(HdrLine));
+       Msg->reply_references_hash = ThreadIdHash(HdrLine);
        StrBuf_RFC822_2_Utf8(Msg->reply_references, 
                             HdrLine, 
                             WCC->DefaultCharset, 
@@ -878,29 +880,22 @@ void examine_content_type(message_summary *Msg, StrBuf *HdrLine, StrBuf *FoundCh
 }
 
 
-message_summary *ReadOneMessageSummary(StrBuf *RawMessage, const char *DefaultSubject, StrBuf *FoundCharset, long MsgNum) 
+int ReadOneMessageSummary(message_summary *Msg, StrBuf *FoundCharset, StrBuf *Buf)
 {
        void *vHdr;
        headereval *Hdr;
-       message_summary      *Msg;
-       StrBuf *Buf;
        const char *buf;
        const char *ebuf;
        int nBuf;
        long len;
        
-       Buf = NewStrBuf();
-
-       serv_printf("MSG0 %ld|1", MsgNum);      /* ask for headers only */
+       serv_printf("MSG0 %ld|1", Msg->msgnum); /* ask for headers only */
        
        StrBuf_ServGetln(Buf);
-       if (GetServerStatus(Buf, NULL) == 1) {
-               FreeStrBuf(&Buf);
-               return NULL;
+       if (GetServerStatus(Buf, NULL) != 1) {
+               return 0;
        }
 
-       Msg = (message_summary*)malloc(sizeof(message_summary));
-       memset(Msg, 0, sizeof(message_summary));
        while (len = StrBuf_ServGetln(Buf),
               (len >= 0) && 
               ((len != 3)  ||
@@ -918,7 +913,7 @@ message_summary *ReadOneMessageSummary(StrBuf *RawMessage, const char *DefaultSu
                }
                else syslog(LOG_INFO, "Don't know how to handle Message Headerline [%s]", ChrPtr(Buf));
        }
-       return Msg;
+       return 1;
 }
 
 void tmplput_MAIL_SUMM_N(StrBuf *Target, WCTemplputParams *TP)
index 477e7742928f9f23cdb6ee8b0e05224a623a4cb8..20dace9577e0fdfd7d21c4a310b90df3e0a1b151 100644 (file)
@@ -55,6 +55,8 @@ void sitemap_do_blog(void) {
        int i;
        SharedMessageStatus Stat;
        message_summary *Msg = NULL;
+       StrBuf *Buf = NewStrBuf();
+       StrBuf *FoundCharset = NewStrBuf();
 
        memset(&Stat, 0, sizeof Stat);
        Stat.maxload = INT_MAX;
@@ -66,16 +68,18 @@ void sitemap_do_blog(void) {
        for (i=0; i<num_msgs; ++i) {
                Msg = GetMessagePtrAt(i, WCC->summ);
                if (Msg != NULL) {
-                       struct bltr bltr = blogview_learn_thread_references(Msg->msgnum);
+                       ReadOneMessageSummary(Msg, FoundCharset, Buf);
                        /* Show only top level posts, not comments */
-                       if ((bltr.id != 0) && (bltr.refs == 0)) {
-                               WC->bptlid = bltr.id;
+                       if ((Msg->reply_inreplyto_hash != 0) && (Msg->reply_references_hash == 0)) {
+                               WCC->bptlid = Msg->reply_inreplyto_hash;
                                wc_printf("<url><loc>%s", ChrPtr(site_prefix));
                                tmplput_blog_permalink(NULL, NULL);
                                wc_printf("</loc></url>\r\n");
                        }
                }
        }
+       FreeStrBuf(&Buf);
+       FreeStrBuf(&FoundCharset);
 }
 
 
@@ -171,6 +175,8 @@ void sitemap(void) {
 
        while (roomlist != NULL)
        {
+               struct sitemap_room_list *ptr;
+
                gotoroom(roomlist->roomname);
 
                /* Output the messages in this room only if it's a room type we can make sense of */
@@ -189,7 +195,7 @@ void sitemap(void) {
                        break;
                }
 
-               struct sitemap_room_list *ptr = roomlist;
+               ptr = roomlist;
                roomlist = roomlist->next;
                FreeStrBuf(&ptr->roomname);
                free(ptr);
index 19fe3722d921d0c46930b12afd3f8053ef73a828..5df65fe1b886156505db89f1f46d2a8053c98bbf 100644 (file)
@@ -753,6 +753,7 @@ struct blogpost {
        long *msgs;             /* Array of msgnums for messages we are displaying */
        int num_msgs;           /* Number of msgnums stored in 'msgs' */
        int alloc_msgs;         /* Currently allocated size of array */
+       int unread_oments;
 };