www.pudn.com > exosip.rar > gui_sessions_list.c
/* * josua - Jack's open sip User Agent * * Copyright (C) 2002,2003 Aymeric Moizard* * This is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2, * or (at your option) any later version. * * This 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. * * You should have received a copy of the GNU General Public * License along with dpkg; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "jcalls.h" #include "gui_sessions_list.h" #include "sdptools.h" gui_t gui_window_sessions_list = { GUI_OFF, 0, -999, 10, -6, NULL, &window_sessions_list_print, &window_sessions_list_run_command, NULL, window_sessions_list_draw_commands, -1, -1, -1, NULL }; int cursor_sessions_list = 0; int window_sessions_list_print () { int k, pos; int y, x; char buf[250]; josua_clear_box_and_commands (gui_windows[EXTRAGUI]); curseson (); cbreak (); noecho (); nonl (); keypad (stdscr, TRUE); getmaxyx (stdscr, y, x); attrset (A_NORMAL); attrset (COLOR_PAIR (1)); if (gui_window_sessions_list.x1 == -999) { } else x = gui_window_sessions_list.x1; attrset (COLOR_PAIR (0)); pos = 1; for (k = 0; k < MAX_NUMBER_OF_CALLS; k++) { if (calls[k].state != NOT_USED) { snprintf (buf, 199, "%c%c %i//%i %i %s with: %s %199.199s", (cursor_sessions_list == pos - 1) ? '-' : ' ', (cursor_sessions_list == pos - 1) ? '>' : ' ', calls[k].cid, calls[k].did, calls[k].status_code, calls[k].reason_phrase, calls[k].remote_uri, " "); attrset (COLOR_PAIR (5)); attrset ((pos - 1 == cursor_sessions_list) ? A_REVERSE : A_NORMAL); mvaddnstr (gui_window_sessions_list.y0 + pos - 1, gui_window_sessions_list.x0, buf, x - gui_window_sessions_list.x0 - 1); pos++; } if (pos > y + gui_window_sessions_list.y1 - gui_window_sessions_list.y0 + 1) break; /* do not print next one */ } window_sessions_list_draw_commands (); return 0; } void window_sessions_list_draw_commands () { int x, y; char *sessions_list_commands[] = { "<-", "PrevWindow", "->", "NextWindow", "c", "Close", "a", "Answer", "m", "Mute", "u", "UnMute", "d", "Decline", "r", "Reject", "b", "AppearBusy", "o", "SendOptions", "R", "Transfer", "digit", "SendInfo", NULL }; getmaxyx (stdscr, y, x); josua_print_command (sessions_list_commands, y - 5, 0); } int window_sessions_list_run_command (int c) { call_t *ca; int i; int max; int y, x; curseson (); cbreak (); noecho (); nonl (); keypad (stdscr, TRUE); getmaxyx (stdscr, y, x); if (gui_window_sessions_list.x1 == -999) { } else x = gui_window_sessions_list.x1; if (gui_window_sessions_list.y1 < 0) max = y + gui_window_sessions_list.y1 - gui_window_sessions_list.y0 + 2; else max = gui_window_sessions_list.y1 - gui_window_sessions_list.y0 + 2; i = call_get_number_of_pending_calls (); if (i < max) max = i; if (max == 0) { beep (); return -1; } switch (c) { case KEY_DOWN: cursor_sessions_list++; cursor_sessions_list %= max; break; case KEY_UP: cursor_sessions_list += max - 1; cursor_sessions_list %= max; break; case 'a': ca = call_find_call (cursor_sessions_list); if (ca == NULL) { beep (); break; } eXosip_lock (); { osip_message_t *answer = NULL; #if 0 char refer_to[1024]; i = eXosip_call_get_referto(ca->did, refer_to, sizeof(refer_to)); if (i==0) { printf("refer-to: %s\n", refer_to); } #endif i = eXosip_call_build_answer (ca->tid, 200, &answer); if (i != 0) { eXosip_call_send_answer (ca->tid, 400, NULL); beep (); } else { i = sdp_complete_200ok (ca->did, answer); if (i != 0) { osip_message_free (answer); eXosip_call_send_answer (ca->tid, 415, NULL); beep (); } else eXosip_call_send_answer (ca->tid, 200, answer); } } eXosip_unlock (); break; case 'r': ca = call_find_call (cursor_sessions_list); if (ca == NULL) { beep (); break; } eXosip_lock (); i = eXosip_call_send_answer (ca->tid, 480, NULL); if (i == 0) call_remove (ca); eXosip_unlock (); window_sessions_list_print (); break; case 'd': ca = call_find_call (cursor_sessions_list); if (ca == NULL) { beep (); break; } eXosip_lock (); i = eXosip_call_send_answer (ca->tid, 603, NULL); if (i == 0) call_remove (ca); eXosip_unlock (); window_sessions_list_print (); break; case 'b': ca = call_find_call (cursor_sessions_list); if (ca == NULL) { beep (); break; } eXosip_lock (); i = eXosip_call_send_answer (ca->tid, 486, NULL); if (i == 0) call_remove (ca); eXosip_unlock (); window_sessions_list_print (); break; case 'c': ca = call_find_call (cursor_sessions_list); if (ca == NULL) { beep (); break; } eXosip_lock (); i = eXosip_call_terminate (ca->cid, ca->did); if (i == 0) call_remove (ca); eXosip_unlock (); window_sessions_list_print (); break; case 'm': ca = call_find_call (cursor_sessions_list); if (ca == NULL) { beep (); break; } i = _josua_mute_call (ca->did, NULL); if (i != 0) beep (); break; case 'u': ca = call_find_call (cursor_sessions_list); if (ca == NULL) { beep (); break; } i = _josua_unmute_call (ca->did); if (i != 0) beep (); break; case 'o': ca = call_find_call (cursor_sessions_list); if (ca == NULL) { beep (); break; } eXosip_lock (); { osip_message_t *options; i = eXosip_call_build_options (ca->did, &options); if (i == 0) { i = eXosip_call_send_request (ca->did, options); } if (i != 0) beep (); } eXosip_unlock (); break; case 'R': ca = call_find_call (cursor_sessions_list); if (ca == NULL) { beep (); break; } eXosip_lock (); { osip_message_t *refer; i = eXosip_call_build_refer (ca->did, "sip:800@192.168.2.2:5070", &refer); osip_message_set_header (refer, "Referred-By", cfg.identity); if (i == 0) i = eXosip_call_send_request (ca->did, refer); if (i != 0) beep (); } eXosip_unlock (); break; case 'E': ca = call_find_call (cursor_sessions_list); if (ca == NULL) { beep (); break; } eXosip_lock (); { osip_message_t *notify; i = eXosip_call_build_notify (ca->did, EXOSIP_SUBCRSTATE_TERMINATED, ¬ify); if (i == 0) { osip_message_set_header (notify, "Event", "refer"); osip_message_set_content_type (notify, "message/sipfrag"); osip_message_set_body (notify, "SIP/2.0 200 Ok", strlen ("SIP/2.0 200 Ok")); i = eXosip_call_send_request (ca->did, notify); } if (i != 0) beep (); } eXosip_unlock (); break; case 'T': ca = call_find_call (cursor_sessions_list); if (ca == NULL) { beep (); break; } eXosip_lock (); { osip_message_t *refer; i = eXosip_call_build_refer (ca->did, "sips:800@192.168.2.2:5000", &refer); if (i == 0) i = eXosip_call_send_request (ca->did, refer); if (i != 0) beep (); } eXosip_unlock (); break; case 'Y': ca = call_find_call (cursor_sessions_list); if (ca == NULL) { beep (); break; } eXosip_lock (); { osip_message_t *refer; i = eXosip_call_build_refer (ca->did, "http://antisip.com", &refer); if (i == 0) i = eXosip_call_send_request (ca->did, refer); if (i != 0) beep (); } eXosip_unlock (); break; case 'U': ca = call_find_call (cursor_sessions_list); if (ca == NULL) { beep (); break; } eXosip_lock (); { osip_message_t *refer; i = eXosip_call_build_refer (ca->did, "sipoleantisip.com", &refer); if (i == 0) i = eXosip_call_send_request (ca->did, refer); if (i != 0) beep (); } eXosip_unlock (); break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case '#': case '*': { char dtmf_body[1000]; ca = call_find_call (cursor_sessions_list); if (ca == NULL) { beep (); break; } eXosip_lock (); { osip_message_t *info; i = eXosip_call_build_info (ca->did, &info); if (i == 0) { snprintf (dtmf_body, 999, "Signal=%c\r\nDuration=250\r\n", c); osip_message_set_content_type (info, "application/dtmf-relay"); osip_message_set_body (info, dtmf_body, strlen (dtmf_body)); i = eXosip_call_send_request (ca->did, info); } if (i != 0) beep (); } eXosip_unlock (); break; } default: beep (); return -1; } window_sessions_list_print (); return 0; }