X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fpaging.c;h=38b8b541d482befa0408e5231fb5bd773f966856;hb=fb6f6fa4ec4e3277e30d84326d48e6850822d318;hp=0932db026f6fc84f756de5455980816cf7869b7b;hpb=bedf5c0b955473d8ad02eaf628e8d209f534f2b6;p=citadel.git diff --git a/webcit/paging.c b/webcit/paging.c index 0932db026..38b8b541d 100644 --- a/webcit/paging.c +++ b/webcit/paging.c @@ -1,15 +1,21 @@ /* - * $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. */ -/** - * \defgroup PageFunc Functions which implement the chat and paging facilities. - * \ingroup ClientPower - */ -/*@{*/ + #include "webcit.h" -/** - * \brief display the form for paging (x-messaging) another user +/* + * display the form for paging (x-messaging) another user */ void display_page(void) { @@ -17,485 +23,134 @@ void display_page(void) strcpy(recp, bstr("recp")); - output_headers(1, 1, 2, 0, 0, 0); - wprintf("
\n" - "
" - ""); - wprintf(_("Send instant message")); - wprintf("" - "
\n" - "
\n
\n" - ); - - wprintf("
" - "
\n"); - - wprintf(_("Send an instant message to: ")); + output_headers(1, 1, 1, 0, 0, 0); + wc_printf("
\n"); + wc_printf("

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

"); + wc_printf("
\n"); + + wc_printf("
\n"); + + wc_printf("
\n"); + + wc_printf(_("Send an instant message to: ")); escputs(recp); - wprintf("
\n"); + wc_printf("
\n"); - wprintf("
\n"); - wprintf("\n", WC->nonce); + 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 (strlen(bstr("send_button")) == 0) { - safestrncpy(WC->ImportantMessage, - _("Message was not sent."), - sizeof WC->ImportantMessage - ); + if (!havebstr("send_button")) { + 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, 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); + stresc(buf, 256, recp, 0, 0); + AppendImportantMessage(buf, -1); + AppendImportantMessage(_("Message has been sent to "), -1); } } - who(); + url_do_template(); } -/** - * \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_getln(buf, sizeof buf); - if (buf[0] != '2') { - smart_goto("_BASEROOM_"); - 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"); - 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"); - serv_getln(buf, sizeof buf); - if (buf[3] == '*') { + len = serv_getln(buf, sizeof buf); + if ((len >= 3) && (buf[3] == '*')) { if ((time(NULL) - WC->last_pager_check) > 60) { - wprintf("" - ); + return 1; } } - - /** Then schedule it to happen again a minute from now if the user is idle. */ - wprintf(" " - ); + return 0; + /* Then schedule it to happen again a minute from now if the user is idle. */ } +void ajax_send_instant_message(void) { + char recp[256]; + char buf[256]; -/** - * \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", WC->wc_username); - serv_getln(buf, sizeof buf); - if (buf[0] == '3') { - serv_printf("PASS %s", WC->wc_password); - serv_getln(buf, sizeof buf); - if (buf[0] == '2') { - serv_printf("GOTO %s", 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); - - wprintf("Content-type: text/html; charset=utf-8\n"); - wprintf("\n"); - 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) if (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 (strlen(output_data) > 0) { - - if (output_data[strlen(output_data)-1] == '\n') { - output_data[strlen(output_data)-1] = 0; - } + safestrncpy(recp, bstr("recp"), sizeof recp); - /** 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, 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); - } - } + serv_printf("SEXP %s|-", recp); + serv_getln(buf, sizeof buf); - wprintf("parent.chat_transcript.scrollTo(999999,999999);\">\n"); + if (buf[0] == '4') { + text_to_server(bstr("msg")); + serv_puts("000"); } - free(output_data); - - wprintf("\n"); - wDumpContent(0); + escputs(buf); /* doesn't really matter what we return - the client ignores it */ } -/** - * \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); - wprintf("Content-type: text/html; charset=utf-8\n"); - wprintf("\n"); - wprintf("" - "" - ); - - if (bstr("send_this") != NULL) { - strcpy(send_this, bstr("send_this")); - } - else { - strcpy(send_this, ""); - } - - if (strlen(bstr("help_button")) > 0) { - strcpy(send_this, "/help"); - } - - if (strlen(bstr("list_button")) > 0) { - strcpy(send_this, "/who"); - } - - if (strlen(bstr("exit_button")) > 0) { - 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; +void +InitModule_PAGING +(void) +{ + 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); +} - 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); - } - } - /** 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); +void +SessionDestroyModule_PAGING +(wcsession *sess) +{ + /* nothing here anymore */ } - -/*@}*/