[svn-commits] dlee: branch dlee/better-nicknames r402526 - in /team/dlee/better-nicknames: ...

SVN commits to the Digium repositories svn-commits at lists.digium.com
Thu Nov 7 14:43:38 CST 2013


Author: dlee
Date: Thu Nov  7 14:43:19 2013
New Revision: 402526

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=402526
Log:
Merged revisions 401706-402517 from http://svn.asterisk.org/svn/asterisk/branches/12

Added:
    team/dlee/better-nicknames/contrib/scripts/sip_to_pjsip/
      - copied from r402517, branches/12/contrib/scripts/sip_to_pjsip/
Removed:
    team/dlee/better-nicknames/contrib/scripts/sip_to_res_sip/
Modified:
    team/dlee/better-nicknames/   (props changed)
    team/dlee/better-nicknames/UPGRADE-11.txt
    team/dlee/better-nicknames/UPGRADE.txt
    team/dlee/better-nicknames/addons/cdr_mysql.c
    team/dlee/better-nicknames/apps/app_confbridge.c
    team/dlee/better-nicknames/apps/app_queue.c
    team/dlee/better-nicknames/apps/app_voicemail.c
    team/dlee/better-nicknames/apps/confbridge/conf_config_parser.c
    team/dlee/better-nicknames/apps/confbridge/conf_state.c
    team/dlee/better-nicknames/apps/confbridge/conf_state_inactive.c
    team/dlee/better-nicknames/apps/confbridge/conf_state_multi.c
    team/dlee/better-nicknames/apps/confbridge/conf_state_multi_marked.c
    team/dlee/better-nicknames/apps/confbridge/conf_state_single.c
    team/dlee/better-nicknames/apps/confbridge/conf_state_single_marked.c
    team/dlee/better-nicknames/apps/confbridge/include/confbridge.h
    team/dlee/better-nicknames/bridges/bridge_native_rtp.c
    team/dlee/better-nicknames/cdr/cdr_adaptive_odbc.c
    team/dlee/better-nicknames/cdr/cdr_csv.c
    team/dlee/better-nicknames/cdr/cdr_custom.c
    team/dlee/better-nicknames/cdr/cdr_manager.c
    team/dlee/better-nicknames/cdr/cdr_odbc.c
    team/dlee/better-nicknames/cdr/cdr_pgsql.c
    team/dlee/better-nicknames/cdr/cdr_radius.c
    team/dlee/better-nicknames/cdr/cdr_sqlite.c
    team/dlee/better-nicknames/cdr/cdr_sqlite3_custom.c
    team/dlee/better-nicknames/cdr/cdr_syslog.c
    team/dlee/better-nicknames/cdr/cdr_tds.c
    team/dlee/better-nicknames/channels/chan_dahdi.c
    team/dlee/better-nicknames/channels/chan_iax2.c
    team/dlee/better-nicknames/channels/chan_pjsip.c
    team/dlee/better-nicknames/channels/chan_sip.c
    team/dlee/better-nicknames/codecs/ilbc/doCPLC.c
    team/dlee/better-nicknames/configs/confbridge.conf.sample
    team/dlee/better-nicknames/doc/   (props changed)
    team/dlee/better-nicknames/include/asterisk/acl.h
    team/dlee/better-nicknames/include/asterisk/app.h
    team/dlee/better-nicknames/include/asterisk/bridge.h
    team/dlee/better-nicknames/include/asterisk/cdr.h
    team/dlee/better-nicknames/include/asterisk/lock.h
    team/dlee/better-nicknames/include/asterisk/netsock2.h
    team/dlee/better-nicknames/include/asterisk/pbx.h
    team/dlee/better-nicknames/include/asterisk/res_pjsip_session.h
    team/dlee/better-nicknames/include/asterisk/rtp_engine.h
    team/dlee/better-nicknames/include/asterisk/stasis_app.h
    team/dlee/better-nicknames/include/asterisk/vector.h
    team/dlee/better-nicknames/main/app.c
    team/dlee/better-nicknames/main/asterisk.c
    team/dlee/better-nicknames/main/astobj2.c
    team/dlee/better-nicknames/main/bridge.c
    team/dlee/better-nicknames/main/cdr.c
    team/dlee/better-nicknames/main/channel.c
    team/dlee/better-nicknames/main/config.c
    team/dlee/better-nicknames/main/data.c
    team/dlee/better-nicknames/main/jitterbuf.c
    team/dlee/better-nicknames/main/loader.c
    team/dlee/better-nicknames/main/logger.c
    team/dlee/better-nicknames/main/manager_bridges.c
    team/dlee/better-nicknames/main/media_index.c
    team/dlee/better-nicknames/main/pbx.c
    team/dlee/better-nicknames/main/rtp_engine.c
    team/dlee/better-nicknames/main/stasis.c
    team/dlee/better-nicknames/main/stasis_channels.c
    team/dlee/better-nicknames/main/stasis_message_router.c
    team/dlee/better-nicknames/main/taskprocessor.c
    team/dlee/better-nicknames/main/translate.c
    team/dlee/better-nicknames/main/utils.c
    team/dlee/better-nicknames/main/xmldoc.c
    team/dlee/better-nicknames/res/ari/ari_model_validators.c
    team/dlee/better-nicknames/res/ari/ari_model_validators.h
    team/dlee/better-nicknames/res/ari/resource_bridges.c
    team/dlee/better-nicknames/res/ari/resource_channels.c
    team/dlee/better-nicknames/res/ari/resource_channels.h
    team/dlee/better-nicknames/res/res_ari_bridges.c
    team/dlee/better-nicknames/res/res_ari_channels.c
    team/dlee/better-nicknames/res/res_ari_playback.c
    team/dlee/better-nicknames/res/res_ari_recordings.c
    team/dlee/better-nicknames/res/res_pjsip/pjsip_distributor.c
    team/dlee/better-nicknames/res/res_pjsip_endpoint_identifier_user.c
    team/dlee/better-nicknames/res/res_pjsip_messaging.c
    team/dlee/better-nicknames/res/res_rtp_asterisk.c
    team/dlee/better-nicknames/res/res_stasis.c
    team/dlee/better-nicknames/res/res_stasis_playback.c
    team/dlee/better-nicknames/res/res_stasis_recording.c
    team/dlee/better-nicknames/res/stasis/app.c
    team/dlee/better-nicknames/res/stasis/control.c
    team/dlee/better-nicknames/rest-api-templates/api.wiki.mustache
    team/dlee/better-nicknames/rest-api/api-docs/bridges.json
    team/dlee/better-nicknames/rest-api/api-docs/channels.json
    team/dlee/better-nicknames/rest-api/api-docs/events.json
    team/dlee/better-nicknames/rest-api/api-docs/playback.json
    team/dlee/better-nicknames/rest-api/api-docs/recordings.json
    team/dlee/better-nicknames/sounds/Makefile
    team/dlee/better-nicknames/tests/test_linkedlists.c
    team/dlee/better-nicknames/utils/clicompat.c
    team/dlee/better-nicknames/utils/refcounter.c

