diff --git a/include/asterisk/stasis_app.h b/include/asterisk/stasis_app.h index f31bab8d905bcfbf8ffc6b2cddbac21e7d13334f..93d5cf36c877eb095ed80ce88c4906033bfd19ef 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 e05084b88772fbde1a55ec125fcfca84caabce9f..2bba842edf0d3a5b4c83db69d99d9abdefd5d5ac 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 aeeafa7052f458531426744e42fcf6ced5f7254b..0fbb754871a59208ba9e195b4f0e4831b6142088 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,