[Asterisk-cvs] asterisk/channels chan_zap.c,1.474,1.475

kpfleming at lists.digium.com kpfleming at lists.digium.com
Fri Jul 15 11:55:11 CDT 2005


Update of /usr/cvsroot/asterisk/channels
In directory mongoose.digium.com:/tmp/cvs-serv10658/channels

Modified Files:
	chan_zap.c 
Log Message:
various code formatting changes and cleanups related to bug #4706


Index: chan_zap.c
===================================================================
RCS file: /usr/cvsroot/asterisk/channels/chan_zap.c,v
retrieving revision 1.474
retrieving revision 1.475
diff -u -d -r1.474 -r1.475
--- chan_zap.c	13 Jul 2005 20:22:29 -0000	1.474
+++ chan_zap.c	15 Jul 2005 16:03:02 -0000	1.475
@@ -3289,8 +3289,10 @@
 	pthread_t threadid;
 	pthread_attr_t attr;
 	struct ast_channel *chan;
+
 	pthread_attr_init(&attr);
 	pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
+
 	index = zt_get_index(ast, p, 0);
 	p->subs[index].f.frametype = AST_FRAME_NULL;
 	p->subs[index].f.datalen = 0;
@@ -3306,7 +3308,9 @@
 		p->fake_event = 0;
 	} else
 		res = zt_get_event(p->subs[index].zfd);
+
 	ast_log(LOG_DEBUG, "Got event %s(%d) on channel %d (index %d)\n", event2str(res), res, p->channel, index);
+
 	if (res & (ZT_EVENT_PULSEDIGIT | ZT_EVENT_DTMFUP)) {
 		if (res & ZT_EVENT_PULSEDIGIT)
 			p->pulsedial = 1;
@@ -3319,6 +3323,7 @@
 		zt_confmute(p, 0);
 		return &p->subs[index].f;
 	}
+
 	if (res & ZT_EVENT_DTMFDOWN) {
 		ast_log(LOG_DEBUG, "DTMF Down '%c'\n", res & 0xff);
 		p->subs[index].f.frametype = AST_FRAME_NULL;
@@ -3327,6 +3332,7 @@
 		/* Mute conference, return null frame */
 		return &p->subs[index].f;
 	}