Propchange: team/dlee/better-nicknames/
------------------------------------------------------------------------------
Binary property 'branch-11-merged' - no diff available.

Propchange: team/dlee/better-nicknames/
------------------------------------------------------------------------------
--- svnmerge-integrated (original)
+++ svnmerge-integrated Thu Nov  7 14:43:19 2013
@@ -1,1 +1,1 @@
-/branches/12:1-401701
+/branches/12:1-402525

Modified: team/dlee/better-nicknames/UPGRADE-11.txt
URL: http://svnview.digium.com/svn/asterisk/team/dlee/better-nicknames/UPGRADE-11.txt?view=diff&rev=402526&r1=402525&r2=402526
==============================================================================
--- team/dlee/better-nicknames/UPGRADE-11.txt (original)
+++ team/dlee/better-nicknames/UPGRADE-11.txt Thu Nov  7 14:43:19 2013
@@ -19,6 +19,23 @@
 === UPGRADE-10.txt -- Upgrade info for 1.8 to 10
 ===
 ===========================================================
+
+From 11.6 to 11.7:
+ConfBridge
+ - ConfBridge now has the ability to set the language of announcements to the
+   conference.  The language can be set on a bridge profile in confbridge.conf
+   or by the dialplan function CONFBRIDGE(bridge,language)=en.
+chan_sip - Clarify The "sip show peers" Forcerport Column And Add Comedia
+ - Under the "Forcerport" column, the "N" used to mean NAT (i.e. Yes).  With
+   the additon of auto_* NAT settings, the meaning changed and there was a
+   certain combination of letters added to indicate the current setting. The
+   combination of using "Y", "N", "A" or "a", can be confusing.  Therefore, we
+   now display clearly what the current Forcerport setting is: "Yes", "No",
+   "Auto (Yes)", "Auto (No)".
+ - Since we are clarifying the Forcerport column, we have added a column to
+   display the Comedia setting since this is useful information as well.  We
+   no longer have a simple "NAT" setting like other versions before 11.
+
 From 11.5 to 11.6:
 * res_agi will now properly indicate if there was an error in streaming an
   audio file.  The result code will be -1 and the result returned from the

Modified: team/dlee/better-nicknames/UPGRADE.txt
URL: http://svnview.digium.com/svn/asterisk/team/dlee/better-nicknames/UPGRADE.txt?view=diff&rev=402526&r1=402525&r2=402526
==============================================================================
--- team/dlee/better-nicknames/UPGRADE.txt (original)
+++ team/dlee/better-nicknames/UPGRADE.txt Thu Nov  7 14:43:19 2013
@@ -337,6 +337,9 @@
    associated with the current CDR for the channel, as opposed to a cumulative
    measurement of all CDRs for that channel.
 
+ - CDR backends can no longer be unloaded while billing data is in flight. This
+   helps to prevent loss of billing data during restarts and shutdowns.
+
 CEL:
  - The Uniqueid field for a channel is now a stable identifier, and will not
    change due to transfers, parking, etc.

Modified: team/dlee/better-nicknames/addons/cdr_mysql.c
URL: http://svnview.digium.com/svn/asterisk/team/dlee/better-nicknames/addons/cdr_mysql.c?view=diff&rev=402526&r1=402525&r2=402526
==============================================================================
--- team/dlee/better-nicknames/addons/cdr_mysql.c (original)
+++ team/dlee/better-nicknames/addons/cdr_mysql.c Thu Nov  7 14:43:19 2013
@@ -384,9 +384,11 @@
 	}
 
 	dbport = 0;
-	ast_cdr_unregister(name);
-	
-	return 0;
+	if (reload) {
+		return ast_cdr_backend_suspend(name);
+	} else {
+		return ast_cdr_unregister(name);
+	}
 }
 
 static int my_load_config_string(struct ast_config *cfg, const char *category, const char *variable, struct ast_str **field, const char *def)
@@ -660,7 +662,11 @@
 		return AST_MODULE_LOAD_FAILURE;
 	}
 
-	res = ast_cdr_register(name, desc, mysql_log);
+	if (!reload) {
+		res = ast_cdr_register(name, desc, mysql_log);
+	} else {
+		res = ast_cdr_backend_unsuspend(name);
+	}
 	if (res) {
 		ast_log(LOG_ERROR, "Unable to register MySQL CDR handling\n");
 	} else {

Modified: team/dlee/better-nicknames/apps/app_confbridge.c
URL: http://svnview.digium.com/svn/asterisk/team/dlee/better-nicknames/apps/app_confbridge.c?view=diff&rev=402526&r1=402525&r2=402526
==============================================================================
--- team/dlee/better-nicknames/apps/app_confbridge.c (original)
+++ team/dlee/better-nicknames/apps/app_confbridge.c Thu Nov  7 14:43:19 2013
@@ -963,6 +963,32 @@
 	return 0;
 }
 
