diff --git a/main/cdr.c b/main/cdr.c index 586a10684a35355e7c2bfa388b48b86ce07f5e6d..e2f9b764cf270b0f5120218918b61b976031ff72 100644 --- a/main/cdr.c +++ b/main/cdr.c @@ -1409,9 +1409,7 @@ static int base_process_party_a(struct cdr_object *cdr, struct ast_channel_snaps static int base_process_bridge_leave(struct cdr_object *cdr, struct ast_bridge_snapshot *bridge, struct ast_channel_snapshot *channel) { - /* In general, most things shouldn't get a bridge leave */ - ast_assert(0); - return 1; + return 0; } static int base_process_dial_end(struct cdr_object *cdr, struct ast_channel_snapshot *caller, struct ast_channel_snapshot *peer, const char *dial_status) diff --git a/res/ari/resource_channels.c b/res/ari/resource_channels.c index bce7c7def2f35b0aa630870d540807c2c3598a5b..35b757267c31608ba9727881c5866208e60ab485 100644 --- a/res/ari/resource_channels.c +++ b/res/ari/resource_channels.c @@ -1776,6 +1776,9 @@ void ast_ari_channels_create(struct ast_variable *headers, originator = ast_channel_get_by_name(args->originator); if (originator) { request_cap = ao2_bump(ast_channel_nativeformats(originator)); + if (!ast_strlen_zero(args->app)) { + stasis_app_subscribe_channel(args->app, originator); + } } else if (!ast_strlen_zero(args->formats)) { char *format_name; char *formats_copy = ast_strdupa(args->formats); @@ -1816,13 +1819,20 @@ void ast_ari_channels_create(struct ast_variable *headers, chan_data->chan = ast_request(dialtech, request_cap, &assignedids, originator, dialdevice, &cause); ao2_cleanup(request_cap); - ast_channel_cleanup(originator); + if (!chan_data->chan) { ast_ari_response_alloc_failed(response); + ast_channel_cleanup(originator); chan_data_destroy(chan_data); return; } + if (!ast_strlen_zero(args->app)) { + stasis_app_subscribe_channel(args->app, chan_data->chan); + } + + ast_channel_cleanup(originator); + if (save_dialstring(chan_data->chan, stuff)) { ast_ari_response_alloc_failed(response); chan_data_destroy(chan_data); diff --git a/res/stasis/control.c b/res/stasis/control.c index b255477bf730e374c3920572419520329e26cc55..219a2c6cd27ffa02fcf84190a12123464322d875 100644 --- a/res/stasis/control.c +++ b/res/stasis/control.c @@ -881,6 +881,9 @@ end: return ret_bridge; } +static int bridge_channel_depart(struct stasis_app_control *control, + struct ast_channel *chan, void *data); + /*! * \brief after bridge callback for the dial bridge * @@ -890,6 +893,15 @@ end: static void dial_bridge_after_cb(struct ast_channel *chan, void *data) { struct stasis_app_control *control = data; + struct ast_bridge_channel *bridge_channel; + + ast_channel_lock(chan); + bridge_channel = ast_channel_get_bridge_channel(chan); + ast_channel_unlock(chan); + + ast_debug(3, "Channel: <%s> Reason: %d\n", ast_channel_name(control->channel), ast_channel_hangupcause(chan)); + + stasis_app_send_command_async(control, bridge_channel_depart, bridge_channel, __ao2_cleanup); control->bridge = NULL; } @@ -898,6 +910,7 @@ static void dial_bridge_after_cb_failed(enum ast_bridge_after_cb_reason reason, { struct stasis_app_control *control = data; + ast_debug(3, "Channel: <%s> Reason: %d\n", ast_channel_name(control->channel), reason); dial_bridge_after_cb(control->channel, data); } @@ -1443,6 +1456,8 @@ static int app_control_dial(struct stasis_app_control *control, return -1; } + ast_channel_publish_dial(NULL, chan, args->dialstring, NULL); + return 0; }