+
 	switch(res) {
 		case ZT_EVENT_BITSCHANGED:
 			if (p->sig == SIG_R2) {
@@ -3486,13 +3492,13 @@
 							p->subs[SUB_THREEWAY].owner->_softhangup |= AST_SOFTHANGUP_DEV;
 							ast_log(LOG_DEBUG, "Looks like a bounced flash, hanging up both calls on %d\n", p->channel);
 							ast_mutex_unlock(&p->subs[SUB_THREEWAY].owner->lock);
-						} else if ((ast->pbx) ||
-							(ast->_state == AST_STATE_UP)) {
+						} else if ((ast->pbx) || (ast->_state == AST_STATE_UP)) {
 							if (p->transfer) {
 								/* In any case this isn't a threeway call anymore */
 								p->subs[SUB_REAL].inthreeway = 0;
 								p->subs[SUB_THREEWAY].inthreeway = 0;
-								if (!p->transfertobusy && p->owner->_state == AST_STATE_BUSY) {
+								/* Only attempt transfer if the phone is ringing; why transfer to busy tone eh? */
+								if (!p->transfertobusy && ast->_state == AST_STATE_BUSY) {
 									ast_mutex_unlock(&p->subs[SUB_THREEWAY].owner->lock);
 									/* Swap subs and dis-own channel */
 									swap_subs(p, SUB_THREEWAY, SUB_REAL);
@@ -3500,20 +3506,22 @@
 									/* Ring the phone */
 									zt_ring_phone(p);
 								} else {
-									/* Only attempt transfer if the phone is ringing; why transfer to busy tone eh? */
-									if ((res = attempt_transfer(p)) < 0)
+									if ((res = attempt_transfer(p)) < 0) {
 										p->subs[SUB_THREEWAY].owner->_softhangup |= AST_SOFTHANGUP_DEV;
-									else if (res) {
+										if (p->subs[SUB_THREEWAY].owner)
+											ast_mutex_unlock(&p->subs[SUB_THREEWAY].owner->lock);
+									} else if (res) {
 										/* Don't actually hang up at this point */
 										if (p->subs[SUB_THREEWAY].owner)
 											ast_mutex_unlock(&p->subs[SUB_THREEWAY].owner->lock);
 										break;
 									}
 								}
-							} else
+							} else {
 								p->subs[SUB_THREEWAY].owner->_softhangup |= AST_SOFTHANGUP_DEV;
-							if (p->subs[SUB_THREEWAY].owner)
-								ast_mutex_unlock(&p->subs[SUB_THREEWAY].owner->lock);
+								if (p->subs[SUB_THREEWAY].owner)
+									ast_mutex_unlock(&p->subs[SUB_THREEWAY].owner->lock);
+							}
 						} else {
 							ast_mutex_unlock(&p->subs[SUB_THREEWAY].owner->lock);
 							/* Swap subs and dis-own channel */
@@ -3725,137 +3733,144 @@
 				ast_log(LOG_DEBUG, "Winkflash, index: %d, normal: %d, callwait: %d, thirdcall: %d\n",
 					index, p->subs[SUB_REAL].zfd, p->subs[SUB_CALLWAIT].zfd, p->subs[SUB_THREEWAY].zfd);
 				p->callwaitcas = 0;
-				if (index == SUB_REAL) {
-					if (p->subs[SUB_CALLWAIT].owner) {
-						/* Swap to call-wait */
-						swap_subs(p, SUB_REAL, SUB_CALLWAIT);
-						tone_zone_play_tone(p->subs[SUB_REAL].zfd, -1);
-						p->owner = p->subs[SUB_REAL].owner;
-						ast_log(LOG_DEBUG, "Making %s the new owner\n", p->owner->name);
-						if (p->owner->_state == AST_STATE_RINGING) {
-							ast_setstate(p->owner, AST_STATE_UP);
-							p->subs[SUB_REAL].needanswer = 1;
+
+				if (index != SUB_REAL) {
+					ast_log(LOG_WARNING, "Got flash hook with index %d on channel %d?!?\n", index, p->channel);
+					goto winkflashdone;
+				}
+				
+				if (p->subs[SUB_CALLWAIT].owner) {
+					/* Swap to call-wait */
+					swap_subs(p, SUB_REAL, SUB_CALLWAIT);
+					tone_zone_play_tone(p->subs[SUB_REAL].zfd, -1);
+					p->owner = p->subs[SUB_REAL].owner;
+					ast_log(LOG_DEBUG, "Making %s the new owner\n", p->owner->name);
+					if (p->owner->_state == AST_STATE_RINGING) {
+						ast_setstate(p->owner, AST_STATE_UP);
+						p->subs[SUB_REAL].needanswer = 1;
+					}
+					p->callwaitingrepeat = 0;
+					p->cidcwexpire = 0;
+					/* Start music on hold if appropriate */
+					if (!p->subs[SUB_CALLWAIT].inthreeway && ast_bridged_channel(p->subs[SUB_CALLWAIT].owner))
+						ast_moh_start(ast_bridged_channel(p->subs[SUB_CALLWAIT].owner), NULL);
+					if (ast_bridged_channel(p->subs[SUB_REAL].owner))
+						ast_moh_stop(ast_bridged_channel(p->subs[SUB_REAL].owner));
+				} else if (!p->subs[SUB_THREEWAY].owner) {
+					char cid_num[256];
+					char cid_name[256];
+
+					if (!p->threewaycalling) {
+						/* Just send a flash if no 3-way calling */
+						p->subs[SUB_REAL].needflash = 1;
+						goto winkflashdone;
+					} else if (!check_for_conference(p)) {
+						if (p->zaptrcallerid && p->owner) {
+							if (p->owner->cid.cid_num)
+								ast_copy_string(cid_num, p->owner->cid.cid_num, sizeof(cid_num));
+							if (p->owner->cid.cid_name)
+								ast_copy_string(cid_name, p->owner->cid.cid_name, sizeof(cid_name));
 						}
-						p->callwaitingrepeat = 0;
-						p->cidcwexpire = 0;
-						/* Start music on hold if appropriate */
-						if (!p->subs[SUB_CALLWAIT].inthreeway && ast_bridged_channel(p->subs[SUB_CALLWAIT].owner))
-								ast_moh_start(ast_bridged_channel(p->subs[SUB_CALLWAIT].owner), NULL);
-						if (ast_bridged_channel(p->subs[SUB_REAL].owner))
-								ast_moh_stop(ast_bridged_channel(p->subs[SUB_REAL].owner));
-					} else if (!p->subs[SUB_THREEWAY].owner) {
-						char cid_num[256]="";
-						char cid_name[256]="";
-						if (p->threewaycalling && !check_for_conference(p)) {
-							if (p->zaptrcallerid && p->owner) {
-								if (p->owner->cid.cid_num)
-									ast_copy_string(cid_num, p->owner->cid.cid_num, sizeof(cid_num));
-								if (p->owner->cid.cid_name)
-									ast_copy_string(cid_name, p->owner->cid.cid_name, sizeof(cid_name));
-							}
-							/* XXX This section needs much more error checking!!! XXX */
-							/* Start a 3-way call if feasible */
-							if ((ast->pbx) ||
-									(ast->_state == AST_STATE_UP) ||
-									(ast->_state == AST_STATE_RING)) {
-								if (!alloc_sub(p, SUB_THREEWAY)) {
-									/* Make new channel */
-									chan = zt_new(p, AST_STATE_RESERVED, 0, SUB_THREEWAY, 0, 0);
-									if (p->zaptrcallerid) {
-										if (!p->origcid_num)
-											p->origcid_num = strdup(p->cid_num);
-										if (!p->origcid_name)
-											p->origcid_name = strdup(p->cid_name);
-										ast_copy_string(p->cid_num, cid_num, sizeof(p->cid_num));
-										ast_copy_string(p->cid_name, cid_name, sizeof(p->cid_name));
-									}
-									/* Swap things around between the three-way and real call */
-									swap_subs(p, SUB_THREEWAY, SUB_REAL);
-									/* Disable echo canceller for better dialing */
-									zt_disable_ec(p);
-									res = tone_zone_play_tone(p->subs[SUB_REAL].zfd, ZT_TONE_DIALRECALL);
-									if (res)
-										ast_log(LOG_WARNING, "Unable to start dial recall tone on channel %d\n", p->channel);
-									p->owner = chan;
-									if (chan && ast_pthread_create(&threadid, &attr, ss_thread, chan)) {
-										ast_log(LOG_WARNING, "Unable to start simple switch on channel %d\n", p->channel);
-										res = tone_zone_play_tone(p->subs[SUB_REAL].zfd, ZT_TONE_CONGESTION);
-										zt_enable_ec(p);
-										ast_hangup(chan);
-									} else if (!chan) {
-										ast_log(LOG_WARNING, "Cannot allocate new structure on channel %d\n", p->channel);
-									} else {
-										if (option_verbose > 2)	
-											ast_verbose(VERBOSE_PREFIX_3 "Started three way call on channel %d\n", p->channel);
-										/* Start music on hold if appropriate */
-										if (ast_bridged_channel(p->subs[SUB_THREEWAY].owner))
-											ast_moh_start(ast_bridged_channel(p->subs[SUB_THREEWAY].owner), NULL);
-									}		
-								} else
-									ast_log(LOG_WARNING, "Unable to allocate three-way subchannel\n");
-							} else 
-								ast_log(LOG_DEBUG, "Flash when call not up or ringing\n");
-						} else if (!p->threewaycalling) {
-							/* Just send a flash if no 3-way calling or callwait */
-							p->subs[SUB_REAL].needflash = 1;
+						/* XXX This section needs much more error checking!!! XXX */
+						/* Start a 3-way call if feasible */
+						if (!((ast->pbx) ||
+						      (ast->_state == AST_STATE_UP) ||
+						      (ast->_state == AST_STATE_RING))) {
+							ast_log(LOG_DEBUG, "Flash when call not up or ringing\n");
+								goto winkflashdone;
+						}
+						if (alloc_sub(p, SUB_THREEWAY)) {
+							ast_log(LOG_WARNING, "Unable to allocate three-way subchannel\n");
+							goto winkflashdone;
+						}
+						/* Make new channel */
+						chan = zt_new(p, AST_STATE_RESERVED, 0, SUB_THREEWAY, 0, 0);
+						if (p->zaptrcallerid) {
+							if (!p->origcid_num)
+								p->origcid_num = strdup(p->cid_num);
+							if (!p->origcid_name)
+								p->origcid_name = strdup(p->cid_name);
+							ast_copy_string(p->cid_num, cid_num, sizeof(p->cid_num));
+							ast_copy_string(p->cid_name, cid_name, sizeof(p->cid_name));
 						}
+						/* Swap things around between the three-way and real call */
+						swap_subs(p, SUB_THREEWAY, SUB_REAL);
+						/* Disable echo canceller for better dialing */
+						zt_disable_ec(p);
+						res = tone_zone_play_tone(p->subs[SUB_REAL].zfd, ZT_TONE_DIALRECALL);
+						if (res)
+							ast_log(LOG_WARNING, "Unable to start dial recall tone on channel %d\n", p->channel);
+						p->owner = chan;
+						if (!chan) {
+							ast_log(LOG_WARNING, "Cannot allocate new structure on channel %d\n", p->channel);
+						} else if (ast_pthread_create(&threadid, &attr, ss_thread, chan)) {
+							ast_log(LOG_WARNING, "Unable to start simple switch on channel %d\n", p->channel);
+							res = tone_zone_play_tone(p->subs[SUB_REAL].zfd, ZT_TONE_CONGESTION);
+							zt_enable_ec(p);
+							ast_hangup(chan);
+						} else {
+							if (option_verbose > 2)	
+								ast_verbose(VERBOSE_PREFIX_3 "Started three way call on channel %d\n", p->channel);
+							/* Start music on hold if appropriate */
+							if (ast_bridged_channel(p->subs[SUB_THREEWAY].owner))
+								ast_moh_start(ast_bridged_channel(p->subs[SUB_THREEWAY].owner), NULL);
+						}		
+					}
+				} else {
+					/* Already have a 3 way call */
+					if (p->subs[SUB_THREEWAY].inthreeway) {
+						/* Call is already up, drop the last person */
+						if (option_debug)
+							ast_log(LOG_DEBUG, "Got flash with three way call up, dropping last call on %d\n", p->channel);
+						/* If the primary call isn't answered yet, use it */
+						if ((p->subs[SUB_REAL].owner->_state != AST_STATE_UP) && (p->subs[SUB_THREEWAY].owner->_state == AST_STATE_UP)) {
+							/* Swap back -- we're dropping the real 3-way that isn't finished yet*/
+							swap_subs(p, SUB_THREEWAY, SUB_REAL);
+							p->owner = p->subs[SUB_REAL].owner;
+						}
+						/* Drop the last call and stop the conference */
+						if (option_verbose > 2)
+							ast_verbose(VERBOSE_PREFIX_3 "Dropping three-way call on %s\n", p->subs[SUB_THREEWAY].owner->name);
+						p->subs[SUB_THREEWAY].owner->_softhangup |= AST_SOFTHANGUP_DEV;
+						p->subs[SUB_REAL].inthreeway = 0;
+						p->subs[SUB_THREEWAY].inthreeway = 0;
 					} else {
-						/* Already have a 3 way call */
-						if (p->subs[SUB_THREEWAY].inthreeway) {
-							/* Call is already up, drop the last person */
-							if (option_debug)
-								ast_log(LOG_DEBUG, "Got flash with three way call up, dropping last call on %d\n", p->channel);
-							/* If the primary call isn't answered yet, use it */
-							if ((p->subs[SUB_REAL].owner->_state != AST_STATE_UP) && (p->subs[SUB_THREEWAY].owner->_state == AST_STATE_UP)) {
-								/* Swap back -- we're droppign the real 3-way that isn't finished yet*/
+						/* Lets see what we're up to */
+						if (((ast->pbx) || (ast->_state == AST_STATE_UP)) && 
+						    (p->transfertobusy || (ast->_state != AST_STATE_BUSY))) {
+							int otherindex = SUB_THREEWAY;
+
+							if (option_verbose > 2)
+								ast_verbose(VERBOSE_PREFIX_3 "Building conference on call on %s and %s\n", p->subs[SUB_THREEWAY].owner->name, p->subs[SUB_REAL].owner->name);
+							/* Put them in the threeway, and flip */
+							p->subs[SUB_THREEWAY].inthreeway = 1;
+							p->subs[SUB_REAL].inthreeway = 1;
+							if (ast->_state == AST_STATE_UP) {
 								swap_subs(p, SUB_THREEWAY, SUB_REAL);
-								p->owner = p->subs[SUB_REAL].owner;
+								otherindex = SUB_REAL;
 							}
-							/* Drop the last call and stop the conference */
+							if (p->subs[otherindex].owner && ast_bridged_channel(p->subs[otherindex].owner))
+								ast_moh_stop(ast_bridged_channel(p->subs[otherindex].owner));
+							p->owner = p->subs[SUB_REAL].owner;
+							if (ast->_state == AST_STATE_RINGING) {
+								ast_log(LOG_DEBUG, "Enabling ringtone on real and threeway\n");
+								res = tone_zone_play_tone(p->subs[SUB_REAL].zfd, ZT_TONE_RINGTONE);
+								res = tone_zone_play_tone(p->subs[SUB_THREEWAY].zfd, ZT_TONE_RINGTONE);
+							}
+						} else {
 							if (option_verbose > 2)
-								ast_verbose(VERBOSE_PREFIX_3 "Dropping three-way call on %s\n", p->subs[SUB_THREEWAY].owner->name);
+								ast_verbose(VERBOSE_PREFIX_3 "Dumping incomplete call on on %s\n", p->subs[SUB_THREEWAY].owner->name);
+							swap_subs(p, SUB_THREEWAY, SUB_REAL);
 							p->subs[SUB_THREEWAY].owner->_softhangup |= AST_SOFTHANGUP_DEV;
-							p->subs[SUB_REAL].inthreeway = 0;
-							p->subs[SUB_THREEWAY].inthreeway = 0;
-						} else {
-							/* Lets see what we're up to */
-							if (((ast->pbx) || (ast->_state == AST_STATE_UP)) && 
-							    (p->transfertobusy || (p->owner->_state != AST_STATE_BUSY))) {
-								int otherindex = SUB_THREEWAY;
-
-								if (option_verbose > 2)
-									ast_verbose(VERBOSE_PREFIX_3 "Building conference on call on %s and %s\n", p->subs[SUB_THREEWAY].owner->name, p->subs[SUB_REAL].owner->name);
-								/* Put them in the threeway, and flip */
-								p->subs[SUB_THREEWAY].inthreeway = 1;
-								p->subs[SUB_REAL].inthreeway = 1;
-								if (ast->_state == AST_STATE_UP) {
-									swap_subs(p, SUB_THREEWAY, SUB_REAL);
-									otherindex = SUB_REAL;
-								}
-								if (p->subs[otherindex].owner && ast_bridged_channel(p->subs[otherindex].owner))
-									ast_moh_stop(ast_bridged_channel(p->subs[otherindex].owner));
-								p->owner = p->subs[SUB_REAL].owner;
-								if (ast->_state == AST_STATE_RINGING) {
-									ast_log(LOG_DEBUG, "Enabling ringtone on real and threeway\n");
-									res = tone_zone_play_tone(p->subs[SUB_REAL].zfd, ZT_TONE_RINGTONE);
-									res = tone_zone_play_tone(p->subs[SUB_THREEWAY].zfd, ZT_TONE_RINGTONE);
-								}
-							} else {
-								if (option_verbose > 2)
-									ast_verbose(VERBOSE_PREFIX_3 "Dumping incomplete call on on %s\n", p->subs[SUB_THREEWAY].owner->name);
-								swap_subs(p, SUB_THREEWAY, SUB_REAL);
-								p->subs[SUB_THREEWAY].owner->_softhangup |= AST_SOFTHANGUP_DEV;
-								p->owner = p->subs[SUB_REAL].owner;
-								if (p->subs[SUB_REAL].owner && ast_bridged_channel(p->subs[SUB_REAL].owner))
-									ast_moh_stop(ast_bridged_channel(p->subs[SUB_REAL].owner));
-								zt_enable_ec(p);
-							}
-							
+							p->owner = p->subs[SUB_REAL].owner;
+							if (p->subs[SUB_REAL].owner && ast_bridged_channel(p->subs[SUB_REAL].owner))
+								ast_moh_stop(ast_bridged_channel(p->subs[SUB_REAL].owner));
+							zt_enable_ec(p);
 						}
+							
 					}
-				} else {
-					ast_log(LOG_WARNING, "Got flash hook with index %d on channel %d?!?\n", index, p->channel);
 				}
+			winkflashdone:			       
 				update_conf(p);
 				break;
 			case SIG_EM:




More information about the svn-commits mailing list