]> code.citadel.org Git - citadel.git/blobdiff - webcit/blogview_renderer.c
Store the thread tree (id/refs) in memory using hashes instead of full strings
[citadel.git] / webcit / blogview_renderer.c
index bba136c1eb62027b79d1e50fd17713702003f8b1..1a18297f07ec035bfbbfb4ede8c688936e5ba72d 100644 (file)
@@ -29,8 +29,9 @@
 
 struct blogpost {
        long msgnum;
-       StrBuf *id;
-       StrBuf *refs;
+       int id;
+       int refs;
+       int comment_count;
 };
 
 struct blogview {
@@ -90,15 +91,17 @@ int blogview_LoadMsgFromServer(SharedMessageStatus *Stat,
        }
 
        BLOG->msgs[BLOG->num_msgs++].msgnum = Msg->msgnum;
-       BLOG->msgs[BLOG->num_msgs].id = NULL;
-       BLOG->msgs[BLOG->num_msgs].refs = NULL;
+       BLOG->msgs[BLOG->num_msgs].id = 0;
+       BLOG->msgs[BLOG->num_msgs].refs = 0;
+       BLOG->msgs[BLOG->num_msgs].comment_count = 0;
 
        return 200;
 }
 
 
+
 /*
- * People expect blogs to be sorted newest-to-oldest
+ * Sort a list of 'struct blogpost' objects by newest-to-oldest msgnum.
  */
 int blogview_sortfunc(const void *s1, const void *s2) {
        struct blogpost *l1 = (struct blogpost *)(s1);
@@ -124,12 +127,13 @@ void blogview_learn_thread_references(struct blogpost *bp)
        if (GetServerStatus(Buf, NULL) == 1) {
                while (StrBuf_ServGetln(Buf), strcmp(ChrPtr(Buf), "000")) {
                        if (!strncasecmp(ChrPtr(Buf), "msgn=", 5)) {
-                               bp->id = NewStrBufDup(Buf);
-                               StrBufCutLeft(bp->id, 5);
+                               StrBufCutLeft(Buf, 5);
+                               bp->id = HashLittle(ChrPtr(Buf), StrLength(Buf));
                        }
                        else if (!strncasecmp(ChrPtr(Buf), "wefw=", 5)) {
-                               bp->refs = NewStrBufDup(Buf);
-                               StrBufCutLeft(bp->refs, 5);
+                               StrBufCutLeft(Buf, 5);          /* trim the field name */
+                               StrBufCutAt(Buf, 0, "|");       /* trim all but the first thread ref */
+                               bp->refs = HashLittle(ChrPtr(Buf), StrLength(Buf));
                        }
                }
        }
@@ -144,20 +148,45 @@ int blogview_render(SharedMessageStatus *Stat, void **ViewSpecific, long oper)
        struct blogview *BLOG = (struct blogview *) *ViewSpecific;
        int i;
 
+       /* Pass #1 - sort */
        if (Stat->nummsgs > 0) {
                lprintf(9, "sorting %d messages\n", BLOG->num_msgs);
                qsort(BLOG->msgs, (size_t)(BLOG->num_msgs), sizeof(struct blogpost), blogview_sortfunc);
        }
 
+       /* Pass #2 - learn thread references */
+       lprintf(9, "learning thread references\n");
        for (i=0; (i<BLOG->num_msgs); ++i) {
                if (BLOG->msgs[i].msgnum > 0L) {
                        blogview_learn_thread_references(&BLOG->msgs[i]);
-                       wc_printf("Message %d, #%ld, id '%s', refs '%s'<br>\n",
+               }
+       }
+
+       /* Pass #3 - turn it into a thread tree */
+       /* FIXME implement this */
+
+       /* Pass #4 - render
+        * This will require several different modes:
+        * * Top level
+        * * Single story permalink
+        * * Comments
+        * * etc
+        */
+       for (i=0; (i<BLOG->num_msgs); ++i) {
+               if (BLOG->msgs[i].msgnum > 0L) {
+                       if (BLOG->msgs[i].refs == 0) {
+                               wc_printf("<b>");
+                       }
+                       wc_printf("Message %d, #%ld, id %d, refs %d",
                                i,
                                BLOG->msgs[i].msgnum,
-                               ChrPtr(BLOG->msgs[i].id),
-                               ChrPtr(BLOG->msgs[i].refs)
+                               BLOG->msgs[i].id,
+                               BLOG->msgs[i].refs
                        );
+                       if (BLOG->msgs[i].refs == 0) {
+                               wc_printf("</b>");
+                       }
+                       wc_printf("<br>\n");
                }
        }
 
@@ -168,13 +197,8 @@ int blogview_render(SharedMessageStatus *Stat, void **ViewSpecific, long oper)
 int blogview_Cleanup(void **ViewSpecific)
 {
        struct blogview *BLOG = (struct blogview *) *ViewSpecific;
-       int i;
 
        if (BLOG->alloc_msgs != 0) {
-               for (i=0; i<BLOG->num_msgs; ++i) {
-                       FreeStrBuf(&BLOG->msgs[i].id);
-                       FreeStrBuf(&BLOG->msgs[i].refs);
-               }
                free(BLOG->msgs);
        }
        free(BLOG);