[svn-commits] moy: branch moy/mfcr2-1.4 r285086 - in /team/moy/mfcr2-1.4: ./ apps/ autoconf...

SVN commits to the Digium repositories svn-commits at lists.digium.com
Sun Sep 5 16:49:40 CDT 2010


Author: moy
Date: Sun Sep  5 16:49:23 2010
New Revision: 285086

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=285086
Log:
merged tag 1.4.35

Added:
    team/moy/mfcr2-1.4/.lastclean
      - copied unchanged from r285085, tags/1.4.35/.lastclean
    team/moy/mfcr2-1.4/.version
      - copied unchanged from r285085, tags/1.4.35/.version
    team/moy/mfcr2-1.4/ChangeLog
      - copied unchanged from r285085, tags/1.4.35/ChangeLog
    team/moy/mfcr2-1.4/asterisk-1.4.35-rc1-summary.html
      - copied unchanged from r285085, tags/1.4.35/asterisk-1.4.35-rc1-summary.html
    team/moy/mfcr2-1.4/asterisk-1.4.35-rc1-summary.txt
      - copied unchanged from r285085, tags/1.4.35/asterisk-1.4.35-rc1-summary.txt
    team/moy/mfcr2-1.4/asterisk-1.4.35-summary.html
      - copied unchanged from r285085, tags/1.4.35/asterisk-1.4.35-summary.html
    team/moy/mfcr2-1.4/asterisk-1.4.35-summary.txt
      - copied unchanged from r285085, tags/1.4.35/asterisk-1.4.35-summary.txt
    team/moy/mfcr2-1.4/contrib/realtime/
      - copied from r285085, tags/1.4.35/contrib/realtime/
    team/moy/mfcr2-1.4/contrib/realtime/mysql/
      - copied from r285085, tags/1.4.35/contrib/realtime/mysql/
    team/moy/mfcr2-1.4/contrib/realtime/mysql/iaxfriends.sql   (props changed)
      - copied unchanged from r285085, tags/1.4.35/contrib/realtime/mysql/iaxfriends.sql
    team/moy/mfcr2-1.4/contrib/realtime/mysql/meetme.sql   (props changed)
      - copied unchanged from r285085, tags/1.4.35/contrib/realtime/mysql/meetme.sql
    team/moy/mfcr2-1.4/contrib/realtime/mysql/sipfriends.sql   (props changed)
      - copied unchanged from r285085, tags/1.4.35/contrib/realtime/mysql/sipfriends.sql
    team/moy/mfcr2-1.4/contrib/realtime/mysql/voicemail.sql   (props changed)
      - copied unchanged from r285085, tags/1.4.35/contrib/realtime/mysql/voicemail.sql
    team/moy/mfcr2-1.4/contrib/realtime/oracle/
      - copied from r285085, tags/1.4.35/contrib/realtime/oracle/
    team/moy/mfcr2-1.4/contrib/realtime/postgresql/
      - copied from r285085, tags/1.4.35/contrib/realtime/postgresql/
    team/moy/mfcr2-1.4/contrib/realtime/postgresql/realtime.sql   (props changed)
      - copied unchanged from r285085, tags/1.4.35/contrib/realtime/postgresql/realtime.sql
    team/moy/mfcr2-1.4/contrib/realtime/sqlserver/
      - copied from r285085, tags/1.4.35/contrib/realtime/sqlserver/
    team/moy/mfcr2-1.4/contrib/scripts/live_ast
      - copied unchanged from r285085, tags/1.4.35/contrib/scripts/live_ast
    team/moy/mfcr2-1.4/doc/plc.txt
      - copied unchanged from r285085, tags/1.4.35/doc/plc.txt
    team/moy/mfcr2-1.4/include/asterisk/test.h
      - copied unchanged from r285085, tags/1.4.35/include/asterisk/test.h
    team/moy/mfcr2-1.4/main/test.c
      - copied unchanged from r285085, tags/1.4.35/main/test.c
    team/moy/mfcr2-1.4/tests/
      - copied from r285085, tags/1.4.35/tests/
    team/moy/mfcr2-1.4/tests/Makefile
      - copied unchanged from r285085, tags/1.4.35/tests/Makefile
    team/moy/mfcr2-1.4/tests/test_astobj2.c
      - copied unchanged from r285085, tags/1.4.35/tests/test_astobj2.c
    team/moy/mfcr2-1.4/tests/test_skel.c
      - copied unchanged from r285085, tags/1.4.35/tests/test_skel.c
Removed:
    team/moy/mfcr2-1.4/contrib/scripts/iax-friends.sql
    team/moy/mfcr2-1.4/contrib/scripts/meetme.sql
    team/moy/mfcr2-1.4/contrib/scripts/realtime_pgsql.sql
    team/moy/mfcr2-1.4/contrib/scripts/sip-friends.sql
    team/moy/mfcr2-1.4/contrib/scripts/vmdb.sql
