summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzuul <zuul@gerrit.asterisk.org>2016-07-13 08:08:41 -0500
committerGerrit Code Review <gerrit2@gerrit.digium.api>2016-07-13 08:08:41 -0500
commit73d8cb587d6515b707c9cafe334e18fbd7c24905 (patch)
treeedff4e9d6fd10c739d590c54777933d61d6581a6
parente049248161d44a6e137cb9264337adb53bdb09a6 (diff)
parent886f2cab232e1dca65a90036aef39eda27443f4e (diff)
Merge "rest_api/channels: Fix multiple issues with create and dial"
-rw-r--r--main/cdr.c4
-rw-r--r--res/ari/resource_channels.c12
-rw-r--r--res/stasis/control.c15
3 files changed, 27 insertions, 4 deletions
diff --git a/main/cdr.c b/main/cdr.c
index 586a10684..e2f9b764c 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 bce7c7def..35b757267 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 b255477bf..219a2c6cd 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;
}