Author: ctrix Date: Wed Jan 14 19:09:35 2009 New Revision: 11208 Log: An application, some events and some channel variables. Modified: freeswitch/branches/ctrix/mod_airpe/airpe_api.c freeswitch/branches/ctrix/mod_airpe/airpe_apps.c freeswitch/branches/ctrix/mod_airpe/airpe_if_common.c freeswitch/branches/ctrix/mod_airpe/mod_airpe.c freeswitch/branches/ctrix/mod_airpe/mod_airpe.h Modified: freeswitch/branches/ctrix/mod_airpe/airpe_api.c ============================================================================== --- freeswitch/branches/ctrix/mod_airpe/airpe_api.c (original) +++ freeswitch/branches/ctrix/mod_airpe/airpe_api.c Wed Jan 14 19:09:35 2009 @@ -37,7 +37,7 @@ */ -#define AIRPE_MOODTEXT_SYNTAX "airpe_moodtext <clientname> <text>" +#define AIRPE_MOODTEXT_SYNTAX "airpe_moodtext <clientname> [text]" SWITCH_STANDARD_API(airpe_moodtext_command) { int argc = 0; @@ -67,11 +67,10 @@ } if ( argc == 1 ) { - stream->write_function(stream, "+OK: "); if ( airpe->mood_text ) stream->write_function(stream, airpe->mood_text); else - stream->write_function(stream, "UNKNOWN"); + stream->write_function(stream, "[UNKNOWN]"); stream->write_function(stream, "\n"); } else { @@ -91,7 +90,7 @@ return SWITCH_STATUS_SUCCESS; } -#define AIRPE_INFO_SYNTAX "airpe_status <clientname>" +#define AIRPE_INFO_SYNTAX "airpe_info <clientname>" SWITCH_STANDARD_API(airpe_info_command) { int argc = 0; @@ -161,7 +160,7 @@ return SWITCH_STATUS_SUCCESS; } -#define AIRPE_STATUS_SYNTAX "airpe_status <clientname> <status>" +#define AIRPE_STATUS_SYNTAX "airpe_status <clientname> [status]" SWITCH_STANDARD_API(airpe_status_command) { int argc = 0; @@ -197,7 +196,6 @@ if ( !cstatus ) { const char *str_status = NULL; str_status = skype_user_status_string( airpe->user_status ); - stream->write_function(stream, "+OK status is "); if ( str_status ) stream->write_function(stream, str_status); else @@ -251,13 +249,13 @@ switch_api_interface_t *api; switch_console_set_complete("add airpe_moodtext "); - SWITCH_ADD_API(api, "airpe_moodtext", "sets the mood text of an airpe client", airpe_moodtext_command, AIRPE_MOODTEXT_SYNTAX); + SWITCH_ADD_API(api, "airpe_moodtext", "gets/sets the mood text of an airpe client", airpe_moodtext_command, AIRPE_MOODTEXT_SYNTAX); switch_console_set_complete("add airpe_info "); SWITCH_ADD_API(api, "airpe_info", "shows the status of an airpe client", airpe_info_command, AIRPE_INFO_SYNTAX); switch_console_set_complete("add airpe_status "); - SWITCH_ADD_API(api, "airpe_status", "sets the status of an airpe client", airpe_status_command, AIRPE_STATUS_SYNTAX); + SWITCH_ADD_API(api, "airpe_status", "gets/sets the status of an airpe client", airpe_status_command, AIRPE_STATUS_SYNTAX); return SWITCH_STATUS_SUCCESS; } Modified: freeswitch/branches/ctrix/mod_airpe/airpe_apps.c ============================================================================== --- freeswitch/branches/ctrix/mod_airpe/airpe_apps.c (original) +++ freeswitch/branches/ctrix/mod_airpe/airpe_apps.c Wed Jan 14 19:09:35 2009 @@ -30,15 +30,67 @@ #include "mod_airpe.h" -SWITCH_STANDARD_APP(airpe_app_test) +#define AIRPE_SET_STATUS_SYNTAX "<client> <unknown|online|offline|skyoeme|away|na|dnd|invisible|loggedout>" +SWITCH_STANDARD_APP(airpe_set_status) { + airpe_interface_t *airpe = NULL; + const char *str_status = NULL; + char buf[SKYPE_MSG_LEN]; + char *client = NULL; + char *text = NULL; + + client = (char *) data; + if ( (text = strchr(client,' ')) ) { + *text++ = '\0'; + } + + if ( switch_strlen_zero(client) ) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No client specified.\n"); + return; + } + + airpe = airpe_find_interface(client); + + if ( !airpe ) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No airpe client matching name '%s' found.\n", client); + return; + } + + if ( !switch_strlen_zero(text) ) { + + if ( !strncasecmp(text, "unknown", sizeof("unknown") ) ) + str_status = skype_user_status_string(USER_STATUS_UNKNOWN); + else if ( !strncasecmp(text, "online", sizeof("online") ) ) + str_status = skype_user_status_string(USER_STATUS_ONLINE); + else if ( !strncasecmp(text, "offline", sizeof("offline") ) ) + str_status = skype_user_status_string(USER_STATUS_OFFLINE); + else if ( !strncasecmp(text, "skypeme", sizeof("skypeme") ) ) + str_status = skype_user_status_string(USER_STATUS_SKYPEME); + else if ( !strncasecmp(text, "away", sizeof("away") ) ) + str_status = skype_user_status_string(USER_STATUS_AWAY); + else if ( !strncasecmp(text, "na", sizeof("na") ) ) + str_status = skype_user_status_string(USER_STATUS_NA); + else if ( !strncasecmp(text, "dnd", sizeof("dnd") ) ) + str_status = skype_user_status_string(USER_STATUS_DND); + else if ( !strncasecmp(text, "invisible", sizeof("invisible") ) ) + str_status = skype_user_status_string(USER_STATUS_INVISIBLE); + else if ( !strncasecmp(text, "loggedout", sizeof("loggedout") ) ) + str_status = skype_user_status_string(USER_STATUS_LOGGEDOUT); + + if ( str_status ) { + snprintf(buf, SKYPE_MSG_LEN, "SET USERSTATUS %s", str_status ); + airpe_cmd_write(airpe, buf); + } + + } + } switch_status_t airpe_register_apps( switch_loadable_module_interface_t **module_interface ) { switch_application_interface_t *app_interface; - SWITCH_ADD_APP(app_interface, "airpe_test", "test text", "test text", airpe_app_test, "", SAF_SUPPORT_NOMEDIA); + SWITCH_ADD_APP(app_interface, "airpe_set_status", "Sets the status of an airpe client", "Sets the status of an airpe client", airpe_set_status, AIRPE_SET_STATUS_SYNTAX, SAF_SUPPORT_NOMEDIA); return SWITCH_STATUS_SUCCESS; } Modified: freeswitch/branches/ctrix/mod_airpe/airpe_if_common.c ============================================================================== --- freeswitch/branches/ctrix/mod_airpe/airpe_if_common.c (original) +++ freeswitch/branches/ctrix/mod_airpe/airpe_if_common.c Wed Jan 14 19:09:35 2009 @@ -373,6 +373,8 @@ else switch_channel_set_caller_profile(channel, tech_pvt->caller_profile); + switch_channel_set_variable(channel, "airpe_client", airpe->name); + switch_channel_set_variable(channel, "airpe_user_status", skype_user_status_string(airpe->user_status) ); switch_set_flag(tech_pvt, TFLAG_INBOUND); airpe_set_call_id(airpe, callid, switch_core_session_get_uuid(new_session) ); @@ -502,6 +504,8 @@ switch_status_t airpe_manage_skype_msg( airpe_interface_t *airpe, const char *msg ) { switch_core_session_t *session = NULL; + switch_channel_t *channel = NULL; + switch_event_t *s_event = NULL; char *buf = NULL; int argc = 0; char *argv[9] = { 0 }; @@ -512,8 +516,11 @@ if ( airpe->debug ) switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "airpe client %s: < %s\n", airpe->name, msg); - if ( airpe->active_session_uuid ) + if ( airpe->active_session_uuid ) { session = switch_core_session_locate(airpe->active_session_uuid); + if ( session ) + channel = switch_core_session_get_channel(session); + } buf = strdup(msg); argc = switch_separate_string(buf, ' ', argv, (sizeof(argv) / sizeof(argv[0]))); @@ -524,8 +531,6 @@ return SWITCH_STATUS_FALSE; } - - if ( !strncmp( buf, "CURRENTUSERHANDLE", strlen("CURRENTUSERHANDLE")) ) { /* The username that the client is using. */ // TODO ... if the user handle mismatches, disconnect the channel or simply disable @@ -553,9 +558,16 @@ else if ( !strncmp( buf, "USER", strlen("USER")) && argc >= 2 ) { /* Updates about the users of our list or new auth requests */ if ( !strncmp(argv[2], "RECEIVEDAUTHREQUEST", strlen("RECEIVEDAUTHREQUEST") ) ) { + if (switch_event_create_subclass(&s_event, SWITCH_EVENT_CUSTOM, AIRPE_EVENT_AUTHREQUEST) == SWITCH_STATUS_SUCCESS) { + switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "client-name", airpe->name); + switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "auth_user", argv[1]); + switch_event_fire(&s_event); + } if ( airpe->auto_auth ) { snprintf(buf, sizeof(buf), "SET USER %s ISAUTHORIZED TRUE", argv[1]); airpe_cmd_write(airpe, buf); + + } } } @@ -627,6 +639,11 @@ else if ( !strncmp(cmd, "STATUS", strlen("STATUS")) && argc >=4 ) { char *callstatus = argv[3]; airpe_manage_call_status( airpe, callid, callstatus ); + if (switch_event_create_subclass(&s_event, SWITCH_EVENT_CUSTOM, AIRPE_EVENT_STATUSCHANGE) == SWITCH_STATUS_SUCCESS) { + switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "client-name", airpe->name); + switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "status", callstatus); + switch_event_fire(&s_event); + } } else if ( !strncmp(cmd, "CONF_ID", strlen("CONF_ID")) ) { char buf[SKYPE_MSG_LEN]; @@ -652,15 +669,11 @@ } else if ( !strncmp(cmd, "DTMF", strlen("DTMF")) ) { /* This is an incoming DTMF */ - if ( session ) { - switch_channel_t *channel; + if ( session && channel ) { switch_dtmf_t dtmf = { 0, switch_core_default_dtmf_duration(0) }; const char *signal_ptr; int tmp; - channel = switch_core_session_get_channel(session); - assert(channel); - signal_ptr = argv[3]; if (*signal_ptr && (*signal_ptr == '*' || *signal_ptr == '#' || *signal_ptr == 'A' || *signal_ptr == 'B' || *signal_ptr == 'C' || *signal_ptr == 'D')) { @@ -670,9 +683,7 @@ dtmf.digit = switch_rfc2833_to_char(tmp); } - switch_mutex_lock(airpe->tech_pvt->flag_mutex); switch_channel_queue_dtmf(channel, &dtmf); - switch_mutex_unlock(airpe->tech_pvt->flag_mutex); } } else if ( !strncmp(cmd, "FAILUREREASON", strlen("FAILUREREASON")) && argc >=2 ) { @@ -698,6 +709,8 @@ if ( data ) { data += strlen("PARTNER_DISPNAME "); airpe_set_partner_displayname(airpe, data); + if ( channel ) + switch_channel_set_variable(channel, "airpe_partner_dispname", data); } } switch_safe_free(tmp); @@ -710,6 +723,8 @@ if ( data ) { data += strlen("PARTNER_HANDLE "); airpe_set_partner_handle(airpe, data); + if ( channel ) + switch_channel_set_variable(channel, "airpe_partner_handle", data); } switch_safe_free(tmp); } @@ -735,10 +750,13 @@ } else if ( !strncmp( buf, "ERROR", strlen("ERROR")) ) { /* If we are in the middle of a call, hangup */ + /* if ( airpe->active_call_id ) { + char buf[SKYPE_MSG_LEN] = ""; snprintf(buf, sizeof(buf), "ALTER CALL %d END HANGUP", airpe->active_call_id ); airpe_cmd_write(airpe, buf); } + */ } else { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Unmanaged message\n"); Modified: freeswitch/branches/ctrix/mod_airpe/mod_airpe.c ============================================================================== --- freeswitch/branches/ctrix/mod_airpe/mod_airpe.c (original) +++ freeswitch/branches/ctrix/mod_airpe/mod_airpe.c Wed Jan 14 19:09:35 2009 @@ -408,6 +408,10 @@ airpe_set_call_id(tech_pvt->airpe, 0, switch_core_session_get_uuid(*new_session) ); switch_channel_set_flag(channel, CF_OUTBOUND); switch_set_flag(tech_pvt, TFLAG_OUTBOUND); + + switch_channel_set_variable(channel, "airpe_client", tech_pvt->airpe->name); + switch_channel_set_variable(channel, "airpe_user_status", skype_user_status_string(tech_pvt->airpe->user_status) ); + switch_channel_set_state(channel, CS_INIT); return SWITCH_CAUSE_SUCCESS; } Modified: freeswitch/branches/ctrix/mod_airpe/mod_airpe.h ============================================================================== --- freeswitch/branches/ctrix/mod_airpe/mod_airpe.h (original) +++ freeswitch/branches/ctrix/mod_airpe/mod_airpe.h Wed Jan 14 19:09:35 2009 @@ -33,6 +33,9 @@ #define MODNAME "airpe" +#define AIRPE_EVENT_AUTHREQUEST "airpe::authrequest" +#define AIRPE_EVENT_STATUSCHANGE "airpe::statuschange" + #define SKYPE_MSG_LEN 1024 #define CODEC_SAMPLE_RATE 16000