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
2009-10-23 16:03:42 +00:00
if ( zstr ( target ) ) {
2008-04-26 15:59:42 +00:00
target = caller_profile - > destination_number ;
}
2008-05-27 04:54:52 +00:00
2009-10-23 16:03:42 +00:00
if ( ! zstr ( 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 ) ;
}
2009-11-05 02:10:10 +00:00
caller_profile - > destination_number = ( char * ) caller_profile - > rdnis ;
caller_profile - > rdnis = SWITCH_BLANK_STRING ;
2008-04-22 15:18:35 +00:00
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
{
2009-10-04 00:00:30 +00:00
char * argv [ 4 ] ;
int argc ;
2006-11-28 02:23:26 +00:00
char * lbuf = NULL ;
2009-10-23 16:03:42 +00:00
if ( ! zstr ( data ) & & ( lbuf = switch_core_session_strdup ( session , data ) )
2009-10-04 00:00:30 +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
2009-10-23 16:03:42 +00:00
if ( ! zstr ( 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
2009-10-23 16:03:42 +00:00
if ( ! zstr ( data ) & & ( lbuf = switch_core_session_strdup ( session , data ) )
2008-04-09 18:15:15 +00:00
& & ( 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 ) ;
}
2009-09-24 22:21:44 +00:00
# define BIND_SYNTAX "<key> [a|b|ab] [a|b|o|s|i|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
2009-10-23 16:03:42 +00:00
if ( ! zstr ( 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 ;
}
}
2009-09-24 22:21:44 +00:00
if ( strchr ( argv [ 2 ] , ' i ' ) ) {
bind_flags | = SBF_EXEC_INLINE ;
}
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 ;
2009-10-23 16:03:42 +00:00
if ( ! zstr ( data ) & & ( mydata = switch_core_session_strdup ( session , data ) ) ) {
2008-05-24 17:28:04 +00:00
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 )
{
2009-10-23 16:03:42 +00:00
if ( zstr ( 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 " ) ) {
2009-11-17 00:12:54 +00:00
switch_cache_db_handle_t * db = NULL ;
2008-04-11 22:35:30 +00:00
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
2009-11-17 00:12:54 +00:00
switch_core_db_handle ( & db ) ;
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 ;
2009-11-17 00:12:54 +00:00
switch_cache_db_execute_sql_callback ( db , sql , e_callback , & e_data , & errmsg ) ;
2008-04-11 22:35:30 +00:00
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 ) ;
2009-11-17 00:12:54 +00:00
switch_cache_db_release_db_handle ( & 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 )
{
2009-10-23 16:03:42 +00:00
if ( zstr ( 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
}
}
2009-09-08 19:05:32 +00:00
# define SET_USER_SYNTAX "<user>@<domain> [prefix]"
2007-11-13 19:58:44 +00:00
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 ;
2009-10-23 16:03:42 +00:00
if ( ! zstr ( data ) & & ( mydata = switch_core_session_strdup ( session , data ) ) ) {
2008-03-26 22:14:09 +00:00
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
2009-10-23 16:03:42 +00:00
if ( ! zstr ( 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
2009-10-23 16:03:42 +00:00
if ( ! zstr ( 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 ;
2009-10-23 16:03:42 +00:00
if ( ! zstr ( 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 ;
2009-10-23 16:03:42 +00:00
if ( ! zstr ( 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 ;
2009-10-23 16:03:42 +00:00
if ( zstr ( data ) ) {
2007-10-04 15:09:44 +00:00
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
2009-10-23 16:03:42 +00:00
if ( ! zstr ( data ) ) {
2008-01-06 22:14:10 +00:00
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 )
{
2009-10-23 16:03:42 +00:00
if ( ! zstr ( data ) ) {
2008-02-26 23:29:58 +00:00
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 ) ;
2009-10-23 16:03:42 +00:00
if ( zstr ( 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 ) ;
}
2009-10-23 23:02:14 +00:00
SWITCH_STANDARD_APP ( warning_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_WARNING ;
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
2009-10-23 16:03:42 +00:00
if ( zstr ( 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 ' ;
2009-10-23 16:03:42 +00:00
if ( zstr ( val ) ) {
2007-03-29 22:31:56 +00:00
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 ;
2009-10-23 16:03:42 +00:00
if ( zstr ( 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 ' ;
2009-10-23 16:03:42 +00:00
if ( zstr ( val ) ) {
2007-11-09 15:55:40 +00:00
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 )
{
char * name , * val = NULL ;
2009-10-23 16:03:42 +00:00
if ( zstr ( 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 {
2009-10-19 19:58:23 +00:00
name = switch_core_session_strdup ( session , data ) ;
2007-08-22 00:22:22 +00:00
val = strchr ( name , ' = ' ) ;
if ( val ) {
* val + + = ' \0 ' ;
2009-10-23 16:03:42 +00:00
if ( zstr ( val ) ) {
2007-08-22 00:22:22 +00:00
val = NULL ;
}
}
2009-10-19 19:58:23 +00:00
switch_channel_set_profile_var ( switch_core_session_get_channel ( session ) , name , val ) ;
2007-08-22 00:22:22 +00:00
}
}
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
2009-10-23 16:03:42 +00:00
if ( zstr ( 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 ' ;
2009-10-23 16:03:42 +00:00
if ( zstr ( val ) ) {
2007-03-29 22:31:56 +00:00
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
{
2009-10-23 16:03:42 +00:00
if ( zstr ( 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 ;
2009-08-26 16:29:47 +00:00
int level = SWITCH_LOG_INFO ;
2009-10-23 16:03:42 +00:00
if ( ! zstr ( data ) ) {
2009-08-26 16:29:47 +00:00
level = switch_log_str2level ( data ) ;
}
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-26 16:29:47 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , level , " 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 ) {
2009-10-23 16:03:42 +00:00
if ( ! zstr ( 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
2009-10-23 16:03:42 +00:00
if ( zstr ( 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 ;
2009-10-23 16:03:42 +00:00
if ( ! zstr ( 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 ;
2009-10-23 16:03:42 +00:00
if ( zstr ( 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 ;
2009-10-23 16:03:42 +00:00
if ( ! zstr ( 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 ) ;
2009-10-23 16:03:42 +00:00
if ( zstr ( cmd ) ) {
2008-10-12 21:51:51 +00:00
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
2009-10-23 16:03:42 +00:00
if ( ! zstr ( 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 ;
2009-10-23 16:03:42 +00:00
if ( ! zstr ( 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 ] ,
2009-10-23 16:03:42 +00:00
! zstr ( 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
2009-10-23 16:03:42 +00:00
if ( ! zstr ( data ) ) {
2007-10-31 16:44:02 +00:00
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
2009-10-23 16:03:42 +00:00
if ( zstr ( 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 ) ;
2009-10-23 16:03:42 +00:00
if ( zstr ( 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 } ;
2009-10-23 16:03:42 +00:00
if ( zstr ( 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
2009-09-29 19:05:10 +00:00
if ( dtmf - > digit = = ' * ' ) {
switch_channel_hangup ( channel , SWITCH_CAUSE_NORMAL_CLEARING ) ;
return SWITCH_STATUS_FALSE ;
}
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 ) ;
2009-10-07 04:30:19 +00:00
const char * holding = switch_channel_get_variable ( channel , SWITCH_SOFT_HOLDING_UUID_VARIABLE ) ;
2008-03-13 01:08:42 +00:00
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 )
{
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 ;
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 ) ;
}
2009-10-07 04:30:19 +00:00
switch_channel_set_variable ( channel , SWITCH_SOFT_HOLDING_UUID_VARIABLE , bond ) ;
2008-05-27 04:54:52 +00:00
2009-11-20 02:17:08 +00:00
if ( switch_ivr_originate ( session , & peer_session , & cause , data , 0 , NULL , NULL , NULL , NULL , NULL , SOF_NONE , NULL )
2008-12-05 14:59:24 +00:00
! = 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 :
2009-10-07 04:30:19 +00:00
switch_channel_set_variable ( channel , SWITCH_SOFT_HOLDING_UUID_VARIABLE , NULL ) ;
switch_channel_clear_flag ( channel , CF_XFER_ZOMBIE ) ;
2008-03-13 01:08:42 +00:00
}
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 ;
2009-10-23 16:03:42 +00:00
if ( ! zstr ( data ) & & ( mydata = switch_core_session_strdup ( session , data ) ) ) {
2008-03-04 18:55:16 +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 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 ;
}
2009-10-23 16:03:42 +00:00
if ( zstr ( valid_terminators ) ) {
2008-03-04 18:55:16 +00:00
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 ;
2009-10-23 16:03:42 +00:00
if ( ! zstr ( data ) & & ( mydata = switch_core_session_strdup ( session , data ) ) ) {
2009-01-14 20:29:16 +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 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
}
2009-10-23 16:03:42 +00:00
if ( zstr ( valid_terminators ) ) {
2009-01-14 20:29:16 +00:00
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
2009-10-23 16:03:42 +00:00
if ( ! zstr ( data ) & & ( lbuf = switch_core_session_strdup ( session , data ) )
2008-11-21 13:56:32 +00:00
& & ( 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
2009-10-23 16:03:42 +00:00
if ( ! zstr ( data ) & & ( mydata = switch_core_session_strdup ( session , data ) ) ) {
2008-11-21 13:56:32 +00:00
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 ;
2009-09-02 20:43:49 +00:00
switch_file_handle_t fh = { 0 } ;
char * p ;
const char * file = NULL ;
if ( data ) {
file = switch_core_session_strdup ( session , data ) ;
if ( ( p = strchr ( file , ' @ ' ) ) & & * ( p + 1 ) = = ' @ ' ) {
* p = ' \0 ' ;
p + = 2 ;
if ( p & & * p ) {
fh . samples = atoi ( p ) ;
}
}
} else {
file = data ;
}
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 , " " ) ;
2009-09-02 20:43:49 +00:00
status = switch_ivr_play_file ( session , & fh , file , & args ) ;
2008-12-08 15:42:37 +00:00
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
}
2009-10-07 04:30:19 +00:00
SWITCH_STANDARD_APP ( endless_playback_function )
{
switch_channel_t * channel = switch_core_session_get_channel ( session ) ;
switch_status_t status = SWITCH_STATUS_SUCCESS ;
const char * file = data ;
while ( switch_channel_ready ( channel ) ) {
2009-10-08 16:14:45 +00:00
status = switch_ivr_play_file ( session , NULL , file , NULL ) ;
if ( status ! = SWITCH_STATUS_SUCCESS & & status ! = SWITCH_STATUS_BREAK ) {
2009-10-07 04:30:19 +00:00
break ;
}
}
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-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
2009-10-23 16:03:42 +00:00
if ( zstr ( 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 ;
2009-10-23 16:03:42 +00:00
if ( ! zstr ( 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 ] ) ;
2009-10-23 16:03:42 +00:00
} else if ( ! zstr ( argv [ x ] ) ) {
2007-06-15 01:47:48 +00:00
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 ;
2009-10-23 16:03:42 +00:00
if ( ! zstr ( 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 ) ;
}
}
2009-09-23 22:39:00 +00:00
SWITCH_STANDARD_APP ( preprocess_session_function )
{
switch_ivr_preprocess_session ( session , ( char * ) data ) ;
}
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 ;
2009-10-23 16:03:42 +00:00
if ( zstr ( data ) ) {
2008-01-06 22:36:41 +00:00
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 */
/********************************************************************************/
2009-10-23 22:37:49 +00:00
static switch_status_t camp_fire ( switch_core_session_t * session , void * input , switch_input_type_t itype , void * buf , unsigned int buflen )
{
switch ( itype ) {
case SWITCH_INPUT_TYPE_DTMF :
{
switch_dtmf_t * dtmf = ( switch_dtmf_t * ) input ;
char * key = ( char * ) buf ;
if ( dtmf - > digit = = * key ) {
return SWITCH_STATUS_BREAK ;
}
}
default :
break ;
}
return SWITCH_STATUS_SUCCESS ;
}
2009-10-22 22:11:28 +00:00
struct camping_stake {
switch_core_session_t * session ;
int running ;
2009-10-23 22:37:49 +00:00
int do_xfer ;
2009-10-22 22:11:28 +00:00
const char * moh ;
} ;
static void * SWITCH_THREAD_FUNC camp_music_thread ( switch_thread_t * thread , void * obj )
{
struct camping_stake * stake = ( struct camping_stake * ) obj ;
switch_core_session_t * session = stake - > session ;
switch_channel_t * channel = switch_core_session_get_channel ( stake - > session ) ;
2009-10-23 22:37:49 +00:00
const char * moh = stake - > moh , * greet = NULL ;
switch_input_args_t args = { 0 } ;
char dbuf [ 2 ] = " " ;
switch_status_t status = SWITCH_STATUS_FALSE ;
const char * stop ;
if ( ( stop = switch_channel_get_variable ( channel , " campon_stop_key " ) ) ) {
* dbuf = * stop ;
}
2009-10-22 22:11:28 +00:00
2009-10-23 22:37:49 +00:00
args . input_callback = camp_fire ;
args . buf = dbuf ;
args . buflen = sizeof ( dbuf ) ;
2009-10-22 22:11:28 +00:00
switch_core_session_read_lock ( session ) ;
2009-10-23 22:37:49 +00:00
/* don't set this to a local_stream:// or you will not be happy */
if ( ( greet = switch_channel_get_variable ( channel , " campon_announce_sound " ) ) ) {
status = switch_ivr_play_file ( session , NULL , greet , & args ) ;
}
2009-10-22 22:11:28 +00:00
while ( stake - > running & & switch_channel_ready ( channel ) ) {
2009-10-23 22:37:49 +00:00
if ( status ! = SWITCH_STATUS_BREAK ) {
if ( ! strcasecmp ( moh , " silence " ) ) {
status = switch_ivr_collect_digits_callback ( session , & args , 0 , 0 ) ;
} else {
status = switch_ivr_play_file ( session , NULL , stake - > moh , & args ) ;
}
}
if ( status = = SWITCH_STATUS_BREAK ) {
switch_channel_set_flag ( channel , CF_NOT_READY ) ;
stake - > do_xfer = 1 ;
2009-10-22 22:11:28 +00:00
}
}
switch_core_session_rwunlock ( session ) ;
2009-10-23 22:37:49 +00:00
stake - > running = 0 ;
2009-10-22 22:11:28 +00:00
return NULL ;
}
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 ;
2009-11-09 23:49:35 +00:00
const char * continue_on_fail = NULL , * failure_causes = NULL ,
2009-10-22 22:11:28 +00:00
* v_campon = NULL , * v_campon_retries , * v_campon_sleep , * v_campon_timeout , * v_campon_fallback_exten = NULL ;
2007-06-13 16:00:14 +00:00
switch_call_cause_t cause = SWITCH_CAUSE_NORMAL_CLEARING ;
2009-10-23 22:37:49 +00:00
int campon_retries = 100 , campon_timeout = 10 , campon_sleep = 10 , tmp , camping = 0 , fail = 0 , thread_started = 0 ;
2009-10-22 22:11:28 +00:00
struct camping_stake stake = { 0 } ;
const char * moh = NULL ;
switch_thread_t * thread = NULL ;
switch_threadattr_t * thd_attr = NULL ;
char * camp_data = NULL ;
switch_status_t status ;
2009-10-23 16:03:42 +00:00
if ( zstr ( data ) ) {
2007-06-13 16:00:14 +00:00
return ;
}
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
2009-10-22 22:11:28 +00:00
if ( ( v_campon = switch_channel_get_variable ( caller_channel , " campon " ) ) & & switch_true ( v_campon ) ) {
const char * cid_name = NULL ;
const char * cid_number = NULL ;
if ( ! ( cid_name = switch_channel_get_variable ( caller_channel , " effective_caller_id_name " ) ) ) {
cid_name = switch_channel_get_variable ( caller_channel , " caller_id_name " ) ;
}
if ( ! ( cid_number = switch_channel_get_variable ( caller_channel , " effective_caller_id_number " ) ) ) {
cid_number = switch_channel_get_variable ( caller_channel , " caller_id_number " ) ;
}
if ( cid_name & & ! cid_number ) {
cid_number = cid_name ;
}
if ( cid_number & & ! cid_name ) {
cid_name = cid_number ;
}
v_campon_retries = switch_channel_get_variable ( caller_channel , " campon_retries " ) ;
v_campon_timeout = switch_channel_get_variable ( caller_channel , " campon_timeout " ) ;
v_campon_sleep = switch_channel_get_variable ( caller_channel , " campon_sleep " ) ;
v_campon_fallback_exten = switch_channel_get_variable ( caller_channel , " campon_fallback_exten " ) ;
if ( v_campon_retries ) {
if ( ( tmp = atoi ( v_campon_retries ) ) > 0 ) {
campon_retries = tmp ;
}
}
if ( v_campon_timeout ) {
if ( ( tmp = atoi ( v_campon_timeout ) ) > 0 ) {
campon_timeout = tmp ;
}
}
if ( v_campon_sleep ) {
if ( ( tmp = atoi ( v_campon_sleep ) ) > 0 ) {
campon_sleep = tmp ;
}
}
switch_channel_answer ( caller_channel ) ;
camping = 1 ;
if ( cid_name & & cid_number ) {
camp_data = switch_core_session_sprintf ( session , " {origination_caller_id_name='%s',origination_caller_id_number='%s'}%s " ,
cid_name , cid_number , data ) ;
} else {
camp_data = ( char * ) data ;
}
if ( ! ( moh = switch_channel_get_variable ( caller_channel , " hold_music " ) ) ) {
moh = switch_channel_get_variable ( caller_channel , " campon_hold_music " ) ;
}
do {
fail = 0 ;
2009-11-20 02:17:08 +00:00
status = switch_ivr_originate ( NULL , & peer_session , & cause , camp_data , campon_timeout , NULL , NULL , NULL , NULL , NULL , SOF_NONE , NULL ) ;
2009-10-22 22:11:28 +00:00
if ( ! switch_channel_ready ( caller_channel ) ) {
fail = 1 ;
break ;
}
if ( status = = SWITCH_STATUS_SUCCESS ) {
camping = 0 ;
break ;
} else {
fail = 1 ;
}
if ( camping ) {
if ( ! thread_started & & fail & & moh & & ! switch_channel_test_flag ( caller_channel , CF_PROXY_MODE ) & &
! switch_channel_test_flag ( caller_channel , CF_PROXY_MEDIA ) & &
! switch_true ( switch_channel_get_variable ( caller_channel , " bypass_media " ) ) ) {
switch_threadattr_create ( & thd_attr , switch_core_session_get_pool ( session ) ) ;
switch_threadattr_stacksize_set ( thd_attr , SWITCH_THREAD_STACKSIZE ) ;
stake . running = 1 ;
stake . moh = moh ;
stake . session = session ;
switch_thread_create ( & thread , thd_attr , camp_music_thread , & stake , switch_core_session_get_pool ( session ) ) ;
thread_started = 1 ;
}
2009-10-23 22:37:49 +00:00
if ( - - campon_retries < = 0 | | stake . do_xfer ) {
2009-10-22 22:11:28 +00:00
camping = 0 ;
2009-10-23 22:37:49 +00:00
stake . do_xfer = 1 ;
2009-10-22 22:11:28 +00:00
break ;
}
if ( fail ) {
int64_t wait = campon_sleep * 1000000 ;
2009-10-23 22:37:49 +00:00
while ( stake . running & & wait > 0 & & switch_channel_ready ( caller_channel ) ) {
2009-10-22 22:11:28 +00:00
switch_yield ( 100000 ) ;
wait - = 100000 ;
}
}
}
2009-10-23 22:37:49 +00:00
} while ( camping & & switch_channel_ready ( caller_channel ) ) ;
2009-10-22 22:11:28 +00:00
if ( thread ) {
stake . running = 0 ;
switch_channel_set_flag ( caller_channel , CF_NOT_READY ) ;
switch_thread_join ( & status , thread ) ;
}
2009-10-23 22:37:49 +00:00
switch_channel_clear_flag ( caller_channel , CF_NOT_READY ) ;
2009-10-22 22:11:28 +00:00
2009-10-23 22:37:49 +00:00
if ( stake . do_xfer & & ! zstr ( v_campon_fallback_exten ) ) {
2009-10-22 22:11:28 +00:00
switch_ivr_session_transfer ( session ,
v_campon_fallback_exten ,
switch_channel_get_variable ( caller_channel , " campon_fallback_dialplan " ) ,
switch_channel_get_variable ( caller_channel , " campon_fallback_context " ) ) ;
return ;
}
} else {
2009-11-20 02:17:08 +00:00
if ( ( status = switch_ivr_originate ( session , & peer_session , & cause , data , 0 , NULL , NULL , NULL , NULL , NULL , SOF_NONE , NULL ) ) ! = SWITCH_STATUS_SUCCESS ) {
2009-10-22 22:11:28 +00:00
fail = 1 ;
}
}
if ( fail ) {
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
/*
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
2009-11-05 06:56:16 +00:00
EXCEPTION . . . ATTENDED_TRANSFER never is a reason to continue . . . . . . .
2008-05-27 04:54:52 +00:00
*/
2009-11-05 06:56:16 +00:00
if ( cause ! = SWITCH_CAUSE_ATTENDED_TRANSFER ) {
if ( continue_on_fail | | failure_causes ) {
const char * cause_str ;
char cause_num [ 35 ] = " " ;
cause_str = switch_channel_cause2str ( cause ) ;
switch_snprintf ( cause_num , sizeof ( cause_num ) , " %u " , cause ) ;
2009-02-16 17:56:21 +00:00
2009-11-05 06:56:16 +00:00
if ( failure_causes ) {
char * lbuf = switch_core_session_strdup ( session , failure_causes ) ;
char * argv [ 256 ] = { 0 } ;
int argc = switch_separate_string ( lbuf , ' , ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
int i , x = 0 ;
for ( i = 0 ; i < argc ; i + + ) {
if ( ! strcasecmp ( argv [ i ] , cause_str ) | | ! strcasecmp ( argv [ i ] , cause_num ) ) {
x + + ;
break ;
}
2009-11-05 07:54:39 +00:00
if ( ! x ) {
2009-11-05 06:56:16 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_DEBUG ,
" Failiure causes [%s]: Cause: %s \n " , failure_causes , cause_str ) ;
return ;
}
}
}
2009-03-29 18:11:30 +00:00
2009-11-05 06:56:16 +00:00
if ( continue_on_fail ) {
2009-11-05 18:39:43 +00:00
if ( switch_true ( continue_on_fail ) ) {
return ;
} else {
char * lbuf = switch_core_session_strdup ( session , continue_on_fail ) ;
char * argv [ 256 ] = { 0 } ;
int argc = switch_separate_string ( lbuf , ' , ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
int i ;
for ( i = 0 ; i < argc ; i + + ) {
if ( ! strcasecmp ( argv [ i ] , cause_str ) | | ! strcasecmp ( argv [ i ] , cause_num ) ) {
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_DEBUG ,
" Continue on fail [%s]: Cause: %s \n " , continue_on_fail , cause_str ) ;
return ;
}
2009-11-05 06:56:16 +00:00
}
}
}
} else {
/* no answer is *always* a reason to continue */
if ( cause = = SWITCH_CAUSE_NO_ANSWER | | cause = = SWITCH_CAUSE_NO_USER_RESPONSE | | cause = = SWITCH_CAUSE_ORIGINATOR_CANCEL ) {
return ;
}
2009-09-24 22:41:37 +00:00
}
2007-10-15 14:00:48 +00:00
}
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
2009-11-09 23:49:35 +00:00
if ( switch_true ( switch_channel_get_variable ( caller_channel , SWITCH_BYPASS_MEDIA_AFTER_BRIDGE_VARIABLE ) ) ) {
switch_channel_set_flag ( caller_channel , CF_BYPASS_MEDIA_AFTER_BRIDGE ) ;
}
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 ,
2009-11-20 02:17:08 +00:00
switch_core_session_t * * new_session , switch_memory_pool_t * * pool , switch_originate_flag_t flags , switch_call_cause_t * cancel_cause ) ;
2008-08-12 18:00:56 +00:00
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 ,
2009-11-20 02:17:08 +00:00
switch_core_session_t * * new_session , switch_memory_pool_t * * pool , switch_originate_flag_t flags , switch_call_cause_t * cancel_cause )
2008-08-12 18:00:56 +00:00
{
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 ,
2009-11-20 02:17:08 +00:00
switch_core_session_t * * new_session , switch_memory_pool_t * * pool , switch_originate_flag_t flags , switch_call_cause_t * cancel_cause ) ;
2008-12-23 17:36:50 +00:00
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 ,
2009-11-20 02:17:08 +00:00
switch_core_session_t * * new_session , switch_memory_pool_t * * pool , switch_originate_flag_t flags , switch_call_cause_t * cancel_cause )
2008-12-23 17:36:50 +00:00
{
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 ;
char * domain = NULL ;
switch_channel_t * new_channel = NULL ;
2009-10-08 17:43:51 +00:00
unsigned int timelimit = 60 ;
const char * skip , * var ;
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 ,
2009-11-20 02:17:08 +00:00
cid_name_override , cid_num_override , NULL , var_event , myflags , cancel_cause ) = = SWITCH_STATUS_SUCCESS ) {
2008-12-23 17:36:50 +00:00
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 ,
2009-11-20 02:17:08 +00:00
switch_core_session_t * * new_session , switch_memory_pool_t * * pool , switch_originate_flag_t flags , switch_call_cause_t * cancel_cause ) ;
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 ,
2009-11-20 02:17:08 +00:00
switch_core_session_t * * new_session , switch_memory_pool_t * * pool , switch_originate_flag_t flags , switch_call_cause_t * cancel_cause )
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
2009-10-23 16:03:42 +00:00
if ( zstr ( outbound_profile - > destination_number ) ) {
2008-01-06 22:14:10 +00:00
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 ,
2009-11-20 02:17:08 +00:00
cid_name_override , cid_num_override , outbound_profile , var_event , myflags , cancel_cause ) = = 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 ) ;
}
2009-12-11 00:28:54 +00:00
SWITCH_STANDARD_APP ( early_hangup_function )
{
switch_channel_set_flag ( switch_core_session_get_channel ( session ) , CF_EARLY_HANGUP ) ;
}
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 ;
2009-10-23 16:03:42 +00:00
if ( ! zstr ( data ) & & ( lbuf = switch_core_session_strdup ( session , data ) )
2008-07-10 15:57:41 +00:00
& & ( 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 ,
2009-10-23 16:03:42 +00:00
! zstr ( 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 ,
2009-09-17 19:05:58 +00:00
" <ip> <acl | cidr> [<hangup_cause>] " , SAF_SUPPORT_NOMEDIA | SAF_ROUTING_EXEC ) ;
SWITCH_ADD_APP ( app_interface , " verbose_events " , " Make ALL Events verbose. " , " Make ALL Events verbose. " , verbose_events_function , " " , SAF_SUPPORT_NOMEDIA | SAF_ROUTING_EXEC ) ;
2009-12-11 00:28:54 +00:00
SWITCH_ADD_APP ( app_interface , " early_hangup " , " Enable early hangup " , " " , early_hangup_function , " " , SAF_SUPPORT_NOMEDIA | SAF_ROUTING_EXEC ) ;
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 ) ;
2009-09-17 19:05:58 +00:00
SWITCH_ADD_APP ( app_interface , " eval " , " Do Nothing " , " Do Nothing " , eval_function , " " , SAF_SUPPORT_NOMEDIA | SAF_ROUTING_EXEC ) ;
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 ) ;
2009-09-17 19:05:58 +00:00
SWITCH_ADD_APP ( app_interface , " presence " , " Send Presence " , " Send Presence. " , presence_function , " <rpid> <status> [<id>] " , SAF_SUPPORT_NOMEDIA | SAF_ROUTING_EXEC ) ;
SWITCH_ADD_APP ( app_interface , " log " , " Logs to the logger " , LOG_LONG_DESC , log_function , " <log_level> <log_string> " , SAF_SUPPORT_NOMEDIA | SAF_ROUTING_EXEC ) ;
SWITCH_ADD_APP ( app_interface , " info " , " Display Call Info " , " Display Call Info " , info_function , " " , SAF_SUPPORT_NOMEDIA | SAF_ROUTING_EXEC ) ;
SWITCH_ADD_APP ( app_interface , " event " , " Fire an event " , " Fire an event " , event_function , " " , SAF_SUPPORT_NOMEDIA | SAF_ROUTING_EXEC ) ;
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> " ,
2009-09-17 19:05:58 +00:00
SAF_SUPPORT_NOMEDIA | SAF_ROUTING_EXEC ) ;
SWITCH_ADD_APP ( app_interface , " set " , " Set a channel variable " , SET_LONG_DESC , set_function , " <varname>=<value> " , SAF_SUPPORT_NOMEDIA | SAF_ROUTING_EXEC ) ;
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> " ,
2009-09-17 19:05:58 +00:00
SAF_SUPPORT_NOMEDIA | SAF_ROUTING_EXEC ) ;
2008-05-27 04:54:52 +00:00
SWITCH_ADD_APP ( app_interface , " set_profile_var " , " Set a caller profile variable " , SET_PROFILE_VAR_LONG_DESC , set_profile_var_function ,
2009-09-17 19:05:58 +00:00
" <varname>=<value> " , SAF_SUPPORT_NOMEDIA | SAF_ROUTING_EXEC ) ;
2009-09-18 22:55:33 +00:00
SWITCH_ADD_APP ( app_interface , " unset " , " Unset a channel variable " , UNSET_LONG_DESC , unset_function , " <varname> " , SAF_SUPPORT_NOMEDIA | SAF_ROUTING_EXEC ) ;
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 ) ;
2009-10-23 23:02:14 +00:00
SWITCH_ADD_APP ( app_interface , " send_warning " , " Send session a popup " , " Send session a popup. " , warning_function , " <text> " ,
SAF_SUPPORT_NOMEDIA ) ;
2008-05-27 04:54:52 +00:00
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 ) ;
2009-12-02 18:13:11 +00:00
SWITCH_ADD_APP ( app_interface , " eavesdrop " , " eavesdrop on a uuid " , " eavesdrop on a uuid " , eavesdrop_function , eavesdrop_SYNTAX , SAF_MEDIA_TAP ) ;
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_MEDIA_TAP ) ;
2009-09-18 22:55:33 +00:00
SWITCH_ADD_APP ( app_interface , " set_user " , " Set a User " , " Set a User " , set_user_function , SET_USER_SYNTAX , SAF_SUPPORT_NOMEDIA | SAF_ROUTING_EXEC ) ;
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 ) ;
2009-12-02 18:13:11 +00:00
SWITCH_ADD_APP ( app_interface , " start_dtmf " , " Detect dtmf " , " Detect inband dtmf on the session " , dtmf_session_function , " " , SAF_MEDIA_TAP ) ;
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 ) ;
2009-12-02 18:13:11 +00:00
SWITCH_ADD_APP ( app_interface , " fax_detect " , " Detect faxes " , " Detect fax send tone " , fax_detect_session_function , " " , SAF_MEDIA_TAP ) ;
SWITCH_ADD_APP ( app_interface , " tone_detect " , " Detect tones " , " Detect tones " , tone_detect_session_function , " " , SAF_MEDIA_TAP ) ;
2007-06-20 05:15:07 +00:00
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 ) ;
2009-10-07 04:30:19 +00:00
SWITCH_ADD_APP ( app_interface , " endless_playback " , " Playback File Endlessly " , " Endlessly Playback a file to the channel " ,
endless_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 ) ;
2009-12-02 18:13:11 +00:00
SWITCH_ADD_APP ( app_interface , " record_session " , " Record Session " , SESS_REC_DESC , record_session_function , " <path> [+<timeout>] " , SAF_MEDIA_TAP ) ;
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 ) ;
2009-09-23 22:39:00 +00:00
SWITCH_ADD_APP ( app_interface , " preprocess " , " pre-process " , " pre-process " , preprocess_session_function , " " , SAF_NONE ) ;
2008-05-27 04:54:52 +00:00
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] " ,
2009-12-02 18:13:11 +00:00
SAF_MEDIA_TAP ) ;
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
*/