Readloop remove special cases
[citadel.git] / webcit / blogview_renderer.c
index 57f178a087791b7036d750c4bf59fc15a116c383..70fa908ae97b9e787a0c554a1cac6cba6e3d2e55 100644 (file)
@@ -20,7 +20,7 @@
 
 #include "webcit.h"
 #include "webserver.h"
-#include "groupdav.h"
+#include "dav.h"
 
 
 /*
@@ -44,38 +44,22 @@ void tmplput_blog_permalink(StrBuf *Target, WCTemplputParams *TP) {
 
 
 /*
- * Render single blog post and (optionally) its comments
+ * Render single blog post and (optionally) its comments
  */
 void blogpost_render(struct blogpost *bp, int with_comments)
 {
        const StrBuf *Mime;
        int i;
 
-       WC->bptlid = bp->top_level_id;
+       WC->bptlid = bp->top_level_id;  /* This is used in templates; do not remove it */
 
        /* Always show the top level post, unless we somehow ended up with an empty list */
        if (bp->num_msgs > 0) {
                read_message(WC->WBuf, HKEY("view_blog_post"), bp->msgs[0], NULL, &Mime);
        }
 
-       /* If we were asked to suppress comments, show only the comment count */
-       if (!with_comments) {
-               /* Show the number of comments */
-               wc_printf("<a href=\"readfwd?p=%d?go=", bp->top_level_id);
-               urlescputs(ChrPtr(WC->CurRoom.name));
-               wc_printf("#comments\">");
-               wc_printf(_("%d comments"), bp->num_msgs - 1);
-               wc_printf("</a> | <a href=\"");
-               tmplput_blog_permalink(NULL, NULL);
-               wc_printf("\">%s</a>", _("permalink"));
-               wc_printf("<br><br><br>\n");
-       }
-
-       else if (bp->num_msgs < 2) {
-               wc_printf(_("%d comments"), 0);
-       }
-
-       else {
+       if (with_comments) {
+               /* Show any existing comments, then offer the comment box */
                wc_printf("<a name=\"comments\"></a>\n");
                wc_printf(_("%d comments"), bp->num_msgs - 1);
                wc_printf(" | <a href=\"");
@@ -85,13 +69,20 @@ void blogpost_render(struct blogpost *bp, int with_comments)
                for (i=1; i<bp->num_msgs; ++i) {
                        read_message(WC->WBuf, HKEY("view_blog_comment"), bp->msgs[i], NULL, &Mime);
                }
+               do_template("view_blog_comment_box");
        }
 
-       /* offer the comment box */
-       if (with_comments) {
-               do_template("blog_comment_box");
+       else {
+               /* Show only the number of comments */
+               wc_printf("<a href=\"readfwd?p=%d?go=", bp->top_level_id);
+               urlescputs(ChrPtr(WC->CurRoom.name));
+               wc_printf("#comments\">");
+               wc_printf(_("%d comments"), bp->num_msgs - 1);
+               wc_printf("</a> | <a href=\"");
+               tmplput_blog_permalink(NULL, NULL);
+               wc_printf("\">%s</a>", _("permalink"));
+               wc_printf("<br><br><br>\n");
        }
-
 }
 
 
@@ -113,7 +104,9 @@ int blogview_GetParamsGetServerCall(SharedMessageStatus *Stat,
                                   void **ViewSpecific, 
                                   long oper, 
                                   char *cmd, 
-                                  long len)
+                                   long len,
+                                   char *filter,
+                                   long flen)
 {
        HashList *BLOG = NewHash(1, NULL);
        *ViewSpecific = BLOG;
@@ -223,6 +216,9 @@ int blogview_LoadMsgFromServer(SharedMessageStatus *Stat,
                }
                bp->msgs[bp->num_msgs++] = Msg->msgnum;
        }
+       else {
+               syslog(LOG_DEBUG, "** comment %ld is unparented", Msg->msgnum);
+       }
 
        return 200;
 }
@@ -258,10 +254,16 @@ int blogview_render(SharedMessageStatus *Stat, void **ViewSpecific, long oper)
        int num_blogposts = 0;
        int num_blogposts_alloc = 0;
        int with_comments = 0;
+       int firstp = 0;
+       int maxp = 0;
 
        /* Comments are shown if we are only viewing a single blog post */
        if (atoi(BSTR("p"))) with_comments = 1;
 
+       firstp = atoi(BSTR("firstp"));  /* start reading at... */
+       maxp = atoi(BSTR("maxp"));      /* max posts to show... */
+       if (maxp < 1) maxp = 5;         /* default; move somewhere else? */
+
        /* Iterate through the hash list and copy the data pointers into an array */
        it = GetNewHashPos(BLOG, 0);
        while (GetNextHashPos(BLOG, it, &len, &Key, &Data)) {
@@ -282,17 +284,38 @@ int blogview_render(SharedMessageStatus *Stat, void **ViewSpecific, long oper)
         * which they point are still owned by the hash list.
         */
        if (num_blogposts > 0) {
-
+               int start_here = 0;
                /* Sort newest-to-oldest */
                qsort(blogposts, num_blogposts, sizeof(void *), blogview_sortfunc);
 
-               /* FIXME -- allow the user to select a starting point in the list */
+               /* allow the user to select a starting point in the list */
+               for (i=0; i<num_blogposts; ++i) {
+                       if (blogposts[i]->top_level_id == firstp) {
+                               start_here = i;
+                       }
+               }
 
                /* FIXME -- allow the user (or a default setting) to select a maximum number of posts to display */
 
                /* Now go through the list and render what we've got */
-               for (i=0; i<num_blogposts; ++i) {
-                       blogpost_render(blogposts[i], with_comments);
+               for (i=start_here; i<num_blogposts; ++i) {
+                       if ((i > 0) && (i == start_here)) {
+                               int j = i - maxp;
+                               if (j < 0) j = 0;
+                               wc_printf("<div class=\"newer_blog_posts\"><a href=\"readfwd?go=");
+                               urlescputs(ChrPtr(WC->CurRoom.name));
+                               wc_printf("?firstp=%d?maxp=%d\">", blogposts[j]->top_level_id, maxp);
+                               wc_printf("%s →</a></div>\n", _("Newer posts"));
+                       }
+                       if (i < (start_here + maxp)) {
+                               blogpost_render(blogposts[i], with_comments);
+                       }
+                       else if (i == (start_here + maxp)) {
+                               wc_printf("<div class=\"older_blog_posts\"><a href=\"readfwd?go=");
+                               urlescputs(ChrPtr(WC->CurRoom.name));
+                               wc_printf("?firstp=%d?maxp=%d\">", blogposts[i]->top_level_id, maxp);
+                               wc_printf("← %s</a></div>\n", _("Older posts"));
+                       }
                }
 
                /* Done.  We are only freeing the array of pointers; the data itself
@@ -324,6 +347,7 @@ InitModule_BLOGVIEWRENDERERS
                VIEW_BLOG,
                blogview_GetParamsGetServerCall,
                NULL,
+               NULL,
                NULL, 
                blogview_LoadMsgFromServer,
                blogview_render,