[asterisk-commits] dlee: branch dlee/ari-url-shuffle r392465 - in /team/dlee/ari-url-shuffle: ./...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Fri Jun 21 13:54:53 CDT 2013


Author: dlee
Date: Fri Jun 21 13:54:51 2013
New Revision: 392465

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=392465
Log:
Merged revisions 392318-392437 from http://svn.asterisk.org/svn/asterisk/trunk

Modified:
    team/dlee/ari-url-shuffle/   (props changed)
    team/dlee/ari-url-shuffle/apps/confbridge/conf_config_parser.c
    team/dlee/ari-url-shuffle/bridges/bridge_softmix.c
    team/dlee/ari-url-shuffle/channels/chan_unistim.c
    team/dlee/ari-url-shuffle/contrib/scripts/autosupport
    team/dlee/ari-url-shuffle/include/asterisk/bridging.h
    team/dlee/ari-url-shuffle/include/asterisk/bridging_features.h
    team/dlee/ari-url-shuffle/include/asterisk/bridging_technology.h
    team/dlee/ari-url-shuffle/main/bridging.c
    team/dlee/ari-url-shuffle/main/features.c
    team/dlee/ari-url-shuffle/main/threadpool.c
    team/dlee/ari-url-shuffle/res/parking/parking_bridge_features.c
    team/dlee/ari-url-shuffle/res/res_sip_session.c

Propchange: team/dlee/ari-url-shuffle/
------------------------------------------------------------------------------
--- svnmerge-integrated (original)
+++ svnmerge-integrated Fri Jun 21 13:54:51 2013
@@ -1,1 +1,1 @@
-/trunk:1-392279
+/trunk:1-392462

Modified: team/dlee/ari-url-shuffle/apps/confbridge/conf_config_parser.c
URL: http://svnview.digium.com/svn/asterisk/team/dlee/ari-url-shuffle/apps/confbridge/conf_config_parser.c?view=diff&rev=392465&r1=392464&r2=392465
==============================================================================
--- team/dlee/ari-url-shuffle/apps/confbridge/conf_config_parser.c (original)
+++ team/dlee/ari-url-shuffle/apps/confbridge/conf_config_parser.c Fri Jun 21 13:54:51 2013
@@ -2161,8 +2161,10 @@
 		ao2_ref(menu, +1);
 		pvt->menu = menu;
 
-		ast_bridge_dtmf_hook(&user->features, pvt->menu_entry.dtmf, menu_hook_callback,
-			pvt, menu_hook_destroy, 0);
+		if (ast_bridge_dtmf_hook(&user->features, pvt->menu_entry.dtmf,
+			menu_hook_callback, pvt, menu_hook_destroy, 0)) {
+			menu_hook_destroy(pvt);
+		}
 	}
 
 	ao2_unlock(menu);

Modified: team/dlee/ari-url-shuffle/bridges/bridge_softmix.c
URL: http://svnview.digium.com/svn/asterisk/team/dlee/ari-url-shuffle/bridges/bridge_softmix.c?view=diff&rev=392465&r1=392464&r2=392465
==============================================================================
--- team/dlee/ari-url-shuffle/bridges/bridge_softmix.c (original)
+++ team/dlee/ari-url-shuffle/bridges/bridge_softmix.c Fri Jun 21 13:54:51 2013
@@ -378,11 +378,12 @@
  *
  * \param bridge_channel Which channel source is changing.
  *
- * \return Nothing
- */
-static void softmix_src_change(struct ast_bridge_channel *bridge_channel)
-{
-	ast_bridge_channel_queue_control_data(bridge_channel, AST_CONTROL_SRCCHANGE, NULL, 0);
+ * \retval 0 on success.
+ * \retval -1 on error.
+ */
+static int softmix_src_change(struct ast_bridge_channel *bridge_channel)
+{
+	return ast_bridge_channel_queue_control_data(bridge_channel, AST_CONTROL_SRCCHANGE, NULL, 0);
 }
 
 /*! \brief Function called when a channel is joined into the bridge */

Modified: team/dlee/ari-url-shuffle/channels/chan_unistim.c
URL: http://svnview.digium.com/svn/asterisk/team/dlee/ari-url-shuffle/channels/chan_unistim.c?view=diff&rev=392465&r1=392464&r2=392465
==============================================================================
--- team/dlee/ari-url-shuffle/channels/chan_unistim.c (original)
+++ team/dlee/ari-url-shuffle/channels/chan_unistim.c Fri Jun 21 13:54:51 2013
@@ -77,6 +77,7 @@
 #include "asterisk/astobj2.h"
 #include "asterisk/astdb.h"
 #include "asterisk/features_config.h"
+#include "asterisk/bridging.h"
 
 
 #define DEFAULTCONTEXT	  "default"
@@ -2305,72 +2306,36 @@
 	return 0;
 }
 
