[svn-commits] oej: branch oej/sipregister r46437 - in /team/oej/sipregister: ./ apps/ chann...

svn-commits at lists.digium.com svn-commits at lists.digium.com
Mon Oct 30 09:55:08 MST 2006


Author: oej
Date: Mon Oct 30 10:55:07 2006
New Revision: 46437

URL: http://svn.digium.com/view/asterisk?rev=46437&view=rev
Log:
Resetting this branch.

Added:
    team/oej/sipregister/pbx/ael/ael-test/ael-vtest17/
      - copied from r45351, trunk/pbx/ael/ael-test/ael-vtest17/
    team/oej/sipregister/pbx/ael/ael-test/ael-vtest17/extensions.ael
      - copied unchanged from r45351, trunk/pbx/ael/ael-test/ael-vtest17/extensions.ael
    team/oej/sipregister/pbx/ael/ael-test/ref.ael-vtest17
      - copied unchanged from r45351, trunk/pbx/ael/ael-test/ref.ael-vtest17
Removed:
    team/oej/sipregister/doc/linkedlists.txt
Modified:
    team/oej/sipregister/   (props changed)
    team/oej/sipregister/CREDITS
    team/oej/sipregister/LICENSE
    team/oej/sipregister/Makefile
    team/oej/sipregister/apps/app_chanspy.c
    team/oej/sipregister/apps/app_dial.c
    team/oej/sipregister/apps/app_directed_pickup.c
    team/oej/sipregister/apps/app_playback.c
    team/oej/sipregister/apps/app_rpt.c
    team/oej/sipregister/channels/chan_gtalk.c
    team/oej/sipregister/channels/chan_iax2.c
    team/oej/sipregister/channels/chan_misdn.c
    team/oej/sipregister/channels/chan_sip.c
    team/oej/sipregister/channels/chan_skinny.c
    team/oej/sipregister/channels/misdn/chan_misdn_config.h
    team/oej/sipregister/channels/misdn/isdn_lib.c
    team/oej/sipregister/channels/misdn/isdn_lib.h
    team/oej/sipregister/channels/misdn/isdn_msg_parser.c
    team/oej/sipregister/channels/misdn_config.c
    team/oej/sipregister/codecs/lpc10/analys.c
    team/oej/sipregister/codecs/lpc10/bsynz.c
    team/oej/sipregister/codecs/lpc10/chanwr.c
    team/oej/sipregister/codecs/lpc10/dcbias.c
    team/oej/sipregister/codecs/lpc10/decode.c
    team/oej/sipregister/codecs/lpc10/deemp.c
    team/oej/sipregister/codecs/lpc10/difmag.c
    team/oej/sipregister/codecs/lpc10/dyptrk.c
    team/oej/sipregister/codecs/lpc10/encode.c
    team/oej/sipregister/codecs/lpc10/energy.c
    team/oej/sipregister/codecs/lpc10/ham84.c
    team/oej/sipregister/codecs/lpc10/hp100.c
    team/oej/sipregister/codecs/lpc10/invert.c
    team/oej/sipregister/codecs/lpc10/irc2pc.c
    team/oej/sipregister/codecs/lpc10/ivfilt.c
    team/oej/sipregister/codecs/lpc10/lpcdec.c
    team/oej/sipregister/codecs/lpc10/lpcenc.c
    team/oej/sipregister/codecs/lpc10/lpcini.c
    team/oej/sipregister/codecs/lpc10/lpfilt.c
    team/oej/sipregister/codecs/lpc10/median.c
    team/oej/sipregister/codecs/lpc10/mload.c
    team/oej/sipregister/codecs/lpc10/onset.c
    team/oej/sipregister/codecs/lpc10/pitsyn.c
    team/oej/sipregister/codecs/lpc10/placea.c
    team/oej/sipregister/codecs/lpc10/placev.c
    team/oej/sipregister/codecs/lpc10/preemp.c
    team/oej/sipregister/codecs/lpc10/prepro.c
    team/oej/sipregister/codecs/lpc10/random.c
    team/oej/sipregister/codecs/lpc10/rcchk.c
    team/oej/sipregister/codecs/lpc10/synths.c
    team/oej/sipregister/codecs/lpc10/tbdm.c
    team/oej/sipregister/codecs/lpc10/voicin.c
    team/oej/sipregister/codecs/lpc10/vparms.c
    team/oej/sipregister/configs/misdn.conf.sample
    team/oej/sipregister/configs/sip.conf.sample
    team/oej/sipregister/configure
    team/oej/sipregister/configure.ac
    team/oej/sipregister/funcs/func_logic.c
    team/oej/sipregister/funcs/func_rand.c
    team/oej/sipregister/funcs/func_timeout.c
    team/oej/sipregister/include/asterisk/autoconfig.h.in
    team/oej/sipregister/include/asterisk/utils.h
    team/oej/sipregister/main/acl.c
    team/oej/sipregister/main/db1-ast/Makefile
    team/oej/sipregister/main/dnsmgr.c
    team/oej/sipregister/main/http.c
    team/oej/sipregister/main/manager.c
    team/oej/sipregister/main/netsock.c
    team/oej/sipregister/main/utils.c
    team/oej/sipregister/pbx/ael/ael-test/ref.ael-test3
    team/oej/sipregister/pbx/pbx_ael.c
    team/oej/sipregister/pbx/pbx_dundi.c
    team/oej/sipregister/res/res_jabber.c
    team/oej/sipregister/res/res_speech.c
    team/oej/sipregister/utils/Makefile

Propchange: team/oej/sipregister/
------------------------------------------------------------------------------
    automerge = http://edvina.net/training/

Propchange: team/oej/sipregister/
------------------------------------------------------------------------------
--- branch-1.4-blocked (original)
+++ branch-1.4-blocked Mon Oct 30 10:55:07 2006
@@ -1,1 +1,1 @@
-/branches/1.4:43484,43510,43582,43626,43703,43756,44023
+/branches/1.4:43484,43510,43582,43626,43703,43756,44023,44760,45246,45313-45314

Propchange: team/oej/sipregister/
------------------------------------------------------------------------------
Binary property 'branch-1.4-merged' - no diff available.

Propchange: team/oej/sipregister/
------------------------------------------------------------------------------
--- svnmerge-integrated (original)
+++ svnmerge-integrated Mon Oct 30 10:55:07 2006
@@ -1,1 +1,1 @@
-/trunk:1-44755
+/trunk:1-45352

Modified: team/oej/sipregister/CREDITS
URL: http://svn.digium.com/view/asterisk/team/oej/sipregister/CREDITS?rev=46437&r1=46436&r2=46437&view=diff
==============================================================================
--- team/oej/sipregister/CREDITS (original)
+++ team/oej/sipregister/CREDITS Mon Oct 30 10:55:07 2006
@@ -131,7 +131,7 @@
 Roy Sigurd Karlsbakk - providing funding for generic jitterbuffer development
 	roy at karlsbakk.net, Briiz Telecom AS
 
