X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fbbsview_renderer.c;h=a4b707841eadac0c4bec64848062d9d16b095473;hb=e070c1c54bf57f5d23376ff8c55d5621f5e92237;hp=c724ff3b423a3b8e1d78e1968d63fede36bfc294;hpb=30814471bf62a718c952def0793b768f6007a25c;p=citadel.git diff --git a/webcit/bbsview_renderer.c b/webcit/bbsview_renderer.c index c724ff3b4..a4b707841 100644 --- a/webcit/bbsview_renderer.c +++ b/webcit/bbsview_renderer.c @@ -1,27 +1,26 @@ /* - * $Id$ - * * BBS View renderer module for WebCit * * Note: we briefly had a dynamic UI for this. I thought it was cool, but * it was not received well by the user community. If you want to play - * with it, go get r8256 of bbsview_renderer.c and have fun. + * with it, go get commit dcf99fe61379b78436c387ea3f89ebfd4ffaf635 of + * bbsview_renderer.c and have fun. * * Copyright (c) 1996-2010 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 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. + * 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 + * 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 */ #define RANGE 5 @@ -40,6 +39,8 @@ struct bbsview { long lastseen; /* The number of the last seen message in this room */ int alloc_msgs; /* Currently allocated size of array */ int requested_page; /* Which page number did the user request? */ + int num_pages; /* Total number of pages in this room */ + long start_reading_at; /* Start reading at the page containing this message */ }; @@ -84,16 +85,34 @@ int bbsview_GetParamsGetServerCall(SharedMessageStatus *Stat, memset(BBS, 0, sizeof(struct bbsview)); *ViewSpecific = BBS; - Stat->startmsg = -1; /* not used here */ + Stat->startmsg = (-1); /* not used here */ Stat->sortit = 1; /* not used here */ Stat->num_displayed = DEFAULT_MAXMSGS; /* not used here */ BBS->requested_page = 0; + BBS->lastseen = bbsview_get_last_seen(); + BBS->start_reading_at = 0; + + /* By default, the requested page is the first one. */ + if (havebstr("start_reading_at")) { + BBS->start_reading_at = lbstr("start_reading_at"); + BBS->requested_page = (-4); + } - if (havebstr("page")) { + /* However, if we are asked to start with a specific message number, make sure + * we start on the page containing that message + */ + + /* Or, if a specific page was requested, make sure we go there */ + else if (havebstr("page")) { BBS->requested_page = ibstr("page"); } - - // FIXME do something with bbsview_get_last_seen(); + + /* Otherwise, if this is a "read new" operation, make sure we start on the page + * containing the first new message + */ + else if (oper == 3) { + BBS->requested_page = (-3); + } if (havebstr("maxmsgs")) { Stat->maxmsgs = ibstr("maxmsgs"); @@ -166,31 +185,109 @@ int bbsview_RenderView_or_Tail(SharedMessageStatus *Stat, qsort(BBS->msgs, (size_t)(BBS->num_msgs), sizeof(long), bbsview_sortfunc); } + if ((BBS->num_msgs % Stat->maxmsgs) == 0) { + BBS->num_pages = BBS->num_msgs / Stat->maxmsgs; + } + else { + BBS->num_pages = (BBS->num_msgs / Stat->maxmsgs) + 1; + } + + /* If the requested page number is -4, + * it means "whichever page on which msg#xxxxx starts" + * Change to the page number which contains that message. + */ + if (BBS->requested_page == (-4)) { + if (BBS->num_msgs == 0) { + BBS->requested_page = 0; + } + else { + for (i=0; inum_msgs; ++i) { + if ( + (BBS->msgs[i] >= BBS->start_reading_at) + && (BBS->requested_page == (-4)) + ) { + BBS->requested_page = (i / Stat->maxmsgs) ; + } + } + } + } + + /* If the requested page number is -3, + * it means "whichever page on which new messages start" + * Change that to an actual page number now. + */ + if (BBS->requested_page == (-3)) { + if (BBS->num_msgs == 0) { + BBS->requested_page = 0; + } + else { + for (i=0; inum_msgs; ++i) { + if ( + (BBS->msgs[i] > BBS->lastseen) + && ( (i == 0) || (BBS->msgs[i-1] <= BBS->lastseen) ) + ) { + BBS->requested_page = (i / Stat->maxmsgs) ; + } + } + } + } + + /* Still set to -3 ? If so, that probably means that there are no new messages, + * so we'll go to the *end* of the final page. + */ + if (BBS->requested_page == (-3)) { + if (BBS->num_msgs == 0) { + BBS->requested_page = 0; + } + else { + BBS->requested_page = BBS->num_pages - 1; + } + } + + /* keep the requested page within bounds */ + if (BBS->requested_page < 0) BBS->requested_page = 0; + if (BBS->requested_page >= BBS->num_pages) BBS->requested_page = BBS->num_pages - 1; + start_index = BBS->requested_page * Stat->maxmsgs; if (start_index < 0) start_index = 0; end_index = start_index + Stat->maxmsgs - 1; - for (seq = 0; seq < 3; ++seq) { /* cheap and sleazy way of rendering the funbar twice */ + for (seq = 0; seq < 3; ++seq) { /* cheap & sleazy way of rendering the page numbers twice */ - if (seq == 1) { + if ( (seq == 1) && (Stat->nummsgs > 0)) { /* display the selected range of messages */ - if (Stat->nummsgs > 0) { - for (i=start_index; (i<=end_index && i<=BBS->num_msgs); ++i) { - if (BBS->msgs[i] > 0L) { - read_message(WC->WBuf, HKEY("view_message"), BBS->msgs[i], NULL, &Mime); - } + for (i=start_index; (i<=end_index && inum_msgs); ++i) { + if ( + (BBS->msgs[i] > BBS->lastseen) + && ( (i == 0) || (BBS->msgs[i-1] <= BBS->lastseen) ) + ) { + /* new messages start here */ + do_template("start_of_new_msgs", NULL); + StrBufAppendPrintf(WC->trailing_javascript, "location.href=\"#newmsgs\";\n"); + } + if (BBS->msgs[i] > 0L) { + read_message(WC->WBuf, HKEY("view_message"), BBS->msgs[i], NULL, &Mime); + } + if ( + (i == (BBS->num_msgs - 1)) + && (BBS->msgs[i] <= BBS->lastseen) + ) { + /* no new messages */ + do_template("no_new_msgs", NULL); + StrBufAppendPrintf(WC->trailing_javascript, "location.href=\"#nonewmsgs\";\n"); } } } - else { - /* Display the range selecto-bar */ + + else if ( (seq == 0) || (seq == 2) ) { + /* Display the selecto-bar with the page numbers */ wc_printf("
"); wc_printf(_("Go to page: ")); int first = 0; - int last = ( (Stat->maxmsgs > 0) ? (BBS->num_msgs / Stat->maxmsgs) : 0 ); + int last = BBS->num_pages - 1; for (i=0; i<=last; ++i) {