* Moved most of the BBS View renderer code into its own file, in preparation for...
authorArt Cancro <ajc@citadel.org>
Fri, 27 Nov 2009 16:24:43 +0000 (16:24 +0000)
committerArt Cancro <ajc@citadel.org>
Fri, 27 Nov 2009 16:24:43 +0000 (16:24 +0000)
webcit/Makefile.in
webcit/bbsview_renderer.c [new file with mode: 0644]
webcit/messages.h
webcit/msg_renderers.c

index f9df1cb6a100a5f361614e53e51b0ccc09b44c79..ffb5e4aa28c22340439028f50ea712af8438960b 100644 (file)
@@ -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 (file)
index 0000000..958e28a
--- /dev/null
@@ -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("<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);
+}
index 69f5e90aee77b065f0d977d76d2f24ebc4a44e34..321ef1f89c9a9353653c15ac1ceb1cffe74d2132 100644 (file)
@@ -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, 
index 59ecb1e5f23be5aa6d282b5047ba0281415a0465..94c25dd32d5edf580a26cc4506873d83de63aea6 100644 (file)
@@ -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("<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_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,