Modified:
    team/moy/mfcr2-1.4/   (props changed)
    team/moy/mfcr2-1.4/Makefile
    team/moy/mfcr2-1.4/apps/app_amd.c
    team/moy/mfcr2-1.4/apps/app_dial.c
    team/moy/mfcr2-1.4/apps/app_directory.c
    team/moy/mfcr2-1.4/apps/app_meetme.c
    team/moy/mfcr2-1.4/apps/app_queue.c
    team/moy/mfcr2-1.4/apps/app_speech_utils.c
    team/moy/mfcr2-1.4/apps/app_voicemail.c
    team/moy/mfcr2-1.4/autoconf/ast_func_fork.m4
    team/moy/mfcr2-1.4/autoconf/libcurl.m4
    team/moy/mfcr2-1.4/build_tools/cflags-devmode.xml
    team/moy/mfcr2-1.4/cdr/cdr_tds.c
    team/moy/mfcr2-1.4/channels/chan_agent.c
    team/moy/mfcr2-1.4/channels/chan_dahdi.c
    team/moy/mfcr2-1.4/channels/chan_h323.c
    team/moy/mfcr2-1.4/channels/chan_iax2.c
    team/moy/mfcr2-1.4/channels/chan_local.c
    team/moy/mfcr2-1.4/channels/chan_misdn.c
    team/moy/mfcr2-1.4/channels/chan_oss.c
    team/moy/mfcr2-1.4/channels/chan_sip.c
    team/moy/mfcr2-1.4/channels/h323/Makefile.in
    team/moy/mfcr2-1.4/codecs/codec_adpcm.c
    team/moy/mfcr2-1.4/codecs/codec_alaw.c
    team/moy/mfcr2-1.4/codecs/codec_dahdi.c
    team/moy/mfcr2-1.4/codecs/codec_g726.c
    team/moy/mfcr2-1.4/codecs/codec_gsm.c
    team/moy/mfcr2-1.4/codecs/codec_lpc10.c
    team/moy/mfcr2-1.4/codecs/codec_ulaw.c
    team/moy/mfcr2-1.4/configs/extensions.conf.sample
    team/moy/mfcr2-1.4/configs/indications.conf.sample
    team/moy/mfcr2-1.4/configs/say.conf.sample
    team/moy/mfcr2-1.4/configs/sip.conf.sample
    team/moy/mfcr2-1.4/configs/sip_notify.conf.sample
    team/moy/mfcr2-1.4/configs/voicemail.conf.sample
    team/moy/mfcr2-1.4/configure
    team/moy/mfcr2-1.4/configure.ac
    team/moy/mfcr2-1.4/contrib/init.d/rc.debian.asterisk
    team/moy/mfcr2-1.4/doc/HOWTO_collect_debug_information.txt
    team/moy/mfcr2-1.4/doc/manager.txt
    team/moy/mfcr2-1.4/doc/voicemail_odbc_postgresql.txt
    team/moy/mfcr2-1.4/include/asterisk.h
    team/moy/mfcr2-1.4/include/asterisk/autoconfig.h.in
    team/moy/mfcr2-1.4/include/asterisk/channel.h
    team/moy/mfcr2-1.4/include/asterisk/compiler.h
    team/moy/mfcr2-1.4/include/asterisk/file.h
    team/moy/mfcr2-1.4/include/asterisk/linkedlists.h
    team/moy/mfcr2-1.4/include/asterisk/lock.h
    team/moy/mfcr2-1.4/include/asterisk/options.h
    team/moy/mfcr2-1.4/include/asterisk/translate.h
    team/moy/mfcr2-1.4/main/Makefile
    team/moy/mfcr2-1.4/main/acl.c
    team/moy/mfcr2-1.4/main/ast_expr2.y
    team/moy/mfcr2-1.4/main/asterisk.c
    team/moy/mfcr2-1.4/main/autoservice.c
    team/moy/mfcr2-1.4/main/callerid.c
    team/moy/mfcr2-1.4/main/channel.c
    team/moy/mfcr2-1.4/main/cli.c
    team/moy/mfcr2-1.4/main/config.c
    team/moy/mfcr2-1.4/main/devicestate.c
    team/moy/mfcr2-1.4/main/dnsmgr.c
    team/moy/mfcr2-1.4/main/dsp.c
    team/moy/mfcr2-1.4/main/file.c
    team/moy/mfcr2-1.4/main/frame.c
    team/moy/mfcr2-1.4/main/http.c
    team/moy/mfcr2-1.4/main/loader.c
    team/moy/mfcr2-1.4/main/logger.c
    team/moy/mfcr2-1.4/main/manager.c
    team/moy/mfcr2-1.4/main/pbx.c
    team/moy/mfcr2-1.4/main/rtp.c
    team/moy/mfcr2-1.4/main/term.c
    team/moy/mfcr2-1.4/main/translate.c
    team/moy/mfcr2-1.4/makeopts.in
    team/moy/mfcr2-1.4/pbx/Makefile
    team/moy/mfcr2-1.4/pbx/pbx_ael.c
    team/moy/mfcr2-1.4/pbx/pbx_dundi.c
    team/moy/mfcr2-1.4/res/res_agi.c
    team/moy/mfcr2-1.4/res/res_config_odbc.c
    team/moy/mfcr2-1.4/res/res_config_pgsql.c
    team/moy/mfcr2-1.4/res/res_features.c
    team/moy/mfcr2-1.4/res/res_jabber.c
    team/moy/mfcr2-1.4/res/res_musiconhold.c
    team/moy/mfcr2-1.4/sounds/Makefile

Propchange: team/moy/mfcr2-1.4/
------------------------------------------------------------------------------
--- svn:externals (original)
+++ svn:externals Sun Sep  5 16:49:23 2010
@@ -1,1 +1,1 @@
-menuselect https://origsvn.digium.com/svn/menuselect/tags/autotag_for_asterisk/1.4.32-rc1
+menuselect https://origsvn.digium.com/svn/menuselect/tags/autotag_for_asterisk/1.4.35-rc1

Propchange: team/moy/mfcr2-1.4/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Sun Sep  5 16:49:23 2010
@@ -1,5 +1,4 @@
-/branches/1.4:233953-261541,265610
-/tags/1.4.32:266577-267091
-/tags/1.4.32-rc1:261542-265861
-/tags/1.4.32-rc2:265862-266576
+/branches/1.4:233953-278696
+/tags/1.4.35:281594-285085
+/tags/1.4.35-rc1:278697-281593
 /trunk:228798

Modified: team/moy/mfcr2-1.4/Makefile
URL: http://svnview.digium.com/svn/asterisk/team/moy/mfcr2-1.4/Makefile?view=diff&rev=285086&r1=285085&r2=285086
==============================================================================
--- team/moy/mfcr2-1.4/Makefile (original)
+++ team/moy/mfcr2-1.4/Makefile Sun Sep  5 16:49:23 2010
@@ -57,6 +57,7 @@
 export AR
 export RANLIB
 export HOST_CC
+export BUILD_CC
 export STATIC_BUILD
 export INSTALL
 export DESTDIR
@@ -264,7 +265,7 @@
 
 _ASTCFLAGS+=$(BUSYDETECT)$(OPTIONS)
 
-MOD_SUBDIRS:=res channels pbx apps codecs formats cdr funcs main
+MOD_SUBDIRS:=res channels pbx apps codecs formats cdr funcs tests main
 OTHER_SUBDIRS:=utils agi
 SUBDIRS:=$(OTHER_SUBDIRS) $(MOD_SUBDIRS)
 SUBDIRS_INSTALL:=$(SUBDIRS:%=%-install)
@@ -292,7 +293,12 @@
   SOLINK=-shared -fpic -L/usr/local/ssl/lib -lrt
 endif
 
-SUBMAKE=$(MAKE) --quiet --no-print-directory
+SILENTMAKE:=$(MAKE) --quiet --no-print-directory
+ifneq ($(PRINT_DIR)$(NOISY_BUILD),)
+SUBMAKE:=$(MAKE)
+else
+SUBMAKE:=$(MAKE) --quiet --no-print-directory
+endif
 
 # This is used when generating the doxygen documentation
 ifneq ($(DOT),:)
@@ -329,13 +335,13 @@
 endif
 
 $(MOD_SUBDIRS_EMBED_LDSCRIPT):
-	+ at echo "EMBED_LDSCRIPTS+="`$(SUBMAKE) -C $(@:-embed-ldscript=) SUBDIR=$(@:-embed-ldscript=) __embed_ldscript` >> makeopts.embed_rules
+	+ at echo "EMBED_LDSCRIPTS+="`$(SILENTMAKE) -C $(@:-embed-ldscript=) SUBDIR=$(@:-embed-ldscript=) __embed_ldscript` >> makeopts.embed_rules
 
 $(MOD_SUBDIRS_EMBED_LDFLAGS):
