diff options
-rw-r--r-- | apps/app_dial.c | 39 | ||||
-rw-r--r-- | include/asterisk/channel.h | 1 | ||||
-rw-r--r-- | res/res_features.c | 4 |
3 files changed, 30 insertions, 14 deletions
diff --git a/apps/app_dial.c b/apps/app_dial.c index 1dae16dd5..db2e43b2d 100644 --- a/apps/app_dial.c +++ b/apps/app_dial.c @@ -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 */ } else { const char *number; - time_t end_time, answer_time = time(NULL); strcpy(status, "ANSWER"); + pbx_builtin_setvar_helper(chan, "DIALSTATUS", status); /* 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 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); } } - + if (!res) { 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)); if (play_to_caller) 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.end_sound = end_sound; config.start_sound = start_sound; + config.end_bridge_callback = end_bridge_callback; if (moh) { moh = 0; 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); } 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 { - time(&end_time); 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_KEEPALIVE && !chan->_softhangup) chan->hangupcause = peer->hangupcause; diff --git a/include/asterisk/channel.h b/include/asterisk/channel.h index 5e42953cb..82055be14 100644 --- a/include/asterisk/channel.h +++ b/include/asterisk/channel.h @@ -540,6 +540,7 @@ struct ast_bridge_config { const char *start_sound; int firstpass; unsigned int flags; + void (* end_bridge_callback)(void); /*!< A callback that is called after a bridge attempt */ }; struct chanmon; diff --git a/res/res_features.c b/res/res_features.c index 3fe942a93..18e7555ba 100644 --- a/res/res_features.c +++ b/res/res_features.c @@ -1712,6 +1712,10 @@ int ast_bridge_call(struct ast_channel *chan,struct ast_channel *peer,struct ast } before_you_go: + if (res != AST_PBX_KEEPALIVE && config->end_bridge_callback) { + config->end_bridge_callback(); + } + if (res != AST_PBX_KEEPALIVE && !ast_test_flag(&(config->features_caller),AST_FEATURE_NO_H_EXTEN) && ast_exists_extension(chan, chan->context, "h", 1, chan->cid.cid_num)) { struct ast_cdr *swapper; char savelastapp[AST_MAX_EXTENSION]; |