[commit] r11296 - in freeswitch/branches/ctrix/mod_airpe: . config
Author: ctrix Date: Mon Jan 19 17:30:28 2009 New Revision: 11296 Log: tweaks... (add some locking, add option "restart-clients-on-reloadxml", reworking of reloadxml, reworking the shutdown of the module, remove noisy debug messages, airpe_uuid api command) Modified: freeswitch/branches/ctrix/mod_airpe/Makefile freeswitch/branches/ctrix/mod_airpe/airpe_api.c freeswitch/branches/ctrix/mod_airpe/airpe_if_common.c freeswitch/branches/ctrix/mod_airpe/airpe_if_x11.c freeswitch/branches/ctrix/mod_airpe/config/airpe.conf.xml freeswitch/branches/ctrix/mod_airpe/mod_airpe.c freeswitch/branches/ctrix/mod_airpe/mod_airpe.h Modified: freeswitch/branches/ctrix/mod_airpe/Makefile ============================================================================== --- freeswitch/branches/ctrix/mod_airpe/Makefile (original) +++ freeswitch/branches/ctrix/mod_airpe/Makefile Mon Jan 19 17:30:28 2009 @@ -2,6 +2,7 @@ MODNAME=mod_airpe +LOCAL_CFLAGS= LOCAL_LDFLAGS=-lX11 LOCAL_OBJS=airpe_if_common.o airpe_api.o airpe_apps.o airpe_if_x11.o airpe_if_osx.o airpe_if_win32.o LOCAL_SOURCES=airpe_if_common.c airpe_api.c airpe_apps.c airpe_if_x11.c airpe_if_osx.c airpe_if_win32.c 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 Mon Jan 19 17:30:28 2009 @@ -37,6 +37,45 @@ */ +#define AIRPE_UUID_SYNTAX "airpe_uuid_command <clientname>" +SWITCH_STANDARD_API(airpe_uuid_command) +{ + int argc = 0; + char *argv[2] = { 0 }; + char *mycmd = NULL; + char *client = NULL; + airpe_interface_t *airpe = NULL; + + if (!switch_strlen_zero(cmd) && (mycmd = strdup(cmd))) { + argc = switch_separate_string(mycmd, ' ', argv, (sizeof(argv) / sizeof(argv[0]))); + switch_assert(argv[0]); + } + + if ( argc != 1 ) { + stream->write_function(stream, "-USAGE: %s\n", AIRPE_UUID_SYNTAX); + goto done; + } + + client = argv[0]; + airpe = airpe_find_interface(client); + + if ( !airpe ) { + stream->write_function(stream, "-ERR interface not found for client "); + stream->write_function(stream, client); + goto done; + } + + if ( !airpe->active_session_uuid ) { + goto done; + } + + stream->write_function(stream, airpe->active_session_uuid); + stream->write_function(stream, "\n"); + + done: + return SWITCH_STATUS_SUCCESS; +} + #define AIRPE_RAW_SYNTAX "airpe_raw_command <clientname> <command string>" SWITCH_STANDARD_API(airpe_raw_command) { @@ -255,7 +294,6 @@ stream->write_function(stream, buf); } } - } done: @@ -350,6 +388,9 @@ switch_api_interface_t *api; + switch_console_set_complete("add airpe_uuid "); + SWITCH_ADD_API(api, "airpe_uuid", "gets the uuid of the (eventually) attached session", airpe_uuid_command, AIRPE_UUID_SYNTAX); + switch_console_set_complete("add airpe_debug "); SWITCH_ADD_API(api, "airpe_debug", "gets/sets debug status of an airpe client", airpe_debug_command, AIRPE_DEBUG_SYNTAX); 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 Mon Jan 19 17:30:28 2009 @@ -174,7 +174,7 @@ assert(airpe); - if ( airpe->debug ) + if ( airpe->debug && strncmp(msg, "PING", 4) ) switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "msg to airpe client %s: > %s\n", airpe->name, msg); status = airpe_skype_send_message(airpe->skype_window, msg); @@ -204,13 +204,14 @@ } switch_status_t airpe_explicit_hangup(airpe_interface_t *airpe) { + switch_status_t status = SWITCH_STATUS_FALSE; char buf[SKYPE_MSG_LEN]; - if ( airpe->active_call_id > 0 ) { + if ( airpe && airpe->active_call_id > 0 ) { snprintf(buf, sizeof(buf), "SET CALL %d STATUS FINISHED", airpe->active_call_id); - return airpe_cmd_write(airpe, buf); + status = airpe_cmd_write(airpe, buf); } - return SWITCH_STATUS_FALSE; + return status; } /***************************************************************************** @@ -536,7 +537,7 @@ assert(airpe); assert(msg); - if ( airpe->debug ) + if ( airpe->debug && strncmp(msg, "PONG", 4) ) switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "airpe client %s: < %s\n", airpe->name, msg); if ( airpe->active_session_uuid ) { Modified: freeswitch/branches/ctrix/mod_airpe/airpe_if_x11.c ============================================================================== --- freeswitch/branches/ctrix/mod_airpe/airpe_if_x11.c (original) +++ freeswitch/branches/ctrix/mod_airpe/airpe_if_x11.c Mon Jan 19 17:30:28 2009 @@ -129,6 +129,8 @@ disp = window->disp; handle_P = window->win; + trap_errors(); + atom1 = XInternAtom(disp, "SKYPECONTROLAPI_MESSAGE_BEGIN", False); atom2 = XInternAtom(disp, "SKYPECONTROLAPI_MESSAGE", False); pos = 0; @@ -141,7 +143,6 @@ xev.xclient.window = handle_P; xev.xclient.format = 8; - trap_errors(); do { unsigned int i; for (i = 0; i < 20 && i + pos <= len; ++i) @@ -158,6 +159,7 @@ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "airpe client X11 error.\n"); airpe_skype_avalaible(window); } + return SWITCH_STATUS_SUCCESS; } @@ -275,6 +277,7 @@ struct timeval timeout; int ret; + memset(&timeout, 0, sizeof(struct timeval) ); timeout.tv_usec = 10 * 1000; ret = select(x11_fd+1, &rset, 0, 0, &timeout); @@ -328,14 +331,14 @@ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "airpe client %s: exiting thread\n", airpe->name); - /* Hangup our call, if we have one */ - airpe_explicit_hangup(airpe); - + XCloseDisplay(disp); } else { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "airpe client %s: skype not running on display %s\n", airpe->name, airpe->X11_display); } - return NULL; + airpe->airpe_thread_skype = NULL; + + return NULL; } #endif Modified: freeswitch/branches/ctrix/mod_airpe/config/airpe.conf.xml ============================================================================== --- freeswitch/branches/ctrix/mod_airpe/config/airpe.conf.xml (original) +++ freeswitch/branches/ctrix/mod_airpe/config/airpe.conf.xml Mon Jan 19 17:30:28 2009 @@ -2,6 +2,7 @@ <globals> <param name="audio-tcp-port_start" value="21000"/> + <param name="restart-clients-on-reloadxml" value="true"/> <!-- Those params are used for all clients if not explicitly set for each one --> <param name="context" value="public"/> 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 Mon Jan 19 17:30:28 2009 @@ -41,6 +41,7 @@ char *context; char *destination; int audio_tcp_port_start; + int restart_on_reload; switch_mutex_t *mutex; switch_hash_t *interfaces_hash; @@ -51,7 +52,12 @@ airpe_interface_t *airpe_find_interface( const char *name) { - return switch_core_hash_find(globals.interfaces_hash, name); + airpe_interface_t *ret = NULL; + + switch_mutex_lock(globals.mutex); + ret = switch_core_hash_find(globals.interfaces_hash, name); + switch_mutex_unlock(globals.mutex); + return ret; } @@ -65,10 +71,8 @@ if ( !globals.last_port_used ) globals.last_port_used = globals.audio_tcp_port_start; - switch_mutex_lock(globals.mutex); port = globals.last_port_used; globals.last_port_used++; - switch_mutex_unlock(globals.mutex); return port; } @@ -207,12 +211,6 @@ static switch_status_t airpe_destroy_client(airpe_interface_t *airpe) { - 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); - } - if ( airpe->audio_in_socket ) { if ( airpe->debug ) switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Shutting down socket on port %d for client %s\n", airpe->audio_in_port, airpe->name); @@ -235,7 +233,9 @@ airpe_set_partner_handle(airpe, NULL); airpe_clear_call_id(airpe); - switch_core_hash_destroy(&airpe->variables_hash); + if ( airpe->variables_hash ) + switch_core_hash_destroy(&airpe->variables_hash); + airpe->variables_hash = NULL; return SWITCH_STATUS_SUCCESS; } @@ -638,7 +638,7 @@ CONFIGURATION *****************************************************************************/ -static switch_status_t load_config(void) { +static switch_status_t load_config( int reload ) { switch_xml_t cfg, xml, global_settings, @@ -669,7 +669,11 @@ globals.destination = switch_core_strdup(pool, val); } else if (!strcmp(var, "audio-tcp-port_start")) { globals.audio_tcp_port_start = atoi(val); + } else if (!strcmp(var, "restart-clients-on-reloadxml")) { + globals.restart_on_reload = switch_true(val); } + else + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Unknown parameter %s\n", var); } } @@ -698,7 +702,8 @@ } if ( (newconf = switch_core_hash_find(globals.interfaces_hash, name)) ) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Duplicated client %s. Skipping\n", name); + if ( !reload ) + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Duplicated client %s. Skipping\n", name); continue; } @@ -787,13 +792,14 @@ if ( newconf->skype_window ) { status = airpe_create_client(newconf); if ( status == SWITCH_STATUS_SUCCESS ) { - switch_core_hash_insert(globals.interfaces_hash, name, newconf); + switch_mutex_lock(globals.mutex); + switch_core_hash_insert(globals.interfaces_hash, newconf->name, newconf); + switch_mutex_unlock(globals.mutex); } else { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Airpe: cannot start client %s.\n", newconf->name); } } - } } @@ -804,32 +810,35 @@ static void reloadxml_event_handler(switch_event_t *event) { - airpe_interface_t *airpe; - switch_hash_index_t *hi; - void *val; + airpe_interface_t *airpe = NULL; + switch_hash_index_t *hi = NULL; + void *val = NULL; switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Reloading airpe configuration.\n"); - /* First, mark all of them to be reloaded */ - for (hi = switch_hash_first(NULL, globals.interfaces_hash); hi; hi = switch_hash_next(hi)) { - switch_hash_this(hi, NULL, NULL, &val); - airpe = ( airpe_interface_t *) val; - airpe->should_reload = 1; + if ( globals.restart_on_reload ) { + switch_mutex_lock(globals.mutex); + hi = switch_hash_first(NULL, globals.interfaces_hash); + while ( hi ) { + switch_hash_this(hi, NULL, NULL, &val); + airpe = ( airpe_interface_t *) val; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Stopping airpe client %s\n", airpe->name); + airpe_explicit_hangup(airpe); + + airpe->running = 0; + while ( airpe->airpe_thread_skype ) { + switch_sleep(100000); + } + hi = switch_hash_next(hi); + switch_core_hash_delete(globals.interfaces_hash, airpe->name ); + airpe_destroy_client(airpe); + } + switch_mutex_unlock(globals.mutex); } /* Update the data of each client */ -// load_config(1); + load_config(1); - /* Find eventual clients not updated and stop them */ - for (hi = switch_hash_first(NULL, globals.interfaces_hash); hi; hi = switch_hash_next(hi)) { - switch_hash_this(hi, NULL, NULL, &val); - airpe = ( airpe_interface_t *) val; - if ( airpe->should_reload ) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Stopping airpe client %s.\n", airpe->name); - switch_core_hash_delete(globals.interfaces_hash, airpe->name); - airpe_destroy_client(airpe); - } - } } @@ -868,10 +877,10 @@ memset(&globals, 0, sizeof(globals)); - switch_core_hash_init(&globals.interfaces_hash, pool); switch_mutex_init(&globals.mutex, SWITCH_MUTEX_NESTED, pool); + switch_core_hash_init(&globals.interfaces_hash, pool); - load_config(); + load_config(0); *module_interface = switch_loadable_module_create_module_interface(pool, modname); @@ -898,28 +907,33 @@ airpe_interface_t *airpe; switch_hash_index_t *hi; void *val; + const void *var = NULL; pool = airpe_module_pool; switch_event_unbind(&EVENT_NODE); - for (hi = switch_hash_first(NULL, globals.interfaces_hash); hi; hi = switch_hash_next(hi)) { - switch_hash_this(hi, NULL, NULL, &val); + switch_mutex_lock(globals.mutex); + hi = switch_hash_first(NULL, globals.interfaces_hash); + while ( hi ) { + switch_hash_this(hi, &var, NULL, &val); airpe = ( airpe_interface_t *) val; - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Shutting down airpe client: %s\n", airpe->name); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Shutting down airpe client: %s\n", (char *)var); + airpe_explicit_hangup(airpe); + airpe->running = 0; - /* Wake up the socket */ airpe_cmd_write(airpe, "PING"); + while ( airpe->airpe_thread_skype ) { + switch_sleep(100000); + } + + hi = switch_hash_next(hi); + switch_core_hash_delete(globals.interfaces_hash, var); airpe_destroy_client(airpe); - /* - we won't delete the hash element. we're going to destroy the whole pool - switch_core_hash_delete(globals.interfaces_hash, airpe->name); - */ } + switch_mutex_unlock(globals.mutex); switch_yield(500000); - /* TODO... should we check that all interfaces has been switched off ? */ - switch_core_hash_destroy(&globals.interfaces_hash); switch_core_destroy_memory_pool(&pool); return SWITCH_STATUS_UNLOAD; 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 Mon Jan 19 17:30:28 2009 @@ -31,7 +31,7 @@ #include <switch.h> #include <switch_version.h> -#define MODNAME "airpe" +#define MODNAME "mod_airpe" #define AIRPE_EVENT_AUTHREQUEST "airpe::authrequest" #define AIRPE_EVENT_STATUSCHANGE "airpe::statuschange" @@ -135,6 +135,7 @@ struct airpe_interface_s { char *name; int debug; + int detached; char *dialplan; char *context; char *destination; @@ -160,7 +161,6 @@ CALL_STATUS call_status; CONN_STATUS conn_status; - int should_reload; char *skype_version; char *mood_text; int active_call_id;
participants (1)
-
FreeSWITCH SVN