-Voop A/S, Nuvio Inc and Foniris Telecom A/S - funding for rewrite of SIP transfers
+Voop A/S, Nuvio Inc, Inotel S.A and Foniris Telecom A/S - funding for rewrite of SIP transfers
 
 Philippe Sultan - RADIUS CDR module
 	INRIA, http://www.inria.fr/

Modified: team/oej/sipregister/LICENSE
URL: http://svn.digium.com/view/asterisk/team/oej/sipregister/LICENSE?rev=46437&r1=46436&r2=46437&view=diff
==============================================================================
--- team/oej/sipregister/LICENSE (original)
+++ team/oej/sipregister/LICENSE Mon Oct 30 10:55:07 2006
@@ -4,6 +4,18 @@
 applies to all loadable Asterisk modules used on your system as well,
 except as defined below. The GPL (version 2) is included in this
 source tree in the file COPYING.
+
+This package also includes various components that are not part of
+Asterisk itself; these components are in the 'contrib' directory
+and its subdirectories. Most of these components are also
+distributed under the GPL version 2 as well, except for the following:
+
+contrib/firmware/iax/iaxy.bin:
+	This file is Copyright (C) Digium, Inc. and is licensed for
+	use with Digium IAXy hardware devices only. It can be
+	distributed freely as long as the distribution is in the
+	original form present in this package (not reformatted or
+	modified).
 
 Digium, Inc. (formerly Linux Support Services) holds copyright
 and/or sufficient licenses to all components of the Asterisk

Modified: team/oej/sipregister/Makefile
URL: http://svn.digium.com/view/asterisk/team/oej/sipregister/Makefile?rev=46437&r1=46436&r2=46437&view=diff
==============================================================================
--- team/oej/sipregister/Makefile (original)
+++ team/oej/sipregister/Makefile Mon Oct 30 10:55:07 2006
@@ -309,7 +309,7 @@
 	@ASTCFLAGS="$(MOD_SUBDIR_CFLAGS) $(ASTCFLAGS)" ASTLDFLAGS="$(ASTLDFLAGS)" AST_LIBS="$(AST_LIBS)" $(MAKE) --no-print-directory -C $@ SUBDIR=$@ all
 
 $(OTHER_SUBDIRS):
-	@ASTCFLAGS="$(OTHER_SUBDIR_CFLAGS) $(ASTCFLAGS)" ASTLDFLAGS="$(ASTLDFLAGS)" $(MAKE) --no-print-directory -C $@ SUBDIR=$@ all
+	@ASTCFLAGS="$(OTHER_SUBDIR_CFLAGS) $(ASTCFLAGS)" ASTLDFLAGS="$(ASTLDFLAGS)" AUDIO_LIBS="$(AUDIO_LIBS)" $(MAKE) --no-print-directory -C $@ SUBDIR=$@ all
 
 defaults.h: makeopts
 	@build_tools/make_defaults_h > $@.tmp

Modified: team/oej/sipregister/apps/app_chanspy.c
URL: http://svn.digium.com/view/asterisk/team/oej/sipregister/apps/app_chanspy.c?rev=46437&r1=46436&r2=46437&view=diff
==============================================================================
--- team/oej/sipregister/apps/app_chanspy.c (original)
+++ team/oej/sipregister/apps/app_chanspy.c Mon Oct 30 10:55:07 2006
@@ -268,6 +268,12 @@
 	ast_mutex_init(&csth.spy.lock);
 	csth.volfactor = *volfactor;
 	set_volume(chan, &csth);
+	if (csth.volfactor) {
+		ast_set_flag(&csth.spy, CHANSPY_READ_VOLADJUST);
+		csth.spy.read_vol_adjustment = csth.volfactor;
+		ast_set_flag(&csth.spy, CHANSPY_WRITE_VOLADJUST);
+		csth.spy.write_vol_adjustment = csth.volfactor;
+	}
 	csth.fd = fd;
 	
 	if (start_spying(spyee, chan, &csth.spy)) {
@@ -359,6 +365,15 @@
 				ast_verbose(VERBOSE_PREFIX_3 "Setting spy volume on %s to %d\n", chan->name, *volfactor);
 			csth.volfactor = *volfactor;
 			set_volume(chan, &csth);
+			if (csth.volfactor) {
+				ast_set_flag(&csth.spy, CHANSPY_READ_VOLADJUST);
+				csth.spy.read_vol_adjustment = csth.volfactor;
+				ast_set_flag(&csth.spy, CHANSPY_WRITE_VOLADJUST);
+				csth.spy.write_vol_adjustment = csth.volfactor;
+			} else {
+				ast_clear_flag(&csth.spy, CHANSPY_READ_VOLADJUST);
+				ast_clear_flag(&csth.spy, CHANSPY_WRITE_VOLADJUST);
+			}
 		} else if (res >= '0' && res <= '9') {
 			inp[x++] = res;
 		}

Modified: team/oej/sipregister/apps/app_dial.c
URL: http://svn.digium.com/view/asterisk/team/oej/sipregister/apps/app_dial.c?rev=46437&r1=46436&r2=46437&view=diff
==============================================================================
--- team/oej/sipregister/apps/app_dial.c (original)
+++ team/oej/sipregister/apps/app_dial.c Mon Oct 30 10:55:07 2006
@@ -455,6 +455,8 @@
 						       OPT_CALLEE_MONITOR | OPT_CALLER_MONITOR |
 						       OPT_CALLEE_PARK | OPT_CALLER_PARK |
 						       DIAL_NOFORWARDHTML);
+					ast_copy_string(c->context, "", sizeof(c->context));
+					ast_copy_string(c->exten, "", sizeof(c->exten));
 				}
 				continue;
 			}
@@ -574,6 +576,8 @@
 							       OPT_CALLEE_MONITOR | OPT_CALLER_MONITOR |
 							       OPT_CALLEE_PARK | OPT_CALLER_PARK |
 							       DIAL_NOFORWARDHTML);
+						ast_copy_string(c->context, "", sizeof(c->context));
+						ast_copy_string(c->exten, "", sizeof(c->exten));
 						/* Setup early bridge if appropriate */
 						ast_channel_early_bridge(in, peer);
 					}
@@ -1169,6 +1173,10 @@
 		if (outbound_group)
 			ast_app_group_set_channel(tmp->chan, outbound_group);
 
+		/* Inherit context and extension */
+		ast_copy_string(tmp->chan->context, chan->context, sizeof(tmp->chan->context));
+		ast_copy_string(tmp->chan->exten, chan->exten, sizeof(tmp->chan->exten));
+
 		/* Place the call, but don't wait on the answer */
 		res = ast_call(tmp->chan, numsubst, 0);
 

