- 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("<html>\n"
- "<head>\n"
- "<meta http-equiv=\"refresh\" content=\"3\" />\n"
- "</head>\n"
-
- "<body bgcolor=\"#FFFFFF\">\n"
- );
-
- if (setup_chat_socket() != 0) {
- wprintf(_("An error occurred while setting up the chat socket."));
- wprintf("</BODY></HTML>\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("<img src=\"static/blank.gif\" onLoad=\"parent.window.close();\">\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("<img src=\"static/blank.gif\" WIDTH=1 HEIGHT=1\n"
- "onLoad=\" \n"
- );
-
- for (i=0; i<num_tokens(output_data, '\n'); ++i) {
- extract_token(buf, output_data, i, '\n', sizeof buf);
- extract_token(cl_user, buf, 0, '|', sizeof cl_user);
- extract_token(cl_text, buf, 1, '|', sizeof cl_text);
-
- if (strcasecmp(cl_text, "NOOP")) {
-
- wprintf("parent.chat_transcript.document.write('");
-
- if (strcasecmp(cl_user, WC->last_chat_user)) {
- wprintf("<TABLE border=0 WIDTH=100%% "
- "CELLSPACING=1 CELLPADDING=0 "
- "BGCOLOR="#FFFFFF">"
- "<TR><TD></TR></TD></TABLE>"
- );
-
- }
-
- wprintf("<TABLE border=0 WIDTH=100%% "
- "CELLSPACING=0 CELLPADDING=0 "
- "BGCOLOR="#EEEEEE">");
-
- wprintf("<TR><TD>");
-
- if (!strcasecmp(cl_user, ":")) {
- wprintf("<I>");
- }
-
- if (strcasecmp(cl_user, WC->last_chat_user)) {
- wprintf("<B>");
-
- if (!strcasecmp(cl_user, WC->wc_fullname)) {
- wprintf("<FONT COLOR="#FF0000">");
- }
- else {
- wprintf("<FONT COLOR="#0000FF">");
- }
- jsescputs(cl_user);
-
- wprintf("</FONT>: </B>");
- }
- else {
- wprintf(" ");
- }
- jsescputs(cl_text);
- if (!strcasecmp(cl_user, ":")) {
- wprintf("</I>");
- }
-
- wprintf("</TD></TR></TABLE>");
- wprintf("'); \n");
-
- strcpy(WC->last_chat_user, cl_user);
- }
- }