From 0eee04326019d5c167cf760a36fa91a0b012f083 Mon Sep 17 00:00:00 2001 From: Art Cancro Date: Thu, 31 Dec 2009 20:14:43 +0000 Subject: [PATCH] * The new BBS view is now complete. Share And Enjoy --- webcit/bbsview_renderer.c | 378 +++++--------------------------------- 1 file changed, 47 insertions(+), 331 deletions(-) diff --git a/webcit/bbsview_renderer.c b/webcit/bbsview_renderer.c index 78fc554c2..1e04a1f1f 100644 --- a/webcit/bbsview_renderer.c +++ b/webcit/bbsview_renderer.c @@ -1,301 +1,28 @@ -#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("

"); - 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("
\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; inum_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 */ -- 2.39.2