Author: anthm Date: Sat May 24 13:28:04 2008 New Revision: 8583 Modified: freeswitch/trunk/src/include/switch_ivr.h freeswitch/trunk/src/mod/applications/mod_dptools/mod_dptools.c freeswitch/trunk/src/switch_ivr.c freeswitch/trunk/src/switch_ivr_bridge.c Log: add -bleg to intercept Modified: freeswitch/trunk/src/include/switch_ivr.h ============================================================================== --- freeswitch/trunk/src/include/switch_ivr.h (original) +++ freeswitch/trunk/src/include/switch_ivr.h Sat May 24 13:28:04 2008 @@ -738,7 +738,8 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_phrase_macro(switch_core_session_t *session, const char *macro_name, const char *data, const char *lang, switch_input_args_t *args); SWITCH_DECLARE(void) switch_ivr_delay_echo(switch_core_session_t *session, uint32_t delay_ms); -SWITCH_DECLARE(void) switch_ivr_intercept_session(switch_core_session_t *session, const char *uuid); +SWITCH_DECLARE(switch_status_t) switch_ivr_find_bridged_uuid(const char *uuid, char *b_uuid, switch_size_t blen); +SWITCH_DECLARE(void) switch_ivr_intercept_session(switch_core_session_t *session, const char *uuid, switch_bool_t bleg); SWITCH_DECLARE(void) switch_ivr_park_session(switch_core_session_t *session); SWITCH_DECLARE(switch_status_t) switch_ivr_wait_for_answer(switch_core_session_t *session, switch_core_session_t *peer_session); Modified: freeswitch/trunk/src/mod/applications/mod_dptools/mod_dptools.c ============================================================================== --- freeswitch/trunk/src/mod/applications/mod_dptools/mod_dptools.c (original) +++ freeswitch/trunk/src/mod/applications/mod_dptools/mod_dptools.c Sat May 24 13:28:04 2008 @@ -217,10 +217,36 @@ } } -#define INTERCEPT_SYNTAX "<uuid>" +#define INTERCEPT_SYNTAX "[-bleg] <uuid>" SWITCH_STANDARD_APP(intercept_function) { - switch_ivr_intercept_session(session, data); + int argc; + char *argv[4] = { 0 }; + char *mydata; + char *uuid; + switch_bool_t bleg = SWITCH_FALSE; + + if (!switch_strlen_zero(data) && (mydata = switch_core_session_strdup(session, data))) { + if ((argc = switch_separate_string(mydata, ' ', argv, (sizeof(argv) / sizeof(argv[0])))) >= 1) { + if (!strcasecmp(argv[0], "-bleg")) { + if (argv[1]) { + uuid = argv[1]; + bleg = SWITCH_TRUE; + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Usage: %s\n", INTERCEPT_SYNTAX); + return; + } + } else { + uuid = argv[0]; + } + + switch_ivr_intercept_session(session, uuid, bleg); + } + switch_safe_free(mydata); + return; + } + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Usage: %s\n", INTERCEPT_SYNTAX); } #define MAX_SPY 3000 Modified: freeswitch/trunk/src/switch_ivr.c ============================================================================== --- freeswitch/trunk/src/switch_ivr.c (original) +++ freeswitch/trunk/src/switch_ivr.c Sat May 24 13:28:04 2008 @@ -1713,6 +1713,7 @@ return status; } + /* For Emacs: * Local Variables: * mode:c Modified: freeswitch/trunk/src/switch_ivr_bridge.c ============================================================================== --- freeswitch/trunk/src/switch_ivr_bridge.c (original) +++ freeswitch/trunk/src/switch_ivr_bridge.c Sat May 24 13:28:04 2008 @@ -929,11 +929,43 @@ return status; } -SWITCH_DECLARE(void) switch_ivr_intercept_session(switch_core_session_t *session, const char *uuid) +SWITCH_DECLARE(switch_status_t) switch_ivr_find_bridged_uuid(const char *uuid, char *b_uuid, switch_size_t blen) +{ + switch_core_session_t *rsession; + switch_status_t status = SWITCH_STATUS_FALSE; + + switch_assert(uuid); + + if ((rsession = switch_core_session_locate(uuid))) { + switch_channel_t *rchannel = switch_core_session_get_channel(rsession); + const char *brto; + + if ((brto = switch_channel_get_variable(rchannel, SWITCH_SIGNAL_BOND_VARIABLE))) { + switch_copy_string(b_uuid, brto, blen); + status = SWITCH_STATUS_SUCCESS; + } + switch_core_session_rwunlock(rsession); + } + + return status; + +} + +SWITCH_DECLARE(void) switch_ivr_intercept_session(switch_core_session_t *session, const char *uuid, switch_bool_t bleg) { switch_core_session_t *rsession, *bsession = NULL; switch_channel_t *channel, *rchannel, *bchannel; const char *buuid; + char brto[SWITCH_UUID_FORMATTED_LENGTH + 1] = ""; + + if (bleg) { + if (switch_ivr_find_bridged_uuid(uuid, brto, sizeof(brto)) == SWITCH_STATUS_SUCCESS) { + uuid = brto; + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "no uuid bridged to %s\n", uuid); + return; + } + } if (switch_strlen_zero(uuid) || !(rsession = switch_core_session_locate(uuid))) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "no uuid %s\n", uuid);