Modified: team/oej/sipregister/apps/app_directed_pickup.c
URL: http://svn.digium.com/view/asterisk/team/oej/sipregister/apps/app_directed_pickup.c?rev=46437&r1=46436&r2=46437&view=diff
==============================================================================
--- team/oej/sipregister/apps/app_directed_pickup.c (original)
+++ team/oej/sipregister/apps/app_directed_pickup.c Mon Oct 30 10:55:07 2006
@@ -51,103 +51,114 @@
 "  Pickup(extension[@context][&extension2 at context...]): This application can pickup any ringing channel\n"
 "that is calling the specified extension. If no context is specified, the current\n"
 "context will be used. If you use the special string \"PICKUPMARK\" for the context parameter, for example\n"
-"10 at PICKUPMARK, this application tries to find a channel which has defined a channel variable with the same context\n"
+"10 at PICKUPMARK, this application tries to find a channel which has defined a channel variable with the same content\n"
 "as \"extension\".";
 
+/* Perform actual pickup between two channels */
+static int pickup_do(struct ast_channel *chan, struct ast_channel *target)
+{
+	int res = 0;
 
+	if (option_debug)
+		ast_log(LOG_DEBUG, "Call pickup on '%s' by '%s'\n", target->name, chan->name);
+
+	if ((res = ast_answer(chan))) {
+		ast_log(LOG_WARNING, "Unable to answer '%s'\n", chan->name);
+		return -1;
+	}
+
+	if ((res = ast_queue_control(chan, AST_CONTROL_ANSWER))) {
+		ast_log(LOG_WARNING, "Unable to queue answer on '%s'\n", chan->name);
+		return -1;
+	}
+
+	if ((res = ast_channel_masquerade(target, chan))) {
+		ast_log(LOG_WARNING, "Unable to masquerade '%s' into '%s'\n", chan->name, target->name);
+		return -1;
+	}
+
+	return res;
+}
+
+/* Helper function that determines whether a channel is capable of being picked up */
+static int can_pickup(struct ast_channel *chan)
+{
+	if (!chan->pbx && (chan->_state == AST_STATE_RINGING || chan->_state == AST_STATE_RING))
+		return 1;
+	else
+		return 0;
+}
+
+/* Attempt to pick up specified extension with context */
+static int pickup_by_exten(struct ast_channel *chan, char *exten, char *context)
+{
+	int res = -1;
+	struct ast_channel *target = NULL;
+
+	while ((target = ast_channel_walk_locked(target))) {
+		if (!strcasecmp(target->exten, exten) &&
+		    !strcasecmp(target->context, context) &&
+		    can_pickup(target)) {
+			res = pickup_do(chan, target);
+			ast_channel_unlock(target);
+			break;
+		}
+		ast_channel_unlock(target);
+	}
+
+	return res;
+}
+
+/* Attempt to pick up specified mark */
+static int pickup_by_mark(struct ast_channel *chan, char *mark)
+{
+	int res = -1;
+	const char *tmp = NULL;
+	struct ast_channel *target = NULL;
+
+	while ((target = ast_channel_walk_locked(target))) {
+		if ((tmp = pbx_builtin_getvar_helper(target, PICKUPMARK)) &&
+		    !strcasecmp(tmp, mark) &&
+		    can_pickup(target)) {
+			res = pickup_do(chan, target);
+			ast_channel_unlock(target);
+			break;
+		}
+		ast_channel_unlock(target);
+	}
+
+	return res;
+}
+
+/* Main application entry point */
 static int pickup_exec(struct ast_channel *chan, void *data)
 {
 	int res = 0;
 	struct ast_module_user *u = NULL;
-	struct ast_channel *origin = NULL, *target = NULL;
-	char *tmp = NULL, *exten = NULL, *context = NULL, *rest=data;
-	char workspace[256] = "";
-	const char *tmp2 = NULL;
+	char *tmp = ast_strdupa(data);
+	char *exten = NULL, *context = NULL;
 
 	if (ast_strlen_zero(data)) {
-		ast_log(LOG_WARNING, "Pickup requires an argument (extension) !\n");
+		ast_log(LOG_WARNING, "Pickup requires an argument (extension)!\n");
 		return -1;	
 	}
 
 	u = ast_module_user_add(chan);
 	
-	while (!target && (exten = rest) ) {
-		res = 0;
-		rest = strchr(exten, '&');
-		if (rest)
-			*rest++ = 0;
+	/* Parse extension (and context if there) */
+	while (!ast_strlen_zero(tmp) && (exten = strsep(&tmp, "&"))) {
+		if ((context = strchr(exten, '@')))
+			*context++ = '\0';
+		if (context && !strcasecmp(context, PICKUPMARK)) {
+			if (!pickup_by_mark(chan, exten))
+				break;
+		} else {
+			if (!pickup_by_exten(chan, exten, context ? context : chan->context))
+				break;
+		}
+		ast_log(LOG_NOTICE, "No target channel found for %s.\n", exten);
+	}
 
-		/* Get the extension and context if present */
-		context = strchr(exten, '@');
-		if (context)
-			*context++ = '\0';
-
-		/* If the context is the pickup mark, iterate through all channels finding the right origin one */
-		if (context && !strcmp(context, PICKUPMARK)) {
-			while ((origin = ast_channel_walk_locked(origin))) {
-				if (origin) {
-					tmp2 = pbx_builtin_getvar_helper(origin, PICKUPMARK);
-					if (tmp2 && !strcmp(tmp2, exten))
-						break;
-					ast_mutex_unlock(&origin->lock);
-				}
-			}
-		} else {
-			/* Use the classic mode of searching */
-			origin = ast_get_channel_by_exten_locked(exten, context);
-		}
-
-		if (origin) {
-			ast_cdr_getvar(origin->cdr, "dstchannel", &tmp, workspace,
-					sizeof(workspace), 0, 0);
-			if (tmp) {
-				/* We have a possible channel... now we need to find it! */
-				target = ast_get_channel_by_name_locked(tmp);
-			} else {
-				ast_log(LOG_NOTICE, "No target channel found for %s.\n", exten);
-				res = -1;
-			}
-			ast_mutex_unlock(&origin->lock);
-
-		} else {
-			if (option_debug)
-				ast_log(LOG_DEBUG, "No originating channel found.\n");
-		}
-
-		if (res)
-			continue;
-
-		if (target && (!target->pbx) && ((target->_state == AST_STATE_RINGING) || (target->_state == AST_STATE_RING) ) ) {
-			if (option_debug)
-				ast_log(LOG_DEBUG, "Call pickup on chan '%s' by '%s'\n", target->name,
-					chan->name);
-			res = ast_answer(chan);
-			if (res) {
-				ast_log(LOG_WARNING, "Unable to answer '%s'\n", chan->name);
-				res = -1;
-				break;
-			}
-			res = ast_queue_control(chan, AST_CONTROL_ANSWER);
-			if (res) {
-				ast_log(LOG_WARNING, "Unable to queue answer on '%s'\n",
-						chan->name);
-				res = -1;
-				break;
-			}
-			res = ast_channel_masquerade(target, chan);
-			if (res) {
-				ast_log(LOG_WARNING, "Unable to masquerade '%s' into '%s'\n", chan->name, target->name);
-				res = -1;
-				break;
-			}
-		} else {
-			ast_log(LOG_NOTICE, "No call pickup possible for %s...\n", exten);
-			res = -1;
-		}
-	}
-	if (target) 
-		ast_mutex_unlock(&target->lock);
-	
 	ast_module_user_remove(u);
 
 	return res;

Modified: team/oej/sipregister/apps/app_playback.c
URL: http://svn.digium.com/view/asterisk/team/oej/sipregister/apps/app_playback.c?rev=46437&r1=46436&r2=46437&view=diff
==============================================================================
--- team/oej/sipregister/apps/app_playback.c (original)
+++ team/oej/sipregister/apps/app_playback.c Mon Oct 30 10:55:07 2006
@@ -155,6 +155,9 @@
 	ast_log(LOG_WARNING, "string <%s> depth <%d>\n", s, depth);
 	if (depth++ > 10) {
 		ast_log(LOG_WARNING, "recursion too deep, exiting\n");
+		return -1;
+	} else if (!say_cfg) {
+		ast_log(LOG_WARNING, "no say.conf, cannot spell '%s'\n", s);
 		return -1;
 	}
 
@@ -253,11 +256,6 @@
         int audiofd, int ctrlfd)
 {
         say_args_t a = { chan, ints, lang, audiofd, ctrlfd };
-  
-        if (!say_cfg) {
-                ast_log(LOG_WARNING, "no say.conf, cannot spell '%s'\n", string);
-                return -1;   
-        }
         return do_say(&a, string, options, 0);
 }
 

