Author: dlee
Date: Tue Jul 30 20:53:15 2013
New Revision: 395836

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=395836
Log:
Initial idea

Added:
    team/dlee/ari-async-bridge/res/res_stasis_bridge.c
      - copied, changed from r395795, 
team/dlee/ari-async-bridge/res/res_stasis_bridge_add.c
Removed:
    team/dlee/ari-async-bridge/res/res_stasis_bridge_add.c
Modified:
    team/dlee/ari-async-bridge/include/asterisk/stasis_app.h
    team/dlee/ari-async-bridge/include/asterisk/stasis_app_impl.h
    team/dlee/ari-async-bridge/res/ari/resource_bridges.c
    team/dlee/ari-async-bridge/res/stasis/control.c

Modified: team/dlee/ari-async-bridge/include/asterisk/stasis_app.h
URL: 
http://svnview.digium.com/svn/asterisk/team/dlee/ari-async-bridge/include/asterisk/stasis_app.h?view=diff&rev=395836&r1=395835&r2=395836
==============================================================================
--- team/dlee/ari-async-bridge/include/asterisk/stasis_app.h (original)
+++ team/dlee/ari-async-bridge/include/asterisk/stasis_app.h Tue Jul 30 
20:53:15 2013
@@ -330,21 +330,18 @@
  *
  * \param control Control whose channel should be removed from the bridge
  * \param bridge Pointer to the bridge
+ */
+void stasis_app_control_remove_channel_from_bridge(
+       struct stasis_app_control *control, struct ast_bridge *bridge);
+
+/*!
+ * \brief Destroy the bridge.
+ *
+ * \param bridge_id Uniqueid of bridge to be destroyed
  *
  * \retval non-zero on failure
  * \retval zero on success
  */
-int stasis_app_control_remove_channel_from_bridge(
-       struct stasis_app_control *control, struct ast_bridge *bridge);
-
-/*!
- * \brief Destroy the bridge.
- *
- * \param bridge_id Uniqueid of bridge to be destroyed
- *
- * \retval non-zero on failure
- * \retval zero on success
- */
 void stasis_app_bridge_destroy(const char *bridge_id);
 
 /*!

Modified: team/dlee/ari-async-bridge/include/asterisk/stasis_app_impl.h
URL: 
http://svnview.digium.com/svn/asterisk/team/dlee/ari-async-bridge/include/asterisk/stasis_app_impl.h?view=diff&rev=395836&r1=395835&r2=395836
==============================================================================
--- team/dlee/ari-async-bridge/include/asterisk/stasis_app_impl.h (original)
+++ team/dlee/ari-async-bridge/include/asterisk/stasis_app_impl.h Tue Jul 30 
20:53:15 2013
@@ -85,4 +85,25 @@
 int stasis_app_send_command_async(struct stasis_app_control *control,
        stasis_app_command_cb command, void *data);
 
+/*!
+ * \since 12
+ * \brief Changes the bridge currently associated with a control object.
+ *
+ * \param control Control object for the channel to query.
+ * \param bridge New bridge to set on the control object. Or \c NULL to clear
+ *               the association.
+ */
+void stasis_app_set_bridge(struct stasis_app_control *control,
+       struct ast_bridge *bridge);
+
+/*!
+ * \since 12
+ * \brief Gets the bridge currently associated with a control object.
+ *
+ * \param control Control object for the channel to query.
+ * \return Associated \ref ast_bridge.
+ * \return \c NULL if not associated with a bridge.
+ */
+struct ast_bridge *stasis_app_get_bridge(struct stasis_app_control *control);
+
 #endif /* _ASTERISK_RES_STASIS_H */

Modified: team/dlee/ari-async-bridge/res/ari/resource_bridges.c
URL: 
http://svnview.digium.com/svn/asterisk/team/dlee/ari-async-bridge/res/ari/resource_bridges.c?view=diff&rev=395836&r1=395835&r2=395836
==============================================================================
--- team/dlee/ari-async-bridge/res/ari/resource_bridges.c (original)
+++ team/dlee/ari-async-bridge/res/ari/resource_bridges.c Tue Jul 30 20:53:15 
2013
@@ -137,15 +137,7 @@
                return;
        }
 
-       /* BUGBUG this should make sure the bridge requested for removal is 
actually
-        * the bridge the channel is in. This will be possible once the bridge 
uniqueid
-        * is added to the channel snapshot. A 409 response should be issued if 
the bridge
-        * uniqueids don't match */
-       if (stasis_app_control_remove_channel_from_bridge(control, bridge)) {
-               ast_ari_response_error(response, 500, "Internal Error",
-                       "Could not remove channel from bridge");
-               return;
-       }
+       stasis_app_control_remove_channel_from_bridge(control, bridge);
 
        ast_ari_response_no_content(response);
 }

Copied: team/dlee/ari-async-bridge/res/res_stasis_bridge.c (from r395795, 
team/dlee/ari-async-bridge/res/res_stasis_bridge_add.c)
URL: 
http://svnview.digium.com/svn/asterisk/team/dlee/ari-async-bridge/res/res_stasis_bridge.c?view=diff&rev=395836&p1=team/dlee/ari-async-bridge/res/res_stasis_bridge_add.c&r1=395795&p2=team/dlee/ari-async-bridge/res/res_stasis_bridge.c&r2=395836
==============================================================================
--- team/dlee/ari-async-bridge/res/res_stasis_bridge_add.c (original)
+++ team/dlee/ari-async-bridge/res/res_stasis_bridge.c Tue Jul 30 20:53:15 2013
@@ -36,24 +36,66 @@
 #include "asterisk/stasis_app_impl.h"
 #include "asterisk/bridge.h"
 