+void conf_update_user_mute(struct confbridge_user *user)
+{
+	int mute_user;
+	int mute_system;
+	int mute_effective;
+
+	/* User level mute request. */
+	mute_user = user->muted;
+
+	/* System level mute request. */
+	mute_system = user->playing_moh
+		/*
+		 * Do not allow waitmarked users to talk to anyone unless there
+		 * is a marked user present.
+		 */
+		|| (!user->conference->markedusers
+			&& ast_test_flag(&user->u_profile, USER_OPT_WAITMARKED));
+
+	mute_effective = mute_user || mute_system;
+
+	ast_debug(1, "User %s is %s: user:%d system:%d.\n",
+		ast_channel_name(user->chan), mute_effective ? "muted" : "unmuted",
+		mute_user, mute_system);
+	user->features.mute = mute_effective;
+}
+
 void conf_moh_stop(struct confbridge_user *user)
 {
 	user->playing_moh = 0;
@@ -1108,9 +1134,7 @@
 	if (ast_test_flag(&first_user->u_profile, USER_OPT_MUSICONHOLD)) {
 		conf_moh_stop(first_user);
 	}
-	if (!ast_test_flag(&first_user->u_profile, USER_OPT_STARTMUTED)) {
-		first_user->features.mute = 0;
-	}
+	conf_update_user_mute(first_user);
 }
 
 void conf_ended(struct confbridge_conference *conference)
@@ -1630,7 +1654,8 @@
 
 	/* If the caller should be joined already muted, make it so */
 	if (ast_test_flag(&user.u_profile, USER_OPT_STARTMUTED)) {
-		user.features.mute = 1;
+		/* Set user level mute request. */
+		user.muted = 1;
 	}
 
 	if (ast_test_flag(&user.u_profile, USER_OPT_DROP_SILENCE)) {
@@ -1748,17 +1773,28 @@
 	struct confbridge_user *user,
 	struct ast_channel *chan)
 {
-	/* Mute or unmute yourself, note we only allow manipulation if they aren't waiting for a marked user or if marked users exist */
-	if (!ast_test_flag(&user->u_profile, USER_OPT_WAITMARKED) || conference->markedusers) {
-		user->features.mute = (!user->features.mute ? 1 : 0);
-		ast_test_suite_event_notify("CONF_MUTE", "Message: participant %s %s\r\nConference: %s\r\nChannel: %s", ast_channel_name(chan), user->features.mute ? "muted" : "unmuted", user->b_profile.name, ast_channel_name(chan));
-		if (user->features.mute) {
-			send_mute_event(chan, conference);
-		} else {
-			send_unmute_event(chan, conference);
-		}
-	}
-	return ast_stream_and_wait(chan, (user->features.mute ?
+	int mute;
+
+	/* Toggle user level mute request. */
+	mute = !user->muted;
+	user->muted = mute;
+
+	conf_update_user_mute(user);
+	ast_test_suite_event_notify("CONF_MUTE",
+		"Message: participant %s %s\r\n"
+		"Conference: %s\r\n"
+		"Channel: %s",
+		ast_channel_name(chan),
+		mute ? "muted" : "unmuted",
+		user->b_profile.name,
+		ast_channel_name(chan));
+	if (mute) {
+		send_mute_event(chan, conference);
+	} else {
+		send_unmute_event(chan, conference);
+	}
+
+	return ast_stream_and_wait(chan, (mute ?
 		conf_get_sound(CONF_SOUND_MUTED, user->b_profile.sounds) :
 		conf_get_sound(CONF_SOUND_UNMUTED, user->b_profile.sounds)),
 		"");
@@ -1768,21 +1804,26 @@
 {
 	struct confbridge_user *cur_user = NULL;
 	const char *sound_to_play;
+	int mute;
 
 	ao2_lock(conference);
 
-	/* If already muted, then unmute */
-	conference->muted = conference->muted ? 0 : 1;
-	sound_to_play = conf_get_sound((conference->muted ? CONF_SOUND_PARTICIPANTS_MUTED : CONF_SOUND_PARTICIPANTS_UNMUTED),
-		user->b_profile.sounds);
+	/* Toggle bridge level mute request. */
+	mute = !conference->muted;
+	conference->muted = mute;
 
 	AST_LIST_TRAVERSE(&conference->active_list, cur_user, list) {
 		if (!ast_test_flag(&cur_user->u_profile, USER_OPT_ADMIN)) {
-			cur_user->features.mute = conference->muted;
+			/* Set user level to bridge level mute request. */
+			cur_user->muted = mute;
+			conf_update_user_mute(cur_user);
 		}
 	}
 
 	ao2_unlock(conference);
+
+	sound_to_play = conf_get_sound((mute ? CONF_SOUND_PARTICIPANTS_MUTED : CONF_SOUND_PARTICIPANTS_UNMUTED),
+		user->b_profile.sounds);
 
 	/* The host needs to hear it seperately, as they don't get the audio from play_sound_helper */
 	ast_stream_and_wait(user->chan, sound_to_play, "");
@@ -2203,7 +2244,7 @@
 
 static void handle_cli_confbridge_list_item(struct ast_cli_args *a, struct confbridge_user *user, int waiting)
 {
-	char flag_str[5 + 1];/* Max flags + terminator */
+	char flag_str[6 + 1];/* Max flags + terminator */
 	int pos = 0;
 
 	/* Build flags column string. */
@@ -2219,18 +2260,22 @@
 	if (ast_test_flag(&user->u_profile, USER_OPT_ENDMARKED)) {
 		flag_str[pos++] = 'E';
 	}
+	if (user->muted) {
+		flag_str[pos++] = 'm';
+	}
 	if (waiting) {
 		flag_str[pos++] = 'w';
 	}
 	flag_str[pos] = '\0';
 
-	ast_cli(a->fd, "%-29s ", ast_channel_name(user->chan));
-	ast_cli(a->fd, "%-5s ", flag_str);
-	ast_cli(a->fd, "%-17s", user->u_profile.name);
-	ast_cli(a->fd, "%-17s", user->b_profile.name);
-	ast_cli(a->fd, "%-17s", user->menu_name);
-	ast_cli(a->fd, "%-17s", S_COR(ast_channel_caller(user->chan)->id.number.valid, ast_channel_caller(user->chan)->id.number.str, "<unknown>"));
-	ast_cli(a->fd, "\n");
+	ast_cli(a->fd, "%-30s %-6s %-16s %-16s %-16s %s\n",
+		ast_channel_name(user->chan),
+		flag_str,
+		user->u_profile.name,
+		user->b_profile.name,
+		user->menu_name,
+		S_COR(ast_channel_caller(user->chan)->id.number.valid,
+			ast_channel_caller(user->chan)->id.number.str, "<unknown>"));
 }
 
 static char *handle_cli_confbridge_list(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
@@ -2252,6 +2297,7 @@
 			"         M - The user is a marked user\n"
 			"         W - The user must wait for a marked user to join\n"
 			"         E - The user will be kicked after the last marked user leaves the conference\n"
+			"         m - The user is muted\n"
 			"         w - The user is waiting for a marked user to join\n";
 		return NULL;
 	case CLI_GENERATE:
@@ -2283,8 +2329,8 @@
 			ast_cli(a->fd, "No conference bridge named '%s' found!\n", a->argv[2]);
 			return CLI_SUCCESS;
 		}
-		ast_cli(a->fd, "Channel                       Flags User Profile     Bridge Profile   Menu             CallerID\n");
-		ast_cli(a->fd, "============================= ===== ================ ================ ================ ================\n");
+		ast_cli(a->fd, "Channel                        Flags  User Profile     Bridge Profile   Menu             CallerID\n");
+		ast_cli(a->fd, "============================== ====== ================ ================ ================ ================\n");
 		ao2_lock(conference);
 		AST_LIST_TRAVERSE(&conference->active_list, user, list) {
 			handle_cli_confbridge_list_item(a, user, 0);
@@ -2348,14 +2394,23 @@
 		}
 	}
 	if (user) {
-		user->features.mute = mute;
-		ast_channel_lock(user->chan);
-		if (user->features.mute) {
+		/* Set user level mute request. */
+		user->muted = mute ? 1 : 0;
+
+		conf_update_user_mute(user);
+		ast_test_suite_event_notify("CONF_MUTE",
+			"Message: participant %s %s\r\n"
+			"Conference: %s\r\n"
+			"Channel: %s",
+			ast_channel_name(user->chan),
+			mute ? "muted" : "unmuted",
+			conference->b_profile.name,
+			ast_channel_name(user->chan));
+		if (mute) {
 			send_mute_event(user->chan, conference);
 		} else {
 			send_unmute_event(user->chan, conference);
 		}
-		ast_channel_unlock(user->chan);
 	} else {
 		res = -2;;
 	}
@@ -2614,6 +2669,7 @@
 		"WaitMarked: %s\r\n"
 		"EndMarked: %s\r\n"
 		"Waiting: %s\r\n"
+		"Muted: %s\r\n"
 		"\r\n",
 		id_text,
 		conference->name,
@@ -2624,7 +2680,8 @@
 		ast_test_flag(&user->u_profile, USER_OPT_MARKEDUSER) ? "Yes" : "No",
 		ast_test_flag(&user->u_profile, USER_OPT_WAITMARKED) ? "Yes" : "No",
 		ast_test_flag(&user->u_profile, USER_OPT_ENDMARKED) ? "Yes" : "No",
-		waiting ? "Yes" : "No");
+		waiting ? "Yes" : "No",
+		user->muted ? "Yes" : "No");
 }
 
 static int action_confbridgelist(struct mansession *s, const struct message *m)
@@ -3057,11 +3114,11 @@
 {
 	struct confbridge_user *only_user = AST_LIST_FIRST(&conference->active_list);
 
-	/* Turn on MOH/mute if the single participant is set up for it */
+	/* Turn on MOH if the single participant is set up for it */
 	if (ast_test_flag(&only_user->u_profile, USER_OPT_MUSICONHOLD)) {
-		only_user->features.mute = 1;
 		conf_moh_start(only_user);
 	}
+	conf_update_user_mute(only_user);
 }
 
 void conf_remove_user_waiting(struct confbridge_conference *conference, struct confbridge_user *user)

Modified: team/dlee/better-nicknames/apps/app_queue.c
URL: http://svnview.digium.com/svn/asterisk/team/dlee/better-nicknames/apps/app_queue.c?view=diff&rev=402526&r1=402525&r2=402526
==============================================================================
--- team/dlee/better-nicknames/apps/app_queue.c (original)
+++ team/dlee/better-nicknames/apps/app_queue.c Thu Nov  7 14:43:19 2013
@@ -4467,6 +4467,8 @@
 						}
 						prev = o;
 					}