-static void unistim_quiet_chan(struct ast_channel *chan)
-{
-	if (chan && ast_channel_state(chan) == AST_STATE_UP) {
-		if (ast_test_flag(ast_channel_flags(chan), AST_FLAG_MOH)) {
-			ast_moh_stop(chan);
-		} else if (ast_channel_generatordata(chan)) {
-			ast_deactivate_generator(chan);
-		}
-	}
-}
-
 static int attempt_transfer(struct unistim_subchannel *p1, struct unistim_subchannel *p2)
 {
-	int res = 0;
-	struct ast_channel
-	 *chana = NULL, *chanb = NULL, *bridgea = NULL, *bridgeb = NULL, *peera =
-		NULL, *peerb = NULL, *peerc = NULL, *peerd = NULL;
+	RAII_VAR(struct ast_channel *, chana, NULL, ast_channel_unref);
+	RAII_VAR(struct ast_channel *, chanb, NULL, ast_channel_unref);
 
 	if (!p1->owner || !p2->owner) {
 		ast_log(LOG_WARNING, "Transfer attempted without dual ownership?\n");
 		return -1;
 	}
-	chana = p1->owner;
-	chanb = p2->owner;
-	bridgea = ast_bridged_channel(chana);
-	bridgeb = ast_bridged_channel(chanb);
-
-	if (bridgea) {
-		peera = chana;
-		peerb = chanb;
-		peerc = bridgea;
-		peerd = bridgeb;
-	} else if (bridgeb) {
-		peera = chanb;
-		peerb = chana;
-		peerc = bridgeb;
-		peerd = bridgea;
-	}
-
-	if (peera && peerb && peerc && (peerb != peerc)) {
-		unistim_quiet_chan(peera);
-		unistim_quiet_chan(peerb);
-		unistim_quiet_chan(peerc);
-		if (peerd) {
-			unistim_quiet_chan(peerd);
-		}
-
-		ast_log(LOG_NOTICE, "UNISTIM transfer: trying to masquerade %s into %s\n", ast_channel_name(peerc), ast_channel_name(peerb));
-		if (ast_channel_masquerade(peerb, peerc)) {
-			ast_log(LOG_WARNING, "Failed to masquerade %s into %s\n", ast_channel_name(peerb),
-					ast_channel_name(peerc));
-			res = -1;
-		}
-		return res;
-	} else {
-		ast_log(LOG_NOTICE,
-				"Transfer attempted with no appropriate bridged calls to transfer\n");
-		if (chana) {
-			ast_softhangup_nolock(chana, AST_SOFTHANGUP_DEV);
-		}
-		if (chanb) {
-			ast_softhangup_nolock(chanb, AST_SOFTHANGUP_DEV);
-		}
-		return -1;
-	}
-	return 0;
+	chana = ast_channel_ref(p1->owner);
+	chanb = ast_channel_ref(p2->owner);
+
+	switch (ast_bridge_transfer_attended(chana, chanb)) {
+	case AST_BRIDGE_TRANSFER_INVALID:
+		ast_log(LOG_WARNING, "Transfer failed. Invalid bridge setup\n");
+		break;
+	case AST_BRIDGE_TRANSFER_NOT_PERMITTED:
+		ast_log(LOG_WARNING, "Transfer not permitted\n");
+		break;
+	case AST_BRIDGE_TRANSFER_FAIL:
+		ast_log(LOG_WARNING, "Transfer encountered internal error\n");
+		break;
+	case AST_BRIDGE_TRANSFER_SUCCESS:
+		return 0;
+	}
+
+	/* Control only reaches this point if transfer has failed */
+	ast_softhangup_nolock(chana, AST_SOFTHANGUP_DEV);
+	ast_softhangup_nolock(chanb, AST_SOFTHANGUP_DEV);
+	return -1;
 }
 
 void change_callerid(struct unistimsession *pte, int type, char *callerid)

Modified: team/dlee/ari-url-shuffle/contrib/scripts/autosupport
URL: http://svnview.digium.com/svn/asterisk/team/dlee/ari-url-shuffle/contrib/scripts/autosupport?view=diff&rev=392465&r1=392464&r2=392465
==============================================================================
--- team/dlee/ari-url-shuffle/contrib/scripts/autosupport (original)
+++ team/dlee/ari-url-shuffle/contrib/scripts/autosupport Fri Jun 21 13:54:51 2013
@@ -1,6 +1,6 @@
 #!/bin/sh
 #
-# Autosupport Version 2.0.19
+# Autosupport Version 2.1.0
 # Collect support information
 #
 # Copyright (C) 2005-2013, Digium, Inc.
@@ -21,7 +21,7 @@
 # Ensure the PATH variable includes '/usr/sbin' and '/sbin'
 PATH=/usr/sbin:/sbin:${PATH}
 
-DATE_STAMP=$(date +%Y%m%d)
+DATE_STAMP=$(date +%F)
 OUTPUT_FILE=digiuminfo.txt
 TARBALL_OUTPUT_FILE="digium-info_${DATE_STAMP}.tar"
 VAR_LIB_LIST_FILE="list-of-varlibasterisk.txt"
@@ -30,10 +30,11 @@
 files="n";
 NONINTERACTIVE=0
 
+
 # If a prefix is specified on command-line, add it.
 if (set -u; : $1) 2> /dev/null
 then
-  if [ $1 == "-h" ] || [ $1 == "--help" ]; then
+  if [ $1 = "-h" ] || [ $1 = "--help" ]; then
     echo
     echo "Digium autosupport script"
     echo "Copyright (C) 2005-2013, Digium, Inc."
@@ -53,7 +54,7 @@
     echo "    XXXXXXXX_${TARBALL_OUTPUT_FILE}"
     echo
     exit
-  elif [ $1 == "-n" ] || [ $1 == "--non-interactive" ]; then
+  elif [ $1 = "-n" ] || [ $1 = "--non-interactive" ]; then
     FILE_PREFIX=
     NONINTERACTIVE=1
   else
@@ -187,7 +188,10 @@
       "core show uptime" "pri show spans" "misdn show stacks" "zap show channels" "dahdi show status" "dahdi show channels" \
       "dahdi show channel 1" "core show channels" "skype show version" "skype show licenses" "skype show users" \
       "skype show hostid" "show g729" "g729 show version" "g729 show licenses" "g729 show hostid" "fax show version" \
-      "fax show licenses" "fax show hostid" "fax show stats" "digium_phones show version"; do
+      "fax show licenses" "fax show hostid" "fax show stats" "digium_phones show version" "digium_phones show alerts" \
+			"digium_phones show applications" "digium_phones show firmwares" "digium_phones show lines" "digium_phones show networks" \
+			"digium_phones show phones" "digium_phones show sessions" "digium_phones show settings" "digium_phones show translations" ;
+	do
     echo "asterisk -rx \"$command\"" >> $OUTPUT;
     asterisk -rx "$command" >> $OUTPUT;
     echo >> $OUTPUT;
@@ -195,6 +199,67 @@
   done
   echo >> $OUTPUT;
 fi
