X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fpaging.c;h=38b8b541d482befa0408e5231fb5bd773f966856;hb=fb6f6fa4ec4e3277e30d84326d48e6850822d318;hp=e93ac646bda13cd044668a182b47b3cef414b237;hpb=19efac53a8a87446e66e6e0213d7f9b46af60a48;p=citadel.git diff --git a/webcit/paging.c b/webcit/paging.c index e93ac646b..38b8b541d 100644 --- a/webcit/paging.c +++ b/webcit/paging.c @@ -1,5 +1,15 @@ /* - * $Id$ + * This module handles instant message related functions. + * + * Copyright (c) 1996-2012 by the citadel.org team + * + * 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. */ #include "webcit.h" @@ -13,80 +23,70 @@ void display_page(void) strcpy(recp, bstr("recp")); - output_headers(1, 1, 2, 0, 0, 0); - wprintf("
\n"); - wprintf("

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

"); - wprintf("
\n"); + output_headers(1, 1, 1, 0, 0, 0); + wc_printf("
\n"); + wc_printf("

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

"); + wc_printf("
\n"); - wprintf("
\n"); + wc_printf("
\n"); - wprintf("
" - "
\n"); + wc_printf("
\n"); - wprintf(_("Send an instant message to: ")); + wc_printf(_("Send an instant message to: ")); escputs(recp); - wprintf("
\n"); + wc_printf("
\n"); - wprintf("
\n"); - wprintf("\n", WC->nonce); - wprintf("\n"); + wc_printf("\n"); + wc_printf("\n", WC->nonce); + wc_printf("\n"); - wprintf("
\n"); + wc_printf("
\n"); - wprintf("\n"); + wc_printf("\">\n"); - wprintf(_("Enter message text:")); - wprintf("
"); + wc_printf(_("Enter message text:")); + wc_printf("
"); - wprintf("\n"); - wprintf("

\n"); + wc_printf("

\n"); - wprintf("", _("Send message")); - wprintf("
\n", _("Cancel")); + wc_printf("", _("Send message")); + wc_printf("
\n", _("Cancel")); - wprintf("\n"); - wprintf("
\n"); + wc_printf("\n"); + wc_printf("
\n"); wDumpContent(1); } -/** - * \brief page another user +/* + * page another user */ void page_user(void) { char recp[256]; - char buf[256]; + StrBuf *Line; safestrncpy(recp, bstr("recp"), sizeof recp); if (!havebstr("send_button")) { - safestrncpy(WC->ImportantMessage, - _("Message was not sent."), - sizeof WC->ImportantMessage - ); + AppendImportantMessage(_("Message was not sent."), -1); } else { + Line = NewStrBuf(); serv_printf("SEXP %s|-", recp); - serv_getln(buf, sizeof buf); - - if (buf[0] == '4') { + StrBuf_ServGetln(Line); + if (GetServerStatusMsg(Line, NULL, 0, 0) == 4) { + char buf[256]; text_to_server(bstr("msgtext")); serv_puts("000"); stresc(buf, 256, recp, 0, 0); - snprintf(WC->ImportantMessage, - sizeof WC->ImportantMessage, - "%s%s.", - _("Message has been sent to "), - buf - ); - } - else { - safestrncpy(WC->ImportantMessage, &buf[4], sizeof WC->ImportantMessage); + AppendImportantMessage(buf, -1); + AppendImportantMessage(_("Message has been sent to "), -1); } } @@ -95,408 +95,27 @@ void page_user(void) -/** - * \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", ChrPtr(WC->wc_roomname)); - serv_getln(buf, sizeof buf); - if (buf[0] != '2') { - StrBuf *Buf; - Buf = NewStrBufPlain(HKEY("_BASEROOM_")); - smart_goto(Buf); - FreeStrBuf(&Buf); - return; - } - - /** - * 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) { - close(WC->chat_sock); - WC->chat_sock = (-1); - } - - /** - * 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", NULL); - end_ajax_response(); - return; -} - - -/** - * \brief display page popup +/* + * 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 Conditional_PAGE_WAITING(StrBuf *Target, WCTemplputParams *TP) { int len; char buf[SIZ]; /** 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"); len = serv_getln(buf, sizeof buf); if ((len >= 3) && (buf[3] == '*')) { if ((time(NULL) - WC->last_pager_check) > 60) { - wprintf("" - ); - } - } - - /** Then schedule it to happen again a minute from now if the user is idle. */ - wprintf(" " - ); -} - - - -/** - * \brief Support function for chat - * make sure the chat socket is connected - * and in chat mode. - */ -int setup_chat_socket(void) { - char buf[SIZ]; - int i; - int good_chatmode = 0; - - if (WC->chat_sock < 0) { - - if (!strcasecmp(ctdlhost, "uds")) { - /** unix domain socket */ - sprintf(buf, "%s/citadel.socket", ctdlport); - WC->chat_sock = uds_connectsock(buf); - } - else { - /** tcp socket */ - WC->chat_sock = tcp_connectsock(ctdlhost, ctdlport); - } - - if (WC->chat_sock < 0) { - return(errno); - } - - /** 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_getln(buf, sizeof buf); - if (buf[0] == '2') { - serv_printf("USER %s", ChrPtr(WC->wc_username)); - serv_getln(buf, sizeof buf); - if (buf[0] == '3') { - serv_printf("PASS %s", ChrPtr(WC->wc_password)); - serv_getln(buf, sizeof buf); - if (buf[0] == '2') { - serv_printf("GOTO %s", ChrPtr(WC->wc_roomname)); - serv_getln(buf, sizeof buf); - if (buf[0] == '2') { - serv_puts("CHAT"); - serv_getln(buf, sizeof buf); - if (buf[0] == '8') { - good_chatmode = 1; - } - } - } - } - } - - /** Unswap the sockets. */ - i = WC->serv_sock; - WC->serv_sock = WC->chat_sock; - WC->chat_sock = i; - - if (!good_chatmode) close(WC->serv_sock); - - } - return(0); -} - - - -/** - * \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. - */ -void chat_recv(void) { - int i; - 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, 0, 0, 0, 0, 0); - - hprintf("Content-type: text/html; charset=utf-8\r\n"); - begin_burst(); - wprintf("\n" - "\n" - "\n" - "\n" - - "\n" - ); - - if (setup_chat_socket() != 0) { - 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(""); - do { - got_data = 0; - pf.fd = WC->chat_sock; - pf.events = POLLIN; - pf.revents = 0; - if ((poll(&pf, 1, 1) > 0) && (pf.revents & POLLIN)) { - ++got_data; - - /** 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_getln(buf, sizeof buf); - - if (!strcmp(buf, "000")) { - strcpy(buf, ":|"); - strcat(buf, _("Now exiting chat mode.")); - end_chat_now = 1; - } - - /** Unswap the sockets. */ - i = WC->serv_sock; - WC->serv_sock = WC->chat_sock; - WC->chat_sock = i; - - /** 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"); - } - - 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("" - "
" - ); - - } - - wprintf(""); - - wprintf("
"); - - if (!strcasecmp(cl_user, ":")) { - wprintf(""); - } - - if (strcasecmp(cl_user, WC->last_chat_user)) { - wprintf(""); - - if (!strcasecmp(cl_user, ChrPtr(WC->wc_fullname))) { - wprintf(""); - } - else { - wprintf(""); - } - jsescputs(cl_user); - - wprintf(": "); - } - else { - wprintf("   "); - } - jsescputs(cl_text); - if (!strcasecmp(cl_user, ":")) { - wprintf(""); - } - - wprintf("
"); - wprintf("'); \n"); - - strcpy(WC->last_chat_user, cl_user); - } - } - - wprintf("parent.chat_transcript.scrollTo(999999,999999);\">\n"); - } - - free(output_data); - - wprintf("\n"); - wDumpContent(0); -} - - -/** - * \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); - hprintf("Content-type: text/html; charset=utf-8\r\n"); - begin_burst(); - wprintf("" - "" - ); - - if (havebstr("send_this")) { - strcpy(send_this, bstr("send_this")); - } - else { - strcpy(send_this, ""); - } - - if (havebstr("help_button")) { - strcpy(send_this, "/help"); - } - - if (havebstr("list_button")) { - strcpy(send_this, "/who"); - } - - if (havebstr("exit_button")) { - strcpy(send_this, "/quit"); - } - - 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; - - 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); + return 1; } } - - /** 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", _("Send")); - wprintf("\n", _("Help")); - wprintf("\n", _("List users")); - wprintf("\n", _("Exit")); - wprintf("
\n"); - - wprintf("\n"); - wDumpContent(0); + return 0; + /* Then schedule it to happen again a minute from now if the user is idle. */ } @@ -522,19 +141,16 @@ 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); - WebcitAddUrlHandler(HKEY("ajax_send_instant_message"), ajax_send_instant_message, AJAX); + WebcitAddUrlHandler(HKEY("display_page"), "", 0, display_page, 0); + WebcitAddUrlHandler(HKEY("page_user"), "", 0, page_user, 0); + WebcitAddUrlHandler(HKEY("ajax_send_instant_message"), "", 0, ajax_send_instant_message, AJAX); + RegisterConditional(HKEY("COND:PAGE:WAITING"), 0, Conditional_PAGE_WAITING, CTX_NONE); } void -SessionDestroyModule_CHAT +SessionDestroyModule_PAGING (wcsession *sess) { - if (sess->chat_sock > 0) - close(sess->chat_sock); + /* nothing here anymore */ }