-	+ at echo "EMBED_LDFLAGS+="`$(SUBMAKE) -C $(@:-embed-ldflags=) SUBDIR=$(@:-embed-ldflags=) __embed_ldflags` >> makeopts.embed_rules
+	+ at echo "EMBED_LDFLAGS+="`$(SILENTMAKE) -C $(@:-embed-ldflags=) SUBDIR=$(@:-embed-ldflags=) __embed_ldflags` >> makeopts.embed_rules
 
 $(MOD_SUBDIRS_EMBED_LIBS):
-	+ at echo "EMBED_LIBS+="`$(SUBMAKE) -C $(@:-embed-libs=) SUBDIR=$(@:-embed-libs=) __embed_libs` >> makeopts.embed_rules
+	+ at echo "EMBED_LIBS+="`$(SILENTMAKE) -C $(@:-embed-libs=) SUBDIR=$(@:-embed-libs=) __embed_libs` >> makeopts.embed_rules
 
 $(MOD_SUBDIRS_MENUSELECT_TREE):
 	+@$(SUBMAKE) -C $(@:-menuselect-tree=) SUBDIR=$(@:-menuselect-tree=) moduleinfo
@@ -624,6 +630,7 @@
 		echo "                        ; to the device.  It is for this reason that this is optional, as it may result in requiring a" ; \
 		echo "                        ; temporary codec translation path for a channel that may not otherwise require one." ; \
 		echo ";transcode_via_sln = yes ; Build transcode paths via SLINEAR, instead of directly" ; \
+		echo ";sendfullybooted = yes  ; Send the FullyBooted AMI event on AMI login and when all modules are finished loading" ; \
 		echo ";runuser = asterisk ; The user to run as" ; \
 		echo ";rungroup = asterisk ; The group to run as" ; \
 		echo ";dahdichanname = yes ; Channels created by chan_dahdi will be called 'DAHDI', otherwise 'Zap'" ; \
@@ -782,7 +789,7 @@
 	- at menuselect/nmenuselect menuselect.makeopts && (echo "menuselect changes saved!"; rm -f channels/h323/Makefile.ast main/asterisk) || echo "menuselect changes NOT saved!"
 
 # options for make in menuselect/
-MAKE_MENUSELECT=CC="$(HOST_CC)" CXX="$(CXX)" LD="" AR="" RANLIB="" CFLAGS="" $(MAKE) -C menuselect CONFIGURE_SILENT="--silent"
+MAKE_MENUSELECT=CC="$(BUILD_CC)" CXX="" LD="" AR="" RANLIB="" CFLAGS="" $(MAKE) -C menuselect CONFIGURE_SILENT="--silent"
 
 menuselect/menuselect: menuselect/makeopts
 	+$(MAKE_MENUSELECT) menuselect
@@ -804,8 +811,8 @@
 	@echo "<?xml version=\"1.0\"?>" > $@
 	@echo >> $@
 	@echo "<menu name=\"Asterisk Module and Build Option Selection\">" >> $@
-	+ at for dir in $(sort $(filter-out main,$(MOD_SUBDIRS))); do $(SUBMAKE) -C $${dir} SUBDIR=$${dir} moduleinfo >> $@; done
-	+ at for dir in $(sort $(filter-out main,$(MOD_SUBDIRS))); do $(SUBMAKE) -C $${dir} SUBDIR=$${dir} makeopts >> $@; done
+	+ at for dir in $(sort $(filter-out main,$(MOD_SUBDIRS))); do $(SILENTMAKE) -C $${dir} SUBDIR=$${dir} moduleinfo >> $@; done
+	+ at for dir in $(sort $(filter-out main,$(MOD_SUBDIRS))); do $(SILENTMAKE) -C $${dir} SUBDIR=$${dir} makeopts >> $@; done
 	@cat build_tools/cflags.xml >> $@
 	@if [ "${AST_DEVMODE}" = "yes" ]; then \
 		cat build_tools/cflags-devmode.xml >> $@; \