Modified: team/oej/sipregister/apps/app_rpt.c
URL: http://svn.digium.com/view/asterisk/team/oej/sipregister/apps/app_rpt.c?rev=46437&r1=46436&r2=46437&view=diff
==============================================================================
--- team/oej/sipregister/apps/app_rpt.c (original)
+++ team/oej/sipregister/apps/app_rpt.c Mon Oct 30 10:55:07 2006
@@ -934,7 +934,7 @@
 		int savearea = (char *)&rpt_vars[n].p - (char *)&rpt_vars[n];
 
 		cp = (char *) &rpt_vars[n].p;
-		memset(cp + sizeof(rpt_vars[n].p),0,
+		memset(cp + sizeof(rpt_vars[n].p), 0,
 			sizeof(rpt_vars[n]) - (sizeof(rpt_vars[n].p) + savearea));
 		rpt_vars[n].tele.next = &rpt_vars[n].tele;
 		rpt_vars[n].tele.prev = &rpt_vars[n].tele;
@@ -1046,7 +1046,7 @@
 			strs.argc &= ~1; /* force an even number, rounded down */
 			if (strs.argc >= 2) {
 				for (j = 0; j < strs.argc; j += 2) {
-					rpt_mknotch(atof(strs.str[j]),atof(strs.str[j + 1]),
+					rpt_mknotch(atof(strs.str[j]), atof(strs.str[j + 1]),
 						&rpt_vars[n].filters[j >> 1].gain,
 						&rpt_vars[n].filters[j >> 1].const0,
 						&rpt_vars[n].filters[j >> 1].const1,
@@ -1138,7 +1138,7 @@
 	for (i = 0; i < nrpts; i++) {
 		if (!strcmp(argv[2], rpt_vars[i].name)) {
 			rpt_vars[i].disgorgetime = time(NULL) + 10; /* Do it 10 seconds later */
-			ast_cli(fd, "app_rpt struct dump requested for node %s\n",argv[2]);
+			ast_cli(fd, "app_rpt struct dump requested for node %s\n", argv[2]);
 			return RESULT_SUCCESS;
 		}
 	}
@@ -1331,7 +1331,7 @@
 	int i, j;
 	struct rpt *myrpt;
 	struct rpt_link *l;
-	struct rpt_lstat *s,*t;
+	struct rpt_lstat *s, *t;
 	struct rpt_lstat s_head;
 	if (argc != 3)
 		return RESULT_SHOWUSAGE;
@@ -1683,7 +1683,7 @@
 	return res;
 }
 
-static int saycharstr(struct ast_channel *mychannel,char *str)
+static int saycharstr(struct ast_channel *mychannel, char *str)
 {
 	int	res;
 
@@ -1850,7 +1850,7 @@
 	if (debug)
 		ast_log(LOG_NOTICE, " Delay interval = %d\n", interval);
 	if (interval)
-		ast_safe_sleep(chan,interval);
+		ast_safe_sleep(chan, interval);
 	if (debug)
 		ast_log(LOG_NOTICE, "Delay complete\n");
 	return;
@@ -1920,7 +1920,7 @@
 	case ID:
 	case ID1:
 		/* wait a bit */
-		wait_interval(myrpt, (mytele->mode == ID) ? DLY_ID : DLY_TELEM,mychannel);
+		wait_interval(myrpt, (mytele->mode == ID) ? DLY_ID : DLY_TELEM, mychannel);
 		res = telem_any(myrpt, mychannel, myrpt->p.ident); 
 		imdone=1;	
 		break;
@@ -2054,7 +2054,7 @@
 			rpt_mutex_unlock(&myrpt->lock);
 		}
 		if (haslink) {
-			res = telem_lookup(myrpt,mychannel, myrpt->name, (!hastx) ? "remotemon" : "remotetx");
+			res = telem_lookup(myrpt, mychannel, myrpt->name, (!hastx) ? "remotemon" : "remotetx");
 			if (res)
 				ast_log(LOG_WARNING, "telem_lookup:remotexx failed on %s\n", mychannel->name);
 
@@ -2104,7 +2104,7 @@
 			ci.confno = myrpt->txconf;
 			ci.confmode = ZT_CONF_CONFANN;
 			/* first put the channel on the conference in announce mode */
-			if (ioctl(mychannel->fds[0],ZT_SETCONF,&ci) == -1) {
+			if (ioctl(mychannel->fds[0], ZT_SETCONF, &ci) == -1) {
 				ast_log(LOG_WARNING, "Unable to set conference mode to Announce\n");
 				rpt_mutex_lock(&myrpt->lock);
 				remque((struct qelem *)mytele);
@@ -2404,7 +2404,7 @@
 		if ((res = ast_tonepair_start(mychannel, 1004.0, 0, 99999999, 7200.0))) 
 			break;
 		while (mychannel->generatordata && (!myrpt->stopgen)) {
-			if (ast_safe_sleep(mychannel,1)) break;
+			if (ast_safe_sleep(mychannel, 1)) break;
 			imdone = 1;
 		}
 		break;
@@ -2447,7 +2447,7 @@
 	pthread_exit(NULL);
 }
 
-static void rpt_telemetry(struct rpt *myrpt,int mode, void *data)
+static void rpt_telemetry(struct rpt *myrpt, int mode, void *data)
 {
 	struct rpt_tele *tele;
 	struct rpt_link *mylink = (struct rpt_link *) data;
@@ -2714,7 +2714,7 @@
 	pthread_exit(NULL);
 }
 
-static void send_link_dtmf(struct rpt *myrpt,char c)
+static void send_link_dtmf(struct rpt *myrpt, char c)
 {
 	char str[300];
 	struct ast_frame wf;
@@ -2735,10 +2735,10 @@
 			continue;
 		}
 		/* if we found it, write it and were done */
-		if (!strcmp(l->name,myrpt->cmdnode)) {
+		if (!strcmp(l->name, myrpt->cmdnode)) {
 			wf.data = ast_strdup(str);
 			if (l->chan)
-				ast_write(l->chan,&wf);
+				ast_write(l->chan, &wf);
 			return;
 		}
 		l = l->next;
@@ -2942,7 +2942,7 @@
 		return DC_COMPLETE;
 	case 3: /* Link transceive */
 		if ((digitbuf[0] == '0') && (myrpt->lastlinknode[0]))
-			strcpy(digitbuf,myrpt->lastlinknode);
+			strcpy(digitbuf, myrpt->lastlinknode);
 		val = ast_variable_retrieve(myrpt->cfg, myrpt->p.nodes, digitbuf);
 		if (!val) {
 			if (strlen(digitbuf) >= myrpt->longestnode)
@@ -3066,7 +3066,7 @@
 			return DC_COMPLETE;
 		}
 		if ((digitbuf[0] == '0') && (myrpt->lastlinknode[0]))
-			strcpy(digitbuf,myrpt->lastlinknode);
+			strcpy(digitbuf, myrpt->lastlinknode);
 		/* node must at least exist in list */
 		val = ast_variable_retrieve(myrpt->cfg, myrpt->p.nodes, digitbuf);
 		if (!val) {
@@ -3463,7 +3463,7 @@
 				if (strcmp(l->name, src)) {
 					wf.data = ast_strdup(str);
 					if (l->chan)
-						ast_write(l->chan,&wf);
+						ast_write(l->chan, &wf);
 				}
 				return;
 			}
@@ -3482,7 +3482,7 @@
 				continue;
 			}
 			/* send, but not to src */
-			if (strcmp(l->name,src)) {
+			if (strcmp(l->name, src)) {
 				wf.data = ast_strdup(str);
 				if (l->chan)
 					ast_write(l->chan, &wf);
@@ -3631,7 +3631,7 @@
 				break;
 		    case 2:
 				res = collect_function_digits(myrpt, cmd, 
-					SOURCE_DPHONE,mylink);
+					SOURCE_DPHONE, mylink);
 				break;
 		    default:
 				res = collect_function_digits(myrpt, cmd, 
@@ -3864,7 +3864,7 @@
 	r.data = ZT_RADPAR_REM_RBI1;
 	/* if setparam ioctl fails, its probably not a pciradio card */
 	if (ioctl(myrpt->rxchannel->fds[0], ZT_RADIO_SETPARAM, &r) == -1) {
-		rbi_out_parallel(myrpt,data);
+		rbi_out_parallel(myrpt, data);
 		return;
 	}
 	r.radpar = ZT_RADPAR_REMCOMMAND;
@@ -3906,7 +3906,7 @@
 		return -1;
 	if (rxbuf) {
 		*rxbuf = 0;
-		memcpy(rxbuf,prm.buf,prm.index);
+		memcpy(rxbuf, prm.buf, prm.index);
 	}
 	return(prm.index);
 }
@@ -5445,7 +5445,7 @@
 }
 
 /* 0 return=continue, 1 return = break, -1 return = error */
-static void local_dtmf_helper(struct rpt *myrpt,char c)
+static void local_dtmf_helper(struct rpt *myrpt, char c)
 {
 	int	res;
 	pthread_attr_t attr;
@@ -5475,7 +5475,7 @@
 	rpt_mutex_lock(&myrpt->lock);
 	if (myrpt->cmdnode[0]) {
 		rpt_mutex_unlock(&myrpt->lock);
-		send_link_dtmf(myrpt,c);
+		send_link_dtmf(myrpt, c);
 		return;
 	}
 	if (!myrpt->p.simple) {
@@ -5618,11 +5618,11 @@
 	struct rpt *myrpt = (struct rpt *)this;
 	char *tele, c;
 	const char *idtalkover;
-	int ms = MSWAIT,i, lasttx=0, val, remrx=0, identqueued, othertelemqueued, tailmessagequeued, ctqueued;
+	int ms = MSWAIT, i, lasttx=0, val, remrx=0, identqueued, othertelemqueued, tailmessagequeued, ctqueued;
 	struct ast_channel *who;
 	ZT_CONFINFO ci;  /* conference info */
 	time_t t;
-	struct rpt_link *l,*m;
+	struct rpt_link *l, *m;
 	struct rpt_tele *telem;
 	char tmpstr[300];
 
@@ -6029,7 +6029,7 @@
 		/* If user or links key up or are keyed up over standard ID, switch to talkover ID, if one is defined */
 		/* If tail message, kill the message if someone keys up over it */ 
 		if ((myrpt->keyed || remrx) && ((identqueued && idtalkover) || (tailmessagequeued))) {
-			int hasid = 0,hastalkover = 0;
+			int hasid = 0, hastalkover = 0;
 
 			telem = myrpt->tele.next;
 			while (telem != &myrpt->tele) {
@@ -6954,7 +6954,7 @@
 				}
 				memcpy(&ia, hp->h_addr, sizeof(in_addr_t));
 				ast_copy_string(nodeip, ast_inet_ntoa(ia), sizeof(nodeip));
-				if (strcmp(hisip,nodeip)) {
+				if (strcmp(hisip, nodeip)) {
 					ast_log(LOG_WARNING, "Node %s IP %s does not match link IP %s!!\n", chan->cid.cid_num, nodeip, hisip);
 					return -1;
 				}
@@ -7298,7 +7298,7 @@
 				}
 				if (myrpt->hfscanstatus < 0) {
 					if (myrpt->hfscanstatus == -1) {
-						if (ast_safe_sleep(myrpt->remchannel,1000) == -1)
+						if (ast_safe_sleep(myrpt->remchannel, 1000) == -1)
 							break;
 					}
 					sayfile(myrpt->remchannel, "rpt/stop");

Modified: team/oej/sipregister/channels/chan_gtalk.c
URL: http://svn.digium.com/view/asterisk/team/oej/sipregister/channels/chan_gtalk.c?rev=46437&r1=46436&r2=46437&view=diff
==============================================================================
--- team/oej/sipregister/channels/chan_gtalk.c (original)
+++ team/oej/sipregister/channels/chan_gtalk.c Mon Oct 30 10:55:07 2006
@@ -879,10 +879,11 @@
 	if(strchr(tmp->us, '/')) {
 		data = ast_strdupa((char *) tmp->us);
 		exten = strsep(&data, "/");
-		free(data);
 	} else
 		exten = tmp->us;
 	ast_copy_string(tmp->exten,  exten, sizeof(tmp->exten));
+	if(data)
+		free(data);
 	ast_mutex_init(&tmp->lock);
 	ast_mutex_lock(&gtalklock);
 	tmp->next = client->p;

Modified: team/oej/sipregister/channels/chan_iax2.c
URL: http://svn.digium.com/view/asterisk/team/oej/sipregister/channels/chan_iax2.c?rev=46437&r1=46436&r2=46437&view=diff
==============================================================================
--- team/oej/sipregister/channels/chan_iax2.c (original)
+++ team/oej/sipregister/channels/chan_iax2.c Mon Oct 30 10:55:07 2006
@@ -1674,14 +1674,10 @@
 static int iax2_predestroy(int callno)
 {
 	struct ast_channel *c = NULL;
-	struct chan_iax2_pvt *pvt = NULL;
-
-	ast_mutex_lock(&iaxsl[callno]);
-
-	if (!(pvt = iaxs[callno])) {
-		ast_mutex_unlock(&iaxsl[callno]);
+	struct chan_iax2_pvt *pvt = iaxs[callno];
+
+	if (!pvt)
 		return -1;
-	}
 
 	if (!ast_test_flag(pvt, IAX_ALREADYGONE)) {
 		iax2_destroy_helper(pvt);
@@ -1697,8 +1693,6 @@
 		ast_update_use_count();
 	}
 
-	ast_mutex_unlock(&iaxsl[callno]);
-
 	return 0;
 }
 
@@ -1709,7 +1703,6 @@
 	struct ast_channel *owner = NULL;
 
 retry:
-	ast_mutex_lock(&iaxsl[callno]);
 	pvt = iaxs[callno];
 	gettimeofday(&lastused[callno], NULL);
 	
@@ -1720,6 +1713,7 @@
 			ast_log(LOG_NOTICE, "Avoiding IAX destroy deadlock\n");
 			ast_mutex_unlock(&iaxsl[callno]);
 			usleep(1);
+			ast_mutex_lock(&iaxsl[callno]);
 			goto retry;
 		}
 	}
@@ -1764,7 +1758,6 @@
 	if (owner) {
 		ast_mutex_unlock(&owner->lock);
 	}
-	ast_mutex_unlock(&iaxsl[callno]);
 	if (callno & 0x4000)
 		update_max_trunk();
 }
@@ -2887,6 +2880,9 @@
 		iaxs[callno]->pingtime = autokill / 2;
 		iaxs[callno]->initid = ast_sched_add(sched, autokill * 2, auto_congest, CALLNO_TO_PTR(callno));
 	}
+
+	/* send the command using the appropriate socket for this peer */
+	iaxs[callno]->sockfd = cai.sockfd;
 
 	/* Transmit the string in a "NEW" request */
 	send_command(iaxs[callno], AST_FRAME_IAX, IAX_COMMAND_NEW, 0, ied.buf, ied.pos, -1);

Modified: team/oej/sipregister/channels/chan_misdn.c
URL: http://svn.digium.com/view/asterisk/team/oej/sipregister/channels/chan_misdn.c?rev=46437&r1=46436&r2=46437&view=diff
==============================================================================
--- team/oej/sipregister/channels/chan_misdn.c (original)
+++ team/oej/sipregister/channels/chan_misdn.c Mon Oct 30 10:55:07 2006
@@ -130,12 +130,18 @@
 	MISDN_HUNGUP_FROM_AST, /*!< when DISCONNECT/RELEASE/REL_COMP came out of */
 	/* misdn_hangup */
 	MISDN_HOLDED, /*!< if this chan is holded */
-	MISDN_HOLD_DISCONNECT /*!< if this chan is holded */
+	MISDN_HOLD_DISCONNECT, /*!< if this chan is holded */
+	MISDN_FIXUP/*!< if this chan is holded */
   
 };
 
 #define ORG_AST 1
 #define ORG_MISDN 2
+
+struct hold_info {
+	int port;
+	int channel;
+};
 
 struct chan_list {
   
@@ -180,7 +186,8 @@
 	int dummy;
   
 	struct misdn_bchannel *bc;
-	struct misdn_bchannel *holded_bc;
+
+	struct hold_info hold_info;
 
 	unsigned int l3id;
 	int addr;
@@ -345,6 +352,13 @@
 
 
 static int update_ec_config(struct misdn_bchannel *bc);
+
+
+
+
+/*protos*/ 
+
+int chan_misdn_jb_empty ( struct misdn_bchannel *bc, char *buf, int len); 
 
 /*************** Helpers *****************/
 
@@ -915,6 +929,7 @@
 	{MISDN_HUNGUP_FROM_MISDN,"HUNGUP_FROM_MISDN"}, /* when DISCONNECT/RELEASE/REL_COMP  cam from misdn */
 	{MISDN_HOLDED,"HOLDED"}, /* when DISCONNECT/RELEASE/REL_COMP  cam from misdn */
 	{MISDN_HOLD_DISCONNECT,"HOLD_DISCONNECT"}, /* when DISCONNECT/RELEASE/REL_COMP  cam from misdn */
+	{MISDN_FIXUP,"FIXUP"}, /**/
 	{MISDN_HUNGUP_FROM_AST,"HUNGUP_FROM_AST"} /* when DISCONNECT/RELEASE/REL_COMP came out of */
 	/* misdn_hangup */
 };
@@ -988,7 +1003,7 @@
 			"  --> capability: %s\n"
 			"  --> echo_cancel: %d\n"
 			"  --> notone : rx %d tx:%d\n"
-			"  --> bc_hold: %d holded_bc :%d\n",
+			"  --> bc_hold: %d\n",
 			help->ast->name,
 			help->l3id,
 			help->addr,
@@ -1002,7 +1017,7 @@
 			bc->ec_enable,
 
 			help->norxtone,help->notxtone,
-			bc->holded, help->holded_bc?1:0
+			bc->holded
 			);
   
 }
@@ -1019,11 +1034,23 @@
 		if (misdn_debug[0] > 2) ast_cli(fd, "Bc:%p Ast:%p\n", bc, ast);
 		if (bc) {
 			print_bc_info(fd, help, bc);
-		} else if ( (bc=help->holded_bc) ) {
-			chan_misdn_log(0, 0, "ITS A HOLDED BC:\n");
-			print_bc_info(fd, help,  bc);
 		} else {
-			ast_cli(fd,"* Channel in unknown STATE !!! Exten:%s, Callerid:%s\n", ast->exten, AST_CID_P(ast));
+			if (help->state == MISDN_HOLDED) {
+				chan_misdn_log(0, 0, "ITS A HOLDED BC:\n");
+				chan_misdn_log(0,0," --> l3_id: %x\n"
+						" --> dad:%s oad:%s\n"
+						" --> hold_port: %d\n"
+						" --> hold_channel: %d\n"
+				
+						,help->l3id
+						,ast->exten
+						,AST_CID_P(ast)
+						,help->hold_info.port
+						,help->hold_info.channel
+						);
+			} else {
+				ast_cli(fd,"* Channel in unknown STATE !!! Exten:%s, Callerid:%s\n", ast->exten, AST_CID_P(ast));
+			}
 		}
 	}
   
@@ -2077,7 +2104,7 @@
 	chan_misdn_log(1, p->bc?p->bc->port:0, "* IND: Got Fixup State:%s L3id:%x\n", misdn_get_ch_state(p), p->l3id);
 	
 	p->ast = ast ;
-	p->state=MISDN_CONNECTED;
+	p->state=MISDN_FIXUP;
   
 	return 0;
 }
@@ -2235,10 +2262,6 @@
 	
 	bc=p->bc;
 
-	if (!bc) {
-		ast_log(LOG_WARNING,"Hangup with private but no bc ?\n");
-		return 0;
-	}
 
 	
 	MISDN_ASTERISK_TECH_PVT(ast)=NULL;
@@ -2246,7 +2269,13 @@
 
 	bc=p->bc;
 	
-	if (ast->_state == AST_STATE_RESERVED || p->state == MISDN_NOTHING) {
+	if (ast->_state == AST_STATE_RESERVED || 
+		p->state == MISDN_NOTHING || 
+		p->state == MISDN_HOLDED || 
+		p->state == MISDN_FIXUP || 
+		p->state == MISDN_HOLD_DISCONNECT ) {
+
+		CLEAN_CH:
 		/* between request and call */
 		if (option_debug)
 			ast_log(LOG_DEBUG, "State Reserved (or nothing) => chanIsAvail\n");
@@ -2262,6 +2291,12 @@
 		
 		return 0;
 	}
+
+	if (!bc) {
+		ast_log(LOG_WARNING,"Hangup with private but no bc ? state:%s l3id:%x\n", misdn_get_ch_state(p), p->l3id);
+		goto CLEAN_CH;
+	}
+
 
 	p->need_hangup=0;
 	p->need_queue_hangup=0;
@@ -2480,6 +2515,7 @@
 	tmp->frame.samples = len;
 	tmp->frame.mallocd = 0;
 	tmp->frame.offset = 0;
+	tmp->frame.delivery= ast_tv(0,0) ;
 	tmp->frame.src = NULL;
 	tmp->frame.data = tmp->ast_rd_buf;
 
@@ -2520,17 +2556,17 @@
 	int i  = 0;
 	
 	if (!ast || ! (ch=MISDN_ASTERISK_TECH_PVT(ast)) ) return -1;
+
+	if (ch->state == MISDN_HOLDED) {
+		chan_misdn_log(7, 0, "misdn_write: Returning because holded\n");
+		return 0;
+	}
 	
 	if (!ch->bc ) {
 		ast_log(LOG_WARNING, "private but no bc\n");
 		return -1;
 	}
 	
-	if (ch->state == MISDN_HOLDED) {
-		chan_misdn_log(7, ch->bc->port, "misdn_write: Returning because holded\n");
-		return 0;
-	}
-	
 	if (ch->notxtone) {
 		chan_misdn_log(7, ch->bc->port, "misdn_write: Returning because notxone\n");
 		return 0;
@@ -2577,7 +2613,7 @@
 			break;
 		default:
 		if (!ch->dropped_frame_cnt)
-			chan_misdn_log(5, ch->bc->port, "BC not active (nor bridged) droping: %d frames addr:%x exten:%s cid:%s ch->state:%s bc_state:%d\n",frame->samples,ch->bc->addr, ast->exten, ast->cid.cid_num,misdn_get_ch_state( ch), ch->bc->bc_state);
+			chan_misdn_log(5, ch->bc->port, "BC not active (nor bridged) droping: %d frames addr:%x exten:%s cid:%s ch->state:%s bc_state:%d l3id:%x\n",frame->samples,ch->bc->addr, ast->exten, ast->cid.cid_num,misdn_get_ch_state( ch), ch->bc->bc_state, ch->bc->l3_id);
 		
 		ch->dropped_frame_cnt++;
 		if (ch->dropped_frame_cnt > 100) {
@@ -2627,7 +2663,6 @@
 
 	carr[0]=c0;
 	carr[1]=c1;
-  
   
 	if (ch1 && ch2 ) ;
 	else
@@ -2652,7 +2687,6 @@
 			ch2->bc->ec_enable=0;
 			manager_ec_disable(ch2->bc); 
 		}
-		
 		/* trying to make a mISDN_dsp conference */
 		chan_misdn_log(1, ch1->bc->port, "I SEND: Making conference with Number:%d\n", ch1->bc->pid +1);
 
@@ -2702,7 +2736,11 @@
 			break;
 		}
 		
-		
+		if (f->frametype == AST_FRAME_VOICE) {
+			chan_misdn_log(1,0,"Got Voice frame in Bridged state..\n");
+			continue;
+		}
+
 		if (who == c0) {
 			ast_write(c1,f);
 		}
@@ -2905,7 +2943,7 @@
 						
 						
 						if ( port_up>0 )	{
-							newbc = misdn_lib_get_free_bc(port, robin_channel);
+							newbc = misdn_lib_get_free_bc(port, robin_channel,0);
 							if (newbc) {
 								chan_misdn_log(4, port, " Success! Found port:%d channel:%d\n", newbc->port, newbc->channel);
 								if (port_up)
@@ -2939,7 +2977,7 @@
 					chan_misdn_log(4, port, "portup:%d\n", port_up);
 					
 					if ( port_up>0 ) {
-						newbc = misdn_lib_get_free_bc(port, 0);
+						newbc = misdn_lib_get_free_bc(port, 0, 0);
 						if (newbc)
 							break;
 					}
@@ -2950,7 +2988,7 @@
 	} else {
 		if (channel)
 			chan_misdn_log(1, port," --> preselected_channel: %d\n",channel);
-		newbc = misdn_lib_get_free_bc(port, channel);
+		newbc = misdn_lib_get_free_bc(port, channel, 0);
 	}
 	
 	if (!newbc) {
@@ -3134,7 +3172,7 @@
 {
 	struct chan_list *help=list;
 	for (;help; help=help->next) {
-		if (help->bc->pid == pid) return help;
+		if ( help->bc && (help->bc->pid == pid) ) return help;
 	}
   
 	chan_misdn_log(6, 0, "$$$ find_chan: No channel found for pid:%d\n",pid);
@@ -3148,13 +3186,29 @@
 	
 	chan_misdn_log(6, bc->port, "$$$ find_holded: channel:%d oad:%s dad:%s\n",bc->channel, bc->oad,bc->dad);
 	for (;help; help=help->next) {
-		chan_misdn_log(4, bc->port, "$$$ find_holded: --> holded:%d channel:%d\n",help->bc->holded, help->bc->channel);
-		if (help->bc->port == bc->port
-		    && help->bc->holded ) return help;
-	}
-	
+		chan_misdn_log(4, bc->port, "$$$ find_holded: --> holded:%d channel:%d\n",help->state==MISDN_HOLDED, help->hold_info.channel);
+		if ( 	(help->state == MISDN_HOLDED) && 
+			(help->hold_info.port == bc->port) ) 
+			return help;
+	}	
 	chan_misdn_log(6, bc->port, "$$$ find_chan: No channel found for oad:%s dad:%s\n",bc->oad,bc->dad);
   
+	return NULL;
+}
+
+
+static struct chan_list *find_holded_l3(struct chan_list *list, unsigned long l3_id, int w) 
+
+{
+	struct chan_list *help=list;
+
+	for (;help; help=help->next) {
+		if ( (help->state == MISDN_HOLDED) &&
+			 (help->l3id == l3_id)   
+			) 
+			return help;
+	}
+
 	return NULL;
 }
 
@@ -3226,16 +3280,17 @@
 
 static void hangup_chan(struct chan_list *ch)
 {
+	int port=ch?ch->bc?ch->bc->port:0:0;
 	if (!ch) {
 		cb_log(1,0,"Cannot hangup chan, no ch\n");
 		return;
 	}
 
-	cb_log(1,ch->bc?ch->bc->port:0,"hangup_chan\n");
+	cb_log(1,port,"hangup_chan\n");
 
 	if (ch->need_hangup) 
 	{
-		cb_log(1,ch->bc->port,"-> hangup\n");
+		cb_log(1,port,"-> hangup\n");
 		send_cause2ast(ch->ast,ch->bc,ch);
 		ch->need_hangup=0;
 		ch->need_queue_hangup=0;
@@ -3245,7 +3300,7 @@
 	}
 
 	if (!ch->need_queue_hangup) {
-		cb_log(1,ch->bc->port,"No need to queue hangup\n");
+		cb_log(1,port,"No need to queue hangup\n");
 	}
 
 	ch->need_queue_hangup=0;
@@ -3254,9 +3309,9 @@
 
 		if (ch->ast)
 			ast_queue_hangup(ch->ast);
-		cb_log(1,ch->bc->port,"-> queue_hangup\n");
+		cb_log(1,port,"-> queue_hangup\n");
 	} else {
-		cb_log(1,ch->bc->port,"Cannot hangup chan, no ast\n");
+		cb_log(1,port,"Cannot hangup chan, no ast\n");
 	}
 }
 
@@ -3266,7 +3321,7 @@
 	{
 		struct chan_list *ch=find_chan_by_bc(cl_te, bc);
 		if (!ch)  {
-			chan_misdn_log(0, bc->port, "release_chan: Ch not found!\n");
+			chan_misdn_log(1, bc->port, "release_chan: Ch not found!\n");
 			return;
 		}
 		
@@ -3337,7 +3392,7 @@
 	ast_moh_stop(AST_BRIDGED_P(holded_chan->ast));
 
 	holded_chan->state=MISDN_CONNECTED;
-	misdn_lib_transfer(holded_chan->bc?holded_chan->bc:holded_chan->holded_bc);
+	//misdn_lib_transfer(holded_chan->bc);
 	ast_channel_masquerade(holded_chan->ast, AST_BRIDGED_P(tmp_ch->ast));
 }
 
@@ -3395,6 +3450,7 @@
 		fr.samples = 0 ;
 		fr.mallocd =0 ;
 		fr.offset= 0 ;
+		fr.delivery= ast_tv(0,0) ;
 
 		if (ch->ast && MISDN_ASTERISK_PVT(ch->ast) && MISDN_ASTERISK_TECH_PVT(ch->ast)) {
 			ast_queue_frame(ch->ast, &fr);
@@ -3636,6 +3692,7 @@
 		fr.samples = 0 ;
 		fr.mallocd =0 ;
 		fr.offset= 0 ;
+		fr.delivery= ast_tv(0,0) ;
 		
 		if (!ch->ignore_dtmf) {
 			chan_misdn_log(2, bc->port, " --> DTMF:%c\n", bc->dtmf);
@@ -3658,6 +3715,12 @@
 		
 		if (ch->state == MISDN_WAITING4DIGS ) {
 			/*  Ok, incomplete Setup, waiting till extension exists */
+
+			if (ast_strlen_zero(bc->info_dad) && ! ast_strlen_zero(bc->keypad)) {
+				chan_misdn_log(1, bc->port, " --> using keypad as info\n");
+				strcpy(bc->info_dad,bc->keypad);
+			}
+
 			{
 				int l = sizeof(bc->dad);
 				strncat(bc->dad,bc->info_dad, l);
@@ -3738,6 +3801,7 @@
 			fr.samples = 0 ;
 			fr.mallocd =0 ;
 			fr.offset= 0 ;
+			fr.delivery= ast_tv(0,0) ;
 
 			
 			int digits;
@@ -3762,9 +3826,15 @@
 	case EVENT_SETUP:
 	{
 		struct chan_list *ch=find_chan_by_bc(cl_te, bc);
-		if (ch && ch->state != MISDN_NOTHING ) {
-			chan_misdn_log(1, bc->port, " --> Ignoring Call we have already one\n");
-			return RESPONSE_IGNORE_SETUP_WITHOUT_CLOSE;
+		if (ch) {
+			switch (ch->state) {
+				case MISDN_NOTHING:
+				ch=NULL;
+				break;
+				default:
+				chan_misdn_log(1, bc->port, " --> Ignoring Call we have already one\n");
+				return RESPONSE_IGNORE_SETUP_WITHOUT_CLOSE; /*  Ignore MSNs which are not in our List */
+			}
 		}
 	}
 	
@@ -3776,6 +3846,14 @@
 	}
 
 	
+	if (bc->cw) {
+		chan_misdn_log(0, bc->port, " --> Call Waiting on PMP sending RELEASE_COMPLETE\n");
+		int cause;
+		misdn_cfg_get( bc->port, MISDN_CFG_REJECT_CAUSE, &cause, sizeof(cause));
+		bc->out_cause=cause?cause:16;
+		return RESPONSE_RELEASE_SETUP;
+	}
+
 	print_bearer(bc);
     
 	{
@@ -4106,9 +4184,7 @@
 		}
 	}
 	
-	
 	/* notice that we don't break here!*/
-

[... 5526 lines stripped ...]


More information about the svn-commits mailing list