[svn-commits] rmudgett: branch group/issue14292 r197332 - /team/group/issue14292/channels/

SVN commits to the Digium repositories svn-commits at lists.digium.com
Wed May 27 16:11:17 CDT 2009


Author: rmudgett
Date: Wed May 27 16:11:09 2009
New Revision: 197332

URL: http://svn.asterisk.org/svn-view/asterisk?view=rev&rev=197332
Log:
Made compile again from constify the world changes.

*  Fixed constify the world conflicts.
*  Eliminated many future COLP merge conflicts by restructuring the CCBS/CCNR
PRI event handling code.

Modified:
    team/group/issue14292/channels/chan_dahdi.c

Modified: team/group/issue14292/channels/chan_dahdi.c
URL: http://svn.asterisk.org/svn-view/asterisk/team/group/issue14292/channels/chan_dahdi.c?view=diff&rev=197332&r1=197331&r2=197332
==============================================================================
--- team/group/issue14292/channels/chan_dahdi.c (original)
+++ team/group/issue14292/channels/chan_dahdi.c Wed May 27 16:11:09 2009
@@ -4934,12 +4934,12 @@
 }
 
 #if defined(HAVE_PRI)
-static char *dahdi_qsig_ccbsnr_initialize_app = "DAHDIQsigCcbsnrInitialize";
+static const char *dahdi_qsig_ccbsnr_initialize_app = "DAHDIQsigCcbsnrInitialize";
 
 /*
  * store the peer for future actions
  */