Modified: team/moy/mfcr2-1.4/apps/app_amd.c
URL: http://svnview.digium.com/svn/asterisk/team/moy/mfcr2-1.4/apps/app_amd.c?view=diff&rev=285086&r1=285085&r2=285086
==============================================================================
--- team/moy/mfcr2-1.4/apps/app_amd.c (original)
+++ team/moy/mfcr2-1.4/apps/app_amd.c Sun Sep  5 16:49:23 2010
@@ -215,10 +215,11 @@
 
 		if (f->frametype == AST_FRAME_VOICE || f->frametype == AST_FRAME_NULL || f->frametype == AST_FRAME_CNG) {
 			/* If the total time exceeds the analysis time then give up as we are not too sure */
-			if (f->frametype == AST_FRAME_VOICE)
+			if (f->frametype == AST_FRAME_VOICE) {
 				framelength = (ast_codec_get_samples(f) / DEFAULT_SAMPLES_PER_MS);
-			else
-				framelength += 2 * maxWaitTimeForFrame;
+			} else {
+				framelength = 2 * maxWaitTimeForFrame;
+			}
 
 			iTotalTime += framelength;
 			if (iTotalTime >= totalAnalysisTime) {

Modified: team/moy/mfcr2-1.4/apps/app_dial.c
URL: http://svnview.digium.com/svn/asterisk/team/moy/mfcr2-1.4/apps/app_dial.c?view=diff&rev=285086&r1=285085&r2=285086
==============================================================================
--- team/moy/mfcr2-1.4/apps/app_dial.c (original)
+++ team/moy/mfcr2-1.4/apps/app_dial.c Sun Sep  5 16:49:23 2010
@@ -1707,6 +1707,11 @@
 		}
 
 		if (chan && peer && ast_test_flag(&opts, OPT_GOTO) && !ast_strlen_zero(opt_args[OPT_ARG_GOTO])) {
+			/* chan and peer are going into the PBX, they both
+			 * should probably get CDR records. */
+			ast_clear_flag(chan->cdr, AST_CDR_FLAG_DIALED);
+			ast_clear_flag(peer->cdr, AST_CDR_FLAG_DIALED);
+
 			replace_macro_delimiter(opt_args[OPT_ARG_GOTO]);
 			ast_parseable_goto(chan, opt_args[OPT_ARG_GOTO]);
 			/* peer goes to the same context and extension as chan, so just copy info from chan*/

Modified: team/moy/mfcr2-1.4/apps/app_directory.c
URL: http://svnview.digium.com/svn/asterisk/team/moy/mfcr2-1.4/apps/app_directory.c?view=diff&rev=285086&r1=285085&r2=285086
==============================================================================
--- team/moy/mfcr2-1.4/apps/app_directory.c (original)
+++ team/moy/mfcr2-1.4/apps/app_directory.c Sun Sep  5 16:49:23 2010
@@ -329,6 +329,14 @@
 	
 		if (res < 0) /* User hungup, so jump out now */
 			break;
+		if (res == '0') {
+		if (!ast_goto_if_exists(chan, dialcontext, "o", 1) ||
+		    (!ast_strlen_zero(chan->macrocontext) &&
+		     !ast_goto_if_exists(chan, chan->macrocontext, "o", 1))) {
+			/* return 1 to indicate goto has been performed */
+			return '1';
+			}
+		}
 		if (res == '1') {	/* Name selected */
 			if (fromappvm) {
 				/* We still want to set the exten though */
@@ -345,6 +353,8 @@
 			break;
 		}
 		if (res == '*') /* Skip to next match in list */
+			break;
+		if (res == '#')
 			break;
 
 		/* Not '1', or '*', so decrement number of tries */
@@ -516,6 +526,9 @@
 						lastuserchoice = res;
 						res = 0;
 						break;
+					case '#':
+						lastuserchoice = res;
+						return 0;
 					default:
 						break;
 				}
@@ -645,6 +658,8 @@
 		dirintro = ast_variable_retrieve(cfg, "general", "directoryintro");
 	if (ast_strlen_zero(dirintro))
 		dirintro = last ? "dir-intro" : "dir-intro-fn";
+	/* the above prompts probably should be modified to include 0 for dialing operator
+	   and # for exiting (continues in dialplan) */
 
 	if (chan->_state != AST_STATE_UP) 
 		res = ast_answer(chan);

Modified: team/moy/mfcr2-1.4/apps/app_meetme.c
URL: http://svnview.digium.com/svn/asterisk/team/moy/mfcr2-1.4/apps/app_meetme.c?view=diff&rev=285086&r1=285085&r2=285086
==============================================================================
--- team/moy/mfcr2-1.4/apps/app_meetme.c (original)
+++ team/moy/mfcr2-1.4/apps/app_meetme.c Sun Sep  5 16:49:23 2010
@@ -362,7 +362,7 @@
 	struct ast_frame *transframe[32];
 	struct ast_frame *origframe;
 	struct ast_trans_pvt *transpath[32];
-	AST_LIST_HEAD_NOLOCK(, ast_conf_user) userlist;
+	struct ao2_container *usercontainer;
 	AST_LIST_ENTRY(ast_conference) list;
 	/* announce_thread related data */
 	pthread_t announcethread;
@@ -752,6 +752,30 @@
 		ast_autoservice_stop(chan);
 }
 
+static int user_no_cmp(void *obj, void *arg, int flags)
+{
+	struct ast_conf_user *user = obj;
+	int *user_no = arg;
+
+	if (user->user_no == *user_no) {
+		return (CMP_MATCH | CMP_STOP);
+	}
+
+	return 0;
+}
+
+static int user_max_cmp(void *obj, void *arg, int flags)
+{
+	struct ast_conf_user *user = obj;
+	int *max_no = arg;
+
+	if (user->user_no > *max_no) {
+		*max_no = user->user_no;
+	}
+
+	return 0;
+}
+
 /*!
  * \brief Find or create a conference
  *
@@ -782,8 +806,10 @@
 		goto cnfout;
 
 	/* Make a new one */
-	if (!(cnf = ast_calloc(1, sizeof(*cnf))))
+	if (!(cnf = ast_calloc(1, sizeof(*cnf))) ||
+		!(cnf->usercontainer = ao2_container_alloc(1, NULL, user_no_cmp))) {
 		goto cnfout;
+	}
 
 	ast_mutex_init(&cnf->playlock);
 	ast_mutex_init(&cnf->listenlock);
@@ -939,6 +965,7 @@
 			strncat(cmdline, argv[3], sizeof(cmdline) - strlen(cmdline) - 1);
 		}	
 	} else if(strcmp(argv[1], "list") == 0) {
+		struct ao2_iterator user_iter;
 		int concise = ( 4 == argc && ( !strcasecmp(argv[3], "concise") ) );
 		/* List all the users in a conference */
 		if (AST_LIST_EMPTY(&confs)) {
@@ -960,11 +987,12 @@
 		}
 		/* Show all the users */
 		time(&now);
-		AST_LIST_TRAVERSE(&cnf->userlist, user, list) {
+		user_iter = ao2_iterator_init(cnf->usercontainer, 0);
+		while((user = ao2_iterator_next(&user_iter))) {
 			hr = (now - user->jointime) / 3600;
 			min = ((now - user->jointime) % 3600) / 60;
 			sec = (now - user->jointime) % 60;
-			if ( !concise )
+			if (!concise) {
 				ast_cli(fd, "User #: %-2.2d %12.12s %-20.20s Channel: %s %s %s %s %s %02d:%02d:%02d\n",
 					user->user_no,
 					S_OR(user->chan->cid.cid_num, "<unknown>"),
@@ -974,7 +1002,7 @@
 					user->userflags & CONFFLAG_MONITOR ? "(Listen only)" : "",
 					user->adminflags & ADMINFLAG_MUTED ? "(Admin Muted)" : user->adminflags & ADMINFLAG_SELFMUTED ? "(Muted)" : "",
 					istalking(user->talking), hr, min, sec); 
-			else 
+			} else {
 				ast_cli(fd, "%d!%s!%s!%s!%s!%s!%s!%d!%02d:%02d:%02d\n",
 					user->user_no,
 					S_OR(user->chan->cid.cid_num, ""),
@@ -984,8 +1012,10 @@
 					user->userflags  & CONFFLAG_MONITOR ? "1" : "",
 					user->adminflags & (ADMINFLAG_MUTED | ADMINFLAG_SELFMUTED)  ? "1" : "",
 					user->talking, hr, min, sec);
-			
-		}
+			}
+			ao2_ref(user, -1);
+		}
+		ao2_iterator_destroy(&user_iter);
 		if ( !concise )
 			ast_cli(fd,"%d users in that conference.\n",cnf->users);
 		AST_LIST_UNLOCK(&confs);
@@ -1044,15 +1074,21 @@
 			}
 
 			if (cnf) {
+				struct ao2_iterator user_iter;
+				user_iter = ao2_iterator_init(cnf->usercontainer, 0);
 				/* Search for the user */
-				AST_LIST_TRAVERSE(&cnf->userlist, usr, list) {
+				while((usr = ao2_iterator_next(&user_iter))) {
 					snprintf(usrno, sizeof(usrno), "%d", usr->user_no);
-					if (!strncasecmp(word, usrno, len) && ++which > state)
+					if (!strncasecmp(word, usrno, len) && ++which > state) {
+						ao2_ref(usr, -1);
 						break;
+					}
+					ao2_ref(usr, -1);
 				}
+				ao2_iterator_destroy(&user_iter);
+				AST_LIST_UNLOCK(&confs);
+				return usr ? strdup(usrno) : NULL;
 			}
-			AST_LIST_UNLOCK(&confs);
-			return usr ? strdup(usrno) : NULL;
 		} else if ( strstr(line, "list") && ( 0 == state ) )
 			return strdup("concise");
 	}