+
+
+for type in alerts applications firmwares lines networks phones translations; 
+do 
+	echo "------------------" >> $OUTPUT; 
+	echo "DIGIUM PHONE: $type " >> $OUTPUT; 
+	echo "------------------" >> $OUTPUT; 
+	TEMP=$(asterisk -rx "digium_phones show $type"); 
+	if [ "$type" = "lines" ];
+	then
+		NUM=$(echo $TEMP | tail -n 1 | awk -F' ' '{print $(NF-4)}');
+		if [ $NUM -gt 0 ];
+		then
+			for l in $(echo $TEMP | sed 's/^--- [[:alpha:]]\+ --- //; 
+				s/Lines \(Un-\)\?Mapped to Phones --- //g; 
+				s/ Internal//g; 
+				s/---- [a-zA-Z0-9 ]\+ ----$//;
+				s/--- //g');
+			do
+				asterisk -rx "digium_phones show line $l" >> $OUTPUT;                                                                      
+				echo "--------" >> $OUTPUT;                                                                                                                         
+				echo >> $OUTPUT; 
+			done
+		else
+			echo "No configurations of type $type..." >> $OUTPUT;
+			echo >> $OUTPUT;
+		fi;
+	elif [ "$type" = "firmwares" ];
+	then
+		for f in $(echo $TEMP | sed 's/--- Configured Firmware Options --- //');
+		do
+			asterisk -rx "digium_phones show firmware $f" >> $OUTPUT;
+			echo "--------" >> $OUTPUT;                                                                                                                         
+			echo >> $OUTPUT; 
+		done
+	elif [ "$type" = "translations" ];
+	then
+		for t in $(echo $TEMP | sed 's/--- Translation tables ---//');
+		do
+			asterisk -rx "digium_phones show translation $t" 
+		done
+	else
+		NUM=$(echo $TEMP | tail -n 1 | awk -F' ' '{print $(NF-3)}'); 
+		if [ $NUM -gt 0 ]; 
+		then   
+			for t in $(echo $TEMP | sed 's/^--- [[:alpha:]]\+ --- //; 
+																	 s/---- [a-zA-Z0-9 ]\+ ----$//
+																	 s/---- Digium Phones ---- //'); 
+			do 
+				asterisk -rx "digium_phones show $(echo $type | sed 's/s\b//') $t" >> $OUTPUT; 
+				echo "--------" >> $OUTPUT; 
+				echo >> $OUTPUT; 
+			done; 
+		else 
+			echo "No configurations of type $type..." >> $OUTPUT;
+			echo >> $OUTPUT;
+		fi;
+	fi;
+done;
+echo >> $OUTPUT;
+
 
 echo "------------------" >> $OUTPUT;
 echo "OTHER INFO : cat /etc/*{issue,release,version}*" >> $OUTPUT;

Modified: team/dlee/ari-url-shuffle/include/asterisk/bridging.h
URL: http://svnview.digium.com/svn/asterisk/team/dlee/ari-url-shuffle/include/asterisk/bridging.h?view=diff&rev=392465&r1=392464&r2=392465
==============================================================================
--- team/dlee/ari-url-shuffle/include/asterisk/bridging.h (original)
+++ team/dlee/ari-url-shuffle/include/asterisk/bridging.h Fri Jun 21 13:54:51 2013
@@ -1088,9 +1088,10 @@
  * \param data Frame payload data to pass.
  * \param datalen Frame payload data length to pass.
  *
- * \return Nothing
- */
-typedef void (*ast_bridge_channel_post_action_data)(struct ast_bridge_channel *bridge_channel, enum ast_bridge_action_type action, const void *data, size_t datalen);
+ * \retval 0 on success.
+ * \retval -1 on error.
+ */
+typedef int (*ast_bridge_channel_post_action_data)(struct ast_bridge_channel *bridge_channel, enum ast_bridge_action_type action, const void *data, size_t datalen);
 
 /*!
  * \brief Queue an action frame onto the bridge channel with data.
@@ -1101,9 +1102,10 @@
  * \param data Frame payload data to pass.
  * \param datalen Frame payload data length to pass.
  *
- * \return Nothing
- */
-void ast_bridge_channel_queue_action_data(struct ast_bridge_channel *bridge_channel, enum ast_bridge_action_type action, const void *data, size_t datalen);
+ * \retval 0 on success.
+ * \retval -1 on error.
+ */
+int ast_bridge_channel_queue_action_data(struct ast_bridge_channel *bridge_channel, enum ast_bridge_action_type action, const void *data, size_t datalen);
 
 /*!
  * \brief Write an action frame into the bridge with data.
@@ -1114,9 +1116,10 @@
  * \param data Frame payload data to pass.
  * \param datalen Frame payload data length to pass.
  *
- * \return Nothing
- */
-void ast_bridge_channel_write_action_data(struct ast_bridge_channel *bridge_channel, enum ast_bridge_action_type action, const void *data, size_t datalen);
+ * \retval 0 on success.
+ * \retval -1 on error.
+ */
+int ast_bridge_channel_write_action_data(struct ast_bridge_channel *bridge_channel, enum ast_bridge_action_type action, const void *data, size_t datalen);
 
 /*!
  * \brief Queue a control frame onto the bridge channel with data.
@@ -1127,9 +1130,10 @@
  * \param data Frame payload data to pass.
  * \param datalen Frame payload data length to pass.
  *
- * \return Nothing
- */
-void ast_bridge_channel_queue_control_data(struct ast_bridge_channel *bridge_channel, enum ast_control_frame_type control, const void *data, size_t datalen);
+ * \retval 0 on success.
+ * \retval -1 on error.
+ */
+int ast_bridge_channel_queue_control_data(struct ast_bridge_channel *bridge_channel, enum ast_control_frame_type control, const void *data, size_t datalen);
 
 /*!
  * \brief Write a control frame into the bridge with data.
@@ -1140,9 +1144,10 @@
  * \param data Frame payload data to pass.
  * \param datalen Frame payload data length to pass.
  *
- * \return Nothing
- */
-void ast_bridge_channel_write_control_data(struct ast_bridge_channel *bridge_channel, enum ast_control_frame_type control, const void *data, size_t datalen);
+ * \retval 0 on success.
+ * \retval -1 on error.
+ */
+int ast_bridge_channel_write_control_data(struct ast_bridge_channel *bridge_channel, enum ast_control_frame_type control, const void *data, size_t datalen);
 
 /*!
  * \brief Write a hold frame into the bridge.
@@ -1151,9 +1156,10 @@
  * \param bridge_channel Which channel is putting the hold into the bridge.
  * \param moh_class The suggested music class for the other end to use.
  *
- * \return Nothing
- */
-void ast_bridge_channel_write_hold(struct ast_bridge_channel *bridge_channel, const char *moh_class);
+ * \retval 0 on success.
+ * \retval -1 on error.
+ */
+int ast_bridge_channel_write_hold(struct ast_bridge_channel *bridge_channel, const char *moh_class);
 
 /*!
  * \brief Write an unhold frame into the bridge.
@@ -1161,9 +1167,10 @@
  *
  * \param bridge_channel Which channel is putting the hold into the bridge.
  *
- * \return Nothing
- */
-void ast_bridge_channel_write_unhold(struct ast_bridge_channel *bridge_channel);
+ * \retval 0 on success.
+ * \retval -1 on error.
+ */
+int ast_bridge_channel_write_unhold(struct ast_bridge_channel *bridge_channel);
 
 /*!
  * \brief Run an application on the bridge channel.
@@ -1195,9 +1202,10 @@
  *
  * \note This is intended to be called by bridge hooks.
  *
- * \return Nothing
- */
-void ast_bridge_channel_write_app(struct ast_bridge_channel *bridge_channel, const char *app_name, const char *app_args, const char *moh_class);
+ * \retval 0 on success.
+ * \retval -1 on error.
+ */
+int ast_bridge_channel_write_app(struct ast_bridge_channel *bridge_channel, const char *app_name, const char *app_args, const char *moh_class);
 
 /*!
  * \brief Queue a bridge action run application frame onto the bridge channel.
@@ -1212,9 +1220,10 @@
  *
  * \note This is intended to be called by bridge hooks.
  *
- * \return Nothing
- */
-void ast_bridge_channel_queue_app(struct ast_bridge_channel *bridge_channel, const char *app_name, const char *app_args, const char *moh_class);
+ * \retval 0 on success.
+ * \retval -1 on error.
+ */
+int ast_bridge_channel_queue_app(struct ast_bridge_channel *bridge_channel, const char *app_name, const char *app_args, const char *moh_class);
 
 /*!
  * \brief Custom interpretation of the playfile name.
@@ -1256,9 +1265,10 @@
  *
  * \note This is intended to be called by bridge hooks.
  *
- * \return Nothing
- */
-void ast_bridge_channel_write_playfile(struct ast_bridge_channel *bridge_channel, ast_bridge_custom_play_fn custom_play, const char *playfile, const char *moh_class);
+ * \retval 0 on success.
+ * \retval -1 on error.
+ */
+int ast_bridge_channel_write_playfile(struct ast_bridge_channel *bridge_channel, ast_bridge_custom_play_fn custom_play, const char *playfile, const char *moh_class);
 
 /*!
  * \brief Queue a bridge action play file frame onto the bridge channel.
@@ -1273,9 +1283,10 @@
  *
  * \note This is intended to be called by bridge hooks.
  *
- * \return Nothing
- */
-void ast_bridge_channel_queue_playfile(struct ast_bridge_channel *bridge_channel, ast_bridge_custom_play_fn custom_play, const char *playfile, const char *moh_class);
+ * \retval 0 on success.
+ * \retval -1 on error.
+ */
+int ast_bridge_channel_queue_playfile(struct ast_bridge_channel *bridge_channel, ast_bridge_custom_play_fn custom_play, const char *playfile, const char *moh_class);
 
 /*!
  * \brief Custom callback run on a bridge channel.
@@ -1303,9 +1314,10 @@
  *
  * \note This is intended to be called by bridge hooks.
  *
- * \return Nothing
- */
-void ast_bridge_channel_write_callback(struct ast_bridge_channel *bridge_channel, ast_bridge_custom_callback_fn callback, const void *payload, size_t payload_size);
+ * \retval 0 on success.
+ * \retval -1 on error.
+ */
+int ast_bridge_channel_write_callback(struct ast_bridge_channel *bridge_channel, ast_bridge_custom_callback_fn callback, const void *payload, size_t payload_size);
 
 /*!
  * \brief Queue a bridge action custom callback frame onto the bridge channel.
@@ -1320,9 +1332,10 @@
  *
  * \note This is intended to be called by bridge hooks.
  *
- * \return Nothing
- */
-void ast_bridge_channel_queue_callback(struct ast_bridge_channel *bridge_channel, ast_bridge_custom_callback_fn callback, const void *payload, size_t payload_size);
+ * \retval 0 on success.
+ * \retval -1 on error.
+ */
+int ast_bridge_channel_queue_callback(struct ast_bridge_channel *bridge_channel, ast_bridge_custom_callback_fn callback, const void *payload, size_t payload_size);
 
 /*!
  * \brief Have a bridge channel park a channel in the bridge
@@ -1335,9 +1348,10 @@
  *
  * \note This is intended to be called by bridge hooks.
  *
- * \return Nothing
- */
-void ast_bridge_channel_write_park(struct ast_bridge_channel *bridge_channel, const char *parkee_uuid,
+ * \retval 0 on success.
+ * \retval -1 on error.
+ */
+int ast_bridge_channel_write_park(struct ast_bridge_channel *bridge_channel, const char *parkee_uuid,
 	const char *parker_uuid, const char *app_data);
 
 /*!

Modified: team/dlee/ari-url-shuffle/include/asterisk/bridging_features.h
URL: http://svnview.digium.com/svn/asterisk/team/dlee/ari-url-shuffle/include/asterisk/bridging_features.h?view=diff&rev=392465&r1=392464&r2=392465
==============================================================================
--- team/dlee/ari-url-shuffle/include/asterisk/bridging_features.h (original)
+++ team/dlee/ari-url-shuffle/include/asterisk/bridging_features.h Fri Jun 21 13:54:51 2013
@@ -390,7 +390,7 @@
  * \param remove_flags Dictates what situations the hook should be removed.
  *
  * \retval 0 on success
- * \retval -1 on failure
+ * \retval -1 on failure (The caller must cleanup any hook_pvt resources.)
  *
  * Example usage:
  *
@@ -420,7 +420,7 @@
  * \param remove_flags Dictates what situations the hook should be removed.
  *
  * \retval 0 on success
- * \retval -1 on failure
+ * \retval -1 on failure (The caller must cleanup any hook_pvt resources.)
  *
  * Example usage:
  *
@@ -450,7 +450,7 @@
  * \param remove_flags Dictates what situations the hook should be removed.
  *
  * \retval 0 on success
- * \retval -1 on failure
+ * \retval -1 on failure (The caller must cleanup any hook_pvt resources.)
  *
  * Example usage:
  *
@@ -481,7 +481,7 @@
  * \param remove_flags Dictates what situations the hook should be removed.
  *
  * \retval 0 on success
- * \retval -1 on failure
+ * \retval -1 on failure (The caller must cleanup any hook_pvt resources.)
  *
  * Example usage:
  *
@@ -503,7 +503,7 @@
 	enum ast_bridge_hook_remove_flags remove_flags);
 
 /*!
- * \brief attach an interval hook to a bridge features structure
+ * \brief Attach an interval hook to a bridge features structure
  *
  * \param features Bridge features structure
  * \param interval The interval that the hook should execute at in milliseconds
@@ -513,7 +513,7 @@
  * \param remove_flags Dictates what situations the hook should be removed.
  *
  * \retval 0 on success
- * \retval -1 on failure
+ * \retval -1 on failure (The caller must cleanup any hook_pvt resources.)
  *
  * \code
  * struct ast_bridge_features features;

Modified: team/dlee/ari-url-shuffle/include/asterisk/bridging_technology.h
URL: http://svnview.digium.com/svn/asterisk/team/dlee/ari-url-shuffle/include/asterisk/bridging_technology.h?view=diff&rev=392465&r1=392464&r2=392465
==============================================================================
--- team/dlee/ari-url-shuffle/include/asterisk/bridging_technology.h (original)
+++ team/dlee/ari-url-shuffle/include/asterisk/bridging_technology.h Fri Jun 21 13:54:51 2013
@@ -196,8 +196,11 @@
  * \param bridge_channel The bridge channel that has either started or stopped talking.
  * \param started_talking set to 1 when this indicates the channel has started talking set to 0
  * when this indicates the channel has stopped talking.
- */
-void ast_bridge_notify_talking(struct ast_bridge_channel *bridge_channel, int started_talking);
+ *
+ * \retval 0 on success.
+ * \retval -1 on error.
+ */
+int ast_bridge_notify_talking(struct ast_bridge_channel *bridge_channel, int started_talking);
 
 /*!
  * \brief Suspend a bridge technology from consideration

Modified: team/dlee/ari-url-shuffle/main/bridging.c
URL: http://svnview.digium.com/svn/asterisk/team/dlee/ari-url-shuffle/main/bridging.c?view=diff&rev=392465&r1=392464&r2=392465
==============================================================================
--- team/dlee/ari-url-shuffle/main/bridging.c (original)
+++ team/dlee/ari-url-shuffle/main/bridging.c Fri Jun 21 13:54:51 2013
@@ -397,7 +397,7 @@
 	return 0;
 }
 
-void ast_bridge_channel_queue_action_data(struct ast_bridge_channel *bridge_channel, enum ast_bridge_action_type action, const void *data, size_t datalen)
+int ast_bridge_channel_queue_action_data(struct ast_bridge_channel *bridge_channel, enum ast_bridge_action_type action, const void *data, size_t datalen)
 {
 	struct ast_frame frame = {
 		.frametype = AST_FRAME_BRIDGE_ACTION,
@@ -406,10 +406,10 @@
 		.data.ptr = (void *) data,
 	};
 
-	ast_bridge_channel_queue_frame(bridge_channel, &frame);
-}
-
-void ast_bridge_channel_queue_control_data(struct ast_bridge_channel *bridge_channel, enum ast_control_frame_type control, const void *data, size_t datalen)
+	return ast_bridge_channel_queue_frame(bridge_channel, &frame);
+}
+
+int ast_bridge_channel_queue_control_data(struct ast_bridge_channel *bridge_channel, enum ast_control_frame_type control, const void *data, size_t datalen)
 {
 	struct ast_frame frame = {
 		.frametype = AST_FRAME_CONTROL,
@@ -418,7 +418,7 @@
 		.data.ptr = (void *) data,
 	};
 
-	ast_bridge_channel_queue_frame(bridge_channel, &frame);
+	return ast_bridge_channel_queue_frame(bridge_channel, &frame);
 }
 
 void ast_bridge_channel_restore_formats(struct ast_bridge_channel *bridge_channel)
@@ -749,7 +749,7 @@
 	return ready;
 }
 
-void ast_bridge_notify_talking(struct ast_bridge_channel *bridge_channel, int started_talking)
+int ast_bridge_notify_talking(struct ast_bridge_channel *bridge_channel, int started_talking)
 {
 	struct ast_frame action = {
 		.frametype = AST_FRAME_BRIDGE_ACTION,
@@ -757,10 +757,10 @@
 			? AST_BRIDGE_ACTION_TALKING_START : AST_BRIDGE_ACTION_TALKING_STOP,
 	};
 
-	ast_bridge_channel_queue_frame(bridge_channel, &action);
-}
-
-static void bridge_channel_write_frame(struct ast_bridge_channel *bridge_channel, struct ast_frame *frame)
+	return ast_bridge_channel_queue_frame(bridge_channel, &action);
+}
+
+static int bridge_channel_write_frame(struct ast_bridge_channel *bridge_channel, struct ast_frame *frame)
 {
 	ast_bridge_channel_lock_bridge(bridge_channel);
 /*
@@ -771,9 +771,15 @@
  */
 	bridge_channel->bridge->technology->write(bridge_channel->bridge, bridge_channel, frame);
 	ast_bridge_unlock(bridge_channel->bridge);
-}
-
-void ast_bridge_channel_write_action_data(struct ast_bridge_channel *bridge_channel, enum ast_bridge_action_type action, const void *data, size_t datalen)
+
+	/*
+	 * Claim successful write to bridge.  If deferred frame
+	 * support is added, claim successfully deferred.
+	 */
+	return 0;
+}
+
+int ast_bridge_channel_write_action_data(struct ast_bridge_channel *bridge_channel, enum ast_bridge_action_type action, const void *data, size_t datalen)
 {
 	struct ast_frame frame = {
 		.frametype = AST_FRAME_BRIDGE_ACTION,
@@ -782,10 +788,10 @@
 		.data.ptr = (void *) data,
 	};
 
-	bridge_channel_write_frame(bridge_channel, &frame);
-}
-
-void ast_bridge_channel_write_control_data(struct ast_bridge_channel *bridge_channel, enum ast_control_frame_type control, const void *data, size_t datalen)
+	return bridge_channel_write_frame(bridge_channel, &frame);
+}
+
+int ast_bridge_channel_write_control_data(struct ast_bridge_channel *bridge_channel, enum ast_control_frame_type control, const void *data, size_t datalen)
 {
 	struct ast_frame frame = {
 		.frametype = AST_FRAME_CONTROL,
@@ -794,10 +800,10 @@
 		.data.ptr = (void *) data,
 	};
 
-	bridge_channel_write_frame(bridge_channel, &frame);
-}
-
-void ast_bridge_channel_write_hold(struct ast_bridge_channel *bridge_channel, const char *moh_class)
+	return bridge_channel_write_frame(bridge_channel, &frame);
+}
+
+int ast_bridge_channel_write_hold(struct ast_bridge_channel *bridge_channel, const char *moh_class)
 {
 	RAII_VAR(struct ast_json *, blob, NULL, ast_json_unref);
 	size_t datalen;
@@ -813,14 +819,14 @@
 	}
 
 	ast_channel_publish_blob(bridge_channel->chan, ast_channel_hold_type(), blob);