-static int dahdi_qsig_ccbsnr_initialize_exec(struct ast_channel *ast, void *param)
+static int dahdi_qsig_ccbsnr_initialize_exec(struct ast_channel *ast, const char *param)
 {
 	char buffer[32];
 	int id;
@@ -4960,14 +4960,14 @@
 #endif	/* defined(HAVE_PRI) */
 
 #if defined(HAVE_PRI)
-static char *dahdi_qsic_check_ccbsnr_app = "DAHDIQsigCheckCcbsnr";
-
-static int dahdi_qsig_check_ccbsnr_exec(struct ast_channel *ast, void *param)
+static const char *dahdi_qsic_check_ccbsnr_app = "DAHDIQsigCheckCcbsnr";
+
+static int dahdi_qsig_check_ccbsnr_exec(struct ast_channel *ast, const char *param)
 {
 #define CC_MAX_NOCHANNELS 256
 #define MAX_DISSALOWED 4
 
-	char *data = (char *) param;
+	char *data = ast_strdupa(param);
 	char *parse, *tok, *tokb;
 	int   maxcount = 0;
 	char *dissalowed_callernum[MAX_DISSALOWED] = {NULL, NULL, NULL, NULL};
@@ -5084,12 +5084,12 @@
 #endif	/* defined(HAVE_PRI) */
 
 #if defined(HAVE_PRI)
-static char *dahdi_qsic_clear_nochannel_app = "DAHDIQsigClearNoChannel";
-
-static int dahdi_qsig_clear_nochannel_exec(struct ast_channel *ast, void *param)
+static const char *dahdi_qsic_clear_nochannel_app = "DAHDIQsigClearNoChannel";
+
+static int dahdi_qsig_clear_nochannel_exec(struct ast_channel *ast, const char *param)
 {
 	char *callingnum, *callernum;
-	char *data = (char *) param;
+	char *data = ast_strdupa(param);
 
 	struct ccbsnr_link *cclink;
 	unsigned int state = 0;
@@ -5164,13 +5164,13 @@
 #endif	/* defined(HAVE_PRI) */
 
 #if defined(HAVE_PRI)
-static char *dahdi_qsic_ccbsnr_request_app = "DAHDIQsigCcbsnrRequest";
-
-static int dahdi_qsig_ccbsnr_request_exec(struct ast_channel *ast, void *param)
+static const char *dahdi_qsic_ccbsnr_request_app = "DAHDIQsigCcbsnrRequest";
+
+static int dahdi_qsig_ccbsnr_request_exec(struct ast_channel *ast, const char *param)
 {
 	int type;
 	char *ccbsnrtype, *callingnum, *callernum, *callername, *context, *priority;
-	char *data = (char *) param;
+	char *data = ast_strdupa(param);
 
 	const char *ccbsnronprispan;
 	unsigned int prispan;
@@ -14957,19 +14957,15 @@
 #error please update libpri
 #endif
 			case PRI_EVENT_FACILITY:
-			{
-				unsigned int handle;
-				int channel = e->facility.channel;
-				int ccbsnronprispan = PRI_SPAN(channel);
-				int explicit = PRI_EXPLICIT(channel);
-				int i;
-
-				channel = PRI_CHANNEL(channel);
-
 				ast_verb(4,
-					"PRI_EVENT_CC_FACILITY e->facility.channel(0x%x) span(%d) explicit(%d) channel(%d)\n",
-					e->facility.channel, ccbsnronprispan, explicit, channel);
-				if (channel == 0) {
+					"PRI_EVENT_FACILITY e->facility.channel(0x%x) span(%d) explicit(%d) channel(%d)\n",
+					e->facility.channel, PRI_SPAN(e->facility.channel),
+					PRI_EXPLICIT(e->facility.channel), PRI_CHANNEL(e->facility.channel));
+				if (PRI_CHANNEL(e->facility.channel) == 0) {
+					/* No channel Connection */
+					unsigned int handle;
+					int i;
+
 					for (i = 0; i < e->facility.subcmds.counter_subcmd; i++) {
 						struct pri_subcommand *subcmd = &e->facility.subcmds.subcmd[i];
 
@@ -14981,9 +14977,9 @@
 
 							ast_verb(4,
 								"Facility cc-execposible INV cr %d channel %d/%d, span %d\n",
-								cr, ccbsnronprispan, channel, pri->span);
-
-							handle = CCBS_HANDLE(ccbsnronprispan, cr);
+								cr, PRI_SPAN(e->facility.channel), PRI_CHANNEL(e->facility.channel), pri->span);
+
+							handle = CCBS_HANDLE(PRI_SPAN(e->facility.channel), cr);
 							state = 0;
 							ast_verb(4,
 								"Facility cc-execposible: handle=%x\n", handle);
@@ -15004,106 +15000,103 @@
 						default:
 							ast_log(LOG_WARNING,
 								"Illegal subcommand %d in facility request  on channel %d/%d span %d\n",
-								subcmd->cmd, ccbsnronprispan, channel, pri->span);
+								subcmd->cmd, PRI_SPAN(e->facility.channel), PRI_CHANNEL(e->facility.channel), pri->span);
 							break;
 						}
 					}
+					break;
+				}
+
+				chanpos = pri_find_principle(pri, e->facility.channel);
+				if (chanpos < 0) {
+					ast_log(LOG_WARNING, "Facility requested on unconfigured channel %d/%d span %d\n",
+						PRI_SPAN(e->facility.channel), PRI_CHANNEL(e->facility.channel), pri->span);
 				} else {
-					chanpos = pri_find_principle(pri, e->facility.channel);
+					chanpos = pri_fixup_principle(pri, chanpos, e->facility.call);
 					if (chanpos < 0) {
-						ast_log(LOG_WARNING, "Facility requested on unconfigured channel %d/%d span %d\n",
+						ast_log(LOG_WARNING, "Facility requested on channel %d/%d not in use on span %d\n",
 							PRI_SPAN(e->facility.channel), PRI_CHANNEL(e->facility.channel), pri->span);
 					} else {
-						chanpos = pri_fixup_principle(pri, chanpos, e->facility.call);
-						if (chanpos < 0) {
-							ast_log(LOG_WARNING, "Facility requested on channel %d/%d not in use on span %d\n",
-								PRI_SPAN(e->facility.channel), PRI_CHANNEL(e->facility.channel), pri->span);
-						} else {
-							ast_mutex_lock(&pri->pvts[chanpos]->lock);
-							for (i = 0; i < e->facility.subcmds.counter_subcmd; i++) {
-								struct pri_subcommand *subcmd = &e->facility.subcmds.subcmd[i];
-								struct ast_channel *owner;
-
-								switch (subcmd->cmd) {
-								case PRI_SUBCMD_CONNECTED_LINE:
-									owner = pri->pvts[chanpos]->owner;
-									if (owner) {
-										struct ast_party_connected_line connected;
-										struct pri_subcmd_connected_line *cmdcl;
-
-										/* Update the connected line information on the other channel */
-										ast_party_connected_line_init(&connected);
-										cmdcl = &subcmd->connected_line;
-										connected.id.number = cmdcl->party.id.number;
-										connected.id.name = cmdcl->party.id.name;
-										connected.id.number_type = cmdcl->party.id.number_type;
-										connected.id.number_presentation = pri_to_ast_presentation(cmdcl->party.id.number_presentation);
-										connected.source = pri_to_ast_connected_line_update_source(cmdcl->party.source);
-										ast_channel_queue_connected_line_update(owner, &connected);
-
-										ast_copy_string(pri->pvts[chanpos]->lastcid_num, cmdcl->party.id.number, sizeof(pri->pvts[chanpos]->lastcid_num));
-										ast_copy_string(pri->pvts[chanpos]->lastcid_name, cmdcl->party.id.name, sizeof(pri->pvts[chanpos]->lastcid_name));
-
-										pri->pvts[chanpos]->subs[SUB_REAL].needcallerid = 1;
-										//dahdi_enable_ec(pri->pvts[chanpos]);
-									}
-									break;
-								case PRI_SUBCMD_REDIRECTING:
-									owner = pri->pvts[chanpos]->owner;
-									if (owner) {
-										struct ast_party_redirecting redirecting = {{0,},};
-										struct pri_subcmd_redirecting *cmdr;
-
-										cmdr = &subcmd->redirecting;
-										redirecting.from.number = cmdr->party.from.number;
-										redirecting.from.name = cmdr->party.from.name;
-										redirecting.from.number_type = cmdr->party.from.number_type;
-										redirecting.from.number_presentation = pri_to_ast_presentation(cmdr->party.from.number_presentation);
-										redirecting.to.number = cmdr->party.to.number;
-										redirecting.to.name = cmdr->party.to.name;
-										redirecting.to.number_type = cmdr->party.to.number_type;
-										redirecting.to.number_presentation = pri_to_ast_presentation(cmdr->party.to.number_presentation);
-										redirecting.count = 0;
-										redirecting.reason = pri_to_ast_reason(cmdr->party.reason);
-										ast_channel_queue_redirecting_update(owner, &redirecting);
-									}
-									break;
-								default:
-									ast_log(LOG_WARNING,
-										"Illegal subcommand %d in facility request on channel %d/%d not in use on span %d\n",
-										subcmd->cmd, PRI_SPAN(e->facility.channel), PRI_CHANNEL(e->facility.channel), pri->span);
-									break;
+						int i;
+
+						ast_mutex_lock(&pri->pvts[chanpos]->lock);
+						for (i = 0; i < e->facility.subcmds.counter_subcmd; i++) {
+							struct pri_subcommand *subcmd = &e->facility.subcmds.subcmd[i];
+							struct ast_channel *owner;
+
+							switch (subcmd->cmd) {
+							case PRI_SUBCMD_CONNECTED_LINE:
+								owner = pri->pvts[chanpos]->owner;
+								if (owner) {
+									struct ast_party_connected_line connected;
+									struct pri_subcmd_connected_line *cmdcl;
+
+									/* Update the connected line information on the other channel */
+									ast_party_connected_line_init(&connected);
+									cmdcl = &subcmd->connected_line;
+									connected.id.number = cmdcl->party.id.number;
+									connected.id.name = cmdcl->party.id.name;
+									connected.id.number_type = cmdcl->party.id.number_type;
+									connected.id.number_presentation = pri_to_ast_presentation(cmdcl->party.id.number_presentation);
+									connected.source = pri_to_ast_connected_line_update_source(cmdcl->party.source);
+									ast_channel_queue_connected_line_update(owner, &connected);
+
+									ast_copy_string(pri->pvts[chanpos]->lastcid_num, cmdcl->party.id.number, sizeof(pri->pvts[chanpos]->lastcid_num));
+									ast_copy_string(pri->pvts[chanpos]->lastcid_name, cmdcl->party.id.name, sizeof(pri->pvts[chanpos]->lastcid_name));
+
+									pri->pvts[chanpos]->subs[SUB_REAL].needcallerid = 1;
+									//dahdi_enable_ec(pri->pvts[chanpos]);
 								}
+								break;
+							case PRI_SUBCMD_REDIRECTING:
+								owner = pri->pvts[chanpos]->owner;
+								if (owner) {
+									struct ast_party_redirecting redirecting = {{0,},};
+									struct pri_subcmd_redirecting *cmdr;
+
+									cmdr = &subcmd->redirecting;
+									redirecting.from.number = cmdr->party.from.number;
+									redirecting.from.name = cmdr->party.from.name;
+									redirecting.from.number_type = cmdr->party.from.number_type;
+									redirecting.from.number_presentation = pri_to_ast_presentation(cmdr->party.from.number_presentation);
+									redirecting.to.number = cmdr->party.to.number;
+									redirecting.to.name = cmdr->party.to.name;
+									redirecting.to.number_type = cmdr->party.to.number_type;
+									redirecting.to.number_presentation = pri_to_ast_presentation(cmdr->party.to.number_presentation);
+									redirecting.count = 0;
+									redirecting.reason = pri_to_ast_reason(cmdr->party.reason);
+									ast_channel_queue_redirecting_update(owner, &redirecting);
+								}
+								break;
+							default:
+								ast_log(LOG_WARNING,
+									"Illegal subcommand %d in facility request on channel %d/%d not in use on span %d\n",
+									subcmd->cmd, PRI_SPAN(e->facility.channel), PRI_CHANNEL(e->facility.channel), pri->span);
+								break;
 							}
-							ast_mutex_unlock(&pri->pvts[chanpos]->lock);
 						}
+						ast_mutex_unlock(&pri->pvts[chanpos]->lock);
 					}
 				}
 				break;
-			}
 			case PRI_EVENT_ANSWER:
-			{
-				int channel = e->answer.channel;
-				int ccbsnronprispan = PRI_SPAN(channel);
-				int explicit = PRI_EXPLICIT(channel);
-				int i;
-
-				channel = PRI_CHANNEL(channel);
-
 				ast_verb(4,
 					"PRI_EVENT_ANSWER e->answer.channel(0x%x) span(%d) explicit(%d) channel(%d)\n",
-					e->answer.channel, ccbsnronprispan, explicit, channel);
-
-				if (channel == 0) {	/* No channel Connection */
+					e->answer.channel, PRI_SPAN(e->answer.channel),
+					PRI_EXPLICIT(e->answer.channel), e->answer.channel);
+				if (e->answer.channel == 0) {
+					/* No channel Connection */
+					int i;
+
 					for (i = 0; i < e->answer.subcmds.counter_subcmd; i++) {
+						struct ccbsnr_link *cclink;
+						unsigned int handle;
+						int cr = e->answer.cref;
 						struct pri_subcommand *subcmd = &e->answer.subcmds.subcmd[i];
 
 						switch (subcmd->cmd) {
 						case PRI_SUBCMD_CC_CCBSREQUEST_RR:
 						{
-							struct ccbsnr_link *cclink;
-							unsigned int handle;
-							int cr = e->answer.cref;
 							int no_path_reservation = subcmd->cc_ccbs_rr.cc_request_res.no_path_reservation;
 							int retain_service      = subcmd->cc_ccbs_rr.cc_request_res.retain_service;
 
@@ -15111,7 +15104,7 @@
 								"Answer ccbs-request RR no-path-reservation '%d' retain-service '%d' on channel %d/%d on span %d\n",
 								no_path_reservation, retain_service,
 								PRI_SPAN(e->answer.channel), PRI_CHANNEL(e->answer.channel), pri->span);
-							handle = CCBS_HANDLE(ccbsnronprispan,cr);
+							handle = CCBS_HANDLE(PRI_SPAN(e->answer.channel),cr);
 							cclink = ccbsnr_select_link(handle);
 							if (cclink) {
 								struct ast_channel *peer;
@@ -15134,16 +15127,13 @@
 							} else {
 								ast_verb(3,
 									"PRI_EVENT_ANSWER: CCBS-List-Obj not found: e->answer.channel(0x%x) span(%d) explicit(%d) channel(%d)\n",
-									e->answer.channel, ccbsnronprispan, explicit, channel);
+									e->answer.channel, PRI_SPAN(e->answer.channel), PRI_EXPLICIT(e->answer.channel), e->answer.channel);
 							}
 							break;
 						}
 
 						case PRI_SUBCMD_CC_CCNRREQUEST_RR:
 						{
-							struct ccbsnr_link *cclink;
-							unsigned int handle;
-							int cr = e->answer.cref;
 							int no_path_reservation = subcmd->cc_ccnr_rr.cc_request_res.no_path_reservation;
 							int retain_service      = subcmd->cc_ccnr_rr.cc_request_res.retain_service;
 
@@ -15151,7 +15141,7 @@
 								"Answer ccnr-request RR no-path-reservation '%d' retain-service '%d' on channel %d/%d on span %d\n",
 								no_path_reservation, retain_service,
 								PRI_SPAN(e->answer.channel), PRI_CHANNEL(e->answer.channel), pri->span);
-							handle = CCBS_HANDLE(ccbsnronprispan,cr);
+							handle = CCBS_HANDLE(PRI_SPAN(e->answer.channel),cr);
 							cclink = ccbsnr_select_link(handle);
 							if (cclink) {
 								struct ast_channel *peer;
@@ -15171,7 +15161,7 @@
 							} else {
 								ast_verb(3,
 									"PRI_EVENT_ANSWER: CCBS-List-Obj not found: e->answer.channel(0x%x) span(%d) explicit(%d) channel(%d)\n",
-									e->answer.channel, ccbsnronprispan, explicit, channel);
+									e->answer.channel, PRI_SPAN(e->answer.channel), PRI_EXPLICIT(e->answer.channel), e->answer.channel);
 							}
 							break;
 						}
@@ -15182,102 +15172,96 @@
 							break;
 						}
 					}
+					break;
+				}
+
+				chanpos = pri_find_principle(pri, e->answer.channel);
+				if (chanpos < 0) {
+					ast_log(LOG_WARNING, "Answer on unconfigured channel %d/%d span %d\n",
+						PRI_SPAN(e->answer.channel), PRI_CHANNEL(e->answer.channel), pri->span);
 				} else {
-					chanpos = pri_find_principle(pri, e->answer.channel);
+					chanpos = pri_fixup_principle(pri, chanpos, e->answer.call);
 					if (chanpos < 0) {
-						ast_log(LOG_WARNING, "Answer on unconfigured channel %d/%d span %d\n",
+						ast_log(LOG_WARNING, "Answer requested on channel %d/%d not in use on span %d\n",
 							PRI_SPAN(e->answer.channel), PRI_CHANNEL(e->answer.channel), pri->span);
 					} else {
-						chanpos = pri_fixup_principle(pri, chanpos, e->answer.call);
-						if (chanpos < 0) {
-							ast_log(LOG_WARNING, "Answer requested on channel %d/%d not in use on span %d\n",
-								PRI_SPAN(e->answer.channel), PRI_CHANNEL(e->answer.channel), pri->span);
+						struct ast_party_connected_line connected;
+						struct ast_channel *owner;
+
+						ast_mutex_lock(&pri->pvts[chanpos]->lock);
+						/* Now we can do call progress detection */
+
+						/* We changed this so it turns on the DSP no matter what... progress or no progress.
+						 * By this time, we need DTMF detection and other features that were previously disabled
+						 * -- Matt F */
+						if (pri->pvts[chanpos]->dsp && pri->pvts[chanpos]->dsp_features) {
+							ast_dsp_set_features(pri->pvts[chanpos]->dsp, pri->pvts[chanpos]->dsp_features);
+							pri->pvts[chanpos]->dsp_features = 0;
+						}
+						if (pri->pvts[chanpos]->realcall && (pri->pvts[chanpos]->realcall->sig == SIG_FXSKS)) {
+							ast_debug(1, "Starting up GR-303 trunk now that we got CONNECT...\n");
+							x = DAHDI_START;
+							res = ioctl(pri->pvts[chanpos]->subs[SUB_REAL].dfd, DAHDI_HOOK, &x);
+							if (res < 0) {
+								if (errno != EINPROGRESS) {
+									ast_log(LOG_WARNING, "Unable to start channel: %s\n", strerror(errno));
+								}
+							}
+						} else if (!ast_strlen_zero(pri->pvts[chanpos]->dop.dialstr)) {
+							pri->pvts[chanpos]->dialing = 1;
+							/* Send any "w" waited stuff */
+							res = ioctl(pri->pvts[chanpos]->subs[SUB_REAL].dfd, DAHDI_DIAL, &pri->pvts[chanpos]->dop);
+							if (res < 0) {
+								ast_log(LOG_WARNING, "Unable to initiate dialing on trunk channel %d: %s\n", pri->pvts[chanpos]->channel, strerror(errno));
+								pri->pvts[chanpos]->dop.dialstr[0] = '\0';
+							} else
+								ast_debug(1, "Sent deferred digit string: %s\n", pri->pvts[chanpos]->dop.dialstr);
+
+							pri->pvts[chanpos]->dop.dialstr[0] = '\0';
+						} else if (pri->pvts[chanpos]->confirmanswer) {
+							ast_debug(1, "Waiting on answer confirmation on channel %d!\n", pri->pvts[chanpos]->channel);
 						} else {
-							struct ast_party_connected_line connected;
-							struct ast_channel *owner;
-
+							pri->pvts[chanpos]->subs[SUB_REAL].needanswer =1;
+							/* Enable echo cancellation if it's not on already */
+							dahdi_enable_ec(pri->pvts[chanpos]);
+						}
+
+						owner = pri->pvts[chanpos]->owner;
+#ifdef SUPPORT_USERUSER
+						if (!ast_strlen_zero(e->answer.useruserinfo)) {
+							ast_mutex_unlock(&pri->pvts[chanpos]->lock);
+							pbx_builtin_setvar_helper(owner, "USERUSERINFO", e->answer.useruserinfo);
 							ast_mutex_lock(&pri->pvts[chanpos]->lock);
-							/* Now we can do call progress detection */
-
-							/* We changed this so it turns on the DSP no matter what... progress or no progress.
-							 * By this time, we need DTMF detection and other features that were previously disabled
-							 * -- Matt F */
-							if (pri->pvts[chanpos]->dsp && pri->pvts[chanpos]->dsp_features) {
-								ast_dsp_set_features(pri->pvts[chanpos]->dsp, pri->pvts[chanpos]->dsp_features);
-								pri->pvts[chanpos]->dsp_features = 0;
-							}
-							if (pri->pvts[chanpos]->realcall && (pri->pvts[chanpos]->realcall->sig == SIG_FXSKS)) {
-								ast_debug(1, "Starting up GR-303 trunk now that we got CONNECT...\n");
-								x = DAHDI_START;
-								res = ioctl(pri->pvts[chanpos]->subs[SUB_REAL].dfd, DAHDI_HOOK, &x);
-								if (res < 0) {
-									if (errno != EINPROGRESS) {
-										ast_log(LOG_WARNING, "Unable to start channel: %s\n", strerror(errno));
-									}
-								}
-							} else if (!ast_strlen_zero(pri->pvts[chanpos]->dop.dialstr)) {
-								pri->pvts[chanpos]->dialing = 1;
-								/* Send any "w" waited stuff */
-								res = ioctl(pri->pvts[chanpos]->subs[SUB_REAL].dfd, DAHDI_DIAL, &pri->pvts[chanpos]->dop);
-								if (res < 0) {
-									ast_log(LOG_WARNING, "Unable to initiate dialing on trunk channel %d: %s\n", pri->pvts[chanpos]->channel, strerror(errno));
-									pri->pvts[chanpos]->dop.dialstr[0] = '\0';
-								} else
-									ast_debug(1, "Sent deferred digit string: %s\n", pri->pvts[chanpos]->dop.dialstr);
-
-								pri->pvts[chanpos]->dop.dialstr[0] = '\0';
-							} else if (pri->pvts[chanpos]->confirmanswer) {
-								ast_debug(1, "Waiting on answer confirmation on channel %d!\n", pri->pvts[chanpos]->channel);
-							} else {
-								pri->pvts[chanpos]->subs[SUB_REAL].needanswer =1;
-								/* Enable echo cancellation if it's not on already */
-								dahdi_enable_ec(pri->pvts[chanpos]);
-							}
-
-							owner = pri->pvts[chanpos]->owner;
-#ifdef SUPPORT_USERUSER
-							if (!ast_strlen_zero(e->answer.useruserinfo)) {
-								ast_mutex_unlock(&pri->pvts[chanpos]->lock);
-								pbx_builtin_setvar_helper(owner, "USERUSERINFO", e->answer.useruserinfo);
-								ast_mutex_lock(&pri->pvts[chanpos]->lock);
-							}
-#endif
-
-							if (owner) {
-								/* Update the connected line information on the other channel */
-								ast_party_connected_line_init(&connected);
-								connected.id.name = e->answer.connectedname;
-								connected.id.number = e->answer.connectednum;
-								connected.id.number_type = e->answer.connectedplan;
-								connected.id.number_presentation = pri_to_ast_presentation(e->answer.connectedpres);
-								connected.source = pri_to_ast_connected_line_update_source(e->answer.source);
-								ast_channel_queue_connected_line_update(owner, &connected);
-							}
-
-							ast_mutex_unlock(&pri->pvts[chanpos]->lock);
 						}
+#endif
+
+						if (owner) {
+							/* Update the connected line information on the other channel */
+							ast_party_connected_line_init(&connected);
+							connected.id.name = e->answer.connectedname;
+							connected.id.number = e->answer.connectednum;
+							connected.id.number_type = e->answer.connectedplan;
+							connected.id.number_presentation = pri_to_ast_presentation(e->answer.connectedpres);
+							connected.source = pri_to_ast_connected_line_update_source(e->answer.source);
+							ast_channel_queue_connected_line_update(owner, &connected);
+						}
+
+						ast_mutex_unlock(&pri->pvts[chanpos]->lock);
 					}
 				}
 				break;
-			}
 			case PRI_EVENT_HANGUP:
-			{
-				int errorvalue = 0;
-				int channel = e->hangup.channel;
-				int ccbsnronprispan = PRI_SPAN(channel);
-				int explicit = PRI_EXPLICIT(channel);
-				int i;
-
-				channel = PRI_CHANNEL(channel);
-
 				ast_verb(4, "Channel %d/%d, span %d got hangup, cause %d\n",
-					ccbsnronprispan, channel, pri->span, e->hangup.cause);
-
-				if (channel == 0) {	/* No channel Connection */
+					PRI_SPAN(e->hangup.channel), PRI_CHANNEL(e->hangup.channel),
+					pri->span, e->hangup.cause);
+				if (PRI_CHANNEL(e->hangup.channel) == 0) {
+					/* No channel Connection */
+					int errorvalue = 0;
 					struct ccbsnr_link *cclink;
 					unsigned int handle;
 					int cr;
 					unsigned int state;
+					int i;
 
 					for (i = 0; i < e->hangup.subcmds.counter_subcmd; i++) {
 						struct pri_subcommand *subcmd = &e->hangup.subcmds.subcmd[i];
@@ -15306,7 +15290,7 @@
 					cr = e->hangup.cref;
 					state = 0;
 
-					handle = CCBS_HANDLE(ccbsnronprispan,cr);
+					handle = CCBS_HANDLE(PRI_SPAN(e->hangup.channel),cr);
 					cclink = ccbsnr_get_link(handle, &state);
 					if (cclink) {
 						switch (state) {
@@ -15315,7 +15299,7 @@
 						case CC_INVOKED_A_RET:
 							ast_verb(4,
 								"PRI_EVENT_HANGUP: CCBS-List-Obj 0x%p: handle %x e->hangup.channel(0x%x) span(%d) explicit(%d) channel(%d) error(%d) peer=%p\n",
-								cclink, handle, e->hangup.channel, ccbsnronprispan, explicit, channel, errorvalue, cclink->peer);
+								cclink, handle, e->hangup.channel, PRI_SPAN(e->hangup.channel), PRI_EXPLICIT(e->hangup.channel), PRI_CHANNEL(e->hangup.channel), errorvalue, cclink->peer);
 
 							pri_hangup(pri->pri, cclink->call, e->hangup.cause);
 							cclink->call = NULL;
@@ -15327,97 +15311,99 @@
 						}
 					} else {
 						ast_verb(4, "PRI_EVENT_HANGUP: CCBS-List-Obj not found: e->hangup.channel(0x%x) span(%d) explicit(%d) channel(%d)\n",
-							e->hangup.channel, ccbsnronprispan, explicit, channel);
+							e->hangup.channel, PRI_SPAN(e->hangup.channel), PRI_EXPLICIT(e->hangup.channel), PRI_CHANNEL(e->hangup.channel));
 						ast_verb(3, "Hangup on bad channel %d/%d on span %d\n",
 							PRI_SPAN(e->hangup.channel), PRI_CHANNEL(e->hangup.channel), pri->span);
 					}
+					break;
+				}
+
+				chanpos = pri_find_principle(pri, e->hangup.channel);
+				if (chanpos < 0) {
+					ast_log(LOG_WARNING, "Hangup requested on unconfigured channel %d/%d span %d\n",
+						PRI_SPAN(e->hangup.channel), PRI_CHANNEL(e->hangup.channel), pri->span);
 				} else {
-					chanpos = pri_find_principle(pri, e->hangup.channel);
-					if (chanpos < 0) {
-						ast_log(LOG_WARNING, "Hangup requested on unconfigured channel %d/%d span %d\n",
-							PRI_SPAN(e->hangup.channel), PRI_CHANNEL(e->hangup.channel), pri->span);
-					} else {
-						chanpos = pri_fixup_principle(pri, chanpos, e->hangup.call);
-						if (chanpos > -1) {
-							ast_mutex_lock(&pri->pvts[chanpos]->lock);
-							if (!pri->pvts[chanpos]->alreadyhungup) {
-								/* we're calling here dahdi_hangup so once we get there we need to clear p->call after calling pri_hangup */
-								pri->pvts[chanpos]->alreadyhungup = 1;
-								if (pri->pvts[chanpos]->realcall)
-									pri_hangup_all(pri->pvts[chanpos]->realcall, pri);
-								else if (pri->pvts[chanpos]->owner) {
-									/* Queue a BUSY instead of a hangup if our cause is appropriate */
-									pri->pvts[chanpos]->owner->hangupcause = e->hangup.cause;
-									if (pri->pvts[chanpos]->owner->_state == AST_STATE_UP)
+					chanpos = pri_fixup_principle(pri, chanpos, e->hangup.call);
+					if (chanpos > -1) {
+						int i;
+
+						ast_mutex_lock(&pri->pvts[chanpos]->lock);
+						if (!pri->pvts[chanpos]->alreadyhungup) {
+							/* we're calling here dahdi_hangup so once we get there we need to clear p->call after calling pri_hangup */
+							pri->pvts[chanpos]->alreadyhungup = 1;
+							if (pri->pvts[chanpos]->realcall)
+								pri_hangup_all(pri->pvts[chanpos]->realcall, pri);
+							else if (pri->pvts[chanpos]->owner) {
+								/* Queue a BUSY instead of a hangup if our cause is appropriate */
+								pri->pvts[chanpos]->owner->hangupcause = e->hangup.cause;
+								if (pri->pvts[chanpos]->owner->_state == AST_STATE_UP)
+									pri->pvts[chanpos]->owner->_softhangup |= AST_SOFTHANGUP_DEV;
+								else {
+									switch (e->hangup.cause) {
+									case PRI_CAUSE_USER_BUSY:
+										pri->pvts[chanpos]->subs[SUB_REAL].needbusy =1;
+										break;
+									case PRI_CAUSE_CALL_REJECTED:
+									case PRI_CAUSE_NETWORK_OUT_OF_ORDER:
+									case PRI_CAUSE_NORMAL_CIRCUIT_CONGESTION:
+									case PRI_CAUSE_SWITCH_CONGESTION:
+									case PRI_CAUSE_DESTINATION_OUT_OF_ORDER:
+									case PRI_CAUSE_NORMAL_TEMPORARY_FAILURE:
+										pri->pvts[chanpos]->subs[SUB_REAL].needcongestion =1;
+										break;
+									default:
 										pri->pvts[chanpos]->owner->_softhangup |= AST_SOFTHANGUP_DEV;
-									else {
-										switch (e->hangup.cause) {
-										case PRI_CAUSE_USER_BUSY:
-											pri->pvts[chanpos]->subs[SUB_REAL].needbusy =1;
-											break;
-										case PRI_CAUSE_CALL_REJECTED:
-										case PRI_CAUSE_NETWORK_OUT_OF_ORDER:
-										case PRI_CAUSE_NORMAL_CIRCUIT_CONGESTION:
-										case PRI_CAUSE_SWITCH_CONGESTION:
-										case PRI_CAUSE_DESTINATION_OUT_OF_ORDER:
-										case PRI_CAUSE_NORMAL_TEMPORARY_FAILURE:
-											pri->pvts[chanpos]->subs[SUB_REAL].needcongestion =1;
-											break;
-										default:
-											pri->pvts[chanpos]->owner->_softhangup |= AST_SOFTHANGUP_DEV;
-											break;
-										}
+										break;
 									}
 								}
-								ast_verb(3, "Channel %d/%d, span %d got hangup, cause %d\n",
-									pri->pvts[chanpos]->logicalspan, pri->pvts[chanpos]->prioffset, pri->span, e->hangup.cause);
-							} else {
-								pri_hangup(pri->pri, pri->pvts[chanpos]->call, e->hangup.cause);
-								pri->pvts[chanpos]->call = NULL;
 							}
-							if (e->hangup.cause == PRI_CAUSE_REQUESTED_CHAN_UNAVAIL) {
-								ast_verb(3, "Forcing restart of channel %d/%d on span %d since channel reported in use\n",
-									PRI_SPAN(e->hangup.channel), PRI_CHANNEL(e->hangup.channel), pri->span);
-								pri_reset(pri->pri, PVT_TO_CHANNEL(pri->pvts[chanpos]));
-								pri->pvts[chanpos]->resetting = 1;
+							ast_verb(3, "Channel %d/%d, span %d got hangup, cause %d\n",
+								pri->pvts[chanpos]->logicalspan, pri->pvts[chanpos]->prioffset, pri->span, e->hangup.cause);
+						} else {
+							pri_hangup(pri->pri, pri->pvts[chanpos]->call, e->hangup.cause);
+							pri->pvts[chanpos]->call = NULL;
+						}
+						if (e->hangup.cause == PRI_CAUSE_REQUESTED_CHAN_UNAVAIL) {
+							ast_verb(3, "Forcing restart of channel %d/%d on span %d since channel reported in use\n",
+								PRI_SPAN(e->hangup.channel), PRI_CHANNEL(e->hangup.channel), pri->span);
+							pri_reset(pri->pri, PVT_TO_CHANNEL(pri->pvts[chanpos]));
+							pri->pvts[chanpos]->resetting = 1;
+						}
+						if (e->hangup.aoc_units > -1)
+							ast_verb(3, "Channel %d/%d, span %d received AOC-E charging %d unit%s\n",
+								pri->pvts[chanpos]->logicalspan, pri->pvts[chanpos]->prioffset, pri->span, (int)e->hangup.aoc_units, (e->hangup.aoc_units == 1) ? "" : "s");
+
+#ifdef SUPPORT_USERUSER
+						if (pri->pvts[chanpos]->owner && !ast_strlen_zero(e->hangup.useruserinfo)) {
+							struct ast_channel *owner = pri->pvts[chanpos]->owner;
+							ast_mutex_unlock(&pri->pvts[chanpos]->lock);
+							pbx_builtin_setvar_helper(owner, "USERUSERINFO", e->hangup.useruserinfo);
+							ast_mutex_lock(&pri->pvts[chanpos]->lock);
+						}
+#endif
+						for (i = 0; i < e->hangup.subcmds.counter_subcmd; i++) {
+							struct pri_subcommand *subcmd = &e->hangup.subcmds.subcmd[i];
+
+							switch (subcmd->cmd) {
+							case PRI_SUBCMD_CC_RINGOUT_INV:
+								ast_verb(3, "Facility cc-suspend INV on channel %d/%d, span %d\n",
+									pri->pvts[chanpos]->logicalspan, pri->pvts[chanpos]->prioffset, pri->span);
+								break;
+
+							default:
+								ast_log(LOG_WARNING, "Illegal subcommand %d in hangup on channel %d/%d not in use on span %d\n",
+									subcmd->cmd, PRI_SPAN(e->hangup.channel), PRI_CHANNEL(e->hangup.channel), pri->span);
+								break;
 							}
-							if (e->hangup.aoc_units > -1)
-								ast_verb(3, "Channel %d/%d, span %d received AOC-E charging %d unit%s\n",
-									pri->pvts[chanpos]->logicalspan, pri->pvts[chanpos]->prioffset, pri->span, (int)e->hangup.aoc_units, (e->hangup.aoc_units == 1) ? "" : "s");
-
-#ifdef SUPPORT_USERUSER
-							if (pri->pvts[chanpos]->owner && !ast_strlen_zero(e->hangup.useruserinfo)) {
-								struct ast_channel *owner = pri->pvts[chanpos]->owner;
-								ast_mutex_unlock(&pri->pvts[chanpos]->lock);
-								pbx_builtin_setvar_helper(owner, "USERUSERINFO", e->hangup.useruserinfo);
-								ast_mutex_lock(&pri->pvts[chanpos]->lock);
-							}
-#endif
-							for (i = 0; i < e->hangup.subcmds.counter_subcmd; i++) {
-								struct pri_subcommand *subcmd = &e->hangup.subcmds.subcmd[i];
-
-								switch (subcmd->cmd) {
-								case PRI_SUBCMD_CC_RINGOUT_INV:
-									ast_verb(3, "Facility cc-suspend INV on channel %d/%d, span %d\n",
-										pri->pvts[chanpos]->logicalspan, pri->pvts[chanpos]->prioffset, pri->span);
-									break;
-
-								default:
-									ast_log(LOG_WARNING, "Illegal subcommand %d in hangup on channel %d/%d not in use on span %d\n",
-										subcmd->cmd, PRI_SPAN(e->hangup.channel), PRI_CHANNEL(e->hangup.channel), pri->span);
-									break;
-								}
-							}
-
-							ast_mutex_unlock(&pri->pvts[chanpos]->lock);
-						} else {
-							ast_log(LOG_WARNING, "Hangup on bad channel %d/%d on span %d\n",
-								PRI_SPAN(e->hangup.channel), PRI_CHANNEL(e->hangup.channel), pri->span);
 						}
+
+						ast_mutex_unlock(&pri->pvts[chanpos]->lock);
+					} else {
+						ast_log(LOG_WARNING, "Hangup on bad channel %d/%d on span %d\n",
+							PRI_SPAN(e->hangup.channel), PRI_CHANNEL(e->hangup.channel), pri->span);
 					}
 				}
 				break;
-			}
 #ifndef PRI_EVENT_HANGUP_REQ
 #error please update libpri
 #endif
@@ -15485,34 +15471,30 @@
 				}
 				break;
 			case PRI_EVENT_HANGUP_ACK:
-			{
-				int channel = e->hangup.channel;
-				int ccbsnronprispan = PRI_SPAN(channel);
-				int explicit = PRI_EXPLICIT(channel);
-				channel = PRI_CHANNEL(channel);
-
 				ast_verb(4, "PRI_EVENT_HANGUP_ACK e->hangup.cause(%d) e->hangup.channel(0x%x) span(%d) explicit(%d) channel(%d)\n",
-					e->hangup.cause, e->hangup.channel, ccbsnronprispan, explicit, channel);
+					e->hangup.cause, e->hangup.channel, PRI_SPAN(e->hangup.channel),
+					PRI_EXPLICIT(e->hangup.channel), PRI_CHANNEL(e->hangup.channel));
 				ast_verb(3, "Channel %d/%d, span %d got hangup, cause %d\n",
-					ccbsnronprispan, channel, pri->span, e->hangup.cause);
-				if (channel == 0) {	/* No channel Connection */
+					PRI_SPAN(e->hangup.channel), PRI_CHANNEL(e->hangup.channel), pri->span, e->hangup.cause);
+				if (PRI_CHANNEL(e->hangup.channel) == 0) {
+					/* No channel Connection */
 					struct ccbsnr_link *cclink;
 					unsigned int handle;
 					int cr = e->hangup.cref;
 					unsigned int state = 0;
 
-					handle = CCBS_HANDLE(ccbsnronprispan,cr);
+					handle = CCBS_HANDLE(PRI_SPAN(e->hangup.channel),cr);
 					cclink = ccbsnr_get_link(handle, &state);
 					if (cclink) {
 						ast_verb(4,
 							"PRI_EVENT_HANGUP_ACK: CCBS-List-Obj 0x%p: handle %x e->hangup.channel(0x%x) span(%d) explicit(%d) channel(%d) peer=%p\n",
-							cclink, handle, e->hangup.channel, ccbsnronprispan, explicit, channel, cclink->peer);
+							cclink, handle, e->hangup.channel, PRI_SPAN(e->hangup.channel), PRI_EXPLICIT(e->hangup.channel), PRI_CHANNEL(e->hangup.channel), cclink->peer);
 						cclink->call = NULL;
 						ccbsnr_del_link(handle);
 					} else {
 						ast_verb(4,
 							"PRI_EVENT_HANGUP_ACK: CCBS-List-Obj 0x%p: handle %x e->hangup.channel(0x%x) span(%d) explicit(%d) channel(%d)",
-							cclink, handle, e->hangup.channel, ccbsnronprispan, explicit, channel);
+							cclink, handle, e->hangup.channel, PRI_SPAN(e->hangup.channel), PRI_EXPLICIT(e->hangup.channel), PRI_CHANNEL(e->hangup.channel));
 					}
 					break;
 				}
@@ -15544,7 +15526,6 @@
 					}
 				}
 				break;
-			}
 			case PRI_EVENT_CONFIG_ERR:
 				ast_log(LOG_WARNING, "PRI Error on span %d: %s\n", pri->trunkgroup, e->err.err);
 				break;




More information about the svn-commits mailing list