* \param data Frame payload data to pass.
* \param datalen Frame payload data length to pass.
*
- * \return Nothing
+ * \retval 0 on success.
+ * \retval -1 on error.
*/
-typedef void (*ast_bridge_channel_post_action_data)(struct ast_bridge_channel *bridge_channel, enum ast_bridge_action_type action, const void *data, size_t datalen);
+typedef int (*ast_bridge_channel_post_action_data)(struct ast_bridge_channel *bridge_channel, enum ast_bridge_action_type action, const void *data, size_t datalen);
/*!
* \brief Queue an action frame onto the bridge channel with data.
* \param data Frame payload data to pass.
* \param datalen Frame payload data length to pass.
*
- * \return Nothing
+ * \retval 0 on success.
+ * \retval -1 on error.
*/
-void ast_bridge_channel_queue_action_data(struct ast_bridge_channel *bridge_channel, enum ast_bridge_action_type action, const void *data, size_t datalen);
+int ast_bridge_channel_queue_action_data(struct ast_bridge_channel *bridge_channel, enum ast_bridge_action_type action, const void *data, size_t datalen);
/*!
* \brief Write an action frame into the bridge with data.
* \param data Frame payload data to pass.
* \param datalen Frame payload data length to pass.
*
- * \return Nothing
+ * \retval 0 on success.
+ * \retval -1 on error.
*/
-void ast_bridge_channel_write_action_data(struct ast_bridge_channel *bridge_channel, enum ast_bridge_action_type action, const void *data, size_t datalen);
+int ast_bridge_channel_write_action_data(struct ast_bridge_channel *bridge_channel, enum ast_bridge_action_type action, const void *data, size_t datalen);
/*!
* \brief Queue a control frame onto the bridge channel with data.
* \param data Frame payload data to pass.
* \param datalen Frame payload data length to pass.
*
- * \return Nothing
+ * \retval 0 on success.
+ * \retval -1 on error.
*/
-void ast_bridge_channel_queue_control_data(struct ast_bridge_channel *bridge_channel, enum ast_control_frame_type control, const void *data, size_t datalen);
+int ast_bridge_channel_queue_control_data(struct ast_bridge_channel *bridge_channel, enum ast_control_frame_type control, const void *data, size_t datalen);
/*!
* \brief Write a control frame into the bridge with data.
* \param data Frame payload data to pass.
* \param datalen Frame payload data length to pass.
*
- * \return Nothing
+ * \retval 0 on success.
+ * \retval -1 on error.
*/
-void ast_bridge_channel_write_control_data(struct ast_bridge_channel *bridge_channel, enum ast_control_frame_type control, const void *data, size_t datalen);
+int ast_bridge_channel_write_control_data(struct ast_bridge_channel *bridge_channel, enum ast_control_frame_type control, const void *data, size_t datalen);
/*!
* \brief Write a hold frame into the bridge.
* \param bridge_channel Which channel is putting the hold into the bridge.
* \param moh_class The suggested music class for the other end to use.
*
- * \return Nothing
+ * \retval 0 on success.
+ * \retval -1 on error.
*/
-void ast_bridge_channel_write_hold(struct ast_bridge_channel *bridge_channel, const char *moh_class);
+int ast_bridge_channel_write_hold(struct ast_bridge_channel *bridge_channel, const char *moh_class);
/*!
* \brief Write an unhold frame into the bridge.
*
* \param bridge_channel Which channel is putting the hold into the bridge.
*
- * \return Nothing
+ * \retval 0 on success.
+ * \retval -1 on error.
*/
-void ast_bridge_channel_write_unhold(struct ast_bridge_channel *bridge_channel);
+int ast_bridge_channel_write_unhold(struct ast_bridge_channel *bridge_channel);
/*!
* \brief Run an application on the bridge channel.
*
* \note This is intended to be called by bridge hooks.
*
- * \return Nothing
+ * \retval 0 on success.
+ * \retval -1 on error.
*/
-void ast_bridge_channel_write_app(struct ast_bridge_channel *bridge_channel, const char *app_name, const char *app_args, const char *moh_class);
+int ast_bridge_channel_write_app(struct ast_bridge_channel *bridge_channel, const char *app_name, const char *app_args, const char *moh_class);
/*!
* \brief Queue a bridge action run application frame onto the bridge channel.
*
* \note This is intended to be called by bridge hooks.
*
- * \return Nothing
+ * \retval 0 on success.
+ * \retval -1 on error.
*/
-void ast_bridge_channel_queue_app(struct ast_bridge_channel *bridge_channel, const char *app_name, const char *app_args, const char *moh_class);
+int ast_bridge_channel_queue_app(struct ast_bridge_channel *bridge_channel, const char *app_name, const char *app_args, const char *moh_class);
/*!
* \brief Custom interpretation of the playfile name.
*
* \note This is intended to be called by bridge hooks.
*
- * \return Nothing
+ * \retval 0 on success.
+ * \retval -1 on error.
*/
-void ast_bridge_channel_write_playfile(struct ast_bridge_channel *bridge_channel, ast_bridge_custom_play_fn custom_play, const char *playfile, const char *moh_class);
+int ast_bridge_channel_write_playfile(struct ast_bridge_channel *bridge_channel, ast_bridge_custom_play_fn custom_play, const char *playfile, const char *moh_class);
/*!
* \brief Queue a bridge action play file frame onto the bridge channel.
*
* \note This is intended to be called by bridge hooks.
*
- * \return Nothing
+ * \retval 0 on success.
+ * \retval -1 on error.
*/
-void ast_bridge_channel_queue_playfile(struct ast_bridge_channel *bridge_channel, ast_bridge_custom_play_fn custom_play, const char *playfile, const char *moh_class);
+int ast_bridge_channel_queue_playfile(struct ast_bridge_channel *bridge_channel, ast_bridge_custom_play_fn custom_play, const char *playfile, const char *moh_class);
/*!
* \brief Custom callback run on a bridge channel.
*
* \note This is intended to be called by bridge hooks.
*
- * \return Nothing
+ * \retval 0 on success.
+ * \retval -1 on error.
*/
-void ast_bridge_channel_write_callback(struct ast_bridge_channel *bridge_channel, ast_bridge_custom_callback_fn callback, const void *payload, size_t payload_size);
+int ast_bridge_channel_write_callback(struct ast_bridge_channel *bridge_channel, ast_bridge_custom_callback_fn callback, const void *payload, size_t payload_size);
/*!
* \brief Queue a bridge action custom callback frame onto the bridge channel.
*
* \note This is intended to be called by bridge hooks.
*
- * \return Nothing
+ * \retval 0 on success.
+ * \retval -1 on error.
*/
-void ast_bridge_channel_queue_callback(struct ast_bridge_channel *bridge_channel, ast_bridge_custom_callback_fn callback, const void *payload, size_t payload_size);
+int ast_bridge_channel_queue_callback(struct ast_bridge_channel *bridge_channel, ast_bridge_custom_callback_fn callback, const void *payload, size_t payload_size);
/*!
* \brief Have a bridge channel park a channel in the bridge
*
* \note This is intended to be called by bridge hooks.
*
- * \return Nothing
+ * \retval 0 on success.
+ * \retval -1 on error.
*/
-void ast_bridge_channel_write_park(struct ast_bridge_channel *bridge_channel, const char *parkee_uuid,
+int ast_bridge_channel_write_park(struct ast_bridge_channel *bridge_channel, const char *parkee_uuid,
const char *parker_uuid, const char *app_data);
/*!
return 0;
}
-void ast_bridge_channel_queue_action_data(struct ast_bridge_channel *bridge_channel, enum ast_bridge_action_type action, const void *data, size_t datalen)
+int ast_bridge_channel_queue_action_data(struct ast_bridge_channel *bridge_channel, enum ast_bridge_action_type action, const void *data, size_t datalen)
{
struct ast_frame frame = {
.frametype = AST_FRAME_BRIDGE_ACTION,
.data.ptr = (void *) data,
};
- ast_bridge_channel_queue_frame(bridge_channel, &frame);
+ return ast_bridge_channel_queue_frame(bridge_channel, &frame);
}
-void ast_bridge_channel_queue_control_data(struct ast_bridge_channel *bridge_channel, enum ast_control_frame_type control, const void *data, size_t datalen)
+int ast_bridge_channel_queue_control_data(struct ast_bridge_channel *bridge_channel, enum ast_control_frame_type control, const void *data, size_t datalen)
{
struct ast_frame frame = {
.frametype = AST_FRAME_CONTROL,
.data.ptr = (void *) data,
};
- ast_bridge_channel_queue_frame(bridge_channel, &frame);
+ return ast_bridge_channel_queue_frame(bridge_channel, &frame);
}
void ast_bridge_channel_restore_formats(struct ast_bridge_channel *bridge_channel)
return ready;
}
-void ast_bridge_notify_talking(struct ast_bridge_channel *bridge_channel, int started_talking)
+int ast_bridge_notify_talking(struct ast_bridge_channel *bridge_channel, int started_talking)
{
struct ast_frame action = {
.frametype = AST_FRAME_BRIDGE_ACTION,
? AST_BRIDGE_ACTION_TALKING_START : AST_BRIDGE_ACTION_TALKING_STOP,
};
- ast_bridge_channel_queue_frame(bridge_channel, &action);
+ return ast_bridge_channel_queue_frame(bridge_channel, &action);
}
-static void bridge_channel_write_frame(struct ast_bridge_channel *bridge_channel, struct ast_frame *frame)
+static int bridge_channel_write_frame(struct ast_bridge_channel *bridge_channel, struct ast_frame *frame)
{
ast_bridge_channel_lock_bridge(bridge_channel);
/*
*/
bridge_channel->bridge->technology->write(bridge_channel->bridge, bridge_channel, frame);
ast_bridge_unlock(bridge_channel->bridge);
+
+ /*
+ * Claim successful write to bridge. If deferred frame
+ * support is added, claim successfully deferred.
+ */
+ return 0;
}
-void ast_bridge_channel_write_action_data(struct ast_bridge_channel *bridge_channel, enum ast_bridge_action_type action, const void *data, size_t datalen)
+int ast_bridge_channel_write_action_data(struct ast_bridge_channel *bridge_channel, enum ast_bridge_action_type action, const void *data, size_t datalen)
{
struct ast_frame frame = {
.frametype = AST_FRAME_BRIDGE_ACTION,
.data.ptr = (void *) data,
};
- bridge_channel_write_frame(bridge_channel, &frame);
+ return bridge_channel_write_frame(bridge_channel, &frame);
}
-void ast_bridge_channel_write_control_data(struct ast_bridge_channel *bridge_channel, enum ast_control_frame_type control, const void *data, size_t datalen)
+int ast_bridge_channel_write_control_data(struct ast_bridge_channel *bridge_channel, enum ast_control_frame_type control, const void *data, size_t datalen)
{
struct ast_frame frame = {
.frametype = AST_FRAME_CONTROL,
.data.ptr = (void *) data,
};
- bridge_channel_write_frame(bridge_channel, &frame);
+ return bridge_channel_write_frame(bridge_channel, &frame);
}
-void ast_bridge_channel_write_hold(struct ast_bridge_channel *bridge_channel, const char *moh_class)
+int ast_bridge_channel_write_hold(struct ast_bridge_channel *bridge_channel, const char *moh_class)
{
RAII_VAR(struct ast_json *, blob, NULL, ast_json_unref);
size_t datalen;
}
ast_channel_publish_blob(bridge_channel->chan, ast_channel_hold_type(), blob);
- ast_bridge_channel_write_control_data(bridge_channel, AST_CONTROL_HOLD, moh_class,
- datalen);
+ return ast_bridge_channel_write_control_data(bridge_channel, AST_CONTROL_HOLD,
+ moh_class, datalen);
}
-void ast_bridge_channel_write_unhold(struct ast_bridge_channel *bridge_channel)
+int ast_bridge_channel_write_unhold(struct ast_bridge_channel *bridge_channel)
{
ast_channel_publish_blob(bridge_channel->chan, ast_channel_unhold_type(), NULL);
- ast_bridge_channel_write_control_data(bridge_channel, AST_CONTROL_UNHOLD, NULL, 0);
+ return ast_bridge_channel_write_control_data(bridge_channel, AST_CONTROL_UNHOLD, NULL, 0);
}
static int run_app_helper(struct ast_channel *chan, const char *app_name, const char *app_args)
data->moh_offset ? &data->app_name[data->moh_offset] : NULL);
}
-static void payload_helper_app(ast_bridge_channel_post_action_data post_it,
+static int payload_helper_app(ast_bridge_channel_post_action_data post_it,
struct ast_bridge_channel *bridge_channel, const char *app_name, const char *app_args, const char *moh_class)
{
struct bridge_run_app *app_data;
strcpy(&app_data->app_name[app_data->moh_offset], moh_class);/* Safe */
}
- post_it(bridge_channel, AST_BRIDGE_ACTION_RUN_APP, app_data, len_data);
+ return post_it(bridge_channel, AST_BRIDGE_ACTION_RUN_APP, app_data, len_data);
}
-void ast_bridge_channel_write_app(struct ast_bridge_channel *bridge_channel, const char *app_name, const char *app_args, const char *moh_class)
+int ast_bridge_channel_write_app(struct ast_bridge_channel *bridge_channel, const char *app_name, const char *app_args, const char *moh_class)
{
- payload_helper_app(ast_bridge_channel_write_action_data,
+ return payload_helper_app(ast_bridge_channel_write_action_data,
bridge_channel, app_name, app_args, moh_class);
}
-void ast_bridge_channel_queue_app(struct ast_bridge_channel *bridge_channel, const char *app_name, const char *app_args, const char *moh_class)
+int ast_bridge_channel_queue_app(struct ast_bridge_channel *bridge_channel, const char *app_name, const char *app_args, const char *moh_class)
{
- payload_helper_app(ast_bridge_channel_queue_action_data,
+ return payload_helper_app(ast_bridge_channel_queue_action_data,
bridge_channel, app_name, app_args, moh_class);
}
payload->moh_offset ? &payload->playfile[payload->moh_offset] : NULL);
}
-static void payload_helper_playfile(ast_bridge_channel_post_action_data post_it,
+static int payload_helper_playfile(ast_bridge_channel_post_action_data post_it,
struct ast_bridge_channel *bridge_channel, ast_bridge_custom_play_fn custom_play, const char *playfile, const char *moh_class)
{
struct bridge_playfile *payload;
strcpy(&payload->playfile[payload->moh_offset], moh_class);/* Safe */
}
- post_it(bridge_channel, AST_BRIDGE_ACTION_PLAY_FILE, payload, len_payload);
+ return post_it(bridge_channel, AST_BRIDGE_ACTION_PLAY_FILE, payload, len_payload);
}
-void ast_bridge_channel_write_playfile(struct ast_bridge_channel *bridge_channel, ast_bridge_custom_play_fn custom_play, const char *playfile, const char *moh_class)
+int ast_bridge_channel_write_playfile(struct ast_bridge_channel *bridge_channel, ast_bridge_custom_play_fn custom_play, const char *playfile, const char *moh_class)
{
- payload_helper_playfile(ast_bridge_channel_write_action_data,
+ return payload_helper_playfile(ast_bridge_channel_write_action_data,
bridge_channel, custom_play, playfile, moh_class);
}
-void ast_bridge_channel_queue_playfile(struct ast_bridge_channel *bridge_channel, ast_bridge_custom_play_fn custom_play, const char *playfile, const char *moh_class)
+int ast_bridge_channel_queue_playfile(struct ast_bridge_channel *bridge_channel, ast_bridge_custom_play_fn custom_play, const char *playfile, const char *moh_class)
{
- payload_helper_playfile(ast_bridge_channel_queue_action_data,
+ return payload_helper_playfile(ast_bridge_channel_queue_action_data,
bridge_channel, custom_play, playfile, moh_class);
}
data->callback(bridge_channel, data->payload_exists ? data->payload : NULL, data->payload_size);
}
-static void payload_helper_cb(ast_bridge_channel_post_action_data post_it,
+static int payload_helper_cb(ast_bridge_channel_post_action_data post_it,
struct ast_bridge_channel *bridge_channel, ast_bridge_custom_callback_fn callback, const void *payload, size_t payload_size)
{
struct bridge_custom_callback *cb_data;
/* Sanity check. */
if (!callback) {
ast_assert(0);
- return;
+ return -1;
}
/* Fill in custom callback frame data. */
memcpy(cb_data->payload, payload, payload_size);/* Safe */
}
- post_it(bridge_channel, AST_BRIDGE_ACTION_CALLBACK, cb_data, len_data);
+ return post_it(bridge_channel, AST_BRIDGE_ACTION_CALLBACK, cb_data, len_data);
}
-void ast_bridge_channel_write_callback(struct ast_bridge_channel *bridge_channel, ast_bridge_custom_callback_fn callback, const void *payload, size_t payload_size)
+int ast_bridge_channel_write_callback(struct ast_bridge_channel *bridge_channel, ast_bridge_custom_callback_fn callback, const void *payload, size_t payload_size)
{
- payload_helper_cb(ast_bridge_channel_write_action_data,
+ return payload_helper_cb(ast_bridge_channel_write_action_data,
bridge_channel, callback, payload, payload_size);
}
-void ast_bridge_channel_queue_callback(struct ast_bridge_channel *bridge_channel, ast_bridge_custom_callback_fn callback, const void *payload, size_t payload_size)
+int ast_bridge_channel_queue_callback(struct ast_bridge_channel *bridge_channel, ast_bridge_custom_callback_fn callback, const void *payload, size_t payload_size)
{
- payload_helper_cb(ast_bridge_channel_queue_action_data,
+ return payload_helper_cb(ast_bridge_channel_queue_action_data,
bridge_channel, callback, payload, payload_size);
}
payload->app_data_offset ? &payload->parkee_uuid[payload->app_data_offset] : NULL);
}
-static void payload_helper_park(ast_bridge_channel_post_action_data post_it,
+static int payload_helper_park(ast_bridge_channel_post_action_data post_it,
struct ast_bridge_channel *bridge_channel,
const char *parkee_uuid,
const char *parker_uuid,
strcpy(&payload->parkee_uuid[payload->app_data_offset], app_data);
}
- post_it(bridge_channel, AST_BRIDGE_ACTION_PARK, payload, len_payload);
+ return post_it(bridge_channel, AST_BRIDGE_ACTION_PARK, payload, len_payload);
}
-void ast_bridge_channel_write_park(struct ast_bridge_channel *bridge_channel, const char *parkee_uuid, const char *parker_uuid, const char *app_data)
+int ast_bridge_channel_write_park(struct ast_bridge_channel *bridge_channel, const char *parkee_uuid, const char *parker_uuid, const char *app_data)
{
- payload_helper_park(ast_bridge_channel_write_action_data,
+ return payload_helper_park(ast_bridge_channel_write_action_data,
bridge_channel, parkee_uuid, parker_uuid, app_data);
}
ast_heap_unlock(bridge_channel->features->interval_hooks);
}
-static void bridge_channel_write_dtmf_stream(struct ast_bridge_channel *bridge_channel, const char *dtmf)
+static int bridge_channel_write_dtmf_stream(struct ast_bridge_channel *bridge_channel, const char *dtmf)
{
- ast_bridge_channel_write_action_data(bridge_channel,
+ return ast_bridge_channel_write_action_data(bridge_channel,
AST_BRIDGE_ACTION_DTMF_STREAM, dtmf, strlen(dtmf) + 1);
}
* \param exten The destination extension for the transferee
* \param context The destination context for the transferee
* \param hook Frame hook to attach to transferee
- * \retval 0 Successfully queued the action
- * \retval non-zero Failed to queue the action
+ *
+ * \retval 0 on success.
+ * \retval -1 on error.
*/
static int bridge_channel_queue_blind_transfer(struct ast_channel *transferee,
const char *exten, const char *context,
ast_copy_string(blind_data.exten, exten, sizeof(blind_data.exten));
ast_copy_string(blind_data.context, context, sizeof(blind_data.context));
-/* BUGBUG Why doesn't this function return success/failure? */
- ast_bridge_channel_queue_action_data(transferee_bridge_channel,
- AST_BRIDGE_ACTION_BLIND_TRANSFER, &blind_data, sizeof(blind_data));
-
- return 0;
+ return ast_bridge_channel_queue_action_data(transferee_bridge_channel,
+ AST_BRIDGE_ACTION_BLIND_TRANSFER, &blind_data, sizeof(blind_data));
}
static int bridge_channel_queue_attended_transfer(struct ast_channel *transferee,
ast_copy_string(unbridged_chan_name, ast_channel_name(unbridged_chan),
sizeof(unbridged_chan_name));
- ast_bridge_channel_queue_action_data(transferee_bridge_channel,
+ return ast_bridge_channel_queue_action_data(transferee_bridge_channel,
AST_BRIDGE_ACTION_ATTENDED_TRANSFER, unbridged_chan_name,
sizeof(unbridged_chan_name));
-
- return 0;
}
enum try_parking_result {