[svn-commits] rmudgett: branch group/issue14068 r199093 - in /team/group/issue14068: ./ cha...

SVN commits to the Digium repositories svn-commits at lists.digium.com
Thu Jun 4 11:46:01 CDT 2009


Author: rmudgett
Date: Thu Jun  4 11:45:57 2009
New Revision: 199093

URL: http://svn.asterisk.org/svn-view/asterisk?view=rev&rev=199093
Log:
Q.SIG COLP feature completed.

*  Enhanced the libpri party id structure with more information.  (valid flag,
separate name and number presentation, name character set)
*  Eliminated the libpri connected-line source parameter as it did not do anything.
*  Eliminated several added API fields in libpri events.  The connected-line and
redirecting subcommands pass the information instead.
*  The PRI lock needs to be grabbed when the AST_CONTROL_CONNECTED_LINE and
AST_CONTROL_REDIRECTING are received.

Modified:
    team/group/issue14068/CHANGES
    team/group/issue14068/channels/chan_dahdi.c

Modified: team/group/issue14068/CHANGES
URL: http://svn.asterisk.org/svn-view/asterisk/team/group/issue14068/CHANGES?view=diff&rev=199093&r1=199092&r2=199093
==============================================================================
--- team/group/issue14068/CHANGES (original)
+++ team/group/issue14068/CHANGES Thu Jun  4 11:45:57 2009
@@ -132,6 +132,17 @@
 -------------------------------------------
   * The channel variable PRIREDIRECTREASON is now just a status variable.
     Use the REDIRECTING(reason) dialplan function to alter the reason.
+  * For Q.SIG and ETSI PRI/BRI-PTP, you should manually send the COLR of the
+    redirected-to party for an incomming redirected call if the incoming call
+    could experience further redirects.  Just set the
+    REDIRECTING(to-num,i) = CALLERID(dnid) and set the REDIRECTING(to-pres)
+    to the COLR.  A call has been redirected if the REDIRECTING(count) is not
+    zero.
+  * For outgoing Q.SIG and ETSI PRI/BRI-PTP redirected calls, you need to
+    use the inhibit(i) option on all of the REDIRECTING statements before
+    dialing the redirected-to party.  You still have to set the
+    REDIRECTING(to-xxx,i) and the REDIRECTING(from-xxx,i) values.  The call
+    will update the redirecting-to presentation (COLR) when it becomes available.
 
 Asterisk Manager Interface
 --------------------------

Modified: team/group/issue14068/channels/chan_dahdi.c
URL: http://svn.asterisk.org/svn-view/asterisk/team/group/issue14068/channels/chan_dahdi.c?view=diff&rev=199093&r1=199092&r2=199093
==============================================================================
--- team/group/issue14068/channels/chan_dahdi.c (original)
+++ team/group/issue14068/channels/chan_dahdi.c Thu Jun  4 11:45:57 2009
@@ -3345,52 +3345,146 @@
 #endif	/* defined(HAVE_PRI) */
 
 #if defined(HAVE_PRI)
