skypiax: cleaning

git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@16826 d0543943-73ff-0310-b7d9-9358b9ac24b2
This commit is contained in:
Giovanni Maruzzelli 2010-02-25 18:38:41 +00:00
parent 7491bd639c
commit dea13352a7
1 changed files with 7 additions and 253 deletions

View File

@ -36,7 +36,6 @@
#include "skypiax.h"
#define MDL_CHAT_PROTO "skype"
#define TIMER_WRITE
#ifdef WIN32
/***************/
@ -95,10 +94,8 @@ SWITCH_STANDARD_API(skypiax_function);
SWITCH_STANDARD_API(skypiax_chat_function);
#define SKYPIAX_CHAT_SYNTAX "interface_name remote_skypename TEXT"
/* BEGIN: Changes here */
#define FULL_RELOAD 0
#define SOFT_RELOAD 1
/* END: Changes heres */
char *interface_status[] = { /* should match SKYPIAX_STATE_xxx in skypiax.h */
"IDLE",
@ -147,23 +144,12 @@ char *skype_callflow[] = { /* should match CALLFLOW_XXX in skypiax.h */
static struct {
int debug;
//char *ip;
//int port;
char *dialplan;
char *destination;
char *context;
//char *codec_string;
//char *codec_order[SWITCH_MAX_CODECS];
//int codec_order_last;
//char *codec_rates_string;
//char *codec_rates[SWITCH_MAX_CODECS];
//int codec_rates_last;
//unsigned int flags;
//int fd;
int calls;
int real_interfaces;
int next_interface;
//char hold_music[256];
private_t SKYPIAX_INTERFACES[SKYPIAX_MAX_INTERFACES];
switch_mutex_t *mutex;
private_t *sk_console;
@ -177,13 +163,9 @@ int running = 0;
SWITCH_DECLARE_GLOBAL_STRING_FUNC(set_global_dialplan, globals.dialplan);
SWITCH_DECLARE_GLOBAL_STRING_FUNC(set_global_context, globals.context);
SWITCH_DECLARE_GLOBAL_STRING_FUNC(set_global_destination, globals.destination);
//SWITCH_DECLARE_GLOBAL_STRING_FUNC(set_global_codec_string, globals.codec_string);
//SWITCH_DECLARE_GLOBAL_STRING_FUNC(set_global_codec_rates_string, globals.codec_rates_string);
/* BEGIN: Changes here */
static switch_status_t interface_exists(char *the_interface);
static switch_status_t remove_interface(char *the_interface);
/* END: Changes here */
static switch_status_t channel_on_init(switch_core_session_t *session);
static switch_status_t channel_on_hangup(switch_core_session_t *session);
@ -258,25 +240,6 @@ switch_status_t skypiax_tech_init(private_t * tech_pvt, switch_core_session_t *s
ERRORA("skypiax_codec FAILED\n", SKYPIAX_P_LOG);
return SWITCH_STATUS_FALSE;
}
#if 0
if (switch_core_timer_init(&tech_pvt->timer_read, "soft", 20, tech_pvt->read_codec.implementation->samples_per_packet, skypiax_module_pool) !=
SWITCH_STATUS_SUCCESS) {
ERRORA("setup timer failed\n", SKYPIAX_P_LOG);
return SWITCH_STATUS_FALSE;
}
switch_core_timer_sync(&tech_pvt->timer_read);
#ifdef TIMER_WRITE
if (switch_core_timer_init(&tech_pvt->timer_write, "soft", 10, tech_pvt->write_codec.implementation->samples_per_packet, skypiax_module_pool) !=
SWITCH_STATUS_SUCCESS) {
ERRORA("setup timer failed\n", SKYPIAX_P_LOG);
return SWITCH_STATUS_FALSE;
}
switch_core_timer_sync(&tech_pvt->timer_write);
#endif // TIMER_WRITE
#endif
dtmf_rx_init(&tech_pvt->dtmf_state, NULL, NULL);
dtmf_rx_parms(&tech_pvt->dtmf_state, 0, 10, 10, -99);
@ -286,7 +249,6 @@ switch_status_t skypiax_tech_init(private_t * tech_pvt, switch_core_session_t *s
return SWITCH_STATUS_SUCCESS;
}
/* BEGIN: Changes here */
static switch_status_t interface_exists(char *the_interface)
{
int i;
@ -333,8 +295,6 @@ static switch_status_t remove_interface(char *the_interface)
private_t *tech_pvt = NULL;
switch_status_t status;
//running = 0;
if (*the_interface == '#') { /* remove by interface id or interface name */
the_interface++;
@ -376,6 +336,8 @@ static switch_status_t remove_interface(char *the_interface)
if (globals.SKYPIAX_INTERFACES[interface_id].skypiax_signaling_thread) {
#ifdef WIN32
skypiax_signaling_write(tech_pvt, "DIE");
switch_sleep(10000);
switch_file_write(tech_pvt->SkypiaxHandles.fdesc[1], "sciutati", &howmany); // let's the controldev_thread die
#else /* WIN32 */
howmany = write(tech_pvt->SkypiaxHandles.fdesc[1], "sciutati", howmany);
@ -432,11 +394,9 @@ static switch_status_t remove_interface(char *the_interface)
DEBUGA_SKYPE("interface '%s' deleted successfully\n", SKYPIAX_P_LOG, the_interface);
globals.SKYPIAX_INTERFACES[interface_id].running = 1;
end:
//running = 1;
return SWITCH_STATUS_SUCCESS;
}
/* END: Changes here */
/*
State methods they get called when the state changes to the specific state
@ -454,7 +414,6 @@ static switch_status_t channel_on_init(switch_core_session_t *session)
channel = switch_core_session_get_channel(session);
switch_assert(channel != NULL);
switch_channel_set_variable(channel, "skype_user", tech_pvt->skype_user);
//ERRORA("%s CHANNEL INIT\n", SKYPIAX_P_LOG, tech_pvt->name);
switch_set_flag(tech_pvt, TFLAG_IO);
/* Move channel's state machine to ROUTING. This means the call is trying
@ -490,10 +449,8 @@ static switch_status_t channel_on_destroy(switch_core_session_t *session)
}
switch_core_timer_destroy(&tech_pvt->timer_read);
#ifdef TIMER_WRITE
switch_core_timer_destroy(&tech_pvt->timer_write);
#endif // TIMER_WRITE
switch_buffer_destroy(&tech_pvt->read_buffer);
switch_buffer_destroy(&tech_pvt->write_buffer);
@ -535,7 +492,6 @@ static switch_status_t channel_on_hangup(switch_core_session_t *session)
switch_clear_flag(tech_pvt, TFLAG_IO);
switch_clear_flag(tech_pvt, TFLAG_VOICE);
//switch_set_flag(tech_pvt, TFLAG_HANGUP);
tech_pvt->interface_state = SKYPIAX_STATE_HANGUP_REQUESTED;
@ -544,19 +500,13 @@ static switch_status_t channel_on_hangup(switch_core_session_t *session)
sprintf(msg_to_skype, "ALTER CALL %s HANGUP", tech_pvt->skype_call_id);
skypiax_signaling_write(tech_pvt, msg_to_skype);
}
//memset(tech_pvt->session_uuid_str, '\0', sizeof(tech_pvt->session_uuid_str));
//*tech_pvt->session_uuid_str = '\0';
if (tech_pvt->tcp_cli_thread) {
switch_thread_join(&status, tech_pvt->tcp_cli_thread);
}
//if(status!=SWITCH_STATUS_SUCCESS)
//ERRORA("%s cli_join HANGUP\n", SKYPIAX_P_LOG, tech_pvt->name);
if (tech_pvt->tcp_srv_thread) {
switch_thread_join(&status, tech_pvt->tcp_srv_thread);
}
//if(status!=SWITCH_STATUS_SUCCESS)
//ERRORA("%s srv_join HANGUP\n", SKYPIAX_P_LOG, tech_pvt->name);
DEBUGA_SKYPE("%s CHANNEL HANGUP\n", SKYPIAX_P_LOG, tech_pvt->name);
switch_mutex_lock(globals.mutex);
globals.calls--;
@ -641,7 +591,6 @@ static switch_status_t channel_kill_channel(switch_core_session_t *session, int
break;
case SWITCH_SIG_BREAK:
DEBUGA_SKYPE("%s CHANNEL got SWITCH_SIG_BREAK\n", SKYPIAX_P_LOG, switch_channel_get_name(channel));
//switch_set_flag(tech_pvt, TFLAG_BREAK);
switch_mutex_lock(tech_pvt->flag_mutex);
switch_set_flag(tech_pvt, TFLAG_BREAK);
switch_mutex_unlock(tech_pvt->flag_mutex);
@ -713,12 +662,9 @@ static switch_status_t channel_read_frame(switch_core_session_t *session, switch
if (!switch_channel_ready(channel) || !switch_test_flag(tech_pvt, TFLAG_IO)) {
ERRORA("channel not ready \n", SKYPIAX_P_LOG);
//TODO: kill the bastard
return SWITCH_STATUS_FALSE;
}
if (!tech_pvt->read_buffer) {
int32_t max_len = 640 * 10;
@ -726,19 +672,14 @@ static switch_status_t channel_read_frame(switch_core_session_t *session, switch
switch_assert(tech_pvt->read_buffer);
switch_buffer_zero(tech_pvt->read_buffer);
tech_pvt->begin_to_read = 1;
//switch_sleep(40000);
}
tech_pvt->read_frame.flags = SFF_NONE;
*frame = NULL;
switch_core_timer_next(&tech_pvt->timer_read);
switch_mutex_lock(tech_pvt->mutex_audio_srv);
if (switch_buffer_inuse(tech_pvt->read_buffer)) {
bytes_read = switch_buffer_read(tech_pvt->read_buffer, tech_pvt->read_frame.data, 640);
@ -746,7 +687,6 @@ static switch_status_t channel_read_frame(switch_core_session_t *session, switch
}
switch_mutex_unlock(tech_pvt->mutex_audio_srv);
if (!bytes_read) {
//NOTICA("skypiax_audio_read Silence\n", SKYPIAX_P_LOG);
memset(tech_pvt->read_frame.data, 255, SAMPLES_PER_FRAME * sizeof(short));
@ -786,10 +726,8 @@ static switch_status_t channel_read_frame(switch_core_session_t *session, switch
i++;
a++;
}
//DEBUGA_SKYPE("a=%d i=%d\n", SKYPIAX_P_LOG, a, i);
memset(digit_str, 0, sizeof(digit_str));
//dtmf_rx(&tech_pvt->dtmf_state, (int16_t *) tech_pvt->read_frame.data,tech_pvt->read_frame.datalen/sizeof(short) );
dtmf_rx(&tech_pvt->dtmf_state, (int16_t *) frame_8_khz, 160);
dtmf_rx_get(&tech_pvt->dtmf_state, digit_str, sizeof(digit_str));
@ -820,10 +758,8 @@ static switch_status_t channel_read_frame(switch_core_session_t *session, switch
#endif
return SWITCH_STATUS_SUCCESS;
}
DEBUGA_SKYPE("CHANNEL READ no TFLAG_IO\n", SKYPIAX_P_LOG);
return SWITCH_STATUS_FALSE;
}
DEBUGA_SKYPE("CHANNEL READ FALSE\n", SKYPIAX_P_LOG);
@ -853,7 +789,6 @@ static switch_status_t channel_write_frame(switch_core_session_t *session, switc
if (!switch_channel_ready(channel) || !switch_test_flag(tech_pvt, TFLAG_IO)) {
ERRORA("channel not ready \n", SKYPIAX_P_LOG);
//TODO: kill the bastard
return SWITCH_STATUS_FALSE;
}
#if SWITCH_BYTE_ORDER == __BIG_ENDIAN
@ -861,7 +796,6 @@ static switch_status_t channel_write_frame(switch_core_session_t *session, switc
switch_swap_linear(frame->data, (int) frame->datalen / 2);
}
#endif
if (!tech_pvt->write_buffer) {
int32_t max_len = 640 * 3;
@ -914,31 +848,21 @@ static switch_status_t channel_receive_message(switch_core_session_t *session, s
case SWITCH_MESSAGE_INDICATE_ANSWER:
{
DEBUGA_SKYPE("MSG_ID=%d, TO BE ANSWERED!\n", SKYPIAX_P_LOG, msg->message_id);
switch_core_timer_sync(&tech_pvt->timer_read);
#ifdef TIMER_WRITE
switch_core_timer_sync(&tech_pvt->timer_write);
#endif // TIMER_WRITE
channel_answer_channel(session);
}
break;
case SWITCH_MESSAGE_INDICATE_AUDIO_SYNC:
DEBUGA_SKYPE("%s CHANNEL got SWITCH_MESSAGE_INDICATE_AUDIO_SYNC\n", SKYPIAX_P_LOG, switch_channel_get_name(channel));
switch_core_timer_sync(&tech_pvt->timer_read);
#ifdef TIMER_WRITE
switch_core_timer_sync(&tech_pvt->timer_write);
#endif // TIMER_WRITE
break;
case SWITCH_MESSAGE_INDICATE_BRIDGE:
DEBUGA_SKYPE("%s CHANNEL got SWITCH_MESSAGE_INDICATE_BRIDGE\n", SKYPIAX_P_LOG, switch_channel_get_name(channel));
switch_core_timer_sync(&tech_pvt->timer_read);
#ifdef TIMER_WRITE
switch_core_timer_sync(&tech_pvt->timer_write);
#endif // TIMER_WRITE
break;
default:
@ -1020,12 +944,6 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi
switch_mutex_lock(globals.mutex);
if (strncmp("ANY", interface_name, strlen(interface_name)) == 0 || strncmp("RR", interface_name, strlen(interface_name)) == 0) {
/* we've been asked for the "ANY" interface, let's find the first idle interface */
//DEBUGA_SKYPE("Finding one available skype interface\n", SKYPIAX_P_LOG);
//tech_pvt = find_available_skypiax_interface(NULL);
//if (tech_pvt)
//found = 1;
//} else if (strncmp("RR", interface_name, strlen(interface_name)) == 0) {
/* Find the first idle interface using Round Robin */
DEBUGA_SKYPE("Finding one available skype interface RR\n", SKYPIAX_P_LOG);
tech_pvt = find_available_skypiax_interface_rr(NULL);
@ -1066,7 +984,6 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi
DEBUGA_SKYPE("2 SESSION_DESTROY %s\n", SKYPIAX_P_LOG, switch_core_session_get_uuid(*new_session));
switch_core_session_destroy(new_session);
switch_mutex_unlock(globals.mutex);
//return SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER;
return SWITCH_CAUSE_NORMAL_CIRCUIT_CONGESTION;
}
@ -1077,7 +994,6 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi
switch_mutex_unlock(globals.mutex);
return SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER;
}
//switch_channel_set_variable(channel, "send_silence_when_idle", "1500");
switch_channel_set_variable(channel, "waste", "false");
if (skypiax_tech_init(tech_pvt, *new_session) != SWITCH_STATUS_SUCCESS) {
ERRORA("Doh! no tech_init?\n", SKYPIAX_P_LOG);
@ -1098,8 +1014,6 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi
snprintf(name, sizeof(name), "skypiax/%s", outbound_profile->destination_number);
}
//snprintf(name, sizeof(name), "skypiax/%s", outbound_profile->destination_number);
//snprintf(name, sizeof(name), "skypiax/%s", tech_pvt->name);
switch_channel_set_name(channel, name);
caller_profile = switch_caller_profile_clone(*new_session, outbound_profile);
switch_channel_set_caller_profile(channel, caller_profile);
@ -1116,8 +1030,6 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi
rdest = strchr(caller_profile->destination_number, '/');
*rdest++ = '\0';
//skypiax_call(tech_pvt, rdest, 30);
switch_copy_string(tech_pvt->session_uuid_str, switch_core_session_get_uuid(*new_session), sizeof(tech_pvt->session_uuid_str));
caller_profile = tech_pvt->caller_profile;
caller_profile->destination_number = rdest;
@ -1156,7 +1068,7 @@ static void *SWITCH_THREAD_FUNC skypiax_signaling_thread_func(switch_thread_t *
if (res == CALLFLOW_INCOMING_HANGUP || tech_pvt->skype_callflow == CALLFLOW_INCOMING_HANGUP) {
switch_core_session_t *session = NULL;
switch_channel_t *channel = NULL;
//private_t *tech_pvt = NULL;
DEBUGA_SKYPE("skype call ended\n", SKYPIAX_P_LOG);
if (tech_pvt) {
@ -1183,11 +1095,7 @@ static void *SWITCH_THREAD_FUNC skypiax_signaling_thread_func(switch_thread_t *
*tech_pvt->initial_skype_user = '\0';
switch_mutex_unlock(globals.mutex);
//ERRORA("LET'S WAIT\n", SKYPIAX_P_LOG);
switch_sleep(300000); //0.3 sec
//ERRORA("WAIT'S OVER\n", SKYPIAX_P_LOG);
//tech_pvt->skype_callflow = CALLFLOW_STATUS_FINISHED;
//switch_sleep(30000); //0.03 sec
switch_mutex_lock(globals.mutex);
tech_pvt->skype_callflow = CALLFLOW_CALL_IDLE;
tech_pvt->interface_state = SKYPIAX_STATE_IDLE;
@ -1201,9 +1109,7 @@ static void *SWITCH_THREAD_FUNC skypiax_signaling_thread_func(switch_thread_t *
return NULL;
}
/* BEGIN: Changes heres */
static switch_status_t load_config(int reload_type)
/* END: Changes heres */
{
char *cf = "skypiax.conf";
switch_xml_t cfg, xml, global_settings, param, interfaces, myinterface;
@ -1227,19 +1133,6 @@ static switch_status_t load_config(int reload_type)
DEBUGA_SKYPE("globals.debug=%d\n", SKYPIAX_P_LOG, globals.debug);
globals.debug = atoi(val);
DEBUGA_SKYPE("globals.debug=%d\n", SKYPIAX_P_LOG, globals.debug);
#if 0
} else if (!strcasecmp(var, "hold-music")) {
switch_set_string(globals.hold_music, val);
DEBUGA_SKYPE("globals.hold_music=%s\n", SKYPIAX_P_LOG, globals.hold_music);
} else if (!strcmp(var, "port")) {
globals.port = atoi(val);
DEBUGA_SKYPE("globals.port=%d\n", SKYPIAX_P_LOG, globals.port);
} else if (!strcmp(var, "codec-master")) {
if (!strcasecmp(val, "us")) {
switch_set_flag(&globals, GFLAG_MY_CODEC_PREFS);
}
DEBUGA_SKYPE("codec-master globals.debug=%d\n", SKYPIAX_P_LOG, globals.debug);
#endif //0
} else if (!strcmp(var, "dialplan")) {
set_global_dialplan(val);
DEBUGA_SKYPE("globals.dialplan=%s\n", SKYPIAX_P_LOG, globals.dialplan);
@ -1249,16 +1142,6 @@ static switch_status_t load_config(int reload_type)
} else if (!strcmp(var, "context")) {
set_global_context(val);
DEBUGA_SKYPE("globals.context=%s\n", SKYPIAX_P_LOG, globals.context);
#if 0
} else if (!strcmp(var, "codec-prefs")) {
set_global_codec_string(val);
DEBUGA_SKYPE("globals.codec_string=%s\n", SKYPIAX_P_LOG, globals.codec_string);
globals.codec_order_last = switch_separate_string(globals.codec_string, ',', globals.codec_order, SWITCH_MAX_CODECS);
} else if (!strcmp(var, "codec-rates")) {
set_global_codec_rates_string(val);
DEBUGA_SKYPE("globals.codec_rates_string=%s\n", SKYPIAX_P_LOG, globals.codec_rates_string);
globals.codec_rates_last = switch_separate_string(globals.codec_rates_string, ',', globals.codec_rates, SWITCH_MAX_CODECS);
#endif //0
}
}
@ -1283,8 +1166,6 @@ static switch_status_t load_config(int reload_type)
char *fail_dial_regex = NULL;
char *enable_callerid = "true";
char *X11_display = NULL;
//char *tcp_cli_port = "45000";
//char *tcp_srv_port = "45001";
char *skype_user = NULL;
char *report_incoming_chatmessages = "true";
char *silent_mode = "false";
@ -1321,12 +1202,6 @@ static switch_status_t load_config(int reload_type)
report_incoming_chatmessages = val;
} else if (!strcasecmp(var, "silent_mode")) {
silent_mode = val;
#if 0
} else if (!strcasecmp(var, "tcp_cli_port")) {
tcp_cli_port = val;
} else if (!strcasecmp(var, "tcp_srv_port")) {
tcp_srv_port = val;
#endif //0
} else if (!strcasecmp(var, "X11-display") || !strcasecmp(var, "X11_display")) {
X11_display = val;
} else if (!strcasecmp(var, "max_digits") || !strcasecmp(var, "max-digits")) {
@ -1341,7 +1216,6 @@ static switch_status_t load_config(int reload_type)
continue;
}
/* BEGIN: Changes here */
if (reload_type == SOFT_RELOAD) {
char the_interface[256];
sprintf(the_interface, "#%s", name);
@ -1350,25 +1224,12 @@ static switch_status_t load_config(int reload_type)
continue;
}
}
/* END: Changes here */
#ifndef WIN32
if (!X11_display) {
ERRORA("interface missing REQUIRED param 'X11_display'\n", SKYPIAX_P_LOG);
continue;
}
#endif
#if 0
if (!tcp_cli_port) {
ERRORA("interface missing REQUIRED param 'tcp_cli_port'\n", SKYPIAX_P_LOG);
continue;
}
if (!tcp_srv_port) {
ERRORA("interface missing REQUIRED param 'tcp_srv_port'\n", SKYPIAX_P_LOG);
continue;
}
#endif //0
if (!id) {
ERRORA("interface missing REQUIRED param 'id'\n", SKYPIAX_P_LOG);
continue;
@ -1428,15 +1289,7 @@ static switch_status_t load_config(int reload_type)
switch_set_string(globals.SKYPIAX_INTERFACES[interface_id].name, "N/A");
}
DEBUGA_SKYPE("CONFIGURING interface_id=%d\n", SKYPIAX_P_LOG, interface_id);
#if 0
#ifdef WIN32
globals.SKYPIAX_INTERFACES[interface_id].tcp_cli_port = (unsigned short) atoi(tcp_cli_port);
globals.SKYPIAX_INTERFACES[interface_id].tcp_srv_port = (unsigned short) atoi(tcp_srv_port);
#else /* WIN32 */
globals.SKYPIAX_INTERFACES[interface_id].tcp_cli_port = atoi(tcp_cli_port);
globals.SKYPIAX_INTERFACES[interface_id].tcp_srv_port = atoi(tcp_srv_port);
#endif /* WIN32 */
#endif //0
switch_set_string(globals.SKYPIAX_INTERFACES[interface_id].X11_display, X11_display);
switch_set_string(globals.SKYPIAX_INTERFACES[interface_id].skype_user, skype_user);
switch_set_string(globals.SKYPIAX_INTERFACES[interface_id].context, context);
@ -1464,14 +1317,6 @@ static switch_status_t load_config(int reload_type)
DEBUGA_SKYPE
("interface_id=%d globals.SKYPIAX_INTERFACES[interface_id].skype_user=%s\n",
SKYPIAX_P_LOG, interface_id, globals.SKYPIAX_INTERFACES[interface_id].skype_user);
#if 0
DEBUGA_SKYPE
("interface_id=%d globals.SKYPIAX_INTERFACES[interface_id].tcp_cli_port=%d\n",
SKYPIAX_P_LOG, interface_id, globals.SKYPIAX_INTERFACES[interface_id].tcp_cli_port);
DEBUGA_SKYPE
("interface_id=%d globals.SKYPIAX_INTERFACES[interface_id].tcp_srv_port=%d\n",
SKYPIAX_P_LOG, interface_id, globals.SKYPIAX_INTERFACES[interface_id].tcp_srv_port);
#endif //0
DEBUGA_SKYPE("interface_id=%d globals.SKYPIAX_INTERFACES[interface_id].name=%s\n",
SKYPIAX_P_LOG, interface_id, globals.SKYPIAX_INTERFACES[interface_id].name);
DEBUGA_SKYPE
@ -1613,9 +1458,7 @@ static switch_status_t load_config(int reload_type)
static switch_status_t chat_send(const char *proto, const char *from, const char *to, const char *subject, const char *body, const char *type,
const char *hint)
{
//char *user, *host, *f_user = NULL, *ffrom = NULL, *f_host = NULL, *f_resource = NULL;
char *user = NULL, *host, *f_user = NULL, *f_host = NULL, *f_resource = NULL;
//mdl_profile_t *profile = NULL;
private_t *tech_pvt = NULL;
int i = 0, found = 0, tried = 0;
char skype_msg[1024];
@ -1648,7 +1491,6 @@ static switch_status_t chat_send(const char *proto, const char *from, const char
if ((host = strchr(user, '@'))) {
*host++ = '\0';
}
//if (!strcmp(proto, MDL_CHAT_PROTO)) {
DEBUGA_SKYPE("chat_send(proto=%s, from=%s, to=%s, subject=%s, body=%s, type=%s, hint=%s)\n", SKYPIAX_P_LOG, proto, from, to, subject, body, type,
hint ? hint : "NULL");
@ -1685,18 +1527,6 @@ static switch_status_t chat_send(const char *proto, const char *from, const char
skypiax_signaling_write(tech_pvt, skype_msg);
switch_sleep(1000);
}
//} else {
//FIXME don't know how to do here, let's hope this is correct
//char *p;
//ffrom = switch_mprintf("%s+%s", proto, from);
//from = ffrom;
//if ((p = strchr(from, '/'))) {
//*p = '\0';
//}
//NOTICA("chat_send(proto=%s, from=%s, to=%s, subject=%s, body=%s, type=%s, hint=%s)\n", SKYPIAX_P_LOG, proto, from, to, subject, body, type, hint?hint:"NULL");
//switch_core_chat_send(proto, proto, from, to, subject, body, type, hint);
//return SWITCH_STATUS_SUCCESS;
//}
found = 0;
@ -1796,9 +1626,7 @@ SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_skypiax_shutdown)
#ifdef WIN32
if (SendMessage(tech_pvt->SkypiaxHandles.win32_hInit_MainWindowHandle, WM_DESTROY, 0, 0) == FALSE) { // let's the skypiax_api_thread_func die
DEBUGA_SKYPE("got FALSE here, thread probably was already dead. GetLastError returned: %d\n", SKYPIAX_P_LOG, GetLastError());
//globals.SKYPIAX_INTERFACES[interface_id].skypiax_api_thread = NULL;
}
//cicopet
#else
if (tech_pvt->SkypiaxHandles.disp) {
XEvent e;
@ -1854,8 +1682,6 @@ SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_skypiax_shutdown)
switch_safe_free(globals.dialplan);
switch_safe_free(globals.context);
switch_safe_free(globals.destination);
//switch_safe_free(globals.codec_string);
//switch_safe_free(globals.codec_rates_string);
return SWITCH_STATUS_SUCCESS;
}
@ -1900,7 +1726,6 @@ int dtmf_received(private_t * tech_pvt, char *value)
switch_dtmf_t dtmf = { (char) value[0], switch_core_default_dtmf_duration(0) };
DEBUGA_SKYPE("received DTMF %c on channel %s\n", SKYPIAX_P_LOG, dtmf.digit, switch_channel_get_name(channel));
switch_mutex_lock(tech_pvt->flag_mutex);
//FIXME: why sometimes DTMFs from here do not seems to be get by FS?
switch_channel_queue_dtmf(channel, &dtmf);
switch_set_flag(tech_pvt, TFLAG_DTMF);
switch_mutex_unlock(tech_pvt->flag_mutex);
@ -1919,7 +1744,7 @@ int start_audio_threads(private_t * tech_pvt)
tech_pvt->begin_to_write = 0;
tech_pvt->begin_to_read = 0;
#if 1
if (switch_core_timer_init(&tech_pvt->timer_read, "soft", 20, 320, skypiax_module_pool) != SWITCH_STATUS_SUCCESS) {
ERRORA("setup timer failed\n", SKYPIAX_P_LOG);
return SWITCH_STATUS_FALSE;
@ -1927,17 +1752,13 @@ int start_audio_threads(private_t * tech_pvt)
switch_core_timer_sync(&tech_pvt->timer_read);
#ifdef TIMER_WRITE
//if (switch_core_timer_init(&tech_pvt->timer_write, "soft", 10, 320, skypiax_module_pool) !=
if (switch_core_timer_init(&tech_pvt->timer_write, "soft", 20, 320, skypiax_module_pool) != SWITCH_STATUS_SUCCESS) {
ERRORA("setup timer failed\n", SKYPIAX_P_LOG);
return SWITCH_STATUS_FALSE;
}
switch_core_timer_sync(&tech_pvt->timer_write);
#endif // TIMER_WRITE
#endif
switch_threadattr_create(&thd_attr, skypiax_module_pool);
switch_threadattr_detach_set(thd_attr, 0);
switch_threadattr_stacksize_set(thd_attr, SWITCH_THREAD_STACKSIZE);
@ -1981,7 +1802,6 @@ int new_inbound_channel(private_t * tech_pvt)
switch_core_session_destroy(&session);
return 0;
}
//switch_channel_set_variable(channel, "send_silence_when_idle", "1500");
switch_channel_set_variable(channel, "waste", "false");
if (skypiax_tech_init(tech_pvt, session) != SWITCH_STATUS_SUCCESS) {
ERRORA("Doh! no tech_init?\n", SKYPIAX_P_LOG);
@ -1994,7 +1814,6 @@ int new_inbound_channel(private_t * tech_pvt)
tech_pvt->dialplan, tech_pvt->callid_name,
tech_pvt->callid_number, NULL, NULL, NULL, NULL, "mod_skypiax", tech_pvt->context, tech_pvt->destination)) != 0) {
char name[128];
//switch_snprintf(name, sizeof(name), "skypiax/%s/%s", tech_pvt->name, tech_pvt->caller_profile->destination_number);
switch_snprintf(name, sizeof(name), "skypiax/%s", tech_pvt->name);
switch_channel_set_name(channel, name);
switch_channel_set_caller_profile(channel, tech_pvt->caller_profile);
@ -2056,7 +1875,6 @@ int remote_party_is_early_media(private_t * tech_pvt)
session = switch_core_session_locate(tech_pvt->session_uuid_str);
} else {
ERRORA("No session???\n\n\n", SKYPIAX_P_LOG);
//TODO: kill the bastard
goto done;
}
if (session) {
@ -2064,7 +1882,6 @@ int remote_party_is_early_media(private_t * tech_pvt)
switch_core_session_add_stream(session, NULL);
} else {
ERRORA("No session???\n", SKYPIAX_P_LOG);
//TODO: kill the bastard
goto done;
}
if (channel) {
@ -2072,7 +1889,6 @@ int remote_party_is_early_media(private_t * tech_pvt)
DEBUGA_SKYPE("skype_call: REMOTE PARTY EARLY MEDIA\n", SKYPIAX_P_LOG);
} else {
ERRORA("No channel???\n", SKYPIAX_P_LOG);
//TODO: kill the bastard
}
switch_core_session_rwunlock(session);
@ -2100,7 +1916,6 @@ int outbound_channel_answered(private_t * tech_pvt)
}
if (channel) {
switch_channel_mark_answered(channel);
//DEBUGA_SKYPE("skype_call: %s, answered\n", SKYPIAX_P_LOG, id);
} else {
ERRORA("No channel???\n", SKYPIAX_P_LOG);
}
@ -2117,8 +1932,6 @@ private_t *find_available_skypiax_interface_rr(private_t * tech_pvt_calling)
{
private_t *tech_pvt = NULL;
int i;
//int num_interfaces = SKYPIAX_MAX_INTERFACES;
//int num_interfaces = globals.real_interfaces;
switch_mutex_lock(globals.mutex);
@ -2130,7 +1943,6 @@ private_t *find_available_skypiax_interface_rr(private_t * tech_pvt_calling)
int interface_id;
interface_id = globals.next_interface;
//interface_id = interface_id < SKYPIAX_MAX_INTERFACES ? interface_id : interface_id - SKYPIAX_MAX_INTERFACES + 1;
globals.next_interface = interface_id + 1 < SKYPIAX_MAX_INTERFACES ? interface_id + 1 : 0;
if (strlen(globals.SKYPIAX_INTERFACES[interface_id].name)) {
@ -2144,8 +1956,6 @@ private_t *find_available_skypiax_interface_rr(private_t * tech_pvt_calling)
|| 0 == tech_pvt->skype_callflow)) {
DEBUGA_SKYPE("returning as available skype interface name: %s, state: %d callflow: %d\n", SKYPIAX_P_LOG, tech_pvt->name, skype_state,
tech_pvt->skype_callflow);
/*set to Dialing state to avoid other thread fint it, don't know if it is safe */
//XXX no, it's not safe
if (tech_pvt_calling == NULL) {
tech_pvt->interface_state = SKYPIAX_STATE_SELECTED;
}
@ -2153,9 +1963,7 @@ private_t *find_available_skypiax_interface_rr(private_t * tech_pvt_calling)
switch_mutex_unlock(globals.mutex);
return tech_pvt;
}
} // else {
//DEBUGA_SKYPE("Skype interface: %d blank!! A hole here means we cannot hunt the last interface.\n", SKYPIAX_P_LOG, interface_id);
//}
}
}
switch_mutex_unlock(globals.mutex);
@ -2246,7 +2054,6 @@ SWITCH_STANDARD_API(sk_function)
} else if (!strcasecmp(argv[0], "ciapalino")) {
/* BEGIN: Changes heres */
} else if (!strcasecmp(argv[0], "reload")) {
if (load_config(SOFT_RELOAD) != SWITCH_STATUS_SUCCESS) {
stream->write_function(stream, "sk reload failed\n");
@ -2266,7 +2073,6 @@ SWITCH_STANDARD_API(sk_function)
stream->write_function(stream, "-ERR Usage: sk remove interface_name\n");
goto end;
}
/* END: Changes heres */
} else {
if (globals.sk_console)
@ -2347,7 +2153,6 @@ int skypiax_answer(private_t * tech_pvt, char *id, char *value)
if (strlen(globals.SKYPIAX_INTERFACES[i].name)) {
giovatech = &globals.SKYPIAX_INTERFACES[i];
//NOTICA("interface=%d, name=%s, giovatech->skype_call_id=%s, giovatech->interface_state=%d, giovatech->skype_user=%s, tech_pvt->skype_user=%s, giovatech->callid_number=%s, value=%s, delta=%ld 500000\n", SKYPIAX_P_LOG, i, giovatech->name, giovatech->skype_call_id, giovatech->interface_state, giovatech->skype_user, tech_pvt->skype_user, giovatech->callid_number, value, (((timenow.tv_sec - giovatech->answer_time.tv_sec) * 1000000) + (timenow.tv_usec - giovatech->answer_time.tv_usec)) );
if (strlen(giovatech->skype_call_id) && (giovatech->interface_state != SKYPIAX_STATE_DOWN) && (!strcmp(giovatech->skype_user, tech_pvt->skype_user)) && (!strcmp(giovatech->callid_number, value)) && ((((timenow.tv_sec - giovatech->answer_time.tv_sec) * 1000000) + (timenow.tv_usec - giovatech->answer_time.tv_usec)) < 1000000)) { //XXX 1.5sec - can have a max of 1 call coming from the same skypename to the same skypename each 1.5 seconds
found = 1;
DEBUGA_SKYPE
@ -2367,9 +2172,6 @@ int skypiax_answer(private_t * tech_pvt, char *id, char *value)
}
if (found) {
//tech_pvt->callid_number[0]='\0';
//sprintf(msg_to_skype, "ALTER CALL %s END HANGUP", id);
//skypiax_signaling_write(tech_pvt, msg_to_skype);
switch_mutex_unlock(globals.mutex);
return 0;
}
@ -2387,7 +2189,6 @@ int skypiax_answer(private_t * tech_pvt, char *id, char *value)
sprintf(msg_to_skype, "ALTER CALL %s ANSWER", id);
skypiax_signaling_write(tech_pvt, msg_to_skype);
DEBUGA_SKYPE("We answered a Skype RING on skype_call %s\n", SKYPIAX_P_LOG, id);
//FIXME write a timestamp here
gettimeofday(&tech_pvt->answer_time, NULL);
switch_copy_string(tech_pvt->skype_call_id, id, sizeof(tech_pvt->skype_call_id) - 1);
@ -2422,8 +2223,6 @@ int skypiax_transfer(private_t * tech_pvt, char *id, char *value)
if (strlen(globals.SKYPIAX_INTERFACES[i].name)) {
giovatech = &globals.SKYPIAX_INTERFACES[i];
//NOTICA("skype interface: %d, name: %s, state: %d, value=%s, giovatech->callid_number=%s, giovatech->skype_user=%s\n", SKYPIAX_P_LOG, i, giovatech->name, giovatech->interface_state, value, giovatech->callid_number, giovatech->skype_user);
//FIXME check a timestamp here
if (strlen(giovatech->skype_call_id) && (giovatech->interface_state != SKYPIAX_STATE_DOWN) && (!strcmp(giovatech->skype_user, tech_pvt->skype_user)) && (!strcmp(giovatech->callid_number, value)) && ((((timenow.tv_sec - giovatech->answer_time.tv_sec) * 1000000) + (timenow.tv_usec - giovatech->answer_time.tv_usec)) < 500000)) { //0.5sec
found = 1;
DEBUGA_SKYPE
@ -2436,9 +2235,6 @@ int skypiax_transfer(private_t * tech_pvt, char *id, char *value)
}
if (found) {
//tech_pvt->callid_number[0]='\0';
//sprintf(msg_to_skype, "ALTER CALL %s END HANGUP", id);
//skypiax_signaling_write(tech_pvt, msg_to_skype);
switch_mutex_unlock(globals.mutex);
return 0;
}
@ -2451,7 +2247,7 @@ int skypiax_transfer(private_t * tech_pvt, char *id, char *value)
} else {
/* we're owned, we're in a call, let's try to transfer */
/* we're in a call, let's try to transfer */
/************************** TODO
Checking here if it is possible to transfer this call to Test2
-> GET CALL 288 CAN_TRANSFER Test2
@ -2465,8 +2261,6 @@ int skypiax_transfer(private_t * tech_pvt, char *id, char *value)
if (strlen(globals.SKYPIAX_INTERFACES[i].name)) {
giovatech = &globals.SKYPIAX_INTERFACES[i];
//NOTICA("skype interface: %d, name: %s, state: %d, value=%s, giovatech->callid_number=%s, giovatech->skype_user=%s\n", SKYPIAX_P_LOG, i, giovatech->name, giovatech->interface_state, value, giovatech->callid_number, giovatech->skype_user);
//FIXME check a timestamp here
if (strlen(giovatech->skype_transfer_call_id) && (giovatech->interface_state != SKYPIAX_STATE_DOWN) && (!strcmp(giovatech->skype_user, tech_pvt->skype_user)) && (!strcmp(giovatech->transfer_callid_number, value)) && ((((timenow.tv_sec - giovatech->transfer_time.tv_sec) * 1000000) + (timenow.tv_usec - giovatech->transfer_time.tv_usec)) < 1000000)) { //1.0 sec
found = 1;
DEBUGA_SKYPE
@ -2479,9 +2273,6 @@ int skypiax_transfer(private_t * tech_pvt, char *id, char *value)
}
if (found) {
//tech_pvt->callid_number[0]='\0';
//sprintf(msg_to_skype, "ALTER CALL %s END HANGUP", id);
//skypiax_signaling_write(tech_pvt, msg_to_skype);
switch_mutex_unlock(globals.mutex);
return 0;
}
@ -2502,8 +2293,6 @@ int skypiax_transfer(private_t * tech_pvt, char *id, char *value)
("Let's transfer the skype_call %s to %s interface (with skype_user: %s), because we are already in a skypiax call(%s)\n",
SKYPIAX_P_LOG, tech_pvt->skype_call_id, available_skypiax_interface->name, available_skypiax_interface->skype_user, id);
//FIXME why this? the inbound call will come, eventually, on that other interface
//available_skypiax_interface->ib_calls++;
sprintf(msg_to_skype, "ALTER CALL %s TRANSFER %s", id, available_skypiax_interface->skype_user);
skypiax_signaling_write(tech_pvt, msg_to_skype);
@ -2604,10 +2393,8 @@ SWITCH_STANDARD_API(skypiax_chat_function)
char *mycmd = NULL, *argv[10] = { 0 };
int argc = 0;
private_t *tech_pvt = NULL;
//int tried =0;
int i;
int found = 0;
//char skype_msg[1024];
if (!zstr(cmd) && (mycmd = strdup(cmd))) {
argc = switch_separate_string(mycmd, ' ', argv, (sizeof(argv) / sizeof(argv[0])));
@ -2640,51 +2427,18 @@ SWITCH_STANDARD_API(skypiax_chat_function)
goto end;
} else {
//chat_send(const char *proto, const char *from, const char *to, const char *subject, const char *body, const char *type, const char *hint);
//chat_send(p*roto, const char *from, const char *to, const char *subject, const char *body, const char *type, const char *hint);
//chat_send(MDL_CHAT_PROTO, tech_pvt->skype_user, argv[1], "SIMPLE MESSAGE", switch_str_nil((char *) &cmd[strlen(argv[0]) + 1 + strlen(argv[1]) + 1]), NULL, hint);
NOTICA("chat_send(proto=%s, from=%s, to=%s, subject=%s, body=%s, type=NULL, hint=%s)\n", SKYPIAX_P_LOG, MDL_CHAT_PROTO, tech_pvt->skype_user,
argv[1], "SIMPLE MESSAGE", switch_str_nil((char *) &cmd[strlen(argv[0]) + 1 + strlen(argv[1]) + 1]), tech_pvt->name);
chat_send(MDL_CHAT_PROTO, tech_pvt->skype_user, argv[1], "SIMPLE MESSAGE",
switch_str_nil((char *) &cmd[strlen(argv[0]) + 1 + strlen(argv[1]) + 1]), NULL, tech_pvt->name);
//NOTICA("TEXT is: %s\n", SKYPIAX_P_LOG, (char *) &cmd[strlen(argv[0]) + 1 + strlen(argv[1]) + 1] );
//snprintf(skype_msg, sizeof(skype_msg), "CHAT CREATE %s", argv[1]);
//skypiax_signaling_write(tech_pvt, skype_msg);
//switch_sleep(100);
}
} else {
stream->write_function(stream, "ERROR, usage: %s", SKYPIAX_CHAT_SYNTAX);
goto end;
}
#ifdef NOTDEF
found = 0;
while (!found) {
for (i = 0; i < MAX_CHATS; i++) {
if (!strcmp(tech_pvt->chats[i].dialog_partner, argv[1])) {
snprintf(skype_msg, sizeof(skype_msg), "CHATMESSAGE %s %s", tech_pvt->chats[i].chatname,
(char *) &cmd[strlen(argv[0]) + 1 + strlen(argv[1]) + 1]);
skypiax_signaling_write(tech_pvt, skype_msg);
found = 1;
break;
}
}
if (found) {
break;
}
if (tried > 1000) {
stream->write_function(stream, "ERROR: no chat with dialog_partner='%s' was found\n", argv[1]);
break;
}
switch_sleep(1000);
}
#endif //NOTDEF
end:
switch_safe_free(mycmd);