* The new BBS view is now complete. Share And Enjoy
authorArt Cancro <ajc@citadel.org>
Thu, 31 Dec 2009 20:14:43 +0000 (20:14 +0000)
committerArt Cancro <ajc@citadel.org>
Thu, 31 Dec 2009 20:14:43 +0000 (20:14 +0000)
webcit/bbsview_renderer.c

index 78fc554c225769e007120333df4803c0819891de..1e04a1f1f12bbe425b2ab941418bdae1236c0f53 100644 (file)
-#include "webcit.h"
-#include "webserver.h"
-#include "groupdav.h"
-
-
-
-/* We're jamming both of these in here so I can develop the new BBS view in-tree.
- * Define NEW_BBS_BIEW to get the new, better, but unfinished and untested version.
+/* 
+ * $Id: $
  *
+ * BBS View renderer module for WebCit
+ *
+ * Copyright (c) 1996-2009 by the citadel.org team
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
-#ifndef NEW_BBS_VIEW
-
-
-/*** Code for the OLD bbs view ***/
-
-
-typedef struct _bbsview_stuct {
-       StrBuf *BBViewToolBar;
-       StrBuf *MessageDropdown;
-       long *displayed_msgs;
-       int a;
-} bbsview_struct;
-
-int bbsview_GetParamsGetServerCall(SharedMessageStatus *Stat, 
-                                  void **ViewSpecific, 
-                                  long oper, 
-                                  char *cmd, 
-                                  long len)
-{
-       bbsview_struct *VS;
-
-       VS = (bbsview_struct*) malloc(sizeof(bbsview_struct));
-       memset(VS, 0, sizeof(bbsview_struct));
-       *ViewSpecific = (void*)VS;
-       Stat->defaultsortorder = 1;
-       Stat->startmsg = -1;
-       Stat->sortit = 1;
-       
-       rlid[oper].cmd(cmd, len);
-       
-       if (havebstr("maxmsgs"))
-               Stat->maxmsgs = ibstr("maxmsgs");
-       if (Stat->maxmsgs == 0) Stat->maxmsgs = DEFAULT_MAXMSGS;
-       
-       if (havebstr("startmsg")) {
-               Stat->startmsg = lbstr("startmsg");
-       }
-       if (lbstr("SortOrder") == 2) {
-               Stat->reverse = 1;
-               Stat->num_displayed = -DEFAULT_MAXMSGS;
-       }
-       else {
-               Stat->reverse = 0;
-               Stat->num_displayed = DEFAULT_MAXMSGS;
-       }
-
-       return 200;
-}
-
-/* startmsg is an index within the message list.
- * starting_from is the Citadel message number to be supplied to a "MSGS GT" operation
- */
-long DrawMessageDropdown(StrBuf *Selector, long maxmsgs, long startmsg, int nMessages, long starting_from)
-{
-       StrBuf *TmpBuf;
-       wcsession *WCC = WC;
-       void *vMsg;
-       int lo, hi;
-       long ret;
-       long hklen;
-       const char *key;
-       int nItems;
-       HashPos *At;
-       long vector[16];
-       WCTemplputParams SubTP;
-       int wantmore = 1;
-
-       memset(&SubTP, 0, sizeof(WCTemplputParams));
-       SubTP.Filter.ContextType = CTX_LONGVECTOR;
-       SubTP.Context = &vector;
-       TmpBuf = NewStrBufPlain(NULL, SIZ);
-       At = GetNewHashPos(WCC->summ, nMessages);
-       nItems = GetCount(WCC->summ);
-       ret = nMessages;
-       vector[0] = 7;
-       vector[2] = 1;
-       vector[1] = startmsg;
-       vector[3] = 0;
-       vector[7] = starting_from;
-
-       while (wantmore)
-       {
-       
-               vector[3] = abs(nMessages);
-               lo = GetHashPosCounter(WCC->summ, At);
-               wantmore = GetNextHashPos(WCC->summ, At, &hklen, &key, &vMsg);
-               if (!wantmore)
-                       break;
-               if (nMessages > 0) {
-                       if (lo + nMessages >= nItems) {
-                               hi = nItems - 1;
-                               vector[3] = nItems - lo;
-                               if (startmsg == lo) 
-                                       ret = vector[3];
-                       }
-                       else {
-                               hi = lo + nMessages - 1;
-                       }
-               } else {
-                       if (lo + nMessages < -1) {
-                               hi = 0;
-                       }
-                       else {
-                               if ((lo % abs(nMessages)) != 0) {
-                                       int offset = (lo % abs(nMessages) *
-                                                     (nMessages / abs(nMessages)));
-                                       hi = lo + offset;
-                                       vector[3] = abs(offset);
-                                       if (startmsg == lo)
-                                                ret = offset;
-                               }
-                               else
-                                       hi = lo + nMessages;
-                       }
-               }
-               
-               /*
-                * Bump these because although we're thinking in zero base, the user
-                * is a drooling idiot and is thinking in one base.
-                */
-               vector[4] = lo + 1;
-               vector[5] = hi + 1;
-               vector[6] = lo;
-               FlushStrBuf(TmpBuf);
-               dbg_print_longvector(vector);
-               DoTemplate(HKEY("select_messageindex"), TmpBuf, &SubTP);
-               StrBufAppendBuf(Selector, TmpBuf, 0);
-       }
-       vector[6] = 0;
-       FlushStrBuf(TmpBuf);
-       if (maxmsgs == 9999999) {
-               vector[1] = 1;
-               ret = maxmsgs;
-       }
-       else
-               vector[1] = 0;          
-       vector[2] = 0;
-       dbg_print_longvector(vector);
-       DoTemplate(HKEY("select_messageindex_all"), TmpBuf, &SubTP);
-       StrBufAppendBuf(Selector, TmpBuf, 0);
-       FreeStrBuf(&TmpBuf);
-       DeleteHashPos(&At);
-       return ret;
-}
-
-
-int bbsview_PrintViewHeader(SharedMessageStatus *Stat, void **ViewSpecific)
-{
-       bbsview_struct *VS;
-       WCTemplputParams SubTP;
-
-       VS = (bbsview_struct*)*ViewSpecific;
-
-       VS->BBViewToolBar = NewStrBufPlain(NULL, SIZ);
-       VS->MessageDropdown = NewStrBufPlain(NULL, SIZ);
-
-       /*** startmsg->maxmsgs = **/DrawMessageDropdown(VS->MessageDropdown, 
-                                                       Stat->maxmsgs, 
-                                                       Stat->startmsg,
-                                                       Stat->num_displayed, 
-                                                       Stat->lowest_found-1);
-       if (Stat->num_displayed < 0) {
-               Stat->startmsg += Stat->maxmsgs;
-               if (Stat->num_displayed != Stat->maxmsgs)                               
-                       Stat->maxmsgs = abs(Stat->maxmsgs) + 1;
-               else
-                       Stat->maxmsgs = abs(Stat->maxmsgs);
-
-       }
-       if (Stat->nummsgs > 0) {
-               memset(&SubTP, 0, sizeof(WCTemplputParams));
-               SubTP.Filter.ContextType = CTX_STRBUF;
-               SubTP.Context = VS->MessageDropdown;
-               DoTemplate(HKEY("msg_listselector_top"), VS->BBViewToolBar, &SubTP);
-               StrBufAppendBuf(WC->WBuf, VS->BBViewToolBar, 0);
-               FlushStrBuf(VS->BBViewToolBar);
-       }
-       return 200;
-}
-
-int bbsview_LoadMsgFromServer(SharedMessageStatus *Stat, 
-                             void **ViewSpecific, 
-                             message_summary* Msg, 
-                             int is_new, 
-                             int i)
-{
-       bbsview_struct *VS;
-
-       VS = (bbsview_struct*)*ViewSpecific;
-       if (VS->displayed_msgs == NULL) {
-               VS->displayed_msgs = malloc(sizeof(long) *
-                                           ((Stat->maxmsgs < Stat->nummsgs) ? 
-                                            Stat->maxmsgs + 1 : 
-                                            Stat->nummsgs + 1));
-       }
-       if ((i >= Stat->startmsg) && (i < Stat->startmsg + Stat->maxmsgs)) {
-               VS->displayed_msgs[Stat->num_displayed] = Msg->msgnum;
-               Stat->num_displayed++;
-       }
-       return 200;
-}
-
-
-int bbsview_RenderView_or_Tail(SharedMessageStatus *Stat, 
-                              void **ViewSpecific, 
-                              long oper)
-{
-       wcsession *WCC = WC;
-       bbsview_struct *VS;
-       WCTemplputParams SubTP;
-       const StrBuf *Mime;
-
-       VS = (bbsview_struct*)*ViewSpecific;
-       if (Stat->nummsgs == 0) {
-               wc_printf("<div class=\"nomsgs\"><br><em>");
-               switch (oper) {
-               case readnew:
-                       wc_printf(_("No new messages."));
-                       break;
-               case readold:
-                       wc_printf(_("No old messages."));
-                       break;
-               default:
-                       wc_printf(_("No messages here."));
-               }
-               wc_printf("</em><br></div>\n");
-       }
-       else 
-       {
-               if (VS->displayed_msgs != NULL) {
-                       /* if we do a split bbview in the future, begin messages div here */
-                       int a;/// todo  
-                       for (a=0; a < Stat->num_displayed; ++a) {
-                               read_message(WCC->WBuf, HKEY("view_message"), VS->displayed_msgs[a], NULL, &Mime);
-                       }
-                       
-                       /* if we do a split bbview in the future, end messages div here */
-                       
-                       free(VS->displayed_msgs);
-                       VS->displayed_msgs = NULL;
-               }
-               memset(&SubTP, 0, sizeof(WCTemplputParams));
-               SubTP.Filter.ContextType = CTX_STRBUF;
-               SubTP.Context = VS->MessageDropdown;
-               DoTemplate(HKEY("msg_listselector_bottom"), VS->BBViewToolBar, &SubTP);
-               StrBufAppendBuf(WCC->WBuf, VS->BBViewToolBar, 0);
-       }
-       return 0;
-
-}
-
-
-int bbsview_Cleanup(void **ViewSpecific)
-{
-       bbsview_struct *VS;
-
-       VS = (bbsview_struct*)*ViewSpecific;
-       wDumpContent(1);
-       FreeStrBuf(&VS->BBViewToolBar);
-       FreeStrBuf(&VS->MessageDropdown);
-       free(VS);
-       return 0;
-}
-
-void 
-InitModule_BBSVIEWRENDERERS
-(void)
-{
-       RegisterReadLoopHandlerset(
-               VIEW_BBS,
-               bbsview_GetParamsGetServerCall,
-               bbsview_PrintViewHeader,
-               bbsview_LoadMsgFromServer,
-               bbsview_RenderView_or_Tail,
-               bbsview_Cleanup);
-}
-
-
-
-
-
-#else /* NEW_BBS_VIEW */
-
-
-/*** Code for the NEW bbs view ***/
-
-
+#include "webcit.h"
+#include "webserver.h"
+#include "groupdav.h"
 
 /*
  * Data which gets passed around between the various functions in this module
@@ -352,8 +79,6 @@ int bbsview_GetParamsGetServerCall(SharedMessageStatus *Stat,
  */
 int bbsview_PrintViewHeader(SharedMessageStatus *Stat, void **ViewSpecific)
 {
-       lprintf(9, "bbsview_PrintViewHeader() has been called.\n");
-
        if (WC->is_ajax) {
                begin_ajax_response();          /* for non-ajax, headers are output in messages.c */
        }
@@ -373,8 +98,6 @@ int bbsview_LoadMsgFromServer(SharedMessageStatus *Stat,
 {
        struct bbsview *BBS = (struct bbsview *) *ViewSpecific;
 
-       lprintf(9, "bbsview_LoadMsgFromServer() has been called.\n");
-
        if (BBS->alloc_msgs == 0) {
                BBS->alloc_msgs = Stat->maxmsgs;
                BBS->msgs = malloc(BBS->alloc_msgs * sizeof(long));
@@ -432,8 +155,6 @@ int bbsview_RenderView_or_Tail(SharedMessageStatus *Stat,
        snprintf(olderdiv, sizeof olderdiv, "olderdiv%08lx%08x", time(NULL), rand());
        snprintf(newerdiv, sizeof newerdiv, "newerdiv%08lx%08x", time(NULL), rand());
 
-       lprintf(9, "starting bbsview_RenderView_or_Tail() - there are %d messages.\n", BBS->num_msgs);
-
        /* If this is the initial page load (and not an update), supply the required JavaScript code */
        if (!WC->is_ajax) {
           StrBufAppendPrintf(WC->trailing_javascript,
@@ -458,17 +179,38 @@ int bbsview_RenderView_or_Tail(SharedMessageStatus *Stat,
        if (!strcasecmp(bstr("gt_or_lt"), "lt")) {
                doing_older_messages = 1;
                doing_newer_messages = 0;
-               lprintf(9, "\033[31m ** OLDER MESSAGES ** \033[0m\n");
        }
        else if (!strcasecmp(bstr("gt_or_lt"), "gt")) {
                doing_older_messages = 0;
                doing_newer_messages = 1;
-               lprintf(9, "\033[32m ** NEWER MESSAGES ** \033[0m\n");
        }
        else {
                doing_older_messages = 0;
                doing_newer_messages = 0;
-               lprintf(9, "\033[33m ** INITIAL PAGE LOAD ** \033[0m\n");
+       }
+
+
+       /* Cut the message list down to the requested size */
+       if (Stat->nummsgs > 0) {
+               lprintf(9, "sorting %d messages\n", BBS->num_msgs);
+               qsort(BBS->msgs, (size_t)(BBS->num_msgs), sizeof(long), (Stat->reverse ? bbsview_sortfunc_reverse : bbsview_sortfunc_forward));
+
+               /* Cut it down to 20 messages (or whatever value Stat->maxmsgs is set to) */
+
+               if (BBS->num_msgs > Stat->maxmsgs) {
+
+                       if (doing_older_messages) {
+                               /* LT ... cut it down to the LAST 20 messages received */
+                               memcpy(&BBS->msgs[0], &BBS->msgs[BBS->num_msgs - Stat->maxmsgs],
+                                       (Stat->maxmsgs * sizeof(long))
+                               );
+                               BBS->num_msgs = Stat->maxmsgs;
+                       }
+                       else {
+                               /* GT ... cut it down to the FIRST 20 messages received */
+                               BBS->num_msgs = Stat->maxmsgs;
+                       }
+               }
        }
 
 
@@ -507,27 +249,7 @@ int bbsview_RenderView_or_Tail(SharedMessageStatus *Stat,
 
        /* Non-empty message set... */
        else {
-               lprintf(9, "sorting %d messages\n", BBS->num_msgs);
-               qsort(BBS->msgs, (size_t)(BBS->num_msgs), sizeof(long), (Stat->reverse ? bbsview_sortfunc_reverse : bbsview_sortfunc_forward));
-
-               /* Cut it down to 20 messages (or whatever value Stat->maxmsgs is set to) */
-
-               if (BBS->num_msgs > Stat->maxmsgs) {
-
-                       if (doing_older_messages) {
-                               /* LT ... cut it down to the LAST 20 messages received */
-                               memcpy(&BBS->msgs[0], &BBS->msgs[BBS->num_msgs - Stat->maxmsgs],
-                                       (Stat->maxmsgs * sizeof(long))
-                               );
-                               BBS->num_msgs = Stat->maxmsgs;
-                       }
-                       else {
-                               /* GT ... cut it down to the FIRST 20 messages received */
-                               BBS->num_msgs = Stat->maxmsgs;
-                       }
-               }
-
-               /* Now render them */
+               /* Render the messages */
        
                for (i=0; i<BBS->num_msgs; ++i) {
                        read_message(WC->WBuf, HKEY("view_message"), BBS->msgs[i], NULL, &Mime);
@@ -585,16 +307,13 @@ int bbsview_RenderView_or_Tail(SharedMessageStatus *Stat,
 int bbsview_Cleanup(void **ViewSpecific)
 {
        struct bbsview *BBS = (struct bbsview *) *ViewSpecific;
-       lprintf(9, "bbsview_Cleanup() has been called.\n");
        free(BBS);
 
        if (WC->is_ajax) {
-               lprintf(9, "end_ajax_response() has been called.\n");
                end_ajax_response();
                WC->is_ajax = 0;
        }
        else {
-               lprintf(9, "wDumpContent() has been called.\n");
                wDumpContent(1);
        }
        return 0;
@@ -612,6 +331,3 @@ InitModule_BBSVIEWRENDERERS
                bbsview_RenderView_or_Tail,
                bbsview_Cleanup);
 }
-
-
-#endif /* NEW_BBS_VIEW */