From: Art Cancro Date: Fri, 27 Nov 2009 16:24:43 +0000 (+0000) Subject: * Moved most of the BBS View renderer code into its own file, in preparation for... X-Git-Tag: v7.86~585 X-Git-Url: https://code.citadel.org/?p=citadel.git;a=commitdiff_plain;h=c5b6fbb9fa01035c16b1a62af9314a19307558fe * Moved most of the BBS View renderer code into its own file, in preparation for making changes to it --- diff --git a/webcit/Makefile.in b/webcit/Makefile.in index f9df1cb6a..ffb5e4aa2 100644 --- a/webcit/Makefile.in +++ b/webcit/Makefile.in @@ -50,7 +50,7 @@ webcit: webserver.o context_loop.o ical_dezonify.o \ webcit.o auth.o tcp_sockets.o mainmenu.o serv_func.o who.o marchlist.o \ roomops.o roomlist.o messages.o msg_renderers.o userlist.o paging.o sysmsgs.o \ useredit.o vcard_edit.o preferences.o html2html.o listsub.o \ - graphics.o netconf.o siteconfig.o subst.o \ + graphics.o netconf.o siteconfig.o subst.o bbsview_renderer.o \ calendar.o calendar_tools.o calendar_view.o tasks.o event.o smtpqueue.o \ availability.o iconbar.o crypto.o inetconf.o notes.o wiki.o \ groupdav_main.o groupdav_get.o groupdav_propfind.o fmt_date.o \ @@ -65,7 +65,7 @@ webcit: webserver.o context_loop.o ical_dezonify.o \ webcit.o auth.o tcp_sockets.o mainmenu.o serv_func.o who.o listsub.o \ roomops.o roomlist.o messages.o msg_renderers.o userlist.o paging.o sysmsgs.o \ useredit.o locate_host.o siteconfig.o subst.o vcard_edit.o floors.o \ - graphics.o netconf.o preferences.o html2html.o openid.o \ + graphics.o netconf.o preferences.o html2html.o openid.o bbsview_renderer.o \ summary.o calendar.o calendar_tools.o calendar_view.o tasks.o event.o wiki.o \ availability.o ical_dezonify.o iconbar.o crypto.o inetconf.o notes.o \ groupdav_main.o groupdav_get.o groupdav_propfind.o groupdav_delete.o \ diff --git a/webcit/bbsview_renderer.c b/webcit/bbsview_renderer.c new file mode 100644 index 000000000..958e28a92 --- /dev/null +++ b/webcit/bbsview_renderer.c @@ -0,0 +1,275 @@ +#include "webcit.h" +#include "webserver.h" +#include "groupdav.h" + + +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); +} diff --git a/webcit/messages.h b/webcit/messages.h index 69f5e90ae..321ef1f89 100644 --- a/webcit/messages.h +++ b/webcit/messages.h @@ -81,6 +81,8 @@ typedef struct _readloopstruct { readloop_servcmd cmd; } readloop_struct; +extern readloop_struct rlid[]; + void readloop(long oper); int read_message(StrBuf *Target, diff --git a/webcit/msg_renderers.c b/webcit/msg_renderers.c index 59ecb1e5f..94c25dd32 100644 --- a/webcit/msg_renderers.c +++ b/webcit/msg_renderers.c @@ -1095,102 +1095,6 @@ void tmplput_MIME_Length(StrBuf *Target, WCTemplputParams *TP) StrBufAppendPrintf(Target, "%ld", mime->length); } -/* 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; -} - HashList *iterate_get_registered_Attachments(StrBuf *Target, WCTemplputParams *TP) { return WC->attachments; @@ -1295,167 +1199,6 @@ int mailview_Cleanup(void **ViewSpecific) -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; -} - -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_MSGRENDERERS (void) @@ -1468,14 +1211,6 @@ InitModule_MSGRENDERERS mailview_RenderView_or_Tail, mailview_Cleanup); - RegisterReadLoopHandlerset( - VIEW_BBS, - bbsview_GetParamsGetServerCall, - bbsview_PrintViewHeader, - bbsview_LoadMsgFromServer, - bbsview_RenderView_or_Tail, - bbsview_Cleanup); - RegisterSortFunc(HKEY("date"), NULL, 0, summcmp_date,