summaryrefslogtreecommitdiff
path: root/res/stasis
diff options
context:
space:
mode:
authorJoshua Colp <jcolp@digium.com>2016-01-23 10:07:52 -0600
committerGerrit Code Review <gerrit2@gerrit.digium.api>2016-01-23 10:07:52 -0600
commit8c75371589a9191d981a7f2a6c219636ee5c995f (patch)
tree407156859de25c301258000a616f4714b0bff4c1 /res/stasis
parent959f7436cc16ac9e956df8692fd0ac25324236d5 (diff)
parenta45eacebf326741821e7c954ac48e72c4c1b1274 (diff)
Merge "Stasis: Use control queue to prevent crash."
Diffstat (limited to 'res/stasis')
-rw-r--r--res/stasis/control.c50
1 files changed, 47 insertions, 3 deletions
diff --git a/res/stasis/control.c b/res/stasis/control.c
index bae64ecc2..903b5752d 100644
--- a/res/stasis/control.c
+++ b/res/stasis/control.c
@@ -355,14 +355,39 @@ int stasis_app_control_dial(struct stasis_app_control *control, const char *endp
return 0;
}
+static int app_control_add_role(struct stasis_app_control *control,
+ struct ast_channel *chan, void *data)
+{
+ char *role = data;
+
+ return ast_channel_add_bridge_role(chan, role);
+}
+
int stasis_app_control_add_role(struct stasis_app_control *control, const char *role)
{
- return ast_channel_add_bridge_role(control->channel, role);
+ char *role_dup;
+
+ role_dup = ast_strdup(role);
+ if (!role_dup) {
+ return -1;
+ }
+
+ stasis_app_send_command_async(control, app_control_add_role, role_dup, ast_free_ptr);
+
+ return 0;
+}
+
+static int app_control_clear_roles(struct stasis_app_control *control,
+ struct ast_channel *chan, void *data)
+{
+ ast_channel_clear_bridge_roles(chan);
+
+ return 0;
}
void stasis_app_control_clear_roles(struct stasis_app_control *control)
{
- ast_channel_clear_bridge_roles(control->channel);
+ stasis_app_send_command_async(control, app_control_clear_roles, NULL, NULL);
}
int control_command_count(struct stasis_app_control *control)
@@ -598,9 +623,28 @@ int stasis_app_control_unmute(struct stasis_app_control *control, unsigned int d
return 0;
}
+static int app_control_set_channel_var(struct stasis_app_control *control,
+ struct ast_channel *chan, void *data)
+{
+ struct ast_variable *var = data;
+
+ pbx_builtin_setvar_helper(control->channel, var->name, var->value);
+
+ return 0;
+}
+
int stasis_app_control_set_channel_var(struct stasis_app_control *control, const char *variable, const char *value)
{
- return pbx_builtin_setvar_helper(control->channel, variable, value);
+ struct ast_variable *var;
+
+ var = ast_variable_new(variable, value, "ARI");
+ if (!var) {
+ return -1;
+ }
+
+ stasis_app_send_command_async(control, app_control_set_channel_var, var, ast_free_ptr);
+
+ return 0;
}
static int app_control_hold(struct stasis_app_control *control,