-static void *app_control_join_bridge(struct stasis_app_control *control,
+static void *app_control_add_channel_to_bridge(
+       struct stasis_app_control *control,
        struct ast_channel *chan, void *data)
 {
-       struct ast_bridge_features features;
+       struct ast_bridge_features *features;
        struct ast_bridge *bridge = data;
-       ast_bridge_features_init(&features);
-       ast_bridge_join(bridge, chan, NULL, &features, NULL, 0);
-       ast_bridge_features_cleanup(&features);
+
+       ast_debug(3, "%s: Adding to bridge\n",
+                       stasis_app_control_get_channel_id(control));
+
+       features = ast_bridge_features_new();
+       if (!features) {
+               ast_log(LOG_ERROR,
+                       "Failed to allocate bridge features; proceeding 
without.\n");
+       }
+
+       ast_bridge_impart(bridge,
+               chan,
+               NULL, /* swap channel */
+               features,
+               0); /* independent - false allows us to ast_bridge_depart() */
 
        return NULL;
 }
 
-void stasis_app_control_add_channel_to_bridge(struct stasis_app_control 
*control, struct ast_bridge *bridge)
+void stasis_app_control_add_channel_to_bridge(
+       struct stasis_app_control *control, struct ast_bridge *bridge)
 {
        ast_debug(3, "%s: Sending channel add_to_bridge command\n",
                        stasis_app_control_get_channel_id(control));
+       stasis_app_send_command_async(control,
+               app_control_add_channel_to_bridge, bridge);
+}
 
-       stasis_app_send_command_async(control, app_control_join_bridge, bridge);
+static void *app_control_remove_channel_from_bridge(
+       struct stasis_app_control *control,
+       struct ast_channel *chan, void *data)
+{
+       struct ast_bridge *bridge = data;
+
+       ast_debug(3, "%s: Departing bridge\n",
+               stasis_app_control_get_channel_id(control));
+       if (bridge != stasis_app_get_bridge(control)) {
+               ast_log(LOG_WARNING, "%s: Not in bridge %s; not removing\n",
+                       stasis_app_control_get_channel_id(control),
+                       bridge->uniqueid);
+               return NULL;
+       }
+
+       ast_bridge_depart(chan);
+       return NULL;
+}
+
+void stasis_app_control_remove_channel_from_bridge(
+       struct stasis_app_control *control, struct ast_bridge *bridge)
+{
+       ast_debug(3, "%s: Sending channel remove_from_bridge command\n",
+                       stasis_app_control_get_channel_id(control));
+       stasis_app_send_command_async(control,
+               app_control_remove_channel_from_bridge, bridge);
 }
 
 static int load_module(void)
@@ -66,7 +108,7 @@
        return 0;
 }
 
-AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_GLOBAL_SYMBOLS, "Stasis 
application bridge add channel support",
+AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_GLOBAL_SYMBOLS, "Stasis 
application bridge support",
        .load = load_module,
        .unload = unload_module,
        .nonoptreq = "res_stasis");

Modified: team/dlee/ari-async-bridge/res/stasis/control.c
URL: 
http://svnview.digium.com/svn/asterisk/team/dlee/ari-async-bridge/res/stasis/control.c?view=diff&rev=395836&r1=395835&r2=395836
==============================================================================
--- team/dlee/ari-async-bridge/res/stasis/control.c (original)
+++ team/dlee/ari-async-bridge/res/stasis/control.c Tue Jul 30 20:53:15 2013
@@ -43,15 +43,19 @@
        /*! Queue of commands to dispatch on the channel */
        struct ao2_container *command_queue;
        /*!
-        * When set, /c app_stasis should exit and continue in the dialplan.
-        */
-       int is_done:1;
-       /*!
         * The associated channel.
         * Be very careful with the threading associated w/ manipulating
         * the channel.
         */
        struct ast_channel *channel;
+       /*!
+        * When a channel is in a bridge, the bridge that it is in.
+        */
+       struct ast_bridge *bridge;
+       /*!
+        * When set, /c app_stasis should exit and continue in the dialplan.
+        */
+       int is_done:1;
 };
 
 struct stasis_app_control *control_create(struct ast_channel *channel)
@@ -417,6 +421,23 @@
        return 0;
 }
 
+void stasis_app_set_bridge(struct stasis_app_control *control,
+       struct ast_bridge *bridge)
+{
+       if (!control) {
+               return;
+       }
+       control->bridge = bridge;
+}
+
+struct ast_bridge *stasis_app_get_bridge(struct stasis_app_control *control)
+{
+       if (!control) {
+               return NULL;
+       }
+       return control->bridge;
+}
+
 const char *stasis_app_control_get_channel_id(
        const struct stasis_app_control *control)
 {
@@ -458,10 +479,3 @@
        ao2_iterator_destroy(&i);
        return count;
 }
-
-/* Must be defined here since it must operate on the channel outside of the 
queue */
-int stasis_app_control_remove_channel_from_bridge(
-       struct stasis_app_control *control, struct ast_bridge *bridge)
-{
-       return ast_bridge_remove(bridge, control->channel);
-}


--
_____________________________________________________________________
-- Bandwidth and Colocation Provided by http://www.api-digital.com --

svn-commits mailing list
To UNSUBSCRIBE or update options visit:
   http://lists.digium.com/mailman/listinfo/svn-commits

Reply via email to