mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-06 12:36:58 +00:00
ARI: bridges/{bridgeID}/addChannel: add roles parameter
Roles are now cleared with each entry into a bridge with addChannel. If the roles parameter is present, the role specified will be applied to all channels being added with the addChannel command. (closes issue ASTERISK-21973) Reported by: Matt Jordan https://reviewboard.asterisk.org/r/2691/ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@396182 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -51,6 +51,13 @@ int ast_channel_add_bridge_role(struct ast_channel *chan, const char *role_name)
|
|||||||
*/
|
*/
|
||||||
void ast_channel_remove_bridge_role(struct ast_channel *chan, const char *role_name);
|
void ast_channel_remove_bridge_role(struct ast_channel *chan, const char *role_name);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \brief Removes all bridge roles currently on a channel
|
||||||
|
*
|
||||||
|
* \param chan Channel the roles are being removed from
|
||||||
|
*/
|
||||||
|
void ast_channel_clear_bridge_roles(struct ast_channel *chan);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \brief Set a role option on a channel
|
* \brief Set a role option on a channel
|
||||||
* \param channel Channel receiving the role option
|
* \param channel Channel receiving the role option
|
||||||
|
@@ -173,6 +173,24 @@ const char *stasis_app_control_get_channel_id(
|
|||||||
*/
|
*/
|
||||||
int stasis_app_control_dial(struct stasis_app_control *control, const char *endpoint, int timeout);
|
int stasis_app_control_dial(struct stasis_app_control *control, const char *endpoint, int timeout);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \brief Apply a bridge role to a channel controlled by a stasis app control
|
||||||
|
*
|
||||||
|
* \param control Control for \c res_stasis
|
||||||
|
* \param role Role to apply
|
||||||
|
*
|
||||||
|
* \return 0 for success
|
||||||
|
* \return -1 for error.
|
||||||
|
*/
|
||||||
|
int stasis_app_control_add_role(struct stasis_app_control *control, const char *role);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \brief Clear bridge roles currently applied to a channel controlled by a stasis app control
|
||||||
|
*
|
||||||
|
* \param control Control for \c res_stasis
|
||||||
|
*/
|
||||||
|
void stasis_app_control_clear_roles(struct stasis_app_control *control);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \brief Exit \c res_stasis and continue execution in the dialplan.
|
* \brief Exit \c res_stasis and continue execution in the dialplan.
|
||||||
*
|
*
|
||||||
|
@@ -355,6 +355,25 @@ void ast_channel_remove_bridge_role(struct ast_channel *chan, const char *role_n
|
|||||||
ast_debug(2, "Role %s did not exist on channel %s\n", role_name, ast_channel_name(chan));
|
ast_debug(2, "Role %s did not exist on channel %s\n", role_name, ast_channel_name(chan));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ast_channel_clear_bridge_roles(struct ast_channel *chan)
|
||||||
|
{
|
||||||
|
struct bridge_roles_datastore *roles_datastore = fetch_bridge_roles_datastore(chan);
|
||||||
|
struct bridge_role *role;
|
||||||
|
|
||||||
|
if (!roles_datastore) {
|
||||||
|
/* The roles datastore didn't already exist, so there is no need to remove any roles */
|
||||||
|
ast_debug(2, "Roles did not exist on channel %s\n", ast_channel_name(chan));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
AST_LIST_TRAVERSE_SAFE_BEGIN(&roles_datastore->role_list, role, list) {
|
||||||
|
ast_debug(2, "Removing bridge role %s from channel %s\n", role->role, ast_channel_name(chan));
|
||||||
|
AST_LIST_REMOVE_CURRENT(list);
|
||||||
|
bridge_role_destroy(role);
|
||||||
|
}
|
||||||
|
AST_LIST_TRAVERSE_SAFE_END;
|
||||||
|
}
|
||||||
|
|
||||||
int ast_channel_set_bridge_role_option(struct ast_channel *channel, const char *role_name, const char *option, const char *value)
|
int ast_channel_set_bridge_role_option(struct ast_channel *channel, const char *role_name, const char *option, const char *value)
|
||||||
{
|
{
|
||||||
struct bridge_role *role = get_role_from_channel(channel, role_name);
|
struct bridge_role *role = get_role_from_channel(channel, role_name);
|
||||||
|
@@ -175,6 +175,16 @@ void ast_ari_add_channel_to_bridge(struct ast_variable *headers, struct ast_add_
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < list->count; ++i) {
|
||||||
|
stasis_app_control_clear_roles(list->controls[i]);
|
||||||
|
if (!ast_strlen_zero(args->role)) {
|
||||||
|
if (stasis_app_control_add_role(list->controls[i], args->role)) {
|
||||||
|
ast_ari_response_alloc_failed(response);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 0; i < list->count; ++i) {
|
for (i = 0; i < list->count; ++i) {
|
||||||
stasis_app_control_add_channel_to_bridge(list->controls[i], bridge);
|
stasis_app_control_add_channel_to_bridge(list->controls[i], bridge);
|
||||||
}
|
}
|
||||||
|
@@ -103,6 +103,8 @@ struct ast_add_channel_to_bridge_args {
|
|||||||
size_t channel_count;
|
size_t channel_count;
|
||||||
/*! \brief Parsing context for channel. */
|
/*! \brief Parsing context for channel. */
|
||||||
char *channel_parse;
|
char *channel_parse;
|
||||||
|
/*! \brief Channel's role in the bridge */
|
||||||
|
const char *role;
|
||||||
};
|
};
|
||||||
/*!
|
/*!
|
||||||
* \brief Add a channel to a bridge.
|
* \brief Add a channel to a bridge.
|
||||||
|
@@ -324,6 +324,9 @@ static void ast_ari_add_channel_to_bridge_cb(
|
|||||||
args.channel[j] = (vals[j]);
|
args.channel[j] = (vals[j]);
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
|
if (strcmp(i->name, "role") == 0) {
|
||||||
|
args.role = (i->value);
|
||||||
|
} else
|
||||||
{}
|
{}
|
||||||
}
|
}
|
||||||
for (i = path_vars; i; i = i->next) {
|
for (i = path_vars; i; i = i->next) {
|
||||||
|
@@ -168,6 +168,16 @@ int stasis_app_control_dial(struct stasis_app_control *control, const char *endp
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int stasis_app_control_add_role(struct stasis_app_control *control, const char *role)
|
||||||
|
{
|
||||||
|
return ast_channel_add_bridge_role(control->channel, role);
|
||||||
|
}
|
||||||
|
|
||||||
|
void stasis_app_control_clear_roles(struct stasis_app_control *control)
|
||||||
|
{
|
||||||
|
ast_channel_clear_bridge_roles(control->channel);
|
||||||
|
}
|
||||||
|
|
||||||
int control_is_done(struct stasis_app_control *control)
|
int control_is_done(struct stasis_app_control *control)
|
||||||
{
|
{
|
||||||
/* Called from stasis_app_exec thread; no lock needed */
|
/* Called from stasis_app_exec thread; no lock needed */
|
||||||
|
@@ -119,6 +119,14 @@
|
|||||||
"required": true,
|
"required": true,
|
||||||
"allowMultiple": true,
|
"allowMultiple": true,
|
||||||
"dataType": "string"
|
"dataType": "string"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "role",
|
||||||
|
"description": "Channel's role in the bridge",
|
||||||
|
"paramType": "query",
|
||||||
|
"required": false,
|
||||||
|
"allowMultiple": false,
|
||||||
|
"dataType": "string"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"errorResponses": [
|
"errorResponses": [
|
||||||
|
Reference in New Issue
Block a user