Remove remaining traces of remove_on_pull from hooks and hook APIs.
authorMark Michelson <mmichelson@digium.com>
Wed, 5 Jun 2013 19:19:48 +0000 (19:19 +0000)
committerMark Michelson <mmichelson@digium.com>
Wed, 5 Jun 2013 19:19:48 +0000 (19:19 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@390550 65c4cc65-6c06-0410-ace0-fbb531ad65f3

bridges/bridge_builtin_interval_features.c
include/asterisk/bridging_features.h
main/bridging.c
main/bridging_basic.c
main/features.c
res/parking/parking_bridge_features.c

index a0e767e..a4fd97b 100644 (file)
@@ -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");
                }
        }
index f37a619..1679f04 100644 (file)
@@ -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
index 5314c93..1defa19 100644 (file)
@@ -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.
index 00daf77..43862a0 100644 (file)
@@ -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;
        }
index cd0f05a..d463424 100644 (file)
@@ -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();
index ddb5e7f..6462dc5 100644 (file)
@@ -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");
        }
 }