-	ast_bridge_channel_write_control_data(bridge_channel, AST_CONTROL_HOLD, moh_class,
-		datalen);
-}
-
-void ast_bridge_channel_write_unhold(struct ast_bridge_channel *bridge_channel)
+	return ast_bridge_channel_write_control_data(bridge_channel, AST_CONTROL_HOLD,
+		moh_class, datalen);
+}
+
+int ast_bridge_channel_write_unhold(struct ast_bridge_channel *bridge_channel)
 {
 	ast_channel_publish_blob(bridge_channel->chan, ast_channel_unhold_type(), NULL);
-	ast_bridge_channel_write_control_data(bridge_channel, AST_CONTROL_UNHOLD, NULL, 0);
+	return ast_bridge_channel_write_control_data(bridge_channel, AST_CONTROL_UNHOLD, NULL, 0);
 }
 
 static int run_app_helper(struct ast_channel *chan, const char *app_name, const char *app_args)
@@ -884,7 +890,7 @@
 		data->moh_offset ? &data->app_name[data->moh_offset] : NULL);
 }
 
-static void payload_helper_app(ast_bridge_channel_post_action_data post_it,
+static int payload_helper_app(ast_bridge_channel_post_action_data post_it,
 	struct ast_bridge_channel *bridge_channel, const char *app_name, const char *app_args, const char *moh_class)
 {
 	struct bridge_run_app *app_data;
@@ -905,18 +911,18 @@
 		strcpy(&app_data->app_name[app_data->moh_offset], moh_class);/* Safe */
 	}
 
-	post_it(bridge_channel, AST_BRIDGE_ACTION_RUN_APP, app_data, len_data);
-}
-
-void ast_bridge_channel_write_app(struct ast_bridge_channel *bridge_channel, const char *app_name, const char *app_args, const char *moh_class)
-{
-	payload_helper_app(ast_bridge_channel_write_action_data,
+	return post_it(bridge_channel, AST_BRIDGE_ACTION_RUN_APP, app_data, len_data);
+}
+
+int ast_bridge_channel_write_app(struct ast_bridge_channel *bridge_channel, const char *app_name, const char *app_args, const char *moh_class)
+{
+	return payload_helper_app(ast_bridge_channel_write_action_data,
 		bridge_channel, app_name, app_args, moh_class);
 }
 
-void ast_bridge_channel_queue_app(struct ast_bridge_channel *bridge_channel, const char *app_name, const char *app_args, const char *moh_class)
-{
-	payload_helper_app(ast_bridge_channel_queue_action_data,
+int ast_bridge_channel_queue_app(struct ast_bridge_channel *bridge_channel, const char *app_name, const char *app_args, const char *moh_class)
+{
+	return payload_helper_app(ast_bridge_channel_queue_action_data,
 		bridge_channel, app_name, app_args, moh_class);
 }
 
@@ -971,7 +977,7 @@
 		payload->moh_offset ? &payload->playfile[payload->moh_offset] : NULL);
 }
 
-static void payload_helper_playfile(ast_bridge_channel_post_action_data post_it,
+static int payload_helper_playfile(ast_bridge_channel_post_action_data post_it,
 	struct ast_bridge_channel *bridge_channel, ast_bridge_custom_play_fn custom_play, const char *playfile, const char *moh_class)
 {
 	struct bridge_playfile *payload;
@@ -988,18 +994,18 @@
 		strcpy(&payload->playfile[payload->moh_offset], moh_class);/* Safe */
 	}
 
-	post_it(bridge_channel, AST_BRIDGE_ACTION_PLAY_FILE, payload, len_payload);
-}
-
-void ast_bridge_channel_write_playfile(struct ast_bridge_channel *bridge_channel, ast_bridge_custom_play_fn custom_play, const char *playfile, const char *moh_class)
-{
-	payload_helper_playfile(ast_bridge_channel_write_action_data,
+	return post_it(bridge_channel, AST_BRIDGE_ACTION_PLAY_FILE, payload, len_payload);
+}
+
+int ast_bridge_channel_write_playfile(struct ast_bridge_channel *bridge_channel, ast_bridge_custom_play_fn custom_play, const char *playfile, const char *moh_class)
+{
+	return payload_helper_playfile(ast_bridge_channel_write_action_data,
 		bridge_channel, custom_play, playfile, moh_class);
 }
 
-void ast_bridge_channel_queue_playfile(struct ast_bridge_channel *bridge_channel, ast_bridge_custom_play_fn custom_play, const char *playfile, const char *moh_class)
-{
-	payload_helper_playfile(ast_bridge_channel_queue_action_data,
+int ast_bridge_channel_queue_playfile(struct ast_bridge_channel *bridge_channel, ast_bridge_custom_play_fn custom_play, const char *playfile, const char *moh_class)
+{
+	return payload_helper_playfile(ast_bridge_channel_queue_action_data,
 		bridge_channel, custom_play, playfile, moh_class);
 }
 
@@ -1029,7 +1035,7 @@
 	data->callback(bridge_channel, data->payload_exists ? data->payload : NULL, data->payload_size);
 }
 
-static void payload_helper_cb(ast_bridge_channel_post_action_data post_it,
+static int payload_helper_cb(ast_bridge_channel_post_action_data post_it,
 	struct ast_bridge_channel *bridge_channel, ast_bridge_custom_callback_fn callback, const void *payload, size_t payload_size)
 {
 	struct bridge_custom_callback *cb_data;
@@ -1038,7 +1044,7 @@
 	/* Sanity check. */
 	if (!callback) {
 		ast_assert(0);
-		return;
+		return -1;
 	}
 
 	/* Fill in custom callback frame data. */
@@ -1050,18 +1056,18 @@
 		memcpy(cb_data->payload, payload, payload_size);/* Safe */
 	}
 
-	post_it(bridge_channel, AST_BRIDGE_ACTION_CALLBACK, cb_data, len_data);
-}
-
-void ast_bridge_channel_write_callback(struct ast_bridge_channel *bridge_channel, ast_bridge_custom_callback_fn callback, const void *payload, size_t payload_size)
-{
-	payload_helper_cb(ast_bridge_channel_write_action_data,
+	return post_it(bridge_channel, AST_BRIDGE_ACTION_CALLBACK, cb_data, len_data);
+}
+
+int ast_bridge_channel_write_callback(struct ast_bridge_channel *bridge_channel, ast_bridge_custom_callback_fn callback, const void *payload, size_t payload_size)
+{
+	return payload_helper_cb(ast_bridge_channel_write_action_data,
 		bridge_channel, callback, payload, payload_size);
 }
 
-void ast_bridge_channel_queue_callback(struct ast_bridge_channel *bridge_channel, ast_bridge_custom_callback_fn callback, const void *payload, size_t payload_size)
-{
-	payload_helper_cb(ast_bridge_channel_queue_action_data,
+int ast_bridge_channel_queue_callback(struct ast_bridge_channel *bridge_channel, ast_bridge_custom_callback_fn callback, const void *payload, size_t payload_size)
+{
+	return payload_helper_cb(ast_bridge_channel_queue_action_data,
 		bridge_channel, callback, payload, payload_size);
 }
 
@@ -1079,7 +1085,7 @@
 		payload->app_data_offset ? &payload->parkee_uuid[payload->app_data_offset] : NULL);
 }
 
-static void payload_helper_park(ast_bridge_channel_post_action_data post_it,
+static int payload_helper_park(ast_bridge_channel_post_action_data post_it,
 	struct ast_bridge_channel *bridge_channel,
 	const char *parkee_uuid,
 	const char *parker_uuid,
@@ -1100,12 +1106,12 @@
 		strcpy(&payload->parkee_uuid[payload->app_data_offset], app_data);
 	}
 
-	post_it(bridge_channel, AST_BRIDGE_ACTION_PARK, payload, len_payload);
-}
-
-void ast_bridge_channel_write_park(struct ast_bridge_channel *bridge_channel, const char *parkee_uuid, const char *parker_uuid, const char *app_data)
-{
-	payload_helper_park(ast_bridge_channel_write_action_data,
+	return post_it(bridge_channel, AST_BRIDGE_ACTION_PARK, payload, len_payload);
+}
+
+int ast_bridge_channel_write_park(struct ast_bridge_channel *bridge_channel, const char *parkee_uuid, const char *parker_uuid, const char *app_data)
+{
+	return payload_helper_park(ast_bridge_channel_write_action_data,
 		bridge_channel, parkee_uuid, parker_uuid, app_data);
 }
 
@@ -2349,9 +2355,9 @@
 	ast_heap_unlock(bridge_channel->features->interval_hooks);
 }
 
-static void bridge_channel_write_dtmf_stream(struct ast_bridge_channel *bridge_channel, const char *dtmf)
-{
-	ast_bridge_channel_write_action_data(bridge_channel,
+static int bridge_channel_write_dtmf_stream(struct ast_bridge_channel *bridge_channel, const char *dtmf)
+{
+	return ast_bridge_channel_write_action_data(bridge_channel,
 		AST_BRIDGE_ACTION_DTMF_STREAM, dtmf, strlen(dtmf) + 1);
 }
 
@@ -4493,6 +4499,21 @@
 		return 0;
 	}
 
+/*
+ * BUGBUG Need to take into account frame hooks on the unreal/local channels optimization.
+ *
+ * Frame hooks on the unreal/local channels may inhibit optimization here if they cannot
+ * be moved to an appropriate peer channel.
+ *
+ * caller -- Bridge -- L;1 -- L;2 -- Bridge -- agent
+ * Any frame hooks on L;1 need to be moved to agent channel.
+ * Any frame hooks on L;2 need to be moved to caller channel.
+ *
+ * Moving the frame hooks may cause the hooks to miss a frame if
+ * the destination channel has already read a frame but cannot
+ * write it into the bridge yet because optimization has the
+ * bridge locked.
+ */
 	other = ast_bridge_channel_peer(src_bridge_channel);
 	if (other && other->state == AST_BRIDGE_CHANNEL_STATE_WAIT) {
 		ast_debug(1, "Move-swap optimizing %s <-- %s.\n",
@@ -4596,6 +4617,7 @@
 		return 0;
 	}
 
+/* BUGBUG Frame hooks on the unreal/local channels need to inhibit optimization here. */
 	ast_debug(1, "Merge optimizing %s -- %s out.\n",
 		ast_channel_name(chan_bridge_channel->chan),
 		ast_channel_name(peer_bridge_channel->chan));
@@ -4893,6 +4915,15 @@
 
 	/* Once done we put it in the container. */
 	res = ao2_link(features->dtmf_hooks, hook) ? 0 : -1;
+	if (res) {
+		/*
+		 * Could not link the hook into the container.
+		 *
+		 * Remove the hook_pvt destructor call from the hook since we
+		 * are returning failure to install the hook.
+		 */
+		hook->destructor = NULL;
+	}
 	ao2_ref(hook, -1);
 
 	return res;
@@ -4916,6 +4947,15 @@
 
 	/* Once done we put it in the container. */
 	res = ao2_link(features->hangup_hooks, hook) ? 0 : -1;
+	if (res) {
+		/*
+		 * Could not link the hook into the container.
+		 *
+		 * Remove the hook_pvt destructor call from the hook since we
+		 * are returning failure to install the hook.
+		 */
+		hook->destructor = NULL;
+	}
 	ao2_ref(hook, -1);
 
 	return res;
@@ -4939,6 +4979,15 @@
 
 	/* Once done we put it in the container. */
 	res = ao2_link(features->join_hooks, hook) ? 0 : -1;
+	if (res) {
+		/*
+		 * Could not link the hook into the container.
+		 *
+		 * Remove the hook_pvt destructor call from the hook since we
+		 * are returning failure to install the hook.
+		 */
+		hook->destructor = NULL;
+	}
 	ao2_ref(hook, -1);
 
 	return res;
@@ -4962,6 +5011,15 @@
 
 	/* Once done we put it in the container. */
 	res = ao2_link(features->leave_hooks, hook) ? 0 : -1;
+	if (res) {
+		/*
+		 * Could not link the hook into the container.
+		 *
+		 * Remove the hook_pvt destructor call from the hook since we
+		 * are returning failure to install the hook.
+		 */
+		hook->destructor = NULL;
+	}
 	ao2_ref(hook, -1);
 
 	return res;
@@ -5013,11 +5071,17 @@
 		hook, hook->parms.timer.interval, features);
 	ast_heap_wrlock(features->interval_hooks);
 	res = ast_heap_push(features->interval_hooks, hook);
+	ast_heap_unlock(features->interval_hooks);
 	if (res) {
-		/* Could not push the hook onto the heap. */
+		/*
+		 * Could not push the hook into the heap
+		 *
+		 * Remove the hook_pvt destructor call from the hook since we
+		 * are returning failure to install the hook.
+		 */
+		hook->destructor = NULL;
 		ao2_ref(hook, -1);
 	}
-	ast_heap_unlock(features->interval_hooks);
 
 	return res ? -1 : 0;
 }
@@ -5791,8 +5855,9 @@
  * \param exten The destination extension for the transferee
  * \param context The destination context for the transferee
  * \param hook Frame hook to attach to transferee
- * \retval 0 Successfully queued the action
- * \retval non-zero Failed to queue the action
+ *
+ * \retval 0 on success.
+ * \retval -1 on error.
  */
 static int bridge_channel_queue_blind_transfer(struct ast_channel *transferee,
 		const char *exten, const char *context,
@@ -5816,11 +5881,8 @@
 	ast_copy_string(blind_data.exten, exten, sizeof(blind_data.exten));
 	ast_copy_string(blind_data.context, context, sizeof(blind_data.context));
 
-/* BUGBUG Why doesn't this function return success/failure? */
-	ast_bridge_channel_queue_action_data(transferee_bridge_channel,
-			AST_BRIDGE_ACTION_BLIND_TRANSFER, &blind_data, sizeof(blind_data));
-
-	return 0;
+	return ast_bridge_channel_queue_action_data(transferee_bridge_channel,
+		AST_BRIDGE_ACTION_BLIND_TRANSFER, &blind_data, sizeof(blind_data));
 }
 
 static int bridge_channel_queue_attended_transfer(struct ast_channel *transferee,
@@ -5840,11 +5902,9 @@
 	ast_copy_string(unbridged_chan_name, ast_channel_name(unbridged_chan),
 		sizeof(unbridged_chan_name));
 
-	ast_bridge_channel_queue_action_data(transferee_bridge_channel,
+	return ast_bridge_channel_queue_action_data(transferee_bridge_channel,
 		AST_BRIDGE_ACTION_ATTENDED_TRANSFER, unbridged_chan_name,
 		sizeof(unbridged_chan_name));
-
-	return 0;
 }
 
 enum try_parking_result {

Modified: team/dlee/ari-url-shuffle/main/features.c
URL: http://svnview.digium.com/svn/asterisk/team/dlee/ari-url-shuffle/main/features.c?view=diff&rev=392465&r1=392464&r2=392465
==============================================================================
--- team/dlee/ari-url-shuffle/main/features.c (original)
+++ team/dlee/ari-url-shuffle/main/features.c Fri Jun 21 13:54:51 2013
@@ -3308,10 +3308,11 @@
 		run_data->moh_offset ? &run_data->app_name[run_data->moh_offset] : NULL);
 }
 
-static void dynamic_dtmf_hook_run_callback(struct ast_bridge_channel *bridge_channel,
+static int dynamic_dtmf_hook_run_callback(struct ast_bridge_channel *bridge_channel,
 	ast_bridge_custom_callback_fn callback, const void *payload, size_t payload_size)
 {

[... 295 lines stripped ...]



More information about the asterisk-commits mailing list