-static enum AST_CONNECTED_LINE_UPDATE_SOURCE pri_to_ast_connected_line_update_source(enum PRI_CONNECTED_LINE_UPDATE_SOURCE pri_source)
-{
-	enum AST_CONNECTED_LINE_UPDATE_SOURCE ast_source;
-
-	switch (pri_source) {
-	case PRI_CONNECTED_LINE_UPDATE_SOURCE_ANSWER:
-		ast_source = AST_CONNECTED_LINE_UPDATE_SOURCE_ANSWER;
-		break;
-	case PRI_CONNECTED_LINE_UPDATE_SOURCE_TRANSFER:
-		ast_source = AST_CONNECTED_LINE_UPDATE_SOURCE_TRANSFER;
-		break;
-	case PRI_CONNECTED_LINE_UPDATE_SOURCE_TRANSFER_ALERTING:
-		ast_source = AST_CONNECTED_LINE_UPDATE_SOURCE_TRANSFER_ALERTING;
-		break;
-	case PRI_CONNECTED_LINE_UPDATE_SOURCE_UNKNOWN:
-	default:
-		ast_source = AST_CONNECTED_LINE_UPDATE_SOURCE_UNKNOWN;
-		break;
-	}
-
-	return ast_source;
+/*!
+ * \internal
+ * \brief Determine the overall presentation value for the given party.
+ * \since 1.6.3
+ *
+ * \param id Party to determine the overall presentation value.
+ *
+ * \return Overall presentation value for the given party converted to ast values.
+ */
+static int overall_ast_presentation(const struct pri_party_id *id)
+{
+	int number_priority;
+	int number_value;
+	int number_screening;
+	int name_priority;
+	int name_value;
+
+	/* Determine name presentation priority. */
+	if (!id->name.valid) {
+		name_value = PRI_PRES_UNAVAILABLE;
+		name_priority = 3;
+	} else {
+		name_value = id->name.presentation & PRI_PRES_RESTRICTION;
+		switch (name_value) {
+		case PRI_PRES_RESTRICTED:
+			name_priority = 0;
+			break;
+		case PRI_PRES_ALLOWED:
+			name_priority = 1;
+			break;
+		case PRI_PRES_UNAVAILABLE:
+			name_priority = 2;
+			break;
+		default:
+			name_value = PRI_PRES_UNAVAILABLE;
+			name_priority = 3;
+			break;
+		}
+	}
+
+	/* Determine number presentation priority. */
+	if (!id->number.valid) {
+		number_screening = PRI_PRES_USER_NUMBER_UNSCREENED;
+		number_value = PRI_PRES_UNAVAILABLE;
+		number_priority = 3;
+	} else {
+		number_screening = id->number.presentation & PRI_PRES_NUMBER_TYPE;
+		number_value = id->number.presentation & PRI_PRES_RESTRICTION;
+		switch (number_value) {
+		case PRI_PRES_RESTRICTED:
+			number_priority = 0;
+			break;
+		case PRI_PRES_ALLOWED:
+			number_priority = 1;
+			break;
+		case PRI_PRES_UNAVAILABLE:
+			number_priority = 2;
+			break;
+		default:
+			number_screening = PRI_PRES_USER_NUMBER_UNSCREENED;
+			number_value = PRI_PRES_UNAVAILABLE;
+			number_priority = 3;
+			break;
+		}
+	}
+
+	/* Select the wining presentation value. */
+	if (name_priority < number_priority) {
+		number_value = name_value;
+	}
+
+	return pri_to_ast_presentation(number_value | number_screening);
 }
 #endif	/* defined(HAVE_PRI) */
 
 #if defined(HAVE_PRI)
-static enum PRI_CONNECTED_LINE_UPDATE_SOURCE ast_to_pri_connected_line_update_source(enum AST_CONNECTED_LINE_UPDATE_SOURCE ast_source)
-{
-	enum PRI_CONNECTED_LINE_UPDATE_SOURCE pri_source;
-
-	switch (ast_source) {
-	case AST_CONNECTED_LINE_UPDATE_SOURCE_ANSWER:
-		pri_source = PRI_CONNECTED_LINE_UPDATE_SOURCE_ANSWER;
-		break;
-	case AST_CONNECTED_LINE_UPDATE_SOURCE_TRANSFER:
-		pri_source = PRI_CONNECTED_LINE_UPDATE_SOURCE_TRANSFER;
-		break;
-	case AST_CONNECTED_LINE_UPDATE_SOURCE_TRANSFER_ALERTING:
-		pri_source = PRI_CONNECTED_LINE_UPDATE_SOURCE_TRANSFER_ALERTING;
-		break;
-	case AST_CONNECTED_LINE_UPDATE_SOURCE_UNKNOWN:
-	default:
-		pri_source = PRI_CONNECTED_LINE_UPDATE_SOURCE_UNKNOWN;
-		break;
-	}
-
-	return pri_source;
+/*!
+ * \internal
+ * \brief Fill in the PRI party id from the given asterisk party id.
+ * \since 1.6.3
+ *
+ * \param pri_id PRI party id structure.
+ * \param ast_id Asterisk party id structure.
+ *
+ * \return Nothing
+ *
+ * \note Assumes that pri_id has been previously memset to zero.
+ */
+static void dahdi_pri_party_id_from_ast(struct pri_party_id *pri_id, const struct ast_party_id *ast_id)
+{
+	int presentation;
+
+	presentation = ast_to_pri_presentation(ast_id->number_presentation);
+	if (!ast_strlen_zero(ast_id->name)) {
+		pri_id->name.valid = 1;
+		pri_id->name.presentation = presentation;
+		pri_id->name.char_set = PRI_CHAR_SET_ISO8859_1;
+		ast_copy_string(pri_id->name.str, ast_id->name, sizeof(pri_id->name.str));
+	}
+	if (!ast_strlen_zero(ast_id->number)) {
+		pri_id->number.valid = 1;
+		pri_id->number.presentation = presentation;
+		pri_id->number.plan = ast_id->number_type;
+		ast_copy_string(pri_id->number.str, ast_id->number, sizeof(pri_id->number.str));
+	}
+}
+#endif	/* defined(HAVE_PRI) */
+
+#if defined(HAVE_PRI)
+/*!
+ * \internal
+ * \brief Update the PRI redirecting information for the current call.
+ * \since 1.6.3
+ *
+ * \param ast Asterisk channel
+ *
+ * \return Nothing
+ *
+ * \note Assumes that the PRI lock is already obtained.
+ */
+static void dahdi_pri_redirecting_update(struct ast_channel *ast)
+{
+	struct dahdi_pvt *pvt;
+	struct pri_party_redirecting pri_redirecting;
+	struct ast_party_redirecting ast_redirecting;
+
+	/* Gather asterisk redirecting data */
+	ast_redirecting = ast->redirecting;
+	ast_redirecting.from.number = ast->cid.cid_rdnis;
+
+/*! \todo XXX Original called data can be put in a channel data store that is inherited. */
+
+	memset(&pri_redirecting, 0, sizeof(pri_redirecting));
+	dahdi_pri_party_id_from_ast(&pri_redirecting.from, &ast_redirecting.from);
+	dahdi_pri_party_id_from_ast(&pri_redirecting.to, &ast_redirecting.to);
+	pri_redirecting.count = ast_redirecting.count;
+	pri_redirecting.reason = ast_to_pri_reason(ast_redirecting.reason);
+
+	pvt = ast->tech_pvt;
+	pri_redirecting_update(pvt->pri->pri, pvt->call, &pri_redirecting);
 }
 #endif	/* defined(HAVE_PRI) */
 
@@ -4103,10 +4197,7 @@
 		}
 		pri_sr_set_caller(sr, l ? (l + ldp_strip) : NULL, n, prilocaldialplan,
 			p->use_callingpres ? ast->connected.id.number_presentation : (l ? PRES_ALLOWED_USER_NUMBER_PASSED_SCREEN : PRES_NUMBER_NOT_AVAILABLE));
-		pri_sr_set_redirecting(sr, ast->cid.cid_rdnis, ast->redirecting.from.number_type,
-			ast->redirecting.from.number_presentation,
-			ast_to_pri_reason(ast->redirecting.reason));
-		pri_sr_set_redirecting_name(sr, ast->redirecting.from.name);
+		dahdi_pri_redirecting_update(ast);
 
 #ifdef SUPPORT_USERUSER
 		/* User-user info */
@@ -7770,59 +7861,23 @@
 		case AST_CONTROL_CONNECTED_LINE:
 			ast_debug(1, "Received AST_CONTROL_CONNECTED_LINE on %s\n", chan->name);
 #if defined(HAVE_PRI)
-			if (p->pri) {
+			if (p->pri && p->pri->pri && !pri_grab(p, p->pri)) {
 				struct pri_party_connected_line connected;
 
-				if (chan->connected.id.number) {
-					ast_copy_string(connected.id.number, chan->connected.id.number, sizeof(connected.id.number));
-				} else {
-					connected.id.number[0] = '\0';
-				}
-				if (chan->connected.id.name) {
-					ast_copy_string(connected.id.name, chan->connected.id.name, sizeof(connected.id.name));
-				} else {
-					connected.id.name[0] = '\0';
-				}
-				connected.id.number_type = chan->connected.id.number_type;
-				connected.id.number_presentation = ast_to_pri_presentation(chan->connected.id.number_presentation);
-				connected.source = ast_to_pri_connected_line_update_source(chan->connected.source);
+				memset(&connected, 0, sizeof(connected));
+				dahdi_pri_party_id_from_ast(&connected.id, &chan->connected.id);
+
 				pri_connected_line_update(p->pri->pri, p->call, &connected);
+				pri_rel(p->pri);
 			}
 #endif	/* defined(HAVE_PRI) */
 			break;
 		case AST_CONTROL_REDIRECTING:
 			ast_debug(1, "Received AST_CONTROL_REDIRECTING on %s\n", chan->name);
 #if defined(HAVE_PRI)
-			if (p->pri) {
-				struct pri_party_redirecting redirecting;
-
-				if (chan->cid.cid_rdnis) {
-					ast_copy_string(redirecting.from.number, chan->cid.cid_rdnis, sizeof(redirecting.from.number));
-				} else {
-					redirecting.from.number[0] = '\0';
-				}
-				if (chan->redirecting.from.name) {
-					ast_copy_string(redirecting.from.name, chan->redirecting.from.name, sizeof(redirecting.from.name));
-				} else {
-					redirecting.from.name[0] = '\0';
-				}
-				redirecting.from.number_type = chan->redirecting.from.number_type;
-				redirecting.from.number_presentation = ast_to_pri_presentation(chan->redirecting.from.number_presentation);
-				if (chan->redirecting.to.number) {
-					ast_copy_string(redirecting.to.number, chan->redirecting.to.number, sizeof(redirecting.to.number));
-				} else {
-					redirecting.to.number[0] = '\0';
-				}
-				if (chan->redirecting.to.name) {
-					ast_copy_string(redirecting.to.name, chan->redirecting.to.name, sizeof(redirecting.to.name));
-				} else {
-					redirecting.to.name[0] = '\0';
-				}
-				redirecting.to.number_type = chan->redirecting.to.number_type;
-				redirecting.to.number_presentation = ast_to_pri_presentation(chan->redirecting.to.number_presentation);
-				redirecting.count = chan->redirecting.count;
-				redirecting.reason = ast_to_pri_reason(chan->redirecting.reason);
-				pri_redirecting_update(p->pri->pri, p->call, &redirecting);
+			if (p->pri && p->pri->pri && !pri_grab(p, p->pri)) {
+				dahdi_pri_redirecting_update(chan);
+				pri_rel(p->pri);
 			}
 #endif	/* defined(HAVE_PRI) */
 			break;
@@ -12878,7 +12933,8 @@
  *
  * \return Nothing
  */
-static void dahdi_pri_handle_subcmds(struct dahdi_pri *pri, int chanpos, int event_id, int channel, const struct pri_subcommands *subcmds)
+static void dahdi_pri_handle_subcmds(struct dahdi_pri *pri, int chanpos, int event_id,
+	int channel, const struct pri_subcommands *subcmds)
 {
 	int index;
 	struct ast_channel *owner;
@@ -12898,25 +12954,42 @@
 				struct ast_party_connected_line connected;
 				const struct pri_subcmd_connected_line *cmdcl;
 
+				/* Extract the connected line information */
+				ast_party_connected_line_init(&connected);
+				cmdcl = &subcmd->u.connected_line;
+				if (cmdcl->party.id.name.valid) {
+					connected.id.name = (char *) cmdcl->party.id.name.str;
+
+					/* Save for Caller-ID update */
+					ast_copy_string(pri->pvts[chanpos]->lastcid_name,
+						cmdcl->party.id.name.str,
+						sizeof(pri->pvts[chanpos]->lastcid_name));
+					pri->pvts[chanpos]->subs[SUB_REAL].needcallerid = 1;
+				}
+				if (cmdcl->party.id.number.valid) {
+					connected.id.number = (char *) cmdcl->party.id.number.str;
+					connected.id.number_type = cmdcl->party.id.number.plan;
+
+					/* Save for Caller-ID update */
+					ast_copy_string(pri->pvts[chanpos]->lastcid_num,
+						cmdcl->party.id.number.str,
+						sizeof(pri->pvts[chanpos]->lastcid_num));
+					pri->pvts[chanpos]->subs[SUB_REAL].needcallerid = 1;
+				} else {
+					connected.id.number = "";
+				}
+				if (cmdcl->party.id.name.valid
+					|| cmdcl->party.id.number.valid) {
+					connected.id.number_presentation =
+						overall_ast_presentation(&cmdcl->party.id);
+				}
+				connected.source = AST_CONNECTED_LINE_UPDATE_SOURCE_ANSWER;
+
 				/* Update the connected line information on the other channel */
-				ast_party_connected_line_init(&connected);
-				cmdcl = &subcmd->connected_line;
-				connected.id.number = (char *) cmdcl->party.id.number;
-				connected.id.name = (char *) 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]);
+				if (event_id != PRI_EVENT_RING) {
+					/* This connected_line update was not from a SETUP message. */
+					ast_channel_queue_connected_line_update(owner, &connected);
+				}
 
 				ast_channel_unlock(owner);
 			}
@@ -12930,22 +13003,46 @@
 
 				ast_party_redirecting_set_init(&redirecting, &owner->redirecting);
 
-				cmdr = &subcmd->redirecting;
-				redirecting.from.number = (char *) cmdr->party.from.number;
-				redirecting.from.name = (char *) 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 = (char *) cmdr->party.to.number;
-				redirecting.to.name = (char *) 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);
+				cmdr = &subcmd->u.redirecting;
+
+				/* redirecting.from */
+				if (cmdr->party.from.name.valid) {
+					redirecting.from.name = (char *) cmdr->party.from.name.str;
+				}
+				if (cmdr->party.from.number.valid) {
+					redirecting.from.number = (char *) cmdr->party.from.number.str;
+					redirecting.from.number_type = cmdr->party.from.number.plan;
+				}
+				if (cmdr->party.from.name.valid
+					|| cmdr->party.from.number.valid) {
+					redirecting.from.number_presentation =
+						overall_ast_presentation(&cmdr->party.from);
+				}
+
+				/* redirecting.to */
+				if (cmdr->party.to.name.valid) {
+					redirecting.to.name = (char *) cmdr->party.to.name.str;
+				}
+				if (cmdr->party.to.number.valid) {
+					redirecting.to.number = (char *) cmdr->party.to.number.str;
+					redirecting.to.number_type = cmdr->party.to.number.plan;
+				}
+				if (cmdr->party.to.name.valid
+					|| cmdr->party.to.number.valid) {
+					redirecting.to.number_presentation =
+						overall_ast_presentation(&cmdr->party.from);
+				}
+
 				redirecting.count = cmdr->party.count;
 				redirecting.reason = pri_to_ast_reason(cmdr->party.reason);
 
