2006-11-28 02:23:26 +00:00
/*
* FreeSWITCH Modular Media Switching Software Library / Soft - Switch Application
2009-02-13 23:37:37 +00:00
* Copyright ( C ) 2005 - 2009 , Anthony Minessale II < anthm @ freeswitch . org >
2006-11-28 02:23:26 +00:00
*
* Version : MPL 1.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 ( the " License " ) ; you may not use this file except in compliance with
* the License . You may obtain a copy of the License at
* http : //www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an " AS IS " basis ,
* WITHOUT WARRANTY OF ANY KIND , either express or implied . See the License
* for the specific language governing rights and limitations under the
* License .
*
* The Original Code is FreeSWITCH Modular Media Switching Software Library / Soft - Switch Application
*
* The Initial Developer of the Original Code is
2009-02-04 21:20:54 +00:00
* Anthony Minessale II < anthm @ freeswitch . org >
2006-11-28 02:23:26 +00:00
* Portions created by the Initial Developer are Copyright ( C )
* the Initial Developer . All Rights Reserved .
*
* Contributor ( s ) :
*
2009-02-04 21:20:54 +00:00
* Anthony Minessale II < anthm @ freeswitch . org >
2006-11-28 02:23:26 +00:00
* Ken Rice , Asteria Solutions Group , Inc < ken @ asteriasgi . com >
* Michael Murdock < mike at mmurdock dot org >
2006-12-04 05:50:41 +00:00
* Neal Horman < neal at wanlink dot com >
2007-06-04 22:10:42 +00:00
* Bret McDanel < trixter AT 0xdecafbad dot com >
2006-11-28 02:23:26 +00:00
*
* mod_dptools . c - - Raw Audio File Streaming Application Module
*
*/
# include <switch.h>
2007-06-13 16:00:14 +00:00
SWITCH_MODULE_LOAD_FUNCTION ( mod_dptools_load ) ;
SWITCH_MODULE_DEFINITION ( mod_dptools , mod_dptools_load , NULL , NULL ) ;
2006-11-28 02:23:26 +00:00
2008-04-22 15:18:35 +00:00
SWITCH_STANDARD_DIALPLAN ( inline_dialplan_hunt )
{
switch_caller_extension_t * extension = NULL ;
2009-04-29 01:00:47 +00:00
char * argv [ 128 ] = { 0 } ;
int argc ;
2008-04-22 15:18:35 +00:00
switch_channel_t * channel = switch_core_session_get_channel ( session ) ;
int x = 0 ;
char * lbuf ;
2008-04-26 15:59:42 +00:00
char * target = arg ;
2008-04-22 15:18:35 +00:00
if ( ! caller_profile ) {
caller_profile = switch_channel_get_caller_profile ( channel ) ;
2008-05-27 04:54:52 +00:00
}
2008-04-22 15:18:35 +00:00
if ( ( extension = switch_caller_extension_new ( session , " inline " , " inline " ) ) = = 0 ) {
abort ( ) ;
}
2008-04-26 15:59:42 +00:00
if ( switch_strlen_zero ( target ) ) {
target = caller_profile - > destination_number ;
}
2008-05-27 04:54:52 +00:00
2008-04-26 15:59:42 +00:00
if ( ! switch_strlen_zero ( target ) & & ( lbuf = switch_core_session_strdup ( session , target ) )
2008-04-22 15:18:35 +00:00
& & ( argc = switch_separate_string ( lbuf , ' , ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ) ) {
} else {
return NULL ;
}
2008-05-27 04:54:52 +00:00
for ( x = 0 ; x < argc ; x + + ) {
2008-04-22 15:18:35 +00:00
char * app = argv [ x ] ;
char * data = strchr ( app , ' : ' ) ;
if ( data ) {
* data + + = ' \0 ' ;
}
2008-05-27 04:54:52 +00:00
while ( * app = = ' ' ) {
2008-04-22 15:18:35 +00:00
app + + ;
}
2008-05-27 04:54:52 +00:00
2008-04-22 15:18:35 +00:00
switch_caller_extension_add_application ( session , extension , app , data ) ;
}
return extension ;
}
2007-06-20 05:15:07 +00:00
# define DETECT_SPEECH_SYNTAX "<mod_name> <gram_name> <gram_path> [<addr>] OR grammar <gram_name> [<path>] OR pause OR resume"
2007-06-20 05:39:50 +00:00
SWITCH_STANDARD_APP ( detect_speech_function )
2006-11-28 02:23:26 +00:00
{
char * argv [ 4 ] ;
int argc ;
char * lbuf = NULL ;
2008-01-06 22:14:10 +00:00
if ( ! switch_strlen_zero ( data ) & & ( lbuf = switch_core_session_strdup ( session , data ) )
2007-03-29 22:31:56 +00:00
& & ( argc = switch_separate_string ( lbuf , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ) ) {
2006-11-28 02:23:26 +00:00
if ( ! strcasecmp ( argv [ 0 ] , " grammar " ) & & argc > = 1 ) {
switch_ivr_detect_speech_load_grammar ( session , argv [ 1 ] , argv [ 2 ] ) ;
} else if ( ! strcasecmp ( argv [ 0 ] , " nogrammar " ) ) {
switch_ivr_detect_speech_unload_grammar ( session , argv [ 1 ] ) ;
} else if ( ! strcasecmp ( argv [ 0 ] , " pause " ) ) {
switch_ivr_pause_detect_speech ( session ) ;
} else if ( ! strcasecmp ( argv [ 0 ] , " resume " ) ) {
switch_ivr_resume_detect_speech ( session ) ;
} else if ( ! strcasecmp ( argv [ 0 ] , " stop " ) ) {
switch_ivr_stop_detect_speech ( session ) ;
} else if ( argc > = 3 ) {
switch_ivr_detect_speech ( session , argv [ 0 ] , argv [ 1 ] , argv [ 2 ] , argv [ 3 ] , NULL ) ;
}
} else {
2007-06-20 05:15:07 +00:00
switch_log_printf ( SWITCH_CHANNEL_LOG , SWITCH_LOG_ERROR , " Usage: %s \n " , DETECT_SPEECH_SYNTAX ) ;
2006-11-28 02:23:26 +00:00
}
}
2009-03-06 20:16:48 +00:00
# define SCHED_HEARTBEAT_SYNTAX "[0|<seconds>]"
SWITCH_STANDARD_APP ( sched_heartbeat_function )
{
int seconds = 0 ;
if ( data ) {
seconds = atoi ( data ) ;
if ( seconds > = 0 ) {
switch_core_session_sched_heartbeat ( session , seconds ) ;
return ;
}
}
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_ERROR , " Usage: %s \n " , SCHED_HEARTBEAT_SYNTAX ) ;
2009-03-06 20:16:48 +00:00
}
# define HEARTBEAT_SYNTAX "[0|<seconds>]"
SWITCH_STANDARD_APP ( heartbeat_function )
{
int seconds = 0 ;
if ( data ) {
seconds = atoi ( data ) ;
if ( seconds > = 0 ) {
switch_core_session_enable_heartbeat ( session , seconds ) ;
return ;
}
}
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_ERROR , " Usage: %s \n " , HEARTBEAT_SYNTAX ) ;
2009-03-06 20:16:48 +00:00
}
2007-06-20 05:15:07 +00:00
# define EXE_SYNTAX "<extension> <dialplan> <context>"
2007-06-20 05:39:50 +00:00
SWITCH_STANDARD_APP ( exe_function )
2007-04-20 23:45:14 +00:00
{
2008-01-06 22:14:10 +00:00
char * argv [ 4 ] = { 0 } ;
2007-04-20 23:45:14 +00:00
int argc ;
char * lbuf = NULL ;
2008-05-27 04:54:52 +00:00
2008-01-06 22:14:10 +00:00
if ( ! switch_strlen_zero ( data ) & & ( lbuf = switch_core_session_strdup ( session , data ) )
2007-04-20 23:45:14 +00:00
& & ( argc = switch_separate_string ( lbuf , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ) ) {
2008-01-06 22:14:10 +00:00
switch_core_session_execute_exten ( session , argv [ 0 ] , argv [ 1 ] , argv [ 2 ] ) ;
2007-04-20 23:45:14 +00:00
} else {
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_ERROR , " Usage: %s \n " , EXE_SYNTAX ) ;
2007-04-20 23:45:14 +00:00
}
}
2008-12-11 23:06:51 +00:00
# define MKDIR_SYNTAX "<path>"
SWITCH_STANDARD_APP ( mkdir_function )
{
switch_dir_make_recursive ( data , SWITCH_DEFAULT_DIR_PERMS , switch_core_session_get_pool ( session ) ) ;
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_DEBUG , " %s MKDIR: %s \n " , switch_channel_get_name ( switch_core_session_get_channel ( session ) ) , data ) ;
2008-12-11 23:06:51 +00:00
}
2008-04-09 18:15:15 +00:00
# define SOFT_HOLD_SYNTAX "<unhold key> [<moh_a>] [<moh_b>]"
SWITCH_STANDARD_APP ( soft_hold_function )
{
char * argv [ 3 ] = { 0 } ;
int argc ;
char * lbuf = NULL ;
2008-05-27 04:54:52 +00:00
2008-04-09 18:15:15 +00:00
if ( ! switch_strlen_zero ( data ) & & ( lbuf = switch_core_session_strdup ( session , data ) )
& & ( argc = switch_separate_string ( lbuf , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ) > = 1 ) {
switch_ivr_soft_hold ( session , argv [ 0 ] , argv [ 1 ] , argv [ 2 ] ) ;
} else {
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_ERROR , " Usage: %s \n " , SOFT_HOLD_SYNTAX ) ;
2008-04-09 18:15:15 +00:00
}
}
2008-12-31 01:08:51 +00:00
# define UNBIND_SYNTAX "[<key>]"
SWITCH_STANDARD_APP ( dtmf_unbind_function )
{
char * key = ( char * ) data ;
int kval = 0 ;
if ( key ) {
kval = atoi ( key ) ;
}
switch_ivr_unbind_dtmf_meta_session ( session , kval ) ;
}
# define BIND_SYNTAX "<key> [a|b|ab] [a|b|o|s|1] <app>"
2008-03-11 21:32:56 +00:00
SWITCH_STANDARD_APP ( dtmf_bind_function )
{
2008-03-11 22:19:17 +00:00
char * argv [ 4 ] = { 0 } ;
2008-03-11 21:32:56 +00:00
int argc ;
char * lbuf = NULL ;
2008-05-27 04:54:52 +00:00
2008-03-11 21:32:56 +00:00
if ( ! switch_strlen_zero ( data ) & & ( lbuf = switch_core_session_strdup ( session , data ) )
2008-03-11 22:19:17 +00:00
& & ( argc = switch_separate_string ( lbuf , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ) = = 4 ) {
2008-03-11 21:32:56 +00:00
int kval = atoi ( argv [ 0 ] ) ;
2008-05-19 21:02:26 +00:00
switch_bind_flag_t bind_flags = 0 ;
if ( strchr ( argv [ 1 ] , ' a ' ) ) {
bind_flags | = SBF_DIAL_ALEG ;
}
2008-07-03 17:11:15 +00:00
2008-05-19 21:02:26 +00:00
if ( strchr ( argv [ 1 ] , ' b ' ) ) {
bind_flags | = SBF_DIAL_BLEG ;
}
2008-07-03 17:11:15 +00:00
2008-05-19 21:02:26 +00:00
if ( strchr ( argv [ 2 ] , ' a ' ) ) {
if ( ( bind_flags & SBF_EXEC_BLEG ) ) {
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_ERROR , " Cannot bind execute to multiple legs \n " ) ;
2008-05-19 21:02:26 +00:00
} else {
bind_flags | = SBF_EXEC_ALEG ;
}
}
2008-07-03 17:11:15 +00:00
2008-05-19 21:02:26 +00:00
if ( strchr ( argv [ 2 ] , ' b ' ) ) {
if ( ( bind_flags & SBF_EXEC_ALEG ) ) {
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_ERROR , " Cannot bind execute to multiple legs \n " ) ;
2008-05-19 21:02:26 +00:00
} else {
bind_flags | = SBF_EXEC_BLEG ;
}
}
2008-07-03 17:11:15 +00:00
if ( strchr ( argv [ 2 ] , ' a ' ) ) {
if ( ( bind_flags & SBF_EXEC_BLEG ) ) {
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_ERROR , " Cannot bind execute to multiple legs \n " ) ;
2008-07-03 17:11:15 +00:00
} else {
bind_flags | = SBF_EXEC_ALEG ;
}
}
2008-05-19 21:02:26 +00:00
if ( strchr ( argv [ 2 ] , ' o ' ) ) {
if ( ( bind_flags & SBF_EXEC_BLEG ) | | ( bind_flags & SBF_EXEC_ALEG ) | | ( bind_flags & SBF_EXEC_SAME ) ) {
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_ERROR , " Cannot bind execute to multiple legs \n " ) ;
2008-05-19 21:02:26 +00:00
} else {
bind_flags | = SBF_EXEC_OPPOSITE ;
}
}
if ( strchr ( argv [ 2 ] , ' s ' ) ) {
if ( ( bind_flags & SBF_EXEC_BLEG ) | | ( bind_flags & SBF_EXEC_ALEG ) | | ( bind_flags & SBF_EXEC_SAME ) ) {
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_ERROR , " Cannot bind execute to multiple legs \n " ) ;
2008-05-19 21:02:26 +00:00
} else {
bind_flags | = SBF_EXEC_SAME ;
}
}
2008-12-31 01:08:51 +00:00
if ( strchr ( argv [ 2 ] , ' 1 ' ) ) {
bind_flags | = SBF_ONCE ;
}
2008-05-19 21:02:26 +00:00
if ( switch_ivr_bind_dtmf_meta_session ( session , kval , bind_flags , argv [ 3 ] ) ! = SWITCH_STATUS_SUCCESS ) {
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_ERROR , " Bind Error! \n " ) ;
2008-03-11 21:32:56 +00:00
}
} else {
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_ERROR , " Usage: %s \n " , BIND_SYNTAX ) ;
2008-03-11 21:32:56 +00:00
}
}
2008-05-24 17:28:04 +00:00
# define INTERCEPT_SYNTAX "[-bleg] <uuid>"
2007-12-08 00:14:21 +00:00
SWITCH_STANDARD_APP ( intercept_function )
{
2008-05-24 17:28:04 +00:00
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 {
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_ERROR , " Usage: %s \n " , INTERCEPT_SYNTAX ) ;
2008-05-24 17:28:04 +00:00
return ;
}
} else {
uuid = argv [ 0 ] ;
}
2008-05-27 04:54:52 +00:00
2008-05-24 17:28:04 +00:00
switch_ivr_intercept_session ( session , uuid , bleg ) ;
}
return ;
}
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_ERROR , " Usage: %s \n " , INTERCEPT_SYNTAX ) ;
2007-12-08 00:14:21 +00:00
}
2007-11-30 22:56:01 +00:00
2008-04-11 22:35:30 +00:00
# define MAX_SPY 3000
struct e_data {
char * uuid_list [ MAX_SPY ] ;
int total ;
} ;
static int e_callback ( void * pArg , int argc , char * * argv , char * * columnNames )
{
char * uuid = argv [ 0 ] ;
struct e_data * e_data = ( struct e_data * ) pArg ;
if ( uuid & & e_data ) {
e_data - > uuid_list [ e_data - > total + + ] = strdup ( uuid ) ;
return 0 ;
}
return 1 ;
}
2008-04-11 23:26:47 +00:00
# define eavesdrop_SYNTAX "[all | <uuid>]"
2007-11-30 22:56:01 +00:00
SWITCH_STANDARD_APP ( eavesdrop_function )
{
2008-01-06 22:14:10 +00:00
if ( switch_strlen_zero ( data ) ) {
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_ERROR , " Usage: %s \n " , eavesdrop_SYNTAX ) ;
2008-01-06 22:14:10 +00:00
} else {
2008-04-12 16:17:09 +00:00
switch_channel_t * channel = switch_core_session_get_channel ( session ) ;
const char * require_group = switch_channel_get_variable ( channel , " eavesdrop_require_group " ) ;
2008-05-27 04:54:52 +00:00
if ( ! strcasecmp ( ( char * ) data , " all " ) ) {
2008-04-11 22:35:30 +00:00
switch_core_db_t * db = switch_core_db_handle ( ) ;
char * errmsg = NULL ;
2008-05-27 04:54:52 +00:00
struct e_data e_data = { { 0 } } ;
2008-04-11 22:35:30 +00:00
char * sql = switch_mprintf ( " select uuid from channels where uuid != '%q' " , switch_core_session_get_uuid ( session ) ) ;
const char * file = NULL ;
int x = 0 ;
char buf [ 2 ] = " " ;
switch_size_t buflen = sizeof ( buf ) ;
char terminator ;
2008-04-12 16:17:09 +00:00
switch_status_t status ;
2008-05-27 04:54:52 +00:00
while ( switch_channel_ready ( channel ) ) {
for ( x = 0 ; x < MAX_SPY ; x + + ) {
2008-04-11 22:35:30 +00:00
switch_safe_free ( e_data . uuid_list [ x ] ) ;
}
e_data . total = 0 ;
switch_core_db_exec ( db , sql , e_callback , & e_data , & errmsg ) ;
if ( errmsg ) {
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_DEBUG , " Error: %s \n " , errmsg ) ;
2008-04-11 22:35:30 +00:00
switch_core_db_free ( errmsg ) ;
if ( ( file = switch_channel_get_variable ( channel , " eavesdrop_indicate_failed " ) ) ) {
switch_ivr_play_file ( session , NULL , file , NULL ) ;
}
switch_ivr_collect_digits_count ( session , buf , buflen , 1 , " * " , & terminator , 5000 , 0 , 0 ) ;
continue ;
}
if ( e_data . total ) {
for ( x = 0 ; x < e_data . total & & switch_channel_ready ( channel ) ; x + + ) {
2008-07-01 17:41:54 +00:00
/* If we have a group and 1000 concurrent calls, we will flood the logs. This check avoids this */
if ( ! require_group )
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_DEBUG , " Spy: %s \n " , e_data . uuid_list [ x ] ) ;
2008-04-11 22:35:30 +00:00
if ( ( file = switch_channel_get_variable ( channel , " eavesdrop_indicate_new " ) ) ) {
switch_ivr_play_file ( session , NULL , file , NULL ) ;
}
2008-04-12 16:17:09 +00:00
if ( ( status = switch_ivr_eavesdrop_session ( session , e_data . uuid_list [ x ] , require_group , ED_DTMF ) ) ! = SWITCH_STATUS_SUCCESS ) {
if ( status ! = SWITCH_STATUS_BREAK ) {
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_ERROR , " Spy: %s Failed \n " , e_data . uuid_list [ x ] ) ;
2008-04-12 16:17:09 +00:00
if ( ( file = switch_channel_get_variable ( channel , " eavesdrop_indicate_failed " ) ) ) {
switch_ivr_play_file ( session , NULL , file , NULL ) ;
}
switch_ivr_collect_digits_count ( session , buf , buflen , 1 , " * " , & terminator , 5000 , 0 , 0 ) ;
2008-04-11 22:35:30 +00:00
}
}
}
} else {
if ( ( file = switch_channel_get_variable ( channel , " eavesdrop_indicate_idle " ) ) ) {
switch_ivr_play_file ( session , NULL , file , NULL ) ;
}
switch_ivr_collect_digits_count ( session , buf , buflen , 1 , " * " , & terminator , 2000 , 0 , 0 ) ;
}
}
2008-05-27 04:54:52 +00:00
for ( x = 0 ; x < MAX_SPY ; x + + ) {
2008-04-11 22:35:30 +00:00
switch_safe_free ( e_data . uuid_list [ x ] ) ;
}
2009-04-01 20:11:36 +00:00
free ( sql ) ;
2008-04-11 22:35:30 +00:00
switch_core_db_close ( db ) ;
2008-05-27 04:54:52 +00:00
2008-04-11 22:35:30 +00:00
} else {
2008-04-12 16:17:09 +00:00
switch_ivr_eavesdrop_session ( session , data , require_group , ED_DTMF ) ;
2008-04-11 22:35:30 +00:00
}
2007-11-30 22:56:01 +00:00
}
}
2008-04-12 04:59:15 +00:00
# define threeway_SYNTAX "<uuid>"
2008-01-10 00:45:28 +00:00
SWITCH_STANDARD_APP ( three_way_function )
{
if ( switch_strlen_zero ( data ) ) {
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_ERROR , " Usage: %s \n " , threeway_SYNTAX ) ;
2008-01-10 00:45:28 +00:00
} else {
2008-04-12 16:17:09 +00:00
switch_ivr_eavesdrop_session ( session , data , NULL , ED_MUX_READ | ED_MUX_WRITE ) ;
2008-01-10 00:45:28 +00:00
}
}
2007-11-13 19:58:44 +00:00
# define SET_USER_SYNTAX "<user>@<domain>"
SWITCH_STANDARD_APP ( set_user_function )
{
2008-07-16 17:44:54 +00:00
switch_ivr_set_user ( session , data ) ;
2007-11-13 19:58:44 +00:00
}
2007-06-20 05:39:50 +00:00
SWITCH_STANDARD_APP ( ring_ready_function )
2006-11-28 02:23:26 +00:00
{
2008-01-28 07:26:10 +00:00
switch_channel_ring_ready ( switch_core_session_get_channel ( session ) ) ;
2006-11-28 02:23:26 +00:00
}
2008-07-29 15:19:58 +00:00
SWITCH_STANDARD_APP ( remove_bugs_function )
{
switch_core_media_bug_remove_all ( session ) ;
}
2007-06-25 21:25:33 +00:00
SWITCH_STANDARD_APP ( break_function )
{
2009-01-29 21:52:20 +00:00
switch_channel_t * channel ;
channel = switch_core_session_get_channel ( session ) ;
if ( data & & strcasecmp ( data , " all " ) ) {
switch_core_session_flush_private_events ( session ) ;
}
if ( switch_channel_test_flag ( channel , CF_BROADCAST ) ) {
switch_channel_stop_broadcast ( channel ) ;
} else {
switch_channel_set_flag ( channel , CF_BREAK ) ;
}
2007-06-25 21:25:33 +00:00
}
2007-06-20 05:39:50 +00:00
SWITCH_STANDARD_APP ( queue_dtmf_function )
2007-01-29 20:06:23 +00:00
{
2008-01-28 07:26:10 +00:00
switch_channel_queue_dtmf_string ( switch_core_session_get_channel ( session ) , ( const char * ) data ) ;
2008-01-12 20:30:48 +00:00
}
2007-12-22 00:32:20 +00:00
2008-01-12 20:30:48 +00:00
SWITCH_STANDARD_APP ( send_dtmf_function )
{
switch_core_session_send_dtmf_string ( session , ( const char * ) data ) ;
2007-01-29 20:06:23 +00:00
}
2008-03-26 22:14:09 +00:00
SWITCH_STANDARD_APP ( check_acl_function )
{
int argc ;
2008-05-27 04:54:52 +00:00
char * argv [ 3 ] = { 0 } ;
2008-03-26 22:14:09 +00:00
char * mydata ;
switch_call_cause_t cause = SWITCH_CAUSE_CALL_REJECTED ;
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 ( ! switch_check_network_list_ip ( argv [ 0 ] , argv [ 1 ] ) ) {
switch_channel_t * channel = switch_core_session_get_channel ( session ) ;
if ( argc > 2 ) {
cause = switch_channel_str2cause ( argv [ 2 ] ) ;
}
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_DEBUG , " Call failed acl check for ip %s on list %s \n " , argv [ 0 ] , argv [ 1 ] ) ;
2008-03-26 22:14:09 +00:00
switch_channel_hangup ( channel , cause ) ;
}
}
}
2008-05-27 04:54:52 +00:00
2008-03-26 22:14:09 +00:00
}
2008-11-05 17:25:54 +00:00
SWITCH_STANDARD_APP ( flush_dtmf_function )
{
switch_channel_flush_dtmf ( switch_core_session_get_channel ( session ) ) ;
}
2007-06-20 05:39:50 +00:00
SWITCH_STANDARD_APP ( transfer_function )
2006-11-28 02:23:26 +00:00
{
int argc ;
2007-03-29 22:31:56 +00:00
char * argv [ 4 ] = { 0 } ;
2006-11-28 02:23:26 +00:00
char * mydata ;
2008-03-12 00:30:52 +00:00
int bleg = 0 , both = 0 ;
2006-11-28 02:23:26 +00:00
2008-05-27 04:54:52 +00:00
2008-01-06 22:14:10 +00:00
if ( ! switch_strlen_zero ( data ) & & ( mydata = switch_core_session_strdup ( session , data ) ) ) {
2006-11-28 02:23:26 +00:00
if ( ( argc = switch_separate_string ( mydata , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ) > = 1 ) {
2008-03-12 00:30:52 +00:00
bleg = ! strcasecmp ( argv [ 0 ] , " -bleg " ) ;
both = ! strcasecmp ( argv [ 0 ] , " -both " ) ;
if ( bleg | | both ) {
2008-03-11 22:19:17 +00:00
const char * uuid ;
2008-05-27 04:54:52 +00:00
switch_channel_t * channel = switch_core_session_get_channel ( session ) ;
2008-03-11 22:19:17 +00:00
if ( ( uuid = switch_channel_get_variable ( channel , SWITCH_SIGNAL_BOND_VARIABLE ) ) ) {
switch_core_session_t * b_session ;
if ( ( b_session = switch_core_session_locate ( uuid ) ) ) {
switch_ivr_session_transfer ( b_session , argv [ 1 ] , argv [ 2 ] , argv [ 3 ] ) ;
switch_core_session_rwunlock ( b_session ) ;
}
2008-03-13 01:08:42 +00:00
} else {
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_WARNING , " No B-leg present. \n " ) ;
2008-03-11 22:19:17 +00:00
}
2008-03-12 00:30:52 +00:00
if ( both ) {
switch_ivr_session_transfer ( session , argv [ 1 ] , argv [ 2 ] , argv [ 3 ] ) ;
}
2008-03-11 22:19:17 +00:00
} else {
switch_ivr_session_transfer ( session , argv [ 0 ] , argv [ 1 ] , argv [ 2 ] ) ;
}
2006-11-28 02:23:26 +00:00
} else {
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_ERROR , " No extension specified. \n " ) ;
2006-11-28 02:23:26 +00:00
}
}
}
2007-06-20 05:39:50 +00:00
SWITCH_STANDARD_APP ( sched_transfer_function )
2007-03-28 23:37:12 +00:00
{
int argc ;
2007-03-29 22:31:56 +00:00
char * argv [ 4 ] = { 0 } ;
2007-03-28 23:37:12 +00:00
char * mydata ;
2007-03-29 22:31:56 +00:00
2008-01-06 22:14:10 +00:00
if ( ! switch_strlen_zero ( data ) & & ( mydata = switch_core_session_strdup ( session , data ) ) ) {
2007-03-28 23:37:12 +00:00
if ( ( argc = switch_separate_string ( mydata , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ) > = 2 ) {
time_t when ;
if ( * argv [ 0 ] = = ' + ' ) {
2009-01-25 21:23:07 +00:00
when = switch_epoch_time_now ( NULL ) + atol ( argv [ 0 ] + 1 ) ;
2007-03-28 23:37:12 +00:00
} else {
when = atol ( argv [ 0 ] ) ;
}
switch_ivr_schedule_transfer ( when , switch_core_session_get_uuid ( session ) , argv [ 1 ] , argv [ 2 ] , argv [ 3 ] ) ;
} else {
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_ERROR , " Invalid Args \n " ) ;
2007-03-28 23:37:12 +00:00
}
}
}
2007-06-20 05:39:50 +00:00
SWITCH_STANDARD_APP ( sched_hangup_function )
2007-03-28 23:37:12 +00:00
{
int argc ;
2007-03-29 22:31:56 +00:00
char * argv [ 5 ] = { 0 } ;
2007-03-28 23:37:12 +00:00
char * mydata ;
2008-01-06 22:14:10 +00:00
if ( ! switch_strlen_zero ( data ) & & ( mydata = switch_core_session_strdup ( session , data ) ) ) {
2007-03-28 23:37:12 +00:00
if ( ( argc = switch_separate_string ( mydata , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ) > = 1 ) {
time_t when ;
switch_call_cause_t cause = SWITCH_CAUSE_ALLOTTED_TIMEOUT ;
switch_bool_t bleg = SWITCH_FALSE ;
if ( * argv [ 0 ] = = ' + ' ) {
2009-01-25 21:23:07 +00:00
when = switch_epoch_time_now ( NULL ) + atol ( argv [ 0 ] + 1 ) ;
2007-03-28 23:37:12 +00:00
} else {
when = atol ( argv [ 0 ] ) ;
}
2007-03-29 22:31:56 +00:00
2007-03-28 23:37:12 +00:00
if ( argv [ 1 ] ) {
cause = switch_channel_str2cause ( argv [ 1 ] ) ;
}
if ( argv [ 2 ] & & ! strcasecmp ( argv [ 2 ] , " bleg " ) ) {
bleg = SWITCH_TRUE ;
}
switch_ivr_schedule_hangup ( when , switch_core_session_get_uuid ( session ) , cause , bleg ) ;
} else {
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_ERROR , " No time specified. \n " ) ;
2007-03-28 23:37:12 +00:00
}
}
}
2007-06-20 05:39:50 +00:00
SWITCH_STANDARD_APP ( sched_broadcast_function )
2007-03-28 23:37:12 +00:00
{
int argc ;
2007-03-29 22:31:56 +00:00
char * argv [ 6 ] = { 0 } ;
2007-03-28 23:37:12 +00:00
char * mydata ;
2008-01-06 22:14:10 +00:00
if ( ! switch_strlen_zero ( data ) & & ( mydata = switch_core_session_strdup ( session , data ) ) ) {
2007-03-28 23:37:12 +00:00
if ( ( argc = switch_separate_string ( mydata , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ) > = 2 ) {
time_t when ;
switch_media_flag_t flags = SMF_NONE ;
2007-03-29 22:31:56 +00:00
2007-03-28 23:37:12 +00:00
if ( * argv [ 0 ] = = ' + ' ) {
2009-01-25 21:23:07 +00:00
when = switch_epoch_time_now ( NULL ) + atol ( argv [ 0 ] + 1 ) ;
2007-03-28 23:37:12 +00:00
} else {
when = atol ( argv [ 0 ] ) ;
}
2007-03-29 22:31:56 +00:00
2007-03-28 23:37:12 +00:00
if ( argv [ 2 ] ) {
if ( ! strcmp ( argv [ 2 ] , " both " ) ) {
flags | = ( SMF_ECHO_ALEG | SMF_ECHO_BLEG ) ;
} else if ( ! strcmp ( argv [ 2 ] , " aleg " ) ) {
flags | = SMF_ECHO_ALEG ;
} else if ( ! strcmp ( argv [ 2 ] , " bleg " ) ) {
flags | = SMF_ECHO_BLEG ;
}
} else {
flags | = SMF_ECHO_ALEG ;
}
switch_ivr_schedule_broadcast ( when , switch_core_session_get_uuid ( session ) , argv [ 1 ] , flags ) ;
} else {
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_ERROR , " Invalid Args \n " ) ;
2007-03-28 23:37:12 +00:00
}
}
}
2007-10-04 15:09:44 +00:00
SWITCH_STANDARD_APP ( delay_function )
{
uint32_t len = 0 ;
if ( switch_strlen_zero ( data ) ) {
len = 1000 ;
} else {
len = atoi ( data ) ;
}
2008-05-27 04:54:52 +00:00
2007-10-04 15:09:44 +00:00
switch_ivr_delay_echo ( session , len ) ;
}
2007-06-20 05:39:50 +00:00
SWITCH_STANDARD_APP ( eval_function )
2006-11-28 02:23:26 +00:00
{
return ;
}
2006-12-20 21:25:14 +00:00
2007-06-20 05:39:50 +00:00
SWITCH_STANDARD_APP ( hangup_function )
2007-01-02 18:56:39 +00:00
{
2007-03-29 22:31:56 +00:00
switch_call_cause_t cause = SWITCH_CAUSE_NORMAL_CLEARING ;
2007-01-02 18:56:39 +00:00
2008-01-06 22:14:10 +00:00
if ( ! switch_strlen_zero ( data ) ) {
cause = switch_channel_str2cause ( data ) ;
2007-03-29 22:31:56 +00:00
}
2007-01-02 18:56:39 +00:00
2008-01-28 07:26:10 +00:00
switch_channel_hangup ( switch_core_session_get_channel ( session ) , cause ) ;
2007-01-02 18:56:39 +00:00
}
2008-02-26 23:29:58 +00:00
SWITCH_STANDARD_APP ( set_name_function )
{
if ( ! switch_strlen_zero ( data ) ) {
switch_channel_set_name ( switch_core_session_get_channel ( session ) , ( char * ) data ) ;
}
}
2007-06-20 05:39:50 +00:00
SWITCH_STANDARD_APP ( answer_function )
2006-11-28 02:23:26 +00:00
{
2008-10-09 23:11:35 +00:00
switch_channel_t * channel = switch_core_session_get_channel ( session ) ;
switch_channel_clear_flag ( channel , CF_PROXY_MEDIA ) ;
switch_channel_clear_flag ( channel , CF_PROXY_MODE ) ;
switch_channel_answer ( channel ) ;
2006-11-28 02:23:26 +00:00
}
2008-08-25 16:30:28 +00:00
SWITCH_STANDARD_APP ( presence_function )
{
char * argv [ 6 ] = { 0 } ;
2009-01-13 23:48:55 +00:00
int argc ;
char * mydata = NULL ;
2008-08-25 16:30:28 +00:00
switch_channel_t * channel = switch_core_session_get_channel ( session ) ;
if ( switch_strlen_zero ( data ) | | ! ( mydata = switch_core_session_strdup ( session , data ) ) ) {
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_ERROR , " INVALID ARGS! \n " ) ;
2009-01-13 23:48:55 +00:00
return ;
}
2008-08-25 16:30:28 +00:00
if ( ( argc = switch_separate_string ( mydata , ' ' , argv , sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) < 2 ) {
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_ERROR , " INVALID ARGS! \n " ) ;
2008-08-25 16:30:28 +00:00
return ;
}
switch_channel_presence ( channel , argv [ 0 ] , argv [ 1 ] , argv [ 2 ] ) ;
}
2007-06-20 05:39:50 +00:00
SWITCH_STANDARD_APP ( pre_answer_function )
2007-02-10 19:34:03 +00:00
{
2008-10-09 23:11:35 +00:00
switch_channel_t * channel = switch_core_session_get_channel ( session ) ;
switch_channel_clear_flag ( channel , CF_PROXY_MEDIA ) ;
switch_channel_clear_flag ( channel , CF_PROXY_MODE ) ;
switch_channel_pre_answer ( channel ) ;
2007-02-10 19:34:03 +00:00
}
2007-06-20 05:39:50 +00:00
SWITCH_STANDARD_APP ( redirect_function )
2007-01-10 21:26:10 +00:00
{
2007-03-29 22:31:56 +00:00
switch_core_session_message_t msg = { 0 } ;
2007-01-10 21:26:10 +00:00
2007-03-29 22:31:56 +00:00
/* Tell the channel to redirect */
2007-01-10 21:26:10 +00:00
msg . from = __FILE__ ;
msg . string_arg = data ;
2007-03-29 22:31:56 +00:00
msg . message_id = SWITCH_MESSAGE_INDICATE_REDIRECT ;
2007-01-10 21:26:10 +00:00
switch_core_session_receive_message ( session , & msg ) ;
}
2008-03-11 03:45:16 +00:00
SWITCH_STANDARD_APP ( display_function )
{
switch_core_session_message_t msg = { 0 } ;
/* Tell the channel to redirect */
msg . from = __FILE__ ;
msg . string_arg = data ;
msg . message_id = SWITCH_MESSAGE_INDICATE_DISPLAY ;
switch_core_session_receive_message ( session , & msg ) ;
}
2008-01-03 00:50:53 +00:00
SWITCH_STANDARD_APP ( respond_function )
2007-04-21 15:04:01 +00:00
{
switch_core_session_message_t msg = { 0 } ;
2008-01-03 00:50:53 +00:00
/* Tell the channel to respond the call */
2007-04-21 15:04:01 +00:00
msg . from = __FILE__ ;
msg . string_arg = data ;
2008-01-03 00:50:53 +00:00
msg . message_id = SWITCH_MESSAGE_INDICATE_RESPOND ;
2007-04-21 15:04:01 +00:00
switch_core_session_receive_message ( session , & msg ) ;
}
2008-01-03 23:42:15 +00:00
SWITCH_STANDARD_APP ( deflect_function )
{
switch_core_session_message_t msg = { 0 } ;
2008-01-06 22:14:10 +00:00
/* Tell the channel to deflect the call */
2008-01-03 23:42:15 +00:00
msg . from = __FILE__ ;
msg . string_arg = data ;
msg . message_id = SWITCH_MESSAGE_INDICATE_DEFLECT ;
switch_core_session_receive_message ( session , & msg ) ;
}
2007-06-20 05:39:50 +00:00
SWITCH_STANDARD_APP ( set_function )
2006-11-28 02:23:26 +00:00
{
char * var , * val = NULL ;
2008-07-09 00:53:10 +00:00
2006-11-28 02:23:26 +00:00
if ( switch_strlen_zero ( data ) ) {
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_ERROR , " No variable name specified. \n " ) ;
2006-11-28 02:23:26 +00:00
} else {
2008-07-09 00:53:10 +00:00
switch_channel_t * channel = switch_core_session_get_channel ( session ) ;
char * expanded = NULL ;
2006-11-28 02:23:26 +00:00
var = switch_core_session_strdup ( session , data ) ;
val = strchr ( var , ' = ' ) ;
if ( val ) {
* val + + = ' \0 ' ;
2007-03-29 22:31:56 +00:00
if ( switch_strlen_zero ( val ) ) {
val = NULL ;
}
2006-11-28 02:23:26 +00:00
}
2007-03-29 22:31:56 +00:00
2008-07-09 00:53:10 +00:00
if ( val ) {
expanded = switch_channel_expand_variables ( channel , val ) ;
}
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_DEBUG , " %s SET [%s]=[%s] \n " , switch_channel_get_name ( channel ) , var , expanded ? expanded : " UNDEF " ) ;
2009-01-21 21:34:31 +00:00
switch_channel_set_variable_var_check ( channel , var , expanded , SWITCH_FALSE ) ;
2008-07-09 00:53:10 +00:00
if ( expanded & & expanded ! = val ) {
switch_safe_free ( expanded ) ;
}
2006-11-28 02:23:26 +00:00
}
}
2007-11-09 15:55:40 +00:00
SWITCH_STANDARD_APP ( set_global_function )
{
char * var , * val = NULL ;
if ( switch_strlen_zero ( data ) ) {
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_ERROR , " No variable name specified. \n " ) ;
2007-11-09 15:55:40 +00:00
} else {
var = strdup ( data ) ;
2007-12-12 03:21:14 +00:00
switch_assert ( var ) ;
2007-11-09 15:55:40 +00:00
val = strchr ( var , ' = ' ) ;
if ( val ) {
* val + + = ' \0 ' ;
if ( switch_strlen_zero ( val ) ) {
val = NULL ;
}
}
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_DEBUG , " SET GLOBAL [%s]=[%s] \n " , var , val ? val : " UNDEF " ) ;
2007-11-09 15:55:40 +00:00
switch_core_set_variable ( var , val ) ;
free ( var ) ;
}
}
2007-08-22 00:22:22 +00:00
SWITCH_STANDARD_APP ( set_profile_var_function )
{
switch_caller_profile_t * caller_profile ;
char * name , * val = NULL ;
2008-01-28 07:26:10 +00:00
caller_profile = switch_channel_get_caller_profile ( switch_core_session_get_channel ( session ) ) ;
2007-08-22 00:22:22 +00:00
if ( switch_strlen_zero ( data ) ) {
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_ERROR , " No variable name specified. \n " ) ;
2007-08-22 00:22:22 +00:00
} else {
name = switch_core_session_strdup ( session , data ) ;
val = strchr ( name , ' = ' ) ;
if ( val ) {
* val + + = ' \0 ' ;
if ( switch_strlen_zero ( val ) ) {
val = NULL ;
}
}
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_DEBUG , " SET_PROFILE_VAR [%s]=[%s] \n " , name , val ? val : " UNDEF " ) ;
2007-08-22 00:22:22 +00:00
if ( ! strcasecmp ( name , " dialplan " ) ) {
caller_profile - > dialplan = val ;
}
if ( ! strcasecmp ( name , " username " ) ) {
caller_profile - > username = val ;
}
if ( ! strcasecmp ( name , " caller_id_name " ) ) {
caller_profile - > caller_id_name = val ;
}
if ( ! strcasecmp ( name , " caller_id_number " ) ) {
caller_profile - > caller_id_number = val ;
}
2008-05-19 22:11:37 +00:00
if ( val & & ! strcasecmp ( name , " caller_ton " ) ) {
2008-05-27 04:54:52 +00:00
caller_profile - > caller_ton = ( uint8_t ) atoi ( val ) ;
2007-08-22 00:22:22 +00:00
}
2008-05-19 22:11:37 +00:00
if ( val & & ! strcasecmp ( name , " caller_numplan " ) ) {
2008-05-27 04:54:52 +00:00
caller_profile - > caller_numplan = ( uint8_t ) atoi ( val ) ;
2007-08-22 00:22:22 +00:00
}
2008-05-19 22:11:37 +00:00
if ( val & & ! strcasecmp ( name , " destination_number_ton " ) ) {
2008-05-27 04:54:52 +00:00
caller_profile - > destination_number_ton = ( uint8_t ) atoi ( val ) ;
2007-08-22 00:22:22 +00:00
}
2008-05-19 22:11:37 +00:00
if ( val & & ! strcasecmp ( name , " destination_number_numplan " ) ) {
2008-05-27 04:54:52 +00:00
caller_profile - > destination_number_numplan = ( uint8_t ) atoi ( val ) ;
2007-08-22 00:22:22 +00:00
}
if ( ! strcasecmp ( name , " ani " ) ) {
caller_profile - > ani = val ;
}
if ( ! strcasecmp ( name , " aniii " ) ) {
caller_profile - > aniii = val ;
}
if ( ! strcasecmp ( name , " network_addr " ) ) {
caller_profile - > network_addr = val ;
}
if ( ! strcasecmp ( name , " rdnis " ) ) {
caller_profile - > rdnis = val ;
}
if ( ! strcasecmp ( name , " destination_number " ) ) {
caller_profile - > destination_number = val ;
}
if ( ! strcasecmp ( name , " uuid " ) ) {
caller_profile - > uuid = val ;
}
if ( ! strcasecmp ( name , " source " ) ) {
caller_profile - > source = val ;
}
if ( ! strcasecmp ( name , " context " ) ) {
caller_profile - > context = val ;
}
if ( ! strcasecmp ( name , " chan_name " ) ) {
caller_profile - > chan_name = val ;
}
}
}
2007-06-20 05:39:50 +00:00
SWITCH_STANDARD_APP ( export_function )
2007-02-16 20:07:35 +00:00
{
2008-01-28 07:26:10 +00:00
switch_channel_t * channel = switch_core_session_get_channel ( session ) ;
2007-11-01 11:28:26 +00:00
const char * exports ;
char * new_exports = NULL , * new_exports_d = NULL , * var , * val = NULL , * var_name = NULL ;
2007-05-09 22:13:18 +00:00
int local = 1 ;
2007-02-16 20:07:35 +00:00
if ( switch_strlen_zero ( data ) ) {
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_ERROR , " No variable name specified. \n " ) ;
2007-02-16 20:07:35 +00:00
} else {
exports = switch_channel_get_variable ( channel , SWITCH_EXPORT_VARS_VARIABLE ) ;
var = switch_core_session_strdup ( session , data ) ;
2008-05-19 22:17:10 +00:00
if ( var ) {
val = strchr ( var , ' = ' ) ;
if ( ! strncasecmp ( var , " nolocal: " , 8 ) ) {
var_name = var + 8 ;
local = 0 ;
} else {
var_name = var ;
}
}
2007-02-16 20:07:35 +00:00
if ( val ) {
* val + + = ' \0 ' ;
2007-03-29 22:31:56 +00:00
if ( switch_strlen_zero ( val ) ) {
val = NULL ;
}
2007-02-16 20:07:35 +00:00
}
2007-03-29 22:31:56 +00:00
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_DEBUG , " EXPORT %s[%s]=[%s] \n " , local ? " " : " (REMOTE ONLY) " , var_name ? var_name : " " ,
2008-05-27 04:54:52 +00:00
val ? val : " UNDEF " ) ;
2007-02-16 20:07:35 +00:00
switch_channel_set_variable ( channel , var , val ) ;
if ( var & & val ) {
if ( exports ) {
new_exports_d = switch_mprintf ( " %s,%s " , exports , var ) ;
new_exports = new_exports_d ;
} else {
new_exports = var ;
}
2007-05-10 14:11:26 +00:00
switch_channel_set_variable ( channel , SWITCH_EXPORT_VARS_VARIABLE , new_exports ) ;
2007-02-16 20:07:35 +00:00
switch_safe_free ( new_exports_d ) ;
}
}
}
2007-02-05 19:35:31 +00:00
2007-06-20 05:39:50 +00:00
SWITCH_STANDARD_APP ( unset_function )
2007-02-05 19:35:31 +00:00
{
if ( switch_strlen_zero ( data ) ) {
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_ERROR , " No variable name specified. \n " ) ;
2007-02-05 19:35:31 +00:00
} else {
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_DEBUG , " UNSET [%s] \n " , ( char * ) data ) ;
2008-01-28 07:26:10 +00:00
switch_channel_set_variable ( switch_core_session_get_channel ( session ) , data , NULL ) ;
2007-02-05 19:35:31 +00:00
}
}
2007-06-20 05:39:50 +00:00
SWITCH_STANDARD_APP ( log_function )
2006-11-28 02:23:26 +00:00
{
2007-03-29 22:31:56 +00:00
char * level , * log_str ;
2006-11-28 02:23:26 +00:00
2007-03-29 22:31:56 +00:00
if ( data & & ( level = strdup ( data ) ) ) {
2007-05-04 02:14:40 +00:00
switch_log_level_t ltype = SWITCH_LOG_DEBUG ;
2007-03-29 22:31:56 +00:00
if ( ( log_str = strchr ( level , ' ' ) ) ) {
* log_str + + = ' \0 ' ;
2007-05-04 02:14:40 +00:00
ltype = switch_log_str2level ( level ) ;
2007-03-29 22:31:56 +00:00
} else {
log_str = level ;
}
2007-12-10 19:16:50 +00:00
if ( ltype = = SWITCH_LOG_INVALID ) {
ltype = SWITCH_LOG_DEBUG ;
}
2007-03-29 22:31:56 +00:00
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , ltype , " %s \n " , log_str ) ;
2007-03-29 22:31:56 +00:00
switch_safe_free ( level ) ;
}
2006-11-28 02:23:26 +00:00
}
2007-06-20 05:39:50 +00:00
SWITCH_STANDARD_APP ( info_function )
2006-11-28 02:23:26 +00:00
{
2007-03-29 22:31:56 +00:00
switch_event_t * event ;
char * buf ;
2006-11-28 02:23:26 +00:00
2009-03-24 23:44:03 +00:00
if ( switch_event_create_plain ( & event , SWITCH_EVENT_CHANNEL_DATA ) = = SWITCH_STATUS_SUCCESS ) {
2008-01-28 07:26:10 +00:00
switch_channel_event_set_data ( switch_core_session_get_channel ( session ) , event ) ;
2007-12-11 22:19:49 +00:00
switch_event_serialize ( event , & buf , SWITCH_FALSE ) ;
switch_assert ( buf ) ;
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_INFO , " CHANNEL_DATA: \n %s \n " , buf ) ;
2007-03-29 22:31:56 +00:00
switch_event_destroy ( & event ) ;
2007-12-11 22:19:49 +00:00
free ( buf ) ;
2007-03-29 22:31:56 +00:00
}
2006-11-28 02:23:26 +00:00
}
2009-02-05 19:53:13 +00:00
SWITCH_STANDARD_APP ( sound_test_function )
{
switch_ivr_sound_test ( session ) ;
}
2007-06-23 05:41:07 +00:00
SWITCH_STANDARD_APP ( event_function )
{
switch_event_t * event ;
2008-01-06 22:14:10 +00:00
char * argv [ 25 ] = { 0 } ;
2007-06-23 05:41:07 +00:00
int argc = 0 ;
char * lbuf ;
if ( switch_event_create ( & event , SWITCH_EVENT_CHANNEL_APPLICATION ) = = SWITCH_STATUS_SUCCESS ) {
2008-01-06 22:14:10 +00:00
if ( ! switch_strlen_zero ( data ) & & ( lbuf = switch_core_session_strdup ( session , data ) )
2007-06-23 05:41:07 +00:00
& & ( argc = switch_separate_string ( lbuf , ' , ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ) ) {
int x = 0 ;
for ( x = 0 ; x < argc ; x + + ) {
char * p , * this = argv [ x ] ;
if ( this ) {
2008-05-19 22:26:59 +00:00
char * var , * val ;
p = this ;
2008-05-27 04:54:52 +00:00
while ( * p = = ' ' )
* p + + = ' \0 ' ;
2008-05-19 22:26:59 +00:00
this = p ;
2008-05-27 04:54:52 +00:00
2008-05-19 22:26:59 +00:00
var = this ;
val = NULL ;
2007-06-23 05:41:07 +00:00
if ( ( val = strchr ( var , ' = ' ) ) ) {
p = val - 1 ;
* val + + = ' \0 ' ;
2008-05-27 04:54:52 +00:00
while ( * p = = ' ' )
* p - - = ' \0 ' ;
2007-06-23 05:41:07 +00:00
p = val ;
2008-05-27 04:54:52 +00:00
while ( * p = = ' ' )
* p + + = ' \0 ' ;
2007-06-23 05:41:07 +00:00
val = p ;
2009-04-02 19:40:26 +00:00
if ( ! strcasecmp ( var , " Event-Name " ) ) {
switch_name_event ( val , & event - > event_id ) ;
switch_event_del_header ( event , var ) ;
2009-04-21 01:02:45 +00:00
switch_event_add_header_string ( event , SWITCH_STACK_BOTTOM , var , val ) ;
2009-04-02 19:40:26 +00:00
} else if ( ! strcasecmp ( var , " Event-Subclass " ) ) {
size_t len = strlen ( val ) + 1 ;
void * new = malloc ( len ) ;
switch_assert ( new ) ;
memcpy ( new , val , len ) ;
event - > subclass_name = new ;
} else {
2009-04-21 01:02:45 +00:00
switch_event_add_header_string ( event , SWITCH_STACK_BOTTOM , var , val ) ;
2009-04-02 19:40:26 +00:00
}
2007-06-23 05:41:07 +00:00
}
}
}
}
2009-04-02 19:40:26 +00:00
switch_channel_event_set_data ( switch_core_session_get_channel ( session ) , event ) ;
2007-06-23 05:41:07 +00:00
switch_event_fire ( & event ) ;
}
}
2007-06-20 05:39:50 +00:00
SWITCH_STANDARD_APP ( privacy_function )
2006-11-28 02:23:26 +00:00
{
2008-01-28 07:26:10 +00:00
switch_caller_profile_t * caller_profile = switch_channel_get_caller_profile ( switch_core_session_get_channel ( session ) ) ;
2006-11-28 02:23:26 +00:00
if ( switch_strlen_zero ( data ) ) {
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_ERROR , " No privacy mode specified. \n " ) ;
2006-11-28 02:23:26 +00:00
} else {
switch_set_flag ( caller_profile , SWITCH_CPF_SCREEN ) ;
2009-03-04 21:22:41 +00:00
if ( ! strcasecmp ( data , " full " ) ) {
2006-11-28 02:23:26 +00:00
switch_set_flag ( caller_profile , SWITCH_CPF_HIDE_NAME | SWITCH_CPF_HIDE_NUMBER ) ;
2008-01-06 22:14:10 +00:00
} else if ( ! strcasecmp ( data , " name " ) ) {
2006-11-28 02:23:26 +00:00
switch_set_flag ( caller_profile , SWITCH_CPF_HIDE_NAME ) ;
2008-01-06 22:14:10 +00:00
} else if ( ! strcasecmp ( data , " number " ) ) {
2006-11-28 02:23:26 +00:00
switch_set_flag ( caller_profile , SWITCH_CPF_HIDE_NUMBER ) ;
2009-03-04 21:22:41 +00:00
} else if ( switch_true ( data ) ) {
switch_set_flag ( caller_profile , SWITCH_CPF_HIDE_NAME | SWITCH_CPF_HIDE_NUMBER ) ;
} else if ( switch_false ( data ) ) {
switch_clear_flag ( caller_profile , SWITCH_CPF_HIDE_NAME ) ;
switch_clear_flag ( caller_profile , SWITCH_CPF_HIDE_NUMBER ) ;
2006-11-28 02:23:26 +00:00
} else {
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_ERROR , " INVALID privacy mode specified. Use a valid mode [no|yes|name|full|number]. \n " ) ;
2006-11-28 02:23:26 +00:00
}
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_DEBUG , " Set Privacy to %s [%d] \n " , data , caller_profile - > flags ) ;
2006-11-28 02:23:26 +00:00
}
}
2007-06-20 05:39:50 +00:00
SWITCH_STANDARD_APP ( strftime_function )
2006-11-28 02:23:26 +00:00
{
2008-01-06 22:14:10 +00:00
char * argv [ 2 ] = { 0 } ;
2006-11-28 02:23:26 +00:00
int argc ;
char * lbuf ;
2008-01-06 22:14:10 +00:00
if ( ! switch_strlen_zero ( data ) & & ( lbuf = switch_core_session_strdup ( session , data ) )
2007-03-29 22:31:56 +00:00
& & ( argc = switch_separate_string ( lbuf , ' = ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ) > 1 ) {
2006-11-28 02:23:26 +00:00
switch_size_t retsize ;
switch_time_exp_t tm ;
char date [ 80 ] = " " ;
2009-01-25 21:23:07 +00:00
switch_time_exp_lt ( & tm , switch_micro_time_now ( ) ) ;
2006-11-28 02:23:26 +00:00
switch_strftime ( date , & retsize , sizeof ( date ) , argv [ 1 ] , & tm ) ;
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_DEBUG , " SET [%s]=[%s] \n " , argv [ 0 ] , date ) ;
2008-01-28 07:26:10 +00:00
switch_channel_set_variable ( switch_core_session_get_channel ( session ) , argv [ 0 ] , date ) ;
2006-11-28 02:23:26 +00:00
}
}
2007-05-12 21:36:15 +00:00
SWITCH_STANDARD_API ( strepoch_api_function )
2007-01-03 00:21:17 +00:00
{
2007-03-29 22:31:56 +00:00
switch_time_t out ;
2007-05-12 21:36:15 +00:00
if ( switch_strlen_zero ( cmd ) ) {
2009-01-25 21:23:07 +00:00
out = switch_micro_time_now ( ) ;
2007-03-29 22:31:56 +00:00
} else {
2007-05-12 21:36:15 +00:00
out = switch_str_time ( cmd ) ;
2007-03-29 22:31:56 +00:00
}
2007-01-03 00:21:17 +00:00
2007-03-29 22:31:56 +00:00
stream - > write_function ( stream , " %d " , ( uint32_t ) ( ( out ) / ( int64_t ) ( 1000000 ) ) ) ;
2007-01-05 16:49:36 +00:00
return SWITCH_STATUS_SUCCESS ;
2007-01-03 00:21:17 +00:00
}
2007-05-12 21:36:15 +00:00
SWITCH_STANDARD_API ( strftime_api_function )
2006-11-28 02:23:26 +00:00
{
switch_size_t retsize ;
switch_time_exp_t tm ;
char date [ 80 ] = " " ;
2007-10-12 03:28:59 +00:00
switch_time_t thetime ;
char * p ;
if ( ! switch_strlen_zero ( cmd ) & & ( p = strchr ( cmd , ' | ' ) ) ) {
2008-05-27 04:54:52 +00:00
thetime = switch_time_make ( atoi ( cmd ) , 0 ) ;
cmd = p + 1 ;
2007-10-12 03:28:59 +00:00
} else {
2009-01-25 21:23:07 +00:00
thetime = switch_micro_time_now ( ) ;
2007-10-12 03:28:59 +00:00
}
switch_time_exp_lt ( & tm , thetime ) ;
2008-10-12 21:51:51 +00:00
if ( switch_strlen_zero ( cmd ) ) {
switch_strftime_nocheck ( date , & retsize , sizeof ( date ) , " %Y-%m-%d %T " , & tm ) ;
} else {
switch_strftime ( date , & retsize , sizeof ( date ) , cmd , & tm ) ;
}
2007-01-03 00:21:17 +00:00
stream - > write_function ( stream , " %s " , date ) ;
2006-11-28 02:23:26 +00:00
return SWITCH_STATUS_SUCCESS ;
}
2009-04-27 15:52:34 +00:00
# define PRESENCE_USAGE "[in|out] <user> <rpid> <message>"
2007-05-12 21:36:15 +00:00
SWITCH_STANDARD_API ( presence_api_function )
2006-11-28 02:23:26 +00:00
{
switch_event_t * event ;
2009-05-27 01:57:16 +00:00
char * lbuf = NULL , * argv [ 4 ] ;
2006-11-28 02:23:26 +00:00
int argc = 0 ;
switch_event_types_t type = SWITCH_EVENT_PRESENCE_IN ;
2009-04-27 15:52:34 +00:00
int need = 4 ;
2006-11-28 02:23:26 +00:00
2008-01-06 22:14:10 +00:00
if ( ! switch_strlen_zero ( cmd ) & & ( lbuf = strdup ( cmd ) )
2009-04-27 15:52:34 +00:00
& & ( argc = switch_separate_string ( lbuf , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ) > 0 ) {
2006-11-28 02:23:26 +00:00
if ( ! strcasecmp ( argv [ 0 ] , " out " ) ) {
type = SWITCH_EVENT_PRESENCE_OUT ;
2009-04-27 15:52:34 +00:00
need = 2 ;
} else if ( strcasecmp ( argv [ 0 ] , " in " ) ) {
goto error ;
}
2009-04-27 17:31:34 +00:00
if ( argc < need ) {
2009-04-27 15:52:34 +00:00
goto error ;
2006-11-28 02:23:26 +00:00
}
2007-03-29 22:31:56 +00:00
2006-11-28 02:23:26 +00:00
if ( switch_event_create ( & event , type ) = = SWITCH_STATUS_SUCCESS ) {
2008-08-16 02:19:43 +00:00
switch_event_add_header_string ( event , SWITCH_STACK_BOTTOM , " proto " , " dp " ) ;
switch_event_add_header_string ( event , SWITCH_STACK_BOTTOM , " login " , __FILE__ ) ;
switch_event_add_header_string ( event , SWITCH_STACK_BOTTOM , " from " , argv [ 1 ] ) ;
2009-04-27 17:31:34 +00:00
switch_event_add_header_string ( event , SWITCH_STACK_BOTTOM , " rpid " , argv [ 2 ] ) ;
switch_event_add_header_string ( event , SWITCH_STACK_BOTTOM , " status " , argv [ 3 ] ) ;
2006-11-28 02:23:26 +00:00
if ( type = = SWITCH_EVENT_PRESENCE_IN ) {
2009-04-27 17:31:34 +00:00
if ( ! strncasecmp ( argv [ 3 ] , " cs_ " , 3 ) | | switch_stristr ( " hangup " , argv [ 3 ] ) ) {
switch_event_add_header_string ( event , SWITCH_STACK_BOTTOM , " channel-state " , " CS_HANGUP " ) ;
switch_event_add_header_string ( event , SWITCH_STACK_BOTTOM , " status " , " CS_HANGUP " ) ;
}
} else {
switch_event_add_header_string ( event , SWITCH_STACK_BOTTOM , " status " , " CS_HANGUP " ) ;
2006-11-28 02:23:26 +00:00
}
2008-08-16 02:19:43 +00:00
switch_event_add_header_string ( event , SWITCH_STACK_BOTTOM , " event_type " , " presence " ) ;
2009-04-27 15:52:34 +00:00
switch_event_add_header_string ( event , SWITCH_STACK_BOTTOM , " alt_event_type " , " dialog " ) ;
2009-04-27 17:31:34 +00:00
switch_event_add_header ( event , SWITCH_STACK_BOTTOM , " event_count " , " %d " , 0 ) ;
2006-11-28 02:23:26 +00:00
switch_event_fire ( & event ) ;
}
stream - > write_function ( stream , " Event Sent " ) ;
} else {
2009-04-27 15:52:34 +00:00
goto error ;
2006-11-28 02:23:26 +00:00
}
2009-04-27 15:52:34 +00:00
2009-05-27 01:57:16 +00:00
switch_safe_free ( lbuf ) ;
2006-11-28 02:23:26 +00:00
return SWITCH_STATUS_SUCCESS ;
2009-04-27 15:52:34 +00:00
error :
2009-05-27 01:57:16 +00:00
switch_safe_free ( lbuf ) ;
2009-04-27 15:52:34 +00:00
stream - > write_function ( stream , " Invalid: presence %s " , PRESENCE_USAGE ) ;
return SWITCH_STATUS_SUCCESS ;
2006-11-28 02:23:26 +00:00
}
2007-05-12 21:36:15 +00:00
SWITCH_STANDARD_API ( chat_api_function )
2006-11-28 02:23:26 +00:00
{
2009-05-27 01:58:19 +00:00
char * lbuf = NULL , * argv [ 5 ] ;
2006-11-28 02:23:26 +00:00
int argc = 0 ;
2008-01-06 22:14:10 +00:00
if ( ! switch_strlen_zero ( cmd ) & & ( lbuf = strdup ( cmd ) )
2009-01-20 21:24:37 +00:00
& & ( argc = switch_separate_string ( lbuf , ' | ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ) > = 4 ) {
if ( switch_core_chat_send ( argv [ 0 ] , " dp " , argv [ 1 ] , argv [ 2 ] , " " , argv [ 3 ] ,
! switch_strlen_zero ( argv [ 4 ] ) ? argv [ 4 ] : NULL , " " ) = = SWITCH_STATUS_SUCCESS ) {
2009-01-20 20:49:47 +00:00
stream - > write_function ( stream , " Sent " ) ;
2006-11-28 02:23:26 +00:00
} else {
2009-01-20 20:49:47 +00:00
stream - > write_function ( stream , " Error! Message Not Sent " ) ;
2006-11-28 02:23:26 +00:00
}
} else {
stream - > write_function ( stream , " Invalid " ) ;
}
2007-03-29 22:31:56 +00:00
2009-05-27 01:58:19 +00:00
switch_safe_free ( lbuf ) ;
2006-11-28 02:23:26 +00:00
return SWITCH_STATUS_SUCCESS ;
}
2006-12-04 05:50:41 +00:00
static char * ivr_cf_name = " ivr.conf " ;
# ifdef _TEST_CALLBACK_
2008-05-27 04:54:52 +00:00
static switch_ivr_action_t menu_handler ( switch_ivr_menu_t * menu , char * param , char * buf , size_t buflen , void * obj )
2006-12-04 05:50:41 +00:00
{
switch_ivr_action_t action = SWITCH_IVR_ACTION_NOOP ;
if ( param ! = NULL ) {
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_DEBUG , " menu_handler '%s' \n " , param ) ;
2006-12-04 05:50:41 +00:00
}
return action ;
}
# endif
2007-06-20 05:39:50 +00:00
SWITCH_STANDARD_APP ( ivr_application_function )
2006-12-04 05:50:41 +00:00
{
switch_channel_t * channel = switch_core_session_get_channel ( session ) ;
2008-01-23 20:59:25 +00:00
switch_event_t * params ;
2009-03-19 04:11:51 +00:00
const char * name = ( const char * ) data ;
2008-05-27 04:54:52 +00:00
2008-01-23 20:59:25 +00:00
if ( channel ) {
2006-12-04 05:50:41 +00:00
switch_xml_t cxml = NULL , cfg = NULL , xml_menus = NULL , xml_menu = NULL ;
2008-09-02 10:17:44 +00:00
/* Open the config from the xml registry */
2008-10-02 17:10:05 +00:00
switch_event_create ( & params , SWITCH_EVENT_REQUEST_PARAMS ) ;
2008-01-23 20:59:25 +00:00
switch_assert ( params ) ;
2009-03-19 04:15:14 +00:00
switch_event_add_header_string ( params , SWITCH_STACK_BOTTOM , " Menu-Name " , name ) ;
2008-01-23 20:59:25 +00:00
switch_channel_event_set_data ( channel , params ) ;
if ( ( cxml = switch_xml_open_cfg ( ivr_cf_name , & cfg , params ) ) ! = NULL ) {
2006-12-04 05:50:41 +00:00
if ( ( xml_menus = switch_xml_child ( cfg , " menus " ) ) ) {
2009-03-19 04:11:51 +00:00
xml_menu = switch_xml_find_child ( xml_menus , " menu " , " name " , name ) ;
2006-12-04 05:50:41 +00:00
2008-09-02 10:17:44 +00:00
/* if the menu was found */
2006-12-04 05:50:41 +00:00
if ( xml_menu ! = NULL ) {
switch_ivr_menu_xml_ctx_t * xml_ctx = NULL ;
switch_ivr_menu_t * menu_stack = NULL ;
2008-09-02 10:17:44 +00:00
/* build a menu tree and execute it */
2007-03-29 22:31:56 +00:00
if ( switch_ivr_menu_stack_xml_init ( & xml_ctx , NULL ) = = SWITCH_STATUS_SUCCESS
2006-12-04 05:50:41 +00:00
# ifdef _TEST_CALLBACK_
2007-03-30 00:13:31 +00:00
& & switch_ivr_menu_stack_xml_add_custom ( xml_ctx , " custom " , & menu_handler ) = = SWITCH_STATUS_SUCCESS
2006-12-04 05:50:41 +00:00
# endif
2007-03-30 00:13:31 +00:00
& & switch_ivr_menu_stack_xml_build ( xml_ctx , & menu_stack , xml_menus , xml_menu ) = = SWITCH_STATUS_SUCCESS ) {
2007-02-14 17:28:42 +00:00
switch_xml_free ( cxml ) ;
2007-02-14 17:34:16 +00:00
cxml = NULL ;
2009-03-19 04:11:51 +00:00
switch_ivr_menu_execute ( session , menu_stack , ( char * ) name , NULL ) ;
2006-12-04 05:50:41 +00:00
switch_ivr_menu_stack_free ( menu_stack ) ;
} else {
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_ERROR , " Unable to create menu \n " ) ;
2006-12-04 05:50:41 +00:00
}
} else {
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_ERROR , " Unable to find menu \n " ) ;
2006-12-04 05:50:41 +00:00
}
}
2007-02-14 17:34:16 +00:00
switch_xml_free ( cxml ) ;
2006-12-04 05:50:41 +00:00
} else {
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_ERROR , " Open of %s failed \n " , ivr_cf_name ) ;
2006-12-04 05:50:41 +00:00
}
2008-01-23 20:59:25 +00:00
switch_event_destroy ( & params ) ;
2006-12-04 05:50:41 +00:00
}
}
2006-11-28 02:23:26 +00:00
2007-06-20 05:39:50 +00:00
SWITCH_STANDARD_APP ( dtmf_session_function )
2007-06-04 17:12:43 +00:00
{
switch_ivr_inband_dtmf_session ( session ) ;
}
2007-06-20 05:39:50 +00:00
SWITCH_STANDARD_APP ( stop_dtmf_session_function )
2007-06-04 17:12:43 +00:00
{
2007-06-04 22:10:42 +00:00
switch_ivr_stop_inband_dtmf_session ( session ) ;
}
2007-06-04 17:12:43 +00:00
2007-10-31 16:44:02 +00:00
SWITCH_STANDARD_APP ( dtmf_session_generate_function )
{
switch_bool_t do_read = SWITCH_TRUE ;
2008-05-27 04:54:52 +00:00
2007-10-31 16:44:02 +00:00
if ( ! switch_strlen_zero ( data ) ) {
if ( ! strcasecmp ( data , " write " ) ) {
do_read = SWITCH_FALSE ;
}
2008-05-27 04:54:52 +00:00
}
2007-10-31 16:44:02 +00:00
switch_ivr_inband_dtmf_generate_session ( session , do_read ) ;
}
SWITCH_STANDARD_APP ( stop_dtmf_session_generate_function )
{
switch_ivr_stop_inband_dtmf_generate_session ( session ) ;
}
2007-06-20 05:39:50 +00:00
SWITCH_STANDARD_APP ( fax_detect_session_function )
2007-06-04 22:10:42 +00:00
{
2009-01-19 16:10:54 +00:00
switch_ivr_tone_detect_session ( session , " fax " , " 1100.0 " , " r " , 0 , 1 , NULL , NULL , NULL ) ;
2007-06-04 22:10:42 +00:00
}
2007-06-04 17:12:43 +00:00
2007-06-20 05:39:50 +00:00
SWITCH_STANDARD_APP ( system_session_function )
2007-06-20 02:19:29 +00:00
{
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_NOTICE , " Executing command: %s \n " , data ) ;
2008-09-26 15:50:12 +00:00
if ( switch_system ( data , SWITCH_TRUE ) < 0 ) {
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_NOTICE , " Failed to execute command: %s \n " , data ) ;
2007-08-03 21:29:01 +00:00
}
2007-06-20 02:19:29 +00:00
}
2007-06-20 05:39:50 +00:00
SWITCH_STANDARD_APP ( tone_detect_session_function )
2007-06-15 17:39:18 +00:00
{
2008-11-18 02:05:11 +00:00
char * argv [ 7 ] = { 0 } ;
2007-06-16 02:25:40 +00:00
int argc ;
char * mydata = NULL ;
time_t to = 0 ;
2008-11-18 02:05:11 +00:00
int hits = 1 ;
2007-06-16 02:25:40 +00:00
2008-01-06 22:14:10 +00:00
if ( switch_strlen_zero ( data ) | | ! ( mydata = switch_core_session_strdup ( session , data ) ) ) {
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_ERROR , " INVALID ARGS! \n " ) ;
2008-01-06 22:14:10 +00:00
return ;
}
2007-06-16 02:25:40 +00:00
if ( ( argc = switch_separate_string ( mydata , ' ' , argv , sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) < 2 ) {
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_ERROR , " INVALID ARGS! \n " ) ;
2008-01-06 22:14:10 +00:00
return ;
2007-06-16 02:25:40 +00:00
}
2008-01-06 22:14:10 +00:00
2007-06-16 02:25:40 +00:00
if ( argv [ 3 ] ) {
uint32_t mto ;
2007-06-16 03:43:13 +00:00
if ( * argv [ 3 ] = = ' + ' ) {
2008-05-27 04:54:52 +00:00
if ( ( mto = atol ( argv [ 3 ] + 1 ) ) > 0 ) {
2009-01-25 21:23:07 +00:00
to = switch_epoch_time_now ( NULL ) + mto ;
2007-06-16 02:25:40 +00:00
} else {
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_ERROR , " INVALID Timeout! \n " ) ;
2007-06-16 02:25:40 +00:00
}
} else {
2009-01-25 21:23:07 +00:00
if ( ( to = atol ( argv [ 3 ] ) ) < switch_epoch_time_now ( NULL ) ) {
2008-07-22 14:53:54 +00:00
if ( to > = 1 ) {
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_ERROR , " INVALID Timeout! \n " ) ;
2008-07-22 14:53:54 +00:00
}
2007-06-16 02:25:40 +00:00
to = 0 ;
}
}
}
2008-11-18 15:11:17 +00:00
if ( argv [ 6 ] ) {
hits = atoi ( argv [ 6 ] ) ;
2008-11-18 02:05:11 +00:00
if ( hits < 0 ) {
hits = 1 ;
}
}
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_NOTICE , " Enabling tone detection '%s' '%s' \n " , argv [ 0 ] , argv [ 1 ] ) ;
2008-05-27 04:54:52 +00:00
2009-01-19 16:10:54 +00:00
switch_ivr_tone_detect_session ( session , argv [ 0 ] , argv [ 1 ] , argv [ 2 ] , to , hits , argv [ 4 ] , argv [ 5 ] , NULL ) ;
2007-06-15 17:39:18 +00:00
}
2007-06-20 05:39:50 +00:00
SWITCH_STANDARD_APP ( stop_fax_detect_session_function )
2007-06-04 22:10:42 +00:00
{
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_NOTICE , " Disabling tone detection \n " ) ;
2007-06-16 02:25:40 +00:00
switch_ivr_stop_tone_detect_session ( session ) ;
2007-06-04 17:12:43 +00:00
}
2007-06-20 05:39:50 +00:00
SWITCH_STANDARD_APP ( echo_function )
2007-06-13 16:00:14 +00:00
{
2008-09-25 19:53:43 +00:00
switch_ivr_session_echo ( session , NULL ) ;
2007-06-13 16:00:14 +00:00
}
2007-06-20 05:39:50 +00:00
SWITCH_STANDARD_APP ( park_function )
2007-06-13 16:00:14 +00:00
{
switch_ivr_park ( session , NULL ) ;
}
2007-12-13 22:17:20 +00:00
SWITCH_STANDARD_APP ( park_state_function )
{
switch_ivr_park_session ( session ) ;
}
2007-06-13 16:00:14 +00:00
/********************************************************************************/
/* Playback/Record Functions */
/********************************************************************************/
/*
dtmf handler function you can hook up to be executed when a digit is dialed during playback
if you return anything but SWITCH_STATUS_SUCCESS the playback will stop .
*/
2008-05-23 20:12:44 +00:00
static switch_status_t bridge_on_dtmf ( switch_core_session_t * session , void * input , switch_input_type_t itype , void * buf , unsigned int buflen )
{
char * str = ( char * ) buf ;
2008-05-27 04:54:52 +00:00
2008-05-23 20:12:44 +00:00
if ( str & & input & & itype = = SWITCH_INPUT_TYPE_DTMF ) {
switch_dtmf_t * dtmf = ( switch_dtmf_t * ) input ;
if ( strchr ( str , dtmf - > digit ) ) {
return SWITCH_STATUS_BREAK ;
}
}
return SWITCH_STATUS_SUCCESS ;
}
2007-06-13 16:00:14 +00:00
static switch_status_t on_dtmf ( switch_core_session_t * session , void * input , switch_input_type_t itype , void * buf , unsigned int buflen )
{
2008-09-26 16:04:16 +00:00
char sbuf [ 3 ] ;
2007-06-13 16:00:14 +00:00
switch ( itype ) {
2007-10-16 14:36:39 +00:00
case SWITCH_INPUT_TYPE_DTMF :
{
2007-12-22 00:32:20 +00:00
switch_dtmf_t * dtmf = ( switch_dtmf_t * ) input ;
2007-11-01 11:28:26 +00:00
const char * terminators ;
2007-10-16 14:36:39 +00:00
switch_channel_t * channel = switch_core_session_get_channel ( session ) ;
2007-11-01 11:28:26 +00:00
const char * p ;
2007-10-16 14:36:39 +00:00
if ( ! ( terminators = switch_channel_get_variable ( channel , SWITCH_PLAYBACK_TERMINATORS_VARIABLE ) ) ) {
terminators = " * " ;
}
if ( ! strcasecmp ( terminators , " none " ) ) {
terminators = NULL ;
}
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_DEBUG , " Digit %c \n " , dtmf - > digit ) ;
2008-05-27 04:54:52 +00:00
2007-10-16 14:36:39 +00:00
for ( p = terminators ; p & & * p ; p + + ) {
2007-12-22 00:32:20 +00:00
if ( * p = = dtmf - > digit ) {
2008-09-26 16:04:16 +00:00
switch_snprintf ( sbuf , sizeof ( sbuf ) , " %c " , * p ) ;
switch_channel_set_variable ( channel , SWITCH_PLAYBACK_TERMINATOR_USED , sbuf ) ;
2007-12-22 00:32:20 +00:00
return SWITCH_STATUS_BREAK ;
2007-10-16 14:36:39 +00:00
}
2007-06-13 16:00:14 +00:00
}
}
break ;
default :
break ;
}
return SWITCH_STATUS_SUCCESS ;
}
2008-07-08 17:27:02 +00:00
SWITCH_STANDARD_APP ( sleep_function )
2008-09-26 18:03:17 +00:00
{
switch_channel_t * channel = switch_core_session_get_channel ( session ) ;
2008-07-08 17:27:02 +00:00
if ( switch_strlen_zero ( data ) ) {
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_ERROR , " No timeout specified. \n " ) ;
2008-07-08 17:27:02 +00:00
} else {
uint32_t ms = atoi ( data ) ;
char buf [ 10 ] ;
switch_input_args_t args = { 0 } ;
2009-07-02 00:18:56 +00:00
if ( switch_true ( switch_channel_get_variable ( channel , " sleep_eat_digits " ) ) ) {
args . input_callback = on_dtmf ;
args . buf = buf ;
args . buflen = sizeof ( buf ) ;
switch_channel_set_variable ( channel , SWITCH_PLAYBACK_TERMINATOR_USED , " " ) ;
}
2008-09-26 16:04:16 +00:00
2008-12-10 00:48:24 +00:00
switch_ivr_sleep ( session , ms , SWITCH_TRUE , & args ) ;
2008-07-08 17:27:02 +00:00
}
}
2007-10-15 16:25:08 +00:00
SWITCH_STANDARD_APP ( clear_speech_cache_function )
{
switch_ivr_clear_speech_cache ( session ) ;
}
2007-06-13 16:00:14 +00:00
2007-06-20 05:39:50 +00:00
SWITCH_STANDARD_APP ( speak_function )
2007-06-13 16:00:14 +00:00
{
2008-01-06 22:14:10 +00:00
switch_channel_t * channel = switch_core_session_get_channel ( session ) ;
2007-06-13 16:00:14 +00:00
char buf [ 10 ] ;
char * argv [ 4 ] = { 0 } ;
int argc ;
2007-11-01 11:28:26 +00:00
const char * engine = NULL ;
const char * voice = NULL ;
2007-06-13 16:00:14 +00:00
char * text = NULL ;
char * mydata = NULL ;
switch_input_args_t args = { 0 } ;
2008-01-06 22:14:10 +00:00
if ( switch_strlen_zero ( data ) | | ! ( mydata = switch_core_session_strdup ( session , data ) ) ) {
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_ERROR , " Invalid Params! \n " ) ;
2008-01-06 22:14:10 +00:00
return ;
}
2007-06-13 16:00:14 +00:00
argc = switch_separate_string ( mydata , ' | ' , argv , sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ;
2008-05-27 04:54:52 +00:00
2008-01-06 22:14:10 +00:00
if ( argc = = 0 ) {
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_ERROR , " Invalid Params! \n " ) ;
2008-01-06 22:14:10 +00:00
return ;
} else if ( argc = = 1 ) {
2007-10-15 16:25:08 +00:00
text = argv [ 0 ] ;
} else if ( argc = = 2 ) {
voice = argv [ 0 ] ;
text = argv [ 1 ] ;
} else {
engine = argv [ 0 ] ;
voice = argv [ 1 ] ;
text = argv [ 2 ] ;
}
if ( ! engine ) {
engine = switch_channel_get_variable ( channel , " tts_engine " ) ;
}
2007-06-13 16:00:14 +00:00
2007-10-15 16:25:08 +00:00
if ( ! voice ) {
voice = switch_channel_get_variable ( channel , " tts_voice " ) ;
}
2007-06-13 16:00:14 +00:00
if ( ! ( engine & & voice & & text ) ) {
if ( ! engine ) {
engine = " NULL " ;
}
if ( ! voice ) {
voice = " NULL " ;
}
if ( ! text ) {
text = " NULL " ;
}
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_ERROR , " Invalid Params! [%s][%s][%s] \n " , engine , voice , text ) ;
2007-06-13 16:00:14 +00:00
switch_channel_hangup ( channel , SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER ) ;
}
args . input_callback = on_dtmf ;
args . buf = buf ;
args . buflen = sizeof ( buf ) ;
2008-09-26 16:04:16 +00:00
switch_channel_set_variable ( channel , SWITCH_PLAYBACK_TERMINATOR_USED , " " ) ;
2007-08-28 17:06:20 +00:00
switch_ivr_speak_text ( session , engine , voice , text , & args ) ;
2007-06-13 16:00:14 +00:00
}
2008-03-13 01:08:42 +00:00
static switch_status_t xfer_on_dtmf ( switch_core_session_t * session , void * input , switch_input_type_t itype , void * buf , unsigned int buflen )
{
switch_core_session_t * peer_session = ( switch_core_session_t * ) buf ;
if ( ! buf | | ! peer_session ) {
return SWITCH_STATUS_SUCCESS ;
}
switch ( itype ) {
case SWITCH_INPUT_TYPE_DTMF :
2008-05-27 04:54:52 +00:00
{
2008-03-13 01:08:42 +00:00
switch_dtmf_t * dtmf = ( switch_dtmf_t * ) input ;
switch_channel_t * channel = switch_core_session_get_channel ( session ) ;
switch_channel_t * peer_channel = switch_core_session_get_channel ( peer_session ) ;
2008-05-27 04:54:52 +00:00
2008-03-13 01:08:42 +00:00
if ( dtmf - > digit = = ' # ' ) {
2009-07-31 19:09:50 +00:00
switch_channel_hangup ( peer_channel , SWITCH_CAUSE_NORMAL_CLEARING ) ;
2008-03-13 01:08:42 +00:00
return SWITCH_STATUS_FALSE ;
}
if ( dtmf - > digit = = ' 0 ' ) {
switch_caller_extension_t * extension = NULL ;
const char * app = " three_way " ;
const char * app_arg = switch_core_session_get_uuid ( session ) ;
const char * holding = switch_channel_get_variable ( channel , SWITCH_HOLDING_UUID_VARIABLE ) ;
switch_core_session_t * b_session ;
if ( holding & & ( b_session = switch_core_session_locate ( holding ) ) ) {
switch_channel_t * b_channel = switch_core_session_get_channel ( b_session ) ;
if ( ! switch_channel_ready ( b_channel ) ) {
app = " intercept " ;
}
switch_core_session_rwunlock ( b_session ) ;
}
2008-05-27 04:54:52 +00:00
2008-03-13 01:08:42 +00:00
if ( ( extension = switch_caller_extension_new ( peer_session , app , app_arg ) ) = = 0 ) {
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_CRIT , " Memory Error! \n " ) ;
2008-03-13 01:08:42 +00:00
abort ( ) ;
}
2008-05-27 04:54:52 +00:00
2008-03-13 01:08:42 +00:00
switch_caller_extension_add_application ( peer_session , extension , app , app_arg ) ;
switch_channel_set_caller_extension ( peer_channel , extension ) ;
switch_channel_set_flag ( peer_channel , CF_TRANSFER ) ;
switch_channel_set_state ( peer_channel , CS_EXECUTE ) ;
2008-05-15 15:42:13 +00:00
switch_channel_set_variable ( channel , SWITCH_HANGUP_AFTER_BRIDGE_VARIABLE , NULL ) ;
2008-03-13 01:08:42 +00:00
return SWITCH_STATUS_FALSE ;
}
2008-05-27 04:54:52 +00:00
2008-03-13 01:08:42 +00:00
}
break ;
default :
break ;
}
return SWITCH_STATUS_SUCCESS ;
}
static switch_status_t hanguphook ( switch_core_session_t * session )
{
switch_channel_t * channel = switch_core_session_get_channel ( session ) ;
switch_channel_state_t state = switch_channel_get_state ( channel ) ;
const char * id = NULL ;
2008-05-05 15:30:55 +00:00
if ( state = = CS_HANGUP | | state = = CS_ROUTING ) {
2008-03-13 01:08:42 +00:00
if ( ( id = switch_channel_get_variable ( channel , " xfer_uuids " ) ) ) {
switch_stream_handle_t stream = { 0 } ;
SWITCH_STANDARD_STREAM ( stream ) ;
switch_api_execute ( " uuid_bridge " , id , NULL , & stream ) ;
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_DEBUG , " \n Hangup Command uuid_bridge(%s): \n %s \n " , id , switch_str_nil ( ( char * ) stream . data ) ) ;
2008-03-13 01:08:42 +00:00
switch_safe_free ( stream . data ) ;
}
2008-05-27 04:54:52 +00:00
2008-03-13 01:08:42 +00:00
switch_core_event_hook_remove_state_change ( session , hanguphook ) ;
}
return SWITCH_STATUS_SUCCESS ;
}
SWITCH_STANDARD_APP ( att_xfer_function )
{
const char * var ;
switch_core_session_t * peer_session = NULL ;
switch_call_cause_t cause = SWITCH_CAUSE_NORMAL_CLEARING ;
switch_channel_t * channel , * peer_channel = NULL ;
const char * bond = NULL ;
int timelimit = 60 ;
2008-05-19 21:02:26 +00:00
switch_core_session_t * b_session = NULL ;
2008-03-13 01:08:42 +00:00
channel = switch_core_session_get_channel ( session ) ;
if ( ( bond = switch_channel_get_variable ( channel , SWITCH_SIGNAL_BOND_VARIABLE ) ) ) {
bond = switch_core_session_strdup ( session , bond ) ;
}
switch_channel_set_variable ( channel , SWITCH_HOLDING_UUID_VARIABLE , bond ) ;
2008-05-27 04:54:52 +00:00
2008-03-13 01:08:42 +00:00
if ( ( var = switch_channel_get_variable ( channel , SWITCH_CALL_TIMEOUT_VARIABLE ) ) ) {
timelimit = atoi ( var ) ;
}
2008-12-05 14:59:24 +00:00
if ( switch_ivr_originate ( session , & peer_session , & cause , data , timelimit , NULL , NULL , NULL , NULL , NULL , SOF_NONE )
! = SWITCH_STATUS_SUCCESS | | ! peer_session ) {
2008-05-19 21:02:26 +00:00
goto end ;
2008-03-13 01:08:42 +00:00
}
peer_channel = switch_core_session_get_channel ( peer_session ) ;
switch_channel_set_flag ( peer_channel , CF_INNER_BRIDGE ) ;
switch_channel_set_flag ( channel , CF_INNER_BRIDGE ) ;
2008-05-27 04:54:52 +00:00
2008-03-13 01:08:42 +00:00
switch_ivr_multi_threaded_bridge ( session , peer_session , xfer_on_dtmf , peer_session , NULL ) ;
2008-05-27 04:54:52 +00:00
2008-05-15 21:36:32 +00:00
switch_channel_clear_flag ( peer_channel , CF_INNER_BRIDGE ) ;
switch_channel_clear_flag ( channel , CF_INNER_BRIDGE ) ;
2009-03-17 17:54:34 +00:00
if ( switch_channel_down ( peer_channel ) ) {
2008-05-19 21:02:26 +00:00
switch_core_session_rwunlock ( peer_session ) ;
goto end ;
}
2008-03-13 01:08:42 +00:00
if ( bond ) {
char buf [ 128 ] = " " ;
2008-05-15 21:36:32 +00:00
if ( ! switch_channel_ready ( channel ) ) {
switch_ivr_uuid_bridge ( switch_core_session_get_uuid ( peer_session ) , bond ) ;
} else if ( ( b_session = switch_core_session_locate ( bond ) ) ) {
2008-03-13 01:08:42 +00:00
switch_channel_t * b_channel = switch_core_session_get_channel ( b_session ) ;
switch_snprintf ( buf , sizeof ( buf ) , " %s %s " , switch_core_session_get_uuid ( peer_session ) , switch_core_session_get_uuid ( session ) ) ;
switch_channel_set_variable ( b_channel , " xfer_uuids " , buf ) ;
switch_snprintf ( buf , sizeof ( buf ) , " %s %s " , switch_core_session_get_uuid ( peer_session ) , bond ) ;
switch_channel_set_variable ( channel , " xfer_uuids " , buf ) ;
2008-05-15 21:36:32 +00:00
2008-03-13 01:08:42 +00:00
switch_core_event_hook_add_state_change ( session , hanguphook ) ;
switch_core_event_hook_add_state_change ( b_session , hanguphook ) ;
switch_core_session_rwunlock ( b_session ) ;
}
2008-05-27 04:54:52 +00:00
2008-03-13 01:08:42 +00:00
switch_channel_set_variable ( channel , SWITCH_SIGNAL_BOND_VARIABLE , bond ) ;
}
2008-05-27 04:54:52 +00:00
2008-05-19 22:34:30 +00:00
switch_core_session_rwunlock ( peer_session ) ;
2008-05-27 04:54:52 +00:00
end :
2008-03-13 01:08:42 +00:00
switch_channel_set_variable ( channel , SWITCH_HOLDING_UUID_VARIABLE , NULL ) ;
}
2008-03-04 18:55:16 +00:00
SWITCH_STANDARD_APP ( read_function )
{
char * mydata ;
char * argv [ 6 ] = { 0 } ;
int argc ;
int32_t min_digits = 0 ;
int32_t max_digits = 0 ;
int timeout = 1000 ;
char digit_buffer [ 128 ] = " " ;
const char * prompt_audio_file = NULL ;
const char * var_name = NULL ;
const char * valid_terminators = NULL ;
if ( ! switch_strlen_zero ( data ) & & ( mydata = switch_core_session_strdup ( session , data ) ) ) {
argc = switch_separate_string ( mydata , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
} else {
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_ERROR , " No arguments specified. \n " ) ;
2008-03-04 18:55:16 +00:00
return ;
}
min_digits = atoi ( argv [ 0 ] ) ;
2008-05-27 04:54:52 +00:00
2008-03-04 18:55:16 +00:00
if ( argc > 1 ) {
max_digits = atoi ( argv [ 1 ] ) ;
}
if ( argc > 2 ) {
prompt_audio_file = argv [ 2 ] ;
}
2008-05-27 04:54:52 +00:00
2008-03-04 18:55:16 +00:00
if ( argc > 3 ) {
var_name = argv [ 3 ] ;
}
2008-05-27 04:54:52 +00:00
2008-03-04 18:55:16 +00:00
if ( argc > 4 ) {
timeout = atoi ( argv [ 4 ] ) ;
}
2008-05-27 04:54:52 +00:00
2008-03-04 18:55:16 +00:00
if ( argc > 5 ) {
valid_terminators = argv [ 5 ] ;
}
2008-05-27 04:54:52 +00:00
2008-03-04 18:55:16 +00:00
if ( min_digits < = 1 ) {
min_digits = 1 ;
}
if ( max_digits < min_digits ) {
max_digits = min_digits ;
}
2008-05-27 04:54:52 +00:00
2008-03-04 18:55:16 +00:00
if ( timeout < = 1000 ) {
timeout = 1000 ;
}
if ( switch_strlen_zero ( valid_terminators ) ) {
valid_terminators = " # " ;
}
switch_ivr_read ( session , min_digits , max_digits , prompt_audio_file , var_name , digit_buffer , sizeof ( digit_buffer ) , timeout , valid_terminators ) ;
}
2009-01-14 20:29:16 +00:00
SWITCH_STANDARD_APP ( play_and_get_digits_function )
{
char * mydata ;
2009-01-15 03:42:45 +00:00
char * argv [ 9 ] = { 0 } ;
2009-01-14 20:29:16 +00:00
int argc ;
int32_t min_digits = 0 ;
int32_t max_digits = 0 ;
int32_t max_tries = 0 ;
int timeout = 1000 ;
char digit_buffer [ 128 ] = " " ;
const char * prompt_audio_file = NULL ;
const char * bad_input_audio_file = NULL ;
2009-01-15 03:42:45 +00:00
const char * var_name = NULL ;
2009-01-14 20:29:16 +00:00
const char * valid_terminators = NULL ;
const char * digits_regex = NULL ;
if ( ! switch_strlen_zero ( data ) & & ( mydata = switch_core_session_strdup ( session , data ) ) ) {
argc = switch_separate_string ( mydata , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
} else {
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_ERROR , " No arguments specified. \n " ) ;
2009-01-14 20:29:16 +00:00
return ;
}
min_digits = atoi ( argv [ 0 ] ) ;
if ( argc > 1 ) {
max_digits = atoi ( argv [ 1 ] ) ;
}
2008-11-21 13:56:32 +00:00
2009-01-14 20:29:16 +00:00
if ( argc > 2 ) {
max_tries = atoi ( argv [ 2 ] ) ;
}
if ( argc > 3 ) {
timeout = atoi ( argv [ 3 ] ) ;
}
if ( argc > 4 ) {
valid_terminators = argv [ 4 ] ;
}
if ( argc > 5 ) {
prompt_audio_file = argv [ 5 ] ;
}
if ( argc > 6 ) {
bad_input_audio_file = argv [ 6 ] ;
}
if ( argc > 7 ) {
2009-01-15 03:42:45 +00:00
var_name = argv [ 7 ] ;
}
if ( argc > 8 ) {
digits_regex = argv [ 8 ] ;
}
if ( min_digits < = 1 ) {
min_digits = 1 ;
}
if ( max_digits < min_digits ) {
max_digits = min_digits ;
}
if ( timeout < = 1000 ) {
timeout = 1000 ;
2009-01-14 20:29:16 +00:00
}
if ( switch_strlen_zero ( valid_terminators ) ) {
valid_terminators = " # " ;
}
switch_play_and_get_digits ( session , min_digits , max_digits , max_tries , timeout , valid_terminators ,
2009-01-15 03:42:45 +00:00
prompt_audio_file , bad_input_audio_file , var_name , digit_buffer , sizeof ( digit_buffer ) , digits_regex ) ;
2009-01-14 20:29:16 +00:00
}
2008-11-21 13:56:32 +00:00
# define SAY_SYNTAX "<module_name> <say_type> <say_method> <text>"
SWITCH_STANDARD_APP ( say_function )
2007-06-13 16:00:14 +00:00
{
2008-11-21 13:56:32 +00:00
char * argv [ 4 ] = { 0 } ;
int argc ;
char * lbuf = NULL ;
2007-06-13 16:00:14 +00:00
switch_input_args_t args = { 0 } ;
2008-09-26 18:03:17 +00:00
switch_channel_t * channel = switch_core_session_get_channel ( session ) ;
2007-06-13 16:00:14 +00:00
2008-11-21 13:56:32 +00:00
if ( ! switch_strlen_zero ( data ) & & ( lbuf = switch_core_session_strdup ( session , data ) )
& & ( argc = switch_separate_string ( lbuf , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ) = = 4 ) {
args . input_callback = on_dtmf ;
switch_channel_set_variable ( channel , SWITCH_PLAYBACK_TERMINATOR_USED , " " ) ;
switch_ivr_say ( session , argv [ 3 ] , argv [ 0 ] , argv [ 1 ] , argv [ 2 ] , & args ) ;
} else {
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_ERROR , " Usage: %s \n " , SAY_SYNTAX ) ;
2008-11-21 13:56:32 +00:00
}
}
SWITCH_STANDARD_APP ( phrase_function )
{
char * mydata = NULL ;
switch_input_args_t args = { 0 } ;
switch_channel_t * channel = switch_core_session_get_channel ( session ) ;
2009-05-14 01:41:54 +00:00
switch_status_t status ;
2008-11-21 13:56:32 +00:00
if ( ! switch_strlen_zero ( data ) & & ( mydata = switch_core_session_strdup ( session , data ) ) ) {
const char * lang ;
char * macro = mydata ;
char * mdata = NULL ;
if ( ( mdata = strchr ( macro , ' , ' ) ) ) {
* mdata + + = ' \0 ' ;
}
2008-11-22 04:37:36 +00:00
lang = switch_channel_get_variable ( channel , " language " ) ;
2008-11-21 13:56:32 +00:00
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_DEBUG , " Execute %s(%s) lang %s \n " , macro , switch_str_nil ( mdata ) , switch_str_nil ( lang ) ) ;
2008-11-21 13:56:32 +00:00
args . input_callback = on_dtmf ;
switch_channel_set_variable ( channel , SWITCH_PLAYBACK_TERMINATOR_USED , " " ) ;
2009-05-14 01:41:54 +00:00
status = switch_ivr_phrase_macro ( session , macro , mdata , lang , & args ) ;
} else {
status = SWITCH_STATUS_NOOP ;
}
switch ( status ) {
case SWITCH_STATUS_SUCCESS :
case SWITCH_STATUS_BREAK :
switch_channel_set_variable ( channel , SWITCH_CURRENT_APPLICATION_RESPONSE_VARIABLE , " PHRASE PLAYED " ) ;
break ;
case SWITCH_STATUS_NOOP :
switch_channel_set_variable ( channel , SWITCH_CURRENT_APPLICATION_RESPONSE_VARIABLE , " NOTHING " ) ;
break ;
default :
switch_channel_set_variable ( channel , SWITCH_CURRENT_APPLICATION_RESPONSE_VARIABLE , " UNKNOWN ERROR " ) ;
break ;
2008-11-21 13:56:32 +00:00
}
}
SWITCH_STANDARD_APP ( playback_function )
{
switch_input_args_t args = { 0 } ;
switch_channel_t * channel = switch_core_session_get_channel ( session ) ;
2009-04-28 23:46:18 +00:00
switch_status_t status = SWITCH_STATUS_SUCCESS ;
2007-06-13 16:00:14 +00:00
args . input_callback = on_dtmf ;
2008-09-26 16:04:16 +00:00
switch_channel_set_variable ( channel , SWITCH_PLAYBACK_TERMINATOR_USED , " " ) ;
2008-12-08 15:42:37 +00:00
status = switch_ivr_play_file ( session , NULL , data , & args ) ;
switch ( status ) {
case SWITCH_STATUS_SUCCESS :
case SWITCH_STATUS_BREAK :
switch_channel_set_variable ( channel , SWITCH_CURRENT_APPLICATION_RESPONSE_VARIABLE , " FILE PLAYED " ) ;
break ;
case SWITCH_STATUS_NOTFOUND :
switch_channel_set_variable ( channel , SWITCH_CURRENT_APPLICATION_RESPONSE_VARIABLE , " FILE NOT FOUND " ) ;
break ;
default :
switch_channel_set_variable ( channel , SWITCH_CURRENT_APPLICATION_RESPONSE_VARIABLE , " PLAYBACK ERROR " ) ;
break ;
}
2007-06-13 16:00:14 +00:00
}
2007-06-20 05:39:50 +00:00
SWITCH_STANDARD_APP ( gentones_function )
2007-06-17 01:16:39 +00:00
{
char * tone_script = NULL ;
switch_input_args_t args = { 0 } ;
char * l ;
int32_t loops = 0 ;
2008-09-26 18:03:17 +00:00
switch_channel_t * channel = switch_core_session_get_channel ( session ) ;
2007-06-17 01:16:39 +00:00
2008-01-06 22:14:10 +00:00
if ( switch_strlen_zero ( data ) | | ! ( tone_script = switch_core_session_strdup ( session , data ) ) ) {
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_ERROR , " Invalid Params! \n " ) ;
2008-01-06 22:14:10 +00:00
return ;
}
2007-06-17 01:16:39 +00:00
if ( ( l = strchr ( tone_script , ' | ' ) ) ) {
* l + + = ' \0 ' ;
loops = atoi ( l ) ;
if ( loops < 0 ) {
loops = - 1 ;
}
}
args . input_callback = on_dtmf ;
2008-09-26 16:04:16 +00:00
switch_channel_set_variable ( channel , SWITCH_PLAYBACK_TERMINATOR_USED , " " ) ;
2007-06-17 01:16:39 +00:00
switch_ivr_gentones ( session , tone_script , loops , & args ) ;
}
2007-06-20 05:39:50 +00:00
SWITCH_STANDARD_APP ( displace_session_function )
2007-06-15 01:47:48 +00:00
{
char * path = NULL ;
uint32_t limit = 0 ;
2008-01-06 22:14:10 +00:00
char * argv [ 6 ] = { 0 } ;
2007-06-15 01:47:48 +00:00
int x , argc ;
char * lbuf = NULL ;
char * flags = NULL ;
2008-01-06 22:14:10 +00:00
if ( ! switch_strlen_zero ( data ) & & ( lbuf = switch_core_session_strdup ( session , data ) )
2007-06-15 01:47:48 +00:00
& & ( argc = switch_separate_string ( lbuf , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ) ) {
path = argv [ 0 ] ;
2008-05-27 04:54:52 +00:00
for ( x = 1 ; x < argc ; x + + ) {
2007-06-15 01:47:48 +00:00
if ( strchr ( argv [ x ] , ' + ' ) ) {
limit = atoi ( argv [ x ] ) ;
} else if ( ! switch_strlen_zero ( argv [ x ] ) ) {
flags = argv [ x ] ;
}
}
switch_ivr_displace_session ( session , path , limit , flags ) ;
}
}
2007-06-20 05:39:50 +00:00
SWITCH_STANDARD_APP ( stop_displace_session_function )
2007-06-15 01:47:48 +00:00
{
switch_ivr_stop_displace_session ( session , data ) ;
}
2007-06-20 05:39:50 +00:00
SWITCH_STANDARD_APP ( record_function )
2007-06-13 16:00:14 +00:00
{
2008-01-06 22:14:10 +00:00
switch_channel_t * channel = switch_core_session_get_channel ( session ) ;
2007-06-13 16:00:14 +00:00
switch_status_t status ;
uint32_t limit = 0 ;
char * path ;
switch_input_args_t args = { 0 } ;
2007-07-24 21:42:54 +00:00
switch_file_handle_t fh = { 0 } ;
int argc ;
2008-05-27 04:54:52 +00:00
char * mydata , * argv [ 4 ] = { 0 } ;
2007-07-24 21:42:54 +00:00
char * l = NULL ;
2007-12-12 21:30:55 +00:00
const char * tmp ;
int rate ;
2008-01-06 22:14:10 +00:00
if ( ! switch_strlen_zero ( data ) & & ( mydata = switch_core_session_strdup ( session , data ) ) ) {
2007-07-24 21:42:54 +00:00
argc = switch_separate_string ( mydata , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
} else {
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_ERROR , " No file specified. \n " ) ;
2007-07-24 21:42:54 +00:00
return ;
}
2008-05-27 04:54:52 +00:00
2007-07-24 21:42:54 +00:00
path = argv [ 0 ] ;
l = argv [ 1 ] ;
if ( l ) {
if ( * l = = ' + ' ) {
l + + ;
2008-01-05 22:17:26 +00:00
}
if ( l ) {
limit = atoi ( l ) ;
if ( limit < 0 ) {
limit = 0 ;
2007-07-24 21:42:54 +00:00
}
}
}
2007-06-13 16:00:14 +00:00
2007-07-24 21:42:54 +00:00
if ( argv [ 2 ] ) {
fh . thresh = atoi ( argv [ 2 ] ) ;
if ( fh . thresh < 0 ) {
fh . thresh = 0 ;
}
}
if ( argv [ 3 ] ) {
fh . silence_hits = atoi ( argv [ 3 ] ) ;
if ( fh . silence_hits < 0 ) {
fh . silence_hits = 0 ;
2007-06-13 16:00:14 +00:00
}
}
2007-12-12 21:30:55 +00:00
if ( ( tmp = switch_channel_get_variable ( channel , " record_rate " ) ) ) {
rate = atoi ( tmp ) ;
if ( rate > 0 ) {
fh . samplerate = rate ;
}
}
2007-06-13 16:00:14 +00:00
args . input_callback = on_dtmf ;
2008-09-26 16:04:16 +00:00
switch_channel_set_variable ( channel , SWITCH_PLAYBACK_TERMINATOR_USED , " " ) ;
2007-07-24 21:42:54 +00:00
status = switch_ivr_record_file ( session , & fh , path , & args , limit ) ;
2007-06-13 16:00:14 +00:00
if ( ! switch_channel_ready ( channel ) | | ( status ! = SWITCH_STATUS_SUCCESS & & ! SWITCH_STATUS_IS_BREAK ( status ) ) ) {
switch_channel_hangup ( channel , SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER ) ;
}
}
2007-06-20 05:39:50 +00:00
SWITCH_STANDARD_APP ( record_session_function )
2007-06-13 16:00:14 +00:00
{
2008-09-26 18:03:17 +00:00
char * path = NULL ;
char * path_end ;
2007-06-13 16:00:14 +00:00
uint32_t limit = 0 ;
2008-01-06 22:36:41 +00:00
if ( switch_strlen_zero ( data ) ) {
return ;
}
2007-06-13 16:00:14 +00:00
path = switch_core_session_strdup ( session , data ) ;
2008-05-19 22:36:25 +00:00
2008-09-26 18:03:17 +00:00
/* Search for a space then a plus followed by only numbers at the end of the path,
if found trim any spaces to the left / right of the plus use the left side as the
path and right side as a time limit on the recording
*/
2008-09-26 18:17:11 +00:00
/* if we find a + and the character before it is a space */
2008-09-26 18:03:17 +00:00
if ( ( path_end = strrchr ( path , ' + ' ) ) & & path_end > path & & * ( path_end - 1 ) = = ' ' ) {
char * limit_start = path_end + 1 ;
/* not at the end and the rest is numbers lets parse out the limit and fix up the path */
if ( * limit_start ! = ' \0 ' & & switch_is_number ( limit_start ) = = SWITCH_TRUE ) {
limit = atoi ( limit_start ) ;
2008-10-06 23:05:55 +00:00
/* back it off by one character to the char before the + */
2008-09-26 18:03:17 +00:00
path_end - - ;
/* trim spaces to the left of the plus */
while ( path_end > path & & * path_end = = ' ' ) {
path_end - - ;
}
2008-05-19 22:36:25 +00:00
2008-09-26 18:03:17 +00:00
* ( path_end + 1 ) = ' \0 ' ;
2007-06-13 16:00:14 +00:00
}
}
switch_ivr_record_session ( session , path , limit , NULL ) ;
}
2007-06-20 05:39:50 +00:00
SWITCH_STANDARD_APP ( stop_record_session_function )
2007-06-13 16:00:14 +00:00
{
switch_ivr_stop_record_session ( session , data ) ;
}
/********************************************************************************/
/* Bridge Functions */
/********************************************************************************/
2007-06-20 05:39:50 +00:00
SWITCH_STANDARD_APP ( audio_bridge_function )
2007-06-13 16:00:14 +00:00
{
2008-01-06 22:14:10 +00:00
switch_channel_t * caller_channel = switch_core_session_get_channel ( session ) ;
2007-06-13 16:00:14 +00:00
switch_core_session_t * peer_session = NULL ;
unsigned int timelimit = 60 ;
2009-02-16 17:56:21 +00:00
const char * var , * continue_on_fail = NULL , * failure_causes = NULL ;
2007-06-13 16:00:14 +00:00
switch_call_cause_t cause = SWITCH_CAUSE_NORMAL_CLEARING ;
if ( switch_strlen_zero ( data ) ) {
return ;
}
2008-03-13 01:08:42 +00:00
if ( ( var = switch_channel_get_variable ( caller_channel , SWITCH_CALL_TIMEOUT_VARIABLE ) ) ) {
2007-06-13 16:00:14 +00:00
timelimit = atoi ( var ) ;
}
2007-10-15 14:00:48 +00:00
continue_on_fail = switch_channel_get_variable ( caller_channel , " continue_on_fail " ) ;
2009-02-16 17:56:21 +00:00
failure_causes = switch_channel_get_variable ( caller_channel , " failure_causes " ) ;
2008-05-27 04:54:52 +00:00
2008-02-21 17:48:41 +00:00
if ( ( var = switch_channel_get_variable ( caller_channel , SWITCH_PROXY_MEDIA_VARIABLE ) ) & & switch_true ( var ) ) {
switch_channel_set_flag ( caller_channel , CF_PROXY_MEDIA ) ;
}
2008-05-27 04:54:52 +00:00
2008-02-21 17:48:41 +00:00
if ( switch_channel_test_flag ( caller_channel , CF_PROXY_MODE )
2007-06-13 16:00:14 +00:00
| | ( ( var = switch_channel_get_variable ( caller_channel , SWITCH_BYPASS_MEDIA_VARIABLE ) ) & & switch_true ( var ) ) ) {
if ( ! switch_channel_test_flag ( caller_channel , CF_ANSWERED )
& & ! switch_channel_test_flag ( caller_channel , CF_EARLY_MEDIA ) ) {
2008-02-21 17:48:41 +00:00
switch_channel_set_flag ( caller_channel , CF_PROXY_MODE ) ;
2007-06-13 16:00:14 +00:00
} else {
2008-05-09 19:59:42 +00:00
if ( switch_channel_test_flag ( caller_channel , CF_PROXY_MODE ) ) {
switch_ivr_media ( switch_core_session_get_uuid ( session ) , SMF_REBRIDGE ) ;
switch_channel_set_flag ( caller_channel , CF_PROXY_MODE ) ;
} else {
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_DEBUG , " Channel is already up, delaying proxy mode 'till both legs are answered. \n " ) ;
2009-03-06 03:54:38 +00:00
switch_channel_set_variable ( caller_channel , " bypass_media_after_bridge " , " true " ) ;
switch_channel_set_variable ( caller_channel , SWITCH_BYPASS_MEDIA_VARIABLE , NULL ) ;
switch_channel_clear_flag ( caller_channel , CF_PROXY_MODE ) ;
2008-05-09 19:59:42 +00:00
}
2007-06-13 16:00:14 +00:00
}
}
2008-12-05 14:59:24 +00:00
if ( switch_ivr_originate ( session , & peer_session , & cause , data , timelimit , NULL , NULL , NULL , NULL , NULL , SOF_NONE ) ! = SWITCH_STATUS_SUCCESS ) {
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_INFO , " Originate Failed. Cause: %s \n " , switch_channel_cause2str ( cause ) ) ;
2007-10-15 14:00:48 +00:00
/* no answer is *always* a reason to continue */
2008-05-27 18:51:09 +00:00
if ( cause = = SWITCH_CAUSE_NO_ANSWER | | cause = = SWITCH_CAUSE_NO_USER_RESPONSE | | cause = = SWITCH_CAUSE_ORIGINATOR_CANCEL ) {
2007-10-15 14:00:48 +00:00
return ;
2007-06-13 16:00:14 +00:00
}
2007-10-15 14:00:48 +00:00
/*
if the variable continue_on_fail is set it can be :
' true ' to continue on all failures .
' false ' to not continue .
2007-11-15 16:22:18 +00:00
A list of codes either names or numbers eg " user_busy,normal_temporary_failure,603 "
2009-02-16 17:56:21 +00:00
failure_causes acts as the opposite version
2008-05-27 04:54:52 +00:00
*/
2009-02-16 17:56:21 +00:00
if ( continue_on_fail | | failure_causes ) {
2007-10-15 14:00:48 +00:00
const char * cause_str ;
char cause_num [ 35 ] = " " ;
cause_str = switch_channel_cause2str ( cause ) ;
2007-12-12 21:53:32 +00:00
switch_snprintf ( cause_num , sizeof ( cause_num ) , " %u " , cause ) ;
2009-02-16 17:56:21 +00:00
2009-03-29 18:11:30 +00:00
if ( failure_causes & & ! ( switch_stristr ( cause_str , failure_causes ) | | strstr ( failure_causes , cause_num ) ) ) {
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_DEBUG , " Failiure causes [%s]: Cause: %s \n " , failure_causes , cause_str ) ;
2009-02-16 17:56:21 +00:00
return ;
}
2009-03-29 18:11:30 +00:00
if ( continue_on_fail & & ( switch_true ( continue_on_fail ) | | switch_stristr ( cause_str , continue_on_fail ) | | strstr ( continue_on_fail , cause_num ) ) ) {
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_DEBUG , " Continue on fail [%s]: Cause: %s \n " , continue_on_fail , cause_str ) ;
2007-10-15 14:00:48 +00:00
return ;
}
}
2008-05-05 15:30:55 +00:00
if ( ! switch_channel_test_flag ( caller_channel , CF_TRANSFER ) & & switch_channel_get_state ( caller_channel ) ! = CS_ROUTING ) {
2008-01-03 23:42:15 +00:00
switch_channel_hangup ( caller_channel , cause ) ;
}
2007-06-13 16:00:14 +00:00
return ;
} else {
2009-03-06 03:54:38 +00:00
if ( switch_channel_test_flag ( caller_channel , CF_PROXY_MODE ) ) {
2007-06-13 16:00:14 +00:00
switch_ivr_signal_bridge ( session , peer_session ) ;
} else {
2009-03-06 03:54:38 +00:00
switch_channel_t * channel = switch_core_session_get_channel ( session ) ;
switch_channel_t * peer_channel = switch_core_session_get_channel ( peer_session ) ;
char * a_key = ( char * ) switch_channel_get_variable ( channel , " bridge_terminate_key " ) ;
char * b_key = ( char * ) switch_channel_get_variable ( peer_channel , " bridge_terminate_key " ) ;
int ok = 0 ;
switch_input_callback_function_t func = NULL ;
if ( a_key ) {
a_key = switch_core_session_strdup ( session , a_key ) ;
ok + + ;
}
if ( b_key ) {
b_key = switch_core_session_strdup ( session , b_key ) ;
ok + + ;
}
if ( ok ) {
func = bridge_on_dtmf ;
2007-06-13 16:00:14 +00:00
} else {
2009-03-06 03:54:38 +00:00
a_key = NULL ;
b_key = NULL ;
2007-06-13 16:00:14 +00:00
}
2009-03-06 03:54:38 +00:00
switch_ivr_multi_threaded_bridge ( session , peer_session , func , a_key , a_key ) ;
2007-06-13 16:00:14 +00:00
}
2009-03-06 03:54:38 +00:00
2007-06-13 16:00:14 +00:00
if ( peer_session ) {
switch_core_session_rwunlock ( peer_session ) ;
}
}
}
2007-06-04 22:10:42 +00:00
2008-08-12 18:00:56 +00:00
/* fake chan_error */
switch_endpoint_interface_t * error_endpoint_interface ;
static switch_call_cause_t error_outgoing_channel ( switch_core_session_t * session ,
switch_event_t * var_event ,
switch_caller_profile_t * outbound_profile ,
switch_core_session_t * * new_session , switch_memory_pool_t * * pool , switch_originate_flag_t flags ) ;
switch_io_routines_t error_io_routines = {
/*.outgoing_channel */ error_outgoing_channel
} ;
static switch_call_cause_t error_outgoing_channel ( switch_core_session_t * session ,
switch_event_t * var_event ,
switch_caller_profile_t * outbound_profile ,
switch_core_session_t * * new_session , switch_memory_pool_t * * pool , switch_originate_flag_t flags )
{
switch_call_cause_t cause = switch_channel_str2cause ( outbound_profile - > destination_number ) ;
if ( cause = = SWITCH_CAUSE_NONE ) {
cause = SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER ;
}
return cause ;
}
2008-12-23 17:36:50 +00:00
/* fake chan_group */
switch_endpoint_interface_t * group_endpoint_interface ;
static switch_call_cause_t group_outgoing_channel ( switch_core_session_t * session ,
switch_event_t * var_event ,
switch_caller_profile_t * outbound_profile ,
switch_core_session_t * * new_session , switch_memory_pool_t * * pool , switch_originate_flag_t flags ) ;
switch_io_routines_t group_io_routines = {
/*.outgoing_channel */ group_outgoing_channel
} ;
static switch_call_cause_t group_outgoing_channel ( switch_core_session_t * session ,
switch_event_t * var_event ,
switch_caller_profile_t * outbound_profile ,
switch_core_session_t * * new_session , switch_memory_pool_t * * pool , switch_originate_flag_t flags )
{
2009-05-27 02:07:20 +00:00
char * group = NULL ;
2009-01-01 19:11:49 +00:00
switch_call_cause_t cause = SWITCH_CAUSE_NONE ;
2008-12-23 17:36:50 +00:00
char * template = NULL , * dest = NULL ;
switch_originate_flag_t myflags = SOF_NONE ;
char * cid_name_override = NULL ;
char * cid_num_override = NULL ;
2009-05-06 15:13:51 +00:00
const char * var , * skip = NULL ;
2008-12-23 17:36:50 +00:00
unsigned int timelimit = 60 ;
char * domain = NULL ;
switch_channel_t * new_channel = NULL ;
2009-05-06 15:13:51 +00:00
2008-12-23 17:36:50 +00:00
group = strdup ( outbound_profile - > destination_number ) ;
if ( ! group ) goto done ;
if ( ( domain = strchr ( group , ' @ ' ) ) ) {
* domain + + = ' \0 ' ;
} else {
domain = switch_core_get_variable ( " domain " ) ;
}
if ( ! domain ) {
goto done ;
}
2009-05-06 15:13:51 +00:00
if ( var_event & & ( skip = switch_event_get_header ( var_event , " group_recurse_variables " ) ) & & switch_false ( skip ) ) {
if ( ( var = switch_event_get_header ( var_event , SWITCH_CALL_TIMEOUT_VARIABLE ) ) | |
( var = switch_event_get_header ( var_event , " leg_timeout " ) ) ) {
timelimit = atoi ( var ) ;
}
var_event = NULL ;
}
2008-12-23 17:36:50 +00:00
template = switch_mprintf ( " ${group_call(%s@%s)} " , group , domain ) ;
if ( session ) {
switch_channel_t * channel = switch_core_session_get_channel ( session ) ;
dest = switch_channel_expand_variables ( channel , template ) ;
2009-05-06 15:13:51 +00:00
if ( ( var = switch_channel_get_variable ( channel , SWITCH_CALL_TIMEOUT_VARIABLE ) ) | |
( var = switch_event_get_header ( var_event , " leg_timeout " ) ) ) {
2008-12-23 17:36:50 +00:00
timelimit = atoi ( var ) ;
}
} else if ( var_event ) {
dest = switch_event_expand_headers ( var_event , template ) ;
2009-05-06 15:13:51 +00:00
} else {
switch_event_t * event = NULL ;
switch_event_create ( & event , SWITCH_EVENT_REQUEST_PARAMS ) ;
dest = switch_event_expand_headers ( event , template ) ;
switch_event_destroy ( & event ) ;
2008-12-23 17:36:50 +00:00
}
2009-05-06 15:13:51 +00:00
2008-12-23 17:36:50 +00:00
if ( ! dest ) {
goto done ;
}
if ( var_event ) {
cid_name_override = switch_event_get_header ( var_event , " origination_caller_id_name " ) ;
cid_num_override = switch_event_get_header ( var_event , " origination_caller_id_number " ) ;
2009-05-06 15:13:51 +00:00
if ( ( var = switch_event_get_header ( var_event , SWITCH_CALL_TIMEOUT_VARIABLE ) ) | |
( var = switch_event_get_header ( var_event , " leg_timeout " ) ) ) {
2008-12-23 17:36:50 +00:00
timelimit = atoi ( var ) ;
}
}
if ( ( flags & SOF_FORKED_DIAL ) ) {
myflags | = SOF_NOBLOCK ;
}
if ( switch_ivr_originate ( session , new_session , & cause , dest , timelimit , NULL ,
cid_name_override , cid_num_override , NULL , var_event , myflags ) = = SWITCH_STATUS_SUCCESS ) {
const char * context ;
switch_caller_profile_t * cp ;
new_channel = switch_core_session_get_channel ( * new_session ) ;
if ( ( context = switch_channel_get_variable ( new_channel , " group_context " ) ) ) {
if ( ( cp = switch_channel_get_caller_profile ( new_channel ) ) ) {
cp - > context = switch_core_strdup ( cp - > pool , context ) ;
}
}
switch_core_session_rwunlock ( * new_session ) ;
}
2009-01-13 23:48:55 +00:00
done :
2008-12-23 17:36:50 +00:00
if ( dest & & dest ! = template ) {
switch_safe_free ( dest ) ;
}
switch_safe_free ( template ) ;
2009-05-27 02:07:20 +00:00
switch_safe_free ( group ) ;
2008-12-23 17:36:50 +00:00
if ( cause = = SWITCH_CAUSE_NONE ) {
cause = SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER ;
}
return cause ;
}
2007-12-04 19:39:14 +00:00
/* fake chan_user */
switch_endpoint_interface_t * user_endpoint_interface ;
static switch_call_cause_t user_outgoing_channel ( switch_core_session_t * session ,
2008-05-15 19:29:35 +00:00
switch_event_t * var_event ,
2007-12-04 19:39:14 +00:00
switch_caller_profile_t * outbound_profile ,
2008-05-27 04:54:52 +00:00
switch_core_session_t * * new_session , switch_memory_pool_t * * pool , switch_originate_flag_t flags ) ;
2007-12-04 19:39:14 +00:00
switch_io_routines_t user_io_routines = {
/*.outgoing_channel */ user_outgoing_channel
} ;
static switch_call_cause_t user_outgoing_channel ( switch_core_session_t * session ,
2008-05-15 19:29:35 +00:00
switch_event_t * var_event ,
2007-12-04 19:39:14 +00:00
switch_caller_profile_t * outbound_profile ,
2008-05-27 04:54:52 +00:00
switch_core_session_t * * new_session , switch_memory_pool_t * * pool , switch_originate_flag_t flags )
2007-12-04 19:39:14 +00:00
{
2008-12-23 17:36:50 +00:00
switch_xml_t x_domain = NULL , xml = NULL , x_user = NULL , x_group = NULL , x_param , x_params ;
2007-12-04 19:39:14 +00:00
char * user = NULL , * domain = NULL ;
const char * dest = NULL ;
2008-07-03 22:51:09 +00:00
static switch_call_cause_t cause = SWITCH_CAUSE_NONE ;
2007-12-04 19:39:14 +00:00
unsigned int timelimit = 60 ;
2007-12-11 15:14:33 +00:00
switch_channel_t * new_channel = NULL ;
2009-05-07 02:05:16 +00:00
switch_event_t * params = NULL , * var_event_orig = var_event ;
2009-03-03 20:55:39 +00:00
char stupid [ 128 ] = " " ;
2009-05-06 15:13:51 +00:00
const char * skip = NULL , * var = NULL ;
2009-03-03 20:55:39 +00:00
2008-01-06 22:14:10 +00:00
if ( switch_strlen_zero ( outbound_profile - > destination_number ) ) {
goto done ;
}
2008-01-14 21:58:36 +00:00
user = strdup ( outbound_profile - > destination_number ) ;
2007-12-04 19:39:14 +00:00
2008-12-23 17:36:50 +00:00
if ( ! user ) goto done ;
2008-05-19 22:39:48 +00:00
2008-12-23 17:36:50 +00:00
if ( ( domain = strchr ( user , ' @ ' ) ) ) {
* domain + + = ' \0 ' ;
} else {
domain = switch_core_get_variable ( " domain " ) ;
}
if ( ! domain ) {
2007-12-04 19:39:14 +00:00
goto done ;
}
2008-12-23 17:36:50 +00:00
2007-12-20 21:42:00 +00:00
2009-05-06 15:13:51 +00:00
if ( var_event & & ( skip = switch_event_get_header ( var_event , " user_recurse_variables " ) ) & & switch_false ( skip ) ) {
if ( ( var = switch_event_get_header ( var_event , SWITCH_CALL_TIMEOUT_VARIABLE ) ) | |
( var = switch_event_get_header ( var_event , " leg_timeout " ) ) ) {
timelimit = atoi ( var ) ;
}
var_event = NULL ;
}
2008-10-02 17:10:05 +00:00
switch_event_create ( & params , SWITCH_EVENT_REQUEST_PARAMS ) ;
2008-01-23 20:59:25 +00:00
switch_assert ( params ) ;
2008-01-24 11:56:57 +00:00
switch_event_add_header_string ( params , SWITCH_STACK_BOTTOM , " as_channel " , " true " ) ;
2008-01-23 20:59:25 +00:00
2008-12-23 17:36:50 +00:00
if ( switch_xml_locate_user ( " id " , user , domain , NULL , & xml , & x_domain , & x_user , & x_group , params ) ! = SWITCH_STATUS_SUCCESS ) {
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_WARNING , " Can't find user [%s@%s] \n " , user , domain ) ;
2008-02-06 01:05:01 +00:00
cause = SWITCH_CAUSE_SUBSCRIBER_ABSENT ;
2007-12-04 19:39:14 +00:00
goto done ;
}
2007-12-11 15:14:33 +00:00
if ( ( x_params = switch_xml_child ( x_domain , " params " ) ) ) {
for ( x_param = switch_xml_child ( x_params , " param " ) ; x_param ; x_param = x_param - > next ) {
2009-05-11 22:28:02 +00:00
const char * pvar = switch_xml_attr ( x_param , " name " ) ;
2007-12-11 15:14:33 +00:00
const char * val = switch_xml_attr ( x_param , " value " ) ;
2008-05-27 04:54:52 +00:00
2009-05-11 22:28:02 +00:00
if ( ! strcasecmp ( pvar , " dial-string " ) ) {
2007-12-11 15:14:33 +00:00
dest = val ;
2009-05-15 03:17:19 +00:00
} else if ( ! strncasecmp ( pvar , " dial-var- " , 9 ) ) {
2009-05-07 02:05:16 +00:00
if ( ! var_event ) {
switch_event_create ( & var_event , SWITCH_EVENT_GENERAL ) ;
} else {
2009-05-11 22:28:02 +00:00
switch_event_del_header ( var_event , pvar + 9 ) ;
2009-05-07 02:05:16 +00:00
}
2009-05-11 22:28:02 +00:00
switch_event_add_header_string ( var_event , SWITCH_STACK_BOTTOM , pvar + 9 , val ) ;
2007-12-11 15:14:33 +00:00
}
}
}
2008-12-23 17:36:50 +00:00
if ( ( x_params = switch_xml_child ( x_group , " params " ) ) ) {
for ( x_param = switch_xml_child ( x_params , " param " ) ; x_param ; x_param = x_param - > next ) {
2009-05-11 22:28:02 +00:00
const char * pvar = switch_xml_attr ( x_param , " name " ) ;
2008-12-23 17:36:50 +00:00
const char * val = switch_xml_attr ( x_param , " value " ) ;
2009-05-11 22:28:02 +00:00
if ( ! strcasecmp ( pvar , " dial-string " ) ) {
2008-12-23 17:36:50 +00:00
dest = val ;
2009-05-11 22:28:02 +00:00
} else if ( ! strncasecmp ( pvar , " dial-var- " , 9 ) ) {
2009-05-07 02:05:16 +00:00
if ( ! var_event ) {
switch_event_create ( & var_event , SWITCH_EVENT_GENERAL ) ;
} else {
2009-05-11 22:28:02 +00:00
switch_event_del_header ( var_event , pvar + 9 ) ;
2009-05-07 02:05:16 +00:00
}
2009-05-11 22:28:02 +00:00
switch_event_add_header_string ( var_event , SWITCH_STACK_BOTTOM , pvar + 9 , val ) ;
2008-12-23 17:36:50 +00:00
}
}
}
2007-12-04 19:39:14 +00:00
if ( ( x_params = switch_xml_child ( x_user , " params " ) ) ) {
for ( x_param = switch_xml_child ( x_params , " param " ) ; x_param ; x_param = x_param - > next ) {
2009-05-11 22:28:02 +00:00
const char * pvar = switch_xml_attr ( x_param , " name " ) ;
2007-12-04 19:39:14 +00:00
const char * val = switch_xml_attr ( x_param , " value " ) ;
2008-05-27 04:54:52 +00:00
2009-05-11 22:28:02 +00:00
if ( ! strcasecmp ( pvar , " dial-string " ) ) {
2007-12-04 19:39:14 +00:00
dest = val ;
2009-05-11 22:28:02 +00:00
} else if ( ! strncasecmp ( pvar , " dial-var- " , 9 ) ) {
2009-05-07 02:05:16 +00:00
if ( ! var_event ) {
switch_event_create ( & var_event , SWITCH_EVENT_GENERAL ) ;
} else {
2009-05-11 22:28:02 +00:00
switch_event_del_header ( var_event , pvar + 9 ) ;
2009-05-07 02:05:16 +00:00
}
2009-05-11 22:28:02 +00:00
switch_event_add_header_string ( var_event , SWITCH_STACK_BOTTOM , pvar + 9 , val ) ;
2007-12-04 19:39:14 +00:00
}
}
}
2008-07-30 13:14:39 +00:00
if ( ! dest ) {
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_ERROR , " No dial-string available, please check your user directory. \n " ) ;
2008-07-30 13:14:39 +00:00
cause = SWITCH_CAUSE_MANDATORY_IE_MISSING ;
} else {
2009-05-11 22:28:02 +00:00
const char * varval ;
2007-12-05 18:54:49 +00:00
char * d_dest = NULL ;
2007-12-04 19:39:14 +00:00
switch_channel_t * channel ;
2007-12-20 21:42:00 +00:00
switch_originate_flag_t myflags = SOF_NONE ;
2008-06-23 19:04:17 +00:00
char * cid_name_override = NULL ;
char * cid_num_override = NULL ;
2008-12-11 22:32:02 +00:00
2008-06-23 19:04:17 +00:00
if ( var_event ) {
cid_name_override = switch_event_get_header ( var_event , " origination_caller_id_name " ) ;
cid_num_override = switch_event_get_header ( var_event , " origination_caller_id_number " ) ;
}
2007-12-20 21:42:00 +00:00
2008-01-14 21:58:36 +00:00
if ( session ) {
channel = switch_core_session_get_channel ( session ) ;
2009-05-11 22:28:02 +00:00
if ( ( varval = switch_channel_get_variable ( channel , SWITCH_CALL_TIMEOUT_VARIABLE ) )
| | ( varval = switch_event_get_header ( var_event , " leg_timeout " ) ) ) {
timelimit = atoi ( varval ) ;
2008-01-14 21:58:36 +00:00
}
2008-05-27 04:54:52 +00:00
2008-01-14 21:58:36 +00:00
switch_channel_set_variable ( channel , " dialed_user " , user ) ;
switch_channel_set_variable ( channel , " dialed_domain " , domain ) ;
2008-05-27 04:54:52 +00:00
2008-01-14 21:58:36 +00:00
d_dest = switch_channel_expand_variables ( channel , dest ) ;
2007-12-11 22:56:20 +00:00
2008-01-14 21:58:36 +00:00
} else {
2008-12-11 22:32:02 +00:00
switch_event_t * event = NULL ;
if ( var_event ) {
switch_event_dup ( & event , var_event ) ;
2009-05-06 15:13:51 +00:00
switch_event_del_header ( event , " dialed_user " ) ;
switch_event_del_header ( event , " dialed_domain " ) ;
2009-05-11 22:28:02 +00:00
if ( ( varval = switch_event_get_header ( var_event , SWITCH_CALL_TIMEOUT_VARIABLE ) ) | |
( varval = switch_event_get_header ( var_event , " leg_timeout " ) ) ) {
timelimit = atoi ( varval ) ;
2008-12-23 17:36:50 +00:00
}
2008-12-11 22:32:02 +00:00
} else {
2008-10-02 17:10:05 +00:00
switch_event_create ( & event , SWITCH_EVENT_REQUEST_PARAMS ) ;
2008-05-15 19:29:35 +00:00
switch_assert ( event ) ;
2009-05-06 22:52:09 +00:00
}
switch_event_add_header_string ( event , SWITCH_STACK_BOTTOM , " dialed_user " , user ) ;
switch_event_add_header_string ( event , SWITCH_STACK_BOTTOM , " dialed_domain " , domain ) ;
d_dest = switch_event_expand_headers ( event , dest ) ;
switch_event_destroy ( & event ) ;
2008-01-14 21:58:36 +00:00
}
2008-05-27 04:54:52 +00:00
2007-12-20 21:42:00 +00:00
if ( ( flags & SOF_FORKED_DIAL ) ) {
myflags | = SOF_NOBLOCK ;
}
2009-03-03 20:55:39 +00:00
switch_snprintf ( stupid , sizeof ( stupid ) , " user/%s " , user ) ;
if ( switch_stristr ( stupid , d_dest ) ) {
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_WARNING , " Waddya Daft? You almost called '%s' in an infinate loop! \n " , stupid ) ;
2009-03-03 20:55:39 +00:00
cause = SWITCH_CAUSE_INVALID_IE_CONTENTS ;
} else if ( switch_ivr_originate ( session , new_session , & cause , d_dest , timelimit , NULL ,
2008-12-05 14:59:24 +00:00
cid_name_override , cid_num_override , NULL , var_event , myflags ) = = SWITCH_STATUS_SUCCESS ) {
2007-12-11 01:05:52 +00:00
const char * context ;
switch_caller_profile_t * cp ;
2007-12-11 15:14:33 +00:00
new_channel = switch_core_session_get_channel ( * new_session ) ;
2008-05-27 04:54:52 +00:00
2007-12-11 15:38:07 +00:00
if ( ( context = switch_channel_get_variable ( new_channel , " user_context " ) ) ) {
2007-12-11 01:05:52 +00:00
if ( ( cp = switch_channel_get_caller_profile ( new_channel ) ) ) {
cp - > context = switch_core_strdup ( cp - > pool , context ) ;
}
}
2007-12-04 19:39:14 +00:00
switch_core_session_rwunlock ( * new_session ) ;
}
2007-12-05 18:54:49 +00:00
if ( d_dest ! = dest ) {
switch_safe_free ( d_dest ) ;
}
2007-12-04 19:39:14 +00:00
}
2007-12-11 15:14:33 +00:00
if ( new_channel & & xml ) {
if ( ( x_params = switch_xml_child ( x_domain , " variables " ) ) ) {
for ( x_param = switch_xml_child ( x_params , " variable " ) ; x_param ; x_param = x_param - > next ) {
2009-05-11 22:28:02 +00:00
const char * pvar = switch_xml_attr ( x_param , " name " ) ;
2007-12-11 15:14:33 +00:00
const char * val = switch_xml_attr ( x_param , " value " ) ;
2009-05-11 22:28:02 +00:00
switch_channel_set_variable ( new_channel , pvar , val ) ;
2007-12-11 15:14:33 +00:00
}
}
if ( ( x_params = switch_xml_child ( x_user , " variables " ) ) ) {
for ( x_param = switch_xml_child ( x_params , " variable " ) ; x_param ; x_param = x_param - > next ) {
2009-05-11 22:28:02 +00:00
const char * pvar = switch_xml_attr ( x_param , " name " ) ;
2007-12-11 15:14:33 +00:00
const char * val = switch_xml_attr ( x_param , " value " ) ;
2009-05-11 22:28:02 +00:00
switch_channel_set_variable ( new_channel , pvar , val ) ;
2007-12-11 15:14:33 +00:00
}
}
}
2008-05-27 04:54:52 +00:00
done :
2008-01-27 22:05:01 +00:00
2009-02-13 00:08:12 +00:00
switch_xml_free ( xml ) ;
2008-05-27 04:54:52 +00:00
2008-02-25 19:45:07 +00:00
if ( params ) {
switch_event_destroy ( & params ) ;
}
2009-05-07 02:05:16 +00:00
if ( var_event & & var_event_orig ! = var_event ) {
switch_event_destroy ( & var_event ) ;
}
2008-01-27 22:05:01 +00:00
2008-01-14 21:58:36 +00:00
switch_safe_free ( user ) ;
2007-12-04 19:39:14 +00:00
return cause ;
}
2008-04-21 20:15:50 +00:00
# define HOLD_SYNTAX "[<display message>]"
SWITCH_STANDARD_APP ( hold_function )
{
2008-05-01 16:41:46 +00:00
switch_ivr_hold_uuid ( switch_core_session_get_uuid ( session ) , data , 1 ) ;
2008-04-21 20:15:50 +00:00
}
# define UNHOLD_SYNTAX ""
SWITCH_STANDARD_APP ( unhold_function )
{
switch_ivr_unhold_uuid ( switch_core_session_get_uuid ( session ) ) ;
}
2008-10-02 15:38:45 +00:00
SWITCH_STANDARD_APP ( verbose_events_function )
{
switch_channel_set_flag ( switch_core_session_get_channel ( session ) , CF_VERBOSE_EVENTS ) ;
}
2008-07-10 19:59:57 +00:00
# define WAIT_FOR_SILENCE_SYNTAX "<silence_thresh> <silence_hits> <listen_hits> <timeout_ms> [<file>]"
2008-07-10 15:57:41 +00:00
SWITCH_STANDARD_APP ( wait_for_silence_function )
{
2008-07-10 19:59:57 +00:00
char * argv [ 5 ] = { 0 } ;
uint32_t thresh , silence_hits , listen_hits , timeout_ms = 0 ;
2008-07-10 15:57:41 +00:00
int argc ;
char * lbuf = NULL ;
if ( ! switch_strlen_zero ( data ) & & ( lbuf = switch_core_session_strdup ( session , data ) )
& & ( argc = switch_separate_string ( lbuf , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ) > = 3 ) {
thresh = atoi ( argv [ 0 ] ) ;
silence_hits = atoi ( argv [ 1 ] ) ;
listen_hits = atoi ( argv [ 2 ] ) ;
2008-07-10 19:59:57 +00:00
if ( argv [ 3 ] ) {
if ( ( timeout_ms = atoi ( argv [ 3 ] ) ) < 0 ) {
timeout_ms = 0 ;
}
}
2008-07-10 15:57:41 +00:00
if ( thresh > 0 & & silence_hits > 0 & & listen_hits > 0 ) {
2008-07-10 19:59:57 +00:00
switch_ivr_wait_for_silence ( session , thresh , silence_hits , listen_hits , timeout_ms , argv [ 4 ] ) ;
2008-07-10 15:57:41 +00:00
return ;
}
}
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_ERROR , " Usage: %s \n " , WAIT_FOR_SILENCE_SYNTAX ) ;
2008-07-10 15:57:41 +00:00
}
2009-01-20 20:49:47 +00:00
static switch_status_t event_chat_send ( const char * proto , const char * from , const char * to , const char * subject ,
const char * body , const char * type , const char * hint )
2008-07-23 18:19:56 +00:00
{
switch_event_t * event ;
if ( switch_event_create ( & event , SWITCH_EVENT_RECV_MESSAGE ) = = SWITCH_STATUS_SUCCESS ) {
2008-08-16 02:19:43 +00:00
if ( proto ) switch_event_add_header_string ( event , SWITCH_STACK_BOTTOM , " Proto " , proto ) ;
if ( from ) switch_event_add_header_string ( event , SWITCH_STACK_BOTTOM , " From " , from ) ;
if ( subject ) switch_event_add_header_string ( event , SWITCH_STACK_BOTTOM , " Subject " , subject ) ;
if ( hint ) switch_event_add_header_string ( event , SWITCH_STACK_BOTTOM , " Hint " , hint ) ;
2008-07-23 18:19:56 +00:00
if ( body ) switch_event_add_body ( event , " %s " , body ) ;
if ( to ) {
const char * v ;
2008-08-16 02:19:43 +00:00
switch_event_add_header_string ( event , SWITCH_STACK_BOTTOM , " To " , to ) ;
2008-07-23 18:19:56 +00:00
if ( ( v = switch_core_get_variable ( to ) ) ) {
2008-08-16 02:19:43 +00:00
switch_event_add_header_string ( event , SWITCH_STACK_BOTTOM , " Command " , v ) ;
2008-07-23 18:19:56 +00:00
}
}
if ( switch_event_fire ( & event ) = = SWITCH_STATUS_SUCCESS ) {
return SWITCH_STATUS_SUCCESS ;
}
switch_event_destroy ( & event ) ;
}
return SWITCH_STATUS_MEMERR ;
}
2009-01-20 20:49:47 +00:00
static switch_status_t api_chat_send ( const char * proto , const char * from , const char * to , const char * subject ,
const char * body , const char * type , const char * hint )
2008-07-23 18:19:56 +00:00
{
if ( to ) {
const char * v ;
switch_stream_handle_t stream = { 0 } ;
2009-05-27 02:07:20 +00:00
char * cmd = NULL , * arg ;
2009-01-20 20:49:47 +00:00
2008-07-23 18:19:56 +00:00
if ( ! ( v = switch_core_get_variable ( to ) ) ) {
v = to ;
}
cmd = strdup ( v ) ;
switch_assert ( cmd ) ;
switch_url_decode ( cmd ) ;
if ( ( arg = strchr ( cmd , ' ' ) ) ) {
* arg + + = ' \0 ' ;
}
SWITCH_STANDARD_STREAM ( stream ) ;
switch_api_execute ( cmd , arg , NULL , & stream ) ;
2009-01-20 20:49:47 +00:00
if ( proto ) {
2009-01-20 21:24:37 +00:00
switch_core_chat_send ( proto , " api " , to , hint & & strchr ( hint , ' / ' ) ? hint : from ,
! switch_strlen_zero ( type ) ? type : NULL , ( char * ) stream . data , NULL , NULL ) ;
2008-07-23 18:19:56 +00:00
}
switch_safe_free ( stream . data ) ;
free ( cmd ) ;
}
return SWITCH_STATUS_SUCCESS ;
}
2007-06-20 05:15:07 +00:00
# define SPEAK_DESC "Speak text to a channel via the tts interface"
# define DISPLACE_DESC "Displace audio from a file to the channels input"
# define SESS_REC_DESC "Starts a background recording of the entire session"
# define STOP_SESS_REC_DESC "Stops a background recording of the entire session"
# define SCHED_TRANSF_DESCR "Schedule a transfer in the future"
# define SCHED_BROADCAST_DESCR "Schedule a broadcast in the future"
# define SCHED_HANGUP_DESCR "Schedule a hangup in the future"
2007-11-09 17:46:20 +00:00
# define UNSET_LONG_DESC "Unset a channel variable for the channel calling the application."
# define SET_LONG_DESC "Set a channel variable for the channel calling the application."
# define SET_GLOBAL_LONG_DESC "Set a global variable."
# define SET_PROFILE_VAR_LONG_DESC "Set a caller profile variable for the channel calling the application."
# define EXPORT_LONG_DESC "Set and export a channel variable for the channel calling the application."
# define LOG_LONG_DESC "Logs a channel variable for the channel calling the application."
2008-10-06 23:05:55 +00:00
# define TRANSFER_LONG_DESC "Immediately transfer the calling channel to a new extension"
2007-06-20 05:15:07 +00:00
# define SLEEP_LONG_DESC "Pause the channel for a given number of milliseconds, consuming the audio for that period of time."
2007-06-13 16:00:14 +00:00
SWITCH_MODULE_LOAD_FUNCTION ( mod_dptools_load )
2006-11-28 02:23:26 +00:00
{
2007-06-20 05:15:07 +00:00
switch_api_interface_t * api_interface ;
switch_application_interface_t * app_interface ;
2008-04-22 15:18:35 +00:00
switch_dialplan_interface_t * dp_interface ;
2008-07-23 18:19:56 +00:00
switch_chat_interface_t * chat_interface ;
2006-11-28 02:23:26 +00:00
/* connect my internal structure to the blank pointer passed to me */
2007-06-20 05:15:07 +00:00
* module_interface = switch_loadable_module_create_module_interface ( pool , modname ) ;
2008-08-12 18:00:56 +00:00
error_endpoint_interface = switch_loadable_module_create_interface ( * module_interface , SWITCH_ENDPOINT_INTERFACE ) ;
2008-11-05 00:01:37 +00:00
error_endpoint_interface - > interface_name = " error " ;
2008-08-12 18:00:56 +00:00
error_endpoint_interface - > io_routines = & error_io_routines ;
2008-12-23 17:36:50 +00:00
group_endpoint_interface = switch_loadable_module_create_interface ( * module_interface , SWITCH_ENDPOINT_INTERFACE ) ;
group_endpoint_interface - > interface_name = " group " ;
group_endpoint_interface - > io_routines = & group_io_routines ;
2007-12-04 19:39:14 +00:00
user_endpoint_interface = switch_loadable_module_create_interface ( * module_interface , SWITCH_ENDPOINT_INTERFACE ) ;
2008-11-05 00:01:37 +00:00
user_endpoint_interface - > interface_name = " user " ;
2008-05-27 04:54:52 +00:00
user_endpoint_interface - > io_routines = & user_io_routines ;
2007-12-04 19:39:14 +00:00
2008-07-23 18:19:56 +00:00
SWITCH_ADD_CHAT ( chat_interface , " event " , event_chat_send ) ;
SWITCH_ADD_CHAT ( chat_interface , " api " , api_chat_send ) ;
2008-10-02 15:38:45 +00:00
2008-01-06 22:14:10 +00:00
SWITCH_ADD_API ( api_interface , " strepoch " , " Convert a date string into epoch time " , strepoch_api_function , " <string> " ) ;
2009-01-20 21:24:37 +00:00
SWITCH_ADD_API ( api_interface , " chat " , " chat " , chat_api_function , " <proto>|<from>|<to>|<message>|[<content-type>] " ) ;
2007-06-20 05:15:07 +00:00
SWITCH_ADD_API ( api_interface , " strftime " , " strftime " , strftime_api_function , " <format_string> " ) ;
2009-04-27 15:52:34 +00:00
SWITCH_ADD_API ( api_interface , " presence " , " presence " , presence_api_function , PRESENCE_USAGE ) ;
2008-05-27 04:54:52 +00:00
SWITCH_ADD_APP ( app_interface , " privacy " , " Set privacy on calls " , " Set caller privacy on calls. " , privacy_function , " off|on|name|full|number " ,
SAF_SUPPORT_NOMEDIA ) ;
2008-04-21 20:15:50 +00:00
2008-11-05 17:25:54 +00:00
SWITCH_ADD_APP ( app_interface , " flush_dtmf " , " flush any queued dtmf " , " flush any queued dtmf " , flush_dtmf_function , " " , SAF_SUPPORT_NOMEDIA ) ;
2008-04-21 20:15:50 +00:00
SWITCH_ADD_APP ( app_interface , " hold " , " Send a hold message " , " Send a hold message " , hold_function , HOLD_SYNTAX , SAF_SUPPORT_NOMEDIA ) ;
SWITCH_ADD_APP ( app_interface , " unhold " , " Send a un-hold message " , " Send a un-hold message " , unhold_function , UNHOLD_SYNTAX , SAF_SUPPORT_NOMEDIA ) ;
2008-05-27 04:54:52 +00:00
SWITCH_ADD_APP ( app_interface , " transfer " , " Transfer a channel " , TRANSFER_LONG_DESC , transfer_function , " <exten> [<dialplan> <context>] " ,
SAF_SUPPORT_NOMEDIA ) ;
SWITCH_ADD_APP ( app_interface , " check_acl " , " Check an ip against an ACL list " , " Check an ip against an ACL list " , check_acl_function ,
" <ip> <acl | cidr> [<hangup_cause>] " , SAF_SUPPORT_NOMEDIA ) ;
2008-10-02 15:38:45 +00:00
SWITCH_ADD_APP ( app_interface , " verbose_events " , " Make ALL Events verbose. " , " Make ALL Events verbose. " , verbose_events_function , " " , SAF_SUPPORT_NOMEDIA ) ;
2008-03-18 18:48:32 +00:00
SWITCH_ADD_APP ( app_interface , " sleep " , " Pause a channel " , SLEEP_LONG_DESC , sleep_function , " <pausemilliseconds> " , SAF_SUPPORT_NOMEDIA ) ;
2007-10-04 15:09:44 +00:00
SWITCH_ADD_APP ( app_interface , " delay_echo " , " echo audio at a specified delay " , " Delay n ms " , delay_function , " <delay ms> " , SAF_NONE ) ;
2008-07-21 13:39:27 +00:00
SWITCH_ADD_APP ( app_interface , " strftime " , " strftime " , " strftime " , strftime_function , " [<epoch>|]<format string> " , SAF_SUPPORT_NOMEDIA ) ;
2007-06-20 05:15:07 +00:00
SWITCH_ADD_APP ( app_interface , " phrase " , " Say a Phrase " , " Say a Phrase " , phrase_function , " <macro_name>,<data> " , SAF_NONE ) ;
SWITCH_ADD_APP ( app_interface , " eval " , " Do Nothing " , " Do Nothing " , eval_function , " " , SAF_SUPPORT_NOMEDIA ) ;
2008-03-08 01:34:08 +00:00
SWITCH_ADD_APP ( app_interface , " pre_answer " , " Pre-Answer the call " , " Pre-Answer the call for a channel. " , pre_answer_function , " " , SAF_SUPPORT_NOMEDIA ) ;
SWITCH_ADD_APP ( app_interface , " answer " , " Answer the call " , " Answer the call for a channel. " , answer_function , " " , SAF_SUPPORT_NOMEDIA ) ;
2007-06-20 05:15:07 +00:00
SWITCH_ADD_APP ( app_interface , " hangup " , " Hangup the call " , " Hangup the call for a channel. " , hangup_function , " [<cause>] " , SAF_SUPPORT_NOMEDIA ) ;
2008-02-26 23:29:58 +00:00
SWITCH_ADD_APP ( app_interface , " set_name " , " Name the channel " , " Name the channel " , set_name_function , " <name> " , SAF_SUPPORT_NOMEDIA ) ;
2008-08-25 16:30:28 +00:00
SWITCH_ADD_APP ( app_interface , " presence " , " Send Presence " , " Send Presence. " , presence_function , " <rpid> <status> [<id>] " , SAF_SUPPORT_NOMEDIA ) ;
2008-06-11 18:17:10 +00:00
SWITCH_ADD_APP ( app_interface , " log " , " Logs to the logger " , LOG_LONG_DESC , log_function , " <log_level> <log_string> " , SAF_SUPPORT_NOMEDIA ) ;
2007-06-20 05:15:07 +00:00
SWITCH_ADD_APP ( app_interface , " info " , " Display Call Info " , " Display Call Info " , info_function , " " , SAF_SUPPORT_NOMEDIA ) ;
2007-06-23 05:41:07 +00:00
SWITCH_ADD_APP ( app_interface , " event " , " Fire an event " , " Fire an event " , event_function , " " , SAF_SUPPORT_NOMEDIA ) ;
2009-02-05 19:53:13 +00:00
SWITCH_ADD_APP ( app_interface , " sound_test " , " Analyze Audio " , " Analyze Audio " , sound_test_function , " " , SAF_NONE ) ;
2008-05-27 04:54:52 +00:00
SWITCH_ADD_APP ( app_interface , " export " , " Export a channel variable across a bridge " , EXPORT_LONG_DESC , export_function , " <varname>=<value> " ,
SAF_SUPPORT_NOMEDIA ) ;
2007-11-09 17:46:20 +00:00
SWITCH_ADD_APP ( app_interface , " set " , " Set a channel variable " , SET_LONG_DESC , set_function , " <varname>=<value> " , SAF_SUPPORT_NOMEDIA ) ;
2008-05-27 04:54:52 +00:00
SWITCH_ADD_APP ( app_interface , " set_global " , " Set a global variable " , SET_GLOBAL_LONG_DESC , set_global_function , " <varname>=<value> " ,
SAF_SUPPORT_NOMEDIA ) ;
SWITCH_ADD_APP ( app_interface , " set_profile_var " , " Set a caller profile variable " , SET_PROFILE_VAR_LONG_DESC , set_profile_var_function ,
" <varname>=<value> " , SAF_SUPPORT_NOMEDIA ) ;
2007-11-09 17:46:20 +00:00
SWITCH_ADD_APP ( app_interface , " unset " , " Unset a channel variable " , UNSET_LONG_DESC , unset_function , " <varname> " , SAF_SUPPORT_NOMEDIA ) ;
2007-06-20 05:15:07 +00:00
SWITCH_ADD_APP ( app_interface , " ring_ready " , " Indicate Ring_Ready " , " Indicate Ring_Ready on a channel. " , ring_ready_function , " " , SAF_SUPPORT_NOMEDIA ) ;
2008-07-29 15:19:58 +00:00
SWITCH_ADD_APP ( app_interface , " remove_bugs " , " Remove media bugs " , " Remove all media bugs from a channel. " , remove_bugs_function , " " , SAF_NONE ) ;
2007-06-25 21:25:33 +00:00
SWITCH_ADD_APP ( app_interface , " break " , " Break " , " Set the break flag. " , break_function , " " , SAF_SUPPORT_NOMEDIA ) ;
2007-06-20 05:15:07 +00:00
SWITCH_ADD_APP ( app_interface , " detect_speech " , " Detect speech " , " Detect speech on a channel. " , detect_speech_function , DETECT_SPEECH_SYNTAX , SAF_NONE ) ;
SWITCH_ADD_APP ( app_interface , " ivr " , " Run an ivr menu " , " Run an ivr menu. " , ivr_application_function , " <menu_name> " , SAF_NONE ) ;
2008-05-27 04:54:52 +00:00
SWITCH_ADD_APP ( app_interface , " redirect " , " Send session redirect " , " Send a redirect message to a session. " , redirect_function , " <redirect_data> " ,
SAF_SUPPORT_NOMEDIA ) ;
SWITCH_ADD_APP ( app_interface , " send_display " , " Send session a new display " , " Send session a new display. " , display_function , " <text> " ,
SAF_SUPPORT_NOMEDIA ) ;
SWITCH_ADD_APP ( app_interface , " respond " , " Send session respond " , " Send a respond message to a session. " , respond_function , " <respond_data> " ,
SAF_SUPPORT_NOMEDIA ) ;
2008-01-03 23:42:15 +00:00
SWITCH_ADD_APP ( app_interface , " deflect " , " Send call deflect " , " Send a call deflect. " , deflect_function , " <deflect_data> " , SAF_SUPPORT_NOMEDIA ) ;
2008-05-27 04:54:52 +00:00
SWITCH_ADD_APP ( app_interface , " queue_dtmf " , " Queue dtmf to be sent " , " Queue dtmf to be sent from a session " , queue_dtmf_function , " <dtmf_data> " ,
SAF_SUPPORT_NOMEDIA ) ;
SWITCH_ADD_APP ( app_interface , " send_dtmf " , " Send dtmf to be sent " , " Send dtmf to be sent from a session " , send_dtmf_function , " <dtmf_data> " ,
SAF_SUPPORT_NOMEDIA ) ;
SWITCH_ADD_APP ( app_interface , " sched_hangup " , SCHED_HANGUP_DESCR , SCHED_HANGUP_DESCR , sched_hangup_function , " [+]<time> [<cause>] " ,
SAF_SUPPORT_NOMEDIA ) ;
SWITCH_ADD_APP ( app_interface , " sched_broadcast " , SCHED_BROADCAST_DESCR , SCHED_BROADCAST_DESCR , sched_broadcast_function ,
" [+]<time> <path> [aleg|bleg|both] " , SAF_SUPPORT_NOMEDIA ) ;
SWITCH_ADD_APP ( app_interface , " sched_transfer " , SCHED_TRANSF_DESCR , SCHED_TRANSF_DESCR , sched_transfer_function ,
" [+]<time> <extension> <dialplan> <context> " , SAF_SUPPORT_NOMEDIA ) ;
2007-06-20 05:15:07 +00:00
SWITCH_ADD_APP ( app_interface , " execute_extension " , " Execute an extension " , " Execute an extension " , exe_function , EXE_SYNTAX , SAF_SUPPORT_NOMEDIA ) ;
2009-03-06 20:16:48 +00:00
SWITCH_ADD_APP ( app_interface , " sched_heartbeat " , " Enable Scheduled Heartbeat " , " Enable Scheduled Heartbeat " ,
sched_heartbeat_function , SCHED_HEARTBEAT_SYNTAX , SAF_SUPPORT_NOMEDIA ) ;
SWITCH_ADD_APP ( app_interface , " enable_heartbeat " , " Enable Media Heartbeat " , " Enable Media Heartbeat " ,
heartbeat_function , HEARTBEAT_SYNTAX , SAF_SUPPORT_NOMEDIA ) ;
2008-12-11 23:06:51 +00:00
SWITCH_ADD_APP ( app_interface , " mkdir " , " Create a directory " , " Create a directory " , mkdir_function , MKDIR_SYNTAX , SAF_SUPPORT_NOMEDIA ) ;
2008-05-27 04:54:52 +00:00
SWITCH_ADD_APP ( app_interface , " soft_hold " , " Put a bridged channel on hold " , " Put a bridged channel on hold " , soft_hold_function , SOFT_HOLD_SYNTAX ,
SAF_NONE ) ;
SWITCH_ADD_APP ( app_interface , " bind_meta_app " , " Bind a key to an application " , " Bind a key to an application " , dtmf_bind_function , BIND_SYNTAX ,
SAF_SUPPORT_NOMEDIA ) ;
2008-12-31 01:08:51 +00:00
SWITCH_ADD_APP ( app_interface , " unbind_meta_app " , " Unbind a key from an application " , " Unbind a key from an application " , dtmf_unbind_function ,
UNBIND_SYNTAX , SAF_SUPPORT_NOMEDIA ) ;
2007-12-08 00:14:21 +00:00
SWITCH_ADD_APP ( app_interface , " intercept " , " intercept " , " intercept " , intercept_function , INTERCEPT_SYNTAX , SAF_NONE ) ;
2007-11-30 22:56:01 +00:00
SWITCH_ADD_APP ( app_interface , " eavesdrop " , " eavesdrop on a uuid " , " eavesdrop on a uuid " , eavesdrop_function , eavesdrop_SYNTAX , SAF_NONE ) ;
2008-04-12 04:59:15 +00:00
SWITCH_ADD_APP ( app_interface , " three_way " , " three way call with a uuid " , " three way call with a uuid " , three_way_function , threeway_SYNTAX , SAF_NONE ) ;
2007-11-13 19:58:44 +00:00
SWITCH_ADD_APP ( app_interface , " set_user " , " Set a User " , " Set a User " , set_user_function , SET_USER_SYNTAX , SAF_SUPPORT_NOMEDIA ) ;
2007-06-20 05:15:07 +00:00
SWITCH_ADD_APP ( app_interface , " stop_dtmf " , " stop inband dtmf " , " Stop detecting inband dtmf. " , stop_dtmf_session_function , " " , SAF_NONE ) ;
SWITCH_ADD_APP ( app_interface , " start_dtmf " , " Detect dtmf " , " Detect inband dtmf on the session " , dtmf_session_function , " " , SAF_NONE ) ;
2008-05-27 04:54:52 +00:00
SWITCH_ADD_APP ( app_interface , " stop_dtmf_generate " , " stop inband dtmf generation " , " Stop generating inband dtmf. " ,
2007-10-31 16:44:02 +00:00
stop_dtmf_session_generate_function , " [write] " , SAF_NONE ) ;
2008-05-27 04:54:52 +00:00
SWITCH_ADD_APP ( app_interface , " start_dtmf_generate " , " Generate dtmf " , " Generate inband dtmf on the session " , dtmf_session_generate_function , " " ,
SAF_NONE ) ;
2007-06-20 05:15:07 +00:00
SWITCH_ADD_APP ( app_interface , " stop_tone_detect " , " stop detecting tones " , " Stop detecting tones " , stop_fax_detect_session_function , " " , SAF_NONE ) ;
SWITCH_ADD_APP ( app_interface , " fax_detect " , " Detect faxes " , " Detect fax send tone " , fax_detect_session_function , " " , SAF_NONE ) ;
SWITCH_ADD_APP ( app_interface , " tone_detect " , " Detect tones " , " Detect tones " , tone_detect_session_function , " " , SAF_NONE ) ;
SWITCH_ADD_APP ( app_interface , " echo " , " Echo " , " Perform an echo test against the calling channel " , echo_function , " " , SAF_NONE ) ;
2007-12-13 22:17:20 +00:00
SWITCH_ADD_APP ( app_interface , " park " , " Park " , " Park " , park_function , " " , SAF_NONE ) ;
SWITCH_ADD_APP ( app_interface , " park_state " , " Park State " , " Park State " , park_state_function , " " , SAF_NONE ) ;
2007-06-20 05:15:07 +00:00
SWITCH_ADD_APP ( app_interface , " gentones " , " Generate Tones " , " Generate tones to the channel " , gentones_function , " <tgml_script>[|<loops>] " , SAF_NONE ) ;
SWITCH_ADD_APP ( app_interface , " playback " , " Playback File " , " Playback a file to the channel " , playback_function , " <path> " , SAF_NONE ) ;
2008-03-13 01:35:48 +00:00
SWITCH_ADD_APP ( app_interface , " att_xfer " , " Attended Transfer " , " Attended Transfer " , att_xfer_function , " <channel_url> " , SAF_NONE ) ;
2009-01-15 03:42:45 +00:00
SWITCH_ADD_APP ( app_interface , " read " , " Read Digits " , " Read Digits " , read_function , " <min> <max> <file> <var_name> <timeout> <terminators> " , SAF_NONE ) ;
2009-01-14 20:29:16 +00:00
SWITCH_ADD_APP ( app_interface , " play_and_get_digits " , " Play and get Digits " , " Play and get Digits " ,
2009-01-15 03:42:45 +00:00
play_and_get_digits_function , " <min> <max> <tries> <timeout> <terminators> <file> <invalid_file> <var_name> <regexp> " , SAF_NONE ) ;
2007-06-20 05:15:07 +00:00
SWITCH_ADD_APP ( app_interface , " stop_record_session " , " Stop Record Session " , STOP_SESS_REC_DESC , stop_record_session_function , " <path> " , SAF_NONE ) ;
2008-09-26 18:03:17 +00:00
SWITCH_ADD_APP ( app_interface , " record_session " , " Record Session " , SESS_REC_DESC , record_session_function , " <path> [+<timeout>] " , SAF_NONE ) ;
2008-05-27 04:54:52 +00:00
SWITCH_ADD_APP ( app_interface , " record " , " Record File " , " Record a file from the channels input " , record_function ,
" <path> [<time_limit_secs>] [<silence_thresh>] [<silence_hits>] " , SAF_NONE ) ;
SWITCH_ADD_APP ( app_interface , " stop_displace_session " , " Stop Displace File " , " Stop Displacing to a file " , stop_displace_session_function , " <path> " ,
SAF_NONE ) ;
2008-07-14 20:57:35 +00:00
SWITCH_ADD_APP ( app_interface , " displace_session " , " Displace File " , DISPLACE_DESC , displace_session_function , " <path> [<flags>] [+time_limit_ms] " ,
2008-05-27 04:54:52 +00:00
SAF_NONE ) ;
2007-06-20 05:15:07 +00:00
SWITCH_ADD_APP ( app_interface , " speak " , " Speak text " , SPEAK_DESC , speak_function , " <engine>|<voice>|<text> " , SAF_NONE ) ;
2008-05-27 04:54:52 +00:00
SWITCH_ADD_APP ( app_interface , " clear_speech_cache " , " Clear Speech Handle Cache " , " Clear Speech Handle Cache " , clear_speech_cache_function , " " ,
SAF_NONE ) ;
SWITCH_ADD_APP ( app_interface , " bridge " , " Bridge Audio " , " Bridge the audio between two sessions " , audio_bridge_function , " <channel_url> " ,
SAF_SUPPORT_NOMEDIA ) ;
SWITCH_ADD_APP ( app_interface , " system " , " Execute a system command " , " Execute a system command " , system_session_function , " <command> " ,
SAF_SUPPORT_NOMEDIA ) ;
2008-05-09 22:16:08 +00:00
SWITCH_ADD_APP ( app_interface , " say " , " say " , " say " , say_function , SAY_SYNTAX , SAF_NONE ) ;
2006-11-28 02:23:26 +00:00
2008-07-10 15:57:41 +00:00
SWITCH_ADD_APP ( app_interface , " wait_for_silence " , " wait_for_silence " , " wait_for_silence " , wait_for_silence_function , WAIT_FOR_SILENCE_SYNTAX , SAF_NONE ) ;
2008-04-22 15:18:35 +00:00
SWITCH_ADD_DIALPLAN ( dp_interface , " inline " , inline_dialplan_hunt ) ;
2006-11-28 02:23:26 +00:00
/* indicate that the module should continue to be loaded */
return SWITCH_STATUS_SUCCESS ;
}
2006-11-27 22:30:48 +00:00
/* For Emacs:
* Local Variables :
* mode : c
2008-02-03 22:14:57 +00:00
* indent - tabs - mode : t
2006-11-27 22:30:48 +00:00
* tab - width : 4
* c - basic - offset : 4
* End :
* For VIM :
2008-07-03 19:12:26 +00:00
* vim : set softtabstop = 4 shiftwidth = 4 tabstop = 4 :
2006-11-27 22:30:48 +00:00
*/