diff --git a/include/asterisk/stasis_app.h b/include/asterisk/stasis_app.h index f31bab8d90..93d5cf36c8 100644 --- a/include/asterisk/stasis_app.h +++ b/include/asterisk/stasis_app.h @@ -173,6 +173,18 @@ int stasis_app_control_continue(struct stasis_app_control *control, const char * */ int stasis_app_control_answer(struct stasis_app_control *control); +/*! + * \brief Place the channel associated with the control on hold. + * \param control Control for \c res_stasis. + */ +void stasis_app_control_hold(struct stasis_app_control *control); + +/*! + * \brief Remove the channel associated with the control from hold. + * \param control Control for \c res_stasis. + */ +void stasis_app_control_unhold(struct stasis_app_control *control); + /*! * \brief Returns the most recent snapshot for the associated channel. * diff --git a/res/stasis/control.c b/res/stasis/control.c index e05084b887..2bba842edf 100644 --- a/res/stasis/control.c +++ b/res/stasis/control.c @@ -207,6 +207,32 @@ int stasis_app_control_continue(struct stasis_app_control *control, const char * return 0; } +static void *app_control_hold(struct stasis_app_control *control, + struct ast_channel *chan, void *data) +{ + ast_indicate(control->channel, AST_CONTROL_HOLD); + + return NULL; +} + +void stasis_app_control_hold(struct stasis_app_control *control) +{ + stasis_app_send_command_async(control, app_control_hold, NULL); +} + +static void *app_control_unhold(struct stasis_app_control *control, + struct ast_channel *chan, void *data) +{ + ast_indicate(control->channel, AST_CONTROL_UNHOLD); + + return NULL; +} + +void stasis_app_control_unhold(struct stasis_app_control *control) +{ + stasis_app_send_command_async(control, app_control_unhold, NULL); +} + struct ast_channel_snapshot *stasis_app_control_get_snapshot( const struct stasis_app_control *control) { diff --git a/res/stasis_http/resource_channels.c b/res/stasis_http/resource_channels.c index aeeafa7052..0fbb754871 100644 --- a/res/stasis_http/resource_channels.c +++ b/res/stasis_http/resource_channels.c @@ -150,11 +150,32 @@ void stasis_http_unmute_channel(struct ast_variable *headers, struct ast_unmute_ } void stasis_http_hold_channel(struct ast_variable *headers, struct ast_hold_channel_args *args, struct stasis_http_response *response) { - ast_log(LOG_ERROR, "TODO: stasis_http_hold_channel\n"); + RAII_VAR(struct stasis_app_control *, control, NULL, ao2_cleanup); + + control = find_control(response, args->channel_id); + if (control == NULL) { + /* Response filled in by find_control */ + return; + } + + stasis_app_control_hold(control); + + stasis_http_response_no_content(response); } + void stasis_http_unhold_channel(struct ast_variable *headers, struct ast_unhold_channel_args *args, struct stasis_http_response *response) { - ast_log(LOG_ERROR, "TODO: stasis_http_unhold_channel\n"); + RAII_VAR(struct stasis_app_control *, control, NULL, ao2_cleanup); + + control = find_control(response, args->channel_id); + if (control == NULL) { + /* Response filled in by find_control */ + return; + } + + stasis_app_control_unhold(control); + + stasis_http_response_no_content(response); } void stasis_http_play_on_channel(struct ast_variable *headers,