@@ -1302,6 +1338,9 @@
 		ast_hangup(conf->chan);
 	if (conf->fd >= 0)
 		close(conf->fd);
+	if (conf->usercontainer) {
+		ao2_ref(conf->usercontainer, -1);
+	}
 
 	ast_mutex_destroy(&conf->playlock);
 	ast_mutex_destroy(&conf->listenlock);
@@ -1317,13 +1356,19 @@
 	const struct ast_conf_user *sender, struct ast_frame *f)
 {
 	struct ast_conf_user *user;
-
-	AST_LIST_TRAVERSE(&conf->userlist, user, list) {
-		if (user == sender)
+	struct ao2_iterator user_iter;
+
+	user_iter = ao2_iterator_init(conf->usercontainer, 0);
+	while ((user = ao2_iterator_next(&user_iter))) {
+		if (user == sender) {
+			ao2_ref(user, -1);
 			continue;
+		}
 		if (ast_write(user->chan, f) < 0)
 			ast_log(LOG_WARNING, "Error writing frame to channel %s\n", user->chan->name);
-	}
+		ao2_ref(user, -1);
+	}
+	ao2_iterator_destroy(&user_iter);
 }
 
 static void sla_queue_event_full(enum sla_event_type type, 
@@ -1564,8 +1609,9 @@
 	int setusercount = 0;
 	int confsilence = 0, totalsilence = 0;
 
-	if (!(user = ast_calloc(1, sizeof(*user))))
+	if (!(user = ao2_alloc(sizeof(*user), NULL))) {
 		return ret;
+	}
 
 	/* Possible timeout waiting for marked user */
 	if ((confflags & CONFFLAG_WAITMARKED) &&
@@ -1630,13 +1676,11 @@
 	}
 
    	ast_mutex_lock(&conf->playlock);
-
-	if (AST_LIST_EMPTY(&conf->userlist))
-		user->user_no = 1;
-	else
-		user->user_no = AST_LIST_LAST(&conf->userlist)->user_no + 1;
-
-	AST_LIST_INSERT_TAIL(&conf->userlist, user, list);
+	ao2_lock(conf->usercontainer);
+	ao2_callback(conf->usercontainer, OBJ_NODATA, user_max_cmp, &user->user_no);
+	user->user_no++;
+	ao2_link(conf->usercontainer, user);
+	ao2_unlock(conf->usercontainer);
 
 	user->chan = chan;
 	user->userflags = confflags;
@@ -2202,15 +2246,21 @@
 								}
 								break;
 							case '3': /* Eject last user */
+							{
+								int max_no = 0;
+								ao2_callback(conf->usercontainer, OBJ_NODATA, user_max_cmp, &max_no);
 								menu_active = 0;
-								usr = AST_LIST_LAST(&conf->userlist);
+								usr = ao2_find(conf->usercontainer, &max_no, 0);
 								if ((usr->chan->name == chan->name)||(usr->userflags & CONFFLAG_ADMIN)) {
 									if(!ast_streamfile(chan, "conf-errormenu", chan->language))
 										ast_waitstream(chan, "");
-								} else 
+								} else {
 									usr->adminflags |= ADMINFLAG_KICKME;
+								}
+								ao2_ref(user, -1);
 								ast_stopstream(chan);
 								break;	
+							}
 							case '4':
 								tweak_listen_volume(user, VOL_DOWN);
 								break;
