diff --git a/apps/app_dial.c b/apps/app_dial.c index db2e43b2d6..72ad5a6c48 100644 --- a/apps/app_dial.c +++ b/apps/app_dial.c @@ -832,6 +832,27 @@ static void set_dial_features(struct ast_flags *opts, struct ast_dial_features * ast_set_flag(&(features->features_caller), AST_FEATURE_PARKCALL); } +static void end_bridge_callback (void *data) +{ + char buf[80]; + time_t end; + struct ast_channel *chan = data; + + 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); +} + static int dial_exec_full(struct ast_channel *chan, void *data, struct ast_flags *peerflags, int *continue_exec) { int res = -1; @@ -1735,27 +1756,6 @@ static int dial_exec_full(struct ast_channel *chan, void *data, struct ast_flags 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); @@ -1787,6 +1787,7 @@ static int dial_exec_full(struct ast_channel *chan, void *data, struct ast_flags config.end_sound = end_sound; config.start_sound = start_sound; config.end_bridge_callback = end_bridge_callback; + config.end_bridge_callback_data = chan; if (moh) { moh = 0; ast_moh_stop(chan); diff --git a/apps/app_followme.c b/apps/app_followme.c index 654bf373c2..3de1a46080 100644 --- a/apps/app_followme.c +++ b/apps/app_followme.c @@ -914,6 +914,27 @@ static void findmeexec(struct fm_args *tpargs) } +static void end_bridge_callback (void *data) +{ + char buf[80]; + time_t end; + struct ast_channel *chan = data; + + 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); +} + static int app_exec(struct ast_channel *chan, void *data) { struct fm_args targs; @@ -1025,27 +1046,6 @@ static int app_exec(struct ast_channel *chan, void *data) ast_stream_and_wait(chan, targs.sorryprompt, chan->language, ""); res = 0; } else { - 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); - } - caller = chan; outbound = targs.outbound; /* Bridge the two channels. */ @@ -1056,6 +1056,7 @@ static int app_exec(struct ast_channel *chan, void *data) ast_set_flag(&(config.features_caller), AST_FEATURE_AUTOMON); config.end_bridge_callback = end_bridge_callback; + config.end_bridge_callback_data = chan; ast_moh_stop(caller); /* Be sure no generators are left on it */ diff --git a/include/asterisk/channel.h b/include/asterisk/channel.h index 82055be149..be08873aef 100644 --- a/include/asterisk/channel.h +++ b/include/asterisk/channel.h @@ -540,7 +540,8 @@ 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 */ + void (* end_bridge_callback)(void *); /*!< A callback that is called after a bridge attempt */ + void *end_bridge_callback_data; /*!< Data passed to the callback */ }; struct chanmon; diff --git a/res/res_features.c b/res/res_features.c index 9e5d5054a3..816e1630fe 100644 --- a/res/res_features.c +++ b/res/res_features.c @@ -1714,7 +1714,7 @@ 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(); + config->end_bridge_callback(config->end_bridge_callback_data); } autoloopflag = ast_test_flag(chan, AST_FLAG_IN_AUTOLOOP);