Author: mmichelson
Date: Thu Aug  1 15:39:35 2013
New Revision: 396027

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=396027
Log:
Address review feedback and update to deal with bridge renaming.


Modified:
    team/mmichelson/queue_bugbug/apps/app_queue.c
    team/mmichelson/queue_bugbug/include/asterisk/app.h
    team/mmichelson/queue_bugbug/include/asterisk/bridge_basic.h
    team/mmichelson/queue_bugbug/main/bridge.c
    team/mmichelson/queue_bugbug/main/bridge_basic.c
    team/mmichelson/queue_bugbug/main/core_local.c

Modified: team/mmichelson/queue_bugbug/apps/app_queue.c
URL: 
http://svnview.digium.com/svn/asterisk/team/mmichelson/queue_bugbug/apps/app_queue.c?view=diff&rev=396027&r1=396026&r2=396027
==============================================================================
--- team/mmichelson/queue_bugbug/apps/app_queue.c (original)
+++ team/mmichelson/queue_bugbug/apps/app_queue.c Thu Aug  1 15:39:35 2013
@@ -109,11 +109,11 @@
 #include "asterisk/stasis_channels.h"
 #include "asterisk/stasis_message_router.h"
 #include "asterisk/bridge_after.h"
-#include "asterisk/stasis_bridging.h"
+#include "asterisk/stasis_bridges.h"
 #include "asterisk/core_local.h"
 #include "asterisk/mixmonitor.h"
 #include "asterisk/core_unreal.h"
-#include "asterisk/bridging_basic.h"
+#include "asterisk/bridge_basic.h"
 
 /* Define, to debug reference counts on queues, without debugging reference 
counts on queue members */
 /* #define REF_DEBUG_ONLY_QUEUES */
@@ -1908,7 +1908,7 @@
                "%s", ast_str_buffer(event_string));
 }
 
-static void queue_publish_multi_channel_snapshot_blob(struct stasis_topic 
*topic, 
+static void queue_publish_multi_channel_snapshot_blob(struct stasis_topic 
*topic,
                struct ast_channel_snapshot *caller_snapshot,
                struct ast_channel_snapshot *agent_snapshot,
                struct stasis_message_type *type, struct ast_json *blob)
@@ -5497,12 +5497,12 @@
 
        if (stasis_subscription_final_message(sub, msg)) {
                ao2_cleanup(queue_data);
-       } 
+       }
 
        if (queue_data->dying) {
                return;
        }
-       
+
        if (ast_channel_entered_bridge_type() == stasis_message_type(msg)) {
                handle_bridge_enter(queue_data, msg);
        } else if (ast_blind_transfer_type() == stasis_message_type(msg)) {
@@ -5697,7 +5697,7 @@
                handle_local_optimization_end(queue_data, msg);
                return;
        }
-       
+
        if (ast_channel_hangup_request_type() == stasis_message_type(msg)) {
                handle_hangup(queue_data, msg);
        }
@@ -5816,7 +5816,7 @@
        if (p == escaped + size) {
                escaped[size - 1] = '\0';
        }
-       
+
        pbx_substitute_variables_helper(chan, escaped, output, size - 1);
 }
 
@@ -5857,7 +5857,7 @@
        } else {
                snprintf(mixmonargs, sizeof(mixmonargs), "b%s", 
monitor_options);
        }
