static int app_control_dial(struct stasis_app_control *control, struct ast_channel *chan, void *data) { struct control_dial_args *args = data; int bridged; ast_channel_lock(chan); bridged = ast_channel_is_bridged(chan); ast_channel_unlock(chan); if (!bridged && add_to_dial_bridge(control, chan)) { return -1; } if (args->timeout && set_timeout(chan, args->timeout)) { return -1; } if (ast_call(chan, args->dialstring, 0)) { return -1; } ast_channel_publish_dial(NULL, chan, args->dialstring, NULL); return 0; }
/*! * \brief Depart a channel from a bridge, and potentially add it back to the dial bridge * * \param control Take a guess * \param chan Take another guess */ static int depart_channel(struct stasis_app_control *control, struct ast_channel *chan) { ast_bridge_depart(chan); if (!ast_check_hangup(chan) && ast_channel_state(chan) != AST_STATE_UP) { /* Channel is still being dialed, so put it back in the dialing bridge */ add_to_dial_bridge(control, chan); } return 0; }