From 2078be5185722e340513fe9307117813aca3a288 Mon Sep 17 00:00:00 2001 From: Art Cancro Date: Wed, 3 Mar 2004 05:21:36 +0000 Subject: [PATCH] * Made the chat screen totally kick-ass sweet. The flickering reload i-frame is now tiny and hidden, and it *appends* new chat data to the viewable window using JavaScript. No flickering + scrollback! * Added a help button to the chat screen. --- webcit/ChangeLog | 7 +++ webcit/paging.c | 118 ++++++++++++++++++++++++++++------------------- webcit/webcit.c | 34 ++++++++++++++ webcit/webcit.h | 5 +- 4 files changed, 114 insertions(+), 50 deletions(-) diff --git a/webcit/ChangeLog b/webcit/ChangeLog index 138c9163a..0ef62ca06 100644 --- a/webcit/ChangeLog +++ b/webcit/ChangeLog @@ -1,4 +1,10 @@ $Log$ +Revision 505.11 2004/03/03 05:21:36 ajc +* Made the chat screen totally kick-ass sweet. The flickering reload + i-frame is now tiny and hidden, and it *appends* new chat data to + the viewable window using JavaScript. No flickering + scrollback! +* Added a help button to the chat screen. + Revision 505.10 2004/02/29 22:52:15 ajc * Close and clear (set to -1) server socket handle when socket errors are detected. Fixes a chat problem reported by Winzlo. @@ -1700,3 +1706,4 @@ Sun Dec 6 19:50:55 EST 1998 Art Cancro 1998-12-03 Nathan Bryant * webserver.c: warning fix + diff --git a/webcit/paging.c b/webcit/paging.c index 0c13acedb..3d879eaac 100644 --- a/webcit/paging.c +++ b/webcit/paging.c @@ -118,23 +118,32 @@ void page_user(void) void do_chat(void) { - output_headers(1); + output_headers(3); wprintf("
" "" "" - "Real-time chat\n" + ); + escputs(WC->wc_roomname); + wprintf(": real-time chat\n" "
\n" - "\n" - "
\n" - "" + + "
\n" + + "\n" ); @@ -191,10 +200,6 @@ int setup_chat_socket(void) { if (WC->chat_sock < 0) { - for (i=0; ichatlines[i], ""); - } - if (!strcasecmp(ctdlhost, "uds")) { /* unix domain socket */ sprintf(buf, "%s/citadel.socket", ctdlport); @@ -229,7 +234,6 @@ int setup_chat_socket(void) { serv_gets(buf); if (buf[0] == '8') { good_chatmode = 1; - serv_puts("/help"); } } } @@ -250,15 +254,19 @@ int setup_chat_socket(void) { /* - * receiving side of the chat window + * Receiving side of the chat window. This is implemented in a + * tiny hidden IFRAME that just does JavaScript writes to + * other frames whenever it refreshes and finds new data. */ void chat_recv(void) { int i; - char name[SIZ]; - char text[SIZ]; struct pollfd pf; int got_data = 0; int end_chat_now = 0; + char buf[SIZ]; + char cl_user[SIZ]; + char cl_text[SIZ]; + char *output_data = NULL; output_headers(0); @@ -268,7 +276,8 @@ void chat_recv(void) { "\n" "\n" "\n" - "" + + "\n" ); if (setup_chat_socket() != 0) { @@ -280,6 +289,7 @@ void chat_recv(void) { /* * See if there is any chat data waiting. */ + output_data = strdup(""); do { got_data = 0; pf.fd = WC->chat_sock; @@ -288,57 +298,67 @@ void chat_recv(void) { if (poll(&pf, 1, 1) > 0) if (pf.revents & POLLIN) { ++got_data; - for (i=0; ichatlines[i], WC->chatlines[i+1]); - } - /* Temporarily swap the serv and chat sockets during chat talk */ i = WC->serv_sock; WC->serv_sock = WC->chat_sock; WC->chat_sock = i; - serv_gets(WC->chatlines[CHATLINES-1]); - if (!strcmp(WC->chatlines[CHATLINES-1], "000")) { + serv_gets(buf); + + if (!strcmp(buf, "000")) { + strcpy(buf, ":|exiting chat mode"); end_chat_now = 1; - strcpy(WC->chatlines[CHATLINES-1], ":|exiting chat mode"); } /* Unswap the sockets. */ i = WC->serv_sock; WC->serv_sock = WC->chat_sock; WC->chat_sock = i; - } - } while ( (got_data) && (!end_chat_now) ); - /* - * Display appropriately. - */ - for (i=0; ichatlines[i]) > 0) { - extract(name, WC->chatlines[i], 0); - extract(text, WC->chatlines[i], 1); - if (!strcasecmp(name, WC->wc_username)) { - wprintf(""); - } - else if (!strcmp(name, ":")) { - wprintf(""); - } - else { - wprintf(""); - } - escputs(name); - wprintf(": "); - escputs(text); - wprintf("
\n"); + /* Append our output data */ + output_data = realloc(output_data, strlen(output_data) + strlen(buf) + 4); + strcat(output_data, buf); + strcat(output_data, "\n"); } - } + + } while ( (got_data) && (!end_chat_now) ); if (end_chat_now) { close(WC->chat_sock); WC->chat_sock = (-1); - wprintf("\n"); + wprintf("\n"); + } + + if (strlen(output_data) > 0) { + + if (output_data[strlen(output_data)-1] == '\n') { + output_data[strlen(output_data)-1] = 0; + } + + /* Output our fun to the other frame. */ + wprintf(""); + jsescputs(cl_user); + wprintf(": "); + jsescputs(cl_text); + wprintf("

"); + wprintf("'); \n"); + } + + wprintf("parent.chat_transcript.scrollTo(999999,999999);\">\n"); } + free(output_data); + wprintf("\n"); wDumpContent(0); } @@ -367,6 +387,10 @@ void chat_send(void) { if (bstr("sendbutton") != NULL) { + if (!strcasecmp(bstr("sendbutton"), "Help")) { + strcpy(send_this, "/help"); + } + if (!strcasecmp(bstr("sendbutton"), "Exit")) { strcpy(send_this, "/quit"); } @@ -391,10 +415,10 @@ void chat_send(void) { } - wprintf("Send: "); wprintf("
\n"); wprintf("\n"); wprintf("\n"); + wprintf("\n"); wprintf("\n"); wprintf("
\n"); diff --git a/webcit/webcit.c b/webcit/webcit.c index d86c7a763..914484cef 100644 --- a/webcit/webcit.c +++ b/webcit/webcit.c @@ -262,6 +262,40 @@ void urlescputs(char *strbuf) } +/* + * Copy a string, escaping characters for JavaScript strings. + */ +void jsesc(char *target, char *strbuf) +{ + int a; + strcpy(target, ""); + + for (a = 0; a < strlen(strbuf); ++a) { + if (strbuf[a] == '<') + strcat(target, "["); + else if (strbuf[a] == '>') + strcat(target, "]"); + else if (strbuf[a] == '\"') + strcat(target, """); + else if (strbuf[a] == '&') + strcat(target, "&;"); + else if (strbuf[a] == '\'') + strcat(target, "\\'"); + else { + strncat(target, &strbuf[a], 1); + } + } +} + +void jsescputs(char *strbuf) +{ + char outbuf[SIZ]; + + jsesc(outbuf, strbuf); + wprintf("%s", outbuf); +} + + /* diff --git a/webcit/webcit.h b/webcit/webcit.h index 0cb600824..a147a2536 100644 --- a/webcit/webcit.h +++ b/webcit/webcit.h @@ -163,8 +163,6 @@ struct wc_attachment { char *data; }; -#define CHATLINES 8 - /* * One of these is kept for each active Citadel session. * HTTP transactions are bound to one at a time. @@ -220,7 +218,6 @@ struct wcsession { char ImportantMessage[SIZ]; int outside_frameset_allowed; /* nonzero if current req is allowed * outside of the main frameset */ - char chatlines[CHATLINES][SIZ]; }; #define extract(dest,source,parmnum) extract_token(dest,source,parmnum,'|') @@ -265,6 +262,8 @@ void serv_printf(const char *format,...); char *bstr(char *key); void urlesc(char *, char *); void urlescputs(char *); +void jsesc(char *, char *); +void jsescputs(char *); void output_headers(int); void wprintf(const char *format,...); void output_static(char *what); -- 2.39.2