From 38d5956ec528943c3c0cae502885731e5ef01a9d Mon Sep 17 00:00:00 2001
From: =?utf8?q?Wilfried=20G=C3=B6esgens?=
Date: Wed, 24 Dec 2008 10:46:20 +0000
Subject: [PATCH] * fix dropdown * demand url parameters on goto* and friends *
add function to overwrite url params * adjust the actual url so we don't
gotonext on selecting s.th. from the dropdown
---
webcit/debian/rules | 2 +-
webcit/messages.c | 45 ++++++++++++++------
webcit/msg_renderers.c | 11 +++++
webcit/paramhandling.c | 18 +++++++-
webcit/roomops.c | 12 +++---
webcit/static/t/msg_listselector_bottom.html | 6 +--
webcit/static/t/msg_listselector_top.html | 4 +-
webcit/subst.c | 15 +++++++
webcit/webcit.h | 2 +
9 files changed, 90 insertions(+), 25 deletions(-)
diff --git a/webcit/debian/rules b/webcit/debian/rules
index c837f23f9..cea5888c3 100755
--- a/webcit/debian/rules
+++ b/webcit/debian/rules
@@ -19,7 +19,7 @@ ifneq (,$(findstring profiling,$(DEB_BUILD_OPTIONS)))
PROFILE_ARGS= --with-gprof
endif
ifneq (,$(findstring debug,$(DEB_BUILD_OPTIONS)))
- CFLAGS += -O0 -ggdb -rdynamic -MD -MP -D TECH_PREVIEW
+ CFLAGS += -O0 -ggdb -rdynamic -MD -MP -D TECH_PREVIEW -pedantic
LDFLAGS += -pg
EXTRA_ARGS = --with-backtrace
else
diff --git a/webcit/messages.c b/webcit/messages.c
index c159a055a..3291e45ac 100644
--- a/webcit/messages.c
+++ b/webcit/messages.c
@@ -480,7 +480,7 @@ inline message_summary* GetMessagePtrAt(int n, HashList *Summ)
}
-void DrawMessageDropdown(StrBuf *Selector, long maxmsgs, long startmsg)
+long DrawMessageDropdown(StrBuf *Selector, long maxmsgs, long startmsg)
{
StrBuf *TmpBuf;
wcsession *WCC = WC;
@@ -488,6 +488,7 @@ void DrawMessageDropdown(StrBuf *Selector, long maxmsgs, long startmsg)
int lo, hi, n;
int i = 0;
long StartMsg = 0;
+ long ret;
void *vMsg;
long hklen;
const char *key;
@@ -495,12 +496,12 @@ void DrawMessageDropdown(StrBuf *Selector, long maxmsgs, long startmsg)
int nItems;
HashPos *At;
long vector[16];
- int nMessages = DEFAULT_MAXMSGS;
+ int nMessages = (lbstr("SortOrder") == 1)? DEFAULT_MAXMSGS : -DEFAULT_MAXMSGS;
TmpBuf = NewStrBuf();
- At = GetNewHashPos(WCC->summ, (lbstr("SortOrder") == 1)? -nMessages : nMessages);
+ At = GetNewHashPos(WCC->summ, nMessages);
nItems = GetCount(WCC->summ);
-
+ ret = abs(nMessages);
vector[0] = 7;
vector[1] = startmsg;
vector[2] = maxmsgs;
@@ -509,21 +510,38 @@ void DrawMessageDropdown(StrBuf *Selector, long maxmsgs, long startmsg)
while (!done) {
lo = GetHashPosCounter(At);
- if (lo + nMessages > nItems) {
- hi = nItems;
- }
- else {
- hi = lo + nMessages;
+ if (nMessages > 0) {
+ if (lo + nMessages > nItems) {
+ hi = nItems;
+ }
+ else {
+ hi = lo + nMessages;
+ }
+ } else {
+ if (lo + nMessages <= 0) {
+ hi = 1;
+ }
+ else {
+ if (lo % abs(nMessages) != 0)
+ hi = lo + (lo % abs(nMessages) *
+ (nMessages / abs(nMessages)));
+ else
+ hi = lo + nMessages;
+ }
}
done = !GetNextHashPos(WCC->summ, At, &hklen, &key, &vMsg);
Msg = (message_summary*) vMsg;
n = (Msg==NULL)? 0 : Msg->msgnum;
if (i == 0)
StartMsg = n;
- vector[4] = lo;
+ if ((vector[1] == n) && (lo - hi + 1 != nMessages)) {
+ ret = abs(lo - hi + 1);
+ }
+ vector[4] = lo + 1;
vector[5] = hi;
vector[6] = n;
FlushStrBuf(TmpBuf);
+ dbg_print_longvector(vector);
DoTemplate(HKEY("select_messageindex"), TmpBuf, &vector, CTX_LONGVECTOR);
StrBufAppendBuf(Selector, TmpBuf, 0);
i++;
@@ -532,10 +550,12 @@ void DrawMessageDropdown(StrBuf *Selector, long maxmsgs, long startmsg)
FlushStrBuf(TmpBuf);
vector[1] = lbstr("maxmsgs") == 9999999;
vector[2] = 0;
+ dbg_print_longvector(vector);
DoTemplate(HKEY("select_messageindex_all"), TmpBuf, &vector, CTX_LONGVECTOR);
StrBufAppendBuf(Selector, TmpBuf, 0);
FreeStrBuf(&TmpBuf);
DeleteHashPos(&At);
+ return ret;
}
void load_seen_flags(void)
@@ -679,6 +699,7 @@ void readloop(long oper)
}
if (is_bbview) {
+ SetAccessCommand(oper);
if (havebstr("SortOrder")) {
bbs_reverse = lbstr("SortOrder") == 2;
}
@@ -752,7 +773,7 @@ void readloop(long oper)
BBViewToolBar = NewStrBuf();
MessageDropdown = NewStrBuf();
- DrawMessageDropdown(MessageDropdown, maxmsgs, startmsg);
+ maxmsgs = DrawMessageDropdown(MessageDropdown, maxmsgs, startmsg);
DoTemplate(HKEY("msg_listselector_top"), BBViewToolBar, MessageDropdown, CTX_STRBUF);
StrBufAppendBuf(WCC->WBuf, BBViewToolBar, 0);
@@ -800,7 +821,7 @@ void readloop(long oper)
if (lowest_displayed < 0) lowest_displayed = a;
highest_displayed = a;
- ++num_displayed;
+ num_displayed++;
}
}
}
diff --git a/webcit/msg_renderers.c b/webcit/msg_renderers.c
index d9955e8e5..90202273e 100644
--- a/webcit/msg_renderers.c
+++ b/webcit/msg_renderers.c
@@ -982,7 +982,18 @@ readloop_struct rlid[] = {
+void SetAccessCommand(long Oper)
+{
+ wcsession *WCC = WC;
+ if (WCC->UrlFragment1 != NULL ) {
+ FlushStrBuf(WCC->UrlFragment1);
+ StrBufAppendBufPlain(WCC->UrlFragment1,
+ rlid[Oper].name.Key, rlid[Oper].name.len, 0);
+ }
+ else
+ WCC->UrlFragment1 = NewStrBufPlain(rlid[Oper].name.Key, rlid[Oper].name.len);
+}
diff --git a/webcit/paramhandling.c b/webcit/paramhandling.c
index afa264f10..2ebc35305 100644
--- a/webcit/paramhandling.c
+++ b/webcit/paramhandling.c
@@ -404,9 +404,25 @@ void tmplput_url_part(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *
UrlBuf = WCC->UrlFragment2;
else
UrlBuf = WCC->UrlFragment3;
+ if (UrlBuf == NULL) {
+ lprintf(1, "urlbuf [%s] not set. (in '%s' line %ld);[%s]\n",
+ Tokens->Params[0]->Start,
+ ChrPtr(Tokens->FileName),
+ Tokens->Line,
+ ChrPtr(Tokens->FlatToken));
+ StrBufAppendPrintf(
+ Target,
+ "\nurlbuf [%s] not set (in '%s' line %ld)\n[%s]\n
\n",
+ Tokens->Params[0]->Start,
+ ChrPtr(Tokens->FileName),
+ Tokens->Line,
+ ChrPtr(Tokens->FlatToken));
+
+
+ }
StrBufAppendTemplate(Target, nArgs, Tokens, Context, ContextType,
- UrlBuf, 1);
+ UrlBuf, 2);
}
}
diff --git a/webcit/roomops.c b/webcit/roomops.c
index affe750aa..958c25d6e 100644
--- a/webcit/roomops.c
+++ b/webcit/roomops.c
@@ -3844,13 +3844,13 @@ InitModule_ROOMOPS
RegisterNamespace("ROOMNAME", 0, 1, tmplput_RoomName, 0);
WebcitAddUrlHandler(HKEY("knrooms"), knrooms, 0);
- WebcitAddUrlHandler(HKEY("gotonext"), _gotonext, 0);
- WebcitAddUrlHandler(HKEY("skip"), gotonext, 0);
- WebcitAddUrlHandler(HKEY("ungoto"), ungoto, 0);
- WebcitAddUrlHandler(HKEY("dotgoto"), dotgoto, 0);
- WebcitAddUrlHandler(HKEY("dotskip"), dotskip, 0);
+ WebcitAddUrlHandler(HKEY("gotonext"), _gotonext, NEED_URL);
+ WebcitAddUrlHandler(HKEY("skip"), gotonext, NEED_URL);
+ WebcitAddUrlHandler(HKEY("ungoto"), ungoto, NEED_URL);
+ WebcitAddUrlHandler(HKEY("dotgoto"), dotgoto, NEED_URL);
+ WebcitAddUrlHandler(HKEY("dotskip"), dotskip, NEED_URL);
WebcitAddUrlHandler(HKEY("display_private"), _display_private, 0);
- WebcitAddUrlHandler(HKEY("goto_private"), goto_private, 0);
+ WebcitAddUrlHandler(HKEY("goto_private"), goto_private, NEED_URL);
WebcitAddUrlHandler(HKEY("zapped_list"), zapped_list, 0);
WebcitAddUrlHandler(HKEY("display_zap"), display_zap, 0);
WebcitAddUrlHandler(HKEY("zap"), zap, 0);
diff --git a/webcit/static/t/msg_listselector_bottom.html b/webcit/static/t/msg_listselector_bottom.html
index e459afcf8..20c653137 100644
--- a/webcit/static/t/msg_listselector_bottom.html
+++ b/webcit/static/t/msg_listselector_bottom.html
@@ -6,7 +6,7 @@
>
@@ -14,8 +14,8 @@
+ OnChange="location.href='?SortBy=date&SortOrder=2'"
+ %("COND:BSTR", 1, "SortOrder", 2, "checked", "")>
>
diff --git a/webcit/static/t/msg_listselector_top.html b/webcit/static/t/msg_listselector_top.html
index 0c81f9cc1..3f4709b3c 100644
--- a/webcit/static/t/msg_listselector_top.html
+++ b/webcit/static/t/msg_listselector_top.html
@@ -6,7 +6,7 @@
>
@@ -14,7 +14,7 @@
>
diff --git a/webcit/subst.c b/webcit/subst.c
index a4c123594..de4c18ee1 100644
--- a/webcit/subst.c
+++ b/webcit/subst.c
@@ -2105,7 +2105,22 @@ void tmplput_long_vector(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, voi
}
}
+void dbg_print_longvector(long *LongVector)
+{
+ StrBuf *Buf = NewStrBufPlain(HKEY("Longvector: ["));
+ int nItems = LongVector[0];
+ int i;
+
+ for (i = 0; i < nItems; i++) {
+ if (i + 1 < nItems)
+ StrBufAppendPrintf(Buf, "%d: %ld | ", i, LongVector[i]);
+ else
+ StrBufAppendPrintf(Buf, "%d: %ld]\n", i, LongVector[i]);
+ }
+ lprintf(1, ChrPtr(Buf));
+ FreeStrBuf(&Buf);
+}
int ConditionalLongVector(WCTemplateToken *Tokens, void *Context, int ContextType)
{
diff --git a/webcit/webcit.h b/webcit/webcit.h
index 73dce523e..bfed02eda 100644
--- a/webcit/webcit.h
+++ b/webcit/webcit.h
@@ -395,6 +395,7 @@ void RegisterSortFunc(const char *name, long len,
CompareFunc Reverse,
long ContextType);
+void dbg_print_longvector(long *LongVector);
/*
* \brief Values for wcs_type
@@ -819,6 +820,7 @@ typedef struct _readloopstruct {
ConstStr name;
readloop_servcmd cmd;
} readloop_struct;
+void SetAccessCommand(long Oper);
void readloop(long oper);
int read_message(StrBuf *Target, const char *tmpl, long tmpllen, long msgnum, int printable_view, const StrBuf *section);
void do_addrbook_view(addrbookent *addrbook, int num_ab);
--
2.39.2