X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fbbsview_renderer.c;h=67f42b12fb025aa4f9d7079bbcefcb2d5247c5bf;hb=HEAD;hp=a4b707841eadac0c4bec64848062d9d16b095473;hpb=85b8087bf603edb5320f0bc9da18ed2294204ca2;p=citadel.git diff --git a/webcit/bbsview_renderer.c b/webcit/bbsview_renderer.c index a4b707841..d06045d0b 100644 --- a/webcit/bbsview_renderer.c +++ b/webcit/bbsview_renderer.c @@ -6,28 +6,22 @@ * with it, go get commit dcf99fe61379b78436c387ea3f89ebfd4ffaf635 of * bbsview_renderer.c and have fun. * - * Copyright (c) 1996-2010 by the citadel.org team + * Copyright (c) 1996-2012 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 open source software. You can redistribute it and/or + * modify it under the terms of the GNU General Public License, version 3. * * 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 */ #define RANGE 5 #include "webcit.h" -#include "webserver.h" -#include "groupdav.h" + +#include "dav.h" /* * Data which gets passed around between the various functions in this module @@ -55,13 +49,15 @@ long bbsview_get_last_seen(void) serv_puts("GTSN"); serv_getln(buf, sizeof buf); if (buf[0] == '2') { + char *colon_pos; + char *comma_pos; - char *comma_pos = strchr(buf, ','); /* kill first comma and everything to its right */ + comma_pos = strchr(buf, ','); /* kill first comma and everything to its right */ if (comma_pos) { *comma_pos = 0; } - char *colon_pos = strchr(buf, ':'); /* kill first colon and everything to its left */ + colon_pos = strchr(buf, ':'); /* kill first colon and everything to its left */ if (colon_pos) { strcpy(buf, ++colon_pos); } @@ -79,7 +75,9 @@ int bbsview_GetParamsGetServerCall(SharedMessageStatus *Stat, void **ViewSpecific, long oper, char *cmd, - long len) + long len, + char *filter, + long flen) { struct bbsview *BBS = malloc(sizeof(struct bbsview)); memset(BBS, 0, sizeof(struct bbsview)); @@ -179,9 +177,10 @@ int bbsview_RenderView_or_Tail(SharedMessageStatus *Stat, const StrBuf *Mime; int start_index = 0; int end_index = 0; + int go_to_the_very_end = 0; if (Stat->nummsgs > 0) { - lprintf(9, "sorting %d messages\n", BBS->num_msgs); + syslog(LOG_DEBUG, "sorting %d messages\n", BBS->num_msgs); qsort(BBS->msgs, (size_t)(BBS->num_msgs), sizeof(long), bbsview_sortfunc); } @@ -218,9 +217,26 @@ int bbsview_RenderView_or_Tail(SharedMessageStatus *Stat, */ if (BBS->requested_page == (-3)) { if (BBS->num_msgs == 0) { + /* + * The room is empty; just start at the top and leave it there. + */ BBS->requested_page = 0; } + else if ( + (BBS->num_msgs > 0) + && (BBS->lastseen <= BBS->msgs[0]) + ) { + /* + * All messages are new; this is probably the user's first visit to the room, + * so start at the last page instead of showing ancient history. + */ + BBS->requested_page = BBS->num_pages - 1; + go_to_the_very_end = 1; + } else { + /* + * Some messages are old and some are new. Go to the start of new messages. + */ for (i=0; inum_msgs; ++i) { if ( (BBS->msgs[i] > BBS->lastseen) @@ -263,31 +279,43 @@ int bbsview_RenderView_or_Tail(SharedMessageStatus *Stat, && ( (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"); + do_template("start_of_new_msgs"); + if (!go_to_the_very_end) { + 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); + read_message(WC->WBuf, HKEY("view_message"), BBS->msgs[i], NULL, &Mime, NULL); } 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"); + do_template("no_new_msgs"); + if (!go_to_the_very_end) { + StrBufAppendPrintf(WC->trailing_javascript, "location.href=\"#nonewmsgs\";\n"); + } } } } else if ( (seq == 0) || (seq == 2) ) { + int first; + int last; /* Display the selecto-bar with the page numbers */ wc_printf("
"); + if (seq == 2) { + wc_printf(""); + } wc_printf(_("Go to page: ")); + if (seq == 2) { + wc_printf(""); + } - int first = 0; - int last = BBS->num_pages - 1; + first = 0; + last = BBS->num_pages - 1; for (i=0; i<=last; ++i) { @@ -311,7 +339,12 @@ int bbsview_RenderView_or_Tail(SharedMessageStatus *Stat, wc_printf("["); } else { - wc_printf("", i); + wc_printf("CurRoom.name)); + wc_printf("?start_reading_at=%ld\">", + BBS->msgs[i*Stat->maxmsgs] + ); + /* wc_printf("?page=%d\">", i); */ wc_printf(""); } if ( @@ -327,7 +360,7 @@ int bbsview_RenderView_or_Tail(SharedMessageStatus *Stat, wc_printf(_("Last")); } else { - wc_printf("%d", i + 1); // change to one-based for display + wc_printf("%d", i + 1); /* change to one-based for display */ } if (i == BBS->requested_page) { wc_printf("]"); @@ -351,6 +384,9 @@ int bbsview_RenderView_or_Tail(SharedMessageStatus *Stat, } } + if (go_to_the_very_end) { + StrBufAppendPrintf(WC->trailing_javascript, "location.href=\"#end_of_msgs\";\n"); + } return(0); } @@ -377,9 +413,11 @@ InitModule_BBSVIEWRENDERERS VIEW_BBS, bbsview_GetParamsGetServerCall, NULL, + NULL, NULL, bbsview_LoadMsgFromServer, bbsview_RenderView_or_Tail, - bbsview_Cleanup + bbsview_Cleanup, + NULL ); }