+/*! \todo XXX Original called data can be put in a channel data store that is inherited. */
+
 				ast_channel_set_redirecting(owner, &redirecting);
-				ast_channel_queue_redirecting_update(owner, &redirecting);
+				if (event_id != PRI_EVENT_RING) {
+					/* This redirection was not from a SETUP message. */
+					ast_channel_queue_redirecting_update(owner, &redirecting);
+				}
 
 				ast_channel_unlock(owner);
 			}
@@ -13480,12 +13577,7 @@
 				if ((chanpos < 0) && (e->ring.flexible))
 					chanpos = pri_find_empty_chan(pri, 1);
 				if (chanpos > -1) {
-					struct ast_party_redirecting redirecting = {{0,},};
-
 					ast_mutex_lock(&pri->pvts[chanpos]->lock);
-/* XXX BUGBUG handling subcommands may be done too soon here.! */
-					dahdi_pri_handle_subcmds(pri, chanpos, e->e, e->ring.channel,
-						e->ring.subcmds);
 					if (pri->switchtype == PRI_SWITCH_GR303_TMC) {
 						/* Should be safe to lock CRV AFAIK while bearer is still locked */
 						crv = pri_find_crv(pri, pri_get_crv(pri->pri, e->ring.call, NULL));
@@ -13506,17 +13598,6 @@
 							break;
 						}
 					}