-       
+
        ast_debug(1, "Arguments being passed to MixMonitor: %s,%s\n", 
file_with_ext, mixmonargs);
 
        if (ast_start_mixmonitor(qe->chan, file_with_ext, mixmonargs)) {
@@ -10241,7 +10241,7 @@
 static const struct ast_data_entry queue_data_providers[] = {
        AST_DATA_ENTRY("asterisk/application/queue/list", 
&queues_data_provider),
 };
-       
+
 static struct stasis_message_router *agent_router;
 
 static int unload_module(void)

Modified: team/mmichelson/queue_bugbug/include/asterisk/app.h
URL: 
http://svnview.digium.com/svn/asterisk/team/mmichelson/queue_bugbug/include/asterisk/app.h?view=diff&rev=396027&r1=396026&r2=396027
==============================================================================
--- team/mmichelson/queue_bugbug/include/asterisk/app.h (original)
+++ team/mmichelson/queue_bugbug/include/asterisk/app.h Thu Aug  1 15:39:35 2013
@@ -1292,7 +1292,7 @@
 struct stasis_topic *ast_queue_topic_all(void);
 
 /*!
- * \brief Get the \ref stasis topic for queue messages for a particular queue 
name 
+ * \brief Get the \ref stasis topic for queue messages for a particular queue 
name
  * \param queuename The name for which to get the topic
  * \retval The topic structure for queue messages for a given name
  * \retval NULL if it failed to be found or allocated

Modified: team/mmichelson/queue_bugbug/include/asterisk/bridge_basic.h
URL: 
http://svnview.digium.com/svn/asterisk/team/mmichelson/queue_bugbug/include/asterisk/bridge_basic.h?view=diff&rev=396027&r1=396026&r2=396027
==============================================================================
--- team/mmichelson/queue_bugbug/include/asterisk/bridge_basic.h (original)
+++ team/mmichelson/queue_bugbug/include/asterisk/bridge_basic.h Thu Aug  1 
15:39:35 2013
@@ -33,6 +33,7 @@
 extern "C" {
 #endif
 
+#define AST_TRANSFERER_ROLE_NAME "transferer"
 /* ------------------------------------------------------------------- */
 
 /*!
@@ -121,6 +122,17 @@
  */
 struct ast_bridge *ast_bridge_basic_new(void);
 
+/*!
+ * \brief Set feature flags on a basic bridge
+ *
+ * Using this function instead of setting flags directly will
+ * ensure that after operations such as an attended transfer,
+ * the bridge will maintain the flags that were set on it.
+ *
+ * \params Flags to set on the bridge. These are added to the flags already 
set.
+ */
+void ast_bridge_basic_set_flags(struct ast_bridge *bridge, unsigned int flags);
+
 /*! Initialize the basic bridge class for use by the system. */
 void ast_bridging_init_basic(void);
 

Modified: team/mmichelson/queue_bugbug/main/bridge.c
URL: 
http://svnview.digium.com/svn/asterisk/team/mmichelson/queue_bugbug/main/bridge.c?view=diff&rev=396027&r1=396026&r2=396027
==============================================================================
--- team/mmichelson/queue_bugbug/main/bridge.c (original)
+++ team/mmichelson/queue_bugbug/main/bridge.c Thu Aug  1 15:39:35 2013
@@ -70,6 +70,8 @@
 static struct ao2_container *bridges;
 
 static AST_RWLIST_HEAD_STATIC(bridge_technologies, ast_bridge_technology);
+
+static unsigned int optimization_id;
 
 /* Initial starting point for the bridge array of channels */
 #define BRIDGE_ARRAY_START 128
@@ -2377,22 +2379,26 @@
 
        other = ast_bridge_channel_peer(src_bridge_channel);
        if (other && other->state == BRIDGE_CHANNEL_STATE_WAIT) {
+               unsigned int id = ast_atomic_fetchadd_int((int *) 
&optimization_id, +1);
+
                ast_verb(3, "Move-swap optimizing %s <-- %s.\n",
                        ast_channel_name(dst_bridge_channel->chan),
                        ast_channel_name(other->chan));
 
                if (pvt && !ast_test_flag(pvt, AST_UNREAL_OPTIMIZE_BEGUN) && 
pvt->callbacks
                                && pvt->callbacks->optimization_started) {
-                       pvt->callbacks->optimization_started(pvt);
+                       pvt->callbacks->optimization_started(pvt, other->chan,
+                                       dst_bridge_channel->chan == pvt->owner 
? AST_UNREAL_OWNER : AST_UNREAL_CHAN,
+                                       id);
                        ast_set_flag(pvt, AST_UNREAL_OPTIMIZE_BEGUN);
                }
                other->swap = dst_bridge_channel->chan;
                if (!bridge_do_move(dst_bridge, other, 1, 1)) {
                        ast_bridge_channel_leave_bridge(src_bridge_channel, 
BRIDGE_CHANNEL_STATE_END_NO_DISSOLVE);
                        res = -1;
-                       if (pvt && pvt->callbacks && 
pvt->callbacks->optimization_finished) {
-                               pvt->callbacks->optimization_finished(pvt);
-                       }
+               }
+               if (pvt && pvt->callbacks && 
pvt->callbacks->optimization_finished) {
+                       pvt->callbacks->optimization_finished(pvt, res == 1, 
id);
                }
        }
        return res;
@@ -2470,6 +2476,7 @@
                chan_bridge_channel,
                peer_bridge_channel,
        };
+       unsigned int id;
 
        switch (bridges_allow_merge_optimization(chan_bridge, peer_bridge, 
ARRAY_LEN(kick_me), &merge)) {
        case MERGE_ALLOWED:
@@ -2493,14 +2500,18 @@
                ast_channel_name(chan_bridge_channel->chan),
                ast_channel_name(peer_bridge_channel->chan));
 
