ast_string_field_set(dst, connect_sound, src->connect_sound);
}
-static int bridge_builtin_set_limits(struct ast_bridge_features *features, struct ast_bridge_features_limits *limits, int remove_on_pull)
+static int bridge_builtin_set_limits(struct ast_bridge_features *features,
+ struct ast_bridge_features_limits *limits, enum ast_bridge_hook_remove_flags remove_flags)
{
struct ast_bridge_features_limits *feature_limits;
/* BUGBUG feature interval hooks need to be reimplemented to be more stand alone. */
if (ast_bridge_interval_hook(features, feature_limits->duration,
- bridge_features_duration_callback, feature_limits, NULL, remove_on_pull)) {
+ bridge_features_duration_callback, feature_limits, NULL, remove_flags)) {
ast_log(LOG_ERROR, "Failed to schedule the duration limiter to the bridge channel.\n");
return -1;
}
if (!ast_strlen_zero(feature_limits->connect_sound)) {
if (ast_bridge_interval_hook(features, 1,
- bridge_features_connect_callback, feature_limits, NULL, remove_on_pull)) {
+ bridge_features_connect_callback, feature_limits, NULL, remove_flags)) {
ast_log(LOG_WARNING, "Failed to schedule connect sound to the bridge channel.\n");
}
}
if (feature_limits->warning && feature_limits->warning < feature_limits->duration) {
if (ast_bridge_interval_hook(features, feature_limits->duration - feature_limits->warning,
- bridge_features_warning_callback, feature_limits, NULL, remove_on_pull)) {
+ bridge_features_warning_callback, feature_limits, NULL, remove_flags)) {
ast_log(LOG_WARNING, "Failed to schedule warning sound playback to the bridge channel.\n");
}
}
*
* \param features Bridge features structure
* \param limits Configured limits applicable to the channel
- * \param remove_on_pull TRUE if remove the hook when the channel is pulled from the bridge.
+ * \param remove_flags Dictates what situations the hook should be removed.
*
* \retval 0 on success
* \retval -1 on failure
*/
-typedef int (*ast_bridge_builtin_set_limits_fn)(struct ast_bridge_features *features, struct ast_bridge_features_limits *limits, int remove_on_pull);
+typedef int (*ast_bridge_builtin_set_limits_fn)(struct ast_bridge_features *features,
+ struct ast_bridge_features_limits *limits, enum ast_bridge_hook_remove_flags remove_flags);
/*!
* \brief Register a handler for a built in interval feature
* \param callback Function to execute upon activation
* \param hook_pvt Unique data
* \param destructor Optional destructor callback for hook_pvt data
- * \param remove_on_pull TRUE if remove the hook when the channel is pulled from the bridge.
+ * \param remove_flags Dictates what situations the hook should be removed.
*
* \retval 0 on success
* \retval -1 on failure
ast_bridge_hook_callback callback,
void *hook_pvt,
ast_bridge_hook_pvt_destructor destructor,
- int remove_on_pull);
+ enum ast_bridge_hook_remove_flags remove_flags);
/*!
* \brief Attach a bridge channel leave hook to a bridge features structure
* \param callback Function to execute upon activation
* \param hook_pvt Unique data
* \param destructor Optional destructor callback for hook_pvt data
- * \param remove_on_pull TRUE if remove the hook when the channel is pulled from the bridge.
+ * \param remove_flags Dictates what situations the hook should be removed.
*
* \retval 0 on success
* \retval -1 on failure
ast_bridge_hook_callback callback,
void *hook_pvt,
ast_bridge_hook_pvt_destructor destructor,
- int remove_on_pull);
+ enum ast_bridge_hook_remove_flags remove_flags);
/*!
* \brief Attach a hangup hook to a bridge features structure
* \param callback Function to execute upon activation
* \param hook_pvt Unique data
* \param destructor Optional destructor callback for hook_pvt data
- * \param remove_on_pull TRUE if remove the hook when the channel is pulled from the bridge.
+ * \param remove_flags Dictates what situations the hook should be removed.
*
* \retval 0 on success
* \retval -1 on failure
ast_bridge_hook_callback callback,
void *hook_pvt,
ast_bridge_hook_pvt_destructor destructor,
- int remove_on_pull);
+ enum ast_bridge_hook_remove_flags remove_flags);
/*!
* \brief Attach a DTMF hook to a bridge features structure
* \param callback Function to execute upon activation
* \param hook_pvt Unique data
* \param destructor Optional destructor callback for hook_pvt data
- * \param remove_on_pull TRUE if remove the hook when the channel is pulled from the bridge.
+ * \param remove_flags Dictates what situations the hook should be removed.
*
* \retval 0 on success
* \retval -1 on failure
ast_bridge_hook_callback callback,
void *hook_pvt,
ast_bridge_hook_pvt_destructor destructor,
- int remove_on_pull);
+ enum ast_bridge_hook_remove_flags remove_flags);
/*!
* \brief attach an interval hook to a bridge features structure
* \param callback Function to execute upon activation
* \param hook_pvt Unique data
* \param destructor Optional destructor callback for hook_pvt data
- * \param remove_on_pull TRUE if remove the hook when the channel is pulled from the bridge.
+ * \param remove_flags Dictates what situations the hook should be removed.
*
* \retval 0 on success
* \retval -1 on failure
ast_bridge_hook_callback callback,
void *hook_pvt,
ast_bridge_hook_pvt_destructor destructor,
- int remove_on_pull);
+ enum ast_bridge_hook_remove_flags remove_flags);
/*!
* \brief Set a callback on the features structure to receive talking notifications on.
* \param dtmf Optionally the DTMF stream to trigger the feature, if not specified it will be the default
* \param config Configuration structure unique to the built in type
* \param destructor Optional destructor callback for config data
- * \param remove_on_pull TRUE if remove the hook when the channel is pulled from the bridge.
+ * \param remove_flags Dictates what situations the hook should be removed.
*
* \retval 0 on success
* \retval -1 on failure
const char *dtmf,
void *config,
ast_bridge_hook_pvt_destructor destructor,
- int remove_on_pull);
+ enum ast_bridge_hook_remove_flags remove_flags);
/*!
* \brief Constructor function for ast_bridge_features_limits
*
* \param features Bridge features structure
* \param limits Configured limits applicable to the channel
- * \param remove_on_pull TRUE if remove the hook when the channel is pulled from the bridge.
+ * \param remove_flags Dictates what situations the hook should be removed.
*
* \retval 0 on success
* \retval -1 on failure
* \note This API call can only be used on a features structure that will be used in association with a bridge channel.
* \note The ast_bridge_features_limits structure must remain accessible for the lifetime of the features structure.
*/
-int ast_bridge_features_set_limits(struct ast_bridge_features *features, struct ast_bridge_features_limits *limits, int remove_on_pull);
+int ast_bridge_features_set_limits(struct ast_bridge_features *features, struct ast_bridge_features_limits *limits, enum ast_bridge_hook_remove_flags remove_flags);
/*!
* \brief Set a flag on a bridge channel features structure
* \param callback Function to execute upon activation
* \param hook_pvt Unique data
* \param destructor Optional destructor callback for hook_pvt data
- * \param remove_on_pull TRUE if remove the hook when the channel is pulled from the bridge.
+ * \param remove_flags Dictates what situations the hook should be removed.
*
* \retval hook on success.
* \retval NULL on error.
ast_bridge_hook_callback callback,
void *hook_pvt,
ast_bridge_hook_pvt_destructor destructor,
- int remove_on_pull)
+ enum ast_bridge_hook_remove_flags remove_flags)
{
struct ast_bridge_hook *hook;
hook->callback = callback;
hook->destructor = destructor;
hook->hook_pvt = hook_pvt;
- ast_set_flag(&hook->remove_flags, AST_BRIDGE_HOOK_REMOVE_ON_PULL);
+ ast_set_flag(&hook->remove_flags, remove_flags);
}
return hook;
ast_bridge_hook_callback callback,
void *hook_pvt,
ast_bridge_hook_pvt_destructor destructor,
- int remove_on_pull)
+ enum ast_bridge_hook_remove_flags remove_flags)
{
struct ast_bridge_hook *hook;
int res;
/* Allocate new hook and setup it's various variables */
hook = bridge_hook_generic(sizeof(*hook), callback, hook_pvt, destructor,
- remove_on_pull);
+ remove_flags);
if (!hook) {
return -1;
}
ast_bridge_hook_callback callback,
void *hook_pvt,
ast_bridge_hook_pvt_destructor destructor,
- int remove_on_pull)
+ enum ast_bridge_hook_remove_flags remove_flags)
{
struct ast_bridge_hook *hook;
int res;
/* Allocate new hook and setup it's various variables */
hook = bridge_hook_generic(sizeof(*hook), callback, hook_pvt, destructor,
- remove_on_pull);
+ remove_flags);
if (!hook) {
return -1;
}
ast_bridge_hook_callback callback,
void *hook_pvt,
ast_bridge_hook_pvt_destructor destructor,
- int remove_on_pull)
+ enum ast_bridge_hook_remove_flags remove_flags)
{
struct ast_bridge_hook *hook;
int res;
/* Allocate new hook and setup it's various variables */
hook = bridge_hook_generic(sizeof(*hook), callback, hook_pvt, destructor,
- remove_on_pull);
+ remove_flags);
if (!hook) {
return -1;
}
ast_bridge_hook_callback callback,
void *hook_pvt,
ast_bridge_hook_pvt_destructor destructor,
- int remove_on_pull)
+ enum ast_bridge_hook_remove_flags remove_flags)
{
struct ast_bridge_hook *hook;
int res;
/* Allocate new hook and setup it's various variables */
hook = bridge_hook_generic(sizeof(*hook), callback, hook_pvt, destructor,
- remove_on_pull);
+ remove_flags);
if (!hook) {
return -1;
}
ast_bridge_hook_callback callback,
void *hook_pvt,
ast_bridge_hook_pvt_destructor destructor,
- int remove_on_pull)
+ enum ast_bridge_hook_remove_flags remove_flags)
{
struct ast_bridge_hook *hook;
int res;
/* Allocate new hook and setup it's various variables */
hook = bridge_hook_generic(sizeof(*hook), callback, hook_pvt, destructor,
- remove_on_pull);
+ remove_flags);
if (!hook) {
return -1;
}
const char *dtmf,
void *config,
ast_bridge_hook_pvt_destructor destructor,
- int remove_on_pull)
+ enum ast_bridge_hook_remove_flags remove_flags)
{
if (ARRAY_LEN(builtin_features_handlers) <= feature
|| !builtin_features_handlers[feature]) {
* using the built in feature's DTMF callback. Easy as pie.
*/
return ast_bridge_dtmf_hook(features, dtmf, builtin_features_handlers[feature],
- config, destructor, remove_on_pull);
+ config, destructor, remove_flags);
}
int ast_bridge_features_limits_construct(struct ast_bridge_features_limits *limits)
ast_string_field_free_memory(limits);
}
-int ast_bridge_features_set_limits(struct ast_bridge_features *features, struct ast_bridge_features_limits *limits, int remove_on_pull)
+int ast_bridge_features_set_limits(struct ast_bridge_features *features,
+ struct ast_bridge_features_limits *limits, enum ast_bridge_hook_remove_flags remove_flags)
{
if (builtin_interval_handlers[AST_BRIDGE_BUILTIN_INTERVAL_LIMITS]) {
ast_bridge_builtin_set_limits_fn bridge_features_set_limits_callback;
bridge_features_set_limits_callback = builtin_interval_handlers[AST_BRIDGE_BUILTIN_INTERVAL_LIMITS];
- return bridge_features_set_limits_callback(features, limits, remove_on_pull);
+ return bridge_features_set_limits_callback(features, limits, remove_flags);
}
ast_log(LOG_ERROR, "Attempted to set limits without an AST_BRIDGE_BUILTIN_INTERVAL_LIMITS callback registered.\n");
/*!
* \internal
- * \brief ao2 object match remove_on_pull hooks.
+ * \brief ao2 object match hooks with appropriate remove_flags.
* \since 12.0.0
*
* \param obj Feature hook object.
/*!
* \internal
- * \brief Remove all remove_on_pull hooks in the container.
+ * \brief Remove all hooks with appropriate remove_flags in the container.
* \since 12.0.0
*
* \param hooks Hooks container to work on.
/*!
* \internal
- * \brief Remove all remove_on_pull hooks in the heap.
+ * \brief Remove all hooks in the heap with appropriate remove_flags set.
* \since 12.0.0
*
* \param hooks Hooks heap to work on.
*/
static int bridge_basic_push(struct ast_bridge *self, struct ast_bridge_channel *bridge_channel, struct ast_bridge_channel *swap)
{
- if (ast_bridge_hangup_hook(bridge_channel->features, basic_hangup_hook, NULL, NULL, 1)
+ if (ast_bridge_hangup_hook(bridge_channel->features, basic_hangup_hook, NULL, NULL, AST_BRIDGE_HOOK_REMOVE_ON_PULL)
|| ast_bridge_channel_setup_features(bridge_channel)) {
return -1;
}
builtin_feature_get_exten(chan, "blindxfer", dtmf, sizeof(dtmf));
if (!ast_strlen_zero(dtmf)) {
/* BUGBUG need to supply a blind transfer structure and destructor to use other than defaults */
- res |= ast_bridge_features_enable(features, AST_BRIDGE_BUILTIN_BLINDTRANSFER, dtmf, NULL, NULL, 1);
+ res |= ast_bridge_features_enable(features, AST_BRIDGE_BUILTIN_BLINDTRANSFER, dtmf,
+ NULL, NULL, AST_BRIDGE_HOOK_REMOVE_ON_PULL);
}
builtin_feature_get_exten(chan, "atxfer", dtmf, sizeof(dtmf));
if (!ast_strlen_zero(dtmf)) {
/* BUGBUG need to supply an attended transfer structure and destructor to use other than defaults */
- res |= ast_bridge_features_enable(features, AST_BRIDGE_BUILTIN_ATTENDEDTRANSFER, dtmf, NULL, NULL, 1);
+ res |= ast_bridge_features_enable(features, AST_BRIDGE_BUILTIN_ATTENDEDTRANSFER, dtmf,
+ NULL, NULL, AST_BRIDGE_HOOK_REMOVE_ON_PULL);
}
}
if (ast_test_flag(flags, AST_FEATURE_DISCONNECT)) {
builtin_feature_get_exten(chan, "disconnect", dtmf, sizeof(dtmf));
if (!ast_strlen_zero(dtmf)) {
- res |= ast_bridge_features_enable(features, AST_BRIDGE_BUILTIN_HANGUP, dtmf, NULL, NULL, 1);
+ res |= ast_bridge_features_enable(features, AST_BRIDGE_BUILTIN_HANGUP, dtmf,
+ NULL, NULL, AST_BRIDGE_HOOK_REMOVE_ON_PULL);
}
}
if (ast_test_flag(flags, AST_FEATURE_PARKCALL)) {
builtin_feature_get_exten(chan, "parkcall", dtmf, sizeof(dtmf));
if (!ast_strlen_zero(dtmf)) {
- res |= ast_bridge_features_enable(features, AST_BRIDGE_BUILTIN_PARKCALL, dtmf, NULL, NULL, 1);
+ res |= ast_bridge_features_enable(features, AST_BRIDGE_BUILTIN_PARKCALL, dtmf,
+ NULL, NULL, AST_BRIDGE_HOOK_REMOVE_ON_PULL);
}
}
if (ast_test_flag(flags, AST_FEATURE_AUTOMON)) {
builtin_feature_get_exten(chan, "automon", dtmf, sizeof(dtmf));
if (!ast_strlen_zero(dtmf)) {
- res |= ast_bridge_features_enable(features, AST_BRIDGE_BUILTIN_AUTOMON, dtmf, NULL, NULL, 1);
+ res |= ast_bridge_features_enable(features, AST_BRIDGE_BUILTIN_AUTOMON, dtmf,
+ NULL, NULL, AST_BRIDGE_HOOK_REMOVE_ON_PULL);
}
}
if (ast_test_flag(flags, AST_FEATURE_AUTOMIXMON)) {
builtin_feature_get_exten(chan, "automixmon", dtmf, sizeof(dtmf));
if (!ast_strlen_zero(dtmf)) {
- res |= ast_bridge_features_enable(features, AST_BRIDGE_BUILTIN_AUTOMIXMON, dtmf, NULL, NULL, 1);
+ res |= ast_bridge_features_enable(features, AST_BRIDGE_BUILTIN_AUTOMIXMON, dtmf,
+ NULL, NULL, AST_BRIDGE_HOOK_REMOVE_ON_PULL);
}
}
ast_unlock_call_features();
ao2_ref(user, +1);
if (ast_bridge_interval_hook(features, time_limit,
- parking_duration_callback, user, parking_duration_cb_destroyer, 1)) {
+ parking_duration_callback, user, parking_duration_cb_destroyer, AST_BRIDGE_HOOK_REMOVE_ON_PULL)) {
ast_log(LOG_ERROR, "Failed to apply duration limits to the parking call.\n");
}
}