@ -446,12 +446,83 @@ static int handle_waitfordigit(struct ast_channel *chan, AGI *agi, int argc, cha
{
int res ;
int to ;
if ( argc ! = 4 )
char * valid_dtmf_digits = AST_DIGIT_ANY ;
char * previously_die_on = " # " ;
char * digits = NULL ;
char * escape_digits = NULL ;
char * voicefile = NULL ;
int maxdigits = 1 ;
if ( argc < 4 )
return RESULT_SHOWUSAGE ;
if ( sscanf ( argv [ 3 ] , " %30d " , & to ) ! = 1 )
return RESULT_SHOWUSAGE ;
res = ast_waitfordigit_full ( chan , to , agi - > audio , agi - > ctrl ) ;
fdprintf ( agi - > fd , " 200 result=%d \n " , res ) ;
/* Answer the chan */
if ( chan - > _state ! = AST_STATE_UP )
res = ast_answer ( chan ) ;
/* soundfile specified */
if ( argc > = 5 ) {
/* escape characters defined */
if ( argc > = 6 )
valid_dtmf_digits = ( char * ) argv [ 5 ] ;
/* maxdigits */
if ( argc > = 7 & & ( sscanf ( argv [ 6 ] , " %d " , & maxdigits ) ! = 1 ) )
return RESULT_SHOWUSAGE ;
/* escape before escape chars on */
if ( argc > = 8 )
previously_die_on = ( char * ) argv [ 7 ] ;
voicefile = ( char * ) argv [ 4 ] ;
res = ast_streamfile ( chan , voicefile , chan - > language ) ;
if ( res < 0 )
return RESULT_FAILURE ;
/* allocate space for the digits (2 chars per digit + \0 - <digit>|<digit>|...) */
digits = ( char * ) ast_malloc ( maxdigits * 2 + 1 ) ;
ast_copy_string ( digits , " " , 1 ) ;
/* catenate the escape digits together with previously die digits */
escape_digits = ( char * ) ast_malloc ( strlen ( valid_dtmf_digits ) + strlen ( previously_die_on ) + 1 ) ;
ast_copy_string ( escape_digits , valid_dtmf_digits , sizeof ( valid_dtmf_digits ) ) ;
strcat ( escape_digits , previously_die_on ) ;
if ( chan - > stream ) {
int dtmf_count = 0 ;
do {
char buf [ 3 ] ;
res = ast_waitstream_full ( chan , escape_digits , agi - > audio , agi - > ctrl ) ;
if ( res > 0 ) {
if ( strchr ( previously_die_on , res ) ! = NULL ) {
/* previously die character found - end loop */
ast_log ( LOG_DEBUG , " prev die digit %c pressed \n " , res ) ;
break ;
} else {
/* chars in valid_dtmf_digits found */
ast_log ( LOG_DEBUG , " dtmf turn=%d of %d | res=%d \n " , dtmf_count , maxdigits , res ) ;
sprintf ( buf , " %c " , res ) ;
strcat ( digits , buf ) ;
dtmf_count + + ;
}
}
} while ( strchr ( previously_die_on , res ) = = NULL & & dtmf_count < maxdigits & & chan - > stream ) ;
ast_stopstream ( chan ) ;
fdprintf ( agi - > fd , " 200 result=%s \n " , digits ) ;
} else {
res = ast_waitfordigit_full ( chan , to , agi - > audio , agi - > ctrl ) ;
fdprintf ( agi - > fd , " 200 result=%c \n " , res ) ;
}
} else {
res = ast_waitfordigit_full ( chan , to , agi - > audio , agi - > ctrl ) ;
fdprintf ( agi - > fd , " 200 result=%c \n " , res ) ;
}
ast_free ( escape_digits ) ;
ast_free ( digits ) ;
return ( res > = 0 ) ? RESULT_SUCCESS : RESULT_FAILURE ;
}