+       id = ast_atomic_fetchadd_int((int *) &optimization_id, +1);
+
        if (pvt && !ast_test_flag(pvt, AST_UNREAL_OPTIMIZE_BEGUN) && 
pvt->callbacks
                        && pvt->callbacks->optimization_started) {
-               pvt->callbacks->optimization_started(pvt);
+               pvt->callbacks->optimization_started(pvt, NULL,
+                               merge.dest == 
ast_channel_internal_bridge(pvt->owner) ? AST_UNREAL_OWNER : AST_UNREAL_CHAN,
+                               id);
                ast_set_flag(pvt, AST_UNREAL_OPTIMIZE_BEGUN);
        }
        bridge_do_merge(merge.dest, merge.src, kick_me, ARRAY_LEN(kick_me), 1);
        if (pvt && pvt->callbacks && pvt->callbacks->optimization_finished) {
-               pvt->callbacks->optimization_finished(pvt);
+               pvt->callbacks->optimization_finished(pvt, 1, id);
        }
 
        return -1;

Modified: team/mmichelson/queue_bugbug/main/bridge_basic.c
URL: 
http://svnview.digium.com/svn/asterisk/team/mmichelson/queue_bugbug/main/bridge_basic.c?view=diff&rev=396027&r1=396026&r2=396027
==============================================================================
--- team/mmichelson/queue_bugbug/main/bridge_basic.c (original)
+++ team/mmichelson/queue_bugbug/main/bridge_basic.c Thu Aug  1 15:39:35 2013
@@ -50,7 +50,6 @@
                        | AST_BRIDGE_FLAG_SMART)
 
 #define TRANSFER_FLAGS AST_BRIDGE_FLAG_SMART
-#define TRANSFERER_ROLE_NAME "transferer"
 
 struct attended_transfer_properties;
 
@@ -1170,7 +1169,7 @@
        }
 
        if (props->transferer) {
-               ast_channel_remove_bridge_role(props->transferer, 
TRANSFERER_ROLE_NAME);
+               ast_channel_remove_bridge_role(props->transferer, 
AST_TRANSFERER_ROLE_NAME);
        }
 
        clear_stimulus_queue(props);
@@ -2257,14 +2256,14 @@
        const char *swap_dtmf;
        struct bridge_basic_personality *personality = self->personality;
 
