diff options
-rw-r--r-- | bridges/bridge_builtin_interval_features.c | 9 | ||||
-rw-r--r-- | include/asterisk/bridging_features.h | 33 | ||||
-rw-r--r-- | main/bridging.c | 41 | ||||
-rw-r--r-- | main/bridging_basic.c | 2 | ||||
-rw-r--r-- | main/features.c | 18 | ||||
-rw-r--r-- | res/parking/parking_bridge_features.c | 2 |
6 files changed, 57 insertions, 48 deletions
diff --git a/bridges/bridge_builtin_interval_features.c b/bridges/bridge_builtin_interval_features.c index a0e767ed3..a4fd97ba0 100644 --- a/bridges/bridge_builtin_interval_features.c +++ b/bridges/bridge_builtin_interval_features.c @@ -146,7 +146,8 @@ static void copy_bridge_features_limits(struct ast_bridge_features_limits *dst, 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; @@ -173,7 +174,7 @@ static int bridge_builtin_set_limits(struct ast_bridge_features *features, struc /* 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; } @@ -182,14 +183,14 @@ static int bridge_builtin_set_limits(struct ast_bridge_features *features, struc 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"); } } diff --git a/include/asterisk/bridging_features.h b/include/asterisk/bridging_features.h index f37a6192a..1679f04a0 100644 --- a/include/asterisk/bridging_features.h +++ b/include/asterisk/bridging_features.h @@ -336,12 +336,13 @@ int ast_bridge_features_unregister(enum ast_bridge_builtin_feature feature); * * \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 @@ -388,7 +389,7 @@ int ast_bridge_interval_unregister(enum ast_bridge_builtin_interval interval); * \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 @@ -409,7 +410,7 @@ int ast_bridge_join_hook(struct ast_bridge_features *features, 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 @@ -418,7 +419,7 @@ int ast_bridge_join_hook(struct ast_bridge_features *features, * \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 @@ -439,7 +440,7 @@ int ast_bridge_leave_hook(struct ast_bridge_features *features, 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 @@ -448,7 +449,7 @@ int ast_bridge_leave_hook(struct ast_bridge_features *features, * \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 @@ -469,7 +470,7 @@ int ast_bridge_hangup_hook(struct ast_bridge_features *features, 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 @@ -479,7 +480,7 @@ int ast_bridge_hangup_hook(struct ast_bridge_features *features, * \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 @@ -501,7 +502,7 @@ int ast_bridge_dtmf_hook(struct ast_bridge_features *features, 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 @@ -511,7 +512,7 @@ int ast_bridge_dtmf_hook(struct ast_bridge_features *features, * \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 @@ -530,7 +531,7 @@ int ast_bridge_interval_hook(struct ast_bridge_features *features, 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. @@ -555,7 +556,7 @@ void ast_bridge_features_set_talk_detector(struct ast_bridge_features *features, * \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 @@ -577,7 +578,7 @@ int ast_bridge_features_enable(struct ast_bridge_features *features, 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 @@ -604,7 +605,7 @@ void ast_bridge_features_limits_destroy(struct ast_bridge_features_limits *limit * * \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 @@ -625,7 +626,7 @@ void ast_bridge_features_limits_destroy(struct ast_bridge_features_limits *limit * \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 diff --git a/main/bridging.c b/main/bridging.c index 5314c9339..1defa19f6 100644 --- a/main/bridging.c +++ b/main/bridging.c @@ -4372,7 +4372,7 @@ static void bridge_hook_destroy(void *vhook) * \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. @@ -4381,7 +4381,7 @@ static struct ast_bridge_hook *bridge_hook_generic(size_t size, 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; @@ -4391,7 +4391,7 @@ static struct ast_bridge_hook *bridge_hook_generic(size_t size, 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; @@ -4402,14 +4402,14 @@ int ast_bridge_dtmf_hook(struct ast_bridge_features *features, 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; } @@ -4426,14 +4426,14 @@ int ast_bridge_hangup_hook(struct ast_bridge_features *features, 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; } @@ -4449,14 +4449,14 @@ int ast_bridge_join_hook(struct ast_bridge_features *features, 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; } @@ -4472,14 +4472,14 @@ int ast_bridge_leave_hook(struct ast_bridge_features *features, 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; } @@ -4506,7 +4506,7 @@ int ast_bridge_interval_hook(struct ast_bridge_features *features, 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; @@ -4525,7 +4525,7 @@ int ast_bridge_interval_hook(struct ast_bridge_features *features, /* 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; } @@ -4551,7 +4551,7 @@ int ast_bridge_features_enable(struct ast_bridge_features *features, 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]) { @@ -4574,7 +4574,7 @@ int ast_bridge_features_enable(struct ast_bridge_features *features, * 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) @@ -4594,13 +4594,14 @@ void ast_bridge_features_limits_destroy(struct ast_bridge_features_limits *limit 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"); @@ -4615,7 +4616,7 @@ void ast_bridge_features_set_flag(struct ast_bridge_features *features, unsigned /*! * \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. @@ -4639,7 +4640,7 @@ static int hook_remove_match(void *obj, void *arg, int unused) /*! * \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. @@ -4655,7 +4656,7 @@ static void hooks_remove_container(struct ao2_container *hooks, enum ast_bridge_ /*! * \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. diff --git a/main/bridging_basic.c b/main/bridging_basic.c index 00daf7710..43862a013 100644 --- a/main/bridging_basic.c +++ b/main/bridging_basic.c @@ -126,7 +126,7 @@ static int basic_hangup_hook(struct ast_bridge *bridge, struct ast_bridge_channe */ 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; } diff --git a/main/features.c b/main/features.c index cd0f05a0b..d46342468 100644 --- a/main/features.c +++ b/main/features.c @@ -4173,36 +4173,42 @@ static int setup_bridge_features_builtin(struct ast_bridge_features *features, s 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(); diff --git a/res/parking/parking_bridge_features.c b/res/parking/parking_bridge_features.c index ddb5e7ff2..6462dc527 100644 --- a/res/parking/parking_bridge_features.c +++ b/res/parking/parking_bridge_features.c @@ -458,7 +458,7 @@ void parking_set_duration(struct ast_bridge_features *features, struct parked_us 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"); } } |