X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fpaging.c;h=e58160733dfa2cd1db4393addc500b3fac18666a;hb=0f72e15a12dcc90e3dbfc01ff35c0e910a8d419e;hp=c892b7a64ed9926286d76b34962692e584450297;hpb=d159f2a1a8cf9efccb8f733d7e2452c5f7cfbf64;p=citadel.git diff --git a/webcit/paging.c b/webcit/paging.c index c892b7a64..e58160733 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,22 +17,24 @@ void display_page(void) strcpy(recp, bstr("recp")); - output_headers(1, 1, 2, 0, 0, 0, 0); - wprintf("
\n" - "
" - "Send instant message" - "
\n" - "
\n
\n" - ); - - wprintf("
" - "
\n"); - - wprintf("Send an instant message to: "); + output_headers(1, 1, 2, 0, 0, 0); + wprintf("
\n"); + wprintf("

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

"); + wprintf("
\n"); + + wprintf("
\n"); + + wprintf("
" + "
\n"); + + wprintf(_("Send an instant message to: ")); escputs(recp); wprintf("
\n"); - wprintf("
\n"); + wprintf("\n"); + wprintf("\n", WC->nonce); wprintf("
\n"); @@ -59,91 +42,79 @@ 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"); 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, 2, 0, 0, 0, 0); - wprintf("
\n" - "
" - "Add or edit an event" - "
\n" - "
\n
\n" - ); - - strcpy(recp, bstr("recp")); - strcpy(sc, bstr("sc")); - strcpy(closewin, bstr("closewin")); + char recp[256]; + char buf[256]; - if (strcmp(sc, "Send message")) { - wprintf("Message was not sent.
\n"); + safestrncpy(recp, bstr("recp"), sizeof recp); + + if (IsEmptyStr(bstr("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, 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); + who(); } -/* - * multiuser chat +/** + * \brief multiuser chat */ void do_chat(void) { char buf[SIZ]; - /* First, check to make sure we're still allowed in this room. */ + /** First, check to make sure we're still allowed in this room. */ serv_printf("GOTO %s", WC->wc_roomname); - serv_gets(buf); + serv_getln(buf, sizeof buf); if (buf[0] != '2') { smart_goto("_BASEROOM_"); 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) { @@ -151,46 +122,81 @@ 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.) */ + begin_ajax_response(); do_template("chatframeset"); + 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) { char buf[SIZ]; - char pagefrom[SIZ]; - - while (serv_puts("GEXP"), serv_gets(buf), buf[0]=='1') { - - extract(pagefrom, &buf[4], 3); - - wprintf("" - "" - "
"); - wprintf("Instant message from "); - escputs(pagefrom); - wprintf("
"); - fmout(NULL, "LEFT"); - wprintf("
" - "
\n"); + + /** 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.") + ); + + /** First, do the check as part of our page load. */ + serv_puts("NOOP"); + serv_getln(buf, sizeof buf); + if (buf[3] == '*') { + if ((time(NULL) - WC->last_pager_check) > 60) { + wprintf("" + ); + } } - WC->HaveInstantMessages = 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) { @@ -201,12 +207,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); } @@ -214,24 +220,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_getln(buf, sizeof buf); if (buf[0] == '3') { serv_printf("PASS %s", WC->wc_password); - serv_gets(buf); + serv_getln(buf, sizeof buf); if (buf[0] == '2') { serv_printf("GOTO %s", WC->wc_roomname); - serv_gets(buf); + 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; } @@ -240,7 +246,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; @@ -253,8 +259,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. */ @@ -268,9 +275,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("Content-type: text/html; charset=utf-8\n"); wprintf("\n"); wprintf("\n" "\n" @@ -281,12 +288,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(""); @@ -298,24 +306,25 @@ void chat_recv(void) { if (poll(&pf, 1, 1) > 0) if (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"); @@ -326,24 +335,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, WC->wc_fullname)) { wprintf(""); } else { @@ -406,16 +416,16 @@ 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"); + output_headers(0, 0, 0, 0, 0, 0); + wprintf("Content-type: text/html; charset=utf-8\n"); wprintf("\n"); wprintf("" "" @@ -428,66 +438,64 @@ void chat_send(void) { strcpy(send_this, ""); } - if (bstr("sendbutton") != NULL) { - - if (!strcasecmp(bstr("sendbutton"), "Help")) { - strcpy(send_this, "/help"); - } + if (!IsEmptyStr(bstr("help_button"))) { + strcpy(send_this, "/help"); + } - if (!strcasecmp(bstr("sendbutton"), "List Users")) { - strcpy(send_this, "/who"); - } + if (!IsEmptyStr(bstr("list_button"))) { + strcpy(send_this, "/who"); + } - if (!strcasecmp(bstr("sendbutton"), "Exit")) { - strcpy(send_this, "/quit"); - } + if (!IsEmptyStr(bstr("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); } - +/*@}*/