-       if (!ast_channel_has_role(bridge_channel->chan, TRANSFERER_ROLE_NAME)) {
+       if (!ast_channel_has_role(bridge_channel->chan, 
AST_TRANSFERER_ROLE_NAME)) {
                return 0;
        }
 
-       abort_dtmf = ast_channel_get_role_option(bridge_channel->chan, 
TRANSFERER_ROLE_NAME, "abort");
-       complete_dtmf = ast_channel_get_role_option(bridge_channel->chan, 
TRANSFERER_ROLE_NAME, "complete");
-       threeway_dtmf = ast_channel_get_role_option(bridge_channel->chan, 
TRANSFERER_ROLE_NAME, "threeway");
-       swap_dtmf = ast_channel_get_role_option(bridge_channel->chan, 
TRANSFERER_ROLE_NAME, "swap");
+       abort_dtmf = ast_channel_get_role_option(bridge_channel->chan, 
AST_TRANSFERER_ROLE_NAME, "abort");
+       complete_dtmf = ast_channel_get_role_option(bridge_channel->chan, 
AST_TRANSFERER_ROLE_NAME, "complete");
+       threeway_dtmf = ast_channel_get_role_option(bridge_channel->chan, 
AST_TRANSFERER_ROLE_NAME, "threeway");
+       swap_dtmf = ast_channel_get_role_option(bridge_channel->chan, 
AST_TRANSFERER_ROLE_NAME, "swap");
 
        if (!ast_strlen_zero(abort_dtmf) && 
ast_bridge_dtmf_hook(bridge_channel->features,
                        abort_dtmf, atxfer_abort, 
personality->details[personality->current].pvt, NULL,
@@ -2514,11 +2513,11 @@
                atxfer_swap = ast_strdupa(xfer_cfg->atxferswap);
        }
 
-       return ast_channel_add_bridge_role(chan, TRANSFERER_ROLE_NAME) ||
-               ast_channel_set_bridge_role_option(chan, TRANSFERER_ROLE_NAME, 
"abort", atxfer_abort) ||
-               ast_channel_set_bridge_role_option(chan, TRANSFERER_ROLE_NAME, 
"complete", atxfer_complete) ||
-               ast_channel_set_bridge_role_option(chan, TRANSFERER_ROLE_NAME, 
"threeway", atxfer_threeway) ||
-               ast_channel_set_bridge_role_option(chan, TRANSFERER_ROLE_NAME, 
"swap", atxfer_swap);
+       return ast_channel_add_bridge_role(chan, AST_TRANSFERER_ROLE_NAME) ||
+               ast_channel_set_bridge_role_option(chan, 
AST_TRANSFERER_ROLE_NAME, "abort", atxfer_abort) ||
+               ast_channel_set_bridge_role_option(chan, 
AST_TRANSFERER_ROLE_NAME, "complete", atxfer_complete) ||
+               ast_channel_set_bridge_role_option(chan, 
AST_TRANSFERER_ROLE_NAME, "threeway", atxfer_threeway) ||
+               ast_channel_set_bridge_role_option(chan, 
AST_TRANSFERER_ROLE_NAME, "swap", atxfer_swap);
 }
 
 /*!
@@ -2919,6 +2918,15 @@
        return bridge;
 }
 
+void ast_bridge_basic_set_flags(struct ast_bridge *bridge, unsigned int flags)
+{
+       SCOPED_LOCK(lock, bridge, ast_bridge_lock, ast_bridge_unlock);
+       struct bridge_basic_personality *personality = bridge->personality;
+
+       personality->details[personality->current].bridge_flags |= flags;
+       ast_set_flag(&bridge->feature_flags, flags);
+}
+
 void ast_bridging_init_basic(void)
 {
        /* Setup bridge basic subclass v_table. */

Modified: team/mmichelson/queue_bugbug/main/core_local.c
URL: 
http://svnview.digium.com/svn/asterisk/team/mmichelson/queue_bugbug/main/core_local.c?view=diff&rev=396027&r1=396026&r2=396027
==============================================================================
--- team/mmichelson/queue_bugbug/main/core_local.c (original)
+++ team/mmichelson/queue_bugbug/main/core_local.c Thu Aug  1 15:39:35 2013
@@ -96,6 +96,13 @@
                        <syntax>
                                <channel_snapshot prefix="LocalOne"/>
                                <channel_snapshot prefix="LocalTwo"/>
+                               <channel_snapshot prefix="Source"/>
+                               <parameter name="DestUniqueId">
+                                       <para>The unique ID of the bridge into 
which the local channel is optimizing.</para>
+                               </parameter>
+                               <parameter name="Id">
+                                       <para>Identification for the 
optimization operation.</para>
+                               </parameter>
                        </syntax>
                        <see-also>
                                <ref 
type="managerEvent">LocalOptimizationEnd</ref>
@@ -110,6 +117,13 @@
                        <syntax>
                                <channel_snapshot prefix="LocalOne"/>
                                <channel_snapshot prefix="LocalTwo"/>
+                               <parameter name="Success">
+                                       <para>Indicates whether the local 
optimization succeeded.</para>
+                               </parameter>
+                               <parameter name="Id">
+                                       <para>Identification for the 
optimization operation. Matches the <replaceable>Id</replaceable>
+                                       from a previous 
<literal>LocalOptimizationBegin</literal></para>
+                               </parameter>
                        </syntax>
                        <see-also>
                                <ref 
type="managerEvent">LocalOptimizationBegin</ref>
@@ -343,8 +357,6 @@
        RAII_VAR(struct stasis_message *, msg, NULL, ao2_cleanup);
        struct local_pvt *p = (struct local_pvt *)base;
 
-       ast_log(LOG_NOTICE, "Publishing dest of %s\n", dest == AST_UNREAL_OWNER 
? "OWNER" : "CHAN");
-
        json_object = ast_json_pack("{s: i, s: i}",
                        "dest", dest, "id", id);
 
@@ -353,6 +365,9 @@
        }
 
        payload = local_channel_optimization_blob(p, json_object);
+       if (!payload) {
+               return;
+       }
 
        if (source) {
                RAII_VAR(struct ast_channel_snapshot *, source_snapshot, NULL, 
ao2_cleanup);
@@ -387,6 +402,9 @@
        }
 
        payload = local_channel_optimization_blob(p, json_object);
+       if (!payload) {
+               return;
+       }
 
        msg = stasis_message_create(ast_local_optimization_end_type(), payload);
        if (!msg) {
@@ -427,6 +445,9 @@
                source_snapshot = ast_multi_channel_blob_get_channel(obj, 
"source");
                if (source_snapshot) {
                        source_str = 
ast_manager_build_channel_state_string_prefix(source_snapshot, "Source");
+                       if (!source_str) {
+                               return NULL;
+                       }
                }
 
                dest_uniqueid = ast_json_object_get(blob, "dest") == 
AST_UNREAL_OWNER ?


--
_____________________________________________________________________
-- 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