@ -1434,9 +1434,9 @@ static int dial_exec_full(struct ast_channel *chan, void *data, struct ast_flags
/* almost done, although the 'else' block is 400 lines */
/* almost done, although the 'else' block is 400 lines */
} else {
} else {
const char * number ;
const char * number ;
time_t end_time , answer_time = time ( NULL ) ;
strcpy ( status , " ANSWER " ) ;
strcpy ( status , " ANSWER " ) ;
pbx_builtin_setvar_helper ( chan , " DIALSTATUS " , status ) ;
/* Ah ha! Someone answered within the desired timeframe. Of course after this
/* Ah ha! Someone answered within the desired timeframe. Of course after this
we will always return with - 1 so that it is hung up properly after the
we will always return with - 1 so that it is hung up properly after the
conversation . */
conversation . */
@ -1731,10 +1731,31 @@ static int dial_exec_full(struct ast_channel *chan, void *data, struct ast_flags
res = ast_dtmf_stream ( chan , peer , dtmfcalling , 250 ) ;
res = ast_dtmf_stream ( chan , peer , dtmfcalling , 250 ) ;
}
}
}
}
if ( ! res ) {
if ( ! res ) {
struct ast_bridge_config config ;
struct ast_bridge_config config ;
auto void end_bridge_callback ( void ) ;
void end_bridge_callback ( void )
{
char buf [ 80 ] ;
time_t end ;
time ( & end ) ;
ast_channel_lock ( chan ) ;
if ( chan - > cdr - > answer . tv_sec ) {
snprintf ( buf , sizeof ( buf ) , " %ld " , end - chan - > cdr - > answer . tv_sec ) ;
pbx_builtin_setvar_helper ( chan , " ANSWEREDTIME " , buf ) ;
}
if ( chan - > cdr - > start . tv_sec ) {
snprintf ( buf , sizeof ( buf ) , " %ld " , end - chan - > cdr - > start . tv_sec ) ;
pbx_builtin_setvar_helper ( chan , " DIALEDTIME " , buf ) ;
}
ast_channel_unlock ( chan ) ;
}
memset ( & config , 0 , sizeof ( struct ast_bridge_config ) ) ;
memset ( & config , 0 , sizeof ( struct ast_bridge_config ) ) ;
if ( play_to_caller )
if ( play_to_caller )
ast_set_flag ( & ( config . features_caller ) , AST_FEATURE_PLAY_WARNING ) ;
ast_set_flag ( & ( config . features_caller ) , AST_FEATURE_PLAY_WARNING ) ;
@ -1765,6 +1786,7 @@ static int dial_exec_full(struct ast_channel *chan, void *data, struct ast_flags
config . warning_sound = warning_sound ;
config . warning_sound = warning_sound ;
config . end_sound = end_sound ;
config . end_sound = end_sound ;
config . start_sound = start_sound ;
config . start_sound = start_sound ;
config . end_bridge_callback = end_bridge_callback ;
if ( moh ) {
if ( moh ) {
moh = 0 ;
moh = 0 ;
ast_moh_stop ( chan ) ;
ast_moh_stop ( chan ) ;
@ -1795,21 +1817,10 @@ static int dial_exec_full(struct ast_channel *chan, void *data, struct ast_flags
AST_OPTION_OPRMODE , & oprmode , sizeof ( struct oprmode ) , 0 ) ;
AST_OPTION_OPRMODE , & oprmode , sizeof ( struct oprmode ) , 0 ) ;
}
}
res = ast_bridge_call ( chan , peer , & config ) ;
res = ast_bridge_call ( chan , peer , & config ) ;
time ( & end_time ) ;
if ( res ! = AST_PBX_KEEPALIVE ) { /* if keepalive is set, don't even think about accessing chan! */
char toast [ 80 ] ;
snprintf ( toast , sizeof ( toast ) , " %ld " , ( long ) ( end_time - answer_time ) ) ;
pbx_builtin_setvar_helper ( chan , " ANSWEREDTIME " , toast ) ;
}
} else {
} else {
time ( & end_time ) ;
res = - 1 ;
res = - 1 ;
}
}
if ( res ! = AST_PBX_KEEPALIVE ) { /* if keepalive is set, don't even think about accessing chan! */
char toast [ 80 ] ;
snprintf ( toast , sizeof ( toast ) , " %ld " , ( long ) ( end_time - start_time ) ) ;
pbx_builtin_setvar_helper ( chan , " DIALEDTIME " , toast ) ;
}
if ( res ! = AST_PBX_NO_HANGUP_PEER & & res ! = AST_PBX_NO_HANGUP_PEER_PARKED ) {
if ( res ! = AST_PBX_NO_HANGUP_PEER & & res ! = AST_PBX_NO_HANGUP_PEER_PARKED ) {
if ( res ! = AST_PBX_KEEPALIVE & & ! chan - > _softhangup )
if ( res ! = AST_PBX_KEEPALIVE & & ! chan - > _softhangup )
chan - > hangupcause = peer - > hangupcause ;
chan - > hangupcause = peer - > hangupcause ;