@@ -2322,6 +2372,20 @@
 					}
 				} else if (f->frametype == AST_FRAME_NULL) {
 					/* Ignore NULL frames. It is perfectly normal to get these if the person is muted. */
+				} else if (f->frametype == AST_FRAME_CONTROL) {
+					switch (f->subclass) {
+					case AST_CONTROL_BUSY:
+					case AST_CONTROL_CONGESTION:
+						ast_frfree(f);
+						goto outrun;
+						break;
+					default:
+						if (option_debug) {
+							ast_log(LOG_DEBUG, 
+								"Got ignored control frame on channel %s, f->frametype=%d,f->subclass=%d\n",
+								chan->name, f->frametype, f->subclass);
+						}
+					}
 				} else if (option_debug) {
 					ast_log(LOG_DEBUG,
 						"Got unrecognized frame on channel %s, f->frametype=%d,f->subclass=%d\n",
@@ -2352,6 +2416,10 @@
 						ast_mutex_lock(&conf->listenlock);
 						if (!conf->transframe[index]) {
 							if (conf->origframe) {
+								if (musiconhold && !ast_dsp_silence(dsp, conf->origframe, &confsilence) && confsilence < MEETME_DELAYDETECTTALK) {
+									ast_moh_stop(chan);
+									mohtempstopped = 1;
+								}
 								if (!conf->transpath[index])
 									conf->transpath[index] = ast_translator_build_path((1 << index), AST_FORMAT_SLINEAR);
 								if (conf->transpath[index]) {
@@ -2365,11 +2433,6 @@
 							if ((conf->transframe[index]->frametype != AST_FRAME_NULL) &&
 							    can_write(chan, confflags)) {
 								struct ast_frame *cur;
-								if (musiconhold && !ast_dsp_silence(dsp, conf->transframe[index], &confsilence) && confsilence < MEETME_DELAYDETECTTALK) {
-									ast_moh_stop(chan);
-									mohtempstopped = 1;
-								}
-
 								/* the translator may have returned a list of frames, so
 								   write each one onto the channel
 								*/
@@ -2457,7 +2520,9 @@
 	if (dsp)
 		ast_dsp_free(dsp);
 	
-	if (user->user_no) { /* Only cleanup users who really joined! */
+	if (!user->user_no) {
+		ao2_ref(user, -1);
+	} else { /* Only cleanup users who really joined! */
 		now = time(NULL);
 		hr = (now - user->jointime) / 3600;
 		min = ((now - user->jointime) % 3600) / 60;
@@ -2487,8 +2552,8 @@
 			if (confflags & CONFFLAG_MARKEDUSER) 
 				conf->markedusers--;
 		}
-		/* Remove ourselves from the list */
-		AST_LIST_REMOVE(&conf->userlist, user, list);
+		/* Remove ourselves from the container */
+		ao2_unlink(conf->usercontainer, user); 
 
 		/* Change any states */
 		if (!conf->users)
@@ -2498,7 +2563,6 @@
 		snprintf(meetmesecs, sizeof(meetmesecs), "%d", (int) (time(NULL) - user->jointime));
 		pbx_builtin_setvar_helper(chan, "MEETMESECS", meetmesecs);
 	}
-	free(user);
 	AST_LIST_UNLOCK(&confs);
 
 	return ret;
@@ -2874,10 +2938,10 @@
 				if (allowretry)
 					confno[0] = '\0';
 			} else {
-				if ((!ast_strlen_zero(cnf->pin) &&
-				     !ast_test_flag(&confflags, CONFFLAG_ADMIN)) ||
-				    (!ast_strlen_zero(cnf->pinadmin) &&
-				     ast_test_flag(&confflags, CONFFLAG_ADMIN))) {
+				if (((!ast_strlen_zero(cnf->pin) &&
+				    !ast_test_flag(&confflags, CONFFLAG_ADMIN)) ||
+				    !ast_strlen_zero(cnf->pinadmin)) &&
+				    (!(cnf->users == 0 && cnf->isdynamic))) {
 					char pin[MAX_PIN] = "";
 					int j;
 
@@ -2960,12 +3024,69 @@
 	
 	sscanf(callerident, "%30i", &cid);
 	if (conf && callerident) {
-		AST_LIST_TRAVERSE(&conf->userlist, user, list) {
-			if (cid == user->user_no)
-				return user;
-		}
+		user = ao2_find(conf->usercontainer, &cid, 0);
+		/* reference decremented later in admin_exec */
+		return user;
 	}
 	return NULL;
+}
+
+static int user_set_kickme_cb(void *obj, void *unused, int flags)
+{
+	struct ast_conf_user *user = obj;
+	user->adminflags |= ADMINFLAG_KICKME;
+	return 0;
+}
+
+static int user_set_muted_cb(void *obj, void *unused, int flags)
+{
+	struct ast_conf_user *user = obj;
+	if (!(user->userflags & CONFFLAG_ADMIN)) {
+		user->adminflags |= ADMINFLAG_MUTED;
+	}
+	return 0;
+}
+
+static int user_set_unmuted_cb(void *obj, void *unused, int flags)
+{
+	struct ast_conf_user *user = obj;
+	user->adminflags &= ~(ADMINFLAG_MUTED | ADMINFLAG_SELFMUTED);
+	return 0;
+}
+
+static int user_listen_volup_cb(void *obj, void *unused, int flags)
+{
+	struct ast_conf_user *user = obj;
+	tweak_listen_volume(user, VOL_UP);
+	return 0;
+}
+
+static int user_listen_voldown_cb(void *obj, void *unused, int flags)
+{
+	struct ast_conf_user *user = obj;
+	tweak_listen_volume(user, VOL_DOWN);
+	return 0;
+}
+
+static int user_talk_volup_cb(void *obj, void *unused, int flags)
+{
+	struct ast_conf_user *user = obj;
+	tweak_talk_volume(user, VOL_UP);
+	return 0;
+}
+
+static int user_talk_voldown_cb(void *obj, void *unused, int flags)
+{
+	struct ast_conf_user *user = obj;
+	tweak_talk_volume(user, VOL_DOWN);
+	return 0;
+}
+
+static int user_reset_vol_cb(void *obj, void *unused, int flags)
+{
+	struct ast_conf_user *user = obj;
+	reset_volumes(user);
+	return 0;
 }
 
 /*! \brief The MeetMeadmin application */
@@ -3013,8 +3134,13 @@
 
 	ast_atomic_fetchadd_int(&cnf->refcount, 1);
 
-	if (args.user)
+	if (args.user) {
 		user = find_user(cnf, args.user);
+		if (!user) {
+			ast_log(LOG_NOTICE, "Specified User not found!\n");
+			goto usernotfound;
+		}
+	}
 
 	switch (*args.command) {
 	case 76: /* L: Lock */ 
@@ -3024,96 +3150,72 @@
 		cnf->locked = 0;
 		break;
 	case 75: /* K: kick all users */
-		AST_LIST_TRAVERSE(&cnf->userlist, user, list)
-			user->adminflags |= ADMINFLAG_KICKME;
+		ao2_callback(cnf->usercontainer, 0, user_set_kickme_cb, NULL);
 		break;
 	case 101: /* e: Eject last user*/
-		user = AST_LIST_LAST(&cnf->userlist);
+	{
+		int max_no = 0;
+		ao2_callback(cnf->usercontainer, OBJ_NODATA, user_max_cmp, &max_no);
+		user = ao2_find(cnf->usercontainer, &max_no, 0);
 		if (!(user->userflags & CONFFLAG_ADMIN))
 			user->adminflags |= ADMINFLAG_KICKME;
 		else
 			ast_log(LOG_NOTICE, "Not kicking last user, is an Admin!\n");
+		ao2_ref(user, -1);
 		break;
+	}
 	case 77: /* M: Mute */ 
-		if (user) {
-			user->adminflags |= ADMINFLAG_MUTED;
-		} else
-			ast_log(LOG_NOTICE, "Specified User not found!\n");
+		user->adminflags |= ADMINFLAG_MUTED;
 		break;
 	case 78: /* N: Mute all (non-admin) users */
-		AST_LIST_TRAVERSE(&cnf->userlist, user, list) {
-			if (!(user->userflags & CONFFLAG_ADMIN))
-				user->adminflags |= ADMINFLAG_MUTED;
-		}
+		ao2_callback(cnf->usercontainer, 0, user_set_muted_cb, NULL);
 		break;					
 	case 109: /* m: Unmute */ 
-		if (user) {
-			user->adminflags &= ~(ADMINFLAG_MUTED | ADMINFLAG_SELFMUTED);
-		} else
-			ast_log(LOG_NOTICE, "Specified User not found!\n");
+		user->adminflags &= ~(ADMINFLAG_MUTED | ADMINFLAG_SELFMUTED);
 		break;
 	case 110: /* n: Unmute all users */
-		AST_LIST_TRAVERSE(&cnf->userlist, user, list)
-			user->adminflags &= ~(ADMINFLAG_MUTED | ADMINFLAG_SELFMUTED);
+		ao2_callback(cnf->usercontainer, 0, user_set_unmuted_cb, NULL);
 		break;
 	case 107: /* k: Kick user */ 
-		if (user)
-			user->adminflags |= ADMINFLAG_KICKME;
-		else
-			ast_log(LOG_NOTICE, "Specified User not found!\n");
+		user->adminflags |= ADMINFLAG_KICKME;
 		break;
 	case 118: /* v: Lower all users listen volume */
-		AST_LIST_TRAVERSE(&cnf->userlist, user, list)
-			tweak_listen_volume(user, VOL_DOWN);
+		ao2_callback(cnf->usercontainer, 0, user_listen_voldown_cb, NULL);
 		break;
 	case 86: /* V: Raise all users listen volume */
-		AST_LIST_TRAVERSE(&cnf->userlist, user, list)
-			tweak_listen_volume(user, VOL_UP);
+		ao2_callback(cnf->usercontainer, 0, user_listen_volup_cb, NULL);
 		break;
 	case 115: /* s: Lower all users speaking volume */
-		AST_LIST_TRAVERSE(&cnf->userlist, user, list)
-			tweak_talk_volume(user, VOL_DOWN);
+		ao2_callback(cnf->usercontainer, 0, user_talk_voldown_cb, NULL);
 		break;
 	case 83: /* S: Raise all users speaking volume */
-		AST_LIST_TRAVERSE(&cnf->userlist, user, list)
-			tweak_talk_volume(user, VOL_UP);
+		ao2_callback(cnf->usercontainer, 0, user_talk_volup_cb, NULL);
 		break;
 	case 82: /* R: Reset all volume levels */
-		AST_LIST_TRAVERSE(&cnf->userlist, user, list)
-			reset_volumes(user);
+		ao2_callback(cnf->usercontainer, 0, user_reset_vol_cb, NULL);
 		break;
 	case 114: /* r: Reset user's volume level */
-		if (user)
-			reset_volumes(user);
-		else
-			ast_log(LOG_NOTICE, "Specified User not found!\n");
+		reset_volumes(user);
 		break;
 	case 85: /* U: Raise user's listen volume */
-		if (user)
-			tweak_listen_volume(user, VOL_UP);
-		else
-			ast_log(LOG_NOTICE, "Specified User not found!\n");
+		tweak_listen_volume(user, VOL_UP);
 		break;
 	case 117: /* u: Lower user's listen volume */
-		if (user)
-			tweak_listen_volume(user, VOL_DOWN);
-		else
-			ast_log(LOG_NOTICE, "Specified User not found!\n");
+		tweak_listen_volume(user, VOL_DOWN);
 		break;
 	case 84: /* T: Raise user's talk volume */
-		if (user)
-			tweak_talk_volume(user, VOL_UP);
-		else
-			ast_log(LOG_NOTICE, "Specified User not found!\n");
+		tweak_talk_volume(user, VOL_UP);
 		break;
 	case 116: /* t: Lower user's talk volume */
-		if (user) 
-			tweak_talk_volume(user, VOL_DOWN);
-		else 
-			ast_log(LOG_NOTICE, "Specified User not found!\n");
+		tweak_talk_volume(user, VOL_DOWN);
 		break;
 	}
 
+	if (args.user) {
+		/* decrement reference from find_user */
+		ao2_ref(user, -1);
+	}
+usernotfound:
 	AST_LIST_UNLOCK(&confs);
 
 	dispose_conf(cnf);
@@ -3161,9 +3263,7 @@
 		return 0;
 	}
 
-	AST_LIST_TRAVERSE(&conf->userlist, user, list)
-		if (user->user_no == userno)
-			break;
+	user = ao2_find(conf->usercontainer, &userno, 0);
 
 	if (!user) {
 		AST_LIST_UNLOCK(&confs);
@@ -3180,6 +3280,7 @@
 
 	ast_log(LOG_NOTICE, "Requested to %smute conf %s user %d userchan %s uniqueid %s\n", mute ? "" : "un", conf->confno, user->user_no, user->chan->name, user->chan->uniqueid);
 
+	ao2_ref(user, -1);
 	astman_send_ack(s, m, mute ? "User muted" : "User unmuted");
 	return 0;
 }

Modified: team/moy/mfcr2-1.4/apps/app_queue.c
URL: http://svnview.digium.com/svn/asterisk/team/moy/mfcr2-1.4/apps/app_queue.c?view=diff&rev=285086&r1=285085&r2=285086
==============================================================================
--- team/moy/mfcr2-1.4/apps/app_queue.c (original)
+++ team/moy/mfcr2-1.4/apps/app_queue.c Sun Sep  5 16:49:23 2010
@@ -574,10 +574,13 @@
 	struct member *member;
 	struct ao2_iterator mem_iter;
 	enum queue_member_status result = QUEUE_NO_MEMBERS;
+	int allpaused = 1, empty = 1;
 
 	ao2_lock(q);
 	mem_iter = ao2_iterator_init(q->members, 0);
 	while ((member = ao2_iterator_next(&mem_iter))) {
+		empty = 0;
+
 		if (max_penalty && (member->penalty > max_penalty)) {
 			ao2_ref(member, -1);
 			continue;
@@ -586,6 +589,8 @@
 		if (member->paused) {
 			ao2_ref(member, -1);
 			continue;
+		} else {
+			allpaused = 0;
 		}
 
 		switch (member->status) {
@@ -605,6 +610,10 @@
 	}
 	ao2_iterator_destroy(&mem_iter);
 	ao2_unlock(q);
+
+	if (!empty && allpaused) {
+		result = QUEUE_NO_REACHABLE_MEMBERS;
+	}
 	return result;
 }
 
@@ -1529,6 +1538,10 @@
 	int res;
 
 	if (ast_strlen_zero(filename)) {
+		return 0;
+	}
+
+	if (!ast_fileexists(filename, NULL, chan->language)) {
 		return 0;
 	}
 
@@ -3282,6 +3295,20 @@
 				ast_queue_log(queuename, qe->chan->uniqueid, member->membername, "TRANSFER", "%s|%s|%ld|%ld",
 					qe->chan->exten, qe->chan->context, (long) (callstart - qe->start),
 					(long) (time(NULL) - callstart));
+				if (qe->parent->eventwhencalled)
+					manager_event(EVENT_FLAG_AGENT, "AgentComplete",
+							"Queue: %s\r\n"
+							"Uniqueid: %s\r\n"
+							"Channel: %s\r\n"
+							"Member: %s\r\n"
+							"MemberName: %s\r\n"
+							"HoldTime: %ld\r\n"
+							"TalkTime: %ld\r\n"
+							"Reason: transfer\r\n"
+							"%s",
+							queuename, qe->chan->uniqueid, peer->name, member->interface, member->membername,
+							(long)(callstart - qe->start), (long)(time(NULL) - callstart),
+							qe->parent->eventwhencalled == QUEUE_EVENT_VARIABLES ? vars2manager(qe->chan, vars, sizeof(vars)) : "");
 			} else if (qe->chan->_softhangup) {
 				ast_queue_log(queuename, qe->chan->uniqueid, member->membername, "COMPLETECALLER", "%ld|%ld|%d",
 					(long) (callstart - qe->start), (long) (time(NULL) - callstart), qe->opos);
@@ -3307,12 +3334,13 @@
 							"Queue: %s\r\n"
 							"Uniqueid: %s\r\n"
 							"Channel: %s\r\n"
+							"Member: %s\r\n"
 							"MemberName: %s\r\n"
 							"HoldTime: %ld\r\n"
 							"TalkTime: %ld\r\n"
 							"Reason: agent\r\n"
 							"%s",
-							queuename, qe->chan->uniqueid, peer->name, member->membername, (long)(callstart - qe->start),
+							queuename, qe->chan->uniqueid, peer->name, member->interface, member->membername, (long)(callstart - qe->start),
 							(long)(time(NULL) - callstart),
 							qe->parent->eventwhencalled == QUEUE_EVENT_VARIABLES ? vars2manager(qe->chan, vars, sizeof(vars)) : "");
 			}
@@ -3320,6 +3348,21 @@
 				ast_channel_datastore_remove(qe->chan, tds);
 			}
 			update_queue(qe->parent, member, callcompletedinsl);
+		} else {
+			if (qe->parent->eventwhencalled)
+				manager_event(EVENT_FLAG_AGENT, "AgentComplete",
+						"Queue: %s\r\n"
+						"Uniqueid: %s\r\n"
+						"Channel: %s\r\n"
+						"Member: %s\r\n"
+						"MemberName: %s\r\n"
+						"HoldTime: %ld\r\n"
+						"TalkTime: %ld\r\n"
+						"Reason: transfer\r\n"
+						"%s",
+						queuename, qe->chan->uniqueid, peer->name, member->interface, member->membername, (long)(callstart - qe->start),
+						(long)(time(NULL) - callstart),
+						qe->parent->eventwhencalled == QUEUE_EVENT_VARIABLES ? vars2manager(qe->chan, vars, sizeof(vars)) : "");
 		}
 
 		if (transfer_ds) {

Modified: team/moy/mfcr2-1.4/apps/app_speech_utils.c
URL: http://svnview.digium.com/svn/asterisk/team/moy/mfcr2-1.4/apps/app_speech_utils.c?view=diff&rev=285086&r1=285085&r2=285086
==============================================================================
--- team/moy/mfcr2-1.4/apps/app_speech_utils.c (original)
+++ team/moy/mfcr2-1.4/apps/app_speech_utils.c Sun Sep  5 16:49:23 2010
@@ -735,6 +735,7 @@
 				if (dtmf_terminator != '\0' && f->subclass == dtmf_terminator) {
 					done = 1;
 				} else {
+					quieted = 1;
 					if (chan->stream != NULL) {
 						ast_stopstream(chan);
 					}

Modified: team/moy/mfcr2-1.4/apps/app_voicemail.c
URL: http://svnview.digium.com/svn/asterisk/team/moy/mfcr2-1.4/apps/app_voicemail.c?view=diff&rev=285086&r1=285085&r2=285086
==============================================================================
--- team/moy/mfcr2-1.4/apps/app_voicemail.c (original)
+++ team/moy/mfcr2-1.4/apps/app_voicemail.c Sun Sep  5 16:49:23 2010
@@ -1193,9 +1193,10 @@
 
 	fprintf(text_file_ptr, "%s\n", "[message]");
 
+	cid_name = get_header_by_tag(header_content, "X-Asterisk-VM-Caller-ID-Name:");
+	fprintf(text_file_ptr, "callerid=\"%s\" ", S_OR(cid_name, ""));
 	cid_num = get_header_by_tag(header_content, "X-Asterisk-VM-Caller-ID-Num:");
-	cid_name = get_header_by_tag(header_content, "X-Asterisk-VM-Caller-ID-Name:");
-	fprintf(text_file_ptr, "callerid=\"%s\" <%s>\n", S_OR(cid_name, ""), S_OR(cid_num, ""));
+	fprintf(text_file_ptr, "<%s>\n", S_OR(cid_num, ""));
 	context = get_header_by_tag(header_content, "X-Asterisk-VM-Context:");
 	fprintf(text_file_ptr, "context=%s\n", S_OR(context, ""));
 	origtime = get_header_by_tag(header_content, "X-Asterisk-VM-Orig-time:");
@@ -3543,7 +3544,7 @@
 						ast_log(LOG_DEBUG, "VOLGAIN: Stored at: %s.%s - Level: %.4f - Mailbox: %s\n", attach, format, vmu->volgain, mailbox);
 					}
 				} else {
-					ast_log(LOG_WARNING, "Sox failed to reencode %s.%s: %s (have you installed support for all sox file formats?)\n", attach, format,
+					ast_log(LOG_WARNING, "Sox failed to re-encode %s.%s: %s (have you installed support for all sox file formats?)\n", attach, format,
 						soxstatus == 1 ? "Problem with command line options" : "An error occurred during file processing");
 					ast_log(LOG_WARNING, "Voicemail attachment will have no volume gain.\n");
 				}
@@ -5954,12 +5955,15 @@
 			DELETE(vms->curdir, x, vms->fn, vmu);
 	}
 	ast_unlock_path(vms->curdir);
-#else
+#else /* defined(IMAP_STORAGE) */
 	if (vms->deleted) {
-		for (x=0;x < vmu->maxmsg;x++) { 
-			if (vms->deleted[x]) { 
-				if (option_debug > 2)
-					ast_log(LOG_DEBUG,"IMAP delete of %d\n",x);
+		/* Since we now expunge after each delete, deleting in reverse order
+		 * ensures that no reordering occurs between each step. */
+		for (x = vmu->maxmsg - 1; x >= 0; x--) {
+			if (vms->deleted[x]) {
+				if (option_debug > 2) {
+					ast_log(LOG_DEBUG, "IMAP delete of %d\n", x);
+				}
 				DELETE(vms->curdir, x, vms->fn, vmu);
 			}
 		}
@@ -6886,6 +6890,7 @@
 
 	/* Play voicemail intro - syntax is different for different languages */
 	if (0) {
+		return 0;
 	} else if (!strncasecmp(chan->language, "cs", 2)) {  /* CZECH syntax */
 		return vm_intro_cs(chan, vms);
 	} else if (!strncasecmp(chan->language, "cz", 2)) {  /* deprecated CZECH syntax */
@@ -8146,6 +8151,9 @@
 	}
 
 	res = leave_voicemail(chan, args.argv0, &leave_options);
+	if (res == OPERATOR_EXIT) {
+		res = 0;
+	}
 
 	if (res == ERROR_LOCK_PATH) {
 		ast_log(LOG_ERROR, "Could not leave voicemail. The path is already locked.\n");
@@ -9487,7 +9495,7 @@
 				return 1;
 #endif
 		case '0':
-			if (!ast_test_flag(vmu, VM_OPERATOR)) {
+			if (!ast_test_flag(vmu, VM_OPERATOR) || !outsidecaller) {
 				cmd = ast_play_and_wait(chan, "vm-sorry");
 				break;
 			}

Modified: team/moy/mfcr2-1.4/autoconf/ast_func_fork.m4
URL: http://svnview.digium.com/svn/asterisk/team/moy/mfcr2-1.4/autoconf/ast_func_fork.m4?view=diff&rev=285086&r1=285085&r2=285086
==============================================================================
--- team/moy/mfcr2-1.4/autoconf/ast_func_fork.m4 (original)
+++ team/moy/mfcr2-1.4/autoconf/ast_func_fork.m4 Sun Sep  5 16:49:23 2010
@@ -13,7 +13,7 @@
 fi
 if test "x$ac_cv_func_fork_works" = xcross; then
   case $host in
-    *-*-amigaos* | *-*-msdosdjgpp* | *-*-uclinux* | *-*-linux-uclibc* )
+    *-*-amigaos* | *-*-msdosdjgpp* | *-*-uclinux* )
       # Override, as these systems have only a dummy fork() stub
       ac_cv_func_fork_works=no
       ;;


[... 5911 lines stripped ...]



More information about the svn-commits mailing list