-					if (e->ring.redirectingnum[0] || e->ring.redirectingname[0]) {
-						redirecting.to.number = e->ring.callednum;
-						redirecting.to.number_type = e->ring.calledplan;
-						redirecting.to.number_presentation = AST_PRES_ALLOWED_USER_NUMBER_NOT_SCREENED;
-						redirecting.from.name = e->ring.redirectingname;
-						redirecting.from.number = e->ring.redirectingnum;
-						redirecting.from.number_presentation = e->ring.redirectingpres;
-						redirecting.from.number_type = e->ring.callingplanrdnis;
-						redirecting.reason = pri_to_ast_reason(e->ring.redirectingreason);
-						redirecting.count = e->ring.redirectingcount;
-					}
 					pri->pvts[chanpos]->call = e->ring.call;
 					apply_plan_to_number(plancallingnum, sizeof(plancallingnum), pri, e->ring.callingnum, e->ring.callingplan);
 					if (pri->pvts[chanpos]->use_callerid) {
@@ -13550,7 +13631,6 @@
 					/* Get called number */
 					else if (!ast_strlen_zero(e->ring.callednum)) {
 						ast_copy_string(pri->pvts[chanpos]->exten, e->ring.callednum, sizeof(pri->pvts[chanpos]->exten));
-						ast_copy_string(pri->pvts[chanpos]->dnid, e->ring.callednum, sizeof(pri->pvts[chanpos]->dnid));
 					} else if (pri->overlapdial)
 						pri->pvts[chanpos]->exten[0] = '\0';
 					else {
@@ -13559,8 +13639,7 @@
 						pri->pvts[chanpos]->exten[1] = '\0';
 					}
 					/* Set DNID on all incoming calls -- even immediate */
-					if (!ast_strlen_zero(e->ring.callednum))
-						ast_copy_string(pri->pvts[chanpos]->dnid, e->ring.callednum, sizeof(pri->pvts[chanpos]->dnid));
+					ast_copy_string(pri->pvts[chanpos]->dnid, e->ring.callednum, sizeof(pri->pvts[chanpos]->dnid));
 					/* No number yet, but received "sending complete"? */
 					if (e->ring.complete && (ast_strlen_zero(e->ring.callednum))) {
 						ast_verb(3, "Going to extension s|1 because of Complete received\n");
@@ -13619,9 +13698,6 @@
 
 							ast_mutex_unlock(&pri->pvts[chanpos]->lock);
 
-							if (c && (redirecting.from.number || redirecting.from.name)) {
-								ast_channel_set_redirecting(c, &redirecting);
-							}
 							if (!ast_strlen_zero(e->ring.callingsubaddr)) {
 								pbx_builtin_setvar_helper(c, "CALLINGSUBADDR", e->ring.callingsubaddr);
 							}
@@ -13646,6 +13722,10 @@
 
 							ast_mutex_lock(&pri->pvts[chanpos]->lock);
 							ast_mutex_lock(&pri->lock);
+
+							dahdi_pri_handle_subcmds(pri, chanpos, e->e, e->ring.channel,
+								e->ring.subcmds);
+
 							if (c && !ast_pthread_create_detached(&threadid, NULL, ss_thread, c)) {
 								ast_verb(3, "Accepting overlap call from '%s' to '%s' on channel %d/%d, span %d\n",
 										plancallingnum, S_OR(pri->pvts[chanpos]->exten, "<unspecified>"),
@@ -13669,9 +13749,6 @@
 
 								ast_mutex_unlock(&pri->pvts[chanpos]->lock);
 
-								if (redirecting.from.number || redirecting.from.name) {
-									ast_channel_set_redirecting(c, &redirecting);
-								}
 								if (e->ring.ani2 >= 0) {
 									snprintf(ani2str, 5, "%d", e->ring.ani2);
 									pbx_builtin_setvar_helper(c, "ANI2", ani2str);
@@ -13694,6 +13771,9 @@
 
 								ast_mutex_lock(&pri->pvts[chanpos]->lock);
 								ast_mutex_lock(&pri->lock);
+
+								dahdi_pri_handle_subcmds(pri, chanpos, e->e, e->ring.channel,
+									e->ring.subcmds);
 
 								ast_verb(3, "Accepting call from '%s' to '%s' on channel %d/%d, span %d\n",
 										plancallingnum, pri->pvts[chanpos]->exten,
@@ -13739,28 +13819,8 @@
 						ast_log(LOG_WARNING, "Ringing requested on channel %d/%d not in use on span %d\n",
 							PRI_SPAN(e->ringing.channel), PRI_CHANNEL(e->ringing.channel), pri->span);
 					} else {
-						struct ast_channel *owner;
-
 						ast_mutex_lock(&pri->pvts[chanpos]->lock);
 
-						if (e->ringing.calledname[0] || e->ringing.callednum[0]) {
-							struct ast_party_connected_line connected;
-							
-							dahdi_pri_lock_owner(pri, chanpos);
-							owner = pri->pvts[chanpos]->owner;
-							if (owner) {
-								/* Update the connected line information on the other channel */
-								ast_party_connected_line_init(&connected);
-								connected.id.name = e->ringing.calledname;
-								connected.id.number = e->ringing.callednum;
-								connected.id.number_type = e->ringing.calledplan;
-								connected.id.number_presentation =
-									pri_to_ast_presentation(e->ringing.calledpres);
-								connected.source = AST_CONNECTED_LINE_UPDATE_SOURCE_ANSWER;
-								ast_channel_queue_connected_line_update(owner, &connected);
-								ast_channel_unlock(owner);
-							}
-						}
 						dahdi_pri_handle_subcmds(pri, chanpos, e->e, e->ringing.channel,
 							e->ringing.subcmds);
 						if (ast_strlen_zero(pri->pvts[chanpos]->dop.dialstr)) {
@@ -13787,6 +13847,8 @@
 
 #ifdef SUPPORT_USERUSER
 						if (!ast_strlen_zero(e->ringing.useruserinfo)) {
+							struct ast_channel *owner;
+
 							dahdi_pri_lock_owner(pri, chanpos);
 							owner = pri->pvts[chanpos]->owner;
 							if (owner) {
@@ -13922,26 +13984,8 @@
 						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 {
-						struct ast_party_connected_line connected;
-						struct ast_channel *owner;
-
 						ast_mutex_lock(&pri->pvts[chanpos]->lock);
 
-						dahdi_pri_lock_owner(pri, chanpos);
-						owner = pri->pvts[chanpos]->owner;
-						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_channel_unlock(owner);
-						}
 						dahdi_pri_handle_subcmds(pri, chanpos, e->e, e->answer.channel,
 							e->answer.subcmds);
 						/* Now we can do call progress detection */
@@ -13983,6 +14027,8 @@
 
 #ifdef SUPPORT_USERUSER
 						if (!ast_strlen_zero(e->answer.useruserinfo)) {
+							struct ast_channel *owner;
+
 							dahdi_pri_lock_owner(pri, chanpos);
 							owner = pri->pvts[chanpos]->owner;
 							if (owner) {




More information about the svn-commits mailing list