Merge "app_bridgeaddchan.c: Make BridgeAdd be more like Bridge"

changes/75/13575/1
George Joseph 5 years ago committed by Gerrit Code Review
commit a4fd89536d

@ -43,17 +43,28 @@
Join a bridge that contains the specified channel.
</synopsis>
<syntax>
<parameter name="name">
<para>Name of the channel in an existing bridge
</para>
<parameter name="channel" required="true">
<para>The current channel joins the bridge containing the channel
identified by the channel name, channel name prefix, or channel
uniqueid.</para>
</parameter>
</syntax>
<description>
<para>This application places the incoming channel into
the bridge containing the specified channel. The specified
channel only needs to be the prefix of a full channel name
IE. 'SIP/cisco0001'.
IE. 'PJSIP/cisco0001'.
</para>
<para>This application sets the following channel variable upon completion:</para>
<variablelist>
<variable name="BRIDGERESULT">
<para>The result of the bridge attempt as a text string.</para>
<value name="SUCCESS" />
<value name="FAILURE" />
<value name="LOOP" />
<value name="NONEXISTENT" />
</variable>
</variablelist>
</description>
</application>
***/
@ -66,15 +77,28 @@ static int bridgeadd_exec(struct ast_channel *chan, const char *data)
struct ast_bridge_features chan_features;
struct ast_bridge *bridge;
char *c_name;
int failed;
/* Answer the channel if needed */
if (ast_channel_state(chan) != AST_STATE_UP) {
ast_answer(chan);
}
if (!(c_ref = ast_channel_get_by_name_prefix(data, strlen(data)))) {
ast_log(LOG_WARNING, "Channel %s not found\n", data);
return -1;
if (ast_strlen_zero(data)) {
data = "";
c_ref = NULL;
} else {
c_ref = ast_channel_get_by_name_prefix(data, strlen(data));
}
if (!c_ref) {
ast_verb(4, "Channel '%s' not found\n", data);
pbx_builtin_setvar_helper(chan, "BRIDGERESULT", "NONEXISTENT");
return 0;
}
if (chan == c_ref) {
ast_channel_unref(c_ref);
pbx_builtin_setvar_helper(chan, "BRIDGERESULT", "LOOP");
return 0;
}
c_name = ast_strdupa(ast_channel_name(c_ref));
@ -86,26 +110,24 @@ static int bridgeadd_exec(struct ast_channel *chan, const char *data)
ast_channel_unref(c_ref);
if (!bridge) {
ast_log(LOG_WARNING, "Channel %s is not in a bridge\n", c_name);
return -1;
ast_verb(4, "Channel '%s' is not in a bridge\n", c_name);
pbx_builtin_setvar_helper(chan, "BRIDGERESULT", "FAILURE");
return 0;
}
ast_verb(3, "%s is joining %s in bridge %s\n", ast_channel_name(chan),
c_name, bridge->uniqueid);
if (ast_bridge_features_init(&chan_features)
|| ast_bridge_join(bridge, chan, NULL, &chan_features, NULL, 0)) {
ast_log(LOG_WARNING, "%s failed to join %s in bridge %s\n", ast_channel_name(chan),
c_name, bridge->uniqueid);
ast_verb(4, "%s is joining %s in bridge %s\n",
ast_channel_name(chan), c_name, bridge->uniqueid);
ast_bridge_features_cleanup(&chan_features);
ao2_cleanup(bridge);
return -1;
failed = ast_bridge_features_init(&chan_features)
|| ast_bridge_join(bridge, chan, NULL, &chan_features, NULL, 0);
if (failed) {
ast_verb(4, "%s failed to join %s in bridge %s\n",
ast_channel_name(chan), c_name, bridge->uniqueid);
}
ast_bridge_features_cleanup(&chan_features);
ao2_cleanup(bridge);
pbx_builtin_setvar_helper(chan, "BRIDGERESULT", failed ? "FAILURE" : "SUCCESS");
return 0;
}

@ -0,0 +1,7 @@
Subject: app_bridgeaddchan
Master-Only: true
The BridgeAdd application now behaves more like the Bridge application.
The application now sets the BRIDGERESULT channel variable to indicate
what happened when the channel resumes in dialplan. This is instead of
hanging up the channel on failure conditions.

@ -0,0 +1,7 @@
Subject: app_bridgeaddchan
Master-Only: true
The BridgeAdd application now behaves more like the Bridge application.
The application now sets the BRIDGERESULT channel variable to indicate
what happened when the channel resumes in dialplan. This is instead of
hanging up the channel on failure conditions.
Loading…
Cancel
Save