+				} else if (prev) {
+					prev->call_next = NULL;
 				}
 				numlines++;
 			}
@@ -4927,7 +4929,9 @@
 
 	if (!*to) {
 		for (o = start; o; o = o->call_next) {
-			rna(orig, qe, o->chan, o->interface, o->member->membername, 1);
+			if (o->chan) {
+				rna(orig, qe, o->chan, o->interface, o->member->membername, 1);
+			}
 		}
 
 		publish_dial_end_event(qe->chan, outgoing, NULL, "NOANSWER");

Modified: team/dlee/better-nicknames/apps/app_voicemail.c
URL: http://svnview.digium.com/svn/asterisk/team/dlee/better-nicknames/apps/app_voicemail.c?view=diff&rev=402526&r1=402525&r2=402526
==============================================================================
--- team/dlee/better-nicknames/apps/app_voicemail.c (original)
+++ team/dlee/better-nicknames/apps/app_voicemail.c Thu Nov  7 14:43:19 2013
@@ -11994,6 +11994,7 @@
 
 static int acf_vm_info(struct ast_channel *chan, const char *cmd, char *args, char *buf, size_t len)
 {
+	struct ast_vm_user svm;
 	struct ast_vm_user *vmu = NULL;
 	char *tmp, *mailbox, *context, *parse;
 	int res = 0;
@@ -12027,7 +12028,7 @@
 		 context = "default";
 	}
 
-	vmu = find_user(NULL, context, mailbox);
+	vmu = find_user(&svm, context, mailbox);
 
 	if (!strncasecmp(arg.attribute, "exists", 5)) {
 		ast_copy_string(buf, vmu ? "1" : "0", len);
@@ -13788,6 +13789,7 @@
 {
 	int i, j, res = AST_TEST_PASS, syserr;
 	struct ast_vm_user *vmu;
+	struct ast_vm_user svm;
 	struct vm_state vms;
 #ifdef IMAP_STORAGE
 	struct ast_channel *chan = NULL;
@@ -13840,7 +13842,7 @@
 	}
 #endif
 
-	if (!(vmu = find_user(NULL, testcontext, testmailbox)) &&
+	if (!(vmu = find_user(&svm, testcontext, testmailbox)) &&
 		!(vmu = find_or_create(testcontext, testmailbox))) {
 		ast_test_status_update(test, "Cannot create vmu structure\n");
 		ast_unreplace_sigchld();

Modified: team/dlee/better-nicknames/apps/confbridge/conf_config_parser.c
URL: http://svnview.digium.com/svn/asterisk/team/dlee/better-nicknames/apps/confbridge/conf_config_parser.c?view=diff&rev=402526&r1=402525&r2=402526
==============================================================================
--- team/dlee/better-nicknames/apps/confbridge/conf_config_parser.c (original)
+++ team/dlee/better-nicknames/apps/confbridge/conf_config_parser.c Thu Nov  7 14:43:19 2013
@@ -427,6 +427,13 @@
 					is passed in to ConfBridge as an argument in the dialplan.</para>
 					<para>Below is a list of menu actions that can be assigned to a DTMF sequence.</para>
 					<note><para>
+						To have the first DTMF digit in a sequence be the '#' character, you need to
+						escape it.  If it is not escaped then normal config file processing will
+						think it is a directive like #include.  For example: The mute setting is
+						toggled when <literal>#1</literal> is pressed.</para>
+						<para><literal>\#1=toggle_mute</literal></para>
+					</note>
+					<note><para>
 					A single DTMF sequence can have multiple actions associated with it. This is
 					accomplished by stringing the actions together and using a <literal>,</literal> as the
 					delimiter.  Example:  Both listening and talking volume is reset when <literal>5</literal> is
@@ -450,7 +457,7 @@
 						<enum name="toggle_mute"><para>
 							Toggle turning on and off mute.  Mute will make the user silent
 							to everyone else, but the user will still be able to listen in.
-							continue to collect the dtmf sequence.</para></enum>
+							</para></enum>
 						<enum name="no_op"><para>
 							This action does nothing (No Operation). Its only real purpose exists for
 							being able to reserve a sequence in the config as a menu exit sequence.</para></enum>

Modified: team/dlee/better-nicknames/apps/confbridge/conf_state.c
URL: http://svnview.digium.com/svn/asterisk/team/dlee/better-nicknames/apps/confbridge/conf_state.c?view=diff&rev=402526&r1=402525&r2=402526
==============================================================================
--- team/dlee/better-nicknames/apps/confbridge/conf_state.c (original)
+++ team/dlee/better-nicknames/apps/confbridge/conf_state.c Thu Nov  7 14:43:19 2013
@@ -57,12 +57,11 @@
  */
 static void conf_mute_moh_inactive_waitmarked(struct confbridge_user *user)
 {
-	/* Be sure we are muted so we can't talk to anybody else waiting */
-	user->features.mute = 1;
 	/* Start music on hold if needed */
 	if (ast_test_flag(&user->u_profile, USER_OPT_MUSICONHOLD)) {
 		conf_moh_start(user);
 	}
+	conf_update_user_mute(user);
 }
 
 void conf_default_join_waitmarked(struct confbridge_user *user)

Modified: team/dlee/better-nicknames/apps/confbridge/conf_state_inactive.c
URL: http://svnview.digium.com/svn/asterisk/team/dlee/better-nicknames/apps/confbridge/conf_state_inactive.c?view=diff&rev=402526&r1=402525&r2=402526
==============================================================================
--- team/dlee/better-nicknames/apps/confbridge/conf_state_inactive.c (original)
+++ team/dlee/better-nicknames/apps/confbridge/conf_state_inactive.c Thu Nov  7 14:43:19 2013
@@ -61,7 +61,7 @@
 static void join_marked(struct confbridge_user *user)
 {
 	conf_add_user_marked(user->conference, user);
-	conf_handle_second_active(user->conference);
+	conf_update_user_mute(user);
 
 	conf_change_state(user, CONF_STATE_MULTI_MARKED);
 }

Modified: team/dlee/better-nicknames/apps/confbridge/conf_state_multi.c
URL: http://svnview.digium.com/svn/asterisk/team/dlee/better-nicknames/apps/confbridge/conf_state_multi.c?view=diff&rev=402526&r1=402525&r2=402526
==============================================================================
--- team/dlee/better-nicknames/apps/confbridge/conf_state_multi.c (original)
+++ team/dlee/better-nicknames/apps/confbridge/conf_state_multi.c Thu Nov  7 14:43:19 2013
@@ -54,11 +54,13 @@
 static void join_unmarked(struct confbridge_user *user)
 {
 	conf_add_user_active(user->conference, user);
+	conf_update_user_mute(user);
 }
 
 static void join_marked(struct confbridge_user *user)
 {
 	conf_add_user_marked(user->conference, user);
+	conf_update_user_mute(user);
 
 	conf_change_state(user, CONF_STATE_MULTI_MARKED);
 }

Modified: team/dlee/better-nicknames/apps/confbridge/conf_state_multi_marked.c
URL: http://svnview.digium.com/svn/asterisk/team/dlee/better-nicknames/apps/confbridge/conf_state_multi_marked.c?view=diff&rev=402526&r1=402525&r2=402526
==============================================================================
--- team/dlee/better-nicknames/apps/confbridge/conf_state_multi_marked.c (original)
+++ team/dlee/better-nicknames/apps/confbridge/conf_state_multi_marked.c Thu Nov  7 14:43:19 2013
@@ -60,11 +60,13 @@
 static void join_active(struct confbridge_user *user)
 {
 	conf_add_user_active(user->conference, user);
+	conf_update_user_mute(user);
 }
 
 static void join_marked(struct confbridge_user *user)
 {
 	conf_add_user_marked(user->conference, user);
+	conf_update_user_mute(user);
 }
 
 static void leave_active(struct confbridge_user *user)
@@ -95,8 +97,8 @@
 		AST_LIST_TRAVERSE_SAFE_BEGIN(&user->conference->active_list, user_iter, list) {
 			/* Kick ENDMARKED user_iters */
 			if (ast_test_flag(&user_iter->u_profile, USER_OPT_ENDMARKED)) {
-				if (ast_test_flag(&user_iter->u_profile, USER_OPT_WAITMARKED) &&
-						  !ast_test_flag(&user_iter->u_profile, USER_OPT_MARKEDUSER)) {
+				if (ast_test_flag(&user_iter->u_profile, USER_OPT_WAITMARKED)
+					&& !ast_test_flag(&user_iter->u_profile, USER_OPT_MARKEDUSER)) {
 					AST_LIST_REMOVE_CURRENT(list);
 					user_iter->conference->activeusers--;
 					AST_LIST_INSERT_TAIL(&user_iter->conference->waiting_list, user_iter, list);
@@ -104,17 +106,18 @@
 				}
 				user_iter->kicked = 1;
 				ast_bridge_remove(user_iter->conference->bridge, user_iter->chan);
-			} else if (ast_test_flag(&user_iter->u_profile, USER_OPT_WAITMARKED) &&
-					!ast_test_flag(&user_iter->u_profile, USER_OPT_MARKEDUSER)) {
+			} else if (ast_test_flag(&user_iter->u_profile, USER_OPT_WAITMARKED)
+				&& !ast_test_flag(&user_iter->u_profile, USER_OPT_MARKEDUSER)) {
 				AST_LIST_REMOVE_CURRENT(list);
 				user_iter->conference->activeusers--;
 				AST_LIST_INSERT_TAIL(&user_iter->conference->waiting_list, user_iter, list);
 				user_iter->conference->waitingusers++;
-				/* Handle muting/moh of user_iter if necessary */
+
+				/* Handle moh of user_iter if necessary */
 				if (ast_test_flag(&user_iter->u_profile, USER_OPT_MUSICONHOLD)) {
-					user_iter->features.mute = 1;
 					conf_moh_start(user_iter);
 				}
+				conf_update_user_mute(user_iter);
 			}
 		}
 		AST_LIST_TRAVERSE_SAFE_END;
@@ -170,7 +173,7 @@
 		conf_handle_first_marked_common(user);
 	}
 
-	/* Move all waiting users to active, stopping MOH and umuting if necessary */
+	/* Move all waiting users to active, stopping MOH and unmuting if necessary */
 	AST_LIST_TRAVERSE_SAFE_BEGIN(&user->conference->waiting_list, user_iter, list) {
 		AST_LIST_REMOVE_CURRENT(list);
 		user->conference->waitingusers--;
@@ -179,10 +182,7 @@
 		if (user_iter->playing_moh) {
 			conf_moh_stop(user_iter);
 		}
-		/* only unmute them if they are not supposed to start muted */
-		if (!ast_test_flag(&user_iter->u_profile, USER_OPT_STARTMUTED)) {
-			user_iter->features.mute = 0;
-		}
+		conf_update_user_mute(user_iter);
 	}
 	AST_LIST_TRAVERSE_SAFE_END;
 }

Modified: team/dlee/better-nicknames/apps/confbridge/conf_state_single.c
URL: http://svnview.digium.com/svn/asterisk/team/dlee/better-nicknames/apps/confbridge/conf_state_single.c?view=diff&rev=402526&r1=402525&r2=402526
==============================================================================
--- team/dlee/better-nicknames/apps/confbridge/conf_state_single.c (original)
+++ team/dlee/better-nicknames/apps/confbridge/conf_state_single.c Thu Nov  7 14:43:19 2013
@@ -55,6 +55,7 @@
 {
 	conf_add_user_active(user->conference, user);
 	conf_handle_second_active(user->conference);
+	conf_update_user_mute(user);
 
 	conf_change_state(user, CONF_STATE_MULTI);
 }
@@ -63,6 +64,7 @@
 {
 	conf_add_user_marked(user->conference, user);
 	conf_handle_second_active(user->conference);
+	conf_update_user_mute(user);
 
 	conf_change_state(user, CONF_STATE_MULTI_MARKED);
 }

Modified: team/dlee/better-nicknames/apps/confbridge/conf_state_single_marked.c
URL: http://svnview.digium.com/svn/asterisk/team/dlee/better-nicknames/apps/confbridge/conf_state_single_marked.c?view=diff&rev=402526&r1=402525&r2=402526
==============================================================================
--- team/dlee/better-nicknames/apps/confbridge/conf_state_single_marked.c (original)
+++ team/dlee/better-nicknames/apps/confbridge/conf_state_single_marked.c Thu Nov  7 14:43:19 2013
@@ -54,6 +54,7 @@
 {
 	conf_add_user_active(user->conference, user);
 	conf_handle_second_active(user->conference);
+	conf_update_user_mute(user);
 
 	conf_change_state(user, CONF_STATE_MULTI_MARKED);
 }
@@ -62,6 +63,7 @@
 {
 	conf_add_user_marked(user->conference, user);
 	conf_handle_second_active(user->conference);
+	conf_update_user_mute(user);
 
 	conf_change_state(user, CONF_STATE_MULTI_MARKED);
 }

Modified: team/dlee/better-nicknames/apps/confbridge/include/confbridge.h
URL: http://svnview.digium.com/svn/asterisk/team/dlee/better-nicknames/apps/confbridge/include/confbridge.h?view=diff&rev=402526&r1=402525&r2=402526
==============================================================================
--- team/dlee/better-nicknames/apps/confbridge/include/confbridge.h (original)
+++ team/dlee/better-nicknames/apps/confbridge/include/confbridge.h Thu Nov  7 14:43:19 2013
@@ -241,6 +241,7 @@
 	struct ast_bridge_features features;         /*!< Bridge features structure */
 	struct ast_bridge_tech_optimizations tech_args; /*!< Bridge technology optimizations for talk detection */
 	unsigned int suspended_moh;                  /*!< Count of active suspended MOH actions. */
+	unsigned int muted:1;                        /*!< Has the user requested to be muted? */
 	unsigned int kicked:1;                       /*!< User has been kicked from the conference */
 	unsigned int playing_moh:1;                  /*!< MOH is currently being played to the user */
 	AST_LIST_HEAD_NOLOCK(, post_join_action) post_join_list; /*!< List of sounds to play after joining */;
@@ -367,6 +368,15 @@
 void conf_ended(struct confbridge_conference *conference);
 
 /*!
+ * \brief Update the actual mute status of the user and set it on the bridge.
+ *
+ * \param user User to update the mute status.
+ *
+ * \return Nothing
+ */
+void conf_update_user_mute(struct confbridge_user *user);
+
+/*!
  * \brief Stop MOH for the conference user.
  *
  * \param user Conference user to stop MOH on.

Modified: team/dlee/better-nicknames/bridges/bridge_native_rtp.c
URL: http://svnview.digium.com/svn/asterisk/team/dlee/better-nicknames/bridges/bridge_native_rtp.c?view=diff&rev=402526&r1=402525&r2=402526
==============================================================================
--- team/dlee/better-nicknames/bridges/bridge_native_rtp.c (original)
+++ team/dlee/better-nicknames/bridges/bridge_native_rtp.c Thu Nov  7 14:43:19 2013
@@ -183,89 +183,10 @@
 	return 0;
 }
 
-/*!
- * \internal
- * \brief Given a bridge channel, get its RTP instance
- *
- * The returned ast_rtp_instance has its refcount bumped.
- *
- * \param bridge_channel Take a guess
- * \retval NULL No RTP instance on this bridge channel
- * \retval non-NULL The RTP instance on this bridge channel
- */
-static struct ast_rtp_instance *bridge_channel_get_rtp_instance(struct ast_bridge_channel *bridge_channel)
-{
-	struct ast_rtp_glue *glue;
-	struct ast_rtp_instance *instance;
-
-	glue = ast_rtp_instance_get_glue(ast_channel_tech(bridge_channel->chan)->type);
-	if (!glue) {
-		return NULL;
-	}
-
-	glue->get_rtp_info(bridge_channel->chan, &instance);
-	return instance;
-}
-
-/*!
- * \internal
- * \brief Determine which two channels are bridged together
- *
- * Because of the nature of swapping, when the time comes for a channel to
- * leave a native RTP bridge, it may be that there are more than two channels
- * in the list of bridge channels. Therefore, it is important to correctly
- * determine which two channels were bridged together.
- *
- * \param bridge The involved bridge
- * \param leaving The bridge channel that is leaving the native RTP bridge
- * \param[out] c0 The first bridged channel
- * \param[out] c1 The second bridged channel
- */
-static void find_bridged_channels(struct ast_bridge *bridge, struct ast_bridge_channel *leaving,
-		struct ast_bridge_channel **c0, struct ast_bridge_channel **c1)
-{
-	RAII_VAR(struct ast_rtp_instance *, leaving_instance, bridge_channel_get_rtp_instance(leaving), ao2_cleanup);
-	struct ast_bridge_channel *iter;
-
-	if (!leaving_instance) {
-		return;
-	}
-
-	AST_LIST_TRAVERSE(&bridge->channels, iter, entry) {
-		RAII_VAR(struct ast_rtp_instance *, instance, NULL, ao2_cleanup);
-
-		if (iter == leaving) {
-			continue;
-		}
-
-		instance = bridge_channel_get_rtp_instance(iter);
-		if (!instance) {
-			continue;
-		}
-
-		if (instance == ast_rtp_instance_get_bridged(leaving_instance)) {
-			break;
-		}
-	}
-	*c0 = leaving;
-	*c1 = iter;
-	return;
-}
-
-/*!
- * \internal
- * \brief Stop native RTP bridging of two channels
- *
- * \param bridge The bridge that had native RTP bridging happening on it
- * \param target If remote RTP bridging, the channel that is placed on hold.
- * \param leaving If this is called because a channel is leaving, this is the
- * bridge channel that is leaving the bridge
- */
-static void native_rtp_bridge_stop(struct ast_bridge *bridge, struct ast_channel *target,
-		struct ast_bridge_channel *leaving)
-{
-	struct ast_bridge_channel *c0 = NULL;
-	struct ast_bridge_channel *c1 = NULL;
+static void native_rtp_bridge_stop(struct ast_bridge *bridge, struct ast_channel *target)
+{
+	struct ast_bridge_channel *c0 = AST_LIST_FIRST(&bridge->channels);
+	struct ast_bridge_channel *c1 = AST_LIST_LAST(&bridge->channels);
 	enum ast_rtp_glue_result native_type;
 	struct ast_rtp_glue *glue0, *glue1 = NULL;
 	RAII_VAR(struct ast_rtp_instance *, instance0, NULL, ao2_cleanup);
@@ -273,17 +194,7 @@
 	RAII_VAR(struct ast_rtp_instance *, vinstance0, NULL, ao2_cleanup);
 	RAII_VAR(struct ast_rtp_instance *, vinstance1, NULL, ao2_cleanup);
 
-	if (bridge->num_channels == 2) {
-		c0 = AST_LIST_FIRST(&bridge->channels);
-		c1 = AST_LIST_LAST(&bridge->channels);
-	} else if (bridge->num_channels > 2) {
-		/* When a channel leaves a native RTP bridge, it is possible for
-		 * more channels to exist in the bridge than when the RTP bridge
-		 * was started. Thus we need to determine which two channels were
-		 * bridged based on the leaving channel
-		 */
-		find_bridged_channels(bridge, leaving, &c0, &c1);
-	} else {
+	if (c0 == c1) {
 		return;
 	}
 
@@ -347,7 +258,7 @@
 
 	if (bridge) {
 		if (f->subclass.integer == AST_CONTROL_HOLD) {
-			native_rtp_bridge_stop(bridge, chan, NULL);
+			native_rtp_bridge_stop(bridge, chan);
 		} else if ((f->subclass.integer == AST_CONTROL_UNHOLD) || (f->subclass.integer == AST_CONTROL_UPDATE_RTP_PEER)) {
 			native_rtp_bridge_start(bridge, chan);
 		}
@@ -511,9 +422,33 @@
 
 static void native_rtp_bridge_leave(struct ast_bridge *bridge, struct ast_bridge_channel *bridge_channel)
 {
+	struct ast_rtp_glue *glue;
+	RAII_VAR(struct ast_rtp_instance *, instance, NULL, ao2_cleanup);
+	RAII_VAR(struct ast_rtp_instance *, vinstance, NULL, ao2_cleanup);
+	RAII_VAR(struct ast_rtp_instance *, tinstance, NULL, ao2_cleanup);
+
 	native_rtp_bridge_framehook_detach(bridge_channel);
 
-	native_rtp_bridge_stop(bridge, NULL, bridge_channel);
+	glue = ast_rtp_instance_get_glue(ast_channel_tech(bridge_channel->chan)->type);
+	glue->get_rtp_info(bridge_channel->chan, &instance);
+	glue->get_vrtp_info ? glue->get_vrtp_info(bridge_channel->chan, &vinstance) : AST_RTP_GLUE_RESULT_FORBID;
+	glue->get_trtp_info ? glue->get_trtp_info(bridge_channel->chan, &tinstance) : AST_RTP_GLUE_RESULT_FORBID;
+
+	/* Tear down P2P bridges */
+	if (instance) {
+		ast_rtp_instance_set_bridged(instance, NULL);
+	}
+	if (vinstance) {
+		ast_rtp_instance_set_bridged(vinstance, NULL);
+	}
+	if (tinstance) {
+		ast_rtp_instance_set_bridged(tinstance, NULL);
+	}
+
+	/* Direct RTP may have occurred, tear it down */
+	glue->update_peer(bridge_channel->chan, NULL, NULL, NULL, NULL, 0);
+
+	native_rtp_bridge_stop(bridge, NULL);
 }
 
 static int native_rtp_bridge_write(struct ast_bridge *bridge, struct ast_bridge_channel *bridge_channel, struct ast_frame *frame)

Modified: team/dlee/better-nicknames/cdr/cdr_adaptive_odbc.c
URL: http://svnview.digium.com/svn/asterisk/team/dlee/better-nicknames/cdr/cdr_adaptive_odbc.c?view=diff&rev=402526&r1=402525&r2=402526
==============================================================================
--- team/dlee/better-nicknames/cdr/cdr_adaptive_odbc.c (original)
+++ team/dlee/better-nicknames/cdr/cdr_adaptive_odbc.c Thu Nov  7 14:43:19 2013
@@ -767,7 +767,10 @@
 
 static int unload_module(void)
 {
-	ast_cdr_unregister(name);
+	if (ast_cdr_unregister(name)) {
+		return -1;
+	}
+
 	if (AST_RWLIST_WRLOCK(&odbc_tables)) {
 		ast_cdr_register(name, ast_module_info->description, odbc_log);
 		ast_log(LOG_ERROR, "Unable to lock column list.  Unload failed.\n");

Modified: team/dlee/better-nicknames/cdr/cdr_csv.c
URL: http://svnview.digium.com/svn/asterisk/team/dlee/better-nicknames/cdr/cdr_csv.c?view=diff&rev=402526&r1=402525&r2=402526
==============================================================================
--- team/dlee/better-nicknames/cdr/cdr_csv.c (original)
+++ team/dlee/better-nicknames/cdr/cdr_csv.c Thu Nov  7 14:43:19 2013
@@ -315,7 +315,10 @@
 
 static int unload_module(void)
 {
-	ast_cdr_unregister(name);
+	if (ast_cdr_unregister(name)) {
+		return -1;
+	}
+
 	loaded = 0;
 	return 0;
 }

Modified: team/dlee/better-nicknames/cdr/cdr_custom.c
URL: http://svnview.digium.com/svn/asterisk/team/dlee/better-nicknames/cdr/cdr_custom.c?view=diff&rev=402526&r1=402525&r2=402526
==============================================================================
--- team/dlee/better-nicknames/cdr/cdr_custom.c (original)
+++ team/dlee/better-nicknames/cdr/cdr_custom.c Thu Nov  7 14:43:19 2013
@@ -184,7 +184,9 @@
 
 static int unload_module(void)
 {
-	ast_cdr_unregister(name);
+	if (ast_cdr_unregister(name)) {
+		return -1;
+	}
 
 	if (AST_RWLIST_WRLOCK(&sinks)) {
 		ast_cdr_register(name, ast_module_info->description, custom_log);

Modified: team/dlee/better-nicknames/cdr/cdr_manager.c
URL: http://svnview.digium.com/svn/asterisk/team/dlee/better-nicknames/cdr/cdr_manager.c?view=diff&rev=402526&r1=402525&r2=402526
==============================================================================
--- team/dlee/better-nicknames/cdr/cdr_manager.c (original)
+++ team/dlee/better-nicknames/cdr/cdr_manager.c Thu Nov  7 14:43:19 2013
@@ -86,8 +86,9 @@
 	if (!cfg) {
 		/* Standard configuration */
 		ast_log(LOG_WARNING, "Failed to load configuration file. Module not activated.\n");
-		if (enablecdr)
-			ast_cdr_unregister(name);
+		if (enablecdr) {
+			ast_cdr_backend_suspend(name);
+		}
 		enablecdr = 0;
 		return -1;
 	}
@@ -135,10 +136,11 @@
 
 	ast_config_destroy(cfg);
 
-	if (enablecdr && !newenablecdr)
-		ast_cdr_unregister(name);
-	else if (!enablecdr && newenablecdr)

[... 6129 lines stripped ...]



More information about the svn-commits mailing list