X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fpaging.c;h=d3319f127f3bebaf891ed073eb5d92ef6a099e82;hb=808f3be91dd6b6677e380695e2f16e6473141a7e;hp=71a48ab8cc11236b348adc3335711f163fbb3518;hpb=adeadeebd92a59e7a639a0fbba826515350524a9;p=citadel.git diff --git a/webcit/paging.c b/webcit/paging.c index 71a48ab8c..d3319f127 100644 --- a/webcit/paging.c +++ b/webcit/paging.c @@ -1,34 +1,15 @@ /* * $Id$ - * - * Functions which implement the chat and paging facilities. */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +/** + * \defgroup PageFunc Functions which implement the chat and paging facilities. + * \ingroup ClientPower + */ +/*@{*/ #include "webcit.h" - -/* - * display the form for paging (x-messaging) another user +/** + * \brief display the form for paging (x-messaging) another user */ void display_page(void) { @@ -36,12 +17,25 @@ void display_page(void) strcpy(recp, bstr("recp")); - output_headers(1, 1, 0, 0, 0, 0, 0); + output_headers(1, 1, 2, 0, 0, 0); + wprintf("
\n"); + wprintf("

"); + wprintf(_("Send instant message")); + wprintf("

"); + wprintf("
\n"); - svprintf("BOXTITLE", WCS_STRING, "Page: %s", recp); - do_template("beginbox"); + wprintf("
\n"); + + wprintf("
" + "
\n"); + + wprintf(_("Send an instant message to: ")); + escputs(recp); + wprintf("
\n"); - wprintf("
\n"); + wprintf("\n"); + wprintf("\n", WC->nonce); + wprintf("\n"); wprintf("
\n"); @@ -49,85 +43,82 @@ void display_page(void) escputs(recp); wprintf("\">\n"); - wprintf("\n"); - - wprintf("Enter message text:
"); + wprintf(_("Enter message text:")); + wprintf("
"); wprintf("\n"); wprintf("

\n"); - wprintf(""); - wprintf("
\n"); + wprintf("", _("Send message")); + wprintf("
\n", _("Cancel")); wprintf("\n"); - do_template("endbox"); + wprintf("
\n"); wDumpContent(1); } -/* - * page another user +/** + * \brief page another user */ void page_user(void) { - char recp[SIZ]; - char sc[SIZ]; - char buf[SIZ]; - char closewin[SIZ]; - - output_headers(1, 1, 0, 0, 0, 0, 0); + char recp[256]; + char buf[256]; - strcpy(recp, bstr("recp")); - strcpy(sc, bstr("sc")); - strcpy(closewin, bstr("closewin")); + safestrncpy(recp, bstr("recp"), sizeof recp); - if (strcmp(sc, "Send message")) { - wprintf("Message was not sent.
\n"); + if (!havebstr("send_button")) { + safestrncpy(WC->ImportantMessage, + _("Message was not sent."), + sizeof WC->ImportantMessage + ); } else { serv_printf("SEXP %s|-", recp); - serv_gets(buf); + serv_getln(buf, sizeof buf); if (buf[0] == '4') { - text_to_server(bstr("msgtext"), 0); + text_to_server(bstr("msgtext")); serv_puts("000"); - wprintf("Message has been sent to "); - escputs(recp); - wprintf(".
\n"); + stresc(buf, 256, recp, 0, 0); + snprintf(WC->ImportantMessage, + sizeof WC->ImportantMessage, + "%s%s.", + _("Message has been sent to "), + buf + ); } else { - wprintf("%s
\n", &buf[4]); + safestrncpy(WC->ImportantMessage, &buf[4], sizeof WC->ImportantMessage); } } - - if (!strcasecmp(closewin, "yes")) { - wprintf("
" - "[ close window ]
\n"); - } - wDumpContent(1); + url_do_template(); } -/* - * multiuser chat +/** + * \brief multiuser chat */ void do_chat(void) { char buf[SIZ]; - /* First, check to make sure we're still allowed in this room. */ - serv_printf("GOTO %s", WC->wc_roomname); - serv_gets(buf); + /** First, check to make sure we're still allowed in this room. */ + serv_printf("GOTO %s", ChrPtr(WC->wc_roomname)); + serv_getln(buf, sizeof buf); if (buf[0] != '2') { - smart_goto("_BASEROOM_"); + StrBuf *Buf; + Buf = NewStrBufPlain(HKEY("_BASEROOM_")); + smart_goto(Buf); + FreeStrBuf(&Buf); return; } - /* If the chat socket is still open from a previous chat, + /** + * If the chat socket is still open from a previous chat, * close it -- because it might be stale or in the wrong room. */ if (WC->chat_sock < 0) { @@ -135,41 +126,82 @@ void do_chat(void) WC->chat_sock = (-1); } - /* WebCit Chat works by having transmit, receive, and refresh - * frames. Load the frameset. + /** + * WebCit Chat works by having transmit, receive, and refresh + * frames. Load the frameset. (This isn't AJAX but the headers + * output by begin_ajax_response() happen to be the ones we need.) */ - do_template("chatframeset"); + begin_ajax_response(); + do_template("chatframeset", NULL); + end_ajax_response(); return; } -/* - * +/** + * \brief display page popup + * If there are instant messages waiting, and we notice that we haven't checked them in + * a while, it probably means that we need to open the instant messenger window. */ void page_popup(void) { + int len; char buf[SIZ]; - char pagefrom[SIZ]; - while (serv_puts("GEXP"), serv_gets(buf), buf[0]=='1') { - - extract(pagefrom, &buf[4], 3); + /** JavaScript function to alert the user that popups are probably blocked */ + wprintf("\n", + _("You have one or more instant messages waiting, but the Citadel Instant Messenger " + "window failed to open. This is probably because you have a popup blocker " + "installed. Please configure your popup blocker to allow popups from this site " + "if you wish to receive instant messages.") + ); - wprintf("
"); - wprintf("Instant message from "); - escputs(pagefrom); - wprintf("
"); - fmout(NULL, "LEFT"); - wprintf("
\n"); + /** First, do the check as part of our page load. */ + serv_puts("NOOP"); + len = serv_getln(buf, sizeof buf); + if ((len >= 3) && (buf[3] == '*')) { + if ((time(NULL) - WC->last_pager_check) > 60) { + wprintf("" + ); + } } - WC->HaveExpressMessages = 0; + /** Then schedule it to happen again a minute from now if the user is idle. */ + wprintf(" " + ); } -/* - * Support function for chat -- make sure the chat socket is connected +/** + * \brief Support function for chat + * make sure the chat socket is connected * and in chat mode. */ int setup_chat_socket(void) { @@ -180,12 +212,12 @@ int setup_chat_socket(void) { if (WC->chat_sock < 0) { if (!strcasecmp(ctdlhost, "uds")) { - /* unix domain socket */ + /** unix domain socket */ sprintf(buf, "%s/citadel.socket", ctdlport); WC->chat_sock = uds_connectsock(buf); } else { - /* tcp socket */ + /** tcp socket */ WC->chat_sock = tcp_connectsock(ctdlhost, ctdlport); } @@ -193,24 +225,24 @@ int setup_chat_socket(void) { return(errno); } - /* Temporarily swap the serv and chat sockets during chat talk */ + /** 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(buf); + serv_getln(buf, sizeof buf); if (buf[0] == '2') { - serv_printf("USER %s", WC->wc_username); - serv_gets(buf); + serv_printf("USER %s", ChrPtr(WC->wc_username)); + serv_getln(buf, sizeof buf); if (buf[0] == '3') { - serv_printf("PASS %s", WC->wc_password); - serv_gets(buf); + serv_printf("PASS %s", ChrPtr(WC->wc_password)); + serv_getln(buf, sizeof buf); if (buf[0] == '2') { - serv_printf("GOTO %s", WC->wc_roomname); - serv_gets(buf); + serv_printf("GOTO %s", ChrPtr(WC->wc_roomname)); + serv_getln(buf, sizeof buf); if (buf[0] == '2') { serv_puts("CHAT"); - serv_gets(buf); + serv_getln(buf, sizeof buf); if (buf[0] == '8') { good_chatmode = 1; } @@ -219,7 +251,7 @@ int setup_chat_socket(void) { } } - /* Unswap the sockets. */ + /** Unswap the sockets. */ i = WC->serv_sock; WC->serv_sock = WC->chat_sock; WC->chat_sock = i; @@ -232,8 +264,9 @@ int setup_chat_socket(void) { -/* - * Receiving side of the chat window. This is implemented in a +/** + * \brief 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. */ @@ -247,10 +280,9 @@ void chat_recv(void) { char cl_text[SIZ]; char *output_data = NULL; - output_headers(0, 0, 0, 0, 0, 0, 0); + output_headers(0, 0, 0, 0, 0, 0); - wprintf("Content-type: text/html\n"); - wprintf("\n"); + hprintf("Content-type: text/html; charset=utf-8\r\n"); wprintf("\n" "\n" "\n" @@ -260,12 +292,13 @@ void chat_recv(void) { ); if (setup_chat_socket() != 0) { - wprintf("Error setting up chat socket\n"); + wprintf(_("An error occurred while setting up the chat socket.")); + wprintf("\n"); wDumpContent(0); return; } - /* + /** * See if there is any chat data waiting. */ output_data = strdup(""); @@ -274,27 +307,28 @@ void chat_recv(void) { pf.fd = WC->chat_sock; pf.events = POLLIN; pf.revents = 0; - if (poll(&pf, 1, 1) > 0) if (pf.revents & POLLIN) { + if ((poll(&pf, 1, 1) > 0) && (pf.revents & POLLIN)) { ++got_data; - /* Temporarily swap the serv and chat sockets during chat talk */ + /** 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(buf); + serv_getln(buf, sizeof buf); if (!strcmp(buf, "000")) { - strcpy(buf, ":|exiting chat mode"); + strcpy(buf, ":|"); + strcat(buf, _("Now exiting chat mode.")); end_chat_now = 1; } - /* Unswap the sockets. */ + /** Unswap the sockets. */ i = WC->serv_sock; WC->serv_sock = WC->chat_sock; WC->chat_sock = i; - /* Append our output data */ + /** Append our output data */ output_data = realloc(output_data, strlen(output_data) + strlen(buf) + 4); strcat(output_data, buf); strcat(output_data, "\n"); @@ -305,24 +339,25 @@ void chat_recv(void) { 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; + if (!IsEmptyStr(output_data)) { + int len; + len = strlen(output_data); + if (output_data[len-1] == '\n') { + output_data[len-1] = 0; } - /* Output our fun to the other frame. */ - wprintf("last_chat_user)) { wprintf(""); - if (!strcasecmp(cl_user, WC->wc_username)) { + if (!strcasecmp(cl_user, ChrPtr(WC->wc_fullname))) { wprintf(""); } else { @@ -385,88 +420,96 @@ void chat_recv(void) { } -/* - * sending side of the chat window +/** + * \brief sending side of the chat window */ void chat_send(void) { int i; char send_this[SIZ]; char buf[SIZ]; - output_headers(0, 0, 0, 0, 0, 0, 0); - wprintf("Content-type: text/html\n"); - wprintf("\n"); + output_headers(0, 0, 0, 0, 0, 0); + hprintf("Content-type: text/html; charset=utf-8\r\n"); wprintf("" "" ); - if (bstr("send_this") != NULL) { + if (havebstr("send_this")) { strcpy(send_this, bstr("send_this")); } else { strcpy(send_this, ""); } - if (bstr("sendbutton") != NULL) { - - if (!strcasecmp(bstr("sendbutton"), "Help")) { - strcpy(send_this, "/help"); - } + if (havebstr("help_button")) { + strcpy(send_this, "/help"); + } - if (!strcasecmp(bstr("sendbutton"), "List Users")) { - strcpy(send_this, "/who"); - } + if (havebstr("list_button")) { + strcpy(send_this, "/who"); + } - if (!strcasecmp(bstr("sendbutton"), "Exit")) { - strcpy(send_this, "/quit"); - } + if (havebstr("exit_button")) { + strcpy(send_this, "/quit"); + } - if (setup_chat_socket() != 0) { - wprintf("Error setting up chat socket\n"); - wDumpContent(0); - return; - } + if (setup_chat_socket() != 0) { + wprintf(_("An error occurred while setting up the chat socket.")); + wprintf("\n"); + wDumpContent(0); + return; + } - /* Temporarily swap the serv and chat sockets during chat talk */ - i = WC->serv_sock; - WC->serv_sock = WC->chat_sock; - WC->chat_sock = i; + /** Temporarily swap the serv and chat sockets during chat talk */ + i = WC->serv_sock; + WC->serv_sock = WC->chat_sock; + WC->chat_sock = i; - while (strlen(send_this) > 0) { - if (strlen(send_this) < 67) { - serv_puts(send_this); - strcpy(send_this, ""); - } - else { - for (i=55; i<67; ++i) { - if (send_this[i] == ' ') break; - } - strncpy(buf, send_this, i); - buf[i] = 0; - strcpy(send_this, &send_this[i]); - serv_puts(buf); + while (!IsEmptyStr(send_this)) { + if (strlen(send_this) < 67) { + serv_puts(send_this); + strcpy(send_this, ""); + } + else { + for (i=55; i<67; ++i) { + if (send_this[i] == ' ') break; } + strncpy(buf, send_this, i); + buf[i] = 0; + strcpy(send_this, &send_this[i]); + serv_puts(buf); } - - /* Unswap the sockets. */ - i = WC->serv_sock; - WC->serv_sock = WC->chat_sock; - WC->chat_sock = i; - } - wprintf("
\n"); + /** Unswap the sockets. */ + i = WC->serv_sock; + WC->serv_sock = WC->chat_sock; + WC->chat_sock = i; + + wprintf("\n"); + wprintf("\n", WC->nonce); wprintf("\n", SIZ-10); wprintf("
"); - wprintf("\n"); - wprintf("\n"); - wprintf("\n"); - wprintf("\n"); + wprintf("\n", _("Send")); + wprintf("\n", _("Help")); + wprintf("\n", _("List users")); + wprintf("\n", _("Exit")); wprintf("
\n"); wprintf("\n"); wDumpContent(0); } +void +InitModule_PAGING +(void) +{ + WebcitAddUrlHandler(HKEY("display_page"), display_page, 0); + WebcitAddUrlHandler(HKEY("page_user"), page_user, 0); + WebcitAddUrlHandler(HKEY("chat"), do_chat, 0); + WebcitAddUrlHandler(HKEY("chat_recv"), chat_recv, 0); + WebcitAddUrlHandler(HKEY("chat_send"), chat_send, 0); +} +/*@}*/