]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
rest_api/channels: Fix multiple issues with create and dial 78/3178/1
authorGeorge Joseph <gjoseph@digium.com>
Tue, 12 Jul 2016 01:07:20 +0000 (19:07 -0600)
committerGeorge Joseph <gjoseph@digium.com>
Tue, 12 Jul 2016 17:16:44 +0000 (11:16 -0600)
* We weren't properly subscribing to the channel and it's originator
  on create.
* We weren't doing a publish_dial after calling ast_call on dial.
* We weren't calling depart_bridge when a channel left the dial bridge.

The first 2 issues were causing events to not be generated and the third
was actually causing channels to not get properly destroyed when hung up.

Together these 3 issues were causing the new
rest_apichannels/create_dial_bridge tests to fail.

As a result of the fixes, the cdr state machine had to be slightly
tweaked to allow bridge leave events without asserting and the tests
themselves had to be updated to account for the channels now cleaning
themselves up.

Change-Id: Ibf23abf5a62de76e82afb4461af5099c961b97d8

main/cdr.c
res/ari/resource_channels.c
res/stasis/control.c

index 586a10684a35355e7c2bfa388b48b86ce07f5e6d..e2f9b764cf270b0f5120218918b61b976031ff72 100644 (file)
@@ -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)
index bce7c7def2f35b0aa630870d540807c2c3598a5b..35b757267c31608ba9727881c5866208e60ab485 100644 (file)
@@ -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);
index b255477bf730e374c3920572419520329e26cc55..219a2c6cd27ffa02fcf84190a12123464322d875 100644 (file)
@@ -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;
 }